@secondlayer/verify 0.4.0 → 0.5.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/README.md +1 -1
- package/dist/index.d.ts +36 -1
- package/dist/index.js +137 -1
- package/dist/index.js.map +5 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @secondlayer/verify
|
|
2
2
|
|
|
3
|
-
Check a Stacks block yourself instead of trusting the API or node that served it.
|
|
3
|
+
Check a Stacks block yourself instead of trusting the API or node that served it. Trust, and verify.
|
|
4
4
|
|
|
5
5
|
`verifyBlock` walks one chain of links, from a checkpoint shipped in this package to the block's state:
|
|
6
6
|
|
package/dist/index.d.ts
CHANGED
|
@@ -599,6 +599,11 @@ interface VerifyOptions {
|
|
|
599
599
|
* `/v1/proofs`) is always on when the source has them.
|
|
600
600
|
*/
|
|
601
601
|
rows?: boolean;
|
|
602
|
+
/**
|
|
603
|
+
* Called once per link as it passes, in the order the verifier proves them.
|
|
604
|
+
* Failures arrive in the result, not here.
|
|
605
|
+
*/
|
|
606
|
+
onStep?: (step: VerifyStep) => void;
|
|
602
607
|
}
|
|
603
608
|
/**
|
|
604
609
|
* Verifies blocks from one checkpoint against one source, caching the Bitcoin
|
|
@@ -608,6 +613,7 @@ declare class BlockVerifier {
|
|
|
608
613
|
private readonly source;
|
|
609
614
|
private readonly checkpoint;
|
|
610
615
|
private readonly rows;
|
|
616
|
+
private readonly onStep?;
|
|
611
617
|
private readonly chain;
|
|
612
618
|
/** Proven signer sets by cycle. */
|
|
613
619
|
private readonly sets;
|
|
@@ -627,6 +633,8 @@ declare class BlockVerifier {
|
|
|
627
633
|
constructor(opts: VerifyOptions);
|
|
628
634
|
/** Verify one block by id (hex) or height. Never throws for bad source data. */
|
|
629
635
|
verify(ref: string | number): Promise<BlockVerification>;
|
|
636
|
+
/** Report a passed link. A throwing callback must not break verification. */
|
|
637
|
+
private passed;
|
|
630
638
|
private run;
|
|
631
639
|
/** At or above the checkpoint: Bitcoin, burn binding, signer set, signatures, state. */
|
|
632
640
|
private runForward;
|
|
@@ -727,4 +735,31 @@ declare class BlockVerifier {
|
|
|
727
735
|
}
|
|
728
736
|
/** One-shot: verify a block from a checkpoint (MAINNET_CHECKPOINT by default). */
|
|
729
737
|
declare const verifyBlock: (ref: string | number, opts: VerifyOptions) => Promise<BlockVerification>;
|
|
730
|
-
|
|
738
|
+
type LinkStatus = "ok" | "failed" | "skipped";
|
|
739
|
+
interface LinkLine {
|
|
740
|
+
step: VerifyStep;
|
|
741
|
+
label: string;
|
|
742
|
+
status: LinkStatus;
|
|
743
|
+
/** What the link proved, why it failed, or why it was not checked. */
|
|
744
|
+
detail: string;
|
|
745
|
+
}
|
|
746
|
+
/** The chain of links, in the order verifyBlock walks them. */
|
|
747
|
+
declare const LINKS: readonly {
|
|
748
|
+
step: VerifyStep
|
|
749
|
+
label: string
|
|
750
|
+
}[];
|
|
751
|
+
/**
|
|
752
|
+
* One line per link, then the verdict: the human view of a verification,
|
|
753
|
+
* shared by the CLI and the browser checker. Ancestry appears only below the
|
|
754
|
+
* checkpoint. `rows` says whether the caller asked for the rows link.
|
|
755
|
+
*/
|
|
756
|
+
declare function describeLinks(r: BlockVerification, cp: VerifyCheckpoint, opts?: {
|
|
757
|
+
rows?: boolean
|
|
758
|
+
}): {
|
|
759
|
+
lines: LinkLine[]
|
|
760
|
+
verdict: {
|
|
761
|
+
ok: boolean
|
|
762
|
+
text: string
|
|
763
|
+
}
|
|
764
|
+
};
|
|
765
|
+
export { Ancestry, BlockDiff, BlockDiffInput, BlockStateInput, BlockStateResult, BlockTransaction, BlockVerification, BlockVerifier, BurnPreimage, Bytes, Checkpoint, ClassifiedLeaf, DEFAULT_API_URL, DiffLeaf, DiffWrite, Epoch2Header, Epoch2HeaderResponse, HeaderChain, HeaderRule, HeaderValidationError, LINKS, LinkLine, LinkStatus, MAINNET_CHECKPOINT, MAINNET_FIRST_BURN_HEIGHT, MAINNET_PREPARE_LENGTH, MAINNET_REWARD_CYCLE_LENGTH, MarfProofInput, MarfProofResponse, NakamotoHeader, NodeRpcProofSource, NodeRpcSourceOptions, ProofSource, ProvenDiff, SIGNERS_CONTRACT, SecondlayerProofSource, SecondlayerSourceOptions, SignerCheck, SignerSet, SourceError, StacksHeader, StateFailure, StateFailureCode, StateWitness, StateWrite, TransactionsError, VerifyCheckpoint, VerifyFailure, VerifyFailureCode, VerifyOptions, VerifyStep, VmEventRow, WitnessLeaf, blockId2 as blockId, blockTransactions, classifyBlockDiff, cycleStart, dataVarKey, decodeSignerSet, describeLinks, ftBalanceKey, hex, isEpoch2Header, mapEntryKey, marfPath, marfProofAncestors, marfValue, parseEpoch2Header, parseNakamotoHeader, parseWitness, rewardCycle, signerSignatureHash, txMerkleRoot2 as txMerkleRoot, unhex, verifyBlock, verifyBlockState, verifyConsensusPreimage, verifyMarfProof, verifySignerSignatures };
|
package/dist/index.js
CHANGED
|
@@ -1394,6 +1394,117 @@ function blockTransactions(raw, header) {
|
|
|
1394
1394
|
throw new TransactionsError("tx-root-mismatch", `transactions hash to ${hex(root)}, header tx_merkle_root is ${hex(header.txMerkleRoot)}`);
|
|
1395
1395
|
return txs.map((t, i) => ({ txid: hex(ids[i]), raw: t }));
|
|
1396
1396
|
}
|
|
1397
|
+
// src/links.ts
|
|
1398
|
+
var LINKS = [
|
|
1399
|
+
{ step: "ancestry", label: "ancestry" },
|
|
1400
|
+
{ step: "block", label: "block" },
|
|
1401
|
+
{ step: "bitcoin", label: "bitcoin" },
|
|
1402
|
+
{ step: "burn", label: "burn" },
|
|
1403
|
+
{ step: "signer-set", label: "cycle" },
|
|
1404
|
+
{ step: "signatures", label: "signatures" },
|
|
1405
|
+
{ step: "txs", label: "txs" },
|
|
1406
|
+
{ step: "witness", label: "state root" },
|
|
1407
|
+
{ step: "names", label: "diff" },
|
|
1408
|
+
{ step: "rows", label: "rows" }
|
|
1409
|
+
];
|
|
1410
|
+
var n = (v) => v.toLocaleString("en-US");
|
|
1411
|
+
function linkDetail(step, r, cp) {
|
|
1412
|
+
switch (step) {
|
|
1413
|
+
case "ancestry": {
|
|
1414
|
+
const a = r.ancestry;
|
|
1415
|
+
if (!a)
|
|
1416
|
+
return "";
|
|
1417
|
+
const checkpoint = parseNakamotoHeader(unhex(cp.stacks.header));
|
|
1418
|
+
const start = a.fromHeight === Number(checkpoint.chainLength) ? `the checkpoint ${n(a.fromHeight)}` : `block ${n(a.fromHeight)}`;
|
|
1419
|
+
return a.via === "marf" ? `${n(r.height ?? 0)} proven in the state of ${start} (one MARF proof)` : `${n(r.height ?? 0)} reached from ${start} by parent links`;
|
|
1420
|
+
}
|
|
1421
|
+
case "block":
|
|
1422
|
+
return `${n(r.height ?? 0)} ${r.blockId}`;
|
|
1423
|
+
case "bitcoin":
|
|
1424
|
+
return `headers ${n(cp.bitcoin.height)}..${n(r.burnHeight ?? 0)}, proof-of-work and retargets checked`;
|
|
1425
|
+
case "burn":
|
|
1426
|
+
return `height ${n(r.burnHeight ?? 0)} ${r.bitcoinBlockHash}`;
|
|
1427
|
+
case "signer-set":
|
|
1428
|
+
return r.cycle === cp.stacks.cycle ? `${r.cycle}, the checkpoint's own signer set` : `${r.cycle}, signer set proven forward from checkpoint cycle ${cp.stacks.cycle}`;
|
|
1429
|
+
case "signatures":
|
|
1430
|
+
return `${n(r.signerWeight ?? 0n)} / ${n(r.totalWeight ?? 0n)} weight signed, threshold ${n(r.threshold ?? 0n)}`;
|
|
1431
|
+
case "txs":
|
|
1432
|
+
return `${n(r.transactions?.length ?? 0)} transactions match the tx merkle root`;
|
|
1433
|
+
case "witness":
|
|
1434
|
+
return `${r.stateRoot} matches the witness`;
|
|
1435
|
+
case "names": {
|
|
1436
|
+
const d = r.diff;
|
|
1437
|
+
if (!d)
|
|
1438
|
+
return "";
|
|
1439
|
+
const named = d.writes.filter((w) => w.named).length;
|
|
1440
|
+
const written = named ? `${d.writes.length} written (${named} named, ${d.writes.length - named} unnamed)` : `${d.writes.length} written (unnamed)`;
|
|
1441
|
+
return `${written}, ${d.carried.length} carried, ${d.internal.length} internal`;
|
|
1442
|
+
}
|
|
1443
|
+
case "rows":
|
|
1444
|
+
return `${n(r.rowsChecked ?? 0)} vm_events rows match the diff`;
|
|
1445
|
+
}
|
|
1446
|
+
}
|
|
1447
|
+
function notNeeded(step, r) {
|
|
1448
|
+
if (!r.ancestry)
|
|
1449
|
+
return false;
|
|
1450
|
+
if (step === "bitcoin" || step === "burn")
|
|
1451
|
+
return r.burnHeight === undefined;
|
|
1452
|
+
return step === "signer-set" || step === "signatures";
|
|
1453
|
+
}
|
|
1454
|
+
function describeLinks(r, cp, opts = {}) {
|
|
1455
|
+
const first = r.failures[0];
|
|
1456
|
+
const broken = first ? LINKS.findIndex((l) => l.step === first.step) : LINKS.length;
|
|
1457
|
+
const lines = [];
|
|
1458
|
+
for (const [i, link] of LINKS.entries()) {
|
|
1459
|
+
const { step, label } = link;
|
|
1460
|
+
const failure = r.failures.find((f) => f.step === step);
|
|
1461
|
+
if (step === "ancestry" && !failure && !r.ancestry)
|
|
1462
|
+
continue;
|
|
1463
|
+
const skipped = (detail) => ({
|
|
1464
|
+
step,
|
|
1465
|
+
label,
|
|
1466
|
+
status: "skipped",
|
|
1467
|
+
detail
|
|
1468
|
+
});
|
|
1469
|
+
if (failure)
|
|
1470
|
+
lines.push({ step, label, status: "failed", detail: failure.message });
|
|
1471
|
+
else if (step === "rows" && !opts.rows)
|
|
1472
|
+
lines.push(skipped("not checked (pass --rows)"));
|
|
1473
|
+
else if (i > broken)
|
|
1474
|
+
lines.push(skipped("not checked: an earlier link is broken"));
|
|
1475
|
+
else if (notNeeded(step, r))
|
|
1476
|
+
lines.push(skipped("not needed: the block is hash-chained to the checkpoint"));
|
|
1477
|
+
else if (step === "rows" && r.rowsChecked === undefined)
|
|
1478
|
+
lines.push(skipped("not checked: the source serves no indexed rows"));
|
|
1479
|
+
else if (step === "txs" && r.transactions === undefined)
|
|
1480
|
+
lines.push(skipped("not checked: no transaction bytes (epoch 2.x, or the source served the header only)"));
|
|
1481
|
+
else
|
|
1482
|
+
lines.push({
|
|
1483
|
+
step,
|
|
1484
|
+
label,
|
|
1485
|
+
status: "ok",
|
|
1486
|
+
detail: linkDetail(step, r, cp)
|
|
1487
|
+
});
|
|
1488
|
+
}
|
|
1489
|
+
if (!first) {
|
|
1490
|
+
const from = n(parseNakamotoHeader(unhex(cp.stacks.header)).chainLength);
|
|
1491
|
+
return {
|
|
1492
|
+
lines,
|
|
1493
|
+
verdict: {
|
|
1494
|
+
ok: true,
|
|
1495
|
+
text: `Block ${n(r.height ?? 0)} is proven. Trusted: only the checkpoint (Stacks ${from}, Bitcoin ${n(cp.bitcoin.height)}).`
|
|
1496
|
+
}
|
|
1497
|
+
};
|
|
1498
|
+
}
|
|
1499
|
+
const label = LINKS[broken]?.label ?? first.step;
|
|
1500
|
+
return {
|
|
1501
|
+
lines,
|
|
1502
|
+
verdict: {
|
|
1503
|
+
ok: false,
|
|
1504
|
+
text: first.code === "unavailable" ? `Could not check the ${label} link: the source could not serve it.` : `Not proven: the ${label} link is broken.`
|
|
1505
|
+
}
|
|
1506
|
+
};
|
|
1507
|
+
}
|
|
1397
1508
|
// src/verify-block.ts
|
|
1398
1509
|
import { uintCV } from "@secondlayer/stacks/clarity";
|
|
1399
1510
|
class Broken extends Error {
|
|
@@ -1452,6 +1563,7 @@ class BlockVerifier {
|
|
|
1452
1563
|
source;
|
|
1453
1564
|
checkpoint;
|
|
1454
1565
|
rows;
|
|
1566
|
+
onStep;
|
|
1455
1567
|
chain;
|
|
1456
1568
|
sets = new Map;
|
|
1457
1569
|
anchors = new Map;
|
|
@@ -1465,6 +1577,7 @@ class BlockVerifier {
|
|
|
1465
1577
|
this.source = opts.source;
|
|
1466
1578
|
this.checkpoint = opts.checkpoint ?? MAINNET_CHECKPOINT;
|
|
1467
1579
|
this.rows = opts.rows ?? false;
|
|
1580
|
+
this.onStep = opts.onStep;
|
|
1468
1581
|
const { stacks } = this.checkpoint;
|
|
1469
1582
|
const header = parseNakamotoHeader(unhex(stacks.header));
|
|
1470
1583
|
this.start = { header, id: hex(blockId(header)) };
|
|
@@ -1484,6 +1597,11 @@ class BlockVerifier {
|
|
|
1484
1597
|
out.ok = out.failures.length === 0;
|
|
1485
1598
|
return out;
|
|
1486
1599
|
}
|
|
1600
|
+
passed(step) {
|
|
1601
|
+
try {
|
|
1602
|
+
this.onStep?.(step);
|
|
1603
|
+
} catch {}
|
|
1604
|
+
}
|
|
1487
1605
|
async run(ref, out) {
|
|
1488
1606
|
const start = Number(this.start.header.chainLength);
|
|
1489
1607
|
if (typeof ref === "number" && ref < start)
|
|
@@ -1521,21 +1639,26 @@ class BlockVerifier {
|
|
|
1521
1639
|
out.height = height;
|
|
1522
1640
|
out.blockId = id;
|
|
1523
1641
|
describeHeader(header, out);
|
|
1642
|
+
this.passed("block");
|
|
1524
1643
|
const burn = await this.bindBurn(header, "burn");
|
|
1525
1644
|
const cycle = rewardCycle(burn.burnHeight);
|
|
1526
1645
|
out.burnHeight = burn.burnHeight;
|
|
1527
1646
|
out.bitcoinBlockHash = burn.hash;
|
|
1528
1647
|
out.cycle = cycle;
|
|
1648
|
+
this.passed("bitcoin");
|
|
1649
|
+
this.passed("burn");
|
|
1529
1650
|
const set = await this.signerSet(cycle, {
|
|
1530
1651
|
height,
|
|
1531
1652
|
burn: burn.burnHeight
|
|
1532
1653
|
});
|
|
1654
|
+
this.passed("signer-set");
|
|
1533
1655
|
const sig = verifySignerSignatures(header, set);
|
|
1534
1656
|
out.signerWeight = sig.signedWeight;
|
|
1535
1657
|
out.totalWeight = sig.totalWeight;
|
|
1536
1658
|
out.threshold = sig.threshold;
|
|
1537
1659
|
if (!sig.valid)
|
|
1538
1660
|
fail(signatureFailure(sig, "signatures", cycle));
|
|
1661
|
+
this.passed("signatures");
|
|
1539
1662
|
await this.checkTransactions(header, id, out);
|
|
1540
1663
|
await this.verifyState(header, id, out);
|
|
1541
1664
|
}
|
|
@@ -1550,6 +1673,7 @@ class BlockVerifier {
|
|
|
1550
1673
|
message: `block ${claimed} is not on the checkpoint's chain: its block at height ${height} is ${id}`,
|
|
1551
1674
|
blockId: claimed
|
|
1552
1675
|
});
|
|
1676
|
+
this.passed("ancestry");
|
|
1553
1677
|
const header = await this.header(id, "block");
|
|
1554
1678
|
if (Number(header.chainLength) !== height)
|
|
1555
1679
|
fail({
|
|
@@ -1559,6 +1683,7 @@ class BlockVerifier {
|
|
|
1559
1683
|
});
|
|
1560
1684
|
out.blockId = id;
|
|
1561
1685
|
describeHeader(header, out);
|
|
1686
|
+
this.passed("block");
|
|
1562
1687
|
await this.bindBurnBelow(header, out);
|
|
1563
1688
|
await this.checkTransactions(header, id, out);
|
|
1564
1689
|
await this.verifyState(header, id, out);
|
|
@@ -1590,6 +1715,7 @@ class BlockVerifier {
|
|
|
1590
1715
|
return;
|
|
1591
1716
|
}
|
|
1592
1717
|
out.transactions = txs;
|
|
1718
|
+
this.passed("txs");
|
|
1593
1719
|
}
|
|
1594
1720
|
async ancestor(height) {
|
|
1595
1721
|
const known = this.below.get(height);
|
|
@@ -1683,6 +1809,8 @@ class BlockVerifier {
|
|
|
1683
1809
|
const burn = await this.bindBurn(header, "burn");
|
|
1684
1810
|
out.burnHeight = burn.burnHeight;
|
|
1685
1811
|
out.bitcoinBlockHash = burn.hash;
|
|
1812
|
+
this.passed("bitcoin");
|
|
1813
|
+
this.passed("burn");
|
|
1686
1814
|
}
|
|
1687
1815
|
async verifyState(header, id, out) {
|
|
1688
1816
|
const src = this.source;
|
|
@@ -1710,6 +1838,12 @@ class BlockVerifier {
|
|
|
1710
1838
|
out.rowsChecked = state.rowsChecked;
|
|
1711
1839
|
out.notes.push(...state.notes);
|
|
1712
1840
|
out.failures.push(...state.failures);
|
|
1841
|
+
const broken = new Set(state.failures.map((f) => f.step));
|
|
1842
|
+
for (const step of ["witness", "names", "rows"]) {
|
|
1843
|
+
if (broken.has(step) || step === "rows" && !rows)
|
|
1844
|
+
break;
|
|
1845
|
+
this.passed(step);
|
|
1846
|
+
}
|
|
1713
1847
|
}
|
|
1714
1848
|
async stateWrites(height, notes) {
|
|
1715
1849
|
const { getStateWrites } = this.source;
|
|
@@ -2033,6 +2167,7 @@ export {
|
|
|
2033
2167
|
DEFAULT_API_URL,
|
|
2034
2168
|
HeaderChain,
|
|
2035
2169
|
HeaderValidationError,
|
|
2170
|
+
LINKS,
|
|
2036
2171
|
MAINNET_CHECKPOINT,
|
|
2037
2172
|
MAINNET_FIRST_BURN_HEIGHT,
|
|
2038
2173
|
MAINNET_PREPARE_LENGTH,
|
|
@@ -2048,6 +2183,7 @@ export {
|
|
|
2048
2183
|
cycleStart,
|
|
2049
2184
|
dataVarKey,
|
|
2050
2185
|
decodeSignerSet,
|
|
2186
|
+
describeLinks,
|
|
2051
2187
|
ftBalanceKey,
|
|
2052
2188
|
hex,
|
|
2053
2189
|
isEpoch2Header,
|
|
@@ -2069,5 +2205,5 @@ export {
|
|
|
2069
2205
|
verifySignerSignatures
|
|
2070
2206
|
};
|
|
2071
2207
|
|
|
2072
|
-
//# debugId=
|
|
2208
|
+
//# debugId=35F453C01939E5F064756E2164756E21
|
|
2073
2209
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/bytes.ts", "../src/header.ts", "../src/marf.ts", "../src/witness.ts", "../src/signers.ts", "../src/burn.ts", "../src/keys.ts", "../src/bitcoin/chain.ts", "../src/bitcoin/header.ts", "../src/bitcoin/pow.ts", "../src/checkpoint.ts", "../src/source.ts", "../src/state.ts", "../src/txs.ts", "../src/verify-block.ts"],
|
|
3
|
+
"sources": ["../src/bytes.ts", "../src/header.ts", "../src/marf.ts", "../src/witness.ts", "../src/signers.ts", "../src/burn.ts", "../src/keys.ts", "../src/bitcoin/chain.ts", "../src/bitcoin/header.ts", "../src/bitcoin/pow.ts", "../src/checkpoint.ts", "../src/source.ts", "../src/state.ts", "../src/txs.ts", "../src/links.ts", "../src/verify-block.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"// Byte helpers shared by every codec here. Browser-safe: no Buffer.\nimport { sha512_256 } from \"@noble/hashes/sha2.js\";\nimport { bytesToHex, concatBytes, hexToBytes } from \"@noble/hashes/utils.js\";\n\nexport type Bytes = Uint8Array;\n\nexport const hex = (b: Bytes): string => bytesToHex(b);\n\n/** Hex to bytes; tolerates a 0x prefix. */\nexport const unhex = (s: string): Bytes =>\n\thexToBytes(s.startsWith(\"0x\") ? s.slice(2) : s);\n\nexport const concat = (parts: Bytes[]): Bytes => concatBytes(...parts);\n\nexport const bytesEqual = (a: Bytes, b: Bytes): boolean => {\n\tif (a.length !== b.length) return false;\n\tfor (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n\treturn true;\n};\n\n/** sha512/256 over the concatenation of `parts` (stacks-core TrieHasher). */\nexport const hashAll = (parts: Bytes[]): Bytes => {\n\tconst h = sha512_256.create();\n\tfor (const p of parts) h.update(p);\n\treturn h.digest();\n};\n\n/** Big-endian cursor over consensus-serialized bytes. Throws on overrun. */\nexport class Reader {\n\tpos = 0;\n\tconstructor(readonly buf: Bytes) {}\n\n\tbytes(n: number): Bytes {\n\t\tif (n < 0 || this.pos + n > this.buf.length)\n\t\t\tthrow new Error(`unexpected end of input at ${this.pos} reading ${n}`);\n\t\tconst out = this.buf.subarray(this.pos, this.pos + n);\n\t\tthis.pos += n;\n\t\treturn out;\n\t}\n\n\tprivate view(n: number): DataView {\n\t\tconst b = this.bytes(n);\n\t\treturn new DataView(b.buffer, b.byteOffset, n);\n\t}\n\n\tu8 = (): number => this.bytes(1)[0] as number;\n\tu16 = (): number => this.view(2).getUint16(0);\n\tu32 = (): number => this.view(4).getUint32(0);\n\tu64 = (): bigint => this.view(8).getBigUint64(0);\n\ti64 = (): bigint => this.view(8).getBigInt64(0);\n\n\t/** StacksMessageCodec Vec<T>: u32 count prefix, then items. */\n\tvec<T>(item: () => T, max: number): T[] {\n\t\tconst n = this.u32();\n\t\tif (n > max) throw new Error(`vec length ${n} exceeds ${max}`);\n\t\treturn Array.from({ length: n }, item);\n\t}\n\n\tget done(): boolean {\n\t\treturn this.pos === this.buf.length;\n\t}\n}\n",
|
|
6
6
|
"// Stacks block header codecs + identity hashes: Nakamoto (stackslib\n// chainstate/nakamoto/mod.rs NakamotoBlockHeader) and epoch 2.x\n// (chainstate/stacks/block.rs StacksBlockHeader).\nimport { sha512_256 } from \"@noble/hashes/sha2.js\";\nimport { type Bytes, Reader, concat, hashAll } from \"./bytes.ts\";\n\nexport interface NakamotoHeader {\n\t/** Low 7 bits = header version; high bit = shadow block. */\n\tversion: number;\n\tchainLength: bigint;\n\tburnSpent: bigint;\n\tconsensusHash: Bytes;\n\tparentBlockId: Bytes;\n\ttxMerkleRoot: Bytes;\n\tstateIndexRoot: Bytes;\n\ttimestamp: bigint;\n\tminerSignature: Bytes;\n\t/** 65-byte recoverable signatures: recovery id, r, s. */\n\tsignerSignatures: Bytes[];\n\t/** Header bytes minus the signer_signature vec: the signer sighash preimage. */\n\tsignerSighashPreimage: Bytes;\n\t/** Serialized header length; block bytes after this are the transactions. */\n\tbyteLength: number;\n}\n\n/** First header version whose sighash commits to `problematic_txs` (epoch 4.0). */\nconst NAKAMOTO_BLOCK_VERSION_EPOCH_4 = 1;\nconst MAX_SIGNERS = 4000;\nconst MAX_PROBLEMATIC_TXS = 1 << 16;\n\n/**\n * Parse the NakamotoBlockHeader at the start of raw block bytes\n * (`/v3/blocks/<id>`). Handles v0 and v1 (v1 appends `problematic_txs`).\n */\nexport function parseNakamotoHeader(raw: Bytes): NakamotoHeader {\n\tconst r = new Reader(raw);\n\tconst version = r.u8();\n\tconst chainLength = r.u64();\n\tconst burnSpent = r.u64();\n\tconst consensusHash = r.bytes(20);\n\tconst parentBlockId = r.bytes(32);\n\tconst txMerkleRoot = r.bytes(32);\n\tconst stateIndexRoot = r.bytes(32);\n\tconst timestamp = r.u64();\n\tconst minerSignature = r.bytes(65);\n\tconst sigStart = r.pos;\n\tconst signerSignatures = r.vec(() => r.bytes(65), MAX_SIGNERS);\n\tconst sigEnd = r.pos;\n\t// pox_treatment: BitVec<4000> = u16 bit length, then Vec<u8> of exactly ceil(len/8).\n\tconst bits = r.u16();\n\tif (bits === 0 || bits > MAX_SIGNERS)\n\t\tthrow new Error(`bad pox_treatment length ${bits}`);\n\tconst bitBytes = Math.ceil(bits / 8);\n\tif (r.u32() !== bitBytes) throw new Error(\"bad pox_treatment data length\");\n\tr.bytes(bitBytes);\n\tif ((version & 0x7f) >= NAKAMOTO_BLOCK_VERSION_EPOCH_4) {\n\t\t// problematic_txs: Vec<(u32 index, u8 marker)>\n\t\tr.vec(() => r.bytes(5), MAX_PROBLEMATIC_TXS);\n\t}\n\tconst end = r.pos;\n\treturn {\n\t\tversion,\n\t\tchainLength,\n\t\tburnSpent,\n\t\tconsensusHash,\n\t\tparentBlockId,\n\t\ttxMerkleRoot,\n\t\tstateIndexRoot,\n\t\ttimestamp,\n\t\tminerSignature,\n\t\tsignerSignatures,\n\t\tsignerSighashPreimage: concat([\n\t\t\traw.subarray(0, sigStart),\n\t\t\traw.subarray(sigEnd, end),\n\t\t]),\n\t\tbyteLength: end,\n\t};\n}\n\n/**\n * NakamotoBlockHeader::signer_signature_hash: sha512/256 over every header field\n * except the signer signatures. Also the header's block_hash.\n */\nexport const signerSignatureHash = (h: NakamotoHeader): Bytes =>\n\tsha512_256(h.signerSighashPreimage);\n\n/**\n * Epoch 2.x anchored block header. It commits to the parent's block hash, not\n * its index block hash, and carries no consensus hash: the source supplies\n * that, and `blockId` binds it to an id proven elsewhere.\n */\nexport interface Epoch2Header {\n\tversion: number;\n\t/** total_work.burn: burn spent on the fork so far. */\n\tburnSpent: bigint;\n\t/** total_work.work: the Stacks chain length (one per anchored block). */\n\tchainLength: bigint;\n\tvrfProof: Bytes;\n\tparentBlockHash: Bytes;\n\tparentMicroblock: Bytes;\n\tparentMicroblockSequence: number;\n\ttxMerkleRoot: Bytes;\n\t/** Covers the block and the parent microblock stream it confirms. */\n\tstateIndexRoot: Bytes;\n\tmicroblockPubkeyHash: Bytes;\n\t/** sha512/256 of the serialized header. */\n\tblockHash: Bytes;\n\tconsensusHash: Bytes;\n}\n\nexport type StacksHeader = NakamotoHeader | Epoch2Header;\n\n/** StacksBlockHeader is fixed width: no signatures, no variable fields. */\nexport const EPOCH2_HEADER_LENGTH = 247;\n\n/**\n * Parse the epoch 2.x StacksBlockHeader at the start of `raw` (a header from\n * `/v2/headers`, or block bytes from `/v2/blocks/<id>`), with the 20-byte\n * consensus hash of the sortition that elected it.\n */\nexport function parseEpoch2Header(\n\traw: Bytes,\n\tconsensusHash: Bytes,\n): Epoch2Header {\n\tif (consensusHash.length !== 20)\n\t\tthrow new Error(`consensus hash is ${consensusHash.length} bytes, not 20`);\n\tconst r = new Reader(raw);\n\tconst header: Omit<Epoch2Header, \"blockHash\" | \"consensusHash\"> = {\n\t\tversion: r.u8(),\n\t\tburnSpent: r.u64(),\n\t\tchainLength: r.u64(),\n\t\tvrfProof: r.bytes(80),\n\t\tparentBlockHash: r.bytes(32),\n\t\tparentMicroblock: r.bytes(32),\n\t\tparentMicroblockSequence: r.u16(),\n\t\ttxMerkleRoot: r.bytes(32),\n\t\tstateIndexRoot: r.bytes(32),\n\t\tmicroblockPubkeyHash: r.bytes(20),\n\t};\n\treturn {\n\t\t...header,\n\t\tblockHash: sha512_256(raw.subarray(0, EPOCH2_HEADER_LENGTH)),\n\t\tconsensusHash,\n\t};\n}\n\nexport const isEpoch2Header = (h: StacksHeader): h is Epoch2Header =>\n\t\"parentBlockHash\" in h;\n\n/**\n * StacksBlockId (index block hash) = sha512/256(block_hash || consensus_hash).\n * A Nakamoto block hash is its signer signature hash; a 2.x one hashes the\n * whole header.\n */\nexport const blockId = (h: StacksHeader): Bytes =>\n\thashAll([\n\t\tisEpoch2Header(h) ? h.blockHash : signerSignatureHash(h),\n\t\th.consensusHash,\n\t]);\n",
|
|
@@ -16,9 +16,10 @@
|
|
|
16
16
|
"// Proof data sources. Everything a source returns is untrusted: verifyBlock\n// checks every byte against the checkpoint, so a lying source can make a\n// check fail but never pass.\nimport { type Bytes, unhex } from \"./bytes.ts\";\n\n/** Sortition preimage behind a consensus hash. */\nexport interface BurnPreimage {\n\tpreimage: Bytes;\n\t/** The source's claimed burn height: a hint for how far to sync Bitcoin headers, never trusted. */\n\tburnHeight: number;\n}\n\n/** Node RPC `/v2/clarity/marf/<path>?proof=1` answer. */\nexport interface MarfProofResponse {\n\t/** Value string as Clarity stored it (hex for Clarity values), 0x prefix tolerated. */\n\tdata: string;\n\t/** Consensus-serialized TrieMerkleProof. */\n\tproof: Bytes;\n}\n\n/** One storage-layer MARF write (`state_writes` row), in block write order. */\nexport interface StateWrite {\n\t/** Null for block-level writes outside any transaction. */\n\ttx_index: number | null;\n\tordinal: number;\n\t/** Full MARF key, e.g. `vm::<contract>::0::<map>::<key hex>`. */\n\tkey: string;\n\t/** Hex of the stored value string's UTF-8 bytes. */\n\tvalue_hex: string;\n}\n\n/** A `vm_events` write row, as the Index API serves it. */\nexport interface VmEventRow {\n\tevent_type: \"var_set\" | \"map_set\" | \"map_insert\" | \"map_delete\";\n\t/** The row's ordinal within the block. */\n\tevent_index: number;\n\ttx_id?: string;\n\ttx_index?: number;\n\tcontract_id: string;\n\tvar_name?: string | null;\n\tmap?: string | null;\n\traw_key?: string | null;\n\traw_value?: string | null;\n}\n\n/** An epoch 2.x header and the consensus hash its index block hash commits to. */\nexport interface Epoch2HeaderResponse {\n\t/** Consensus-serialized StacksBlockHeader. */\n\theader: Bytes;\n\tconsensusHash: Bytes;\n}\n\nexport interface ProofSource {\n\t/** Raw Nakamoto block bytes (header first), by block id or height. */\n\tgetBlock(ref: string | number): Promise<Bytes>;\n\t/**\n\t * Epoch 2.x block header by index block hash: blocks below the checkpoint\n\t * from before Nakamoto. Without it only Nakamoto blocks verify.\n\t */\n\tgetEpoch2Header?(blockId: string): Promise<Epoch2HeaderResponse>;\n\t/**\n\t * MARF inclusion proof for a 32-byte path at `tipId`; null when the key is\n\t * absent. Blocks below the checkpoint also ask for\n\t * `__MARF_BLOCK_HEIGHT_TO_HASH::<height>`, whose value is no stored string:\n\t * only `proof` is read for it.\n\t */\n\tgetMarfProof(\n\t\tpathHex: string,\n\t\ttipId: string,\n\t): Promise<MarfProofResponse | null>;\n\t/** State witness (wire v3) for a block. */\n\tgetWitness(blockId: string): Promise<Bytes>;\n\tgetBurnPreimage(consensusHash: string): Promise<BurnPreimage>;\n\t/** Raw 80-byte Bitcoin headers (hex or bytes) from height `from`. */\n\tgetBitcoinHeaders(from: number, count: number): Promise<(string | Bytes)[]>;\n\t/**\n\t * Every MARF write of the block, in ordinal order; null (or empty) when\n\t * the source has none for it. Names the block's diff.\n\t */\n\tgetStateWrites?(height: number): Promise<StateWrite[] | null>;\n\t/** Indexed vm_events write rows of the block, checked against its proven diff. */\n\tgetVmEvents?(height: number): Promise<VmEventRow[]>;\n}\n\nexport class SourceError extends Error {\n\toverride readonly name = \"SourceError\";\n\tconstructor(\n\t\treadonly url: string,\n\t\treadonly status: number | null,\n\t\tdetail: string,\n\t) {\n\t\tsuper(`${url}: ${detail}`);\n\t}\n}\n\ntype Fetch = (url: string, init?: RequestInit) => Promise<Response>;\n\ninterface HttpOptions {\n\theaders?: Record<string, string>;\n\tfetch?: Fetch;\n}\n\nconst MAX_ATTEMPTS = 3;\nconst MAX_RETRY_SECONDS = 10;\n\n/** GET with retries on 429 and 503 (honoring retry-after); null on 404. */\nasync function get(\n\turl: string,\n\topts: HttpOptions,\n\tattempt = 1,\n): Promise<Response | null> {\n\tconst doFetch = opts.fetch ?? fetch;\n\tlet res: Response;\n\ttry {\n\t\tres = await doFetch(url, { headers: opts.headers });\n\t} catch (err) {\n\t\tthrow new SourceError(url, null, (err as Error).message);\n\t}\n\tif (res.status === 404) return null;\n\tif ((res.status === 503 || res.status === 429) && attempt < MAX_ATTEMPTS) {\n\t\tconst header = res.headers.get(\"retry-after\");\n\t\tconst seconds = header === null ? 1 : Number(header);\n\t\tconst wait = Number.isFinite(seconds)\n\t\t\t? Math.min(Math.max(seconds, 0), MAX_RETRY_SECONDS)\n\t\t\t: 1;\n\t\tawait new Promise((r) => setTimeout(r, wait * 1000));\n\t\treturn get(url, opts, attempt + 1);\n\t}\n\tif (!res.ok) throw new SourceError(url, res.status, `HTTP ${res.status}`);\n\treturn res;\n}\n\nasync function getJson<T>(url: string, opts: HttpOptions): Promise<T | null> {\n\tconst res = await get(url, opts);\n\treturn res ? ((await res.json()) as T) : null;\n}\n\nasync function getBytes(url: string, opts: HttpOptions): Promise<Bytes | null> {\n\tconst res = await get(url, opts);\n\treturn res ? new Uint8Array(await res.arrayBuffer()) : null;\n}\n\nconst required = <T>(url: string, v: T | null): T => {\n\tif (v === null) throw new SourceError(url, 404, \"not found\");\n\treturn v;\n};\n\nconst trimSlash = (s: string) => s.replace(/\\/+$/, \"\");\n\ntype MarfJson = { data: string; proof?: string; marf_proof?: string };\n\ntype HeadersJson = { header?: unknown; consensus_hash?: unknown }[];\n\n/** The first entry of a node `/v2/headers/1?tip=<id>` answer: the tip itself. */\nconst toEpoch2 = (url: string, j: HeadersJson | null): Epoch2HeaderResponse => {\n\tconst tip = required(url, j)[0];\n\tif (typeof tip?.header !== \"string\" || typeof tip.consensus_hash !== \"string\")\n\t\tthrow new SourceError(url, 200, \"answer needs header and consensus_hash\");\n\treturn {\n\t\theader: unhex(tip.header),\n\t\tconsensusHash: unhex(tip.consensus_hash),\n\t};\n};\n\nconst toMarf = (url: string, j: MarfJson | null): MarfProofResponse | null => {\n\tif (j === null) return null;\n\tconst proof = j.proof ?? j.marf_proof;\n\tif (typeof proof !== \"string\" || typeof j.data !== \"string\")\n\t\tthrow new SourceError(url, 200, \"MARF answer needs data and proof\");\n\treturn { data: j.data, proof: unhex(proof) };\n};\n\n/** The hosted API. */\nexport const DEFAULT_API_URL = \"https://api.secondlayer.tools\";\n\nexport interface SecondlayerSourceOptions {\n\t/** API origin. Defaults to {@link DEFAULT_API_URL}. */\n\tbaseUrl?: string;\n\t/**\n\t * Optional. Proofs are keyless; a key raises the rate limit. Required for\n\t * `rows: true` (metered Index reads). Sent as `Authorization: Bearer`.\n\t */\n\tapiKey?: string;\n\tfetch?: Fetch;\n}\n\nconst VM_WRITE_TYPES = [\n\t\"var_set\",\n\t\"map_set\",\n\t\"map_insert\",\n\t\"map_delete\",\n] as const;\nconst PAGE = 1000;\n\n/** Follow `next_cursor` until a page comes back empty. Null when the first page 404s. */\nasync function pages<T>(\n\tfield: string,\n\turl: string,\n\thttp: HttpOptions,\n): Promise<T[] | null> {\n\tconst out: T[] = [];\n\tlet cursor: string | null = null;\n\tfor (;;) {\n\t\tconst page: string = cursor\n\t\t\t? `${url}&cursor=${encodeURIComponent(cursor)}`\n\t\t\t: url;\n\t\tconst j = await getJson<Record<string, unknown>>(page, http);\n\t\tif (j === null) return cursor === null ? null : out;\n\t\tconst rows = j[field];\n\t\tif (!Array.isArray(rows))\n\t\t\tthrow new SourceError(page, 200, `answer has no ${field} array`);\n\t\tout.push(...(rows as T[]));\n\t\tconst next = j.next_cursor;\n\t\tif (rows.length < PAGE || typeof next !== \"string\" || next === cursor)\n\t\t\treturn out;\n\t\tcursor = next;\n\t}\n}\n\n// Both sources keep their origin and account key in constructor closures, not\n// fields: nothing leaks through a spread, a log or JSON.stringify.\n\n/**\n * Every proof input from the Secondlayer API: `/v1/proofs/*` (free, rate\n * limited) for blocks, epoch 2.x headers, MARF proofs, witnesses, burn\n * preimages, Bitcoin headers and each block's state writes; the Index API\n * (metered rows) for vm_events, read only when verifyBlock gets `rows: true`.\n * Methods are own properties, so a partial source spreads over it:\n * `{ ...new SecondlayerProofSource(o), ...new NodeRpcProofSource(n) }`.\n */\nexport class SecondlayerProofSource implements ProofSource {\n\tgetBlock: (ref: string | number) => Promise<Bytes>;\n\tgetEpoch2Header: (blockId: string) => Promise<Epoch2HeaderResponse>;\n\tgetMarfProof: (\n\t\tpathHex: string,\n\t\ttipId: string,\n\t) => Promise<MarfProofResponse | null>;\n\tgetWitness: (blockId: string) => Promise<Bytes>;\n\tgetBurnPreimage: (consensusHash: string) => Promise<BurnPreimage>;\n\tgetBitcoinHeaders: (from: number, count: number) => Promise<string[]>;\n\tgetStateWrites: (height: number) => Promise<StateWrite[] | null>;\n\tgetVmEvents: (height: number) => Promise<VmEventRow[]>;\n\n\tconstructor(opts: SecondlayerSourceOptions = {}) {\n\t\tconst base = trimSlash(opts.baseUrl ?? DEFAULT_API_URL);\n\t\tconst http: HttpOptions = {\n\t\t\theaders: opts.apiKey ? { authorization: `Bearer ${opts.apiKey}` } : {},\n\t\t\tfetch: opts.fetch,\n\t\t};\n\n\t\tthis.getBlock = async (ref) => {\n\t\t\tconst url =\n\t\t\t\ttypeof ref === \"number\"\n\t\t\t\t\t? `${base}/v1/proofs/block/height/${ref}`\n\t\t\t\t\t: `${base}/v1/proofs/block/${ref}`;\n\t\t\treturn required(url, await getBytes(url, http));\n\t\t};\n\n\t\tthis.getEpoch2Header = async (blockId) => {\n\t\t\tconst url = `${base}/v1/proofs/epoch2-header/${blockId}`;\n\t\t\treturn toEpoch2(url, await getJson<HeadersJson>(url, http));\n\t\t};\n\n\t\tthis.getMarfProof = async (pathHex, tipId) => {\n\t\t\tconst url = `${base}/v1/proofs/marf/${pathHex}?tip=${tipId}`;\n\t\t\treturn toMarf(url, await getJson<MarfJson>(url, http));\n\t\t};\n\n\t\tthis.getWitness = async (blockId) => {\n\t\t\tconst url = `${base}/v1/proofs/witness/${blockId}`;\n\t\t\treturn required(url, await getBytes(url, http));\n\t\t};\n\n\t\tthis.getBurnPreimage = async (consensusHash) => {\n\t\t\tconst url = `${base}/v1/proofs/burn/${consensusHash}`;\n\t\t\tconst j = required(\n\t\t\t\turl,\n\t\t\t\tawait getJson<{ burn_height: number; preimage: string }>(url, http),\n\t\t\t);\n\t\t\treturn { preimage: unhex(j.preimage), burnHeight: j.burn_height };\n\t\t};\n\n\t\tthis.getBitcoinHeaders = async (from, count) => {\n\t\t\tconst url = `${base}/v1/proofs/bitcoin-headers?from=${from}&count=${count}`;\n\t\t\tconst j = required(\n\t\t\t\turl,\n\t\t\t\tawait getJson<{ from: number; headers: string[] }>(url, http),\n\t\t\t);\n\t\t\tif (j.from !== from)\n\t\t\t\tthrow new SourceError(url, 200, `headers start at ${j.from}`);\n\t\t\treturn j.headers;\n\t\t};\n\n\t\tthis.getStateWrites = async (height) => {\n\t\t\tconst url = `${base}/v1/proofs/writes/${height}`;\n\t\t\tconst j = await getJson<{ state_writes?: unknown }>(url, http);\n\t\t\tif (j === null) return null;\n\t\t\tif (!Array.isArray(j.state_writes))\n\t\t\t\tthrow new SourceError(url, 200, \"answer has no state_writes array\");\n\t\t\treturn j.state_writes as StateWrite[];\n\t\t};\n\n\t\tthis.getVmEvents = async (height) => {\n\t\t\tconst eventsUrl = (type: string) =>\n\t\t\t\t`${base}/v1/index/events?event_type=${type}&from_height=${height}&to_height=${height}&limit=${PAGE}`;\n\t\t\tif (!opts.apiKey)\n\t\t\t\tthrow new SourceError(\n\t\t\t\t\teventsUrl(VM_WRITE_TYPES[0]),\n\t\t\t\t\t401,\n\t\t\t\t\t\"rows: true reads metered Index events and needs an apiKey\",\n\t\t\t\t);\n\t\t\tconst out: VmEventRow[] = [];\n\t\t\tfor (const type of VM_WRITE_TYPES) {\n\t\t\t\tconst url = eventsUrl(type);\n\t\t\t\tout.push(...((await pages<VmEventRow>(\"events\", url, http)) ?? []));\n\t\t\t}\n\t\t\treturn out.sort((a, b) => a.event_index - b.event_index);\n\t\t};\n\t}\n}\n\nexport interface NodeRpcSourceOptions {\n\t/** Stacks node RPC origin, e.g. `http://localhost:20443`. */\n\tnodeUrl: string;\n\tfetch?: Fetch;\n}\n\n/**\n * Blocks, epoch 2.x headers and MARF proofs straight from a Stacks node's RPC.\n * Witnesses, burn preimages and Bitcoin headers need another source: spread\n * this over one.\n */\nexport class NodeRpcProofSource\n\timplements Pick<ProofSource, \"getBlock\" | \"getEpoch2Header\" | \"getMarfProof\">\n{\n\tgetBlock: (ref: string | number) => Promise<Bytes>;\n\tgetEpoch2Header: (blockId: string) => Promise<Epoch2HeaderResponse>;\n\tgetMarfProof: (\n\t\tpathHex: string,\n\t\ttipId: string,\n\t) => Promise<MarfProofResponse | null>;\n\n\tconstructor(opts: NodeRpcSourceOptions) {\n\t\tconst base = trimSlash(opts.nodeUrl);\n\t\tconst http: HttpOptions = { fetch: opts.fetch };\n\n\t\tthis.getBlock = async (ref) => {\n\t\t\tconst url =\n\t\t\t\ttypeof ref === \"number\"\n\t\t\t\t\t? `${base}/v3/blocks/height/${ref}`\n\t\t\t\t\t: `${base}/v3/blocks/${ref}`;\n\t\t\treturn required(url, await getBytes(url, http));\n\t\t};\n\n\t\tthis.getEpoch2Header = async (blockId) => {\n\t\t\tconst url = `${base}/v2/headers/1?tip=${blockId}`;\n\t\t\treturn toEpoch2(url, await getJson<HeadersJson>(url, http));\n\t\t};\n\n\t\tthis.getMarfProof = async (pathHex, tipId) => {\n\t\t\tconst url = `${base}/v2/clarity/marf/${pathHex}?tip=${tipId}&proof=1`;\n\t\t\treturn toMarf(url, await getJson<MarfJson>(url, http));\n\t\t};\n\t}\n}\n",
|
|
17
17
|
"// Steps 6-8 of verifyBlock: a block's state witness against its authenticated\n// header root, every leaf of its trie named, and indexed rows against the diff.\nimport { type Bytes, bytesEqual, hex, unhex } from \"./bytes.ts\";\nimport { dataVarKey } from \"./keys.ts\";\nimport {\n\tMARF_VALUE_SIZE,\n\theightToHashKey,\n\tmarfPath,\n\tmarfValue,\n} from \"./marf.ts\";\nimport type { StateWrite, VmEventRow } from \"./source.ts\";\nimport {\n\ttype WitnessLeaf,\n\tclassifyBlockDiff,\n\tparseWitness,\n} from \"./witness.ts\";\n\nexport interface DiffWrite {\n\t/** MARF key, when a state_writes row names the leaf. */\n\tkey?: string;\n\t/** Leaf path, hex. */\n\tpath: string;\n\t/** sha512/256 of the stored value string, hex. */\n\tvalueHash: string;\n\t/** Transaction of the last write; null for block-level writes. */\n\ttxIndex?: number | null;\n\t/** The stored value string (hex of a Clarity value) the leaf holds; named writes only. */\n\tvalue?: string;\n\t/** False when the source had no state_writes: the leaf may also be a carried copy. */\n\tnamed: boolean;\n}\n\nexport interface DiffLeaf {\n\tkey?: string;\n\tpath: string;\n\tvalueHash: string;\n}\n\nexport interface ProvenDiff {\n\t/** Every leaf is named (state_writes served) and classified. */\n\tnamed: boolean;\n\twrites: DiffWrite[];\n\t/** Unchanged values copied forward from the parent (proven at the parent). */\n\tcarried: DiffLeaf[];\n\t/** `__MARF_BLOCK_*` bookkeeping. */\n\tinternal: DiffLeaf[];\n}\n\nexport type StateFailureCode =\n\t| \"malformed\"\n\t| \"root-mismatch\"\n\t| \"bad-write\"\n\t| \"hidden-write\"\n\t| \"missing-write\"\n\t| \"key-not-written\"\n\t| \"value-mismatch\"\n\t| \"bad-row\";\n\nexport interface StateFailure {\n\tstep: \"witness\" | \"names\" | \"rows\";\n\tcode: StateFailureCode;\n\tmessage: string;\n\tkey?: string;\n\tpath?: string;\n\tordinal?: number;\n}\n\nexport interface BlockStateInput {\n\t/** MARF height of the block (its Stacks chain length). */\n\theight: number;\n\t/** Parent block id from the authenticated header. */\n\tparentBlockId: Bytes;\n\t/** state_index_root from the authenticated header. */\n\tstateRoot: Bytes;\n\twitness: Bytes;\n\t/** The block's state_writes; null when the source has none (names unavailable). */\n\twrites: StateWrite[] | null;\n\t/** Indexed rows to prove against the diff. */\n\trows?: VmEventRow[];\n\t/**\n\t * Leaves of the parent's own trie, from a parent witness whose root the\n\t * caller checked against the parent header: each is the parent state's\n\t * value at its path. Resolves carried leaves without a proof per leaf.\n\t */\n\tparentLeaves?: WitnessLeaf[];\n\t/**\n\t * True iff the leaf's value is stored at its path in the parent's state\n\t * (proven by the caller). Asked only with state_writes, for leaves the\n\t * parent's own trie does not explain.\n\t */\n\tparentHolds?: (leaf: WitnessLeaf) => Promise<boolean>;\n}\n\nexport interface BlockStateResult {\n\tdiff?: ProvenDiff;\n\trowsChecked: number;\n\tnotes: string[];\n\tfailures: StateFailure[];\n}\n\nconst INTERNAL = {\n\tself: \"__MARF_BLOCK_HEIGHT_SELF\",\n\thashToHeight: \"__MARF_BLOCK_HASH_TO_HEIGHT\",\n} as const;\n\n/** MARFValue of a u32 height: little-endian in the first 4 bytes. */\nconst heightValue = (h: number): string => {\n\tconst v = new Uint8Array(MARF_VALUE_SIZE);\n\tnew DataView(v.buffer).setUint32(0, h, true);\n\treturn hex(v);\n};\n/** 40-byte MARFValue hex of a 32-byte hash or block id (zero tail). */\nconst padded = (b32: Bytes): string => `${hex(b32)}${\"00\".repeat(8)}`;\n\n/**\n * The `__MARF_BLOCK_*` entries block `height` writes (stacks-core index/marf.rs).\n * The parent's are fixed by the header. The block's own id is not known while\n * its trie is built, so `HEIGHT_TO_HASH::{height}` holds a temporary hash; its\n * value is taken from the witness and must map back to `height`.\n */\nfunction internalEntries(\n\theight: number,\n\tparentBlockId: Bytes,\n\tleaves: WitnessLeaf[],\n): [key: string, valueHex: string][] {\n\tconst out: [string, string][] = [[INTERNAL.self, heightValue(height)]];\n\tconst ownKey = heightToHashKey(height);\n\tconst ownPath = marfPath(ownKey);\n\tconst own = leaves.find((l) => bytesEqual(l.path, ownPath));\n\tif (own) {\n\t\tout.push([ownKey, padded(own.valueHash)]);\n\t\tout.push([\n\t\t\t`${INTERNAL.hashToHeight}::${hex(own.valueHash)}`,\n\t\t\theightValue(height),\n\t\t]);\n\t}\n\tif (height > 0) {\n\t\tout.push([heightToHashKey(height - 1), padded(parentBlockId)]);\n\t\tout.push([\n\t\t\t`${INTERNAL.hashToHeight}::${hex(parentBlockId)}`,\n\t\t\theightValue(height - 1),\n\t\t]);\n\t}\n\treturn out;\n}\n\nconst utf8 = new TextDecoder(\"utf-8\", { fatal: true });\nconst strip0x = (s: string) => (s.startsWith(\"0x\") ? s.slice(2) : s);\nconst leafHex = (l: WitnessLeaf): DiffLeaf => ({\n\tpath: hex(l.path),\n\tvalueHash: hex(l.valueHash),\n});\n\n/** Last write per key, in ordinal order, with its value as the stored string. */\nfunction lastWrites(\n\twrites: StateWrite[],\n\tfailures: StateFailure[],\n): Map<string, { value: string; txIndex: number | null }> {\n\tconst out = new Map<string, { value: string; txIndex: number | null }>();\n\tfor (const w of [...writes].sort((a, b) => a.ordinal - b.ordinal)) {\n\t\ttry {\n\t\t\tout.set(w.key, {\n\t\t\t\tvalue: utf8.decode(unhex(strip0x(w.value_hex))),\n\t\t\t\ttxIndex: w.tx_index,\n\t\t\t});\n\t\t} catch {\n\t\t\tfailures.push({\n\t\t\t\tstep: \"names\",\n\t\t\t\tcode: \"bad-write\",\n\t\t\t\tmessage: `state write ${w.ordinal} value is not UTF-8 hex`,\n\t\t\t\tkey: w.key,\n\t\t\t\tordinal: w.ordinal,\n\t\t\t});\n\t\t}\n\t}\n\treturn out;\n}\n\n/** The MARF key and stored value string a vm_events row writes (mirrors clarity_db.rs). */\nfunction rowWrite(row: VmEventRow): [key: string, value: string] {\n\tconst need = (v: string | null | undefined, name: string): string => {\n\t\tif (!v) throw new Error(`${row.event_type} row has no ${name}`);\n\t\treturn v;\n\t};\n\tif (row.event_type === \"var_set\")\n\t\treturn [\n\t\t\tdataVarKey(row.contract_id, need(row.var_name, \"var_name\")),\n\t\t\tstrip0x(need(row.raw_value, \"raw_value\")).toLowerCase(),\n\t\t];\n\tconst key = `vm::${row.contract_id}::0::${need(row.map, \"map\")}::${strip0x(need(row.raw_key, \"raw_key\")).toLowerCase()}`;\n\tif (row.event_type === \"map_delete\") return [key, \"09\"];\n\t// put_value stores map entries as (some value).\n\treturn [key, `0a${strip0x(need(row.raw_value, \"raw_value\")).toLowerCase()}`];\n}\n\n/**\n * Rows against the block's leaves: every row's key must be a leaf, and the\n * last row per key must carry the leaf's value.\n */\nfunction checkRows(\n\trows: VmEventRow[],\n\tleaves: WitnessLeaf[],\n\tfailures: StateFailure[],\n): number {\n\tconst byPath = new Map(leaves.map((l) => [hex(l.path), l]));\n\tconst named: { row: VmEventRow; key: string; path: string; value: string }[] =\n\t\t[];\n\tfor (const row of [...rows].sort((a, b) => a.event_index - b.event_index)) {\n\t\ttry {\n\t\t\tconst [key, value] = rowWrite(row);\n\t\t\tnamed.push({ row, key, path: hex(marfPath(key)), value });\n\t\t} catch (err) {\n\t\t\tfailures.push({\n\t\t\t\tstep: \"rows\",\n\t\t\t\tcode: \"bad-row\",\n\t\t\t\tmessage: (err as Error).message,\n\t\t\t\tordinal: row.event_index,\n\t\t\t});\n\t\t}\n\t}\n\tconst last = new Map(named.map((n, i) => [n.path, i]));\n\tnamed.forEach((n, i) => {\n\t\tconst leaf = byPath.get(n.path);\n\t\tconst at = { key: n.key, path: n.path, ordinal: n.row.event_index };\n\t\tif (!leaf)\n\t\t\tfailures.push({\n\t\t\t\tstep: \"rows\",\n\t\t\t\tcode: \"key-not-written\",\n\t\t\t\tmessage: `${n.row.event_type} row ${n.row.event_index} names a key the block did not write`,\n\t\t\t\t...at,\n\t\t\t});\n\t\telse if (\n\t\t\tlast.get(n.path) === i &&\n\t\t\tpadded(leaf.valueHash) !== hex(marfValue(n.value))\n\t\t)\n\t\t\tfailures.push({\n\t\t\t\tstep: \"rows\",\n\t\t\t\tcode: \"value-mismatch\",\n\t\t\t\tmessage: `${n.row.event_type} row ${n.row.event_index} value differs from the block's leaf`,\n\t\t\t\t...at,\n\t\t\t});\n\t});\n\treturn named.length;\n}\n\n/**\n * Verify block state against an authenticated header: the witness must\n * recompute `stateRoot`, then every leaf is classified. With state_writes,\n * any leaf that is not a named write, a carried parent value or MARF\n * bookkeeping is a hidden write. Without them the diff is still proven\n * (every leaf is in the block): carried leaves are told apart only through\n * `parentLeaves`, and the remaining writes come back unnamed.\n */\nexport async function verifyBlockState(\n\tinput: BlockStateInput,\n): Promise<BlockStateResult> {\n\tconst out: BlockStateResult = { rowsChecked: 0, notes: [], failures: [] };\n\tlet witness: ReturnType<typeof parseWitness>;\n\ttry {\n\t\twitness = parseWitness(input.witness);\n\t} catch (err) {\n\t\tout.failures.push({\n\t\t\tstep: \"witness\",\n\t\t\tcode: \"malformed\",\n\t\t\tmessage: (err as Error).message,\n\t\t});\n\t\treturn out;\n\t}\n\tif (!bytesEqual(witness.root, input.stateRoot)) {\n\t\tout.failures.push({\n\t\t\tstep: \"witness\",\n\t\t\tcode: \"root-mismatch\",\n\t\t\tmessage: `witness root ${hex(witness.root)} != header state_index_root ${hex(input.stateRoot)}`,\n\t\t});\n\t\treturn out;\n\t}\n\tconst { leaves } = witness;\n\tconst internal = internalEntries(input.height, input.parentBlockId, leaves);\n\tconst named = input.writes !== null;\n\tconst last = lastWrites(input.writes ?? [], out.failures);\n\tconst writes = [...last].map(([k, w]): [string, string] => [k, w.value]);\n\t// First pass with no parent values finds the leaves that need one.\n\tconst first = classifyBlockDiff({\n\t\tleaves,\n\t\twrites,\n\t\tinternal,\n\t\tparentValue: () => undefined,\n\t});\n\tconst inParent = new Map(\n\t\t(input.parentLeaves ?? []).map((l) => [hex(l.path), hex(l.valueHash)]),\n\t);\n\tconst carried = new Map<string, string>();\n\tfor (const leaf of first.hidden) {\n\t\tconst pathHex = hex(leaf.path);\n\t\tif (\n\t\t\tinParent.get(pathHex) === hex(leaf.valueHash) ||\n\t\t\t(named && (await input.parentHolds?.(leaf)))\n\t\t)\n\t\t\tcarried.set(pathHex, padded(leaf.valueHash));\n\t}\n\tconst d = classifyBlockDiff({\n\t\tleaves,\n\t\twrites,\n\t\tinternal,\n\t\tparentValue: (p) => carried.get(p),\n\t});\n\tout.diff = {\n\t\tnamed,\n\t\twrites: named\n\t\t\t? d.writes.map((l) => ({\n\t\t\t\t\t...leafHex(l),\n\t\t\t\t\tkey: l.key,\n\t\t\t\t\ttxIndex: last.get(l.key)?.txIndex ?? null,\n\t\t\t\t\tvalue: last.get(l.key)?.value,\n\t\t\t\t\tnamed: true,\n\t\t\t\t}))\n\t\t\t: // Without names every unexplained leaf is a write we cannot label.\n\t\t\t\td.hidden.map((l) => ({ ...leafHex(l), named: false })),\n\t\tcarried: d.carried.map(leafHex),\n\t\tinternal: d.internal.map((l) => ({ ...leafHex(l), key: l.key })),\n\t};\n\tif (!named)\n\t\tout.notes.push(\n\t\t\t`source has no state_writes for block ${input.height}: ${d.hidden.length} written leaves are proven in the block but unnamed`,\n\t\t);\n\telse {\n\t\tfor (const l of d.hidden)\n\t\t\tout.failures.push({\n\t\t\t\tstep: \"names\",\n\t\t\t\tcode: \"hidden-write\",\n\t\t\t\tmessage: `leaf ${hex(l.path)} is not a named write, a carried parent value or MARF bookkeeping`,\n\t\t\t\tpath: hex(l.path),\n\t\t\t});\n\t\tfor (const key of d.missing)\n\t\t\tout.failures.push({\n\t\t\t\tstep: \"names\",\n\t\t\t\tcode: \"missing-write\",\n\t\t\t\tmessage: `state write ${key} has no leaf holding its value`,\n\t\t\t\tkey,\n\t\t\t\tpath: hex(marfPath(key)),\n\t\t\t});\n\t}\n\tif (input.rows) out.rowsChecked = checkRows(input.rows, leaves, out.failures);\n\treturn out;\n}\n",
|
|
18
18
|
"// A Nakamoto block's transactions against its header's tx_merkle_root\n// (stacks-common util/hash.rs MerkleTree, MerkleHashFunc = Sha512Trunc256Sum).\nimport { sha512_256 } from \"@noble/hashes/sha2.js\";\nimport { splitTransactions } from \"@secondlayer/stacks/transactions\";\nimport { type Bytes, bytesEqual, concat, hex } from \"./bytes.ts\";\nimport type { NakamotoHeader } from \"./header.ts\";\n\nexport interface BlockTransaction {\n\t/** sha512/256 of the transaction bytes, hex. */\n\ttxid: string;\n\t/** The consensus-serialized transaction. */\n\traw: Bytes;\n}\n\nconst LEAF_TAG = new Uint8Array([0x00]);\nconst NODE_TAG = new Uint8Array([0x01]);\n\n/**\n * tx_merkle_root over txids: leaf = H(0x00 ‖ txid), node = H(0x01 ‖ l ‖ r),\n * an odd level duplicates its last node, and a lone leaf is still paired with\n * itself (one-tx blocks hash H(0x01 ‖ leaf ‖ leaf)).\n */\nexport function txMerkleRoot(txids: Bytes[]): Bytes {\n\tif (txids.length === 0) throw new Error(\"no transactions\");\n\tlet level = txids.map((t) => sha512_256(concat([LEAF_TAG, t])));\n\tdo {\n\t\tif (level.length % 2 === 1) level.push(level[level.length - 1] as Bytes);\n\t\tconst next: Bytes[] = [];\n\t\tfor (let i = 0; i < level.length; i += 2) {\n\t\t\tnext.push(\n\t\t\t\tsha512_256(\n\t\t\t\t\tconcat([NODE_TAG, level[i] as Bytes, level[i + 1] as Bytes]),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tlevel = next;\n\t} while (level.length > 1);\n\treturn level[0] as Bytes;\n}\n\nexport class TransactionsError extends Error {\n\tconstructor(\n\t\treadonly code: \"malformed\" | \"tx-root-mismatch\",\n\t\tmessage: string,\n\t) {\n\t\tsuper(message);\n\t}\n}\n\n/**\n * The block's transactions, each hashed to its txid, checked against the\n * header's tx_merkle_root. The body after `header.byteLength` is a u32 count\n * then the transactions back to back. Null when the bytes are the header\n * alone (a source that serves headers only): nothing to check. Throws\n * {@link TransactionsError} on a malformed body, trailing bytes or a root\n * mismatch.\n */\nexport function blockTransactions(\n\traw: Bytes,\n\theader: NakamotoHeader,\n): BlockTransaction[] | null {\n\tconst body = raw.subarray(header.byteLength);\n\tif (body.length === 0) return null;\n\tif (body.length < 4)\n\t\tthrow new TransactionsError(\"malformed\", \"block body has no tx count\");\n\tconst count = new DataView(\n\t\tbody.buffer,\n\t\tbody.byteOffset,\n\t\tbody.byteLength,\n\t).getUint32(0);\n\tif (count === 0)\n\t\tthrow new TransactionsError(\"malformed\", \"block has no transactions\");\n\tlet txs: Bytes[];\n\ttry {\n\t\ttxs = splitTransactions(body.subarray(4), count);\n\t} catch (err) {\n\t\tthrow new TransactionsError(\n\t\t\t\"malformed\",\n\t\t\t`transactions do not parse: ${(err as Error).message}`,\n\t\t);\n\t}\n\tconst used = txs.reduce((n, t) => n + t.length, 4);\n\tif (used !== body.length)\n\t\tthrow new TransactionsError(\n\t\t\t\"malformed\",\n\t\t\t`${body.length - used} bytes after the block's ${count} transactions`,\n\t\t);\n\tconst ids = txs.map((t) => sha512_256(t));\n\tconst root = txMerkleRoot(ids);\n\tif (!bytesEqual(root, header.txMerkleRoot))\n\t\tthrow new TransactionsError(\n\t\t\t\"tx-root-mismatch\",\n\t\t\t`transactions hash to ${hex(root)}, header tx_merkle_root is ${hex(header.txMerkleRoot)}`,\n\t\t);\n\treturn txs.map((t, i) => ({ txid: hex(ids[i] as Bytes), raw: t }));\n}\n",
|
|
19
|
-
"// verifyBlock: the end-to-end trustless check for one Stacks block.\n//\n// At or above the checkpoint, forward:\n// checkpoint ─▶ bitcoin headers (PoW) ─▶ burn height ─▶ cycle ─▶ signer set[cycle] (MARF-proven)\n// ─▶ header N (signatures ≥ 70%) ─▶ txs N (tx merkle root) ─▶ witness N (root)\n// ─▶ named diff ─▶ indexed rows\n//\n// Below it, backward: a trusted descendant's id commits to every ancestor by\n// hash, so no signatures are needed:\n// checkpoint ─▶ id N (parent links, or one MARF proof of __MARF_BLOCK_HEIGHT_TO_HASH::N)\n// ─▶ header N (hashes to id N) ─▶ txs N ─▶ witness N (root) ─▶ named diff ─▶ indexed rows\n//\n// Every input comes from an untrusted ProofSource; only the checkpoint is trusted.\nimport { uintCV } from \"@secondlayer/stacks/clarity\";\nimport { HeaderChain, HeaderValidationError } from \"./bitcoin/chain.ts\";\nimport {\n\tMAINNET_PREPARE_LENGTH,\n\tcycleStart,\n\trewardCycle,\n\tverifyConsensusPreimage,\n} from \"./burn.ts\";\nimport { type Bytes, bytesEqual, hex, unhex } from \"./bytes.ts\";\nimport { MAINNET_CHECKPOINT, type VerifyCheckpoint } from \"./checkpoint.ts\";\nimport {\n\ttype Epoch2Header,\n\ttype NakamotoHeader,\n\ttype StacksHeader,\n\tblockId,\n\tisEpoch2Header,\n\tparseEpoch2Header,\n\tparseNakamotoHeader,\n\tsignerSignatureHash,\n} from \"./header.ts\";\nimport { mapEntryKey } from \"./keys.ts\";\nimport {\n\tMARF_VALUE_SIZE,\n\theightToHashKey,\n\tmarfPath,\n\tmarfProofAncestors,\n\tmarfProofValue,\n\tmarfValue,\n\tverifyMarfProof,\n} from \"./marf.ts\";\nimport {\n\tSIGNERS_CONTRACT,\n\ttype SignerSet,\n\tdecodeSignerSet,\n\tverifySignerSignatures,\n} from \"./signers.ts\";\nimport type { BurnPreimage, ProofSource, StateWrite } from \"./source.ts\";\nimport {\n\ttype ProvenDiff,\n\ttype StateFailureCode,\n\tverifyBlockState,\n} from \"./state.ts\";\nimport {\n\ttype BlockTransaction,\n\tTransactionsError,\n\tblockTransactions,\n} from \"./txs.ts\";\nimport { type WitnessLeaf, parseWitness } from \"./witness.ts\";\n\nexport type VerifyStep =\n\t| \"ancestry\"\n\t| \"block\"\n\t| \"bitcoin\"\n\t| \"burn\"\n\t| \"signer-set\"\n\t| \"signatures\"\n\t| \"txs\"\n\t| \"witness\"\n\t| \"names\"\n\t| \"rows\";\n\nexport type VerifyFailureCode =\n\t| StateFailureCode\n\t/** The source could not serve something the step needs. */\n\t| \"unavailable\"\n\t| \"id-mismatch\"\n\t/** The block's transactions do not hash to its header's tx_merkle_root. */\n\t| \"tx-root-mismatch\"\n\t| \"height-mismatch\"\n\t| \"invalid-header\"\n\t| \"preimage-mismatch\"\n\t| \"burn-not-in-chain\"\n\t| \"before-checkpoint\"\n\t/** The block is not the checkpoint chain's block at its height. */\n\t| \"not-ancestor\"\n\t| \"ancestry-proof-invalid\"\n\t| \"anchor-not-found\"\n\t| \"anchor-outside-window\"\n\t| \"anchor-unsigned\"\n\t| \"set-proof-invalid\"\n\t| \"below-threshold\"\n\t| \"unknown-signer\"\n\t| \"duplicate-signer\"\n\t| \"bad-signature\";\n\nexport interface VerifyFailure {\n\tstep: VerifyStep;\n\tcode: VerifyFailureCode;\n\tmessage: string;\n\t/** Reward cycle being proven (signer-set step). */\n\tcycle?: number;\n\t/** Block the failure is about, when not the target. */\n\tblockId?: string;\n\tkey?: string;\n\tpath?: string;\n\tordinal?: number;\n}\n\n/** How a block below the checkpoint was tied to it. */\nexport interface Ancestry {\n\t/** Trusted descendant it was proven from: the checkpoint, or a block proven below it earlier. */\n\tfromHeight: number;\n\tfromBlockId: string;\n\t/**\n\t * `parents`: each header hashes to the parent id its child commits to.\n\t * `marf`: one MARF proof of `__MARF_BLOCK_HEIGHT_TO_HASH::<height>` against\n\t * the descendant's state root.\n\t */\n\tvia: \"parents\" | \"marf\";\n}\n\nexport interface BlockVerification {\n\t/**\n\t * Every step passed. At or above the checkpoint: header, burn binding,\n\t * signatures, state root, names and rows. Below it: ancestry, header,\n\t * state root, names and rows (and the burn binding when Bitcoin reaches it).\n\t */\n\tok: boolean;\n\theight?: number;\n\tblockId?: string;\n\t/** Nakamoto block hash (the header's signer sighash), hex. Absent for epoch 2.x. */\n\tblockHash?: string;\n\t/** The header's consensus hash, hex. */\n\tconsensusHash?: string;\n\t/** Nakamoto header timestamp, Unix seconds. Absent for epoch 2.x. */\n\ttimestamp?: number;\n\t/** The header's state_index_root, hex: what the witness must hash to. */\n\tstateRoot?: string;\n\t/** Set for blocks below the checkpoint, which need no signatures. */\n\tancestry?: Ancestry;\n\tcycle?: number;\n\tburnHeight?: number;\n\t/** Display-order hex. */\n\tbitcoinBlockHash?: string;\n\tsignerWeight?: bigint;\n\ttotalWeight?: bigint;\n\tthreshold?: bigint;\n\t/**\n\t * The block's transactions, checked against the header's tx_merkle_root.\n\t * Absent for epoch 2.x blocks and when the source served the header only.\n\t */\n\ttransactions?: BlockTransaction[];\n\tdiff?: ProvenDiff;\n\t/** Every state_writes row the names step checked, in ordinal order. */\n\twrites?: StateWrite[];\n\t/** vm_events rows proven against the diff. */\n\trowsChecked?: number;\n\tnotes: string[];\n\t/** Empty when ok. The first entry is the first broken link. */\n\tfailures: VerifyFailure[];\n}\n\nexport interface VerifyOptions {\n\tsource: ProofSource;\n\t/** Defaults to MAINNET_CHECKPOINT. */\n\tcheckpoint?: VerifyCheckpoint;\n\t/**\n\t * Also prove the block's indexed vm_events rows against its diff: reads\n\t * the source's `getVmEvents`, which bill as Index rows on the Secondlayer\n\t * API. Off by default. Naming the diff's writes (`getStateWrites`, free on\n\t * `/v1/proofs`) is always on when the source has them.\n\t */\n\trows?: boolean;\n}\n\nclass Broken extends Error {\n\tconstructor(readonly failure: VerifyFailure) {\n\t\tsuper(failure.message);\n\t}\n}\n\nconst fail = (f: VerifyFailure): never => {\n\tthrow new Broken(f);\n};\n\n/** Run a source call; a throw becomes an `unavailable` failure of `step`. */\nasync function fetchFor<T>(\n\tstep: VerifyStep,\n\twhat: string,\n\tcall: () => Promise<T>,\n\textra: Partial<VerifyFailure> = {},\n): Promise<T> {\n\ttry {\n\t\treturn await call();\n\t} catch (err) {\n\t\tif (err instanceof Broken) throw err;\n\t\treturn fail({\n\t\t\tstep,\n\t\t\tcode: \"unavailable\",\n\t\t\tmessage: `${what}: ${(err as Error).message}`,\n\t\t\t...extra,\n\t\t});\n\t}\n}\n\nconst BITCOIN_BATCH = 2016;\n/**\n * Below the checkpoint, ancestors this close to a trusted block are reached by\n * parent links (one block fetch each); farther ones by one MARF proof, which\n * costs the proof plus a header per ancestor trie it crosses.\n */\nconst MAX_WALK = 16;\n\n/** A block position for the anchor search; `burn` is a source hint. */\nexport interface SearchPoint {\n\theight: number;\n\tburn?: number;\n}\n\n/**\n * Find a block whose burn height lies in `[window[0], window[1])`, between\n * `lo` and `hi` (exclusive). Interpolates on burn height, falling back to\n * bisection whenever a probe fails to halve the bracket. Burn heights here\n * are unproven hints: the caller authenticates whatever this returns.\n */\nexport async function findAnchor<T extends SearchPoint & { burn: number }>(\n\tlow: SearchPoint,\n\thigh: SearchPoint,\n\twindow: readonly [number, number],\n\tprobe: (height: number) => Promise<T>,\n\tmaxProbes = 32,\n): Promise<T | null> {\n\tlet [lo, hi] = [low, high];\n\tconst target = (window[0] + window[1]) / 2;\n\tlet bisect = false;\n\tfor (let i = 0; i < maxProbes; i++) {\n\t\tconst span = hi.height - lo.height;\n\t\tif (span <= 1) return null;\n\t\tlet h = Math.floor((lo.height + hi.height) / 2);\n\t\tif (\n\t\t\t!bisect &&\n\t\t\tlo.burn !== undefined &&\n\t\t\thi.burn !== undefined &&\n\t\t\thi.burn > lo.burn\n\t\t)\n\t\t\th =\n\t\t\t\tlo.height +\n\t\t\t\tMath.round(((target - lo.burn) * span) / (hi.burn - lo.burn));\n\t\th = Math.min(Math.max(h, lo.height + 1), hi.height - 1);\n\t\tconst p = await probe(h);\n\t\tif (p.height <= lo.height || p.height >= hi.height) return null;\n\t\tif (p.burn >= window[0] && p.burn < window[1]) return p;\n\t\tif (p.burn < window[0]) lo = p;\n\t\telse hi = p;\n\t\tbisect = hi.height - lo.height > span / 2;\n\t}\n\treturn null;\n}\n\ninterface Probe extends SearchPoint {\n\tburn: number;\n\theader: NakamotoHeader;\n\tid: string;\n}\n\n/**\n * Verifies blocks from one checkpoint against one source, caching the Bitcoin\n * header chain, proven signer sets and fetched headers across calls.\n */\nexport class BlockVerifier {\n\tprivate readonly source: ProofSource;\n\tprivate readonly checkpoint: VerifyCheckpoint;\n\tprivate readonly rows: boolean;\n\tprivate readonly chain: HeaderChain;\n\t/** Proven signer sets by cycle. */\n\tprivate readonly sets = new Map<number, SignerSet>();\n\t/** Where each proven set was anchored: the lower bound for the next search. */\n\tprivate readonly anchors = new Map<number, SearchPoint>();\n\t/** Headers fetched by id, each checked to hash to it. */\n\tprivate readonly headers = new Map<string, StacksHeader>();\n\t/** Blocks proven on the checkpoint's chain below it, by height. */\n\tprivate readonly below = new Map<\n\t\tnumber,\n\t\t{ id: string; ancestry: Ancestry }\n\t>();\n\tprivate readonly burns = new Map<\n\t\tstring,\n\t\t{ burnHeight: number; hash: string }\n\t>();\n\t/** Unverified source answers by consensus hash. */\n\tprivate readonly preimages = new Map<string, BurnPreimage>();\n\t/** Raw bytes of the last few blocks fetched, so the txs step reuses the\n\t * block an ancestry walk just read. Bounded: blocks can be megabytes. */\n\tprivate readonly raws = new Map<string, Bytes>();\n\tprivate readonly start: { header: NakamotoHeader; id: string };\n\n\tconstructor(opts: VerifyOptions) {\n\t\tthis.source = opts.source;\n\t\tthis.checkpoint = opts.checkpoint ?? MAINNET_CHECKPOINT;\n\t\tthis.rows = opts.rows ?? false;\n\t\tconst { stacks } = this.checkpoint;\n\t\tconst header = parseNakamotoHeader(unhex(stacks.header));\n\t\tthis.start = { header, id: hex(blockId(header)) };\n\t\tthis.headers.set(this.start.id, header);\n\t\tthis.sets.set(stacks.cycle, decodeSignerSet(stacks.signerSet));\n\t\tthis.chain = HeaderChain.fromCheckpoint(this.checkpoint.bitcoin);\n\t}\n\n\t/** Verify one block by id (hex) or height. Never throws for bad source data. */\n\tasync verify(ref: string | number): Promise<BlockVerification> {\n\t\tconst out: BlockVerification = { ok: false, notes: [], failures: [] };\n\t\ttry {\n\t\t\tawait this.run(ref, out);\n\t\t} catch (err) {\n\t\t\tif (!(err instanceof Broken)) throw err;\n\t\t\tout.failures.unshift(err.failure);\n\t\t}\n\t\tout.ok = out.failures.length === 0;\n\t\treturn out;\n\t}\n\n\tprivate async run(\n\t\tref: string | number,\n\t\tout: BlockVerification,\n\t): Promise<void> {\n\t\tconst start = Number(this.start.header.chainLength);\n\t\tif (typeof ref === \"number\" && ref < start)\n\t\t\treturn this.runBelow(ref, undefined, out);\n\t\tlet header: StacksHeader;\n\t\tif (typeof ref === \"string\") {\n\t\t\tconst id = ref.replace(/^0x/, \"\").toLowerCase();\n\t\t\theader = await this.header(id, \"block\");\n\t\t\tconst height = Number(header.chainLength);\n\t\t\tif (height < start) return this.runBelow(height, id, out);\n\t\t\tif (isEpoch2Header(header))\n\t\t\t\tfail({\n\t\t\t\t\tstep: \"block\",\n\t\t\t\t\tcode: \"invalid-header\",\n\t\t\t\t\tmessage: `epoch 2.x block ${id} claims height ${height}, at or above the checkpoint`,\n\t\t\t\t});\n\t\t} else {\n\t\t\tconst raw = await fetchFor(\"block\", `block ${ref}`, () =>\n\t\t\t\tthis.source.getBlock(ref),\n\t\t\t);\n\t\t\theader = parseHeader(raw, \"block\");\n\t\t\tthis.rememberRaw(hex(blockId(header)), raw);\n\t\t}\n\t\tconst id = hex(blockId(header));\n\t\tconst height = Number(header.chainLength);\n\t\tif (typeof ref === \"number\" && height !== ref)\n\t\t\tfail({\n\t\t\t\tstep: \"block\",\n\t\t\t\tcode: \"height-mismatch\",\n\t\t\t\tmessage: `source returned height ${height} for ${ref}`,\n\t\t\t});\n\t\tawait this.runForward(header as NakamotoHeader, id, out);\n\t}\n\n\t/** At or above the checkpoint: Bitcoin, burn binding, signer set, signatures, state. */\n\tprivate async runForward(\n\t\theader: NakamotoHeader,\n\t\tid: string,\n\t\tout: BlockVerification,\n\t): Promise<void> {\n\t\tconst height = Number(header.chainLength);\n\t\tout.height = height;\n\t\tout.blockId = id;\n\t\tdescribeHeader(header, out);\n\n\t\tconst burn = await this.bindBurn(header, \"burn\");\n\t\tconst cycle = rewardCycle(burn.burnHeight);\n\t\tout.burnHeight = burn.burnHeight;\n\t\tout.bitcoinBlockHash = burn.hash;\n\t\tout.cycle = cycle;\n\n\t\tconst set = await this.signerSet(cycle, {\n\t\t\theight,\n\t\t\tburn: burn.burnHeight,\n\t\t});\n\t\tconst sig = verifySignerSignatures(header, set);\n\t\tout.signerWeight = sig.signedWeight;\n\t\tout.totalWeight = sig.totalWeight;\n\t\tout.threshold = sig.threshold;\n\t\tif (!sig.valid) fail(signatureFailure(sig, \"signatures\", cycle));\n\t\tawait this.checkTransactions(header, id, out);\n\t\tawait this.verifyState(header, id, out);\n\t}\n\n\t/**\n\t * Below the checkpoint: prove the checkpoint chain's id at `height` (and\n\t * that it is `claimed`, when the caller asked by id), then the header that\n\t * hashes to it, then its state. Signatures add nothing to a header pinned\n\t * by hash from a trusted descendant.\n\t */\n\tprivate async runBelow(\n\t\theight: number,\n\t\tclaimed: string | undefined,\n\t\tout: BlockVerification,\n\t): Promise<void> {\n\t\tout.height = height;\n\t\tconst { id, ancestry } = await this.ancestor(height);\n\t\tout.ancestry = ancestry;\n\t\tif (claimed !== undefined && claimed !== id)\n\t\t\tfail({\n\t\t\t\tstep: \"ancestry\",\n\t\t\t\tcode: \"not-ancestor\",\n\t\t\t\tmessage: `block ${claimed} is not on the checkpoint's chain: its block at height ${height} is ${id}`,\n\t\t\t\tblockId: claimed,\n\t\t\t});\n\t\tconst header = await this.header(id, \"block\");\n\t\tif (Number(header.chainLength) !== height)\n\t\t\tfail({\n\t\t\t\tstep: \"block\",\n\t\t\t\tcode: \"height-mismatch\",\n\t\t\t\tmessage: `block ${id} claims height ${header.chainLength}, proven at ${height}`,\n\t\t\t});\n\t\tout.blockId = id;\n\t\tdescribeHeader(header, out);\n\t\tawait this.bindBurnBelow(header, out);\n\t\tawait this.checkTransactions(header, id, out);\n\t\tawait this.verifyState(header, id, out);\n\t}\n\n\tprivate rememberRaw(id: string, raw: Bytes): void {\n\t\tthis.raws.delete(id);\n\t\tthis.raws.set(id, raw);\n\t\twhile (this.raws.size > 4) {\n\t\t\tconst oldest = this.raws.keys().next().value as string;\n\t\t\tthis.raws.delete(oldest);\n\t\t}\n\t}\n\n\t/**\n\t * The block's transactions against the authenticated header's\n\t * tx_merkle_root: binds every txid, sender, type and call target to the\n\t * signed (or hash-linked) header.\n\t */\n\tprivate async checkTransactions(\n\t\theader: StacksHeader,\n\t\tid: string,\n\t\tout: BlockVerification,\n\t): Promise<void> {\n\t\tif (isEpoch2Header(header)) {\n\t\t\tout.notes.push(\"epoch 2.x: transactions not checked\");\n\t\t\treturn;\n\t\t}\n\t\tconst raw =\n\t\t\tthis.raws.get(id) ??\n\t\t\t(await fetchFor(\"txs\", `block ${id}`, () => this.source.getBlock(id)));\n\t\tlet txs: BlockTransaction[] | null;\n\t\ttry {\n\t\t\ttxs = blockTransactions(raw, header);\n\t\t} catch (err) {\n\t\t\tif (!(err instanceof TransactionsError)) throw err;\n\t\t\treturn fail({ step: \"txs\", code: err.code, message: err.message });\n\t\t}\n\t\tif (txs === null) {\n\t\t\tout.notes.push(\n\t\t\t\t`transactions not checked: the source served block ${id}'s header only`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tout.transactions = txs;\n\t}\n\n\t/**\n\t * The checkpoint chain's block id at `height`, from the nearest trusted\n\t * block above it: parent links when within MAX_WALK, else one MARF proof.\n\t */\n\tprivate async ancestor(\n\t\theight: number,\n\t): Promise<{ id: string; ancestry: Ancestry }> {\n\t\tconst known = this.below.get(height);\n\t\tif (known) return known;\n\t\tconst from = this.nearestAbove(height);\n\t\tif (from.height - height <= MAX_WALK) {\n\t\t\tconst walked = await this.walk(from, height);\n\t\t\tif (walked) return walked;\n\t\t}\n\t\treturn this.jump(this.nearestAbove(height), height);\n\t}\n\n\t/** The lowest trusted block above `height`: the checkpoint or one proven below it. */\n\tprivate nearestAbove(height: number): { height: number; id: string } {\n\t\tlet best = {\n\t\t\theight: Number(this.start.header.chainLength),\n\t\t\tid: this.start.id,\n\t\t};\n\t\tfor (const [h, { id }] of this.below)\n\t\t\tif (h > height && h < best.height) best = { height: h, id };\n\t\treturn best;\n\t}\n\n\t/**\n\t * Follow parent ids down from `from`: each parent header must hash to the\n\t * id its child committed to. Null when a 2.x header stops the walk: it\n\t * commits to its parent's block hash, not the parent's id.\n\t */\n\tprivate async walk(\n\t\tfrom: { height: number; id: string },\n\t\theight: number,\n\t): Promise<{ id: string; ancestry: Ancestry } | null> {\n\t\tconst ancestry: Ancestry = {\n\t\t\tfromHeight: from.height,\n\t\t\tfromBlockId: from.id,\n\t\t\tvia: \"parents\",\n\t\t};\n\t\tlet child = await this.header(from.id, \"ancestry\");\n\t\tfor (let h = from.height - 1; h >= height; h--) {\n\t\t\tif (isEpoch2Header(child)) return null;\n\t\t\tconst id = hex(child.parentBlockId);\n\t\t\tconst parent = await this.header(id, \"ancestry\", { blockId: id });\n\t\t\tif (Number(parent.chainLength) !== h)\n\t\t\t\tfail({\n\t\t\t\t\tstep: \"ancestry\",\n\t\t\t\t\tcode: \"height-mismatch\",\n\t\t\t\t\tmessage: `parent ${id} claims height ${parent.chainLength}, expected ${h}`,\n\t\t\t\t\tblockId: id,\n\t\t\t\t});\n\t\t\tthis.below.set(h, { id, ancestry });\n\t\t\tchild = parent;\n\t\t}\n\t\treturn this.below.get(height) ?? null;\n\t}\n\n\t/**\n\t * Read the id at `height` from `from`'s state: block `height + 1` wrote it\n\t * to `__MARF_BLOCK_HEIGHT_TO_HASH::<height>`, and the proof must recompute\n\t * `from`'s state root through the header of every trie it crosses.\n\t */\n\tprivate async jump(\n\t\tfrom: { height: number; id: string },\n\t\theight: number,\n\t): Promise<{ id: string; ancestry: Ancestry }> {\n\t\tconst at = { blockId: from.id };\n\t\tconst tip = await this.header(from.id, \"ancestry\", at);\n\t\tconst key = heightToHashKey(height);\n\t\tconst path = marfPath(key);\n\t\tconst answer = await fetchFor(\n\t\t\t\"ancestry\",\n\t\t\t`${key} at ${from.id}`,\n\t\t\t() => this.source.getMarfProof(hex(path), from.id),\n\t\t\tat,\n\t\t);\n\t\tif (!answer)\n\t\t\treturn fail({\n\t\t\t\tstep: \"ancestry\",\n\t\t\t\tcode: \"unavailable\",\n\t\t\t\tmessage: `source has no MARF proof of ${key} at block ${from.height}, ${from.height - height} blocks up; parent links reach ${MAX_WALK}`,\n\t\t\t\t...at,\n\t\t\t});\n\t\t// A block id fills the first 32 bytes of the MARFValue; the tail is zero.\n\t\tconst value = marfProofValue(answer.proof) ?? new Uint8Array();\n\t\tconst proven =\n\t\t\tvalue.length === MARF_VALUE_SIZE &&\n\t\t\tvalue.subarray(32).every((b) => b === 0) &&\n\t\t\t(await this.proveAt(tip, path, value, answer.proof, \"ancestry\", at));\n\t\tif (!proven)\n\t\t\treturn fail({\n\t\t\t\tstep: \"ancestry\",\n\t\t\t\tcode: \"ancestry-proof-invalid\",\n\t\t\t\tmessage: `${key} is not proven in block ${from.height}'s state`,\n\t\t\t\t...at,\n\t\t\t});\n\t\tconst ancestry: Ancestry = {\n\t\t\tfromHeight: from.height,\n\t\t\tfromBlockId: from.id,\n\t\t\tvia: \"marf\",\n\t\t};\n\t\tconst found = { id: hex(value.subarray(0, 32)), ancestry };\n\t\tthis.below.set(height, found);\n\t\treturn found;\n\t}\n\n\t/**\n\t * Below the checkpoint the hash chain already pins the block; still bind\n\t * its burn block when the Bitcoin checkpoint reaches it. The burn height\n\t * here is the source's hint, so a low one only skips this extra check.\n\t */\n\tprivate async bindBurnBelow(\n\t\theader: StacksHeader,\n\t\tout: BlockVerification,\n\t): Promise<void> {\n\t\tlet hint: number;\n\t\ttry {\n\t\t\thint = await this.burnHint(header);\n\t\t} catch (err) {\n\t\t\tout.notes.push(`burn block not checked: ${(err as Error).message}`);\n\t\t\treturn;\n\t\t}\n\t\tif (hint < this.chain.checkpointHeight) {\n\t\t\tout.notes.push(\n\t\t\t\t`burn block not checked: its height ${hint} is below the Bitcoin checkpoint ${this.chain.checkpointHeight}`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tconst burn = await this.bindBurn(header, \"burn\");\n\t\tout.burnHeight = burn.burnHeight;\n\t\tout.bitcoinBlockHash = burn.hash;\n\t}\n\n\t/** Witness against the authenticated header's root, then the named diff and rows. */\n\tprivate async verifyState(\n\t\theader: StacksHeader,\n\t\tid: string,\n\t\tout: BlockVerification,\n\t): Promise<void> {\n\t\tconst src = this.source;\n\t\tconst height = Number(header.chainLength);\n\t\tconst witness = await fetchFor(\"witness\", `witness ${id}`, () =>\n\t\t\tsrc.getWitness(id),\n\t\t);\n\t\tconst writes = await this.stateWrites(height, out.notes);\n\t\tif (writes) out.writes = writes;\n\t\tconst { getVmEvents }: Partial<ProofSource> = this.rows ? src : {};\n\t\tconst rows = getVmEvents\n\t\t\t? await fetchFor(\"rows\", `vm_events ${height}`, () =>\n\t\t\t\t\tgetVmEvents.call(src, height),\n\t\t\t\t)\n\t\t\t: undefined;\n\t\tconst parent = isEpoch2Header(header)\n\t\t\t? epoch2ParentId(witness, header)\n\t\t\t: header.parentBlockId;\n\t\tconst parentId = parent && hex(parent);\n\t\tconst state = await verifyBlockState({\n\t\t\theight,\n\t\t\t// Null only when the witness fails its root check, which fails the block.\n\t\t\tparentBlockId: parent ?? new Uint8Array(32),\n\t\t\tstateRoot: header.stateIndexRoot,\n\t\t\twitness,\n\t\t\twrites,\n\t\t\trows,\n\t\t\tparentLeaves: parentId\n\t\t\t\t? await this.parentLeaves(parentId, out.notes)\n\t\t\t\t: undefined,\n\t\t\tparentHolds: async (leaf) =>\n\t\t\t\tparentId ? this.parentHolds(parentId, leaf) : false,\n\t\t});\n\t\tout.diff = state.diff;\n\t\tif (rows) out.rowsChecked = state.rowsChecked;\n\t\tout.notes.push(...state.notes);\n\t\tout.failures.push(...state.failures);\n\t}\n\n\t/**\n\t * The block's state writes, to name its diff. Optional evidence: a source\n\t * with none for the block (404, empty) or that fails leaves the diff\n\t * proven but unnamed, with a note, never a failure.\n\t */\n\tprivate async stateWrites(\n\t\theight: number,\n\t\tnotes: string[],\n\t): Promise<StateWrite[] | null> {\n\t\tconst { getStateWrites } = this.source;\n\t\tif (!getStateWrites) return null;\n\t\ttry {\n\t\t\tconst writes = await getStateWrites.call(this.source, height);\n\t\t\treturn writes?.length ? writes : null;\n\t\t} catch (err) {\n\t\t\tnotes.push(\n\t\t\t\t`state writes for block ${height} unavailable: ${(err as Error).message}`,\n\t\t\t);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/** Header by id, from the cache or the source; it must hash to `id`. */\n\tprivate async header(\n\t\tid: string,\n\t\tstep: VerifyStep,\n\t\textra: Partial<VerifyFailure> = {},\n\t): Promise<StacksHeader> {\n\t\tconst known = this.headers.get(id);\n\t\tif (known) return known;\n\t\tconst header = await this.fetchHeader(id, step, extra);\n\t\tif (hex(blockId(header)) !== id)\n\t\t\tfail({\n\t\t\t\tstep,\n\t\t\t\tcode: \"id-mismatch\",\n\t\t\t\tmessage: `source returned another block for ${id}`,\n\t\t\t\tblockId: id,\n\t\t\t\t...extra,\n\t\t\t});\n\t\tthis.headers.set(id, header);\n\t\treturn header;\n\t}\n\n\t/**\n\t * A Nakamoto block by id, or when the source has none (epoch 2.x blocks are\n\t * not served as Nakamoto blocks) its epoch 2.x header.\n\t */\n\tprivate async fetchHeader(\n\t\tid: string,\n\t\tstep: VerifyStep,\n\t\textra: Partial<VerifyFailure>,\n\t): Promise<StacksHeader> {\n\t\tconst src = this.source;\n\t\tlet raw: Bytes;\n\t\ttry {\n\t\t\traw = await src.getBlock(id);\n\t\t\tthis.rememberRaw(id, raw);\n\t\t} catch (err) {\n\t\t\tconst reason = `block ${id}: ${(err as Error).message}`;\n\t\t\tconst { getEpoch2Header } = src;\n\t\t\tif (!getEpoch2Header)\n\t\t\t\treturn fail({ step, code: \"unavailable\", message: reason, ...extra });\n\t\t\tconst e2 = await fetchFor(\n\t\t\t\tstep,\n\t\t\t\t`${reason}; epoch 2.x header`,\n\t\t\t\t() => getEpoch2Header.call(src, id),\n\t\t\t\textra,\n\t\t\t);\n\t\t\ttry {\n\t\t\t\treturn parseEpoch2Header(e2.header, e2.consensusHash);\n\t\t\t} catch (parseErr) {\n\t\t\t\treturn fail({\n\t\t\t\t\tstep,\n\t\t\t\t\tcode: \"invalid-header\",\n\t\t\t\t\tmessage: `epoch 2.x header ${id} does not parse: ${(parseErr as Error).message}`,\n\t\t\t\t\t...extra,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn parseHeader(raw, step);\n\t}\n\n\t/**\n\t * Prove `value` at `path` in `tip`'s state, fetching the header of every\n\t * ancestor trie the proof crosses.\n\t */\n\tprivate async proveAt(\n\t\ttip: StacksHeader,\n\t\tpath: Bytes,\n\t\tvalue: Bytes,\n\t\tproof: Bytes,\n\t\tstep: VerifyStep,\n\t\textra: Partial<VerifyFailure> = {},\n\t): Promise<boolean> {\n\t\tconst headers = [tip];\n\t\tfor (const id of marfProofAncestors(proof))\n\t\t\theaders.push(await this.header(id, step, extra));\n\t\treturn verifyMarfProof({\n\t\t\tproof,\n\t\t\tpath,\n\t\t\tvalue,\n\t\t\troot: tip.stateIndexRoot,\n\t\t\theaders,\n\t\t});\n\t}\n\n\t/**\n\t * The parent's own trie leaves, from its witness checked against the\n\t * parent header. Optional evidence: when the source cannot serve it,\n\t * carried leaves fall back to per-leaf proofs (named) or stay unlabeled.\n\t */\n\tprivate async parentLeaves(\n\t\tparentId: string,\n\t\tnotes: string[],\n\t): Promise<WitnessLeaf[] | undefined> {\n\t\ttry {\n\t\t\tconst parent = await this.header(parentId, \"names\");\n\t\t\tconst w = parseWitness(await this.source.getWitness(parentId));\n\t\t\tif (bytesEqual(w.root, parent.stateIndexRoot)) return w.leaves;\n\t\t\tnotes.push(`parent witness ${parentId} root does not match its header`);\n\t\t} catch (err) {\n\t\t\tnotes.push(\n\t\t\t\t`parent witness ${parentId} unavailable: ${(err as Error).message}`,\n\t\t\t);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * A carried leaf holds the parent's value. The parent header is\n\t * authenticated by hash: its id is committed in the authenticated child\n\t * (its header, or for 2.x its own trie).\n\t */\n\tprivate async parentHolds(\n\t\tparentId: string,\n\t\tleaf: WitnessLeaf,\n\t): Promise<boolean> {\n\t\tconst parent = await this.header(parentId, \"names\");\n\t\tconst pathHex = hex(leaf.path);\n\t\tconst answer = await fetchFor(\"names\", `MARF ${pathHex} at parent`, () =>\n\t\t\tthis.source.getMarfProof(pathHex, parentId),\n\t\t);\n\t\tif (!answer) return false;\n\t\tconst value = new Uint8Array(MARF_VALUE_SIZE);\n\t\tvalue.set(leaf.valueHash);\n\t\treturn this.proveAt(parent, leaf.path, value, answer.proof, \"names\");\n\t}\n\n\t/** Consensus hash -> PoW-verified burn block, via the sortition preimage. */\n\tprivate async bindBurn(\n\t\theader: StacksHeader,\n\t\tstep: VerifyStep,\n\t\textra: Partial<VerifyFailure> = {},\n\t): Promise<{ burnHeight: number; hash: string }> {\n\t\tconst ch = hex(header.consensusHash);\n\t\tconst known = this.burns.get(ch);\n\t\tif (known) return known;\n\t\tconst bp = await fetchFor(\n\t\t\tstep,\n\t\t\t`burn preimage ${ch}`,\n\t\t\t() => this.preimage(ch),\n\t\t\textra,\n\t\t);\n\t\tconst hash = verifyConsensusPreimage(header.consensusHash, bp.preimage);\n\t\tif (!hash)\n\t\t\treturn fail({\n\t\t\t\tstep,\n\t\t\t\tcode: \"preimage-mismatch\",\n\t\t\t\tmessage: `preimage does not hash to consensus hash ${ch}`,\n\t\t\t\t...extra,\n\t\t\t});\n\t\tif (bp.burnHeight < this.chain.checkpointHeight)\n\t\t\tfail({\n\t\t\t\tstep,\n\t\t\t\tcode: \"before-checkpoint\",\n\t\t\t\tmessage: `burn height ${bp.burnHeight} is below the Bitcoin checkpoint ${this.chain.checkpointHeight}`,\n\t\t\t\t...extra,\n\t\t\t});\n\t\tawait this.syncBitcoin(bp.burnHeight);\n\t\tconst burnHeight = this.chain.heightOf(hash);\n\t\tif (burnHeight === undefined)\n\t\t\treturn fail({\n\t\t\t\tstep,\n\t\t\t\tcode: \"burn-not-in-chain\",\n\t\t\t\tmessage: `burn block ${hash} is not in the verified Bitcoin chain (synced ${this.chain.checkpointHeight}..${this.chain.tip.height})`,\n\t\t\t\t...extra,\n\t\t\t});\n\t\tconst bound = { burnHeight, hash };\n\t\tthis.burns.set(ch, bound);\n\t\treturn bound;\n\t}\n\n\t/** Extend the Bitcoin chain to `height`, validating PoW, retarget and MTP. */\n\tprivate async syncBitcoin(height: number): Promise<void> {\n\t\twhile (this.chain.tip.height < height) {\n\t\t\tconst from = this.chain.tip.height + 1;\n\t\t\tconst count = Math.min(BITCOIN_BATCH, height - from + 1);\n\t\t\tconst headers = await fetchFor(\"bitcoin\", `bitcoin headers ${from}`, () =>\n\t\t\t\tthis.source.getBitcoinHeaders(from, count),\n\t\t\t);\n\t\t\tif (headers.length === 0)\n\t\t\t\tfail({\n\t\t\t\t\tstep: \"bitcoin\",\n\t\t\t\t\tcode: \"unavailable\",\n\t\t\t\t\tmessage: `source has no Bitcoin headers from ${from}`,\n\t\t\t\t});\n\t\t\ttry {\n\t\t\t\tthis.chain.append(headers);\n\t\t\t} catch (err) {\n\t\t\t\tif (!(err instanceof HeaderValidationError)) throw err;\n\t\t\t\tfail({ step: \"bitcoin\", code: \"invalid-header\", message: err.message });\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * The proven signer set for `cycle`. Walks forward from the checkpoint:\n\t * set c+1 is read from an anchor block in c+1's prepare phase, whose\n\t * header set c signed.\n\t */\n\tprivate async signerSet(\n\t\tcycle: number,\n\t\ttarget: SearchPoint,\n\t): Promise<SignerSet> {\n\t\tconst known = this.sets.get(cycle);\n\t\tif (known) return known;\n\t\tconst first = this.checkpoint.stacks.cycle;\n\t\tif (cycle < first)\n\t\t\tfail({\n\t\t\t\tstep: \"signer-set\",\n\t\t\t\tcode: \"before-checkpoint\",\n\t\t\t\tmessage: `cycle ${cycle} precedes the checkpoint's cycle ${first}`,\n\t\t\t\tcycle,\n\t\t\t});\n\t\tlet lo = await this.startPoint();\n\t\tfor (let c = first; c < cycle; c++) {\n\t\t\tconst next = this.sets.get(c + 1);\n\t\t\tif (next) {\n\t\t\t\tlo = this.anchors.get(c + 1) ?? lo;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst anchor = await this.locateAnchor(c + 1, lo, target);\n\t\t\tthis.sets.set(c + 1, await this.proveNextSet(c + 1, anchor));\n\t\t\tthis.anchors.set(c + 1, anchor);\n\t\t\tlo = anchor;\n\t\t}\n\t\treturn this.sets.get(cycle) as SignerSet;\n\t}\n\n\t/** The checkpoint block as a search bound; its burn height is a source hint. */\n\tprivate async startPoint(): Promise<SearchPoint> {\n\t\tconst { header } = this.start;\n\t\tconst height = Number(header.chainLength);\n\t\ttry {\n\t\t\treturn { height, burn: await this.burnHint(header) };\n\t\t} catch {\n\t\t\treturn { height };\n\t\t}\n\t}\n\n\tprivate async burnHint(header: StacksHeader): Promise<number> {\n\t\tconst ch = hex(header.consensusHash);\n\t\treturn (\n\t\t\tthis.burns.get(ch)?.burnHeight ?? (await this.preimage(ch)).burnHeight\n\t\t);\n\t}\n\n\tprivate async preimage(ch: string): Promise<BurnPreimage> {\n\t\tlet bp = this.preimages.get(ch);\n\t\tif (!bp) {\n\t\t\tbp = await this.source.getBurnPreimage(ch);\n\t\t\tthis.preimages.set(ch, bp);\n\t\t}\n\t\treturn bp;\n\t}\n\n\tprivate async locateAnchor(\n\t\tcycle: number,\n\t\tlo: SearchPoint,\n\t\thi: SearchPoint,\n\t): Promise<Probe> {\n\t\tconst start = cycleStart(cycle);\n\t\tconst window = [start - MAINNET_PREPARE_LENGTH, start] as const;\n\t\tconst probe = async (h: number): Promise<Probe> => {\n\t\t\tconst raw = await fetchFor(\n\t\t\t\t\"signer-set\",\n\t\t\t\t`block at height ${h}`,\n\t\t\t\t() => this.source.getBlock(h),\n\t\t\t\t{ cycle },\n\t\t\t);\n\t\t\tconst header = parseHeader(raw, \"signer-set\");\n\t\t\tconst id = hex(blockId(header));\n\t\t\tthis.headers.set(id, header);\n\t\t\tconst burn = await fetchFor(\n\t\t\t\t\"signer-set\",\n\t\t\t\t`burn hint for block ${id}`,\n\t\t\t\t() => this.burnHint(header),\n\t\t\t\t{ cycle, blockId: id },\n\t\t\t);\n\t\t\treturn { height: Number(header.chainLength), burn, header, id };\n\t\t};\n\t\tconst anchor = await findAnchor(lo, hi, window, probe);\n\t\tif (!anchor)\n\t\t\treturn fail({\n\t\t\t\tstep: \"signer-set\",\n\t\t\t\tcode: \"anchor-not-found\",\n\t\t\t\tmessage: `no block with a burn height in ${window[0]}..${window[1] - 1} (cycle ${cycle} prepare phase) between heights ${lo.height} and ${hi.height}`,\n\t\t\t\tcycle,\n\t\t\t});\n\t\treturn anchor;\n\t}\n\n\t/**\n\t * Set `cycle` from `anchor`: the anchor must be bound to a burn block in\n\t * `cycle`'s prepare phase, be signed by the set of the cycle that burn\n\t * height dictates (`cycle - 1`), and hold set `cycle` in its state (MARF\n\t * proof). Adjacent sets overlap enough that one block can clear both, so\n\t * the set is always chosen by proven burn height, never by which passes.\n\t */\n\tprivate async proveNextSet(cycle: number, anchor: Probe): Promise<SignerSet> {\n\t\tconst at = { cycle, blockId: anchor.id };\n\t\tconst { burnHeight } = await this.bindBurn(anchor.header, \"signer-set\", at);\n\t\tconst start = cycleStart(cycle);\n\t\tif (burnHeight < start - MAINNET_PREPARE_LENGTH || burnHeight >= start)\n\t\t\tfail({\n\t\t\t\tstep: \"signer-set\",\n\t\t\t\tcode: \"anchor-outside-window\",\n\t\t\t\tmessage: `anchor burn height ${burnHeight} is outside cycle ${cycle}'s prepare phase ${start - MAINNET_PREPARE_LENGTH}..${start - 1}`,\n\t\t\t\t...at,\n\t\t\t});\n\t\tconst signing = rewardCycle(burnHeight);\n\t\tconst sig = verifySignerSignatures(\n\t\t\tanchor.header,\n\t\t\tthis.sets.get(signing) as SignerSet,\n\t\t);\n\t\tif (!sig.valid)\n\t\t\tfail({\n\t\t\t\t...signatureFailure(sig, \"signer-set\", signing),\n\t\t\t\t...at,\n\t\t\t\tcode: \"anchor-unsigned\",\n\t\t\t});\n\n\t\tconst path = marfPath(\n\t\t\tmapEntryKey(SIGNERS_CONTRACT, \"cycle-signer-set\", uintCV(cycle)),\n\t\t);\n\t\tconst answer = await fetchFor(\n\t\t\t\"signer-set\",\n\t\t\t`signer set ${cycle} at ${anchor.id}`,\n\t\t\t() => this.source.getMarfProof(hex(path), anchor.id),\n\t\t\tat,\n\t\t);\n\t\tconst value = answer?.data.replace(/^0x/, \"\") ?? \"\";\n\t\tconst proven =\n\t\t\tanswer !== null &&\n\t\t\t(await this.proveAt(\n\t\t\t\tanchor.header,\n\t\t\t\tpath,\n\t\t\t\tmarfValue(value),\n\t\t\t\tanswer.proof,\n\t\t\t\t\"signer-set\",\n\t\t\t\tat,\n\t\t\t));\n\t\tif (!proven)\n\t\t\tfail({\n\t\t\t\tstep: \"signer-set\",\n\t\t\t\tcode: \"set-proof-invalid\",\n\t\t\t\tmessage: `signer set ${cycle} is not proven in anchor ${anchor.id}'s state`,\n\t\t\t\t...at,\n\t\t\t});\n\t\tlet set: SignerSet;\n\t\ttry {\n\t\t\tset = decodeSignerSet(value);\n\t\t} catch (err) {\n\t\t\treturn fail({\n\t\t\t\tstep: \"signer-set\",\n\t\t\t\tcode: \"set-proof-invalid\",\n\t\t\t\tmessage: `signer set ${cycle}: ${(err as Error).message}`,\n\t\t\t\t...at,\n\t\t\t});\n\t\t}\n\t\treturn set;\n\t}\n}\n\n/** The authenticated header's identity fields, for callers that rebuild the block. */\nfunction describeHeader(header: StacksHeader, out: BlockVerification): void {\n\tout.stateRoot = hex(header.stateIndexRoot);\n\tout.consensusHash = hex(header.consensusHash);\n\tif (!isEpoch2Header(header)) {\n\t\tout.blockHash = hex(signerSignatureHash(header));\n\t\tout.timestamp = Number(header.timestamp);\n\t}\n}\n\nfunction parseHeader(raw: Bytes, step: VerifyStep): NakamotoHeader {\n\ttry {\n\t\treturn parseNakamotoHeader(raw);\n\t} catch (err) {\n\t\treturn fail({\n\t\t\tstep,\n\t\t\tcode: \"invalid-header\",\n\t\t\tmessage: `block bytes do not parse: ${(err as Error).message}`,\n\t\t});\n\t}\n}\n\n/**\n * A 2.x header commits only to its parent's block hash; the parent's id is in\n * the block's own trie at `__MARF_BLOCK_HEIGHT_TO_HASH::<height - 1>`. Read\n * from a witness whose root matches the header, else null.\n */\nfunction epoch2ParentId(witness: Bytes, header: Epoch2Header): Bytes | null {\n\tconst height = Number(header.chainLength);\n\tif (height === 0) return null;\n\ttry {\n\t\tconst w = parseWitness(witness);\n\t\tif (!bytesEqual(w.root, header.stateIndexRoot)) return null;\n\t\tconst path = marfPath(heightToHashKey(height - 1));\n\t\treturn w.leaves.find((l) => bytesEqual(l.path, path))?.valueHash ?? null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction signatureFailure(\n\tsig: ReturnType<typeof verifySignerSignatures>,\n\tstep: VerifyStep,\n\tcycle: number,\n): VerifyFailure {\n\tconst weight = `${sig.signedWeight}/${sig.totalWeight} signed, threshold ${sig.threshold}`;\n\tif (sig.unknown.length)\n\t\treturn {\n\t\t\tstep,\n\t\t\tcode: \"unknown-signer\",\n\t\t\tmessage: `${sig.unknown.length} signer(s) not in cycle ${cycle}'s set (${weight})`,\n\t\t\tcycle,\n\t\t};\n\tif (sig.duplicates.length)\n\t\treturn {\n\t\t\tstep,\n\t\t\tcode: \"duplicate-signer\",\n\t\t\tmessage: `${sig.duplicates.length} duplicate signature(s) (${weight})`,\n\t\t\tcycle,\n\t\t};\n\tif (sig.invalid)\n\t\treturn {\n\t\t\tstep,\n\t\t\tcode: \"bad-signature\",\n\t\t\tmessage: `${sig.invalid} signature(s) do not recover (${weight})`,\n\t\t\tcycle,\n\t\t};\n\treturn {\n\t\tstep,\n\t\tcode: \"below-threshold\",\n\t\tmessage: `cycle ${cycle} signers: ${weight}`,\n\t\tcycle,\n\t};\n}\n\n/** One-shot: verify a block from a checkpoint (MAINNET_CHECKPOINT by default). */\nexport const verifyBlock = (\n\tref: string | number,\n\topts: VerifyOptions,\n): Promise<BlockVerification> => new BlockVerifier(opts).verify(ref);\n"
|
|
19
|
+
"import { unhex } from \"./bytes.ts\";\nimport type { VerifyCheckpoint } from \"./checkpoint.ts\";\nimport { parseNakamotoHeader } from \"./header.ts\";\nimport type { BlockVerification, VerifyStep } from \"./verify-block.ts\";\n\nexport type LinkStatus = \"ok\" | \"failed\" | \"skipped\";\n\nexport interface LinkLine {\n\tstep: VerifyStep;\n\tlabel: string;\n\tstatus: LinkStatus;\n\t/** What the link proved, why it failed, or why it was not checked. */\n\tdetail: string;\n}\n\n/** The chain of links, in the order verifyBlock walks them. */\nexport const LINKS: readonly { step: VerifyStep; label: string }[] = [\n\t{ step: \"ancestry\", label: \"ancestry\" },\n\t{ step: \"block\", label: \"block\" },\n\t{ step: \"bitcoin\", label: \"bitcoin\" },\n\t{ step: \"burn\", label: \"burn\" },\n\t{ step: \"signer-set\", label: \"cycle\" },\n\t{ step: \"signatures\", label: \"signatures\" },\n\t{ step: \"txs\", label: \"txs\" },\n\t{ step: \"witness\", label: \"state root\" },\n\t{ step: \"names\", label: \"diff\" },\n\t{ step: \"rows\", label: \"rows\" },\n];\n\nconst n = (v: number | bigint) => v.toLocaleString(\"en-US\");\n\n/** What each link proved, for the human view. */\nfunction linkDetail(\n\tstep: VerifyStep,\n\tr: BlockVerification,\n\tcp: VerifyCheckpoint,\n): string {\n\tswitch (step) {\n\t\tcase \"ancestry\": {\n\t\t\tconst a = r.ancestry;\n\t\t\tif (!a) return \"\";\n\t\t\tconst checkpoint = parseNakamotoHeader(unhex(cp.stacks.header));\n\t\t\tconst start =\n\t\t\t\ta.fromHeight === Number(checkpoint.chainLength)\n\t\t\t\t\t? `the checkpoint ${n(a.fromHeight)}`\n\t\t\t\t\t: `block ${n(a.fromHeight)}`;\n\t\t\treturn a.via === \"marf\"\n\t\t\t\t? `${n(r.height ?? 0)} proven in the state of ${start} (one MARF proof)`\n\t\t\t\t: `${n(r.height ?? 0)} reached from ${start} by parent links`;\n\t\t}\n\t\tcase \"block\":\n\t\t\treturn `${n(r.height ?? 0)} ${r.blockId}`;\n\t\tcase \"bitcoin\":\n\t\t\treturn `headers ${n(cp.bitcoin.height)}..${n(r.burnHeight ?? 0)}, proof-of-work and retargets checked`;\n\t\tcase \"burn\":\n\t\t\treturn `height ${n(r.burnHeight ?? 0)} ${r.bitcoinBlockHash}`;\n\t\tcase \"signer-set\":\n\t\t\treturn r.cycle === cp.stacks.cycle\n\t\t\t\t? `${r.cycle}, the checkpoint's own signer set`\n\t\t\t\t: `${r.cycle}, signer set proven forward from checkpoint cycle ${cp.stacks.cycle}`;\n\t\tcase \"signatures\":\n\t\t\treturn `${n(r.signerWeight ?? 0n)} / ${n(r.totalWeight ?? 0n)} weight signed, threshold ${n(r.threshold ?? 0n)}`;\n\t\tcase \"txs\":\n\t\t\treturn `${n(r.transactions?.length ?? 0)} transactions match the tx merkle root`;\n\t\tcase \"witness\":\n\t\t\treturn `${r.stateRoot} matches the witness`;\n\t\tcase \"names\": {\n\t\t\tconst d = r.diff;\n\t\t\tif (!d) return \"\";\n\t\t\tconst named = d.writes.filter((w) => w.named).length;\n\t\t\tconst written = named\n\t\t\t\t? `${d.writes.length} written (${named} named, ${d.writes.length - named} unnamed)`\n\t\t\t\t: `${d.writes.length} written (unnamed)`;\n\t\t\treturn `${written}, ${d.carried.length} carried, ${d.internal.length} internal`;\n\t\t}\n\t\tcase \"rows\":\n\t\t\treturn `${n(r.rowsChecked ?? 0)} vm_events rows match the diff`;\n\t}\n}\n\n/**\n * Links a block below the checkpoint skips: its id is pinned by hash from a\n * trusted descendant, so no signer set or signatures; the burn block is bound\n * only when the synced Bitcoin chain reaches it.\n */\nfunction notNeeded(step: VerifyStep, r: BlockVerification): boolean {\n\tif (!r.ancestry) return false;\n\tif (step === \"bitcoin\" || step === \"burn\") return r.burnHeight === undefined;\n\treturn step === \"signer-set\" || step === \"signatures\";\n}\n\n/**\n * One line per link, then the verdict: the human view of a verification,\n * shared by the CLI and the browser checker. Ancestry appears only below the\n * checkpoint. `rows` says whether the caller asked for the rows link.\n */\nexport function describeLinks(\n\tr: BlockVerification,\n\tcp: VerifyCheckpoint,\n\topts: { rows?: boolean } = {},\n): { lines: LinkLine[]; verdict: { ok: boolean; text: string } } {\n\tconst first = r.failures[0];\n\tconst broken = first\n\t\t? LINKS.findIndex((l) => l.step === first.step)\n\t\t: LINKS.length;\n\tconst lines: LinkLine[] = [];\n\tfor (const [i, link] of LINKS.entries()) {\n\t\tconst { step, label } = link;\n\t\tconst failure = r.failures.find((f) => f.step === step);\n\t\t// Ancestry is a link only below the checkpoint.\n\t\tif (step === \"ancestry\" && !failure && !r.ancestry) continue;\n\t\tconst skipped = (detail: string): LinkLine => ({\n\t\t\tstep,\n\t\t\tlabel,\n\t\t\tstatus: \"skipped\",\n\t\t\tdetail,\n\t\t});\n\t\tif (failure)\n\t\t\tlines.push({ step, label, status: \"failed\", detail: failure.message });\n\t\telse if (step === \"rows\" && !opts.rows)\n\t\t\tlines.push(skipped(\"not checked (pass --rows)\"));\n\t\telse if (i > broken)\n\t\t\tlines.push(skipped(\"not checked: an earlier link is broken\"));\n\t\telse if (notNeeded(step, r))\n\t\t\tlines.push(\n\t\t\t\tskipped(\"not needed: the block is hash-chained to the checkpoint\"),\n\t\t\t);\n\t\telse if (step === \"rows\" && r.rowsChecked === undefined)\n\t\t\tlines.push(skipped(\"not checked: the source serves no indexed rows\"));\n\t\telse if (step === \"txs\" && r.transactions === undefined)\n\t\t\tlines.push(\n\t\t\t\tskipped(\n\t\t\t\t\t\"not checked: no transaction bytes (epoch 2.x, or the source served the header only)\",\n\t\t\t\t),\n\t\t\t);\n\t\telse\n\t\t\tlines.push({\n\t\t\t\tstep,\n\t\t\t\tlabel,\n\t\t\t\tstatus: \"ok\",\n\t\t\t\tdetail: linkDetail(step, r, cp),\n\t\t\t});\n\t}\n\n\tif (!first) {\n\t\tconst from = n(parseNakamotoHeader(unhex(cp.stacks.header)).chainLength);\n\t\treturn {\n\t\t\tlines,\n\t\t\tverdict: {\n\t\t\t\tok: true,\n\t\t\t\ttext: `Block ${n(r.height ?? 0)} is proven. Trusted: only the checkpoint (Stacks ${from}, Bitcoin ${n(cp.bitcoin.height)}).`,\n\t\t\t},\n\t\t};\n\t}\n\tconst label = LINKS[broken]?.label ?? first.step;\n\treturn {\n\t\tlines,\n\t\tverdict: {\n\t\t\tok: false,\n\t\t\ttext:\n\t\t\t\tfirst.code === \"unavailable\"\n\t\t\t\t\t? `Could not check the ${label} link: the source could not serve it.`\n\t\t\t\t\t: `Not proven: the ${label} link is broken.`,\n\t\t},\n\t};\n}\n",
|
|
20
|
+
"// verifyBlock: the end-to-end trustless check for one Stacks block.\n//\n// At or above the checkpoint, forward:\n// checkpoint ─▶ bitcoin headers (PoW) ─▶ burn height ─▶ cycle ─▶ signer set[cycle] (MARF-proven)\n// ─▶ header N (signatures ≥ 70%) ─▶ txs N (tx merkle root) ─▶ witness N (root)\n// ─▶ named diff ─▶ indexed rows\n//\n// Below it, backward: a trusted descendant's id commits to every ancestor by\n// hash, so no signatures are needed:\n// checkpoint ─▶ id N (parent links, or one MARF proof of __MARF_BLOCK_HEIGHT_TO_HASH::N)\n// ─▶ header N (hashes to id N) ─▶ txs N ─▶ witness N (root) ─▶ named diff ─▶ indexed rows\n//\n// Every input comes from an untrusted ProofSource; only the checkpoint is trusted.\nimport { uintCV } from \"@secondlayer/stacks/clarity\";\nimport { HeaderChain, HeaderValidationError } from \"./bitcoin/chain.ts\";\nimport {\n\tMAINNET_PREPARE_LENGTH,\n\tcycleStart,\n\trewardCycle,\n\tverifyConsensusPreimage,\n} from \"./burn.ts\";\nimport { type Bytes, bytesEqual, hex, unhex } from \"./bytes.ts\";\nimport { MAINNET_CHECKPOINT, type VerifyCheckpoint } from \"./checkpoint.ts\";\nimport {\n\ttype Epoch2Header,\n\ttype NakamotoHeader,\n\ttype StacksHeader,\n\tblockId,\n\tisEpoch2Header,\n\tparseEpoch2Header,\n\tparseNakamotoHeader,\n\tsignerSignatureHash,\n} from \"./header.ts\";\nimport { mapEntryKey } from \"./keys.ts\";\nimport {\n\tMARF_VALUE_SIZE,\n\theightToHashKey,\n\tmarfPath,\n\tmarfProofAncestors,\n\tmarfProofValue,\n\tmarfValue,\n\tverifyMarfProof,\n} from \"./marf.ts\";\nimport {\n\tSIGNERS_CONTRACT,\n\ttype SignerSet,\n\tdecodeSignerSet,\n\tverifySignerSignatures,\n} from \"./signers.ts\";\nimport type { BurnPreimage, ProofSource, StateWrite } from \"./source.ts\";\nimport {\n\ttype ProvenDiff,\n\ttype StateFailureCode,\n\tverifyBlockState,\n} from \"./state.ts\";\nimport {\n\ttype BlockTransaction,\n\tTransactionsError,\n\tblockTransactions,\n} from \"./txs.ts\";\nimport { type WitnessLeaf, parseWitness } from \"./witness.ts\";\n\nexport type VerifyStep =\n\t| \"ancestry\"\n\t| \"block\"\n\t| \"bitcoin\"\n\t| \"burn\"\n\t| \"signer-set\"\n\t| \"signatures\"\n\t| \"txs\"\n\t| \"witness\"\n\t| \"names\"\n\t| \"rows\";\n\nexport type VerifyFailureCode =\n\t| StateFailureCode\n\t/** The source could not serve something the step needs. */\n\t| \"unavailable\"\n\t| \"id-mismatch\"\n\t/** The block's transactions do not hash to its header's tx_merkle_root. */\n\t| \"tx-root-mismatch\"\n\t| \"height-mismatch\"\n\t| \"invalid-header\"\n\t| \"preimage-mismatch\"\n\t| \"burn-not-in-chain\"\n\t| \"before-checkpoint\"\n\t/** The block is not the checkpoint chain's block at its height. */\n\t| \"not-ancestor\"\n\t| \"ancestry-proof-invalid\"\n\t| \"anchor-not-found\"\n\t| \"anchor-outside-window\"\n\t| \"anchor-unsigned\"\n\t| \"set-proof-invalid\"\n\t| \"below-threshold\"\n\t| \"unknown-signer\"\n\t| \"duplicate-signer\"\n\t| \"bad-signature\";\n\nexport interface VerifyFailure {\n\tstep: VerifyStep;\n\tcode: VerifyFailureCode;\n\tmessage: string;\n\t/** Reward cycle being proven (signer-set step). */\n\tcycle?: number;\n\t/** Block the failure is about, when not the target. */\n\tblockId?: string;\n\tkey?: string;\n\tpath?: string;\n\tordinal?: number;\n}\n\n/** How a block below the checkpoint was tied to it. */\nexport interface Ancestry {\n\t/** Trusted descendant it was proven from: the checkpoint, or a block proven below it earlier. */\n\tfromHeight: number;\n\tfromBlockId: string;\n\t/**\n\t * `parents`: each header hashes to the parent id its child commits to.\n\t * `marf`: one MARF proof of `__MARF_BLOCK_HEIGHT_TO_HASH::<height>` against\n\t * the descendant's state root.\n\t */\n\tvia: \"parents\" | \"marf\";\n}\n\nexport interface BlockVerification {\n\t/**\n\t * Every step passed. At or above the checkpoint: header, burn binding,\n\t * signatures, state root, names and rows. Below it: ancestry, header,\n\t * state root, names and rows (and the burn binding when Bitcoin reaches it).\n\t */\n\tok: boolean;\n\theight?: number;\n\tblockId?: string;\n\t/** Nakamoto block hash (the header's signer sighash), hex. Absent for epoch 2.x. */\n\tblockHash?: string;\n\t/** The header's consensus hash, hex. */\n\tconsensusHash?: string;\n\t/** Nakamoto header timestamp, Unix seconds. Absent for epoch 2.x. */\n\ttimestamp?: number;\n\t/** The header's state_index_root, hex: what the witness must hash to. */\n\tstateRoot?: string;\n\t/** Set for blocks below the checkpoint, which need no signatures. */\n\tancestry?: Ancestry;\n\tcycle?: number;\n\tburnHeight?: number;\n\t/** Display-order hex. */\n\tbitcoinBlockHash?: string;\n\tsignerWeight?: bigint;\n\ttotalWeight?: bigint;\n\tthreshold?: bigint;\n\t/**\n\t * The block's transactions, checked against the header's tx_merkle_root.\n\t * Absent for epoch 2.x blocks and when the source served the header only.\n\t */\n\ttransactions?: BlockTransaction[];\n\tdiff?: ProvenDiff;\n\t/** Every state_writes row the names step checked, in ordinal order. */\n\twrites?: StateWrite[];\n\t/** vm_events rows proven against the diff. */\n\trowsChecked?: number;\n\tnotes: string[];\n\t/** Empty when ok. The first entry is the first broken link. */\n\tfailures: VerifyFailure[];\n}\n\nexport interface VerifyOptions {\n\tsource: ProofSource;\n\t/** Defaults to MAINNET_CHECKPOINT. */\n\tcheckpoint?: VerifyCheckpoint;\n\t/**\n\t * Also prove the block's indexed vm_events rows against its diff: reads\n\t * the source's `getVmEvents`, which bill as Index rows on the Secondlayer\n\t * API. Off by default. Naming the diff's writes (`getStateWrites`, free on\n\t * `/v1/proofs`) is always on when the source has them.\n\t */\n\trows?: boolean;\n\t/**\n\t * Called once per link as it passes, in the order the verifier proves them.\n\t * Failures arrive in the result, not here.\n\t */\n\tonStep?: (step: VerifyStep) => void;\n}\n\nclass Broken extends Error {\n\tconstructor(readonly failure: VerifyFailure) {\n\t\tsuper(failure.message);\n\t}\n}\n\nconst fail = (f: VerifyFailure): never => {\n\tthrow new Broken(f);\n};\n\n/** Run a source call; a throw becomes an `unavailable` failure of `step`. */\nasync function fetchFor<T>(\n\tstep: VerifyStep,\n\twhat: string,\n\tcall: () => Promise<T>,\n\textra: Partial<VerifyFailure> = {},\n): Promise<T> {\n\ttry {\n\t\treturn await call();\n\t} catch (err) {\n\t\tif (err instanceof Broken) throw err;\n\t\treturn fail({\n\t\t\tstep,\n\t\t\tcode: \"unavailable\",\n\t\t\tmessage: `${what}: ${(err as Error).message}`,\n\t\t\t...extra,\n\t\t});\n\t}\n}\n\nconst BITCOIN_BATCH = 2016;\n/**\n * Below the checkpoint, ancestors this close to a trusted block are reached by\n * parent links (one block fetch each); farther ones by one MARF proof, which\n * costs the proof plus a header per ancestor trie it crosses.\n */\nconst MAX_WALK = 16;\n\n/** A block position for the anchor search; `burn` is a source hint. */\nexport interface SearchPoint {\n\theight: number;\n\tburn?: number;\n}\n\n/**\n * Find a block whose burn height lies in `[window[0], window[1])`, between\n * `lo` and `hi` (exclusive). Interpolates on burn height, falling back to\n * bisection whenever a probe fails to halve the bracket. Burn heights here\n * are unproven hints: the caller authenticates whatever this returns.\n */\nexport async function findAnchor<T extends SearchPoint & { burn: number }>(\n\tlow: SearchPoint,\n\thigh: SearchPoint,\n\twindow: readonly [number, number],\n\tprobe: (height: number) => Promise<T>,\n\tmaxProbes = 32,\n): Promise<T | null> {\n\tlet [lo, hi] = [low, high];\n\tconst target = (window[0] + window[1]) / 2;\n\tlet bisect = false;\n\tfor (let i = 0; i < maxProbes; i++) {\n\t\tconst span = hi.height - lo.height;\n\t\tif (span <= 1) return null;\n\t\tlet h = Math.floor((lo.height + hi.height) / 2);\n\t\tif (\n\t\t\t!bisect &&\n\t\t\tlo.burn !== undefined &&\n\t\t\thi.burn !== undefined &&\n\t\t\thi.burn > lo.burn\n\t\t)\n\t\t\th =\n\t\t\t\tlo.height +\n\t\t\t\tMath.round(((target - lo.burn) * span) / (hi.burn - lo.burn));\n\t\th = Math.min(Math.max(h, lo.height + 1), hi.height - 1);\n\t\tconst p = await probe(h);\n\t\tif (p.height <= lo.height || p.height >= hi.height) return null;\n\t\tif (p.burn >= window[0] && p.burn < window[1]) return p;\n\t\tif (p.burn < window[0]) lo = p;\n\t\telse hi = p;\n\t\tbisect = hi.height - lo.height > span / 2;\n\t}\n\treturn null;\n}\n\ninterface Probe extends SearchPoint {\n\tburn: number;\n\theader: NakamotoHeader;\n\tid: string;\n}\n\n/**\n * Verifies blocks from one checkpoint against one source, caching the Bitcoin\n * header chain, proven signer sets and fetched headers across calls.\n */\nexport class BlockVerifier {\n\tprivate readonly source: ProofSource;\n\tprivate readonly checkpoint: VerifyCheckpoint;\n\tprivate readonly rows: boolean;\n\tprivate readonly onStep?: (step: VerifyStep) => void;\n\tprivate readonly chain: HeaderChain;\n\t/** Proven signer sets by cycle. */\n\tprivate readonly sets = new Map<number, SignerSet>();\n\t/** Where each proven set was anchored: the lower bound for the next search. */\n\tprivate readonly anchors = new Map<number, SearchPoint>();\n\t/** Headers fetched by id, each checked to hash to it. */\n\tprivate readonly headers = new Map<string, StacksHeader>();\n\t/** Blocks proven on the checkpoint's chain below it, by height. */\n\tprivate readonly below = new Map<\n\t\tnumber,\n\t\t{ id: string; ancestry: Ancestry }\n\t>();\n\tprivate readonly burns = new Map<\n\t\tstring,\n\t\t{ burnHeight: number; hash: string }\n\t>();\n\t/** Unverified source answers by consensus hash. */\n\tprivate readonly preimages = new Map<string, BurnPreimage>();\n\t/** Raw bytes of the last few blocks fetched, so the txs step reuses the\n\t * block an ancestry walk just read. Bounded: blocks can be megabytes. */\n\tprivate readonly raws = new Map<string, Bytes>();\n\tprivate readonly start: { header: NakamotoHeader; id: string };\n\n\tconstructor(opts: VerifyOptions) {\n\t\tthis.source = opts.source;\n\t\tthis.checkpoint = opts.checkpoint ?? MAINNET_CHECKPOINT;\n\t\tthis.rows = opts.rows ?? false;\n\t\tthis.onStep = opts.onStep;\n\t\tconst { stacks } = this.checkpoint;\n\t\tconst header = parseNakamotoHeader(unhex(stacks.header));\n\t\tthis.start = { header, id: hex(blockId(header)) };\n\t\tthis.headers.set(this.start.id, header);\n\t\tthis.sets.set(stacks.cycle, decodeSignerSet(stacks.signerSet));\n\t\tthis.chain = HeaderChain.fromCheckpoint(this.checkpoint.bitcoin);\n\t}\n\n\t/** Verify one block by id (hex) or height. Never throws for bad source data. */\n\tasync verify(ref: string | number): Promise<BlockVerification> {\n\t\tconst out: BlockVerification = { ok: false, notes: [], failures: [] };\n\t\ttry {\n\t\t\tawait this.run(ref, out);\n\t\t} catch (err) {\n\t\t\tif (!(err instanceof Broken)) throw err;\n\t\t\tout.failures.unshift(err.failure);\n\t\t}\n\t\tout.ok = out.failures.length === 0;\n\t\treturn out;\n\t}\n\n\t/** Report a passed link. A throwing callback must not break verification. */\n\tprivate passed(step: VerifyStep): void {\n\t\ttry {\n\t\t\tthis.onStep?.(step);\n\t\t} catch {}\n\t}\n\n\tprivate async run(\n\t\tref: string | number,\n\t\tout: BlockVerification,\n\t): Promise<void> {\n\t\tconst start = Number(this.start.header.chainLength);\n\t\tif (typeof ref === \"number\" && ref < start)\n\t\t\treturn this.runBelow(ref, undefined, out);\n\t\tlet header: StacksHeader;\n\t\tif (typeof ref === \"string\") {\n\t\t\tconst id = ref.replace(/^0x/, \"\").toLowerCase();\n\t\t\theader = await this.header(id, \"block\");\n\t\t\tconst height = Number(header.chainLength);\n\t\t\tif (height < start) return this.runBelow(height, id, out);\n\t\t\tif (isEpoch2Header(header))\n\t\t\t\tfail({\n\t\t\t\t\tstep: \"block\",\n\t\t\t\t\tcode: \"invalid-header\",\n\t\t\t\t\tmessage: `epoch 2.x block ${id} claims height ${height}, at or above the checkpoint`,\n\t\t\t\t});\n\t\t} else {\n\t\t\tconst raw = await fetchFor(\"block\", `block ${ref}`, () =>\n\t\t\t\tthis.source.getBlock(ref),\n\t\t\t);\n\t\t\theader = parseHeader(raw, \"block\");\n\t\t\tthis.rememberRaw(hex(blockId(header)), raw);\n\t\t}\n\t\tconst id = hex(blockId(header));\n\t\tconst height = Number(header.chainLength);\n\t\tif (typeof ref === \"number\" && height !== ref)\n\t\t\tfail({\n\t\t\t\tstep: \"block\",\n\t\t\t\tcode: \"height-mismatch\",\n\t\t\t\tmessage: `source returned height ${height} for ${ref}`,\n\t\t\t});\n\t\tawait this.runForward(header as NakamotoHeader, id, out);\n\t}\n\n\t/** At or above the checkpoint: Bitcoin, burn binding, signer set, signatures, state. */\n\tprivate async runForward(\n\t\theader: NakamotoHeader,\n\t\tid: string,\n\t\tout: BlockVerification,\n\t): Promise<void> {\n\t\tconst height = Number(header.chainLength);\n\t\tout.height = height;\n\t\tout.blockId = id;\n\t\tdescribeHeader(header, out);\n\t\tthis.passed(\"block\");\n\n\t\tconst burn = await this.bindBurn(header, \"burn\");\n\t\tconst cycle = rewardCycle(burn.burnHeight);\n\t\tout.burnHeight = burn.burnHeight;\n\t\tout.bitcoinBlockHash = burn.hash;\n\t\tout.cycle = cycle;\n\t\tthis.passed(\"bitcoin\");\n\t\tthis.passed(\"burn\");\n\n\t\tconst set = await this.signerSet(cycle, {\n\t\t\theight,\n\t\t\tburn: burn.burnHeight,\n\t\t});\n\t\tthis.passed(\"signer-set\");\n\t\tconst sig = verifySignerSignatures(header, set);\n\t\tout.signerWeight = sig.signedWeight;\n\t\tout.totalWeight = sig.totalWeight;\n\t\tout.threshold = sig.threshold;\n\t\tif (!sig.valid) fail(signatureFailure(sig, \"signatures\", cycle));\n\t\tthis.passed(\"signatures\");\n\t\tawait this.checkTransactions(header, id, out);\n\t\tawait this.verifyState(header, id, out);\n\t}\n\n\t/**\n\t * Below the checkpoint: prove the checkpoint chain's id at `height` (and\n\t * that it is `claimed`, when the caller asked by id), then the header that\n\t * hashes to it, then its state. Signatures add nothing to a header pinned\n\t * by hash from a trusted descendant.\n\t */\n\tprivate async runBelow(\n\t\theight: number,\n\t\tclaimed: string | undefined,\n\t\tout: BlockVerification,\n\t): Promise<void> {\n\t\tout.height = height;\n\t\tconst { id, ancestry } = await this.ancestor(height);\n\t\tout.ancestry = ancestry;\n\t\tif (claimed !== undefined && claimed !== id)\n\t\t\tfail({\n\t\t\t\tstep: \"ancestry\",\n\t\t\t\tcode: \"not-ancestor\",\n\t\t\t\tmessage: `block ${claimed} is not on the checkpoint's chain: its block at height ${height} is ${id}`,\n\t\t\t\tblockId: claimed,\n\t\t\t});\n\t\tthis.passed(\"ancestry\");\n\t\tconst header = await this.header(id, \"block\");\n\t\tif (Number(header.chainLength) !== height)\n\t\t\tfail({\n\t\t\t\tstep: \"block\",\n\t\t\t\tcode: \"height-mismatch\",\n\t\t\t\tmessage: `block ${id} claims height ${header.chainLength}, proven at ${height}`,\n\t\t\t});\n\t\tout.blockId = id;\n\t\tdescribeHeader(header, out);\n\t\tthis.passed(\"block\");\n\t\tawait this.bindBurnBelow(header, out);\n\t\tawait this.checkTransactions(header, id, out);\n\t\tawait this.verifyState(header, id, out);\n\t}\n\n\tprivate rememberRaw(id: string, raw: Bytes): void {\n\t\tthis.raws.delete(id);\n\t\tthis.raws.set(id, raw);\n\t\twhile (this.raws.size > 4) {\n\t\t\tconst oldest = this.raws.keys().next().value as string;\n\t\t\tthis.raws.delete(oldest);\n\t\t}\n\t}\n\n\t/**\n\t * The block's transactions against the authenticated header's\n\t * tx_merkle_root: binds every txid, sender, type and call target to the\n\t * signed (or hash-linked) header.\n\t */\n\tprivate async checkTransactions(\n\t\theader: StacksHeader,\n\t\tid: string,\n\t\tout: BlockVerification,\n\t): Promise<void> {\n\t\tif (isEpoch2Header(header)) {\n\t\t\tout.notes.push(\"epoch 2.x: transactions not checked\");\n\t\t\treturn;\n\t\t}\n\t\tconst raw =\n\t\t\tthis.raws.get(id) ??\n\t\t\t(await fetchFor(\"txs\", `block ${id}`, () => this.source.getBlock(id)));\n\t\tlet txs: BlockTransaction[] | null;\n\t\ttry {\n\t\t\ttxs = blockTransactions(raw, header);\n\t\t} catch (err) {\n\t\t\tif (!(err instanceof TransactionsError)) throw err;\n\t\t\treturn fail({ step: \"txs\", code: err.code, message: err.message });\n\t\t}\n\t\tif (txs === null) {\n\t\t\tout.notes.push(\n\t\t\t\t`transactions not checked: the source served block ${id}'s header only`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tout.transactions = txs;\n\t\tthis.passed(\"txs\");\n\t}\n\n\t/**\n\t * The checkpoint chain's block id at `height`, from the nearest trusted\n\t * block above it: parent links when within MAX_WALK, else one MARF proof.\n\t */\n\tprivate async ancestor(\n\t\theight: number,\n\t): Promise<{ id: string; ancestry: Ancestry }> {\n\t\tconst known = this.below.get(height);\n\t\tif (known) return known;\n\t\tconst from = this.nearestAbove(height);\n\t\tif (from.height - height <= MAX_WALK) {\n\t\t\tconst walked = await this.walk(from, height);\n\t\t\tif (walked) return walked;\n\t\t}\n\t\treturn this.jump(this.nearestAbove(height), height);\n\t}\n\n\t/** The lowest trusted block above `height`: the checkpoint or one proven below it. */\n\tprivate nearestAbove(height: number): { height: number; id: string } {\n\t\tlet best = {\n\t\t\theight: Number(this.start.header.chainLength),\n\t\t\tid: this.start.id,\n\t\t};\n\t\tfor (const [h, { id }] of this.below)\n\t\t\tif (h > height && h < best.height) best = { height: h, id };\n\t\treturn best;\n\t}\n\n\t/**\n\t * Follow parent ids down from `from`: each parent header must hash to the\n\t * id its child committed to. Null when a 2.x header stops the walk: it\n\t * commits to its parent's block hash, not the parent's id.\n\t */\n\tprivate async walk(\n\t\tfrom: { height: number; id: string },\n\t\theight: number,\n\t): Promise<{ id: string; ancestry: Ancestry } | null> {\n\t\tconst ancestry: Ancestry = {\n\t\t\tfromHeight: from.height,\n\t\t\tfromBlockId: from.id,\n\t\t\tvia: \"parents\",\n\t\t};\n\t\tlet child = await this.header(from.id, \"ancestry\");\n\t\tfor (let h = from.height - 1; h >= height; h--) {\n\t\t\tif (isEpoch2Header(child)) return null;\n\t\t\tconst id = hex(child.parentBlockId);\n\t\t\tconst parent = await this.header(id, \"ancestry\", { blockId: id });\n\t\t\tif (Number(parent.chainLength) !== h)\n\t\t\t\tfail({\n\t\t\t\t\tstep: \"ancestry\",\n\t\t\t\t\tcode: \"height-mismatch\",\n\t\t\t\t\tmessage: `parent ${id} claims height ${parent.chainLength}, expected ${h}`,\n\t\t\t\t\tblockId: id,\n\t\t\t\t});\n\t\t\tthis.below.set(h, { id, ancestry });\n\t\t\tchild = parent;\n\t\t}\n\t\treturn this.below.get(height) ?? null;\n\t}\n\n\t/**\n\t * Read the id at `height` from `from`'s state: block `height + 1` wrote it\n\t * to `__MARF_BLOCK_HEIGHT_TO_HASH::<height>`, and the proof must recompute\n\t * `from`'s state root through the header of every trie it crosses.\n\t */\n\tprivate async jump(\n\t\tfrom: { height: number; id: string },\n\t\theight: number,\n\t): Promise<{ id: string; ancestry: Ancestry }> {\n\t\tconst at = { blockId: from.id };\n\t\tconst tip = await this.header(from.id, \"ancestry\", at);\n\t\tconst key = heightToHashKey(height);\n\t\tconst path = marfPath(key);\n\t\tconst answer = await fetchFor(\n\t\t\t\"ancestry\",\n\t\t\t`${key} at ${from.id}`,\n\t\t\t() => this.source.getMarfProof(hex(path), from.id),\n\t\t\tat,\n\t\t);\n\t\tif (!answer)\n\t\t\treturn fail({\n\t\t\t\tstep: \"ancestry\",\n\t\t\t\tcode: \"unavailable\",\n\t\t\t\tmessage: `source has no MARF proof of ${key} at block ${from.height}, ${from.height - height} blocks up; parent links reach ${MAX_WALK}`,\n\t\t\t\t...at,\n\t\t\t});\n\t\t// A block id fills the first 32 bytes of the MARFValue; the tail is zero.\n\t\tconst value = marfProofValue(answer.proof) ?? new Uint8Array();\n\t\tconst proven =\n\t\t\tvalue.length === MARF_VALUE_SIZE &&\n\t\t\tvalue.subarray(32).every((b) => b === 0) &&\n\t\t\t(await this.proveAt(tip, path, value, answer.proof, \"ancestry\", at));\n\t\tif (!proven)\n\t\t\treturn fail({\n\t\t\t\tstep: \"ancestry\",\n\t\t\t\tcode: \"ancestry-proof-invalid\",\n\t\t\t\tmessage: `${key} is not proven in block ${from.height}'s state`,\n\t\t\t\t...at,\n\t\t\t});\n\t\tconst ancestry: Ancestry = {\n\t\t\tfromHeight: from.height,\n\t\t\tfromBlockId: from.id,\n\t\t\tvia: \"marf\",\n\t\t};\n\t\tconst found = { id: hex(value.subarray(0, 32)), ancestry };\n\t\tthis.below.set(height, found);\n\t\treturn found;\n\t}\n\n\t/**\n\t * Below the checkpoint the hash chain already pins the block; still bind\n\t * its burn block when the Bitcoin checkpoint reaches it. The burn height\n\t * here is the source's hint, so a low one only skips this extra check.\n\t */\n\tprivate async bindBurnBelow(\n\t\theader: StacksHeader,\n\t\tout: BlockVerification,\n\t): Promise<void> {\n\t\tlet hint: number;\n\t\ttry {\n\t\t\thint = await this.burnHint(header);\n\t\t} catch (err) {\n\t\t\tout.notes.push(`burn block not checked: ${(err as Error).message}`);\n\t\t\treturn;\n\t\t}\n\t\tif (hint < this.chain.checkpointHeight) {\n\t\t\tout.notes.push(\n\t\t\t\t`burn block not checked: its height ${hint} is below the Bitcoin checkpoint ${this.chain.checkpointHeight}`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tconst burn = await this.bindBurn(header, \"burn\");\n\t\tout.burnHeight = burn.burnHeight;\n\t\tout.bitcoinBlockHash = burn.hash;\n\t\tthis.passed(\"bitcoin\");\n\t\tthis.passed(\"burn\");\n\t}\n\n\t/** Witness against the authenticated header's root, then the named diff and rows. */\n\tprivate async verifyState(\n\t\theader: StacksHeader,\n\t\tid: string,\n\t\tout: BlockVerification,\n\t): Promise<void> {\n\t\tconst src = this.source;\n\t\tconst height = Number(header.chainLength);\n\t\tconst witness = await fetchFor(\"witness\", `witness ${id}`, () =>\n\t\t\tsrc.getWitness(id),\n\t\t);\n\t\tconst writes = await this.stateWrites(height, out.notes);\n\t\tif (writes) out.writes = writes;\n\t\tconst { getVmEvents }: Partial<ProofSource> = this.rows ? src : {};\n\t\tconst rows = getVmEvents\n\t\t\t? await fetchFor(\"rows\", `vm_events ${height}`, () =>\n\t\t\t\t\tgetVmEvents.call(src, height),\n\t\t\t\t)\n\t\t\t: undefined;\n\t\tconst parent = isEpoch2Header(header)\n\t\t\t? epoch2ParentId(witness, header)\n\t\t\t: header.parentBlockId;\n\t\tconst parentId = parent && hex(parent);\n\t\tconst state = await verifyBlockState({\n\t\t\theight,\n\t\t\t// Null only when the witness fails its root check, which fails the block.\n\t\t\tparentBlockId: parent ?? new Uint8Array(32),\n\t\t\tstateRoot: header.stateIndexRoot,\n\t\t\twitness,\n\t\t\twrites,\n\t\t\trows,\n\t\t\tparentLeaves: parentId\n\t\t\t\t? await this.parentLeaves(parentId, out.notes)\n\t\t\t\t: undefined,\n\t\t\tparentHolds: async (leaf) =>\n\t\t\t\tparentId ? this.parentHolds(parentId, leaf) : false,\n\t\t});\n\t\tout.diff = state.diff;\n\t\tif (rows) out.rowsChecked = state.rowsChecked;\n\t\tout.notes.push(...state.notes);\n\t\tout.failures.push(...state.failures);\n\t\t// Links pass in order up to the first one with a failure.\n\t\tconst broken = new Set(state.failures.map((f) => f.step));\n\t\tfor (const step of [\"witness\", \"names\", \"rows\"] as const) {\n\t\t\tif (broken.has(step) || (step === \"rows\" && !rows)) break;\n\t\t\tthis.passed(step);\n\t\t}\n\t}\n\n\t/**\n\t * The block's state writes, to name its diff. Optional evidence: a source\n\t * with none for the block (404, empty) or that fails leaves the diff\n\t * proven but unnamed, with a note, never a failure.\n\t */\n\tprivate async stateWrites(\n\t\theight: number,\n\t\tnotes: string[],\n\t): Promise<StateWrite[] | null> {\n\t\tconst { getStateWrites } = this.source;\n\t\tif (!getStateWrites) return null;\n\t\ttry {\n\t\t\tconst writes = await getStateWrites.call(this.source, height);\n\t\t\treturn writes?.length ? writes : null;\n\t\t} catch (err) {\n\t\t\tnotes.push(\n\t\t\t\t`state writes for block ${height} unavailable: ${(err as Error).message}`,\n\t\t\t);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/** Header by id, from the cache or the source; it must hash to `id`. */\n\tprivate async header(\n\t\tid: string,\n\t\tstep: VerifyStep,\n\t\textra: Partial<VerifyFailure> = {},\n\t): Promise<StacksHeader> {\n\t\tconst known = this.headers.get(id);\n\t\tif (known) return known;\n\t\tconst header = await this.fetchHeader(id, step, extra);\n\t\tif (hex(blockId(header)) !== id)\n\t\t\tfail({\n\t\t\t\tstep,\n\t\t\t\tcode: \"id-mismatch\",\n\t\t\t\tmessage: `source returned another block for ${id}`,\n\t\t\t\tblockId: id,\n\t\t\t\t...extra,\n\t\t\t});\n\t\tthis.headers.set(id, header);\n\t\treturn header;\n\t}\n\n\t/**\n\t * A Nakamoto block by id, or when the source has none (epoch 2.x blocks are\n\t * not served as Nakamoto blocks) its epoch 2.x header.\n\t */\n\tprivate async fetchHeader(\n\t\tid: string,\n\t\tstep: VerifyStep,\n\t\textra: Partial<VerifyFailure>,\n\t): Promise<StacksHeader> {\n\t\tconst src = this.source;\n\t\tlet raw: Bytes;\n\t\ttry {\n\t\t\traw = await src.getBlock(id);\n\t\t\tthis.rememberRaw(id, raw);\n\t\t} catch (err) {\n\t\t\tconst reason = `block ${id}: ${(err as Error).message}`;\n\t\t\tconst { getEpoch2Header } = src;\n\t\t\tif (!getEpoch2Header)\n\t\t\t\treturn fail({ step, code: \"unavailable\", message: reason, ...extra });\n\t\t\tconst e2 = await fetchFor(\n\t\t\t\tstep,\n\t\t\t\t`${reason}; epoch 2.x header`,\n\t\t\t\t() => getEpoch2Header.call(src, id),\n\t\t\t\textra,\n\t\t\t);\n\t\t\ttry {\n\t\t\t\treturn parseEpoch2Header(e2.header, e2.consensusHash);\n\t\t\t} catch (parseErr) {\n\t\t\t\treturn fail({\n\t\t\t\t\tstep,\n\t\t\t\t\tcode: \"invalid-header\",\n\t\t\t\t\tmessage: `epoch 2.x header ${id} does not parse: ${(parseErr as Error).message}`,\n\t\t\t\t\t...extra,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn parseHeader(raw, step);\n\t}\n\n\t/**\n\t * Prove `value` at `path` in `tip`'s state, fetching the header of every\n\t * ancestor trie the proof crosses.\n\t */\n\tprivate async proveAt(\n\t\ttip: StacksHeader,\n\t\tpath: Bytes,\n\t\tvalue: Bytes,\n\t\tproof: Bytes,\n\t\tstep: VerifyStep,\n\t\textra: Partial<VerifyFailure> = {},\n\t): Promise<boolean> {\n\t\tconst headers = [tip];\n\t\tfor (const id of marfProofAncestors(proof))\n\t\t\theaders.push(await this.header(id, step, extra));\n\t\treturn verifyMarfProof({\n\t\t\tproof,\n\t\t\tpath,\n\t\t\tvalue,\n\t\t\troot: tip.stateIndexRoot,\n\t\t\theaders,\n\t\t});\n\t}\n\n\t/**\n\t * The parent's own trie leaves, from its witness checked against the\n\t * parent header. Optional evidence: when the source cannot serve it,\n\t * carried leaves fall back to per-leaf proofs (named) or stay unlabeled.\n\t */\n\tprivate async parentLeaves(\n\t\tparentId: string,\n\t\tnotes: string[],\n\t): Promise<WitnessLeaf[] | undefined> {\n\t\ttry {\n\t\t\tconst parent = await this.header(parentId, \"names\");\n\t\t\tconst w = parseWitness(await this.source.getWitness(parentId));\n\t\t\tif (bytesEqual(w.root, parent.stateIndexRoot)) return w.leaves;\n\t\t\tnotes.push(`parent witness ${parentId} root does not match its header`);\n\t\t} catch (err) {\n\t\t\tnotes.push(\n\t\t\t\t`parent witness ${parentId} unavailable: ${(err as Error).message}`,\n\t\t\t);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * A carried leaf holds the parent's value. The parent header is\n\t * authenticated by hash: its id is committed in the authenticated child\n\t * (its header, or for 2.x its own trie).\n\t */\n\tprivate async parentHolds(\n\t\tparentId: string,\n\t\tleaf: WitnessLeaf,\n\t): Promise<boolean> {\n\t\tconst parent = await this.header(parentId, \"names\");\n\t\tconst pathHex = hex(leaf.path);\n\t\tconst answer = await fetchFor(\"names\", `MARF ${pathHex} at parent`, () =>\n\t\t\tthis.source.getMarfProof(pathHex, parentId),\n\t\t);\n\t\tif (!answer) return false;\n\t\tconst value = new Uint8Array(MARF_VALUE_SIZE);\n\t\tvalue.set(leaf.valueHash);\n\t\treturn this.proveAt(parent, leaf.path, value, answer.proof, \"names\");\n\t}\n\n\t/** Consensus hash -> PoW-verified burn block, via the sortition preimage. */\n\tprivate async bindBurn(\n\t\theader: StacksHeader,\n\t\tstep: VerifyStep,\n\t\textra: Partial<VerifyFailure> = {},\n\t): Promise<{ burnHeight: number; hash: string }> {\n\t\tconst ch = hex(header.consensusHash);\n\t\tconst known = this.burns.get(ch);\n\t\tif (known) return known;\n\t\tconst bp = await fetchFor(\n\t\t\tstep,\n\t\t\t`burn preimage ${ch}`,\n\t\t\t() => this.preimage(ch),\n\t\t\textra,\n\t\t);\n\t\tconst hash = verifyConsensusPreimage(header.consensusHash, bp.preimage);\n\t\tif (!hash)\n\t\t\treturn fail({\n\t\t\t\tstep,\n\t\t\t\tcode: \"preimage-mismatch\",\n\t\t\t\tmessage: `preimage does not hash to consensus hash ${ch}`,\n\t\t\t\t...extra,\n\t\t\t});\n\t\tif (bp.burnHeight < this.chain.checkpointHeight)\n\t\t\tfail({\n\t\t\t\tstep,\n\t\t\t\tcode: \"before-checkpoint\",\n\t\t\t\tmessage: `burn height ${bp.burnHeight} is below the Bitcoin checkpoint ${this.chain.checkpointHeight}`,\n\t\t\t\t...extra,\n\t\t\t});\n\t\tawait this.syncBitcoin(bp.burnHeight);\n\t\tconst burnHeight = this.chain.heightOf(hash);\n\t\tif (burnHeight === undefined)\n\t\t\treturn fail({\n\t\t\t\tstep,\n\t\t\t\tcode: \"burn-not-in-chain\",\n\t\t\t\tmessage: `burn block ${hash} is not in the verified Bitcoin chain (synced ${this.chain.checkpointHeight}..${this.chain.tip.height})`,\n\t\t\t\t...extra,\n\t\t\t});\n\t\tconst bound = { burnHeight, hash };\n\t\tthis.burns.set(ch, bound);\n\t\treturn bound;\n\t}\n\n\t/** Extend the Bitcoin chain to `height`, validating PoW, retarget and MTP. */\n\tprivate async syncBitcoin(height: number): Promise<void> {\n\t\twhile (this.chain.tip.height < height) {\n\t\t\tconst from = this.chain.tip.height + 1;\n\t\t\tconst count = Math.min(BITCOIN_BATCH, height - from + 1);\n\t\t\tconst headers = await fetchFor(\"bitcoin\", `bitcoin headers ${from}`, () =>\n\t\t\t\tthis.source.getBitcoinHeaders(from, count),\n\t\t\t);\n\t\t\tif (headers.length === 0)\n\t\t\t\tfail({\n\t\t\t\t\tstep: \"bitcoin\",\n\t\t\t\t\tcode: \"unavailable\",\n\t\t\t\t\tmessage: `source has no Bitcoin headers from ${from}`,\n\t\t\t\t});\n\t\t\ttry {\n\t\t\t\tthis.chain.append(headers);\n\t\t\t} catch (err) {\n\t\t\t\tif (!(err instanceof HeaderValidationError)) throw err;\n\t\t\t\tfail({ step: \"bitcoin\", code: \"invalid-header\", message: err.message });\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * The proven signer set for `cycle`. Walks forward from the checkpoint:\n\t * set c+1 is read from an anchor block in c+1's prepare phase, whose\n\t * header set c signed.\n\t */\n\tprivate async signerSet(\n\t\tcycle: number,\n\t\ttarget: SearchPoint,\n\t): Promise<SignerSet> {\n\t\tconst known = this.sets.get(cycle);\n\t\tif (known) return known;\n\t\tconst first = this.checkpoint.stacks.cycle;\n\t\tif (cycle < first)\n\t\t\tfail({\n\t\t\t\tstep: \"signer-set\",\n\t\t\t\tcode: \"before-checkpoint\",\n\t\t\t\tmessage: `cycle ${cycle} precedes the checkpoint's cycle ${first}`,\n\t\t\t\tcycle,\n\t\t\t});\n\t\tlet lo = await this.startPoint();\n\t\tfor (let c = first; c < cycle; c++) {\n\t\t\tconst next = this.sets.get(c + 1);\n\t\t\tif (next) {\n\t\t\t\tlo = this.anchors.get(c + 1) ?? lo;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst anchor = await this.locateAnchor(c + 1, lo, target);\n\t\t\tthis.sets.set(c + 1, await this.proveNextSet(c + 1, anchor));\n\t\t\tthis.anchors.set(c + 1, anchor);\n\t\t\tlo = anchor;\n\t\t}\n\t\treturn this.sets.get(cycle) as SignerSet;\n\t}\n\n\t/** The checkpoint block as a search bound; its burn height is a source hint. */\n\tprivate async startPoint(): Promise<SearchPoint> {\n\t\tconst { header } = this.start;\n\t\tconst height = Number(header.chainLength);\n\t\ttry {\n\t\t\treturn { height, burn: await this.burnHint(header) };\n\t\t} catch {\n\t\t\treturn { height };\n\t\t}\n\t}\n\n\tprivate async burnHint(header: StacksHeader): Promise<number> {\n\t\tconst ch = hex(header.consensusHash);\n\t\treturn (\n\t\t\tthis.burns.get(ch)?.burnHeight ?? (await this.preimage(ch)).burnHeight\n\t\t);\n\t}\n\n\tprivate async preimage(ch: string): Promise<BurnPreimage> {\n\t\tlet bp = this.preimages.get(ch);\n\t\tif (!bp) {\n\t\t\tbp = await this.source.getBurnPreimage(ch);\n\t\t\tthis.preimages.set(ch, bp);\n\t\t}\n\t\treturn bp;\n\t}\n\n\tprivate async locateAnchor(\n\t\tcycle: number,\n\t\tlo: SearchPoint,\n\t\thi: SearchPoint,\n\t): Promise<Probe> {\n\t\tconst start = cycleStart(cycle);\n\t\tconst window = [start - MAINNET_PREPARE_LENGTH, start] as const;\n\t\tconst probe = async (h: number): Promise<Probe> => {\n\t\t\tconst raw = await fetchFor(\n\t\t\t\t\"signer-set\",\n\t\t\t\t`block at height ${h}`,\n\t\t\t\t() => this.source.getBlock(h),\n\t\t\t\t{ cycle },\n\t\t\t);\n\t\t\tconst header = parseHeader(raw, \"signer-set\");\n\t\t\tconst id = hex(blockId(header));\n\t\t\tthis.headers.set(id, header);\n\t\t\tconst burn = await fetchFor(\n\t\t\t\t\"signer-set\",\n\t\t\t\t`burn hint for block ${id}`,\n\t\t\t\t() => this.burnHint(header),\n\t\t\t\t{ cycle, blockId: id },\n\t\t\t);\n\t\t\treturn { height: Number(header.chainLength), burn, header, id };\n\t\t};\n\t\tconst anchor = await findAnchor(lo, hi, window, probe);\n\t\tif (!anchor)\n\t\t\treturn fail({\n\t\t\t\tstep: \"signer-set\",\n\t\t\t\tcode: \"anchor-not-found\",\n\t\t\t\tmessage: `no block with a burn height in ${window[0]}..${window[1] - 1} (cycle ${cycle} prepare phase) between heights ${lo.height} and ${hi.height}`,\n\t\t\t\tcycle,\n\t\t\t});\n\t\treturn anchor;\n\t}\n\n\t/**\n\t * Set `cycle` from `anchor`: the anchor must be bound to a burn block in\n\t * `cycle`'s prepare phase, be signed by the set of the cycle that burn\n\t * height dictates (`cycle - 1`), and hold set `cycle` in its state (MARF\n\t * proof). Adjacent sets overlap enough that one block can clear both, so\n\t * the set is always chosen by proven burn height, never by which passes.\n\t */\n\tprivate async proveNextSet(cycle: number, anchor: Probe): Promise<SignerSet> {\n\t\tconst at = { cycle, blockId: anchor.id };\n\t\tconst { burnHeight } = await this.bindBurn(anchor.header, \"signer-set\", at);\n\t\tconst start = cycleStart(cycle);\n\t\tif (burnHeight < start - MAINNET_PREPARE_LENGTH || burnHeight >= start)\n\t\t\tfail({\n\t\t\t\tstep: \"signer-set\",\n\t\t\t\tcode: \"anchor-outside-window\",\n\t\t\t\tmessage: `anchor burn height ${burnHeight} is outside cycle ${cycle}'s prepare phase ${start - MAINNET_PREPARE_LENGTH}..${start - 1}`,\n\t\t\t\t...at,\n\t\t\t});\n\t\tconst signing = rewardCycle(burnHeight);\n\t\tconst sig = verifySignerSignatures(\n\t\t\tanchor.header,\n\t\t\tthis.sets.get(signing) as SignerSet,\n\t\t);\n\t\tif (!sig.valid)\n\t\t\tfail({\n\t\t\t\t...signatureFailure(sig, \"signer-set\", signing),\n\t\t\t\t...at,\n\t\t\t\tcode: \"anchor-unsigned\",\n\t\t\t});\n\n\t\tconst path = marfPath(\n\t\t\tmapEntryKey(SIGNERS_CONTRACT, \"cycle-signer-set\", uintCV(cycle)),\n\t\t);\n\t\tconst answer = await fetchFor(\n\t\t\t\"signer-set\",\n\t\t\t`signer set ${cycle} at ${anchor.id}`,\n\t\t\t() => this.source.getMarfProof(hex(path), anchor.id),\n\t\t\tat,\n\t\t);\n\t\tconst value = answer?.data.replace(/^0x/, \"\") ?? \"\";\n\t\tconst proven =\n\t\t\tanswer !== null &&\n\t\t\t(await this.proveAt(\n\t\t\t\tanchor.header,\n\t\t\t\tpath,\n\t\t\t\tmarfValue(value),\n\t\t\t\tanswer.proof,\n\t\t\t\t\"signer-set\",\n\t\t\t\tat,\n\t\t\t));\n\t\tif (!proven)\n\t\t\tfail({\n\t\t\t\tstep: \"signer-set\",\n\t\t\t\tcode: \"set-proof-invalid\",\n\t\t\t\tmessage: `signer set ${cycle} is not proven in anchor ${anchor.id}'s state`,\n\t\t\t\t...at,\n\t\t\t});\n\t\tlet set: SignerSet;\n\t\ttry {\n\t\t\tset = decodeSignerSet(value);\n\t\t} catch (err) {\n\t\t\treturn fail({\n\t\t\t\tstep: \"signer-set\",\n\t\t\t\tcode: \"set-proof-invalid\",\n\t\t\t\tmessage: `signer set ${cycle}: ${(err as Error).message}`,\n\t\t\t\t...at,\n\t\t\t});\n\t\t}\n\t\treturn set;\n\t}\n}\n\n/** The authenticated header's identity fields, for callers that rebuild the block. */\nfunction describeHeader(header: StacksHeader, out: BlockVerification): void {\n\tout.stateRoot = hex(header.stateIndexRoot);\n\tout.consensusHash = hex(header.consensusHash);\n\tif (!isEpoch2Header(header)) {\n\t\tout.blockHash = hex(signerSignatureHash(header));\n\t\tout.timestamp = Number(header.timestamp);\n\t}\n}\n\nfunction parseHeader(raw: Bytes, step: VerifyStep): NakamotoHeader {\n\ttry {\n\t\treturn parseNakamotoHeader(raw);\n\t} catch (err) {\n\t\treturn fail({\n\t\t\tstep,\n\t\t\tcode: \"invalid-header\",\n\t\t\tmessage: `block bytes do not parse: ${(err as Error).message}`,\n\t\t});\n\t}\n}\n\n/**\n * A 2.x header commits only to its parent's block hash; the parent's id is in\n * the block's own trie at `__MARF_BLOCK_HEIGHT_TO_HASH::<height - 1>`. Read\n * from a witness whose root matches the header, else null.\n */\nfunction epoch2ParentId(witness: Bytes, header: Epoch2Header): Bytes | null {\n\tconst height = Number(header.chainLength);\n\tif (height === 0) return null;\n\ttry {\n\t\tconst w = parseWitness(witness);\n\t\tif (!bytesEqual(w.root, header.stateIndexRoot)) return null;\n\t\tconst path = marfPath(heightToHashKey(height - 1));\n\t\treturn w.leaves.find((l) => bytesEqual(l.path, path))?.valueHash ?? null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction signatureFailure(\n\tsig: ReturnType<typeof verifySignerSignatures>,\n\tstep: VerifyStep,\n\tcycle: number,\n): VerifyFailure {\n\tconst weight = `${sig.signedWeight}/${sig.totalWeight} signed, threshold ${sig.threshold}`;\n\tif (sig.unknown.length)\n\t\treturn {\n\t\t\tstep,\n\t\t\tcode: \"unknown-signer\",\n\t\t\tmessage: `${sig.unknown.length} signer(s) not in cycle ${cycle}'s set (${weight})`,\n\t\t\tcycle,\n\t\t};\n\tif (sig.duplicates.length)\n\t\treturn {\n\t\t\tstep,\n\t\t\tcode: \"duplicate-signer\",\n\t\t\tmessage: `${sig.duplicates.length} duplicate signature(s) (${weight})`,\n\t\t\tcycle,\n\t\t};\n\tif (sig.invalid)\n\t\treturn {\n\t\t\tstep,\n\t\t\tcode: \"bad-signature\",\n\t\t\tmessage: `${sig.invalid} signature(s) do not recover (${weight})`,\n\t\t\tcycle,\n\t\t};\n\treturn {\n\t\tstep,\n\t\tcode: \"below-threshold\",\n\t\tmessage: `cycle ${cycle} signers: ${weight}`,\n\t\tcycle,\n\t};\n}\n\n/** One-shot: verify a block from a checkpoint (MAINNET_CHECKPOINT by default). */\nexport const verifyBlock = (\n\tref: string | number,\n\topts: VerifyOptions,\n): Promise<BlockVerification> => new BlockVerifier(opts).verify(ref);\n"
|
|
20
21
|
],
|
|
21
|
-
"mappings": "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",
|
|
22
|
-
"debugId": "
|
|
22
|
+
"mappings": "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",
|
|
23
|
+
"debugId": "35F453C01939E5F064756E2164756E21",
|
|
23
24
|
"names": []
|
|
24
25
|
}
|
package/package.json
CHANGED