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}