@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.
- package/LICENSE +58 -0
- package/README.md +169 -0
- package/dist/anchorStorage.d.ts +58 -0
- package/dist/anchorStorage.d.ts.map +1 -0
- package/dist/anchorStorage.js +72 -0
- package/dist/anchorStorage.js.map +1 -0
- package/dist/attestationAnchor.d.ts +10 -0
- package/dist/attestationAnchor.d.ts.map +1 -0
- package/dist/attestationAnchor.js +10 -0
- package/dist/attestationAnchor.js.map +1 -0
- package/dist/attestationStorage.d.ts +49 -0
- package/dist/attestationStorage.d.ts.map +1 -0
- package/dist/attestationStorage.js +78 -0
- package/dist/attestationStorage.js.map +1 -0
- package/dist/capabilities.d.ts +127 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +210 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/engineStorage.d.ts +106 -0
- package/dist/engineStorage.d.ts.map +1 -0
- package/dist/engineStorage.js +253 -0
- package/dist/engineStorage.js.map +1 -0
- package/dist/evidenceExport.d.ts +189 -0
- package/dist/evidenceExport.d.ts.map +1 -0
- package/dist/evidenceExport.js +517 -0
- package/dist/evidenceExport.js.map +1 -0
- package/dist/history.d.ts +114 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +215 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +269 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1223 -0
- package/dist/index.js.map +1 -0
- package/dist/lib.d.ts +31 -0
- package/dist/lib.d.ts.map +1 -0
- package/dist/lib.js +31 -0
- package/dist/lib.js.map +1 -0
- package/dist/limits.d.ts +44 -0
- package/dist/limits.d.ts.map +1 -0
- package/dist/limits.js +44 -0
- package/dist/limits.js.map +1 -0
- package/dist/lsAttestation.d.ts +21 -0
- package/dist/lsAttestation.d.ts.map +1 -0
- package/dist/lsAttestation.js +45 -0
- package/dist/lsAttestation.js.map +1 -0
- package/dist/lsDpp.d.ts +53 -0
- package/dist/lsDpp.d.ts.map +1 -0
- package/dist/lsDpp.js +148 -0
- package/dist/lsDpp.js.map +1 -0
- package/dist/lsUoraDpp.d.ts +55 -0
- package/dist/lsUoraDpp.d.ts.map +1 -0
- package/dist/lsUoraDpp.js +152 -0
- package/dist/lsUoraDpp.js.map +1 -0
- package/dist/policyConfig.d.ts +31 -0
- package/dist/policyConfig.d.ts.map +1 -0
- package/dist/policyConfig.js +112 -0
- package/dist/policyConfig.js.map +1 -0
- package/dist/retraction.d.ts +41 -0
- package/dist/retraction.d.ts.map +1 -0
- package/dist/retraction.js +147 -0
- package/dist/retraction.js.map +1 -0
- package/dist/storage.d.ts +117 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +158 -0
- package/dist/storage.js.map +1 -0
- package/dist/sync.d.ts +75 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +118 -0
- package/dist/sync.js.map +1 -0
- package/dist/tmAttestation.d.ts +36 -0
- package/dist/tmAttestation.d.ts.map +1 -0
- package/dist/tmAttestation.js +50 -0
- package/dist/tmAttestation.js.map +1 -0
- package/dist/tmDpp.d.ts +154 -0
- package/dist/tmDpp.d.ts.map +1 -0
- package/dist/tmDpp.js +397 -0
- package/dist/tmDpp.js.map +1 -0
- package/dist/tmUoraDpp.d.ts +73 -0
- package/dist/tmUoraDpp.d.ts.map +1 -0
- package/dist/tmUoraDpp.js +150 -0
- package/dist/tmUoraDpp.js.map +1 -0
- package/dist/uoraAnchor.d.ts +209 -0
- package/dist/uoraAnchor.d.ts.map +1 -0
- package/dist/uoraAnchor.js +433 -0
- package/dist/uoraAnchor.js.map +1 -0
- 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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"}
|