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}