@mikeargento/bitgraph-verify 1.6.0 → 1.7.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/dist/fuse-member.d.ts +14 -5
- package/dist/fuse-member.d.ts.map +1 -1
- package/dist/fuse-member.js +117 -23
- package/dist/fuse-member.js.map +1 -1
- package/dist/fuse-merkle.d.ts +42 -0
- package/dist/fuse-merkle.d.ts.map +1 -0
- package/dist/fuse-merkle.js +188 -0
- package/dist/fuse-merkle.js.map +1 -0
- package/dist/fuse.d.ts +69 -2
- package/dist/fuse.d.ts.map +1 -1
- package/dist/fuse.js +213 -6
- package/dist/fuse.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/fuse-member.ts +147 -25
- package/src/fuse-merkle.ts +177 -0
- package/src/fuse.ts +217 -6
- package/src/index.ts +3 -0
package/dist/fuse-member.d.ts
CHANGED
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
import type { BitGraphProof, VerificationPolicy } from "./types.js";
|
|
2
2
|
import { type FuseVerifyResult } from "./fuse-verify.js";
|
|
3
|
-
export type FuseMemberCategory = "SET_MEMBER_DIRECT" | "SET_MEMBER_FROM_ORIGIN" | "SET_NOT_MEMBER" | "RECONSTRUCTION_MISMATCH" | "INVALID_SET_MANIFEST" | "INVALID_SLOT_COMMITMENT" | "INVALID_ORIGIN_ATTRIBUTION" | "INVALID_UNDERLYING_PROOF" | "UNDETERMINED_PLACEMENT" | "NO_MATCH";
|
|
3
|
+
export type FuseMemberCategory = "SET_MEMBER_DIRECT" | "SET_MEMBER_FROM_ORIGIN" | "SET_NOT_MEMBER" | "SET_MEMBERSHIP_UNPROVEN" | "INVALID_SET_PATH" | "RECONSTRUCTION_MISMATCH" | "INVALID_SET_MANIFEST" | "INVALID_SLOT_COMMITMENT" | "INVALID_ORIGIN_ATTRIBUTION" | "INVALID_UNDERLYING_PROOF" | "UNDETERMINED_PLACEMENT" | "NO_MATCH";
|
|
4
4
|
export interface FuseSetEvidence {
|
|
5
|
-
/**
|
|
5
|
+
/** "set/1": the whole member list is the committed artifact. "set/2": a Merkle root over the rows is. */
|
|
6
|
+
kind: "set/1" | "set/2";
|
|
7
|
+
/** Where the committed artifact's bytes came from (the set/1 manifest or the set/2 root document): the proof's metadata, or the caller's argument. */
|
|
6
8
|
manifestSource: "metadata" | "argument";
|
|
7
|
-
/** SHA-256 of the bound
|
|
9
|
+
/** SHA-256 of the bound bytes; equals artifactDigestB64 once bound. */
|
|
8
10
|
manifestDigestB64: string;
|
|
11
|
+
/** set/1: the rows listed. set/2: the count the root document states. */
|
|
9
12
|
memberCount: number;
|
|
10
|
-
/**
|
|
13
|
+
/** set/2 only: where the member's evidence (row, index, path) came from; null when none was in hand. */
|
|
14
|
+
memberSource: "metadata" | "argument" | null;
|
|
15
|
+
/** set/2 only: the tree root, standard base64. */
|
|
16
|
+
treeRootB64: string | null;
|
|
17
|
+
/** The matched row. Non-null ONLY on the two member categories. `index` is the row's index in the list (set/1) or its leaf index in the tree (set/2). */
|
|
11
18
|
member: {
|
|
12
19
|
index: number;
|
|
13
20
|
placement: string;
|
|
@@ -18,8 +25,10 @@ export interface FuseSetEvidence {
|
|
|
18
25
|
export interface FuseMemberOptions {
|
|
19
26
|
proof: BitGraphProof;
|
|
20
27
|
bytes: Uint8Array;
|
|
21
|
-
/** Canonical set manifest
|
|
28
|
+
/** Canonical bytes of the committed artifact (a set/1 manifest, or a set/2 root document); when given they replace proof.metadata as the source and are never silently replaced by it. */
|
|
22
29
|
manifest?: Uint8Array | null;
|
|
30
|
+
/** set/2: the member's evidence (row, index, count, path) as its JSON object; when given it replaces proof.metadata[SET_MEMBER_METADATA_KEY]. */
|
|
31
|
+
member?: unknown;
|
|
23
32
|
trustAnchors?: VerificationPolicy;
|
|
24
33
|
/** Refuse to accept a span wider than this many positions (M - N). Never affects validity categories. */
|
|
25
34
|
maxPositions?: bigint | number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fuse-member.d.ts","sourceRoot":"","sources":["../src/fuse-member.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fuse-member.d.ts","sourceRoot":"","sources":["../src/fuse-member.ts"],"names":[],"mappings":"AA2CA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAuBpE,OAAO,EAAyC,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEhG,MAAM,MAAM,kBAAkB,GAC1B,mBAAmB,GACnB,wBAAwB,GACxB,gBAAgB,GAChB,yBAAyB,GACzB,kBAAkB,GAClB,yBAAyB,GACzB,sBAAsB,GACtB,yBAAyB,GACzB,4BAA4B,GAC5B,0BAA0B,GAC1B,wBAAwB,GACxB,UAAU,CAAC;AAEf,MAAM,WAAW,eAAe;IAC9B,yGAAyG;IACzG,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,sJAAsJ;IACtJ,cAAc,EAAE,UAAU,GAAG,UAAU,CAAC;IACxC,uEAAuE;IACvE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,wGAAwG;IACxG,YAAY,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI,CAAC;IAC7C,kDAAkD;IAClD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,yJAAyJ;IACzJ,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACtG;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,EAAE,UAAU,CAAC;IAClB,0LAA0L;IAC1L,QAAQ,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC7B,iJAAiJ;IACjJ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,yGAAyG;IACzG,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC;AAED,0FAA0F;AAC1F,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,GAAG;IAClE,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,iFAAiF;IACjF,GAAG,EAAE,eAAe,GAAG,IAAI,CAAC;CAC7B,CAAC;AA+MF,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAsOzF"}
|
package/dist/fuse-member.js
CHANGED
|
@@ -6,6 +6,11 @@
|
|
|
6
6
|
* canonical set manifest (placement set/1, see fuse.ts) and every member's
|
|
7
7
|
* fused bytes carry the set's commitment via the member's own placement.
|
|
8
8
|
* verifyFuse answers for the manifest; this module answers for a member.
|
|
9
|
+
* A set/2 (fuse.ts) commits the ROOT of a Merkle tree over the same rows
|
|
10
|
+
* instead of the list; its member carries its row, its leaf index and its
|
|
11
|
+
* sibling path, and binding means: root document hashed to the signed
|
|
12
|
+
* artifact and sealed to the slot, then the path reaching that root. From
|
|
13
|
+
* there the two set kinds share every step below.
|
|
9
14
|
*
|
|
10
15
|
* Given a proof whose signed attribution declares set/1 and a file:
|
|
11
16
|
* 1. Verify the proof as an ordinary bitgraph/1 proof. Fail: stop.
|
|
@@ -34,7 +39,7 @@
|
|
|
34
39
|
*/
|
|
35
40
|
import { sha256 } from "@noble/hashes/sha256";
|
|
36
41
|
import { verifyProofIntegrity } from "./verifier.js";
|
|
37
|
-
import { base64ToBytes, bytesEqual, bytesToBase64, bytesToHex, computeSlotCommitment, getPlacement, PLACEMENTS, parseSetManifest, readFuseAttribution, readSetMetadata, SET_METADATA_KEY, SET_PLACEMENT_ID, } from "./fuse.js";
|
|
42
|
+
import { base64ToBytes, bytesEqual, bytesToBase64, bytesToHex, computeSlotCommitment, getPlacement, PLACEMENTS, parseSetManifest, readFuseAttribution, parseSetMemberProof, parseSetRoot, readSetMetadata, SET_MEMBER_METADATA_KEY, SET_METADATA_KEY, SET_PLACEMENT_ID, SET2_PLACEMENT_ID, setRootFromMember, } from "./fuse.js";
|
|
38
43
|
import { floorStatement, spanOf } from "./fuse-verify.js";
|
|
39
44
|
/**
|
|
40
45
|
* The only constructor of a BoundSet. In order: strict parse, SHA-256 of the
|
|
@@ -61,7 +66,57 @@ function bindSetManifest(proof, commitment, bytes, source) {
|
|
|
61
66
|
const origin = bytesToHex(row.origin);
|
|
62
67
|
byOrigin.set(origin, [...(byOrigin.get(origin) ?? []), index]);
|
|
63
68
|
});
|
|
64
|
-
const bound = { source, digestB64: bytesToBase64(digest), commitment, rows: manifest.members, byArtifact, byOrigin };
|
|
69
|
+
const bound = { kind: "set/1", source, digestB64: bytesToBase64(digest), commitment, rows: manifest.members, count: manifest.members.length, treeIndices: null, memberSource: null, rootB64: null, byArtifact, byOrigin };
|
|
70
|
+
return bound;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* The only constructor of a set/2 BoundSet. In order: strict parse of the
|
|
74
|
+
* root document, SHA-256 of its bytes equal to the SIGNED artifact digest,
|
|
75
|
+
* commitment equal to the one recomputed from the proof's own slot record;
|
|
76
|
+
* then, when member evidence is in hand, its strict parse, its count equal
|
|
77
|
+
* to the root document's, and its leaf and path recomputing exactly the
|
|
78
|
+
* committed root. A set bound without evidence lists no row: nothing can be
|
|
79
|
+
* admitted against it, and the caller's verdict is that membership was not
|
|
80
|
+
* shown. Rows never enter a BoundSet without their path reaching the root.
|
|
81
|
+
*/
|
|
82
|
+
function bindSetRoot(proof, commitment, bytes, source, evidence) {
|
|
83
|
+
const doc = parseSetRoot(bytes);
|
|
84
|
+
if (doc === null) {
|
|
85
|
+
return { category: "INVALID_SET_MANIFEST", reason: "the set root document is not canonical bitgraph-fuse/1 set/2 bytes" };
|
|
86
|
+
}
|
|
87
|
+
const digest = sha256(bytes);
|
|
88
|
+
const artifact = base64ToBytes(proof.artifact.digestB64);
|
|
89
|
+
if (artifact === null || !bytesEqual(digest, artifact)) {
|
|
90
|
+
return { category: "INVALID_SET_MANIFEST", reason: "the set root document does not hash to the committed artifact digest" };
|
|
91
|
+
}
|
|
92
|
+
if (!bytesEqual(doc.commitment, commitment)) {
|
|
93
|
+
return { category: "INVALID_SLOT_COMMITMENT", reason: "the commitment in the committed set root document does not match the proof's slot record" };
|
|
94
|
+
}
|
|
95
|
+
const common = { kind: "set/2", source, digestB64: bytesToBase64(digest), commitment, count: doc.count, rootB64: bytesToBase64(doc.root) };
|
|
96
|
+
if (evidence === null) {
|
|
97
|
+
const empty = { ...common, rows: [], treeIndices: [], memberSource: null, byArtifact: new Map(), byOrigin: new Map() };
|
|
98
|
+
return empty;
|
|
99
|
+
}
|
|
100
|
+
const parsed = parseSetMemberProof(evidence.value);
|
|
101
|
+
if (parsed === null) {
|
|
102
|
+
return { category: "INVALID_SET_PATH", reason: "the member evidence is not a well-formed bitgraph-fuse/1 set/2 member proof" };
|
|
103
|
+
}
|
|
104
|
+
if (parsed.count !== doc.count) {
|
|
105
|
+
return { category: "INVALID_SET_PATH", reason: `the member evidence names a tree of ${parsed.count} leaves; the committed root document states ${doc.count}` };
|
|
106
|
+
}
|
|
107
|
+
const reached = setRootFromMember(parsed.member, parsed.index, parsed.count, parsed.path);
|
|
108
|
+
if (reached === null || !bytesEqual(reached, doc.root)) {
|
|
109
|
+
return { category: "INVALID_SET_PATH", reason: "the member's leaf and path do not recompute the committed root; the row is not shown to be in the set" };
|
|
110
|
+
}
|
|
111
|
+
const row = parsed.member;
|
|
112
|
+
const bound = {
|
|
113
|
+
...common,
|
|
114
|
+
rows: [row],
|
|
115
|
+
treeIndices: [parsed.index],
|
|
116
|
+
memberSource: evidence.from,
|
|
117
|
+
byArtifact: new Map([[bytesToHex(row.artifact), 0]]),
|
|
118
|
+
byOrigin: new Map([[bytesToHex(row.origin), [0]]]),
|
|
119
|
+
};
|
|
65
120
|
return bound;
|
|
66
121
|
}
|
|
67
122
|
/**
|
|
@@ -116,6 +171,15 @@ function strayReason(span, memberCount) {
|
|
|
116
171
|
const commit = span !== null ? `committed at position ${span.commitCounter}` : "at its commit";
|
|
117
172
|
return `these bytes carry the commitment of ${slot}, so they were made after that slot existed, but their digest is not among the ${memberCount} members listed in the set manifest ${commit}; the set proof does not cover them`;
|
|
118
173
|
}
|
|
174
|
+
/** set/2: the two-part reason when the floor holds but no evidence, or evidence for another member, is in hand. */
|
|
175
|
+
function unprovenReason(span, memberCount, otherMember) {
|
|
176
|
+
const slot = span !== null ? `the slot allocated at position ${span.slotCounter}` : "its slot";
|
|
177
|
+
const commit = span !== null ? `committed at position ${span.commitCounter}` : "at its commit";
|
|
178
|
+
const shown = otherMember
|
|
179
|
+
? "the member evidence in hand describes a different member, so"
|
|
180
|
+
: "no member evidence (row, index, path) is in hand, so";
|
|
181
|
+
return `these bytes carry the commitment of ${slot}, so they were made after that slot existed, but ${shown} their place among the ${memberCount} members of the set ${commit} is not shown; a set/2 proof covers a member only with its path`;
|
|
182
|
+
}
|
|
119
183
|
export async function verifyFuseMember(opts) {
|
|
120
184
|
const { proof, bytes } = opts;
|
|
121
185
|
const fileDigest = sha256(bytes);
|
|
@@ -157,11 +221,12 @@ export async function verifyFuseMember(opts) {
|
|
|
157
221
|
maxPositions: maxPositions === null ? null : maxPositions.toString(),
|
|
158
222
|
};
|
|
159
223
|
const common = { proof: { valid: true }, marker, span, policy };
|
|
160
|
-
if (marker === null || marker.placement !== SET_PLACEMENT_ID) {
|
|
161
|
-
return base("INVALID_SET_MANIFEST", common, "the proof is not marked set/1; verifyFuse answers for this proof");
|
|
224
|
+
if (marker === null || (marker.placement !== SET_PLACEMENT_ID && marker.placement !== SET2_PLACEMENT_ID)) {
|
|
225
|
+
return base("INVALID_SET_MANIFEST", common, "the proof is not marked set/1 or set/2; verifyFuse answers for this proof");
|
|
162
226
|
}
|
|
227
|
+
const setKind = marker.placement === SET2_PLACEMENT_ID ? "set/2" : "set/1";
|
|
163
228
|
if (marker.originDigest !== undefined) {
|
|
164
|
-
return base("INVALID_SET_MANIFEST", common,
|
|
229
|
+
return base("INVALID_SET_MANIFEST", common, `the proof is marked ${setKind} but its signed attribution names an origin digest; a set has no single origin`);
|
|
165
230
|
}
|
|
166
231
|
// 3. The commitment, from the proof's own slot record.
|
|
167
232
|
const slot = proof.slotAllocation;
|
|
@@ -177,21 +242,39 @@ export async function verifyFuseMember(opts) {
|
|
|
177
242
|
}
|
|
178
243
|
const slotCommitmentB64 = bytesToBase64(commitment);
|
|
179
244
|
const withSlot = { ...common, slotCommitmentB64 };
|
|
180
|
-
// 4. Bind the
|
|
181
|
-
// and
|
|
245
|
+
// 4. Bind the committed artifact: a set/1 manifest, or a set/2 root
|
|
246
|
+
// document and, when in hand, the member's evidence. An explicit
|
|
247
|
+
// argument replaces the metadata source and is never silently replaced
|
|
248
|
+
// by it.
|
|
182
249
|
const explicit = opts.manifest === undefined || opts.manifest === null ? null : opts.manifest;
|
|
183
250
|
const metadata = explicit === null ? readSetMetadata(proof) : null;
|
|
184
251
|
const source = explicit !== null ? { bytes: explicit, from: "argument" } : metadata !== null ? { bytes: metadata, from: "metadata" } : null;
|
|
185
252
|
if (source === null) {
|
|
186
|
-
return base("INVALID_SET_MANIFEST", withSlot, `no set manifest: none under proof.metadata["${SET_METADATA_KEY}"] and none supplied`);
|
|
253
|
+
return base("INVALID_SET_MANIFEST", withSlot, `no set ${setKind === "set/1" ? "manifest" : "root document"}: none under proof.metadata["${SET_METADATA_KEY}"] and none supplied`);
|
|
254
|
+
}
|
|
255
|
+
let bound;
|
|
256
|
+
if (setKind === "set/1") {
|
|
257
|
+
const b = bindSetManifest(proof, commitment, source.bytes, source.from);
|
|
258
|
+
if ("category" in b)
|
|
259
|
+
return base(b.category, withSlot, b.reason);
|
|
260
|
+
bound = b;
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
const explicitMember = opts.member === undefined || opts.member === null ? null : opts.member;
|
|
264
|
+
const metadataMember = explicitMember === null ? (proof.metadata?.[SET_MEMBER_METADATA_KEY] ?? null) : null;
|
|
265
|
+
const evidenceSource = explicitMember !== null ? { value: explicitMember, from: "argument" } : metadataMember !== null ? { value: metadataMember, from: "metadata" } : null;
|
|
266
|
+
const b = bindSetRoot(proof, commitment, source.bytes, source.from, evidenceSource);
|
|
267
|
+
if ("category" in b)
|
|
268
|
+
return base(b.category, withSlot, b.reason);
|
|
269
|
+
bound = b;
|
|
187
270
|
}
|
|
188
|
-
const bound = bindSetManifest(proof, commitment, source.bytes, source.from);
|
|
189
|
-
if ("category" in bound)
|
|
190
|
-
return base(bound.category, withSlot, bound.reason);
|
|
191
271
|
const evidence = (member) => ({
|
|
272
|
+
kind: bound.kind,
|
|
192
273
|
manifestSource: bound.source,
|
|
193
274
|
manifestDigestB64: bound.digestB64,
|
|
194
|
-
memberCount: bound.
|
|
275
|
+
memberCount: bound.count,
|
|
276
|
+
memberSource: bound.memberSource,
|
|
277
|
+
treeRootB64: bound.rootB64,
|
|
195
278
|
member,
|
|
196
279
|
});
|
|
197
280
|
const withSet = { ...withSlot, set: evidence(null) };
|
|
@@ -206,18 +289,23 @@ export async function verifyFuseMember(opts) {
|
|
|
206
289
|
if (bound.byArtifact.get(bytesToHex(row.artifact)) !== index || bound.rows[index] !== row) {
|
|
207
290
|
throw new Error("verifyFuseMember: membership re-assertion failed");
|
|
208
291
|
}
|
|
209
|
-
const count = bound.
|
|
292
|
+
const count = bound.count;
|
|
293
|
+
// set/1: a row's index is its place in the list. set/2: its leaf index in the tree, carried by the bound evidence.
|
|
294
|
+
const shown = bound.treeIndices !== null ? bound.treeIndices[index] : index;
|
|
295
|
+
const listed = bound.kind === "set/1" ? "listed in the set manifest committed" : "of the set whose Merkle root was committed";
|
|
210
296
|
const statements = [];
|
|
211
297
|
if (span !== null) {
|
|
212
298
|
if (path === "direct") {
|
|
213
|
-
statements.push(`These exact fused bytes are member ${
|
|
299
|
+
statements.push(`These exact fused bytes are member ${shown + 1} of ${count} ${listed} at position ${span.commitCounter}.`);
|
|
214
300
|
if (admitted.originCompared) {
|
|
215
|
-
statements.push(
|
|
301
|
+
statements.push(`The fused bytes carry an origin digest that matches the set ${bound.kind === "set/1" ? "manifest" : "member evidence"}; the original itself was not supplied and was not checked.`);
|
|
216
302
|
}
|
|
217
303
|
}
|
|
218
304
|
else {
|
|
219
|
-
statements.push(`The supplied original rebuilds member ${
|
|
305
|
+
statements.push(`The supplied original rebuilds member ${shown + 1} of ${count} of the committed set byte for byte, so these exact original bytes existed no later than commit position ${span.commitCounter}.`);
|
|
220
306
|
}
|
|
307
|
+
if (bound.kind === "set/2")
|
|
308
|
+
statements.push(`The member's leaf and its ${bound.treeIndices !== null ? "path" : "path"} recompute the committed root, so the row is one of the ${count} the set commits to.`);
|
|
221
309
|
statements.push(floorStatement(span));
|
|
222
310
|
}
|
|
223
311
|
return {
|
|
@@ -233,12 +321,12 @@ export async function verifyFuseMember(opts) {
|
|
|
233
321
|
policy,
|
|
234
322
|
statements,
|
|
235
323
|
reason: null,
|
|
236
|
-
set: evidence({ index, placement: placement.id, fusedDigestB64: bytesToBase64(row.artifact), originDigestB64: bytesToBase64(row.origin) }),
|
|
324
|
+
set: evidence({ index: shown, placement: placement.id, fusedDigestB64: bytesToBase64(row.artifact), originDigestB64: bytesToBase64(row.origin) }),
|
|
237
325
|
};
|
|
238
326
|
};
|
|
239
|
-
// 5. The bytes are the committed
|
|
327
|
+
// 5. The bytes are the committed artifact itself: verifyFuse answers for it.
|
|
240
328
|
if (fileDigestB64 === artifactDigestB64) {
|
|
241
|
-
return base("NO_MATCH", withSet,
|
|
329
|
+
return base("NO_MATCH", withSet, `these bytes are the committed set ${bound.kind === "set/1" ? "manifest" : "root document"} itself, not a member; verifyFuse answers for it`);
|
|
242
330
|
}
|
|
243
331
|
// 6. Direct path: the bytes hash to a listed member. Authoritative when it
|
|
244
332
|
// applies: its failure is the verdict, with no fall-through.
|
|
@@ -289,15 +377,21 @@ export async function verifyFuseMember(opts) {
|
|
|
289
377
|
}
|
|
290
378
|
return base("RECONSTRUCTION_MISMATCH", { ...withSet, placement: candidates[0] ?? null, originDigestB64: fileDigestB64 }, `rebuilding ${candidates.join(" or ")} from this file and the proof's slot record does not reproduce the listed member digest`);
|
|
291
379
|
}
|
|
292
|
-
// 8. Stray scan: bytes that carry this slot's commitment yet
|
|
293
|
-
//
|
|
294
|
-
//
|
|
380
|
+
// 8. Stray scan: bytes that carry this slot's commitment yet match no row
|
|
381
|
+
// in hand. set/1 lists every row, so this is the two-part verdict: made
|
|
382
|
+
// after the slot, not part of the committed set. set/2 has in hand at
|
|
383
|
+
// most the one row its evidence proved, so absence is not shown: the
|
|
384
|
+
// floor holds, membership is unproven (no evidence) or the evidence is
|
|
385
|
+
// another member's. No rendered floor in either case.
|
|
295
386
|
for (const p of PLACEMENTS) {
|
|
296
387
|
const l = p.locate(bytes);
|
|
297
388
|
if (l === null)
|
|
298
389
|
continue;
|
|
299
390
|
if (bytesEqual(l.commitment, commitment)) {
|
|
300
|
-
|
|
391
|
+
if (bound.kind === "set/1")
|
|
392
|
+
return base("SET_NOT_MEMBER", { ...withSet, placement: p.id, statements: [] }, strayReason(span, bound.count));
|
|
393
|
+
const other = bound.rows.length > 0;
|
|
394
|
+
return base(other ? "INVALID_SET_PATH" : "SET_MEMBERSHIP_UNPROVEN", { ...withSet, placement: p.id, statements: [] }, unprovenReason(span, bound.count, other));
|
|
301
395
|
}
|
|
302
396
|
return base("NO_MATCH", withSet, "these bytes carry a commitment to a different slot; the proof proves nothing about them");
|
|
303
397
|
}
|
package/dist/fuse-member.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fuse-member.js","sourceRoot":"","sources":["../src/fuse-member.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fuse-member.js","sourceRoot":"","sources":["../src/fuse-member.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** SHA-256(0x00 || bytes): the hash of one leaf. */
|
|
2
|
+
export declare function merkleLeafHash(bytes: Uint8Array): Uint8Array;
|
|
3
|
+
/** SHA-256(0x01 || left || right): one inner node. */
|
|
4
|
+
export declare function merkleNodeHash(left: Uint8Array, right: Uint8Array): Uint8Array;
|
|
5
|
+
/**
|
|
6
|
+
* The root over leaf HASHES (each already merkleLeafHash of its leaf), in
|
|
7
|
+
* list order. Throws on an empty list; the root of one leaf hash is that
|
|
8
|
+
* hash itself, as in RFC 6962.
|
|
9
|
+
*/
|
|
10
|
+
export declare function merkleRoot(leafHashes: readonly Uint8Array[]): Uint8Array;
|
|
11
|
+
/**
|
|
12
|
+
* The inclusion path of the leaf at `index`: its siblings from the leaf's
|
|
13
|
+
* own level up to the root, in that order (RFC 6962 PATH). Empty for a tree
|
|
14
|
+
* of one leaf.
|
|
15
|
+
*/
|
|
16
|
+
export declare function merklePath(leafHashes: readonly Uint8Array[], index: number): Uint8Array[];
|
|
17
|
+
/**
|
|
18
|
+
* Recompute the root from one leaf hash, its index, the tree size and its
|
|
19
|
+
* path (RFC 9162 section 2.1.3.2). Null when the path does not fit the
|
|
20
|
+
* index and size: too short, too long, or an index outside the tree. A
|
|
21
|
+
* result that equals the committed root proves the leaf is at `index` in a
|
|
22
|
+
* tree of `size` leaves with that root; nothing else is proven.
|
|
23
|
+
*/
|
|
24
|
+
export declare function merkleRootFromPath(leafHash: Uint8Array, index: number, size: number, path: readonly Uint8Array[]): Uint8Array | null;
|
|
25
|
+
/**
|
|
26
|
+
* The whole tree over a list of leaf hashes, every subtree root computed
|
|
27
|
+
* once, so the paths of all N leaves cost N log N hashes in total instead of
|
|
28
|
+
* N per path. The split rule and the path order are merkleRoot's and
|
|
29
|
+
* merklePath's exactly; a test pins them equal.
|
|
30
|
+
*/
|
|
31
|
+
export declare class MerkleTree {
|
|
32
|
+
readonly size: number;
|
|
33
|
+
readonly root: Uint8Array;
|
|
34
|
+
private readonly leafHashes;
|
|
35
|
+
/** Subtree root by "lo:hi". */
|
|
36
|
+
private readonly memo;
|
|
37
|
+
constructor(leafHashes: readonly Uint8Array[]);
|
|
38
|
+
private subtree;
|
|
39
|
+
/** The inclusion path of the leaf at `index`, siblings from the leaf's level up. */
|
|
40
|
+
path(index: number): Uint8Array[];
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=fuse-merkle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fuse-merkle.d.ts","sourceRoot":"","sources":["../src/fuse-merkle.ts"],"names":[],"mappings":"AA6BA,oDAAoD;AACpD,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAE5D;AAED,sDAAsD;AACtD,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,UAAU,CAE9E;AASD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,SAAS,UAAU,EAAE,GAAG,UAAU,CAUxE;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,SAAS,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,CAoBzF;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,UAAU,EAAE,GAAG,UAAU,GAAG,IAAI,CAyBpI;AAED;;;;;GAKG;AACH,qBAAa,UAAU;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwB;IACnD,+BAA+B;IAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiC;gBAE1C,UAAU,EAAE,SAAS,UAAU,EAAE;IAQ7C,OAAO,CAAC,OAAO;IAYf,oFAAoF;IACpF,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE;CAkBlC"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Mike Argento. Licensed under the MIT License. See LICENSE.
|
|
2
|
+
/**
|
|
3
|
+
* The Merkle tree a set/2 commits to: RFC 6962 (Certificate Transparency)
|
|
4
|
+
* hashing over an ordered list of leaf hashes, with the RFC 9162 inclusion
|
|
5
|
+
* proof. Domain separation is the RFC's: a leaf hash is SHA-256 of 0x00 and
|
|
6
|
+
* the leaf's bytes, an inner node SHA-256 of 0x01, left, right. A list of
|
|
7
|
+
* n leaves splits at k, the largest power of two below n, so every list has
|
|
8
|
+
* exactly one root and every leaf exactly one inclusion path of at most
|
|
9
|
+
* ceil(log2 n) siblings. Nothing here knows what a leaf is; fuse.ts says.
|
|
10
|
+
*/
|
|
11
|
+
import { sha256 } from "@noble/hashes/sha256";
|
|
12
|
+
const LEAF_PREFIX = new Uint8Array([0x00]);
|
|
13
|
+
const NODE_PREFIX = new Uint8Array([0x01]);
|
|
14
|
+
function concat(...parts) {
|
|
15
|
+
let n = 0;
|
|
16
|
+
for (const p of parts)
|
|
17
|
+
n += p.length;
|
|
18
|
+
const out = new Uint8Array(n);
|
|
19
|
+
let o = 0;
|
|
20
|
+
for (const p of parts) {
|
|
21
|
+
out.set(p, o);
|
|
22
|
+
o += p.length;
|
|
23
|
+
}
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
26
|
+
/** SHA-256(0x00 || bytes): the hash of one leaf. */
|
|
27
|
+
export function merkleLeafHash(bytes) {
|
|
28
|
+
return sha256(concat(LEAF_PREFIX, bytes));
|
|
29
|
+
}
|
|
30
|
+
/** SHA-256(0x01 || left || right): one inner node. */
|
|
31
|
+
export function merkleNodeHash(left, right) {
|
|
32
|
+
return sha256(concat(NODE_PREFIX, left, right));
|
|
33
|
+
}
|
|
34
|
+
/** The largest power of two strictly below n (n >= 2). */
|
|
35
|
+
function split(n) {
|
|
36
|
+
let k = 1;
|
|
37
|
+
while (k * 2 < n)
|
|
38
|
+
k *= 2;
|
|
39
|
+
return k;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The root over leaf HASHES (each already merkleLeafHash of its leaf), in
|
|
43
|
+
* list order. Throws on an empty list; the root of one leaf hash is that
|
|
44
|
+
* hash itself, as in RFC 6962.
|
|
45
|
+
*/
|
|
46
|
+
export function merkleRoot(leafHashes) {
|
|
47
|
+
if (leafHashes.length === 0)
|
|
48
|
+
throw new TypeError("a Merkle tree needs at least one leaf");
|
|
49
|
+
for (const h of leafHashes)
|
|
50
|
+
if (h.length !== 32)
|
|
51
|
+
throw new TypeError("a leaf hash is 32 bytes");
|
|
52
|
+
const build = (lo, hi) => {
|
|
53
|
+
const n = hi - lo;
|
|
54
|
+
if (n === 1)
|
|
55
|
+
return leafHashes[lo];
|
|
56
|
+
const k = split(n);
|
|
57
|
+
return merkleNodeHash(build(lo, lo + k), build(lo + k, hi));
|
|
58
|
+
};
|
|
59
|
+
return build(0, leafHashes.length);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* The inclusion path of the leaf at `index`: its siblings from the leaf's
|
|
63
|
+
* own level up to the root, in that order (RFC 6962 PATH). Empty for a tree
|
|
64
|
+
* of one leaf.
|
|
65
|
+
*/
|
|
66
|
+
export function merklePath(leafHashes, index) {
|
|
67
|
+
const n = leafHashes.length;
|
|
68
|
+
if (n === 0)
|
|
69
|
+
throw new TypeError("a Merkle tree needs at least one leaf");
|
|
70
|
+
if (!Number.isInteger(index) || index < 0 || index >= n)
|
|
71
|
+
throw new RangeError("leaf index out of range");
|
|
72
|
+
const path = [];
|
|
73
|
+
const walk = (lo, hi, m) => {
|
|
74
|
+
const size = hi - lo;
|
|
75
|
+
if (size === 1)
|
|
76
|
+
return;
|
|
77
|
+
const k = split(size);
|
|
78
|
+
const build = (a, b) => merkleRoot(leafHashes.slice(a, b));
|
|
79
|
+
if (m < lo + k) {
|
|
80
|
+
walk(lo, lo + k, m);
|
|
81
|
+
path.push(build(lo + k, hi));
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
walk(lo + k, hi, m);
|
|
85
|
+
path.push(build(lo, lo + k));
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
walk(0, n, index);
|
|
89
|
+
return path;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Recompute the root from one leaf hash, its index, the tree size and its
|
|
93
|
+
* path (RFC 9162 section 2.1.3.2). Null when the path does not fit the
|
|
94
|
+
* index and size: too short, too long, or an index outside the tree. A
|
|
95
|
+
* result that equals the committed root proves the leaf is at `index` in a
|
|
96
|
+
* tree of `size` leaves with that root; nothing else is proven.
|
|
97
|
+
*/
|
|
98
|
+
export function merkleRootFromPath(leafHash, index, size, path) {
|
|
99
|
+
if (!Number.isInteger(index) || !Number.isInteger(size) || size < 1 || index < 0 || index >= size)
|
|
100
|
+
return null;
|
|
101
|
+
if (leafHash.length !== 32)
|
|
102
|
+
return null;
|
|
103
|
+
let fn = index;
|
|
104
|
+
let sn = size - 1;
|
|
105
|
+
let r = leafHash;
|
|
106
|
+
for (const p of path) {
|
|
107
|
+
if (p.length !== 32)
|
|
108
|
+
return null;
|
|
109
|
+
if (sn === 0)
|
|
110
|
+
return null;
|
|
111
|
+
if ((fn & 1) === 1 || fn === sn) {
|
|
112
|
+
r = merkleNodeHash(p, r);
|
|
113
|
+
if ((fn & 1) === 0) {
|
|
114
|
+
while ((fn & 1) === 0 && fn !== 0) {
|
|
115
|
+
fn >>>= 1;
|
|
116
|
+
sn >>>= 1;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
r = merkleNodeHash(r, p);
|
|
122
|
+
}
|
|
123
|
+
fn >>>= 1;
|
|
124
|
+
sn >>>= 1;
|
|
125
|
+
}
|
|
126
|
+
if (sn !== 0)
|
|
127
|
+
return null;
|
|
128
|
+
return r;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* The whole tree over a list of leaf hashes, every subtree root computed
|
|
132
|
+
* once, so the paths of all N leaves cost N log N hashes in total instead of
|
|
133
|
+
* N per path. The split rule and the path order are merkleRoot's and
|
|
134
|
+
* merklePath's exactly; a test pins them equal.
|
|
135
|
+
*/
|
|
136
|
+
export class MerkleTree {
|
|
137
|
+
size;
|
|
138
|
+
root;
|
|
139
|
+
leafHashes;
|
|
140
|
+
/** Subtree root by "lo:hi". */
|
|
141
|
+
memo = new Map();
|
|
142
|
+
constructor(leafHashes) {
|
|
143
|
+
if (leafHashes.length === 0)
|
|
144
|
+
throw new TypeError("a Merkle tree needs at least one leaf");
|
|
145
|
+
for (const h of leafHashes)
|
|
146
|
+
if (h.length !== 32)
|
|
147
|
+
throw new TypeError("a leaf hash is 32 bytes");
|
|
148
|
+
this.leafHashes = leafHashes;
|
|
149
|
+
this.size = leafHashes.length;
|
|
150
|
+
this.root = this.subtree(0, this.size);
|
|
151
|
+
}
|
|
152
|
+
subtree(lo, hi) {
|
|
153
|
+
const n = hi - lo;
|
|
154
|
+
if (n === 1)
|
|
155
|
+
return this.leafHashes[lo];
|
|
156
|
+
const key = `${lo}:${hi}`;
|
|
157
|
+
const known = this.memo.get(key);
|
|
158
|
+
if (known !== undefined)
|
|
159
|
+
return known;
|
|
160
|
+
const k = split(n);
|
|
161
|
+
const h = merkleNodeHash(this.subtree(lo, lo + k), this.subtree(lo + k, hi));
|
|
162
|
+
this.memo.set(key, h);
|
|
163
|
+
return h;
|
|
164
|
+
}
|
|
165
|
+
/** The inclusion path of the leaf at `index`, siblings from the leaf's level up. */
|
|
166
|
+
path(index) {
|
|
167
|
+
if (!Number.isInteger(index) || index < 0 || index >= this.size)
|
|
168
|
+
throw new RangeError("leaf index out of range");
|
|
169
|
+
const out = [];
|
|
170
|
+
const walk = (lo, hi) => {
|
|
171
|
+
const n = hi - lo;
|
|
172
|
+
if (n === 1)
|
|
173
|
+
return;
|
|
174
|
+
const k = split(n);
|
|
175
|
+
if (index < lo + k) {
|
|
176
|
+
walk(lo, lo + k);
|
|
177
|
+
out.push(this.subtree(lo + k, hi));
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
walk(lo + k, hi);
|
|
181
|
+
out.push(this.subtree(lo, lo + k));
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
walk(0, this.size);
|
|
185
|
+
return out;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=fuse-merkle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fuse-merkle.js","sourceRoot":"","sources":["../src/fuse-merkle.ts"],"names":[],"mappings":"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"}
|