code wiki / (root) / nx_ts_partial_gate.nx

nx_ts_partial_gate.nx source

↩ module page · 32 lines · 2487 B

1// nx_ts_partial_gate.nx -- proves PARTIAL-BITFIELD seeding: ts_load_have reads download.done (sibling of the 2// srcpath download.part) and ts_build_bitfield_have advertises ONLY the pieces we hold. Setup: npc=3, have 3// map [1,0,1] (hold pieces 0 & 2, NOT 1). Expect load_have=1, have=[1,0,1], bitfield byte = 0xA0 (bits 7 & 5 4// set, bit 6 clear = MSB-first pieces 0 & 2). This is what makes a selective/complete-on-wanted torrent seed 5// honestly (never advertises/serves the junk pieces it skipped). license_tier: ORIGINAL 6import "nx_torrent_seed.nx" 7import "nx_gate_verdict.nx" 8 9func pg_p(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 10func pg_n(v: i64) -> i64 { if v==0 { sys_write(1,"0" as *u8,1); return 0 } var m: i64=v; let t: *u8=sys_mmap(28); var k: i64=0; while m>0 { t[k]=(48+(m%10)) as u8; m=m/10; k=k+1 } while k>0 { k=k-1; sys_write(1,(((t as i64)+k) as *u8),1) } return 0 } 11 12func main() -> i64 { 13 pg_p("TS-PARTIAL-GATE authored=organ\n" as *u8) 14 sys_mkdir("/tmp/nx_ps" as *u8, 0x1ff) 15 let pf: i64 = sys_openat_wr("/tmp/nx_ps/download.part" as *u8, 0x1a4); if pf>=0 { let b: *u8=sys_mmap(128); var i: i64=0; while i<100 { b[i]=(i%64) as u8; i=i+1 } sys_write(pf,b,100); sys_close(pf) } 16 // download.done: 3 bytes -> have piece 0, NOT 1, have 2 17 let df: i64 = sys_openat_wr("/tmp/nx_ps/download.done" as *u8, 0x1a4); if df>=0 { let d: *u8=sys_mmap(4); d[0]=1 as u8; d[1]=0 as u8; d[2]=1 as u8; sys_write(df,d,3); sys_close(df) } 18 let have: *u8 = sys_mmap(64) 19 let loaded: i64 = ts_load_have("/tmp/nx_ps/download.part" as *u8, 3, have) 20 let bf: *u8 = sys_mmap(16); let bflen: i64 = ts_build_bitfield_have(3, have, bf) 21 pg_p(" load_have="); pg_n(loaded); pg_p(" have=["); pg_n(have[0] as i64); pg_n(have[1] as i64); pg_n(have[2] as i64) 22 pg_p("] bitfield0="); pg_n(bf[0] as i64); pg_p(" (expect 160=0xA0) bflen="); pg_n(bflen); pg_p("\n" as *u8) 23 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check 24 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled 25 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify. 26 let ctr__dry: *i64 = gv_ctr() 27 ctr__dry[0] = loaded 28 ctr__dry[1] = 1 29 let rc__dry: i64 = gv_verdict("TS-PARTIAL-GATE" as *u8, ctr__dry, "seeder advertises ONLY held pieces; skipped piece 1 not in bitfield)" as *u8) 30 sys_exit(rc__dry) 31 return rc__dry 32}