nim-chat-poc/scripts/fix_mix_librln_dupes.sh
Arseniy Klempner 29c64b340d
feat: mix+LEZ+RLN chat over the testnet via 2-phase gifter
Chat-side integration of the LEZ-backed RLN mix protocol:
- src/chat/delivery/waku_client.nim: mount waku_mix with onchain
  RLN spam protection wired to logos_core_client fetchers; gate
  the first publish on (a) gifter status confirmation, (b)
  cushion of 2 poll intervals after confirmation, and (c) proof
  root stability in the local valid_roots window; wrap mix
  lightpush in withTimeout so vanished SURB replies surface as
  Err instead of pinning the send coroutine.
- src/chat/client.nim: surface sendBytes errors via asyncSpawn
  wrapped try/except instead of discarding the future (was
  hiding every mix-publish failure).
- chat-side gifter client invocation (RLN membership service
  wire format, EIP-191 ethereum-allowlist auth).
- Background membership status watcher that reconciles the
  optimistic leaf returned by the gifter against the chain's
  authoritative leaf via the status RPC.

Simulation harness (simulations/mix_lez_chat/):
- Spin up sequencer + run_setup + 4 mix nodes (one of which
  runs the gifter service) + chat sender + chat receiver.
- SIM_NETWORK={local,testnet}, SIM_SLIM for testnet (reuses
  shipped config_account + cached payment_account), Docker
  image + GHCR for cross-platform testing.
- Strict mix-pool readiness gate, kademlia + RLN root activity
  checks, gifter EIP-191 auth fixture, slim-mode submodule
  minimization.
- TREE_ID_HEX pinned to the canonical testnet deployment.

Submodule bumps:
- vendor/nwaku to 8e6ba04 (LEZ-backed RLN mix + 2-phase gifter).
- vendor/logos-lez-rln to 950f287 (SPEL RLN program + mix sim
  infrastructure + canonical testnet deploy).

Docs:
- RUN_SLIM_TESTNET.md: slim sim recipe.
- cleanup/MODE_A_GIFTER_SLOT_BUG.md: per-signer nonce collision
  postmortem driving the queue+worker fix.
2026-05-28 10:53:36 -06:00

42 lines
1.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# Fix duplicate symbols between librln_mix and rust-bundle on macOS.
set -uo pipefail
LIB="$(cd "$(dirname "$1")" && pwd)/$(basename "$1")"
RUST_BUNDLE="${2:-}"
[ -n "$RUST_BUNDLE" ] && RUST_BUNDLE="$(cd "$(dirname "$RUST_BUNDLE")" && pwd)/$(basename "$RUST_BUNDLE")"
case "$(uname -s)" in
Darwin)
[ -z "$RUST_BUNDLE" ] && echo "Usage: $0 <mix-lib> <rust-bundle-lib>" && exit 0
WORK=$(mktemp -d)
trap 'rm -rf "$WORK"' EXIT
# Match all global symbols (T=text, D=data, S=common, B=BSS, etc — uppercase = global)
(nm "$RUST_BUNDLE" 2>/dev/null || true) | grep " [TDSBCR] " | awk '{print $3}' | sort -u > "$WORK/b.txt"
(nm "$LIB" 2>/dev/null || true) | grep " [TDSBCR] " | awk '{print $3}' | sort -u > "$WORK/m.txt"
comm -12 "$WORK/b.txt" "$WORK/m.txt" > "$WORK/d.txt"
DCOUNT=$(wc -l < "$WORK/d.txt" | tr -d ' ')
[ "$DCOUNT" -eq 0 ] && echo "No duplicates." && exit 0
echo "Localizing $DCOUNT duplicate symbols in $(basename "$LIB")..."
mkdir "$WORK/o" && cd "$WORK/o"
ar x "$LIB"
FIXED=0
for f in *.o; do
# Get this object's global text symbols, intersect with dupes
(nm "$f" 2>/dev/null || true) | grep " [TDSBCR] " | awk '{print $3}' | sort -u > "$WORK/obj.txt"
comm -12 "$WORK/d.txt" "$WORK/obj.txt" > "$WORK/obj_dupes.txt"
if [ -s "$WORK/obj_dupes.txt" ]; then
nmedit -R "$WORK/obj_dupes.txt" "$f"
FIXED=$((FIXED + 1))
fi
done
rm "$LIB"
ar rcs "$LIB" *.o
echo "Fixed $FIXED objects."
;;
*) echo "No fix needed on $(uname -s)" ;;
esac