code wiki / _hdl_build / nx_seg_merkle_gate.nx
nx_seg_merkle_gate.nx source
↩ module page · 51 lines · 3302 B
1import "nx_gate_gn.nx"
2// nx_seg_merkle_gate.nx -- exceed-gate for CAP-SEG-MERKLE. Proves proof-of-inclusion: a valid leaf+proof recomputes
3// the root, a wrong leaf is rejected, a single-byte tampered proof is rejected, and both a normal and an odd-tail
4// leaf verify. This is what a bare content-hash CANNOT do: prove membership with O(log n) bytes, no full store read.
5// Sovereign: nx_syscalls + nx_sha256 + nx_seg_merkle. expect_exit: 0
6import "nx_syscalls.nx"
7import "nx_sha256.nx"
8import "nx_seg_merkle.nx"
9import "nx_gate_verdict.nx"
10
11func gp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
12
13func main(argc: i64, argv: *i64) -> i64 {
14 gp("=== nx_seg_merkle_gate (proof-of-inclusion: valid=verify, wrong/tamper=reject) ===\n" as *u8)
15 let leaves: *u8 = sys_mmap(5*32)
16 sha256_digest("alpha" as *u8, 5, (leaves as i64 + 0*32) as *u8)
17 sha256_digest("bravo" as *u8, 5, (leaves as i64 + 1*32) as *u8)
18 sha256_digest("charlie" as *u8, 7, (leaves as i64 + 2*32) as *u8)
19 sha256_digest("delta" as *u8, 5, (leaves as i64 + 3*32) as *u8)
20 sha256_digest("echo" as *u8, 4, (leaves as i64 + 4*32) as *u8)
21 let root: *u8 = sys_mmap(32); mk_root(leaves, 5, root)
22 let proof: *u8 = sys_mmap(32*16); let dirs: *i64 = sys_mmap(8*16) as *i64
23 var pass: i64=0; var fail: i64=0
24
25 let depth: i64 = mk_proof(leaves, 5, 2, proof, dirs)
26 if mk_verify((leaves as i64 + 2*32) as *u8, proof, dirs, depth, root) == 1 { pass=pass+1; gp(" T1 leaf 2 inclusion proof (depth " as *u8); gn(depth); gp(") verifies to root PASS\n" as *u8) } else { fail=fail+1; gp(" T1 FAIL\n" as *u8) }
27
28 let wrong: *u8 = sys_mmap(32); sha256_digest("nope" as *u8, 4, wrong)
29 if mk_verify(wrong, proof, dirs, depth, root) == 0 { pass=pass+1; gp(" T2 wrong leaf -> REJECTED PASS\n" as *u8) } else { fail=fail+1; gp(" T2 FAIL wrong accepted\n" as *u8) }
30
31 proof[0] = (proof[0] as i64 ^ 1) as u8
32 if mk_verify((leaves as i64 + 2*32) as *u8, proof, dirs, depth, root) == 0 { pass=pass+1; gp(" T3 single-byte tampered proof -> REJECTED PASS\n" as *u8) } else { fail=fail+1; gp(" T3 FAIL tamper accepted\n" as *u8) }
33 proof[0] = (proof[0] as i64 ^ 1) as u8
34
35 let d0: i64 = mk_proof(leaves, 5, 0, proof, dirs)
36 if mk_verify((leaves as i64 + 0*32) as *u8, proof, dirs, d0, root) == 1 { pass=pass+1; gp(" T4 leaf 0 verifies PASS\n" as *u8) } else { fail=fail+1; gp(" T4 FAIL\n" as *u8) }
37
38 let d4: i64 = mk_proof(leaves, 5, 4, proof, dirs)
39 if mk_verify((leaves as i64 + 4*32) as *u8, proof, dirs, d4, root) == 1 { pass=pass+1; gp(" T5 leaf 4 (odd tail) verifies PASS\n" as *u8) } else { fail=fail+1; gp(" T5 FAIL\n" as *u8) }
40
41 gp("RESULT pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail)
42 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
43 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
44 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
45 let ctr__dry: *i64 = gv_ctr()
46 ctr__dry[0] = pass
47 ctr__dry[1] = pass + fail
48 let rc__dry: i64 = gv_verdict("SEG-MERKLE-GATE" as *u8, ctr__dry, "O(log n) verifiable inclusion -- IPLD/CT-class)" as *u8)
49 sys_exit(rc__dry)
50 return rc__dry
51}