nim-chat-poc/.github/Dockerfile.sim
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

171 lines
8.6 KiB
Docker

# ===========================================================================
# Stage 1: Builder — build everything, package runtime closure
# ===========================================================================
FROM catthehacker/ubuntu:act-latest AS builder
RUN apt-get update -qq && apt-get install -y -qq \
build-essential pkg-config libssl-dev git curl docker.io xxd \
&& rm -rf /var/lib/apt/lists/*
# Nix
RUN curl -L https://nixos.org/nix/install | bash -s -- --daemon --yes
RUN mkdir -p /root/.config/nix && \
printf 'experimental-features = nix-command flakes\nsandbox = false\n' > /root/.config/nix/nix.conf
RUN rmdir /homeless-shelter 2>/dev/null || true
# Rust + cargo-risczero
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
ENV PATH="/root/.cargo/bin:${PATH}"
RUN cargo install cargo-risczero
RUN git config --global url."https://github.com/".insteadOf "git@github.com:"
SHELL ["/bin/bash", "-lc"]
# logos-blockchain-circuits (architecture-aware)
RUN ARCH=$(uname -m | sed 's/arm64/aarch64/') && \
CIRCUITS_URL="https://github.com/logos-blockchain/logos-blockchain-circuits/releases/download/v0.4.2/logos-blockchain-circuits-v0.4.2-linux-${ARCH}.tar.gz" && \
echo "Downloading circuits: $CIRCUITS_URL" && \
mkdir -p /root/.logos-blockchain-circuits && \
curl -sL "$CIRCUITS_URL" | tar xz -C /root/.logos-blockchain-circuits && \
mv /root/.logos-blockchain-circuits/logos-blockchain-circuits-*/* /root/.logos-blockchain-circuits/ 2>/dev/null || true && \
rmdir /root/.logos-blockchain-circuits/logos-blockchain-circuits-* 2>/dev/null || true
# --- LEZ modules ---
RUN source /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh && \
cd /root && \
git clone -b feat/mix-rln-gifter-sim https://github.com/logos-co/logos-lez-rln.git && \
cd logos-lez-rln && \
git submodule update --init && \
(cd logos-delivery-module && git submodule update --init --recursive)
RUN source /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh && \
cd /root/logos-lez-rln && \
nix build .#logos-rln-module -o logos-rln-module/result-rln
RUN source /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh && \
cd /root/logos-lez-rln && \
(cd logos-execution-zone-module && \
RISC0_SKIP_BUILD_KERNELS=1 nix build --impure \
--override-input logos-execution-zone "git+file://$(pwd)/../lssa" \
-o ../logos-rln-module/result-wallet)
RUN source /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh && \
nix build github:logos-co/logos-liblogos/7df6195 \
--override-input logos-cpp-sdk github:logos-co/logos-cpp-sdk/a4bd66c \
-o /root/logoscore-result
RUN source /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh && \
cd /root/logos-lez-rln/logos-delivery-module/vendor/logos-delivery && \
make -j1 liblogosdelivery 2>&1 | tail -5
RUN source /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh && \
cd /root/logos-lez-rln && \
SDK_PATH=$(nix build github:logos-co/logos-cpp-sdk/a4bd66c --no-link --print-out-paths 2>/dev/null) && \
LIBLOGOS_PATH=$(nix build github:logos-co/logos-liblogos/7df6195 \
--override-input logos-cpp-sdk github:logos-co/logos-cpp-sdk/a4bd66c \
--no-link --print-out-paths 2>/dev/null) && \
QT_BASE=$(find /nix/store -maxdepth 1 -name "*qtbase-6*" -type d 2>/dev/null | head -1) && \
QT_RO=$(find /nix/store -maxdepth 1 -name "*qtremoteobjects-6*" -type d 2>/dev/null | head -1) && \
DELIVERY_MOD="$PWD/logos-delivery-module" && \
cd logos-delivery-module && rm -rf build_plugin && mkdir build_plugin && cd build_plugin && \
mkdir -p delivery_root/bin delivery_root/liblogosdelivery && \
cp "$DELIVERY_MOD/vendor/logos-delivery/build/liblogosdelivery."* delivery_root/bin/ 2>/dev/null || true && \
cp "$DELIVERY_MOD/vendor/logos-delivery/liblogosdelivery/liblogosdelivery.h" delivery_root/liblogosdelivery/ && \
nix-shell -p cmake ninja pkg-config postgresql --run " \
cmake .. -GNinja \
-DLOGOS_CPP_SDK_ROOT=$SDK_PATH \
-DLOGOS_LIBLOGOS_ROOT=$LIBLOGOS_PATH \
-DLOGOS_DELIVERY_ROOT=\$PWD/delivery_root \
-DLOGOS_MESSAGING_MODULE_USE_VENDOR=OFF \
-DCMAKE_PREFIX_PATH=\"$QT_BASE;$QT_RO\" \
-DQT_ADDITIONAL_PACKAGES_PREFIX_PATH=$QT_RO && \
ninja" 2>&1 | tail -5
RUN source /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh && \
CLANG_SO=$(find /nix/store -maxdepth 3 -name 'libclang.so' 2>/dev/null | head -1) && \
export LIBCLANG_PATH=$(dirname "$CLANG_SO") && \
STDBOOL=$(find "$LIBCLANG_PATH" -maxdepth 5 -name 'stdbool.h' 2>/dev/null | head -1) && \
[ -n "$STDBOOL" ] && export BINDGEN_EXTRA_CLANG_ARGS="-I$(dirname $STDBOOL)" ; \
cd /root/logos-lez-rln/lssa && \
cargo build --features standalone -p sequencer_service 2>&1 | tail -5
# Build run_setup binary (deploys LEZ programs to sequencer at sim runtime)
RUN cd /root/logos-lez-rln/lez-rln && \
cargo build --bin run_setup 2>&1 | tail -5
# --- logos-chat (liblogoschat) ---
RUN source /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh && \
cd /root && \
git clone -b feat/logos-delivery https://github.com/adklempner/logos-chat.git && \
cd logos-chat && \
git submodule update --init --depth 1 && \
(cd vendor/nwaku && git submodule update --init --recursive --depth 1) && \
(cd vendor/nimbus-build-system && git submodule update --init --recursive --depth 1) && \
make update && make liblogoschat 2>&1 | tail -5
# --- logos-chat-module (chat_module_plugin) ---
RUN source /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh && \
cd /root && \
git clone -b feat/logos-delivery https://github.com/adklempner/logos-chat-module.git && \
cd logos-chat-module && nix build 2>&1 | tail -5
# --- Package runtime closure ---
RUN source /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh && \
{ \
nix-store -qR /root/logos-lez-rln/logos-rln-module/result-rln; \
nix-store -qR /root/logos-lez-rln/logos-rln-module/result-wallet; \
nix-store -qR /root/logoscore-result; \
nix-store -qR /root/logos-chat-module/result; \
} | sort -u > /tmp/nix-closure-paths.txt && \
tar cf /tmp/nix-closure.tar -T /tmp/nix-closure-paths.txt && \
echo "Closure: $(wc -l < /tmp/nix-closure-paths.txt) paths, $(du -sh /tmp/nix-closure.tar | cut -f1)"
# ===========================================================================
# Stage 2: Runtime — minimal image, no nix/Rust/cargo needed
# ===========================================================================
FROM catthehacker/ubuntu:act-latest
RUN apt-get update -qq && apt-get install -y -qq \
build-essential pkg-config libssl-dev git curl xxd netcat-openbsd lsof \
clang libclang-dev \
&& rm -rf /var/lib/apt/lists/*
# Rust + r0vm (needed for: sequencer build + risc0 dev prover)
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
ENV PATH="/root/.cargo/bin:${PATH}"
RUN cargo install cargo-risczero
RUN git config --global url."https://github.com/".insteadOf "git@github.com:"
# Import runtime nix closure from builder
COPY --from=builder /tmp/nix-closure.tar /tmp/
# Import nix store runtime closure from builder. These are loaded by
# direct path (not via nix), so no nix DB registration needed.
# The runtime nix has its own clean DB for nix-shell package downloads.
RUN mkdir -p /nix/store && tar xf /tmp/nix-closure.tar -C / && rm /tmp/nix-closure.tar
# Pre-built LEZ module outputs
COPY --from=builder /root/logos-lez-rln/logos-rln-module/result-rln /root/lez-modules/result-rln
COPY --from=builder /root/logos-lez-rln/logos-rln-module/result-wallet /root/lez-modules/result-wallet
COPY --from=builder /root/logos-lez-rln/logos-delivery-module/build_plugin/modules/ /root/lez-modules/delivery-plugin/
COPY --from=builder /root/logos-lez-rln/logos-delivery-module/vendor/logos-delivery/build/ /root/lez-modules/delivery-build/
# NOTE: sequencer + run_setup are NOT pre-built. Binaries compiled in the
# builder stage crash at runtime due to library mismatch between Docker stages.
# They're built from source at runtime with system clang (~1.5 min).
# The lssa source is cloned at runtime via setup_and_run.sh submodule init.
COPY --from=builder /root/logoscore-result /root/lez-modules/logoscore-result
COPY --from=builder /root/.logos-blockchain-circuits /root/.logos-blockchain-circuits
COPY --from=builder /root/logos-lez-rln/dev /root/lez-modules/dev
# Pre-built logos-chat outputs
COPY --from=builder /root/logos-chat/build/liblogoschat.so /root/lez-modules/liblogoschat.so
COPY --from=builder /root/logos-chat-module/result /root/lez-modules/chat-module-result