@bsv/dpp-overlay-topics 0.4.0-beta.1

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.
Files changed (87) hide show
  1. package/LICENSE +58 -0
  2. package/README.md +169 -0
  3. package/dist/anchorStorage.d.ts +58 -0
  4. package/dist/anchorStorage.d.ts.map +1 -0
  5. package/dist/anchorStorage.js +72 -0
  6. package/dist/anchorStorage.js.map +1 -0
  7. package/dist/attestationAnchor.d.ts +10 -0
  8. package/dist/attestationAnchor.d.ts.map +1 -0
  9. package/dist/attestationAnchor.js +10 -0
  10. package/dist/attestationAnchor.js.map +1 -0
  11. package/dist/attestationStorage.d.ts +49 -0
  12. package/dist/attestationStorage.d.ts.map +1 -0
  13. package/dist/attestationStorage.js +78 -0
  14. package/dist/attestationStorage.js.map +1 -0
  15. package/dist/capabilities.d.ts +127 -0
  16. package/dist/capabilities.d.ts.map +1 -0
  17. package/dist/capabilities.js +210 -0
  18. package/dist/capabilities.js.map +1 -0
  19. package/dist/engineStorage.d.ts +106 -0
  20. package/dist/engineStorage.d.ts.map +1 -0
  21. package/dist/engineStorage.js +253 -0
  22. package/dist/engineStorage.js.map +1 -0
  23. package/dist/evidenceExport.d.ts +189 -0
  24. package/dist/evidenceExport.d.ts.map +1 -0
  25. package/dist/evidenceExport.js +517 -0
  26. package/dist/evidenceExport.js.map +1 -0
  27. package/dist/history.d.ts +114 -0
  28. package/dist/history.d.ts.map +1 -0
  29. package/dist/history.js +215 -0
  30. package/dist/history.js.map +1 -0
  31. package/dist/index.d.ts +269 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +1223 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/lib.d.ts +31 -0
  36. package/dist/lib.d.ts.map +1 -0
  37. package/dist/lib.js +31 -0
  38. package/dist/lib.js.map +1 -0
  39. package/dist/limits.d.ts +44 -0
  40. package/dist/limits.d.ts.map +1 -0
  41. package/dist/limits.js +44 -0
  42. package/dist/limits.js.map +1 -0
  43. package/dist/lsAttestation.d.ts +21 -0
  44. package/dist/lsAttestation.d.ts.map +1 -0
  45. package/dist/lsAttestation.js +45 -0
  46. package/dist/lsAttestation.js.map +1 -0
  47. package/dist/lsDpp.d.ts +53 -0
  48. package/dist/lsDpp.d.ts.map +1 -0
  49. package/dist/lsDpp.js +148 -0
  50. package/dist/lsDpp.js.map +1 -0
  51. package/dist/lsUoraDpp.d.ts +55 -0
  52. package/dist/lsUoraDpp.d.ts.map +1 -0
  53. package/dist/lsUoraDpp.js +152 -0
  54. package/dist/lsUoraDpp.js.map +1 -0
  55. package/dist/policyConfig.d.ts +31 -0
  56. package/dist/policyConfig.d.ts.map +1 -0
  57. package/dist/policyConfig.js +112 -0
  58. package/dist/policyConfig.js.map +1 -0
  59. package/dist/retraction.d.ts +41 -0
  60. package/dist/retraction.d.ts.map +1 -0
  61. package/dist/retraction.js +147 -0
  62. package/dist/retraction.js.map +1 -0
  63. package/dist/storage.d.ts +117 -0
  64. package/dist/storage.d.ts.map +1 -0
  65. package/dist/storage.js +158 -0
  66. package/dist/storage.js.map +1 -0
  67. package/dist/sync.d.ts +75 -0
  68. package/dist/sync.d.ts.map +1 -0
  69. package/dist/sync.js +118 -0
  70. package/dist/sync.js.map +1 -0
  71. package/dist/tmAttestation.d.ts +36 -0
  72. package/dist/tmAttestation.d.ts.map +1 -0
  73. package/dist/tmAttestation.js +50 -0
  74. package/dist/tmAttestation.js.map +1 -0
  75. package/dist/tmDpp.d.ts +154 -0
  76. package/dist/tmDpp.d.ts.map +1 -0
  77. package/dist/tmDpp.js +397 -0
  78. package/dist/tmDpp.js.map +1 -0
  79. package/dist/tmUoraDpp.d.ts +73 -0
  80. package/dist/tmUoraDpp.d.ts.map +1 -0
  81. package/dist/tmUoraDpp.js +150 -0
  82. package/dist/tmUoraDpp.js.map +1 -0
  83. package/dist/uoraAnchor.d.ts +209 -0
  84. package/dist/uoraAnchor.d.ts.map +1 -0
  85. package/dist/uoraAnchor.js +433 -0
  86. package/dist/uoraAnchor.js.map +1 -0
  87. package/package.json +51 -0
@@ -0,0 +1,517 @@
1
+ /**
2
+ * The evidence package export (`spec/portable-evidence.md` section 2,
3
+ * `contracts/evidence-package.schema.json`): everything this node holds about
4
+ * one passport, as content-addressed files under a manifest the node signs.
5
+ *
6
+ * What goes in, from this node's own stores and nothing fetched: every
7
+ * retained state's raw transaction under `transactions/`, the BEEF it is held
8
+ * in under `proofs/` (the merkle path and ancestors a verifier needs, once
9
+ * `/arc-ingest` has delivered the proof), the publisher policy chain under
10
+ * `authority/` when one is configured, the spend observations under `status/`
11
+ * and a verification report under `reports/`. The signature says this node
12
+ * assembled these bytes; it says nothing about their truth, which a reader
13
+ * establishes from the bytes and its own header source, and nothing about
14
+ * completeness beyond the snapshot the manifest names.
15
+ *
16
+ * Two routes build from the same pieces. `GET /evidence-package` is the
17
+ * bounded package: the newest states within the cap, the rest declared
18
+ * absent, complete for its snapshot only when the cap was not reached. `GET
19
+ * /evidence-export` is the complete export: parts over one snapshot, oldest
20
+ * first, each a package of its own over a contiguous sequence range bounded
21
+ * by states and by bytes, resumed by a cursor, tiling the snapshot so a
22
+ * reader joins them with `joinEvidenceExport` and knows whether it holds
23
+ * everything the snapshot held (`contracts/evidence-export.schema.json`).
24
+ *
25
+ * The archive form is this build's own, as the standard leaves it: a JSON
26
+ * envelope `{ manifest, files: { "<path>": "<base64>" } }`, so a browser or a
27
+ * script reads it without an archive library and the file map is exactly the
28
+ * one `inspectEvidencePackage` takes.
29
+ */
30
+ import { Beef, PublicKey, Signature, Utils } from '@bsv/sdk';
31
+ import { CanonicalJsonError, EVIDENCE_PACKAGE_FORMAT, EVIDENCE_PACKAGE_VERSION, PUBLISHER_POLICY_FORMAT, REPORT_VERSION, canonicalJson, chainFromBeef, inspectEvidencePackage, inventoryEntry, sha256Hex, signEvidenceManifest, verifyPassportEvidence, } from '@bsv/dpp-core';
32
+ import { DPP_TOPIC } from './tmDpp.js';
33
+ import { DPP_SERVICE } from './lsDpp.js';
34
+ import { IMPLICIT_POLICY_VERSION, SINGLE_OPERATOR_PROFILE } from './capabilities.js';
35
+ import { MAX_EXPORT_PART_BYTES, MAX_EXPORT_STATES } from './limits.js';
36
+ import { newestPolicy } from './policyConfig.js';
37
+ /** The version of the complete export's wrapper, `contracts/evidence-export.schema.json`. */
38
+ export const EVIDENCE_EXPORT_VERSION = '1';
39
+ /** The digest the coverage record binds the package by: the manifest exactly as signed, canonical JSON, signature value included. */
40
+ export function exportManifestDigest(manifest) {
41
+ return sha256Hex(Utils.toArray(canonicalJson(manifest), 'utf8'));
42
+ }
43
+ /** The coverage record a part carries: the wrapper without its cursor, its package and the signature value. */
44
+ export function exportCoverageOf(part) {
45
+ return {
46
+ exportVersion: part.exportVersion,
47
+ passportId: part.passportId,
48
+ snapshot: { source: part.snapshot.source, id: part.snapshot.id, sequence: part.snapshot.sequence },
49
+ part: { index: part.part.index, sequenceRange: { from: part.part.sequenceRange.from, to: part.part.sequenceRange.to }, states: part.part.states },
50
+ final: part.final,
51
+ manifestSha256: part.manifestSha256,
52
+ signature: { suite: part.signature.suite, signer: part.signature.signer },
53
+ };
54
+ }
55
+ /** The bytes the exporter signs for a part: the coverage record in canonical JSON, UTF-8, exactly as the manifest's own preimage rule; ECDSA then runs over their SHA-256. */
56
+ export function exportCoveragePreimage(part) {
57
+ return Utils.toArray(canonicalJson(exportCoverageOf(part)), 'utf8');
58
+ }
59
+ /** The scope sentence a part's manifest carries, rendered from the coverage record so the signed manifest and the signed coverage say one thing. */
60
+ export function exportScopeText(passportId, snapshotId, index, from, to, final) {
61
+ return index === 1 && final ? `passportId=${passportId}` : `passportId=${passportId}; sequences ${from}..${to} of snapshot ${snapshotId}; part ${index} of the complete export`;
62
+ }
63
+ /**
64
+ * Inspect one part: the coverage signature, the binding of the package to
65
+ * the record, the agreement of the signed manifest with the record, and the
66
+ * package itself. Only a part whose coverage is authentic and bound may say
67
+ * anything about what an export covers.
68
+ */
69
+ export function inspectEvidenceExportPart(part, options = {}) {
70
+ const failures = [];
71
+ const label = `part ${part.part?.index}`;
72
+ const manifest = part.package?.manifest;
73
+ const packageInspection = inspectEvidencePackage(manifest, envelopeFiles(part.package), { expectedPassportId: options.expectedPassportId ?? part.passportId, ...(options.expectedSigner == null ? {} : { expectedSigner: options.expectedSigner }) });
74
+ for (const failure of packageInspection.failures)
75
+ failures.push(`${label}: ${failure.detail}`);
76
+ if (packageInspection.signatureValid !== true)
77
+ failures.push(`${label}: the package signature does not verify`);
78
+ let coverageAuthentic = false;
79
+ const signer = part.signature?.signer;
80
+ if (part.signature?.suite !== 'bsv-ecdsa-der' || typeof signer !== 'string' || !/^0[23][0-9a-f]{64}$/.test(signer) || typeof part.signature.value !== 'string') {
81
+ failures.push(`${label}: the coverage record needs the bsv-ecdsa-der suite, a compressed signer key and a value`);
82
+ }
83
+ else {
84
+ try {
85
+ coverageAuthentic = PublicKey.fromString(signer).verify(exportCoveragePreimage(part), Signature.fromDER(Utils.toArray(part.signature.value, 'hex')));
86
+ }
87
+ catch (error) {
88
+ coverageAuthentic = error instanceof CanonicalJsonError ? null : false;
89
+ if (coverageAuthentic === null)
90
+ failures.push(`${label}: the coverage record has no canonical form: ${error instanceof Error ? error.message : 'unknown'}`);
91
+ }
92
+ if (coverageAuthentic === false)
93
+ failures.push(`${label}: the coverage signature does not verify under ${signer}; its range, index and finality establish nothing`);
94
+ if (manifest?.signature?.signer != null && signer !== manifest.signature.signer)
95
+ failures.push(`${label}: the coverage record is signed by ${signer} but the package by ${manifest.signature.signer}`);
96
+ if (options.expectedSigner != null && signer !== options.expectedSigner)
97
+ failures.push(`${label}: the coverage record is signed by ${signer}, not the expected ${options.expectedSigner}`);
98
+ }
99
+ let manifestBound = false;
100
+ if (manifest != null) {
101
+ let digest;
102
+ try {
103
+ digest = exportManifestDigest(manifest);
104
+ }
105
+ catch {
106
+ failures.push(`${label}: the package manifest has no canonical form`);
107
+ }
108
+ if (digest != null && digest !== part.manifestSha256)
109
+ failures.push(`${label}: the package manifest hashes to ${digest.slice(0, 12)}…, not the ${String(part.manifestSha256).slice(0, 12)}… the coverage record names; the package is not the one the record covers`);
110
+ const declared = manifest.completeness?.snapshots?.[0];
111
+ const { from, to } = part.part.sequenceRange;
112
+ const scope = exportScopeText(part.passportId, part.snapshot.id, part.part.index, from, to, part.final);
113
+ if (declared == null || declared.snapshotId !== part.snapshot.id)
114
+ failures.push(`${label}: the package names snapshot ${declared?.snapshotId ?? 'none'}, not ${part.snapshot.id}`);
115
+ else if (declared.scope !== scope)
116
+ failures.push(`${label}: the package declares scope "${declared.scope ?? ''}" but the coverage record says "${scope}"`);
117
+ else if (declared.completeForSnapshot !== (part.part.index === 1 && part.final))
118
+ failures.push(`${label}: the package declares completeForSnapshot ${String(declared.completeForSnapshot)}, which the coverage record contradicts`);
119
+ if (manifest.passportId !== part.passportId)
120
+ failures.push(`${label}: the package is about ${manifest.passportId}, not ${part.passportId}`);
121
+ manifestBound = digest === part.manifestSha256 && declared != null && declared.snapshotId === part.snapshot.id && declared.scope === scope && declared.completeForSnapshot === (part.part.index === 1 && part.final) && manifest.passportId === part.passportId;
122
+ }
123
+ else {
124
+ failures.push(`${label}: no package`);
125
+ }
126
+ return { coverageAuthentic, manifestBound, package: packageInspection, failures };
127
+ }
128
+ const OCTET_STREAM = 'application/octet-stream';
129
+ const JSON_MEDIA_TYPE = 'application/json';
130
+ const outpointRef = (txid, outputIndex) => `${txid}:${outputIndex}`;
131
+ /** The tiers this node never holds, named as the disclosure scopes name them (`spec/record-model.md` section 7). */
132
+ export const WITHHELD_TIERS = [
133
+ 'tier:owner (the encrypted blobs payload_owner_hash commits to are never held by this node)',
134
+ 'tier:legitimate-interest (never held by this node)',
135
+ 'tier:authority (never held by this node)',
136
+ ];
137
+ async function readHeld(row, engineStorage) {
138
+ const output = await engineStorage.findOutput(row.txid, row.outputIndex, DPP_TOPIC, undefined, true);
139
+ if (output?.beef == null)
140
+ return { row, proven: false };
141
+ try {
142
+ const parsed = Beef.fromBinary(output.beef);
143
+ const held = parsed.findTxid(row.txid);
144
+ const raw = held?.rawTx ?? held?.tx?.toBinary();
145
+ if (raw == null)
146
+ return { row, proven: false };
147
+ return { row, raw, beef: output.beef, parsed, proven: held?.bumpIndex != null || held?.tx?.merklePath != null };
148
+ }
149
+ catch {
150
+ return { row, proven: false };
151
+ }
152
+ }
153
+ /** The files of a set of held states, their inventory, what is absent, and the merged BEEF of what was held. */
154
+ class PackageFiles {
155
+ files = new Map();
156
+ inventory = [];
157
+ absent = [];
158
+ merged = new Beef();
159
+ /** Raw transaction and BEEF bytes added so far, the number a part's byte bound reads. */
160
+ bytes = 0;
161
+ add(path, category, mediaType, bytes, extra = {}) {
162
+ this.files.set(path, bytes);
163
+ this.inventory.push(inventoryEntry(path, category, mediaType, bytes, extra));
164
+ }
165
+ /** Transaction and proof of one state, straight from the engine's storage, or its absence by outpoint. */
166
+ addState(held) {
167
+ const ref = outpointRef(held.row.txid, held.row.outputIndex);
168
+ if (held.raw == null || held.beef == null || held.parsed == null) {
169
+ this.absent.push(`transaction:${ref}`, `proof:${ref}`);
170
+ return;
171
+ }
172
+ this.merged.mergeBeef(held.parsed);
173
+ this.add(`transactions/${held.row.txid}.tx`, 'transactions', OCTET_STREAM, held.raw, { represents: ref, representation: 'raw-transaction' });
174
+ this.add(`proofs/${held.row.txid}.beef`, 'proofs', OCTET_STREAM, held.beef, { represents: ref, representation: 'beef' });
175
+ this.bytes += held.raw.length + held.beef.length;
176
+ // An unmined state has no merkle path anywhere yet; the reader's inclusion
177
+ // check will say proof-absent, and the manifest says so first.
178
+ if (!held.proven)
179
+ this.absent.push(`merkle-path:${held.row.txid}`);
180
+ }
181
+ /** The publisher policy chain, as the authority record a reader checks the countersignatures against; canonical JSON so the bytes are the same from every process that holds this chain. */
182
+ addPolicy(policy) {
183
+ if (policy == null)
184
+ return;
185
+ this.add('authority/publisher-policy.json', 'authority', JSON_MEDIA_TYPE, Utils.toArray(canonicalJson(policy.chain), 'utf8'), {
186
+ represents: `${PUBLISHER_POLICY_FORMAT} versions ${policy.versions.join(', ')}`,
187
+ representation: PUBLISHER_POLICY_FORMAT,
188
+ });
189
+ }
190
+ /** The spend observations: what this node's own index says about each state at export time. */
191
+ addObservations(rows, snapshot, exportedAt, part) {
192
+ const observations = {
193
+ source: DPP_SERVICE,
194
+ snapshotId: snapshot.id,
195
+ observedAt: exportedAt,
196
+ ...(part == null ? {} : { part }),
197
+ states: rows.map((row) => ({ txid: row.txid, outputIndex: row.outputIndex, spent: row.spent, spendingTxid: row.spendingTxid, sequence: row.sequence })),
198
+ };
199
+ // One file per part, named by the part, so the parts of one export never
200
+ // repeat a path with different bytes when a reader joins them.
201
+ this.add(part == null ? 'status/spend-observations.json' : `status/spend-observations-part-${part}.json`, 'status', JSON_MEDIA_TYPE, Utils.toArray(JSON.stringify(observations), 'utf8'), {
202
+ represents: `${DPP_SERVICE} snapshot ${snapshot.id}${part == null ? '' : ` part ${part}`}`,
203
+ });
204
+ }
205
+ envelope() {
206
+ const encoded = {};
207
+ for (const [path, bytes] of this.files)
208
+ encoded[path] = Utils.toBase64(bytes);
209
+ return encoded;
210
+ }
211
+ }
212
+ const policyIdOf = (policy) => (policy == null ? IMPLICIT_POLICY_VERSION : `${PUBLISHER_POLICY_FORMAT}:${newestPolicy(policy).policyVersion}`);
213
+ const operatorProfileOf = (policy) => (policy == null ? SINGLE_OPERATOR_PROFILE : newestPolicy(policy).scope.operatorProfile);
214
+ /** A genesis is the state with no predecessor; the first held row is not one merely by being first. */
215
+ const isGenesis = (row) => row != null && row.previousTxid === '';
216
+ function signedBy(signingKey) {
217
+ return { exporterId: signingKey.toPublicKey().toString(), sign: async (preimage) => signingKey.sign(preimage).toDER() };
218
+ }
219
+ /**
220
+ * Build the bounded package, or return undefined when this node holds
221
+ * nothing for the passport, which the route answers as 404 rather than as an
222
+ * empty package claiming completeness over nothing.
223
+ */
224
+ export async function buildEvidencePackage(request) {
225
+ const { passportId, now } = request;
226
+ const exportedAt = now.toISOString();
227
+ const snapshot = await request.paginator.takeSnapshot();
228
+ const everyRow = await request.paginator.readAll({ passportId }, snapshot);
229
+ if (everyRow.length === 0)
230
+ return undefined;
231
+ // The newest states within the cap, as the bounded lookup keeps the newest;
232
+ // the older ones are declared absent by outpoint below, and the snapshot is
233
+ // then not complete, which the manifest says rather than implies. The
234
+ // complete export reaches them in further parts.
235
+ const rows = everyRow.slice(-MAX_EXPORT_STATES);
236
+ const omitted = everyRow.slice(0, everyRow.length - rows.length);
237
+ const files = new PackageFiles();
238
+ files.absent.push(...omitted.flatMap((row) => [`transaction:${outpointRef(row.txid, row.outputIndex)}`, `proof:${outpointRef(row.txid, row.outputIndex)}`]));
239
+ const byTxid = new Map();
240
+ for (const row of rows) {
241
+ byTxid.set(row.txid, row);
242
+ files.addState(await readHeld(row, request.engineStorage));
243
+ }
244
+ // The history in chain order when the held states form one chain, which is
245
+ // the order the report inspects; otherwise in the store's order, and the
246
+ // report names the link that does not hold.
247
+ let ordered;
248
+ try {
249
+ ordered = chainFromBeef(files.merged, passportId);
250
+ }
251
+ catch {
252
+ ordered = rows
253
+ .map((row) => files.merged.findAtomicTransaction(row.txid))
254
+ .filter((tx) => tx != null);
255
+ }
256
+ const first = ordered[0] == null ? undefined : byTxid.get(ordered[0].id('hex'));
257
+ const last = ordered.length === 0 ? undefined : byTxid.get(ordered[ordered.length - 1].id('hex'));
258
+ const tipRecord = last ?? rows[rows.length - 1];
259
+ const policy = request.publisherPolicy;
260
+ files.addPolicy(policy);
261
+ const policyId = policyIdOf(policy);
262
+ const spendResult = tipRecord.spent ? 'spent' : 'unspent';
263
+ files.addObservations(rows, snapshot, exportedAt);
264
+ const observer = {
265
+ id: DPP_SERVICE,
266
+ kind: 'spend-status',
267
+ observe: async () => ({
268
+ result: spendResult,
269
+ ...(tipRecord.spent ? { spendingTxid: tipRecord.spendingTxid } : {}),
270
+ }),
271
+ };
272
+ // The report, in the one shape every surface produces, evaluated at the
273
+ // export instant against the node's own admission policy and header source.
274
+ const evidencePolicy = {
275
+ policyId,
276
+ ...(policy != null
277
+ ? { publisherPolicy: { chain: policy.chain, operatorIdentityKeys: policy.operators } }
278
+ : request.serviceIdentityKey != null && request.serviceIdentityKey !== ''
279
+ ? { publisherKeys: [request.serviceIdentityKey] }
280
+ : {}),
281
+ ownerConsent: request.ownerConsent,
282
+ ...(request.controlAuthorities == null ? {} : { controlAuthorities: request.controlAuthorities }),
283
+ ...(request.managedAcceptance == null ? {} : { managedAcceptance: { required: request.managedAcceptance } }),
284
+ chainTracker: request.chainTracker,
285
+ checkedAt: exportedAt,
286
+ observers: [observer],
287
+ };
288
+ const report = await verifyPassportEvidence({ tokenHistory: ordered }, { passportId, source: 'request-context' }, evidencePolicy);
289
+ files.add('reports/verification-report.json', 'reports', JSON_MEDIA_TYPE, Utils.toArray(JSON.stringify(report), 'utf8'), {
290
+ represents: `verification-report@${REPORT_VERSION} for ${passportId}`,
291
+ });
292
+ const { exporterId, sign } = signedBy(request.signingKey);
293
+ const unsigned = {
294
+ format: EVIDENCE_PACKAGE_FORMAT,
295
+ version: EVIDENCE_PACKAGE_VERSION,
296
+ passportId,
297
+ // The genesis only when the first ordered state has no predecessor: a
298
+ // package cut at the cap starts in the middle of a lineage and names none.
299
+ ...(isGenesis(first) ? { genesis: { txid: first.txid, outputIndex: first.outputIndex } } : {}),
300
+ ...(last == null ? {} : { selectedTip: { txid: last.txid, outputIndex: last.outputIndex } }),
301
+ exportedAt,
302
+ exporter: { id: exporterId, role: 'overlay', software: request.software },
303
+ profiles: [operatorProfileOf(policy)],
304
+ policyId,
305
+ // Public scope, and therefore never a recovery backup: the restricted
306
+ // tiers are not held here, so they are withheld by name, not implied.
307
+ disclosure: { scope: 'public', recoveryBackup: false },
308
+ completeness: {
309
+ snapshots: [{ source: DPP_SERVICE, snapshotId: snapshot.id, completeForSnapshot: omitted.length === 0, scope: `passportId=${passportId}` }],
310
+ withheld: [...WITHHELD_TIERS],
311
+ absent: files.absent,
312
+ },
313
+ sources: [
314
+ { id: DPP_SERVICE, kind: 'overlay-lookup', observedAt: exportedAt, result: spendResult },
315
+ { id: DPP_SERVICE, kind: 'spend-status', observedAt: exportedAt, result: spendResult },
316
+ ],
317
+ inventory: files.inventory,
318
+ signature: { suite: 'bsv-ecdsa-der', signer: exporterId },
319
+ };
320
+ const manifest = await signEvidenceManifest(unsigned, { sign });
321
+ return { manifest, files: files.envelope() };
322
+ }
323
+ /**
324
+ * Build one part of the complete export: the first when no cursor is given,
325
+ * which pins the snapshot, or the part the cursor names over the snapshot it
326
+ * carries. Returns undefined when this node holds nothing for the passport
327
+ * in the snapshot. A cursor of the wrong kind, for another passport, from
328
+ * another process or older than the TTL throws the paginator's named
329
+ * refusal, which the route answers as it answers a history cursor.
330
+ */
331
+ export async function buildEvidenceExportPart(request) {
332
+ const { passportId, now } = request;
333
+ const exportedAt = now.toISOString();
334
+ const maxStates = Math.max(1, Math.min(request.maxStates ?? MAX_EXPORT_STATES, MAX_EXPORT_STATES));
335
+ const maxBytes = Math.max(1, Math.min(request.maxBytes ?? MAX_EXPORT_PART_BYTES, MAX_EXPORT_PART_BYTES));
336
+ const query = { passportId };
337
+ let snapshot;
338
+ let after;
339
+ let index;
340
+ if (request.cursor == null || request.cursor === '') {
341
+ snapshot = await request.paginator.takeSnapshot();
342
+ after = 0;
343
+ index = 1;
344
+ if ((await request.paginator.readFrom(query, snapshot, 0, 1)).length === 0)
345
+ return undefined;
346
+ }
347
+ else {
348
+ ;
349
+ ({ snapshot, after, part: index } = request.paginator.openExportCursor(request.cursor, query));
350
+ }
351
+ // One row beyond the state bound tells whether the snapshot continues;
352
+ // the byte bound may close the part earlier, and then it continues too.
353
+ const candidates = await request.paginator.readFrom(query, snapshot, after, maxStates + 1);
354
+ const files = new PackageFiles();
355
+ const taken = [];
356
+ let more = candidates.length > maxStates;
357
+ for (const row of candidates.slice(0, maxStates)) {
358
+ const held = await readHeld(row, request.engineStorage);
359
+ const weight = (held.raw?.length ?? 0) + (held.beef?.length ?? 0);
360
+ if (taken.length > 0 && files.bytes + weight > maxBytes) {
361
+ more = true;
362
+ break;
363
+ }
364
+ files.addState(held);
365
+ taken.push(row);
366
+ }
367
+ const last = taken[taken.length - 1];
368
+ const to = more && last != null ? last.sequence : snapshot.sequence;
369
+ const from = Math.min(after + 1, to);
370
+ const policy = request.publisherPolicy;
371
+ files.addPolicy(policy);
372
+ files.addObservations(taken, snapshot, exportedAt, index);
373
+ const final = !more;
374
+ const single = index === 1 && final;
375
+ const tip = more ? undefined : [...taken].reverse().find((row) => !row.spent);
376
+ const observed = last ?? undefined;
377
+ const spendResult = observed == null ? 'not-found' : observed.spent ? 'spent' : 'unspent';
378
+ const { exporterId, sign } = signedBy(request.signingKey);
379
+ const unsigned = {
380
+ format: EVIDENCE_PACKAGE_FORMAT,
381
+ version: EVIDENCE_PACKAGE_VERSION,
382
+ passportId,
383
+ ...(index === 1 && isGenesis(taken[0]) ? { genesis: { txid: taken[0].txid, outputIndex: taken[0].outputIndex } } : {}),
384
+ ...(tip == null ? {} : { selectedTip: { txid: tip.txid, outputIndex: tip.outputIndex } }),
385
+ exportedAt,
386
+ exporter: { id: exporterId, role: 'overlay', software: request.software },
387
+ profiles: [operatorProfileOf(policy)],
388
+ policyId: policyIdOf(policy),
389
+ disclosure: { scope: 'public', recoveryBackup: false },
390
+ completeness: {
391
+ // A part is complete for its own range and never for the snapshot,
392
+ // unless it is the only part; the wrapper and the reader's join say
393
+ // whether the parts together cover the snapshot.
394
+ snapshots: [{
395
+ source: DPP_SERVICE,
396
+ snapshotId: snapshot.id,
397
+ completeForSnapshot: single,
398
+ scope: exportScopeText(passportId, snapshot.id, index, from, to, final),
399
+ }],
400
+ withheld: [...WITHHELD_TIERS],
401
+ absent: files.absent,
402
+ },
403
+ sources: [{ id: DPP_SERVICE, kind: 'spend-status', observedAt: exportedAt, result: spendResult }],
404
+ inventory: files.inventory,
405
+ signature: { suite: 'bsv-ecdsa-der', signer: exporterId },
406
+ };
407
+ const manifest = await signEvidenceManifest(unsigned, { sign });
408
+ // The coverage record, signed by the same key and bound to the manifest
409
+ // exactly as signed: the cursor stays outside it, being a resumption token
410
+ // of this process and no statement about coverage.
411
+ const coverage = {
412
+ exportVersion: EVIDENCE_EXPORT_VERSION,
413
+ passportId,
414
+ snapshot: { source: DPP_SERVICE, id: snapshot.id, sequence: snapshot.sequence },
415
+ part: { index, sequenceRange: { from, to }, states: taken.length },
416
+ final,
417
+ manifestSha256: exportManifestDigest(manifest),
418
+ signature: { suite: 'bsv-ecdsa-der', signer: exporterId, value: '' },
419
+ };
420
+ coverage.signature.value = Utils.toHex(await sign(exportCoveragePreimage(coverage)));
421
+ return {
422
+ ...coverage,
423
+ nextCursor: more && last != null ? request.paginator.mintExportCursor(snapshot, query, last.sequence, index + 1) : null,
424
+ package: { manifest, files: files.envelope() },
425
+ };
426
+ }
427
+ /** The envelope's file map as `inspectEvidencePackage` takes it. */
428
+ export function envelopeFiles(envelope) {
429
+ return new Map(Object.entries(envelope.files).map(([path, base64]) => [path, Utils.toArray(base64, 'base64')]));
430
+ }
431
+ /**
432
+ * Join the parts of one complete export as a reader does. First each part on
433
+ * its own: the coverage signature under the exporter's key, the binding of
434
+ * the package to the record by digest, the agreement of the signed manifest
435
+ * with the record, and the package on its three questions. Only a part that
436
+ * passes all of that says anything about coverage; then, across the parts
437
+ * that do: the same passport, the same snapshot, the same exporter, indexes
438
+ * 1 to n with no repeat, ranges that tile the snapshot from 1 to its
439
+ * sequence with no gap and no overlap, and the signed final flag on the last
440
+ * part alone, ending at the snapshot's sequence. Anything else is a problem
441
+ * by sentence and `complete` is false. The join establishes what the
442
+ * exporter asserted it held at that snapshot and that every part of that
443
+ * assertion arrived; a reader still verifies every transaction, proof and
444
+ * signature inside, and no signature proves the exporter held everything
445
+ * that exists elsewhere.
446
+ */
447
+ export function joinEvidenceExport(parts, options = {}) {
448
+ const problems = [];
449
+ const files = new Map();
450
+ const manifests = [];
451
+ const absent = [];
452
+ if (parts.length === 0)
453
+ return { complete: false, problems: ['no parts were supplied'], manifests, files, absent };
454
+ // The signer every part must carry: the expected one, else the first part's coverage signer.
455
+ const signer = options.expectedSigner ?? parts.find((p) => typeof p.signature?.signer === 'string')?.signature.signer;
456
+ const trusted = [];
457
+ for (const part of parts) {
458
+ const inspection = inspectEvidenceExportPart(part, { ...(options.expectedPassportId == null ? {} : { expectedPassportId: options.expectedPassportId }), ...(signer == null ? {} : { expectedSigner: signer }) });
459
+ problems.push(...inspection.failures);
460
+ if (inspection.coverageAuthentic === true && inspection.manifestBound && inspection.package.structureValid && inspection.package.inventoryVerified && inspection.package.signatureValid === true)
461
+ trusted.push(part);
462
+ else
463
+ problems.push(`part ${part.part?.index}: its coverage is not established, so its range, index and finality are not counted`);
464
+ }
465
+ if (trusted.length === 0)
466
+ return { complete: false, problems, manifests, files, absent };
467
+ const ordered = [...trusted].sort((a, b) => a.part.index - b.part.index);
468
+ const head = ordered[0];
469
+ const passportId = head.passportId;
470
+ const snapshotId = head.snapshot.id;
471
+ if (options.expectedPassportId != null && passportId !== options.expectedPassportId)
472
+ problems.push(`the export is about ${passportId}, not ${options.expectedPassportId}`);
473
+ let expectFrom = 1;
474
+ for (const [position, part] of ordered.entries()) {
475
+ const label = `part ${part.part.index}`;
476
+ if (part.exportVersion !== EVIDENCE_EXPORT_VERSION)
477
+ problems.push(`${label} is export version ${String(part.exportVersion)}, not ${EVIDENCE_EXPORT_VERSION}`);
478
+ if (part.passportId !== passportId)
479
+ problems.push(`${label} is about ${part.passportId}, not ${passportId}`);
480
+ if (part.snapshot.id !== snapshotId || part.snapshot.sequence !== head.snapshot.sequence || part.snapshot.source !== head.snapshot.source)
481
+ problems.push(`${label} is from snapshot ${part.snapshot.id}, not ${snapshotId}`);
482
+ if (part.part.index !== position + 1)
483
+ problems.push(position > 0 && ordered[position - 1].part.index === part.part.index ? `${label} is repeated` : `${label} arrived where part ${position + 1} was expected`);
484
+ const { from, to } = part.part.sequenceRange;
485
+ if (from < expectFrom)
486
+ problems.push(`${label} covers ${from}..${to}, overlapping the sequences already joined up to ${expectFrom - 1}`);
487
+ else if (from > expectFrom)
488
+ problems.push(`${label} covers ${from}..${to}; sequences ${expectFrom}..${from - 1} are missing`);
489
+ if (to < from)
490
+ problems.push(`${label} covers ${from}..${to}, which is not a range`);
491
+ expectFrom = Math.max(expectFrom, to + 1);
492
+ const isLast = position === ordered.length - 1;
493
+ // Finality is the signed flag; the unsigned cursor merely has to agree with it.
494
+ if (part.final !== (part.nextCursor == null))
495
+ problems.push(`${label} says final ${String(part.final)} but nextCursor is ${part.nextCursor == null ? 'null' : 'set'}`);
496
+ if (part.final && !isLast)
497
+ problems.push(`${label} is final but parts follow it`);
498
+ if (isLast && !part.final)
499
+ problems.push(`${label} is the last part received and is not final`);
500
+ if (isLast && part.final && to !== part.snapshot.sequence)
501
+ problems.push(`${label} is final and ends at ${to}, not at the snapshot's sequence ${part.snapshot.sequence}`);
502
+ const manifest = part.package.manifest;
503
+ manifests.push(manifest);
504
+ absent.push(...(Array.isArray(manifest.completeness?.absent) ? manifest.completeness.absent : []));
505
+ for (const [path, bytes] of envelopeFiles(part.package)) {
506
+ const seen = files.get(path);
507
+ if (seen == null) {
508
+ files.set(path, bytes);
509
+ continue;
510
+ }
511
+ if (sha256Hex(seen) !== sha256Hex(bytes))
512
+ problems.push(`${label}: ${path} repeats an earlier part's path with different bytes`);
513
+ }
514
+ }
515
+ return { passportId, snapshotId, complete: problems.length === 0, problems, manifests, files, absent };
516
+ }
517
+ //# sourceMappingURL=evidenceExport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidenceExport.js","sourceRoot":"","sources":["../src/evidenceExport.ts"],"names":[],"mappings":"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"}