@bsv/wallet-toolbox 2.10.4 → 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +68 -0
- package/README.md +47 -0
- package/docs/managed-change-liquidity.md +7 -0
- package/docs/no-send-expiry.md +167 -0
- package/docs/prepared-beef.md +197 -0
- package/docs/setup.md +11 -0
- package/docs/storage.md +11 -0
- package/out/src/Setup.d.ts +3 -0
- package/out/src/Setup.d.ts.map +1 -1
- package/out/src/Setup.js +1 -0
- package/out/src/Setup.js.map +1 -1
- package/out/src/Wallet.d.ts.map +1 -1
- package/out/src/Wallet.js +11 -1
- package/out/src/Wallet.js.map +1 -1
- package/out/src/WalletPermissionsManager.d.ts +30 -6
- package/out/src/WalletPermissionsManager.d.ts.map +1 -1
- package/out/src/WalletPermissionsManager.js +84 -9
- package/out/src/WalletPermissionsManager.js.map +1 -1
- package/out/src/mockchain/MockServices.d.ts +2 -0
- package/out/src/mockchain/MockServices.d.ts.map +1 -1
- package/out/src/mockchain/MockServices.js +20 -0
- package/out/src/mockchain/MockServices.js.map +1 -1
- package/out/src/monitor/Monitor.d.ts +1 -0
- package/out/src/monitor/Monitor.d.ts.map +1 -1
- package/out/src/monitor/Monitor.js +19 -3
- package/out/src/monitor/Monitor.js.map +1 -1
- package/out/src/monitor/tasks/TaskNoSendExpiry.d.ts +19 -0
- package/out/src/monitor/tasks/TaskNoSendExpiry.d.ts.map +1 -0
- package/out/src/monitor/tasks/TaskNoSendExpiry.js +47 -0
- package/out/src/monitor/tasks/TaskNoSendExpiry.js.map +1 -0
- package/out/src/monitor/tasks/index.all.d.ts +1 -0
- package/out/src/monitor/tasks/index.all.d.ts.map +1 -1
- package/out/src/monitor/tasks/index.all.js +1 -0
- package/out/src/monitor/tasks/index.all.js.map +1 -1
- package/out/src/sdk/ActionBatch.interfaces.d.ts +4 -0
- package/out/src/sdk/ActionBatch.interfaces.d.ts.map +1 -1
- package/out/src/sdk/WalletStorage.interfaces.d.ts +35 -0
- package/out/src/sdk/WalletStorage.interfaces.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.d.ts +0 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.js +23 -12
- package/out/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.js.map +1 -1
- package/out/src/signer/methods/createNoSendExpiryAction.d.ts +7 -0
- package/out/src/signer/methods/createNoSendExpiryAction.d.ts.map +1 -0
- package/out/src/signer/methods/createNoSendExpiryAction.js +249 -0
- package/out/src/signer/methods/createNoSendExpiryAction.js.map +1 -0
- package/out/src/signer/methods/signAction.d.ts.map +1 -1
- package/out/src/signer/methods/signAction.js +9 -0
- package/out/src/signer/methods/signAction.js.map +1 -1
- package/out/src/storage/StorageIdb.d.ts +3 -0
- package/out/src/storage/StorageIdb.d.ts.map +1 -1
- package/out/src/storage/StorageIdb.js +37 -1
- package/out/src/storage/StorageIdb.js.map +1 -1
- package/out/src/storage/StorageKnex.d.ts +48 -3
- package/out/src/storage/StorageKnex.d.ts.map +1 -1
- package/out/src/storage/StorageKnex.js +234 -14
- package/out/src/storage/StorageKnex.js.map +1 -1
- package/out/src/storage/StorageProvider.d.ts +6 -1
- package/out/src/storage/StorageProvider.d.ts.map +1 -1
- package/out/src/storage/StorageProvider.js +147 -5
- package/out/src/storage/StorageProvider.js.map +1 -1
- package/out/src/storage/StorageReaderWriter.d.ts +2 -0
- package/out/src/storage/StorageReaderWriter.d.ts.map +1 -1
- package/out/src/storage/StorageReaderWriter.js +4 -0
- package/out/src/storage/StorageReaderWriter.js.map +1 -1
- package/out/src/storage/WalletStorageManager.d.ts +11 -0
- package/out/src/storage/WalletStorageManager.d.ts.map +1 -1
- package/out/src/storage/WalletStorageManager.js +77 -12
- package/out/src/storage/WalletStorageManager.js.map +1 -1
- package/out/src/storage/idbHelpers.d.ts.map +1 -1
- package/out/src/storage/idbHelpers.js +14 -2
- package/out/src/storage/idbHelpers.js.map +1 -1
- package/out/src/storage/index.all.d.ts +2 -0
- package/out/src/storage/index.all.d.ts.map +1 -1
- package/out/src/storage/index.all.js +2 -0
- package/out/src/storage/index.all.js.map +1 -1
- package/out/src/storage/methods/createAction.d.ts +57 -1
- package/out/src/storage/methods/createAction.d.ts.map +1 -1
- package/out/src/storage/methods/createAction.js +195 -49
- package/out/src/storage/methods/createAction.js.map +1 -1
- package/out/src/storage/methods/noSendExpiry.d.ts +11 -0
- package/out/src/storage/methods/noSendExpiry.d.ts.map +1 -0
- package/out/src/storage/methods/noSendExpiry.js +357 -0
- package/out/src/storage/methods/noSendExpiry.js.map +1 -0
- package/out/src/storage/methods/noSendExpiryLifecycle.d.ts +14 -0
- package/out/src/storage/methods/noSendExpiryLifecycle.d.ts.map +1 -0
- package/out/src/storage/methods/noSendExpiryLifecycle.js +691 -0
- package/out/src/storage/methods/noSendExpiryLifecycle.js.map +1 -0
- package/out/src/storage/methods/preparedBeef.d.ts +104 -0
- package/out/src/storage/methods/preparedBeef.d.ts.map +1 -0
- package/out/src/storage/methods/preparedBeef.js +525 -0
- package/out/src/storage/methods/preparedBeef.js.map +1 -0
- package/out/src/storage/methods/processAction.d.ts.map +1 -1
- package/out/src/storage/methods/processAction.js +109 -28
- package/out/src/storage/methods/processAction.js.map +1 -1
- package/out/src/storage/methods/purgeData.d.ts.map +1 -1
- package/out/src/storage/methods/purgeData.js +9 -0
- package/out/src/storage/methods/purgeData.js.map +1 -1
- package/out/src/storage/methods/validateSyncProof.d.ts +24 -0
- package/out/src/storage/methods/validateSyncProof.d.ts.map +1 -0
- package/out/src/storage/methods/validateSyncProof.js +116 -0
- package/out/src/storage/methods/validateSyncProof.js.map +1 -0
- package/out/src/storage/remoting/StorageClientBase.d.ts +4 -1
- package/out/src/storage/remoting/StorageClientBase.d.ts.map +1 -1
- package/out/src/storage/remoting/StorageClientBase.js +9 -0
- package/out/src/storage/remoting/StorageClientBase.js.map +1 -1
- package/out/src/storage/remoting/StorageServer.d.ts.map +1 -1
- package/out/src/storage/remoting/StorageServer.js +16 -3
- package/out/src/storage/remoting/StorageServer.js.map +1 -1
- package/out/src/storage/schema/KnexMigrations.d.ts +2 -0
- package/out/src/storage/schema/KnexMigrations.d.ts.map +1 -1
- package/out/src/storage/schema/KnexMigrations.js +66 -1
- package/out/src/storage/schema/KnexMigrations.js.map +1 -1
- package/out/src/storage/schema/StorageIdbSchema.d.ts +2 -0
- package/out/src/storage/schema/StorageIdbSchema.d.ts.map +1 -1
- package/out/src/storage/schema/entities/EntityOutput.d.ts.map +1 -1
- package/out/src/storage/schema/entities/EntityOutput.js +13 -0
- package/out/src/storage/schema/entities/EntityOutput.js.map +1 -1
- package/out/src/storage/schema/entities/EntityProvenTx.d.ts +2 -0
- package/out/src/storage/schema/entities/EntityProvenTx.d.ts.map +1 -1
- package/out/src/storage/schema/entities/EntityProvenTx.js +33 -3
- package/out/src/storage/schema/entities/EntityProvenTx.js.map +1 -1
- package/out/src/storage/schema/entities/EntityTransaction.d.ts +26 -0
- package/out/src/storage/schema/entities/EntityTransaction.d.ts.map +1 -1
- package/out/src/storage/schema/entities/EntityTransaction.js +221 -21
- package/out/src/storage/schema/entities/EntityTransaction.js.map +1 -1
- package/out/src/storage/schema/tables/TablePreparedBeef.interfaces.d.ts +23 -0
- package/out/src/storage/schema/tables/TablePreparedBeef.interfaces.d.ts.map +1 -0
- package/out/src/storage/schema/tables/TablePreparedBeef.interfaces.js +3 -0
- package/out/src/storage/schema/tables/TablePreparedBeef.interfaces.js.map +1 -0
- package/out/src/storage/schema/tables/TableTransaction.d.ts +16 -0
- package/out/src/storage/schema/tables/TableTransaction.d.ts.map +1 -1
- package/out/src/storage/schema/tables/TableTransaction.js +14 -1
- package/out/src/storage/schema/tables/TableTransaction.js.map +1 -1
- package/out/src/utility/Argon2idBackend.d.ts +36 -0
- package/out/src/utility/Argon2idBackend.d.ts.map +1 -0
- package/out/src/utility/Argon2idBackend.js +60 -0
- package/out/src/utility/Argon2idBackend.js.map +1 -0
- package/out/src/utility/brc177NoSendExpiry.d.ts +34 -0
- package/out/src/utility/brc177NoSendExpiry.d.ts.map +1 -0
- package/out/src/utility/brc177NoSendExpiry.js +81 -0
- package/out/src/utility/brc177NoSendExpiry.js.map +1 -0
- package/out/src/utility/hashWasm.d.ts +2 -1
- package/out/src/utility/hashWasm.d.ts.map +1 -1
- package/out/src/utility/hashWasm.js +83 -1
- package/out/src/utility/hashWasm.js.map +1 -1
- package/out/src/utility/index.all.d.ts +2 -0
- package/out/src/utility/index.all.d.ts.map +1 -1
- package/out/src/utility/index.all.js +2 -0
- package/out/src/utility/index.all.js.map +1 -1
- package/out/src/utility/index.client.d.ts +2 -0
- package/out/src/utility/index.client.d.ts.map +1 -1
- package/out/src/utility/index.client.js +2 -0
- package/out/src/utility/index.client.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,525 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PreparedBeefCoordinator = exports.PREPARED_BEEF_FORMAT_VERSION = void 0;
|
|
4
|
+
exports.defaultPreparedBeefPolicy = defaultPreparedBeefPolicy;
|
|
5
|
+
exports.validatePreparedBeefPolicy = validatePreparedBeefPolicy;
|
|
6
|
+
exports.lookupPreparedBeefs = lookupPreparedBeefs;
|
|
7
|
+
const sdk_1 = require("@bsv/sdk");
|
|
8
|
+
const beefForTxids_1 = require("../../utility/beefForTxids");
|
|
9
|
+
const WERR_errors_1 = require("../../sdk/WERR_errors");
|
|
10
|
+
exports.PREPARED_BEEF_FORMAT_VERSION = 1;
|
|
11
|
+
const DEFAULT_MAX_QUEUE_SIZE = 32;
|
|
12
|
+
const DEFAULT_MAX_QUEUE_SIZE_PER_USER = 4;
|
|
13
|
+
const DEFAULT_MAX_ARTIFACT_BYTES = 2 * 1024 * 1024;
|
|
14
|
+
const DEFAULT_MAX_LOOKUP_BYTES = 2 * 1024 * 1024;
|
|
15
|
+
const DEFAULT_MAX_ARTIFACT_TRANSACTIONS = 256;
|
|
16
|
+
const DEFAULT_BACKFILL_BATCH_SIZE = 32;
|
|
17
|
+
const DEFAULT_BACKFILL_INTERVAL_MS = 100;
|
|
18
|
+
// COOK targets normal funding calls, which ordinarily spend one managed-change
|
|
19
|
+
// source. Do not add a broad cache query in front of the canonical builder for
|
|
20
|
+
// unusually fragmented actions; those requests retain the established path.
|
|
21
|
+
const MAX_PREPARED_BEEF_LOOKUP_ROOTS = 32;
|
|
22
|
+
function defaultPreparedBeefPolicy() {
|
|
23
|
+
return {
|
|
24
|
+
readEnabled: false,
|
|
25
|
+
writeEnabled: false,
|
|
26
|
+
backfillEnabled: false,
|
|
27
|
+
maxQueueSize: DEFAULT_MAX_QUEUE_SIZE,
|
|
28
|
+
maxQueueSizePerUser: DEFAULT_MAX_QUEUE_SIZE_PER_USER,
|
|
29
|
+
maxArtifactBytes: DEFAULT_MAX_ARTIFACT_BYTES,
|
|
30
|
+
maxLookupBytes: DEFAULT_MAX_LOOKUP_BYTES,
|
|
31
|
+
maxArtifactTransactions: DEFAULT_MAX_ARTIFACT_TRANSACTIONS,
|
|
32
|
+
backfillBatchSize: DEFAULT_BACKFILL_BATCH_SIZE,
|
|
33
|
+
backfillIntervalMs: DEFAULT_BACKFILL_INTERVAL_MS
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function validatePreparedBeefPolicy(options) {
|
|
37
|
+
const policy = { ...defaultPreparedBeefPolicy(), ...options };
|
|
38
|
+
for (const name of ['readEnabled', 'writeEnabled', 'backfillEnabled']) {
|
|
39
|
+
if (typeof policy[name] !== 'boolean') {
|
|
40
|
+
throw new WERR_errors_1.WERR_INVALID_PARAMETER(`preparedBeef.${name}`, 'a boolean');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
for (const name of [
|
|
44
|
+
'maxQueueSize',
|
|
45
|
+
'maxQueueSizePerUser',
|
|
46
|
+
'maxArtifactBytes',
|
|
47
|
+
'maxLookupBytes',
|
|
48
|
+
'maxArtifactTransactions',
|
|
49
|
+
'backfillBatchSize'
|
|
50
|
+
]) {
|
|
51
|
+
if (!Number.isSafeInteger(policy[name]) || policy[name] < 1) {
|
|
52
|
+
throw new WERR_errors_1.WERR_INVALID_PARAMETER(`preparedBeef.${name}`, 'a positive safe integer');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (!Number.isSafeInteger(policy.backfillIntervalMs) || policy.backfillIntervalMs < 0) {
|
|
56
|
+
throw new WERR_errors_1.WERR_INVALID_PARAMETER('preparedBeef.backfillIntervalMs', 'a non-negative safe integer');
|
|
57
|
+
}
|
|
58
|
+
if (policy.backfillEnabled && !policy.writeEnabled) {
|
|
59
|
+
throw new WERR_errors_1.WERR_INVALID_PARAMETER('preparedBeef.backfillEnabled', 'false unless writeEnabled is true');
|
|
60
|
+
}
|
|
61
|
+
if (policy.maxQueueSizePerUser > policy.maxQueueSize) {
|
|
62
|
+
throw new WERR_errors_1.WERR_INVALID_PARAMETER('preparedBeef.maxQueueSizePerUser', 'no greater than maxQueueSize');
|
|
63
|
+
}
|
|
64
|
+
return policy;
|
|
65
|
+
}
|
|
66
|
+
function checksum(bytes) {
|
|
67
|
+
return sdk_1.Utils.toHex(sdk_1.Hash.sha256(Array.from(bytes)));
|
|
68
|
+
}
|
|
69
|
+
function validRootTransaction(beef, rootTxid) {
|
|
70
|
+
const root = beef.findTxid(rootTxid);
|
|
71
|
+
return root != null && !root.isTxidOnly && root.rawTxUint8Array != null;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Cheap, conservative work estimate which avoids serializing or verifying a
|
|
75
|
+
* BEEF. Exact serialized size is still enforced before persistence.
|
|
76
|
+
*/
|
|
77
|
+
function estimatedBeefBytes(beef) {
|
|
78
|
+
let bytes = 16;
|
|
79
|
+
for (const tx of beef.txs) {
|
|
80
|
+
bytes += 40;
|
|
81
|
+
const rawTx = tx.rawTxUint8Array;
|
|
82
|
+
if (rawTx != null)
|
|
83
|
+
bytes += rawTx.length;
|
|
84
|
+
}
|
|
85
|
+
for (const bump of beef.bumps) {
|
|
86
|
+
bytes += 16;
|
|
87
|
+
for (const level of bump.path)
|
|
88
|
+
bytes += 8 + level.length * 40;
|
|
89
|
+
}
|
|
90
|
+
return bytes;
|
|
91
|
+
}
|
|
92
|
+
function isAdmissibleBeef(beef, policy) {
|
|
93
|
+
return beef.txs.length <= policy.maxArtifactTransactions &&
|
|
94
|
+
estimatedBeefBytes(beef) <= policy.maxArtifactBytes;
|
|
95
|
+
}
|
|
96
|
+
async function exceedsPreparedLookupByteBudget(storage, userId, rootTxids) {
|
|
97
|
+
if (rootTxids.length <= 1)
|
|
98
|
+
return false;
|
|
99
|
+
const lookupBytes = await storage.readPreparedBeefLookupByteLength(userId, rootTxids);
|
|
100
|
+
return !Number.isSafeInteger(lookupBytes) ||
|
|
101
|
+
lookupBytes < 0 ||
|
|
102
|
+
lookupBytes > storage.preparedBeefPolicy.maxLookupBytes;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Read and validate prepared artifacts without performing chain or service
|
|
106
|
+
* work. A malformed, stale, oversized, or unsupported row is a cache miss.
|
|
107
|
+
*/
|
|
108
|
+
async function lookupPreparedBeefs(storage, userId, rootTxids, parent) {
|
|
109
|
+
const result = {
|
|
110
|
+
beef: new sdk_1.Beef(),
|
|
111
|
+
hitTxids: [],
|
|
112
|
+
missingTxids: [...new Set(rootTxids)],
|
|
113
|
+
corruptCount: 0,
|
|
114
|
+
byteLength: 0
|
|
115
|
+
};
|
|
116
|
+
if (!storage.preparedBeefPolicy.readEnabled ||
|
|
117
|
+
storage.preparedBeefReadsEnabled?.() === false ||
|
|
118
|
+
result.missingTxids.length === 0)
|
|
119
|
+
return result;
|
|
120
|
+
return await storage.telemetry.withSpan('wallet.storage.prepared_beef.lookup', {
|
|
121
|
+
component: 'wallet-storage',
|
|
122
|
+
parent: parent?.context,
|
|
123
|
+
attributes: { 'prepared_beef.requested_root_count': result.missingTxids.length }
|
|
124
|
+
}, async (span) => {
|
|
125
|
+
const requestedTxids = result.missingTxids;
|
|
126
|
+
if (requestedTxids.length > MAX_PREPARED_BEEF_LOOKUP_ROOTS) {
|
|
127
|
+
span.end({
|
|
128
|
+
attributes: {
|
|
129
|
+
'prepared_beef.hit_count': 0,
|
|
130
|
+
'prepared_beef.miss_count': requestedTxids.length,
|
|
131
|
+
'prepared_beef.corrupt_count': 0,
|
|
132
|
+
'prepared_beef.bytes': 0,
|
|
133
|
+
'prepared_beef.lookup_bypassed': true
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
// Normal createAction calls usually have one funding root and retain a
|
|
140
|
+
// single-query hit path. Fragmented calls receive a cheap aggregate
|
|
141
|
+
// byte preflight so the optimization never pulls an unbounded set of
|
|
142
|
+
// blobs into the foreground merely to fall back afterward.
|
|
143
|
+
if (await exceedsPreparedLookupByteBudget(storage, userId, requestedTxids)) {
|
|
144
|
+
span.end({
|
|
145
|
+
attributes: {
|
|
146
|
+
'prepared_beef.hit_count': 0,
|
|
147
|
+
'prepared_beef.miss_count': requestedTxids.length,
|
|
148
|
+
'prepared_beef.corrupt_count': 0,
|
|
149
|
+
'prepared_beef.bytes': 0,
|
|
150
|
+
'prepared_beef.lookup_bypassed': true
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
return result;
|
|
154
|
+
}
|
|
155
|
+
const rows = await storage.findPreparedBeefs(userId, requestedTxids);
|
|
156
|
+
const byTxid = new Map(rows.map(row => [row.rootTxid, row]));
|
|
157
|
+
const missing = [];
|
|
158
|
+
const candidates = [];
|
|
159
|
+
for (const rootTxid of requestedTxids) {
|
|
160
|
+
const row = byTxid.get(rootTxid);
|
|
161
|
+
if (row?.state !== 'ready' || row.formatVersion !== exports.PREPARED_BEEF_FORMAT_VERSION) {
|
|
162
|
+
missing.push(rootTxid);
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
try {
|
|
166
|
+
const bytes = Uint8Array.from(row.beef);
|
|
167
|
+
if (bytes.length !== row.byteLength ||
|
|
168
|
+
bytes.length > storage.preparedBeefPolicy.maxArtifactBytes ||
|
|
169
|
+
checksum(bytes) !== row.checksum) {
|
|
170
|
+
throw new Error('prepared BEEF metadata mismatch');
|
|
171
|
+
}
|
|
172
|
+
const fragment = sdk_1.Beef.fromBinary(bytes);
|
|
173
|
+
if (!validRootTransaction(fragment, rootTxid))
|
|
174
|
+
throw new Error('prepared BEEF root is incomplete');
|
|
175
|
+
candidates.push({ rootTxid, fragment, byteLength: bytes.length });
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
result.corruptCount++;
|
|
179
|
+
missing.push(rootTxid);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
try {
|
|
183
|
+
// Build the aggregate separately. mergeBeef may partially mutate its
|
|
184
|
+
// receiver before rejecting conflicting fragments; a cache failure
|
|
185
|
+
// must never contaminate the canonical fallback BEEF.
|
|
186
|
+
const aggregate = new sdk_1.Beef();
|
|
187
|
+
for (const candidate of candidates)
|
|
188
|
+
aggregate.mergeBeef(candidate.fragment);
|
|
189
|
+
result.beef = aggregate;
|
|
190
|
+
result.hitTxids = candidates.map(candidate => candidate.rootTxid);
|
|
191
|
+
result.byteLength = candidates.reduce((bytes, candidate) => bytes + candidate.byteLength, 0);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
result.beef = new sdk_1.Beef();
|
|
195
|
+
result.hitTxids = [];
|
|
196
|
+
result.byteLength = 0;
|
|
197
|
+
result.corruptCount += candidates.length;
|
|
198
|
+
missing.push(...candidates.map(candidate => candidate.rootTxid));
|
|
199
|
+
}
|
|
200
|
+
const missingSet = new Set(missing);
|
|
201
|
+
result.missingTxids = requestedTxids.filter(rootTxid => missingSet.has(rootTxid));
|
|
202
|
+
span.end({
|
|
203
|
+
attributes: {
|
|
204
|
+
'prepared_beef.hit_count': result.hitTxids.length,
|
|
205
|
+
'prepared_beef.miss_count': result.missingTxids.length,
|
|
206
|
+
'prepared_beef.corrupt_count': result.corruptCount,
|
|
207
|
+
'prepared_beef.bytes': result.byteLength
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
return result;
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
// COOK is an optimization, never a new createAction dependency.
|
|
214
|
+
span.end({
|
|
215
|
+
status: 'error',
|
|
216
|
+
error,
|
|
217
|
+
attributes: {
|
|
218
|
+
'prepared_beef.hit_count': 0,
|
|
219
|
+
'prepared_beef.miss_count': result.missingTxids.length,
|
|
220
|
+
'prepared_beef.corrupt_count': 0,
|
|
221
|
+
'prepared_beef.bytes': 0
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
return result;
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Bounded, best-effort COOK worker. No foreground caller awaits this queue.
|
|
230
|
+
* Dropped or failed work is safe because canonical storage remains the source
|
|
231
|
+
* of truth and the normal BEEF builder remains the read-path fallback.
|
|
232
|
+
*/
|
|
233
|
+
class PreparedBeefCoordinator {
|
|
234
|
+
storage;
|
|
235
|
+
queue = [];
|
|
236
|
+
pendingRoots = new Set();
|
|
237
|
+
pendingRootsByUser = new Map();
|
|
238
|
+
admittedRoots = 0;
|
|
239
|
+
scheduled = false;
|
|
240
|
+
timer;
|
|
241
|
+
running = false;
|
|
242
|
+
stopped = false;
|
|
243
|
+
backfillStarted = false;
|
|
244
|
+
idleWaiters = [];
|
|
245
|
+
constructor(storage) {
|
|
246
|
+
this.storage = storage;
|
|
247
|
+
}
|
|
248
|
+
enqueue(preparation) {
|
|
249
|
+
if (this.stopped || !this.storage.preparedBeefPolicy.writeEnabled)
|
|
250
|
+
return false;
|
|
251
|
+
if (!Number.isSafeInteger(preparation.userId) || preparation.userId < 1)
|
|
252
|
+
return false;
|
|
253
|
+
if (preparation.rootTxids.some(rootTxid => !/^[0-9a-f]{64}$/i.test(rootTxid)))
|
|
254
|
+
return false;
|
|
255
|
+
const key = (rootTxid) => `${preparation.userId}:${rootTxid}`;
|
|
256
|
+
const rootTxids = [...new Set(preparation.rootTxids)]
|
|
257
|
+
.filter(rootTxid => !this.pendingRoots.has(key(rootTxid)));
|
|
258
|
+
if (rootTxids.length === 0)
|
|
259
|
+
return preparation.rootTxids.length > 0;
|
|
260
|
+
const globalCapacity = this.storage.preparedBeefPolicy.maxQueueSize - this.admittedRoots;
|
|
261
|
+
const userCapacity = this.storage.preparedBeefPolicy.maxQueueSizePerUser -
|
|
262
|
+
(this.pendingRootsByUser.get(preparation.userId) ?? 0);
|
|
263
|
+
const admitted = rootTxids.slice(0, Math.max(0, Math.min(globalCapacity, userCapacity)));
|
|
264
|
+
if (admitted.length === 0)
|
|
265
|
+
return false;
|
|
266
|
+
// Deliberately retain identifiers only. A canonical source BEEF can carry
|
|
267
|
+
// megabytes of tenant-controlled proof material and must not sit in a
|
|
268
|
+
// shared queue while other users wait.
|
|
269
|
+
this.queue.push({ userId: preparation.userId, rootTxids: admitted });
|
|
270
|
+
for (const rootTxid of admitted)
|
|
271
|
+
this.pendingRoots.add(key(rootTxid));
|
|
272
|
+
this.admittedRoots += admitted.length;
|
|
273
|
+
this.pendingRootsByUser.set(preparation.userId, (this.pendingRootsByUser.get(preparation.userId) ?? 0) + admitted.length);
|
|
274
|
+
this.schedule(0);
|
|
275
|
+
return true;
|
|
276
|
+
}
|
|
277
|
+
startBackfill() {
|
|
278
|
+
if (this.backfillStarted ||
|
|
279
|
+
this.stopped ||
|
|
280
|
+
!this.storage.preparedBeefPolicy.writeEnabled ||
|
|
281
|
+
!this.storage.preparedBeefPolicy.backfillEnabled)
|
|
282
|
+
return;
|
|
283
|
+
this.backfillStarted = true;
|
|
284
|
+
this.schedule(this.storage.preparedBeefPolicy.backfillIntervalMs);
|
|
285
|
+
}
|
|
286
|
+
async waitForIdle() {
|
|
287
|
+
if (!this.running && !this.scheduled && this.queue.length === 0)
|
|
288
|
+
return;
|
|
289
|
+
await new Promise(resolve => this.idleWaiters.push(resolve));
|
|
290
|
+
}
|
|
291
|
+
async stop() {
|
|
292
|
+
this.stopped = true;
|
|
293
|
+
for (const item of this.queue.splice(0))
|
|
294
|
+
this.releaseAdmission(item);
|
|
295
|
+
if (this.timer != null)
|
|
296
|
+
clearTimeout(this.timer);
|
|
297
|
+
this.timer = undefined;
|
|
298
|
+
this.scheduled = false;
|
|
299
|
+
if (!this.running)
|
|
300
|
+
this.resolveIdle();
|
|
301
|
+
await this.waitForIdle();
|
|
302
|
+
}
|
|
303
|
+
schedule(delayMs) {
|
|
304
|
+
if (this.scheduled || this.running || this.stopped)
|
|
305
|
+
return;
|
|
306
|
+
this.scheduled = true;
|
|
307
|
+
const timer = setTimeout(() => {
|
|
308
|
+
this.timer = undefined;
|
|
309
|
+
this.scheduled = false;
|
|
310
|
+
void this.run();
|
|
311
|
+
}, delayMs);
|
|
312
|
+
this.timer = timer;
|
|
313
|
+
const unref = timer.unref;
|
|
314
|
+
if (typeof unref === 'function')
|
|
315
|
+
unref.call(timer);
|
|
316
|
+
}
|
|
317
|
+
async run() {
|
|
318
|
+
if (this.running)
|
|
319
|
+
return;
|
|
320
|
+
if (this.stopped) {
|
|
321
|
+
this.resolveIdle();
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
this.running = true;
|
|
325
|
+
let item;
|
|
326
|
+
try {
|
|
327
|
+
item = this.queue.shift();
|
|
328
|
+
if (item != null) {
|
|
329
|
+
await this.prepare(item);
|
|
330
|
+
}
|
|
331
|
+
else if (this.backfillStarted) {
|
|
332
|
+
await this.enqueueBackfillBatch();
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
finally {
|
|
336
|
+
if (item != null) {
|
|
337
|
+
this.releaseAdmission(item);
|
|
338
|
+
}
|
|
339
|
+
this.running = false;
|
|
340
|
+
if (this.queue.length > 0)
|
|
341
|
+
this.schedule(0);
|
|
342
|
+
else if (this.backfillStarted && !this.stopped) {
|
|
343
|
+
this.schedule(this.storage.preparedBeefPolicy.backfillIntervalMs);
|
|
344
|
+
}
|
|
345
|
+
else
|
|
346
|
+
this.resolveIdle();
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
async enqueueBackfillBatch() {
|
|
350
|
+
try {
|
|
351
|
+
const roots = await this.storage.findPreparedBeefBackfillRoots(this.storage.preparedBeefPolicy.backfillBatchSize, exports.PREPARED_BEEF_FORMAT_VERSION);
|
|
352
|
+
if (roots.length === 0) {
|
|
353
|
+
this.backfillStarted = false;
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
const byUser = new Map();
|
|
357
|
+
// A backfill batch may be configured larger than the foreground queue.
|
|
358
|
+
// Admit only what this empty-queue pass can hold, then select the
|
|
359
|
+
// remaining roots after these artifacts have been persisted.
|
|
360
|
+
const selectedByUser = new Map();
|
|
361
|
+
for (const root of roots.slice(0, this.storage.preparedBeefPolicy.maxQueueSize)) {
|
|
362
|
+
const selected = selectedByUser.get(root.userId) ?? 0;
|
|
363
|
+
if (selected >= this.storage.preparedBeefPolicy.maxQueueSizePerUser)
|
|
364
|
+
continue;
|
|
365
|
+
const txids = byUser.get(root.userId) ?? [];
|
|
366
|
+
txids.push(root.rootTxid);
|
|
367
|
+
byUser.set(root.userId, txids);
|
|
368
|
+
selectedByUser.set(root.userId, selected + 1);
|
|
369
|
+
}
|
|
370
|
+
for (const [userId, rootTxids] of byUser) {
|
|
371
|
+
if (!this.enqueue({ userId, rootTxids }))
|
|
372
|
+
break;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
catch (error) {
|
|
376
|
+
this.storage.telemetry.startSpan('wallet.storage.prepared_beef.backfill', {
|
|
377
|
+
component: 'wallet-storage'
|
|
378
|
+
}).end({ status: 'error', error });
|
|
379
|
+
this.backfillStarted = false;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
async prepare(item) {
|
|
383
|
+
await this.storage.telemetry.withSpan('wallet.storage.prepared_beef.prepare', {
|
|
384
|
+
component: 'wallet-storage',
|
|
385
|
+
attributes: { 'prepared_beef.root_count': item.rootTxids.length }
|
|
386
|
+
}, async (span) => {
|
|
387
|
+
let preparedCount = 0;
|
|
388
|
+
let rejectedCount = 0;
|
|
389
|
+
let preparedBytes = 0;
|
|
390
|
+
let proofEpoch;
|
|
391
|
+
try {
|
|
392
|
+
// One epoch read covers this bounded batch. Every row write still
|
|
393
|
+
// locks and compares the metadata record before it can commit.
|
|
394
|
+
proofEpoch = await this.storage.readPreparedBeefProofEpoch();
|
|
395
|
+
}
|
|
396
|
+
catch (error) {
|
|
397
|
+
span.end({
|
|
398
|
+
status: 'error',
|
|
399
|
+
error,
|
|
400
|
+
attributes: {
|
|
401
|
+
'prepared_beef.prepared_count': 0,
|
|
402
|
+
'prepared_beef.rejected_count': item.rootTxids.length,
|
|
403
|
+
'prepared_beef.bytes': 0
|
|
404
|
+
}
|
|
405
|
+
});
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
for (const rootTxid of item.rootTxids) {
|
|
409
|
+
const byteLength = await this.prepareRoot(item.userId, rootTxid, proofEpoch);
|
|
410
|
+
if (byteLength == null)
|
|
411
|
+
rejectedCount++;
|
|
412
|
+
else {
|
|
413
|
+
preparedCount++;
|
|
414
|
+
preparedBytes += byteLength;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
span.end({
|
|
418
|
+
attributes: {
|
|
419
|
+
'prepared_beef.prepared_count': preparedCount,
|
|
420
|
+
'prepared_beef.rejected_count': rejectedCount,
|
|
421
|
+
'prepared_beef.bytes': preparedBytes
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
async prepareRoot(userId, rootTxid, proofEpoch) {
|
|
427
|
+
try {
|
|
428
|
+
return await this.buildAndPersistReadyArtifact(userId, rootTxid, proofEpoch);
|
|
429
|
+
}
|
|
430
|
+
catch {
|
|
431
|
+
// A persistent rejection marker prevents optional backfill from
|
|
432
|
+
// hot-looping on an unverifiable root. Normal canonical reads can still
|
|
433
|
+
// queue an organic retry, which replaces this marker after recovery.
|
|
434
|
+
await this.persistFailureMarker(userId, rootTxid, proofEpoch).catch(() => {
|
|
435
|
+
// Persistence remains best effort. The foreground action has already
|
|
436
|
+
// completed and canonical reads remain authoritative.
|
|
437
|
+
});
|
|
438
|
+
return undefined;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
async buildAndPersistReadyArtifact(userId, rootTxid, proofEpoch) {
|
|
442
|
+
const storedBytes = await this.storage.readPreparedBeefSourceByteLength(rootTxid);
|
|
443
|
+
if (storedBytes != null && storedBytes > this.storage.preparedBeefPolicy.maxArtifactBytes) {
|
|
444
|
+
throw new Error('prepared BEEF stored source exceeds configured byte limit');
|
|
445
|
+
}
|
|
446
|
+
const source = await this.storage.getBeefForTransaction(rootTxid, {
|
|
447
|
+
ignoreStorage: false,
|
|
448
|
+
ignoreServices: true,
|
|
449
|
+
ignoreNewProven: false
|
|
450
|
+
});
|
|
451
|
+
// Bound attacker-influenced graph work before dependency selection, proof
|
|
452
|
+
// verification, or exact serialization.
|
|
453
|
+
if (!isAdmissibleBeef(source, this.storage.preparedBeefPolicy)) {
|
|
454
|
+
throw new Error('prepared BEEF source exceeds configured resource limits');
|
|
455
|
+
}
|
|
456
|
+
const exact = (0, beefForTxids_1.beefForTxids)(source, [rootTxid]);
|
|
457
|
+
if (exact.txs.length > this.storage.preparedBeefPolicy.maxArtifactTransactions) {
|
|
458
|
+
throw new Error('prepared BEEF exceeds configured transaction limit');
|
|
459
|
+
}
|
|
460
|
+
if (!validRootTransaction(exact, rootTxid))
|
|
461
|
+
throw new Error('prepared BEEF root is incomplete');
|
|
462
|
+
if (!(await exact.verify(await this.storage.getServices().getChainTracker()))) {
|
|
463
|
+
throw new Error('prepared BEEF failed verification');
|
|
464
|
+
}
|
|
465
|
+
const bytes = exact.toUint8Array();
|
|
466
|
+
if (bytes.length > this.storage.preparedBeefPolicy.maxArtifactBytes) {
|
|
467
|
+
throw new Error('prepared BEEF exceeds configured size limit');
|
|
468
|
+
}
|
|
469
|
+
const now = new Date();
|
|
470
|
+
const row = {
|
|
471
|
+
created_at: now,
|
|
472
|
+
updated_at: now,
|
|
473
|
+
preparedBeefId: 0,
|
|
474
|
+
userId,
|
|
475
|
+
rootTxid,
|
|
476
|
+
beef: Array.from(bytes),
|
|
477
|
+
checksum: checksum(bytes),
|
|
478
|
+
formatVersion: exports.PREPARED_BEEF_FORMAT_VERSION,
|
|
479
|
+
state: 'ready',
|
|
480
|
+
txCount: exact.txs.length,
|
|
481
|
+
bumpCount: exact.bumps.length,
|
|
482
|
+
byteLength: bytes.length
|
|
483
|
+
};
|
|
484
|
+
// Proof state changed after verification when this returns false. The
|
|
485
|
+
// invalidation won the race, so do not add a failure marker that suppresses
|
|
486
|
+
// a later backfill retry.
|
|
487
|
+
return await this.storage.upsertPreparedBeef(row, proofEpoch) ? bytes.length : undefined;
|
|
488
|
+
}
|
|
489
|
+
async persistFailureMarker(userId, rootTxid, proofEpoch) {
|
|
490
|
+
const now = new Date();
|
|
491
|
+
const bytes = new Uint8Array();
|
|
492
|
+
await this.storage.upsertPreparedBeef({
|
|
493
|
+
created_at: now,
|
|
494
|
+
updated_at: now,
|
|
495
|
+
preparedBeefId: 0,
|
|
496
|
+
userId,
|
|
497
|
+
rootTxid,
|
|
498
|
+
beef: [],
|
|
499
|
+
checksum: checksum(bytes),
|
|
500
|
+
formatVersion: exports.PREPARED_BEEF_FORMAT_VERSION,
|
|
501
|
+
state: 'failed',
|
|
502
|
+
txCount: 0,
|
|
503
|
+
bumpCount: 0,
|
|
504
|
+
byteLength: 0
|
|
505
|
+
}, proofEpoch);
|
|
506
|
+
}
|
|
507
|
+
resolveIdle() {
|
|
508
|
+
const waiters = this.idleWaiters;
|
|
509
|
+
this.idleWaiters = [];
|
|
510
|
+
for (const resolve of waiters)
|
|
511
|
+
resolve();
|
|
512
|
+
}
|
|
513
|
+
releaseAdmission(item) {
|
|
514
|
+
for (const rootTxid of item.rootTxids)
|
|
515
|
+
this.pendingRoots.delete(`${item.userId}:${rootTxid}`);
|
|
516
|
+
this.admittedRoots = Math.max(0, this.admittedRoots - item.rootTxids.length);
|
|
517
|
+
const userRoots = (this.pendingRootsByUser.get(item.userId) ?? 0) - item.rootTxids.length;
|
|
518
|
+
if (userRoots <= 0)
|
|
519
|
+
this.pendingRootsByUser.delete(item.userId);
|
|
520
|
+
else
|
|
521
|
+
this.pendingRootsByUser.set(item.userId, userRoots);
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
exports.PreparedBeefCoordinator = PreparedBeefCoordinator;
|
|
525
|
+
//# sourceMappingURL=preparedBeef.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preparedBeef.js","sourceRoot":"","sources":["../../../../src/storage/methods/preparedBeef.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processAction.d.ts","sourceRoot":"","sources":["../../../../src/storage/methods/processAction.ts"],"names":[],"mappings":"AACA,OAAO,EACL,IAAI,EAEJ,cAAc,EAEd,qBAAqB,EAEtB,MAAM,UAAU,CAAA;AAEjB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EACL,MAAM,EACN,kBAAkB,EAClB,wBAAwB,EACxB,2BAA2B,EAC5B,MAAM,oCAAoC,CAAA;AAU3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAA;AAExE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;
|
|
1
|
+
{"version":3,"file":"processAction.d.ts","sourceRoot":"","sources":["../../../../src/storage/methods/processAction.ts"],"names":[],"mappings":"AACA,OAAO,EACL,IAAI,EAEJ,cAAc,EAEd,qBAAqB,EAEtB,MAAM,UAAU,CAAA;AAEjB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EACL,MAAM,EACN,kBAAkB,EAClB,wBAAwB,EACxB,2BAA2B,EAC5B,MAAM,oCAAoC,CAAA;AAU3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAA;AAExE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAiB9D,wBAAsB,aAAa,CACjC,OAAO,EAAE,eAAe,EACxB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,wBAAwB,GAC7B,OAAO,CAAC,2BAA2B,CAAC,CAoBtC;AAiGD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,gBAAgB,CAAA;IACtB,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,MAAM,EAAE,aAAa,GAAG,aAAa,GAAG,OAAO,GAAG,SAAS,CAAA;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,IAAI,CAAA;IACV,OAAO,EAAE,oBAAoB,EAAE,CAAA;IAC/B,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAA;IAEZ;;OAEG;IACH,MAAM,EAAE,SAAS,GAAG,OAAO,CAAA;IAE3B;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IAEtB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAgFD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,EAAE,OAAO,EAClB,CAAC,CAAC,EAAE,oBAAoB,EACxB,MAAM,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC;IAAE,GAAG,EAAE,cAAc,EAAE,CAAC;IAAC,GAAG,EAAE,kBAAkB,EAAE,GAAG,SAAS,CAAA;CAAE,CAAC,CAyC3E;AA6OD,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,iBAAiB,CAAA;IACtB,GAAG,CAAC,EAAE,MAAM,CAAA;CACb"}
|