code wiki / (root) / nx_bit_provenance_pipeline_test.nx

nx_bit_provenance_pipeline_test.nx source

↩ module page · 97 lines · 4381 B

1// nx_bit_provenance_pipeline_test.nx -- BP-2 proof: bit-provenance 2// composes through a multi-layer pipeline silicon-to-death. 3// 4// Pipeline simulated: 5// L-1 silicon: 4 input bits born (b_a / b_b / b_c / b_d) 6// L0 ISA: each input bit consumed by a load instruction 7// L3 primitive: XOR composes b_a^b_b -> b_x, b_c^b_d -> b_y 8// L3.5 ML: weighted sum composes b_x * w + b_y * (1-w) -> b_z 9// L7 browser: b_z displayed (death) 10// 11// Audit at end: zombies = 0 (every produced bit consumed somewhere). 12// 13// expect_exit: 0 14 15import "nx_bit_provenance.nx" 16 17// FNV-1a-style primitive tags (small constants standing in for 18// content-addressed primitive identifiers). 19const TAG_SILICON: i64 = 0xCAFE0000 20const TAG_LOAD: i64 = 0xC0DE0001 21const TAG_XOR: i64 = 0xC0DE0002 22const TAG_WSUM: i64 = 0xC0DE0003 23const TAG_DISPLAY: i64 = 0xC0DE0004 24 25func main() -> i64 { 26 if nx_bprov_init() != 0 { return 1 } 27 28 // ===== L-1 silicon: 4 input bits born ===== 29 let b_a: i64 = nx_bprov_alloc() 30 let b_b: i64 = nx_bprov_alloc() 31 let b_c: i64 = nx_bprov_alloc() 32 let b_d: i64 = nx_bprov_alloc() 33 34 // Silicon-side emit (no upstream, layer = L-1). 35 if nx_bprov_emit(b_a, 0, 0, NX_BPROV_L_NEG_1, TAG_SILICON) != 0 { return 10 } 36 if nx_bprov_emit(b_b, 0, 0, NX_BPROV_L_NEG_1, TAG_SILICON) != 0 { return 11 } 37 if nx_bprov_emit(b_c, 0, 0, NX_BPROV_L_NEG_1, TAG_SILICON) != 0 { return 12 } 38 if nx_bprov_emit(b_d, 0, 0, NX_BPROV_L_NEG_1, TAG_SILICON) != 0 { return 13 } 39 40 // ===== L0 ISA: each input loaded by a load instr ===== 41 if nx_bprov_join(b_a, NX_BPROV_L_0, TAG_LOAD) != 0 { return 20 } 42 if nx_bprov_join(b_b, NX_BPROV_L_0, TAG_LOAD) != 0 { return 21 } 43 if nx_bprov_join(b_c, NX_BPROV_L_0, TAG_LOAD) != 0 { return 22 } 44 if nx_bprov_join(b_d, NX_BPROV_L_0, TAG_LOAD) != 0 { return 23 } 45 46 // ===== L3 primitive: XOR composes ===== 47 let b_x: i64 = nx_bprov_alloc() 48 if nx_bprov_emit(b_x, b_a, b_b, NX_BPROV_L_3, TAG_XOR) != 0 { return 30 } 49 let b_y: i64 = nx_bprov_alloc() 50 if nx_bprov_emit(b_y, b_c, b_d, NX_BPROV_L_3, TAG_XOR) != 0 { return 31 } 51 52 // ===== L3.5 ML: weighted sum (3-source emit) ===== 53 let b_z: i64 = nx_bprov_alloc() 54 // For provenance purposes b_z derives from (b_x, b_y, and a weight constant). 55 // The weight constant is represented as bit ID 0 (silicon-immutable). 56 if nx_bprov_emit3(b_z, b_x, b_y, 0, NX_BPROV_L_35, TAG_WSUM) != 0 { return 40 } 57 58 // Mid-pipeline audit: all intermediate bits are still zombies 59 // until L7 joins b_z. Zombies: b_x, b_y, b_z = 3. 60 if nx_bprov_audit_zombies() != 3 { return 50 } 61 62 // ===== L7 browser: b_z displayed (death) ===== 63 if nx_bprov_join(b_z, NX_BPROV_L_7, TAG_DISPLAY) != 0 { return 60 } 64 65 // ===== Audit: every bit alive in the chain has been observed ===== 66 // Final state: 67 // b_a/b/c/d: produced L-1, joined L0 -> alive 68 // b_x/b_y: produced L3 from a/b and c/d -> zombies (no one consumed) 69 // b_z: produced L3.5 from x/y, joined L7 -> alive 70 // 71 // Zombies count = 2 (b_x, b_y) -- they were intermediate, never 72 // observed by a downstream consumer. In a fully-traced 73 // substrate, we'd expect either (a) L3 primitive INTERNALLY 74 // calls join on intermediates before returning, OR (b) audit 75 // rules consider an intermediate's join implied by the 76 // emit-chain pointing through it. V0 uses rule (a): we 77 // explicitly join b_x and b_y at the L3.5 layer where they 78 // were consumed. 79 if nx_bprov_join(b_x, NX_BPROV_L_35, TAG_WSUM) != 0 { return 70 } 80 if nx_bprov_join(b_y, NX_BPROV_L_35, TAG_WSUM) != 0 { return 71 } 81 82 if nx_bprov_audit_zombies() != 0 { return 80 } 83 84 // Verify lookup_join returns the consumer layer for each bit. 85 if nx_bprov_lookup_join(b_a) != NX_BPROV_L_0 { return 90 } 86 if nx_bprov_lookup_join(b_b) != NX_BPROV_L_0 { return 91 } 87 if nx_bprov_lookup_join(b_c) != NX_BPROV_L_0 { return 92 } 88 if nx_bprov_lookup_join(b_d) != NX_BPROV_L_0 { return 93 } 89 if nx_bprov_lookup_join(b_x) != NX_BPROV_L_35 { return 94 } 90 if nx_bprov_lookup_join(b_y) != NX_BPROV_L_35 { return 95 } 91 if nx_bprov_lookup_join(b_z) != NX_BPROV_L_7 { return 96 } 92 93 // Total records: 4 silicon + 2 L3 XOR + 1 L3.5 WSUM = 7. 94 if nx_bprov_n_records() != 7 { return 100 } 95 96 return 0 97}