nx_swarm_sim_test.nx source
↩ module page · 88 lines · 4080 B
1// nx_swarm_sim_test.nx -- KAT for the deterministic swarm simulator / download engine.
2// Native sovereign lane; exit 0 = pass, N = assertion N failed.
3// Every expected value is hand-computed in the comments (evidence-driven, no oracle drift).
4
5import "nx_str.nx"
6import "nx_swarm_sim.nx"
7
8func _zero(a: *i64, n: i64) -> i64 { var i: i64 = 0; while i < n { a[i] = 0; i = i + 1 } return 0 }
9
10func main() -> i64 {
11 let ph: *i64 = sys_mmap(64 * 8) as *i64 // peer_has flattened (peer*n + piece)
12 let bh: *i64 = sys_mmap(8 * 8) as *i64 // behavior per peer
13 let have: *i64 = sys_mmap(16 * 8) as *i64
14 let av: *i64 = sys_mmap(16 * 8) as *i64
15 let tr: *i64 = sys_mmap(2 * 8) as *i64
16
17 // ===== Scenario H: 4 pieces, 3 honest peers, skewed availability =====
18 // peer0=[1,1,1,1] peer1=[1,1,0,0] peer2=[1,0,0,0] (n=4)
19 ph[0]=1; ph[1]=1; ph[2]=1; ph[3]=1
20 ph[4]=1; ph[5]=1; ph[6]=0; ph[7]=0
21 ph[8]=1; ph[9]=0; ph[10]=0; ph[11]=0
22 bh[0]=0; bh[1]=0; bh[2]=0 // all honest
23
24 // availability = [3,2,1,1]
25 nx_ss_availability(ph, 3, 4, av)
26 if av[0] != 3 { return 1 }
27 if av[1] != 2 { return 2 }
28 if av[2] != 1 { return 3 }
29 if av[3] != 1 { return 4 }
30
31 // helpers
32 if nx_ss_holder(ph, 3, 4, 0) != 0 { return 5 } // peer0 lowest holder of piece0
33 if nx_ss_holder(ph, 3, 4, 2) != 0 { return 6 } // only peer0 has piece2
34 if nx_ss_any_honest_holder(ph, bh, 3, 4, 3) != 1 { return 7 }
35
36 // rarest-first run completes in 4 rounds, trace = 155776 (hand-traced)
37 _zero(have, 4)
38 if nx_ss_run(ph, bh, 3, 4, have, 0, 2, 0, 1, 50, tr) != 4 { return 8 }
39 if tr[0] != 155776 { return 9 }
40
41 // DETERMINISM: identical scenario+flags replays bit-for-bit (rounds AND trace)
42 _zero(have, 4)
43 let r2: i64 = nx_ss_run(ph, bh, 3, 4, have, 0, 2, 0, 1, 50, tr)
44 if r2 != 4 { return 10 }
45 if tr[0] != 155776 { return 11 }
46
47 // streaming-to-playable: rarest order reaches lookahead=2 only at round 4 ...
48 _zero(have, 4)
49 if nx_ss_rounds_to_playable(ph, bh, 3, 4, have, 0, 2, 2, 50) != 4 { return 12 }
50 // ... but streaming (window 2) reaches it at round 2 -- the watch-while-download win
51 _zero(have, 4)
52 if nx_ss_rounds_to_playable(ph, bh, 3, 4, have, 1, 2, 2, 50) != 2 { return 13 }
53
54 // ===== Scenario A: 3 pieces; the common last piece has a STALLER as lowest holder =====
55 // peer0=STALL has[piece2], peer1=HONEST has[all], peer2=HONEST has[piece2] (n=3)
56 _zero(ph, 64)
57 ph[0]=0; ph[1]=0; ph[2]=1 // peer0 -> piece2 only
58 ph[3]=1; ph[4]=1; ph[5]=1 // peer1 -> all
59 ph[6]=0; ph[7]=0; ph[8]=1 // peer2 -> piece2 only
60 bh[0]=1; bh[1]=0; bh[2]=0 // peer0 STALL, peer1/2 honest
61
62 // availability = [1,1,3]; lowest holder of piece2 is peer0 (the staller)
63 nx_ss_availability(ph, 3, 3, av)
64 if av[2] != 3 { return 14 }
65 if nx_ss_holder(ph, 3, 3, 2) != 0 { return 15 }
66 if nx_ss_any_honest_holder(ph, bh, 3, 3, 2) != 1 { return 16 }
67
68 // NAIVE (endgame off): fixates on the stalling lowest-holder of the last piece -> DNF
69 _zero(have, 3)
70 if nx_ss_run(ph, bh, 3, 3, have, 0, 2, 0, 1, 20, tr) != NX_SS_DNF { return 17 }
71
72 // ENDGAME (threshold=1): broadcasts the last piece to all peers -> honest peer delivers -> 3 rounds
73 _zero(have, 3)
74 if nx_ss_run(ph, bh, 3, 3, have, 0, 2, 1, 1, 20, tr) != 3 { return 18 }
75
76 // ===== Scenario N: a needed piece has NO honest holder -> even endgame must DNF (no faking) =====
77 // peer0=LIE has[piece0,piece1] (advertises, never delivers), peer1=HONEST has[piece0] (n=2)
78 _zero(ph, 64)
79 ph[0]=1; ph[1]=1 // peer0 LIE -> advertises both
80 ph[2]=1; ph[3]=0 // peer1 HONEST -> piece0 only
81 bh[0]=2; bh[1]=0 // peer0 LIE, peer1 honest
82
83 if nx_ss_any_honest_holder(ph, bh, 2, 2, 1) != 0 { return 19 } // no honest source for piece1
84 _zero(have, 2)
85 if nx_ss_run(ph, bh, 2, 2, have, 0, 2, 1, 2, 10, tr) != NX_SS_DNF { return 20 }
86
87 return 0
88}