diff --git a/tools/proof-vectors/README.md b/tools/proof-vectors/README.md index a6d731e..608262e 100644 --- a/tools/proof-vectors/README.md +++ b/tools/proof-vectors/README.md @@ -20,5 +20,6 @@ node ../verify-proof.mjs 06-notarized-28001.json --chain 28001 --rpc https://tes With `--chain 28001 --rpc https://testnet-rpc.aere.network`, 06 gives finality `post-quantum`: the state of the parent of the most recent anchor, whose certificate verify-anchor.mjs checks, records its statementHash in the testnet notary as first seen at 1790478623 (2026-09-27T03:10:23Z), first in block 3,618,722. Its statement describes the AIP-22 conformance corpus file as it was -served at that time (eight of nine kinds); the file has changed since, the statement has not. With `--rpc` on chain 2800, where -nothing is notarized yet, 01 gives `not notarized`, proven absent from the certified state. +served at that time (eight of nine kinds); the file has changed since, the statement has not. With `--rpc` on chain 2800, whose +notary holds other digests but none of these vectors, 01 gives `not notarized`, proven absent from the certified state. (Until +2026-09-29 this line said that nothing was notarized on chain 2800; the notary there has held digests since 2026-09-17.) diff --git a/tools/verify-proof.mjs b/tools/verify-proof.mjs index e3fea27..4621ed1 100644 --- a/tools/verify-proof.mjs +++ b/tools/verify-proof.mjs @@ -174,7 +174,11 @@ async function finality(env, o) { }); let rep = null; try { rep = JSON.parse(fs.readFileSync(report, 'utf8')); } catch { rep = null; } const tail = va.out.trim().split('\n').slice(-2).join(' | ').slice(0, 220); - if (va.code === 1) return level('finality', 'FAILED', 'the chain\'s most recent anchor did not verify: ' + tail); + // exit 1 is a verdict only with verify-anchor's own verdict line: Node also exits 1 when the tool cannot start (a dependency not + // installed: ERR_MODULE_NOT_FOUND), and that is not a failure of the chain (2026-09-29) + const verdictLine = /^(FAIL:|PROBLEMS:)/m.test(va.out); + if (va.code === 1 && verdictLine) return level('finality', 'FAILED', 'the chain\'s most recent anchor did not verify: ' + tail); + if (va.code === 1) return level('finality', 'UNMEASURED', 'verify-anchor.mjs stopped without a verdict (is `npm install` done beside it?): ' + tail); if (va.code !== 0 || !rep || !rep.parentHash || rep.chainId !== o.chain) return level('finality', 'UNMEASURED', 'the anchor could not be verified here (verify-anchor.mjs exit ' + va.code + '): ' + tail); // (b) the parent header, bound to the certified hash by re-encoding const X = rep.parentNumber;