Skip to content

Commit 748e6a3

Browse files
committed
fix(firo): tighten spark cache reader snapshots
1 parent 6eee52d commit 748e6a3

2 files changed

Lines changed: 64 additions & 13 deletions

File tree

lib/db/sqlite/firo_cache_coordinator.dart

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -411,18 +411,37 @@ abstract class FiroCacheCoordinator {
411411
int groupId,
412412
CryptoCurrencyNetwork network,
413413
) async {
414-
return await _setLocks[network]!.protect(() async {
415-
final info = await getLatestSetInfoForGroupId(groupId, network);
416-
if (info == null) {
417-
return null;
418-
}
414+
final resultSet = await _Reader._getSetCoinsAndLatestSetInfoForGroupId(
415+
groupId,
416+
db: _FiroCache.setCacheDB(network),
417+
);
418+
if (resultSet.isEmpty) {
419+
return null;
420+
}
419421

420-
final coins = await getSetCoinsForGroupId(
421-
groupId,
422-
network: network,
423-
);
424-
return (meta: info, coins: coins);
425-
});
422+
final first = resultSet.first;
423+
final coins = resultSet
424+
.map(
425+
(row) => RawSparkCoin(
426+
serialized: row["serialized"] as String,
427+
txHash: row["txHash"] as String,
428+
context: row["context"] as String,
429+
groupId: groupId,
430+
),
431+
)
432+
.toList()
433+
.reversed
434+
.toList();
435+
436+
return (
437+
meta: SparkAnonymitySetMeta(
438+
coinGroupId: groupId,
439+
blockHash: first["blockHash"] as String,
440+
setHash: first["setHash"] as String,
441+
size: first["size"] as int,
442+
),
443+
coins: coins,
444+
);
426445
}
427446

428447
static Future<SparkAnonymitySetMeta?> getLatestSetInfoForGroupId(

lib/db/sqlite/firo_cache_reader.dart

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,36 @@ abstract class _Reader {
4949
return db.select("$query;");
5050
}
5151

52+
static Future<ResultSet> _getSetCoinsAndLatestSetInfoForGroupId(
53+
int groupId, {
54+
required Database db,
55+
}) async {
56+
const query = """
57+
WITH LatestSet AS (
58+
SELECT blockHash, setHash, size
59+
FROM SparkSet
60+
WHERE groupId = ? AND complete = 1
61+
ORDER BY size DESC, id DESC
62+
LIMIT 1
63+
)
64+
SELECT
65+
LatestSet.blockHash,
66+
LatestSet.setHash,
67+
LatestSet.size,
68+
sc.serialized,
69+
sc.txHash,
70+
sc.context,
71+
sc.groupId
72+
FROM LatestSet
73+
JOIN SparkSet AS ss ON ss.groupId = ? AND ss.complete = 1
74+
JOIN SparkSetCoins AS ssc ON ss.id = ssc.setId
75+
JOIN SparkCoin AS sc ON ssc.coinId = sc.id
76+
ORDER BY ss.id ASC, ssc.orderKey DESC, ssc.id ASC;
77+
""";
78+
79+
return db.select("$query;", [groupId, groupId]);
80+
}
81+
5282
static Future<ResultSet> _getSetCoinsForGroupIdAndBlockHash(
5383
int groupId,
5484
String blockHash, {
@@ -58,7 +88,9 @@ abstract class _Reader {
5888
WITH TargetBlock AS (
5989
SELECT id
6090
FROM SparkSet
61-
WHERE blockHash = ? AND complete = 1
91+
WHERE blockHash = ? AND groupId = ? AND complete = 1
92+
ORDER BY id DESC
93+
LIMIT 1
6294
),
6395
TargetSets AS (
6496
SELECT id AS setId
@@ -80,7 +112,7 @@ abstract class _Reader {
80112
SparkSetCoins.id ASC;
81113
""";
82114

83-
return db.select("$query;", [blockHash, groupId]);
115+
return db.select("$query;", [blockHash, groupId, groupId]);
84116
}
85117

86118
static Future<bool> _checkSetInfoForGroupIdExists(

0 commit comments

Comments
 (0)