code wiki / _hdl_build / nx_mp_relay_gate.nx
nx_mp_relay_gate.nx source
↩ module page · 78 lines · 4020 B
1// nx_mp_relay_gate.nx -- proves the sovereign daemon roster serializer (nx_mp_relay) over nx_room_relay.
2// NO JS, NO curl: a pure-nx gate. The daemon serializes OTHER live players into [len][frame] records that
3// the wasm parses with gi_net_ingest_roster. This is the /roster GET body, proven sovereignly.
4// 1) serialize 2 peers in a room -> 2 records, frame bytes byte-EXACT, in slot order
5// 2) room isolation (neg): a peer in another room is not in the body
6// 3) self excluded (neg): the requesting player never sees itself
7// 4) staleness (neg): a peer past TTL is dropped from the body
8// Built nx_cc_sovereign -> nxasm_x86 (no gcc, no .sh). license_tier: ORIGINAL
9import "nx_syscalls.nx"
10import "nx_gate_emit_lib.nx"
11import "nx_mp_relay.nx" // brings nx_room_relay (rr_*) transitively -- do NOT also import it directly (double-import -> expand_imports fail)
12
13func rec_eq(body: *u8, o: i64, expect: *u8, n: i64) -> i64 {
14 if (body[o] as i64) != n { return 0 }
15 var k: i64 = 0
16 while k < n { if body[o + 1 + k] != expect[k] { return 0 } k = k + 1 }
17 return 1
18}
19
20func main() -> i64 {
21 g_puts("nx_mp_relay gate (sovereign daemon /roster serializer, NO js/curl)\n" as *u8)
22 var pass: i64 = 0; var total: i64 = 0
23
24 let N: i64 = 8
25 let SB: i64 = 64
26 let st: *i64 = sys_mmap((2 + 5*N) * 8) as *i64
27 let arena: *u8 = sys_mmap(N * SB)
28 rr_init(st, N, SB)
29
30 let FL: i64 = 11
31 let fa: *u8 = sys_mmap(64); var i: i64=0; while i<FL { fa[i]=(100+i) as u8; i=i+1 }
32 let fb: *u8 = sys_mmap(64); i=0; while i<FL { fb[i]=(40+i) as u8; i=i+1 }
33 let fd: *u8 = sys_mmap(64); i=0; while i<FL { fd[i]=(7+i) as u8; i=i+1 }
34
35 let ROOM_A: i64 = 0x7E70
36 let ROOM_B: i64 = 0x9999
37 rr_post(st, arena, ROOM_A, 100, 1000, 1, fa, FL)
38 rr_post(st, arena, ROOM_A, 101, 1000, 1, fb, FL)
39 rr_post(st, arena, ROOM_B, 200, 1000, 1, fd, FL)
40
41 let body: *u8 = sys_mmap(1024)
42 let tb: i64 = mp_roster_body(st, arena, SB, ROOM_A, 999, 1000, 8000, body)
43 let nrec: i64 = mp_roster_count(body, tb)
44 g_puts(" [measure] roster body = " as *u8); g_pn(tb); g_puts(" bytes, " as *u8); g_pn(nrec); g_puts(" records\n" as *u8)
45
46 // 1) two records, frame bytes exact, slot order (100 -> fa at offset 0, 101 -> fb at offset 12)
47 var r1: i64 = 1
48 if nrec != 2 { r1 = 0 }
49 if rec_eq(body, 0, fa, FL) != 1 { r1 = 0 }
50 if rec_eq(body, 1 + FL, fb, FL) != 1 { r1 = 0 } // second record starts after [len:1][11 bytes]
51 pass = pass + g_check("serialize: 2 records, frames byte-exact, slot order" as *u8, r1); total=total+1
52
53 // 2) room isolation -- room B's peer 200 never appears (its frame fd is absent)
54 var r2: i64 = 1
55 var found_b: i64 = 0
56 var o: i64 = 0
57 while o < tb { let fl: i64 = body[o] as i64; if rec_eq(body, o, fd, FL) == 1 { found_b = 1 } o = o + 1 + fl }
58 if found_b != 0 { r2 = 0 }
59 pass = pass + g_check("room isolation: other-room peer absent from body (neg)" as *u8, r2); total=total+1
60
61 // 3) self excluded -- request as peer 100, must not contain fa
62 let tb2: i64 = mp_roster_body(st, arena, SB, ROOM_A, 100, 1000, 8000, body)
63 var r3: i64 = 1
64 var found_self: i64 = 0
65 o = 0
66 while o < tb2 { let fl: i64 = body[o] as i64; if rec_eq(body, o, fa, FL) == 1 { found_self = 1 } o = o + 1 + fl }
67 if found_self != 0 { r3 = 0 }
68 if mp_roster_count(body, tb2) != 1 { r3 = 0 } // only peer 101 remains
69 pass = pass + g_check("self excluded from own roster (neg)" as *u8, r3); total=total+1
70
71 // 4) staleness -- advance now past TTL; body empties
72 let tb3: i64 = mp_roster_body(st, arena, SB, ROOM_A, 999, 20000, 8000, body)
73 pass = pass + g_check("stale peers dropped from body (neg)" as *u8, tb3 == 0); total=total+1
74
75 g_puts("---- mp-relay gate: passed " as *u8); g_pn(pass); g_puts(" / " as *u8); g_pn(total); g_puts(" ----\n" as *u8)
76 if pass == total { g_puts("verdict=GREEN\n" as *u8); sys_exit(0); return 0 }
77 g_puts("verdict=RED\n" as *u8); sys_exit(1); return 1
78}