From e8239ca770573f2463ebfa16edd6d4d787b841ce Mon Sep 17 00:00:00 2001 From: ch4r10t33r Date: Wed, 14 Jan 2026 12:12:20 +0000 Subject: [PATCH 1/6] feat: Added new cli arguments to specify docker-image --- README.md | 7 +++ client-cmds/qlean-cmd.sh | 2 +- client-cmds/zeam-cmd.sh | 4 +- local-devnet/genesis/validator-config.yaml | 51 +++++++++++----------- parse-env.sh | 6 +++ spin-node.sh | 11 +++++ 6 files changed, 52 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 3b2916a..d1587d2 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,9 @@ NETWORK_DIR=local-devnet ./spin-node.sh --node all --generateGenesis --deploymen # Run only zeam_0 and ream_0 nodes (comma-separated) NETWORK_DIR=local-devnet ./spin-node.sh --node zeam_0,ream_0 --generateGenesis --popupTerminal +# Run zeam_0 with a custom Docker image override (without editing client-cmds) +NETWORK_DIR=local-devnet ./spin-node.sh --node zeam_0 --generateGenesis --docker-image ghcr.io/your-org/custom-zeam:dev + # Run only zeam_0 and qlean_0 nodes (space-separated) NETWORK_DIR=local-devnet ./spin-node.sh --node "zeam_0 qlean_0" --generateGenesis --popupTerminal @@ -119,6 +122,10 @@ NETWORK_DIR=local-devnet ./spin-node.sh --node all --generateGenesis --metrics - If not provided, defaults to `latest` for zeam, ream, and lantern, and `dd67521` for qlean - The script will automatically pull the specified Docker images before running containers - Example: `--tag devnet0` or `--tag devnet1` +11. `--docker-image` specifies a full Docker image reference (image[:tag]) to override the default client image. + - Applies to Docker mode only; the override is injected into the `node_docker` command for the selected nodes. + - Useful for testing local builds or custom tags without modifying `client-cmds/*-cmd.sh`. + - Example: `--docker-image ghcr.io/your-org/custom-zeam:dev` 12. `--metrics` enables metrics collection on all nodes. When specified, each client will activate its metrics endpoint according to its implementation. Metrics ports are configured per node in `validator-config.yaml`. ### Clients supported diff --git a/client-cmds/qlean-cmd.sh b/client-cmds/qlean-cmd.sh index 178ca98..7054c8a 100644 --- a/client-cmds/qlean-cmd.sh +++ b/client-cmds/qlean-cmd.sh @@ -17,7 +17,7 @@ node_binary="$scriptDir/qlean/build/src/executable/qlean \ --prometheus-port $metricsPort \ -ldebug" -node_docker="qdrvm/qlean-mini:3a96a1f \ +node_docker="qdrvm/qlean-mini:273cfa1 \ --genesis /config/config.yaml \ --validator-registry-path /config/validators.yaml \ --validator-keys-manifest /config/hash-sig-keys/validator-keys-manifest.yaml \ diff --git a/client-cmds/zeam-cmd.sh b/client-cmds/zeam-cmd.sh index 1485465..7afef7d 100644 --- a/client-cmds/zeam-cmd.sh +++ b/client-cmds/zeam-cmd.sh @@ -6,7 +6,7 @@ # Metrics enabled by default metrics_flag="--metrics_enable" -node_binary="$scriptDir/../zig-out/bin/zeam node \ +node_binary="$scriptDir/../zeam/zig-out/bin/zeam node \ --custom_genesis $configDir \ --validator_config $validatorConfig \ --data-dir $dataDir/$item \ @@ -14,7 +14,7 @@ node_binary="$scriptDir/../zig-out/bin/zeam node \ $metrics_flag \ --metrics_port $metricsPort" -node_docker="--security-opt seccomp=unconfined blockblaz/zeam:devnet1 node \ +node_docker="--security-opt seccomp=unconfined zeam:local --console_log_level debug --log_file_active_level debug node \ --custom_genesis /config \ --validator_config $validatorConfig \ --data-dir /data \ diff --git a/local-devnet/genesis/validator-config.yaml b/local-devnet/genesis/validator-config.yaml index d41cce7..3efa123 100644 --- a/local-devnet/genesis/validator-config.yaml +++ b/local-devnet/genesis/validator-config.yaml @@ -16,46 +16,45 @@ validators: metricsPort: 8081 count: 1 # number of indices for this node - - name: "ream_0" + - name: "zeam_1" # node id bc531fc1a99a896acb45603f28a32f81ae607480af46435009de4609370cb7bb # peer id 16Uiu2HAmPQhkD6Zg5Co2ee8ShshkiY4tDePKFARPpCS2oKSLj1E1 privkey: "af27950128b49cda7e7bc9fcb7b0270f7a3945aa7543326f3bfdbd57d2a97a32" enrFields: - #verify /ip4/127.0.0.1/udp/9001/quic-v1/p2p/16Uiu2HAmPQhkD6Zg5Co2ee8ShshkiY4tDePKFARPpCS2oKSLj1E1 + #verify /ip4/127.0.0.1/udp/9002/quic-v1/p2p/16Uiu2HAmPQhkD6Zg5Co2ee8ShshkiY4tDePKFARPpCS2oKSLj1E1 ip: "127.0.0.1" quic: 9002 metricsPort: 8082 - devnet: 1 count: 1 - - name: "qlean_0" - # TODO: add a third entry in nodes.yaml corresponding to this + - name: "zeam_2" + # node id for zeam_2 privkey: "c2bbdac5e876b3e9d4b8b6b8c2bbdac5e876b3e9d4b8b6b8c2bbdac5e876b3e9" enrFields: - #verify /ip4/127.0.0.1/udp/9001/quic-v1/p2p/16Uiu2HAmPQhkD6Zg5Co2ee8ShshkiY4tDePKFARPpCS2oKSLj1E1 + #verify /ip4/127.0.0.1/udp/9003/quic-v1/p2p/16Uiu2HAmQj1RDNAxopeeeCFPRr3zhJYmH6DEPHYKmxLViLahWcFE ip: "127.0.0.1" quic: 9003 metricsPort: 8083 count: 1 - - name: "lantern_0" - # node id a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2 - # peer id 16Uiu2HAm7TYVs6qvDKnrovd9m4vvRikc4HPXm1WyLumKSe5fHxBv - privkey: "d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5" - # verify /ip4/127.0.0.1/udp/9004/quic-v1/p2p/16Uiu2HAm7TYVs6qvDKnrovd9m4vvRikc4HPXm1WyLumKSe5fHxBv - enrFields: - ip: "127.0.0.1" - quic: 9004 - metricsPort: 8084 - count: 1 + # - name: "lantern_0" + # # node id a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2 + # # peer id 16Uiu2HAm7TYVs6qvDKnrovd9m4vvRikc4HPXm1WyLumKSe5fHxBv + # privkey: "d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5" + # # verify /ip4/127.0.0.1/udp/9004/quic-v1/p2p/16Uiu2HAm7TYVs6qvDKnrovd9m4vvRikc4HPXm1WyLumKSe5fHxBv + # enrFields: + # ip: "127.0.0.1" + # quic: 9004 + # metricsPort: 8084 + # count: 1 - - name: "lighthouse_0" - # node id a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2 - # peer id 16Uiu2HAm7TYVs6qvDKnrovd9m4vvRikc4HPXm1WyLumKSe5fHxBv - privkey: "4fd22cf461fbeae4947a3fdaef8d533fc7fd1ef1ce4cd98e993210c18234df3f" - # verify /ip4/127.0.0.1/udp/9004/quic-v1/p2p/16Uiu2HAm7TYVs6qvDKnrovd9m4vvRikc4HPXm1WyLumKSe5fHxBv - enrFields: - ip: "127.0.0.1" - quic: 9005 - metricsPort: 8085 - count: 1 + # - name: "lighthouse_0" + # # node id a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2 + # # peer id 16Uiu2HAm7TYVs6qvDKnrovd9m4vvRikc4HPXm1WyLumKSe5fHxBv + # privkey: "4fd22cf461fbeae4947a3fdaef8d533fc7fd1ef1ce4cd98e993210c18234df3f" + # # verify /ip4/127.0.0.1/udp/9004/quic-v1/p2p/16Uiu2HAm7TYVs6qvDKnrovd9m4vvRikc4HPXm1WyLumKSe5fHxBv + # enrFields: + # ip: "127.0.0.1" + # quic: 9005 + # metricsPort: 8085 + # count: 1 diff --git a/parse-env.sh b/parse-env.sh index 91b2a6a..7339e0d 100755 --- a/parse-env.sh +++ b/parse-env.sh @@ -76,6 +76,11 @@ while [[ $# -gt 0 ]]; do shift # past argument shift # past value ;; + --docker-image) + dockerImageOverride="$2" + shift # past argument + shift # past value + ;; --stop) stopNodes=true shift @@ -109,4 +114,5 @@ echo "generateGenesis = $generateGenesis" echo "cleanData = $cleanData" echo "popupTerminal = $popupTerminal" echo "dockerTag = ${dockerTag:-latest}" +echo "dockerImageOverride = ${dockerImageOverride:-}" echo "enableMetrics = $enableMetrics" diff --git a/spin-node.sh b/spin-node.sh index 09eae2d..976aaa1 100755 --- a/spin-node.sh +++ b/spin-node.sh @@ -258,6 +258,12 @@ for item in "${spin_nodes[@]}"; do then execCmd="$node_binary" else + # If a docker image override was provided, replace the image name in node_docker + if [ -n "$dockerImageOverride" ]; then + # Replace the first token (image[:tag]) with the override image + node_docker="$(echo "$node_docker" | sed -E "s|^[^ ]+|$dockerImageOverride|")" + fi + # Extract image name from node_docker (find word containing ':' which is the image:tag) docker_image=$(echo "$node_docker" | grep -oE '[^ ]+:[^ ]+' | head -1) # Pull image first @@ -272,6 +278,11 @@ for item in "${spin_nodes[@]}"; do execCmd="sudo $execCmd" fi; + # Use --network host for peer-to-peer communication to work + # On macOS Docker Desktop, containers share the VM's network stack, allowing them + # to reach each other via 127.0.0.1 (as configured in nodes.yaml ENR records). + # Note: Port mapping (-p) doesn't work with --network host, so metrics endpoints + # are not directly accessible from the macOS host. Use 'docker exec' to access them. execCmd="$execCmd --name $item --network host \ -v $configDir:/config \ -v $dataDir/$item:/data \ From 6c883d5e320166b75174ba9f8f21c2ec0a573ac7 Mon Sep 17 00:00:00 2001 From: ch4r10t33r Date: Wed, 14 Jan 2026 12:17:53 +0000 Subject: [PATCH 2/6] fix: reverted changes to zeam-cmd.sh and validator-config.yaml --- client-cmds/zeam-cmd.sh | 2 +- local-devnet/genesis/validator-config.yaml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client-cmds/zeam-cmd.sh b/client-cmds/zeam-cmd.sh index 7afef7d..cc9788e 100644 --- a/client-cmds/zeam-cmd.sh +++ b/client-cmds/zeam-cmd.sh @@ -14,7 +14,7 @@ node_binary="$scriptDir/../zeam/zig-out/bin/zeam node \ $metrics_flag \ --metrics_port $metricsPort" -node_docker="--security-opt seccomp=unconfined zeam:local --console_log_level debug --log_file_active_level debug node \ +node_docker="--security-opt seccomp=unconfined blockblaz/zeam:devnet1 --console_log_level debug --log_file_active_level debug node \ --custom_genesis /config \ --validator_config $validatorConfig \ --data-dir /data \ diff --git a/local-devnet/genesis/validator-config.yaml b/local-devnet/genesis/validator-config.yaml index 3efa123..343869f 100644 --- a/local-devnet/genesis/validator-config.yaml +++ b/local-devnet/genesis/validator-config.yaml @@ -16,7 +16,7 @@ validators: metricsPort: 8081 count: 1 # number of indices for this node - - name: "zeam_1" + - name: "ream_0" # node id bc531fc1a99a896acb45603f28a32f81ae607480af46435009de4609370cb7bb # peer id 16Uiu2HAmPQhkD6Zg5Co2ee8ShshkiY4tDePKFARPpCS2oKSLj1E1 privkey: "af27950128b49cda7e7bc9fcb7b0270f7a3945aa7543326f3bfdbd57d2a97a32" @@ -27,8 +27,8 @@ validators: metricsPort: 8082 count: 1 - - name: "zeam_2" - # node id for zeam_2 + - name: "qlean_0" + # node id for qlean_0 privkey: "c2bbdac5e876b3e9d4b8b6b8c2bbdac5e876b3e9d4b8b6b8c2bbdac5e876b3e9" enrFields: #verify /ip4/127.0.0.1/udp/9003/quic-v1/p2p/16Uiu2HAmQj1RDNAxopeeeCFPRr3zhJYmH6DEPHYKmxLViLahWcFE From 9aa8e3b253fbe8f144c0249c75983692c244ed49 Mon Sep 17 00:00:00 2001 From: ch4r10t33r Date: Wed, 14 Jan 2026 12:19:18 +0000 Subject: [PATCH 3/6] fix: corrected zeam-cmd.sh --- client-cmds/zeam-cmd.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client-cmds/zeam-cmd.sh b/client-cmds/zeam-cmd.sh index cc9788e..a0b6a97 100644 --- a/client-cmds/zeam-cmd.sh +++ b/client-cmds/zeam-cmd.sh @@ -6,7 +6,7 @@ # Metrics enabled by default metrics_flag="--metrics_enable" -node_binary="$scriptDir/../zeam/zig-out/bin/zeam node \ +node_binary="$scriptDir/../zig-out/bin/zeam node \ --custom_genesis $configDir \ --validator_config $validatorConfig \ --data-dir $dataDir/$item \ @@ -14,7 +14,7 @@ node_binary="$scriptDir/../zeam/zig-out/bin/zeam node \ $metrics_flag \ --metrics_port $metricsPort" -node_docker="--security-opt seccomp=unconfined blockblaz/zeam:devnet1 --console_log_level debug --log_file_active_level debug node \ +node_docker="--security-opt seccomp=unconfined blockblaz/zeam:devnet1 node \ --custom_genesis /config \ --validator_config $validatorConfig \ --data-dir /data \ @@ -23,4 +23,4 @@ node_docker="--security-opt seccomp=unconfined blockblaz/zeam:devnet1 --console_ --metrics_port $metricsPort" # choose either binary or docker -node_setup="docker" +node_setup="docker" \ No newline at end of file From bc97cfb2d25b6d2da3ea49856b29276f970a8c49 Mon Sep 17 00:00:00 2001 From: ch4r10t33r Date: Wed, 14 Jan 2026 12:22:51 +0000 Subject: [PATCH 4/6] fix: corrected the validator-configs.yaml --- local-devnet/genesis/validator-config.yaml | 47 +++++++++++----------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/local-devnet/genesis/validator-config.yaml b/local-devnet/genesis/validator-config.yaml index 343869f..e6ad546 100644 --- a/local-devnet/genesis/validator-config.yaml +++ b/local-devnet/genesis/validator-config.yaml @@ -21,40 +21,41 @@ validators: # peer id 16Uiu2HAmPQhkD6Zg5Co2ee8ShshkiY4tDePKFARPpCS2oKSLj1E1 privkey: "af27950128b49cda7e7bc9fcb7b0270f7a3945aa7543326f3bfdbd57d2a97a32" enrFields: - #verify /ip4/127.0.0.1/udp/9002/quic-v1/p2p/16Uiu2HAmPQhkD6Zg5Co2ee8ShshkiY4tDePKFARPpCS2oKSLj1E1 + #verify /ip4/127.0.0.1/udp/9001/quic-v1/p2p/16Uiu2HAmPQhkD6Zg5Co2ee8ShshkiY4tDePKFARPpCS2oKSLj1E1 ip: "127.0.0.1" quic: 9002 metricsPort: 8082 + devnet: 1 count: 1 - name: "qlean_0" - # node id for qlean_0 + # TODO: add a third entry in nodes.yaml corresponding to this privkey: "c2bbdac5e876b3e9d4b8b6b8c2bbdac5e876b3e9d4b8b6b8c2bbdac5e876b3e9" enrFields: - #verify /ip4/127.0.0.1/udp/9003/quic-v1/p2p/16Uiu2HAmQj1RDNAxopeeeCFPRr3zhJYmH6DEPHYKmxLViLahWcFE + #verify /ip4/127.0.0.1/udp/9001/quic-v1/p2p/16Uiu2HAmPQhkD6Zg5Co2ee8ShshkiY4tDePKFARPpCS2oKSLj1E1 ip: "127.0.0.1" quic: 9003 metricsPort: 8083 count: 1 - # - name: "lantern_0" - # # node id a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2 - # # peer id 16Uiu2HAm7TYVs6qvDKnrovd9m4vvRikc4HPXm1WyLumKSe5fHxBv - # privkey: "d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5" - # # verify /ip4/127.0.0.1/udp/9004/quic-v1/p2p/16Uiu2HAm7TYVs6qvDKnrovd9m4vvRikc4HPXm1WyLumKSe5fHxBv - # enrFields: - # ip: "127.0.0.1" - # quic: 9004 - # metricsPort: 8084 - # count: 1 + - name: "lantern_0" + # node id a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2 + # peer id 16Uiu2HAm7TYVs6qvDKnrovd9m4vvRikc4HPXm1WyLumKSe5fHxBv + privkey: "d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5" + # verify /ip4/127.0.0.1/udp/9004/quic-v1/p2p/16Uiu2HAm7TYVs6qvDKnrovd9m4vvRikc4HPXm1WyLumKSe5fHxBv + enrFields: + ip: "127.0.0.1" + quic: 9004 + metricsPort: 8084 + count: 1 - # - name: "lighthouse_0" - # # node id a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2 - # # peer id 16Uiu2HAm7TYVs6qvDKnrovd9m4vvRikc4HPXm1WyLumKSe5fHxBv - # privkey: "4fd22cf461fbeae4947a3fdaef8d533fc7fd1ef1ce4cd98e993210c18234df3f" - # # verify /ip4/127.0.0.1/udp/9004/quic-v1/p2p/16Uiu2HAm7TYVs6qvDKnrovd9m4vvRikc4HPXm1WyLumKSe5fHxBv - # enrFields: - # ip: "127.0.0.1" - # quic: 9005 - # metricsPort: 8085 - # count: 1 + - name: "lighthouse_0" + # node id a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2 + # peer id 16Uiu2HAm7TYVs6qvDKnrovd9m4vvRikc4HPXm1WyLumKSe5fHxBv + privkey: "4fd22cf461fbeae4947a3fdaef8d533fc7fd1ef1ce4cd98e993210c18234df3f" + # verify /ip4/127.0.0.1/udp/9004/quic-v1/p2p/16Uiu2HAm7TYVs6qvDKnrovd9m4vvRikc4HPXm1WyLumKSe5fHxBv + enrFields: + ip: "127.0.0.1" + quic: 9005 + metricsPort: 8085 + count: 1 \ No newline at end of file From f770126207b99c226b8f8f1606c72ee6cdf3c11d Mon Sep 17 00:00:00 2001 From: ch4r10t33r Date: Wed, 14 Jan 2026 12:48:25 +0000 Subject: [PATCH 5/6] fix: corrected issue with sed command --- spin-node.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spin-node.sh b/spin-node.sh index 976aaa1..53b7ec9 100755 --- a/spin-node.sh +++ b/spin-node.sh @@ -260,8 +260,9 @@ for item in "${spin_nodes[@]}"; do else # If a docker image override was provided, replace the image name in node_docker if [ -n "$dockerImageOverride" ]; then - # Replace the first token (image[:tag]) with the override image - node_docker="$(echo "$node_docker" | sed -E "s|^[^ ]+|$dockerImageOverride|")" + # Replace the first token containing ':' (image:tag pattern) with the override image + # This handles cases where node_docker may start with flags like --security-opt + node_docker="$(echo "$node_docker" | sed -E "s|([^ ]+:[^ ]+)|$dockerImageOverride|1")" fi # Extract image name from node_docker (find word containing ':' which is the image:tag) From f1e353d19dfc470af23932bb7a3af09f1a63af20 Mon Sep 17 00:00:00 2001 From: ch4r10t33r Date: Wed, 14 Jan 2026 15:51:00 +0000 Subject: [PATCH 6/6] feat: Updated zeam-cmd.sh to reflect the change in cli params --- client-cmds/zeam-cmd.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client-cmds/zeam-cmd.sh b/client-cmds/zeam-cmd.sh index 1485465..6fea96a 100644 --- a/client-cmds/zeam-cmd.sh +++ b/client-cmds/zeam-cmd.sh @@ -12,15 +12,15 @@ node_binary="$scriptDir/../zig-out/bin/zeam node \ --data-dir $dataDir/$item \ --node-id $item --node-key $configDir/$item.key \ $metrics_flag \ - --metrics_port $metricsPort" + --api-port $metricsPort" -node_docker="--security-opt seccomp=unconfined blockblaz/zeam:devnet1 node \ +node_docker="--security-opt seccomp=unconfined blockblaz/zeam:latest node \ --custom_genesis /config \ --validator_config $validatorConfig \ --data-dir /data \ --node-id $item --node-key /config/$item.key \ $metrics_flag \ - --metrics_port $metricsPort" + --api-port $metricsPort" # choose either binary or docker node_setup="docker"