Prove two hosts share one tip: join via /sync, gossip live transfers both ways.
Evidence: bun run test:net (spawns two real node processes).
# Terminal A — genesis + illuminator
bun run pixel -- init --datadir ./data/a
bun run pixel -- wallet from-node sequencer --datadir ./data/a
bun run pixel -- node --datadir ./data/a --rpc 8545 --gossip 9001 --advertise 127.0.0.1
# Terminal B — join snapshot, then dial gossip
bun run pixel -- join --peer http://127.0.0.1:8545 --datadir ./data/b
bun run pixel -- node --datadir ./data/b --rpc 8546 --gossip 9002 \
--seed ws://127.0.0.1:9001/gossip --advertise 127.0.0.1
Check:
curl -s http://127.0.0.1:8545/health | jq '{pixels,peers,gossipUrl,gate}'
curl -s http://127.0.0.1:8546/health | jq '{pixels,peers,gossipUrl,gate}'
Both should show the same pixels count after a transfer. Submit a signed tx with POST /tx (see scripts/net-selftest.ts) or use bun run pixel -- send … against the running illuminator’s datadir.
A_HOST): open RPC + gossip ports (e.g. 8545, 9001).127.0.0.1):bun run pixel -- init --datadir ./data/a
bun run pixel -- node --datadir ./data/a --rpc 8545 --gossip 9001 --advertise A_HOST
bun run pixel -- join --peer http://A_HOST:8545 --datadir ./data/b
bun run pixel -- node --datadir ./data/b --rpc 8546 --gossip 9002 \
--seed ws://A_HOST:9001/gossip --advertise B_HOST
join pulls /sync (pixels + sequencers + gossipUrl) and saves the gossip seed into the peer book. Nodes reconnect with backoff if the socket drops, and periodically get_pixels for hole-fill.
If mempool has pending txs and the tip is silent past stallCheckMs / POLS_STALL_MS (default 15s), a standby sequencer may illuminate with skipCount ≥ 1. Peers accept only after the stall window; fork-choice prefers lower skip at the same height. See SPEC §4.1 and bun run test:fault.
bun run test:net
Expect: join via /sync, peers linked, tip advances on both nodes for A→B and B→A gossip paths.