Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
205 changes: 205 additions & 0 deletions test-infra/docker-compose.mixed-dkg-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,205 @@
# Mixed Pluto/Charon DKG ceremony test.
#
# Runs a full DKG ceremony with 4 nodes: 2 Pluto (node0, node1) and 2 Charon
# (node2, node3) by default. Each node image is independently configurable.
#
# Override per-node images to mix implementations:
#
# NODE0_IMAGE=obolnetwork/charon:latest NODE1_IMAGE=obolnetwork/charon:latest \
# docker compose -f docker-compose.mixed-dkg-test.yml up
#
# Use the external Obol relay instead of the internal one:
#
# RELAY_URL=https://0.relay.obol.tech \
# docker compose -f docker-compose.mixed-dkg-test.yml up
#
# Network topology — relay bridges isolated node networks; nodes share
# nodes_net for direct connections:
#
# relay ── node0_net ── node0 ──┐
# ── node1_net ── node1 ──┤ nodes_net
# ── node2_net ── node2 ──┤ (direct connections)
# ── node3_net ── node3 ──┘
#
# Override image tags:
# PLUTO_IMAGE=nethermindeth/pluto:1.7.1 CHARON_IMAGE=obolnetwork/charon:v0.19.0 \
# docker compose -f docker-compose.mixed-dkg-test.yml up
#
# Reset cluster data and start fresh:
# docker compose -f docker-compose.mixed-dkg-test.yml down -v

name: pluto-mixed-dkg-test

services:
init:
image: busybox
command: >-
sh -c "mkdir -p /cluster/node-0 /cluster/node-1 /cluster/node-2 /cluster/node-3 /cluster/relay
&& chmod -R 777 /cluster"
volumes:
- cluster-data:/cluster

setup-enr:
image: docker:cli
entrypoint: ["/bin/sh", "-c"]
command:
- |
set -e
for node in node-0 node-1 node-2 node-3; do
docker run --rm -v pluto-mixed-dkg-test_cluster-data:/cluster \
${PLUTO_IMAGE:-nethermindeth/pluto:main} \
create enr --data-dir=/cluster/$$node 2>&1 | grep '^enr:' | head -1 > /cluster/$$node/enr.txt
done
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- cluster-data:/cluster
depends_on:
init:
condition: service_completed_successfully

create-dkg:
image: docker:cli
entrypoint: ["/bin/sh", "-c"]
command:
- |
set -e
ENR0=$$(cat /cluster/node-0/enr.txt)
ENR1=$$(cat /cluster/node-1/enr.txt)
ENR2=$$(cat /cluster/node-2/enr.txt)
ENR3=$$(cat /cluster/node-3/enr.txt)
docker run --rm -v pluto-mixed-dkg-test_cluster-data:/cluster \
${PLUTO_IMAGE:-obolnetwork/charon:latest} \
create dkg \
--operator-enrs="$$ENR0,$$ENR1,$$ENR2,$$ENR3" \
--threshold=3 \
--fee-recipient-addresses=0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF \
--withdrawal-addresses=0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF \
--network=holesky \
--name=test-dkg \
--output-dir=/cluster
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- cluster-data:/cluster
depends_on:
setup-enr:
condition: service_completed_successfully

fix-perms:
image: busybox
command: chmod -R a+rX /cluster
volumes:
- cluster-data:/cluster
depends_on:
create-dkg:
condition: service_completed_successfully

relay:
image: ${PLUTO_IMAGE:-nethermindeth/pluto:main}
command:
- relay
- --http-address=0.0.0.0:3640
- --p2p-tcp-address=0.0.0.0:3610
- --p2p-udp-address=0.0.0.0:3630
- --p2p-advertise-private-addresses
- --data-dir=/cluster/relay
depends_on:
fix-perms:
condition: service_completed_successfully
volumes:
- cluster-data:/cluster
networks:
- node0_net
- node1_net
- node2_net
- node3_net

node0:
image: ${NODE0_IMAGE:-nethermindeth/pluto:main}
environment:
- CHARON_LOG_LEVEL=${LOG_LEVEL:-info}
command:
- dkg
- --definition-file=/cluster/cluster-definition.json
- --data-dir=/cluster/node-0
- "--p2p-relays=${RELAY_URL:-http://relay:3640}"
- --p2p-tcp-address=0.0.0.0:3610
depends_on:
relay:
condition: service_started
volumes:
- cluster-data:/cluster
networks:
- node0_net
- nodes_net

node1:
image: ${NODE1_IMAGE:-nethermindeth/pluto:main}
environment:
- CHARON_LOG_LEVEL=${LOG_LEVEL:-info}
command:
- dkg
- --definition-file=/cluster/cluster-definition.json
- --data-dir=/cluster/node-1
- "--p2p-relays=${RELAY_URL:-http://relay:3640}"
- --p2p-tcp-address=0.0.0.0:3610
depends_on:
relay:
condition: service_started
volumes:
- cluster-data:/cluster
networks:
- node1_net
- nodes_net

node2:
image: ${NODE2_IMAGE:-obolnetwork/charon:latest}
environment:
- CHARON_LOG_LEVEL=${LOG_LEVEL:-info}
command:
- dkg
- --definition-file=/cluster/cluster-definition.json
- --data-dir=/cluster/node-2
- "--p2p-relays=${RELAY_URL:-http://relay:3640}"
- --p2p-tcp-address=0.0.0.0:3610
depends_on:
relay:
condition: service_started
volumes:
- cluster-data:/cluster
networks:
- node2_net
- nodes_net

node3:
image: ${NODE3_IMAGE:-obolnetwork/charon:latest}
environment:
- CHARON_LOG_LEVEL=${LOG_LEVEL:-info}
command:
- dkg
- --definition-file=/cluster/cluster-definition.json
- --data-dir=/cluster/node-3
- "--p2p-relays=${RELAY_URL:-http://relay:3640}"
- --p2p-tcp-address=0.0.0.0:3610
depends_on:
relay:
condition: service_started
volumes:
- cluster-data:/cluster
networks:
- node3_net
- nodes_net

networks:
node0_net:
driver: bridge
node1_net:
driver: bridge
node2_net:
driver: bridge
node3_net:
driver: bridge
nodes_net:
driver: bridge

volumes:
cluster-data:
Loading