diff --git a/.github/workflows/gossipsub-interop-pr.yml b/.github/workflows/gossipsub-interop-pr.yml index 48643e9c5..58fc65101 100644 --- a/.github/workflows/gossipsub-interop-pr.yml +++ b/.github/workflows/gossipsub-interop-pr.yml @@ -18,6 +18,13 @@ jobs: - name: Checkout code uses: actions/checkout@v4 + - name: Checkout eth-p2p-z + uses: actions/checkout@v4 + with: + repository: zen-eth/eth-p2p-z + ref: feat/gossipsub + path: ../eth-p2p-z + - name: Set up Go uses: actions/setup-go@v5 with: @@ -32,6 +39,19 @@ jobs: curl https://nim-lang.org/choosenim/init.sh -sSf | sh -s -- -y echo "$HOME/.nimble/bin" >> $GITHUB_PATH + - name: Set up Zig 0.15.2 + run: | + curl -fL https://ziglang.org/download/0.15.2/zig-x86_64-linux-0.15.2.tar.xz \ + | sudo tar -xJ -C /usr/local + sudo ln -sf /usr/local/zig-x86_64-linux-0.15.2/zig /usr/local/bin/zig + zig version + + - name: Cache Zig global packages + uses: actions/cache@v4 + with: + path: ~/.cache/zig + key: zig-0.15.2 + - name: Install uv run: | curl -LsSf https://astral.sh/uv/install.sh | sh @@ -52,7 +72,8 @@ jobs: netbase \ python3 \ python3-networkx \ - xz-utils + xz-utils \ + zlib1g-dev # Build and install Shadow v3.3.0 from source git clone --depth 1 --branch v3.3.0 https://github.com/shadow/shadow.git shadow-simulator @@ -67,6 +88,11 @@ jobs: run: make test continue-on-error: true + - name: Run gossipsub interop tests (Zig) + working-directory: gossipsub-interop + run: make test-zig + continue-on-error: true + - name: Upload Shadow output if: always() uses: actions/upload-artifact@v4 diff --git a/gossipsub-interop/Dockerfile b/gossipsub-interop/Dockerfile new file mode 100644 index 000000000..36bba75e3 --- /dev/null +++ b/gossipsub-interop/Dockerfile @@ -0,0 +1,36 @@ +# Shadow network simulator + Zig build environment +# Runs on linux/amd64 (Shadow requirement). +# +# Uses the pre-built shadowsim/shadow-ci image so we skip the ~1h Shadow +# Rust compilation that was previously needed under QEMU on Apple Silicon. +# +# Build: +# docker build --platform linux/amd64 -t gossipsub-shadow . +# +# Run (from gossipsub-interop directory): +# docker run --rm --platform linux/amd64 \ +# -v $(pwd):/work \ +# -v /path/to/eth-p2p-z:/eth-p2p-z \ +# -v $HOME/.cache/zig:/root/.cache/zig \ +# gossipsub-shadow \ +# bash /work/run-shadow.sh --node_count 4 --composition all-zig --scenario subnet-blob-msg + +FROM --platform=linux/amd64 shadowsim/shadow-ci:ubuntu-22.04-gcc-release + +# ── Extra system libraries needed by the Zig/C build ───────────────────── +# zlib1g-dev: required by lsquic (zlib.h) +RUN apt-get update && apt-get install -y \ + zlib1g-dev \ + git \ + && rm -rf /var/lib/apt/lists/* + +# ── Zig 0.15.2 ──────────────────────────────────────────────────────────── +RUN curl -fL https://ziglang.org/download/0.15.2/zig-x86_64-linux-0.15.2.tar.xz \ + | tar -xJ -C /usr/local \ + && ln -s /usr/local/zig-x86_64-linux-0.15.2/zig /usr/local/bin/zig + +# ── uv (Python package manager for experiment scripts) ──────────────────── +RUN curl -LsSf https://astral.sh/uv/install.sh | sh +ENV PATH="/root/.local/bin:${PATH}" + +WORKDIR /work diff --git a/gossipsub-interop/Makefile b/gossipsub-interop/Makefile index 90a60bf7b..b3d2dc033 100644 --- a/gossipsub-interop/Makefile +++ b/gossipsub-interop/Makefile @@ -26,6 +26,8 @@ binaries: nim-libp2p/gossipsub-bin cd go-libp2p && go build -linkshared -o gossipsub-bin cd rust-libp2p && cargo build cd jvm-libp2p && ./gradlew installDist + zig build --build-file $(CURDIR)/../../eth-p2p-z/build.zig --prefix $(CURDIR)/zig-libp2p/zig-out -Doptimize=ReleaseFast -Dlibxev-backend=epoll + cp $(CURDIR)/zig-libp2p/zig-out/bin/gossipsub-bin $(CURDIR)/zig-libp2p/gossipsub-bin # Clean all generated shadow simulation files clean: @@ -119,5 +121,13 @@ test-rust-only: @uv run run.py --node_count 2 --composition rust --scenario "partial-messages-fanout" && uv run checks/partial_messages.py latest/ +test-zig: + # Testing all-zig subnet-blob-msg + @echo "Testing all-zig subnet-blob-msg" + @uv run run.py --node_count 4 --composition zig --scenario "subnet-blob-msg" && uv run checks/subnet_blob_msg.py latest/ -.PHONY: binaries all clean test test-rust-only test-go test-subnet-blob test-partial-messages +test-zig-go: + @echo "Testing zig+go subnet-blob-msg" + @uv run run.py --node_count 16 --composition zig go --scenario "subnet-blob-msg" && uv run checks/subnet_blob_msg.py latest/ + +.PHONY: binaries all clean test test-rust-only test-go test-subnet-blob test-partial-messages test-zig test-zig-go diff --git a/gossipsub-interop/experiment.py b/gossipsub-interop/experiment.py index 7ecca96fb..211418488 100644 --- a/gossipsub-interop/experiment.py +++ b/gossipsub-interop/experiment.py @@ -346,6 +346,7 @@ def scenario( "rust": "rust-libp2p/target/debug/rust-libp2p-gossip", "nim": "nim-libp2p/gossipsub-bin", "jvm": "jvm-libp2p/build/install/jvm-libp2p-gossip/bin/jvm-libp2p-gossip", + "zig": "zig-libp2p/gossipsub-bin", } diff --git a/gossipsub-interop/run.py b/gossipsub-interop/run.py index 90dfe111b..f1a7da2b2 100644 --- a/gossipsub-interop/run.py +++ b/gossipsub-interop/run.py @@ -57,9 +57,7 @@ def main(): timestamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S") composition_label = "-".join(args.composition) - args.output_dir = f"{args.scenario}-{args.node_count}-{composition_label}-{ - args.seed - }-{timestamp}-{git_describe}.data" + args.output_dir = f"{args.scenario}-{args.node_count}-{composition_label}-{args.seed}-{timestamp}-{git_describe}.data" if not os.path.isabs(args.output_dir): args.output_dir = os.path.join(shadow_outputs_dir, args.output_dir) diff --git a/gossipsub-interop/zig-libp2p/.gitignore b/gossipsub-interop/zig-libp2p/.gitignore new file mode 100644 index 000000000..f204361ff --- /dev/null +++ b/gossipsub-interop/zig-libp2p/.gitignore @@ -0,0 +1,4 @@ +gossipsub-interop/zig-libp2p/.zig-cache/ +zig-pkg/ +.zig-cache/ +zig-out/