From f61d9ba7a23454037fe9a3774fdca1697a4c27f1 Mon Sep 17 00:00:00 2001 From: Roberto Bayardo Date: Wed, 26 Oct 2022 20:44:25 -0700 Subject: [PATCH 01/45] create devnet v3 branch including submodules + new submodule for erigon client --- .gitmodules | 8 ++++++-- erigon/erigon | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) create mode 160000 erigon/erigon diff --git a/.gitmodules b/.gitmodules index 369ebd9..fab8c84 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,8 +1,12 @@ [submodule "geth/go-ethereum"] path = geth/go-ethereum url = https://github.com/mdehoog/go-ethereum - branch = eip-4844 + branch = devnet-v3 [submodule "prysm/prysm"] path = prysm/prysm url = https://github.com/Inphi/prysm - branch = eip-4844 + branch = devnet-v3 +[submodule "erigon/erigon"] + path = erigon/erigon + url = https://github.com/roberto-bayardo/erigon + branch = devnet-v3 diff --git a/erigon/erigon b/erigon/erigon new file mode 160000 index 0000000..d9ff645 --- /dev/null +++ b/erigon/erigon @@ -0,0 +1 @@ +Subproject commit d9ff645fbf64c42f71a4f8f2ee038b00fc0a8a11 From 9b2723038392d81ddde767167d63e3ad0eb01ffe Mon Sep 17 00:00:00 2001 From: dancoffman Date: Mon, 17 Oct 2022 23:42:31 -0700 Subject: [PATCH 02/45] Add Lodestar --- .gitmodules | 4 ++ Makefile | 13 +++- docker-compose.yml | 101 ++++++++++++++++++++++--------- lodestar/.dockerignore | 3 + lodestar/Dockerfile.lodestar | 16 +++++ lodestar/lodestar | 1 + lodestar/run_beacon_node.sh | 41 +++++++++++++ lodestar/run_beacon_node_peer.sh | 38 ++++++++++++ 8 files changed, 187 insertions(+), 30 deletions(-) create mode 100644 lodestar/.dockerignore create mode 100644 lodestar/Dockerfile.lodestar create mode 160000 lodestar/lodestar create mode 100755 lodestar/run_beacon_node.sh create mode 100755 lodestar/run_beacon_node_peer.sh diff --git a/.gitmodules b/.gitmodules index 369ebd9..9ec9a6c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -6,3 +6,7 @@ path = prysm/prysm url = https://github.com/Inphi/prysm branch = eip-4844 +[submodule "lodestar/lodestar"] + path = lodestar/lodestar + url = https://github.com/dgcoffman/lodestar + branch = dgc/eip-4844 diff --git a/Makefile b/Makefile index e0061db..19b5e13 100644 --- a/Makefile +++ b/Makefile @@ -2,11 +2,18 @@ devnet-up: docker compose up -d\ execution-node\ execution-node-2\ - beacon-node\ - beacon-node-follower\ - validator-node\ + prysm-beacon-node\ + prysm-beacon-node-follower\ + prysm-validator-node\ jaeger-tracing +lodestar-up: + docker compose up -d\ + execution-node\ + execution-node-2\ + lodestar-beacon-node\ + lodestar-beacon-node-follower + devnet-down: docker compose down -v diff --git a/docker-compose.yml b/docker-compose.yml index 3d15345..413b45c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,11 +12,11 @@ services: context: ./geth dockerfile: Dockerfile.geth ports: - - "8545:8545" + - '8545:8545' environment: GETH_VERBOSITY: 4 volumes: - - "geth_data:/db" + - 'geth_data:/db' - type: bind source: ./geth/geth-genesis.json target: /genesis.json @@ -31,14 +31,14 @@ services: PEER: execution-node:30303 GETH_VERBOSITY: 4 ports: - - "8546:8545" + - '8546:8545' volumes: - - "geth_data2:/db" + - 'geth_data2:/db' - type: bind source: ./geth/geth-genesis.json target: /genesis.json - beacon-node: + prysm-beacon-node: depends_on: - execution-node - jaeger-tracing @@ -51,13 +51,14 @@ services: PROCESS_NAME: beacon-node VERBOSITY: debug P2P_PRIV_KEY: /etc/prysm-priv-key - entrypoint: ["run_beacon_node.sh", "--min-sync-peers=0", "--bootstrap-node="] + entrypoint: + ['run_beacon_node.sh', '--min-sync-peers=0', '--bootstrap-node='] ports: - - "3500:3500" - - "4000:4000" - - "13000:13000" + - '3500:3500' + - '4000:4000' + - '13000:13000' volumes: - - "beacon_node_data:/chaindata" + - 'beacon_node_data:/chaindata' - type: bind source: ./prysm/prysm-chain-config.yml target: /config/prysm-chain-config.yml @@ -68,7 +69,7 @@ services: source: ./prysm/prysm-priv-key target: /etc/prysm-priv-key - beacon-node-follower: + prysm-beacon-node-follower: depends_on: - execution-node-2 - beacon-node @@ -85,11 +86,11 @@ services: P2P_PRIV_KEY: /etc/prysm-priv-key entrypoint: run_beacon_node_peer.sh ports: - - "3501:3500" - - "4001:4000" - - "13001:13000" + - '3501:3500' + - '4001:4000' + - '13001:13000' volumes: - - "beacon_node_follower_data:/chaindata" + - 'beacon_node_follower_data:/chaindata' - type: bind source: ./prysm/prysm-chain-config.yml target: /config/prysm-chain-config.yml @@ -103,7 +104,7 @@ services: source: ./prysm/prysm-follower-priv-key target: /etc/prysm-priv-key - validator-node: + prysm-validator-node: depends_on: - beacon-node - jaeger-tracing @@ -126,21 +127,67 @@ services: --tracing-endpoint http://jaeger-tracing:14268/api/traces --tracing-process-name validator-node ports: - - "7500:7500" + - '7500:7500' volumes: - type: bind source: ./prysm/prysm-chain-config.yml target: /config/prysm-chain-config.yml - jaeger-tracing: - image: jaegertracing/all-in-one:1.35 + lodestar-beacon-node: + depends_on: + - execution-node + build: + context: ./lodestar + dockerfile: Dockerfile.lodestar + environment: + EXECUTION_NODE_URL: http://execution-node:8545 + PROCESS_NAME: lodestar-beacon-node + entrypoint: ['run_beacon_node.sh'] + ports: + - '3500:3500' + - '4000:4000' + - '13000:13000' + volumes: + - 'beacon_node_data:/chaindata' + - type: bind + source: ./lodestar/run_beacon_node.sh + target: /usr/local/bin/run_beacon_node.sh + + lodestar-beacon-node-follower: + depends_on: + - execution-node-2 + - lodestar-beacon-node + build: + context: ./lodestar + dockerfile: Dockerfile.lodestar environment: - COLLECTOR_ZIPKIN_HTTP_PORT: 9411 + EXECUTION_NODE_URL: http://execution-node-2:8545 + BEACON_NODE_RPC: http://lodestar-beacon-node:4000 + PROCESS_NAME: lodestar-beacon-node-follower + VERBOSITY: debug + entrypoint: run_beacon_node_peer.sh ports: - - "5775:5775/udp" - - "6831:6831/udp" - - "6832:6832/udp" - - "5778:5778" - - "16686:16686" - - "14268:14268" - - "9411:9411" + - '3501:3500' + - '4001:4000' + - '13001:13000' + volumes: + - 'beacon_node_follower_data:/chaindata' + - type: bind + source: ./lodestar/run_beacon_node.sh + target: /usr/local/bin/run_beacon_node.sh + - type: bind + source: ./lodestar/run_beacon_node_peer.sh + target: /usr/local/bin/run_beacon_node_peer.sh + + # jaeger-tracing: + # image: jaegertracing/all-in-one:1.35 + # environment: + # COLLECTOR_ZIPKIN_HTTP_PORT: 9411 + # ports: + # - '5775:5775/udp' + # - '6831:6831/udp' + # - '6832:6832/udp' + # - '5778:5778' + # - '16686:16686' + # - '14268:14268' + # - '9411:9411' diff --git a/lodestar/.dockerignore b/lodestar/.dockerignore new file mode 100644 index 0000000..ad7c440 --- /dev/null +++ b/lodestar/.dockerignore @@ -0,0 +1,3 @@ +.git +.github +node_modules diff --git a/lodestar/Dockerfile.lodestar b/lodestar/Dockerfile.lodestar new file mode 100644 index 0000000..7a2aa00 --- /dev/null +++ b/lodestar/Dockerfile.lodestar @@ -0,0 +1,16 @@ +FROM node:16 + +RUN apt-get update && \ + apt-get install -y jq + +WORKDIR /app/lodestar + +COPY ./lodestar /app/lodestar + +RUN yarn install --ignore-optional + +RUN yarn global add lerna + +RUN yarn build + +EXPOSE 3500 4000 7500 13000 12000 8080 diff --git a/lodestar/lodestar b/lodestar/lodestar new file mode 160000 index 0000000..6489264 --- /dev/null +++ b/lodestar/lodestar @@ -0,0 +1 @@ +Subproject commit 64892640a4c60ea7901b3ac2f2df61d572cf3ffa diff --git a/lodestar/run_beacon_node.sh b/lodestar/run_beacon_node.sh new file mode 100755 index 0000000..22ae5c0 --- /dev/null +++ b/lodestar/run_beacon_node.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +: "${EXECUTION_NODE_URL:-}" +: "${PROCESS_NAME:-beacon-node}" +: "${VERBOSITY:-info}" + +# wait for the execution node to start +RETRIES=60 +i=0 +until curl --silent --fail "$EXECUTION_NODE_URL"; +do + sleep 1 + if [ $i -eq $RETRIES ]; then + echo 'Timed out waiting for execution node' + exit 1 + fi + echo 'Waiting for execution node...' + ((i=i+1)) +done + +echo 'Execution client running. Starting Lodestar beacon node.' + +# https://chainsafe.github.io/lodestar/usage/local/ +./lodestar dev \ + --genesisValidators 1 \ + --startValidators 0..1 \ + --enr.ip 127.0.0.1 \ + --server http://localhost:4000 \ + --reset \ + --eth1 \ + --eth1.providerUrls="$EXECUTION_NODE_URL" \ + --execution.urls="$EXECUTION_NODE_URL" \ + --dataDir /chaindata \ + --rest \ + --rest.address 0.0.0.0 \ + --rest.port 4000 \ + --rest.namespace "*" \ + --metrics \ + --logFile /logs/beacon.log \ + --logFileLevel debug \ + --suggestedFeeRecipient 0x8A04d14125D0FDCDc742F4A05C051De07232EDa4 diff --git a/lodestar/run_beacon_node_peer.sh b/lodestar/run_beacon_node_peer.sh new file mode 100755 index 0000000..6ed44ce --- /dev/null +++ b/lodestar/run_beacon_node_peer.sh @@ -0,0 +1,38 @@ +#!/bin/sh + +: "${BEACON_NODE_RPC:-}" + +# wait for the beacon node to start +RETRIES=60 +i=0 +until curl --fail --silent "${BEACON_NODE_RPC}/eth/v1/node/health"; do + sleep 1 + if [ $i -eq $RETRIES ]; then + echo "Timed out retrieving beacon node p2p addr" + exit 1 + fi + echo "waiting for beacon node RPC..." + ((i=i+1)) +done + +echo "Connected to beacon node REST API ${BEACON_NODE_RPC}/eth/v1/node/health" + +# Retrieve the enr of the bootstrap node. We will sync blocks from this peer. +ENR=$(curl --fail "$BEACON_NODE_RPC"/eth/v1/node/identity | jq '.data.enr' | tr -d '"' | tr -d '=') + +# Retrieve the generated genesis time so we can follow the peer with matching state roots +INTEROP_GENESIS_TIME=$(curl --fail "$BEACON_NODE_RPC"/eth/v1/beacon/genesis | jq .data.genesis_time | tr -d '"') + +if [ "$ENR" = "null" ]; then + echo "Unable to start beacon-node: Beacon Node address is unavailable via $BEACON_NODE_RPC}" + exit 1 +fi + +# https://chainsafe.notion.site/chainsafe/Lodestar-flags-02406e481f664d84adb56c2c348e49aa +./lodestar dev --genesisValidators 1 --genesisTime "$INTEROP_GENESIS_TIME" \ + --dataDir /chaindata \ + --network.connectToDiscv5Bootnodes true \ + --bootnodes $ENR \ + --eth1 \ + --eth1.providerUrls="$EXECUTION_NODE_URL" \ + --reset From 5fb61e527f92f0d00845677b5d9b4ef57bdfb149 Mon Sep 17 00:00:00 2001 From: dancoffman Date: Mon, 17 Oct 2022 23:57:59 -0700 Subject: [PATCH 03/45] Supply chain config --- docker-compose.yml | 20 ++++++++++++------- lodestar/chain-config.yml | 15 ++++++++++++++ lodestar/run_beacon_node.sh | 1 + lodestar/run_beacon_node_peer.sh | 17 +++++++++------- ...rysm-chain-config.yml => chain-config.yml} | 0 prysm/run_beacon_node.sh | 2 +- shared/config.go | 2 +- 7 files changed, 41 insertions(+), 16 deletions(-) create mode 100644 lodestar/chain-config.yml rename prysm/{prysm-chain-config.yml => chain-config.yml} (100%) diff --git a/docker-compose.yml b/docker-compose.yml index 413b45c..b023ce5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -60,8 +60,8 @@ services: volumes: - 'beacon_node_data:/chaindata' - type: bind - source: ./prysm/prysm-chain-config.yml - target: /config/prysm-chain-config.yml + source: ./prysm/chain-config.yml + target: /config/chain-config.yml - type: bind source: ./prysm/run_beacon_node.sh target: /usr/local/bin/run_beacon_node.sh @@ -92,8 +92,8 @@ services: volumes: - 'beacon_node_follower_data:/chaindata' - type: bind - source: ./prysm/prysm-chain-config.yml - target: /config/prysm-chain-config.yml + source: ./prysm/chain-config.yml + target: /config/chain-config.yml - type: bind source: ./prysm/run_beacon_node.sh target: /usr/local/bin/run_beacon_node.sh @@ -121,7 +121,7 @@ services: --interop-num-validators=4 --interop-start-index=0 --force-clear-db - --chain-config-file=/config/prysm-chain-config.yml + --chain-config-file=/config/chain-config.yml --suggested-fee-recipient 0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b --enable-tracing --tracing-endpoint http://jaeger-tracing:14268/api/traces @@ -130,8 +130,8 @@ services: - '7500:7500' volumes: - type: bind - source: ./prysm/prysm-chain-config.yml - target: /config/prysm-chain-config.yml + source: ./prysm/chain-config.yml + target: /config/chain-config.yml lodestar-beacon-node: depends_on: @@ -149,6 +149,9 @@ services: - '13000:13000' volumes: - 'beacon_node_data:/chaindata' + - type: bind + source: ./lodestar/chain-config.yml + target: /config/chain-config.yml - type: bind source: ./lodestar/run_beacon_node.sh target: /usr/local/bin/run_beacon_node.sh @@ -172,6 +175,9 @@ services: - '13001:13000' volumes: - 'beacon_node_follower_data:/chaindata' + - type: bind + source: ./lodestar/chain-config.yml + target: /config/chain-config.yml - type: bind source: ./lodestar/run_beacon_node.sh target: /usr/local/bin/run_beacon_node.sh diff --git a/lodestar/chain-config.yml b/lodestar/chain-config.yml new file mode 100644 index 0000000..05622de --- /dev/null +++ b/lodestar/chain-config.yml @@ -0,0 +1,15 @@ +CONFIG_NAME: 'local' +ALTAIR_FORK_EPOCH: 1 +BELLATRIX_FORK_EPOCH: 2 +EIP4844_FORK_EPOCH: 3 # ensure this happens at exactly shardingForkBlock in execution +SECONDS_PER_SLOT: 6 +SLOTS_PER_EPOCH: 3 +TERMINAL_TOTAL_DIFFICULTY: 2 + +# avoid collisions with mainnet/eip4844 config versioning +GENESIS_FORK_VERSION: 0x00000ffe +ALTAIR_FORK_VERSION: 0x01000ffe +BELLATRIX_FORK_VERSION: 0x02000ffe +EIP4844_FORK_VERSION: 0x03000ffe + +DOMAIN_BLOBS_SIDECAR: 0x0a000000 diff --git a/lodestar/run_beacon_node.sh b/lodestar/run_beacon_node.sh index 22ae5c0..0263311 100755 --- a/lodestar/run_beacon_node.sh +++ b/lodestar/run_beacon_node.sh @@ -22,6 +22,7 @@ echo 'Execution client running. Starting Lodestar beacon node.' # https://chainsafe.github.io/lodestar/usage/local/ ./lodestar dev \ + --paramsFile /config/chain-config.yml \ --genesisValidators 1 \ --startValidators 0..1 \ --enr.ip 127.0.0.1 \ diff --git a/lodestar/run_beacon_node_peer.sh b/lodestar/run_beacon_node_peer.sh index 6ed44ce..6595c2e 100755 --- a/lodestar/run_beacon_node_peer.sh +++ b/lodestar/run_beacon_node_peer.sh @@ -29,10 +29,13 @@ if [ "$ENR" = "null" ]; then fi # https://chainsafe.notion.site/chainsafe/Lodestar-flags-02406e481f664d84adb56c2c348e49aa -./lodestar dev --genesisValidators 1 --genesisTime "$INTEROP_GENESIS_TIME" \ - --dataDir /chaindata \ - --network.connectToDiscv5Bootnodes true \ - --bootnodes $ENR \ - --eth1 \ - --eth1.providerUrls="$EXECUTION_NODE_URL" \ - --reset +./lodestar dev \ + --paramsFile /config/chain-config.yml \ + --genesisValidators 1 \ + --genesisTime "$INTEROP_GENESIS_TIME" \ + --dataDir /chaindata \ + --network.connectToDiscv5Bootnodes true \ + --bootnodes $ENR \ + --eth1 \ + --eth1.providerUrls="$EXECUTION_NODE_URL" \ + --reset diff --git a/prysm/prysm-chain-config.yml b/prysm/chain-config.yml similarity index 100% rename from prysm/prysm-chain-config.yml rename to prysm/chain-config.yml diff --git a/prysm/run_beacon_node.sh b/prysm/run_beacon_node.sh index 3c2c34a..7c66219 100755 --- a/prysm/run_beacon_node.sh +++ b/prysm/run_beacon_node.sh @@ -32,7 +32,7 @@ beacon-node \ --interop-eth1data-votes \ --http-web3provider="$EXECUTION_NODE_URL" \ --deposit-contract 0x8A04d14125D0FDCDc742F4A05C051De07232EDa4 \ - --chain-config-file=/config/prysm-chain-config.yml \ + --chain-config-file=/config/chain-config.yml \ --contract-deployment-block 0 \ --interop-num-validators 4 \ --rpc-host 0.0.0.0 \ diff --git a/shared/config.go b/shared/config.go index 2ca9505..650df06 100644 --- a/shared/config.go +++ b/shared/config.go @@ -27,7 +27,7 @@ func GethChainConfigFilepath() string { } func BeaconChainConfigFilepath() string { - return fmt.Sprintf("%s/prysm/prysm-chain-config.yml", GetBaseDir()) + return fmt.Sprintf("%s/prysm/chain-config.yml", GetBaseDir()) } func UpdateChainConfig(config *params.ChainConfig) error { From e5e0351abfec611f4624a0bd5b408d550528aac3 Mon Sep 17 00:00:00 2001 From: dancoffman Date: Tue, 18 Oct 2022 13:24:08 -0700 Subject: [PATCH 04/45] Cache all docker work before yarn build --- docker-compose.yml | 28 ++++++++++++++-------------- lodestar/Dockerfile.lodestar | 23 ++++++++++++++++++++--- lodestar/chain-config.yml | 4 ++-- lodestar/run_beacon_node.sh | 1 + 4 files changed, 37 insertions(+), 19 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index b023ce5..544c47a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -72,7 +72,7 @@ services: prysm-beacon-node-follower: depends_on: - execution-node-2 - - beacon-node + - prysm-beacon-node - jaeger-tracing build: context: ./prysm @@ -106,7 +106,7 @@ services: prysm-validator-node: depends_on: - - beacon-node + - prysm-beacon-node - jaeger-tracing build: context: ./prysm @@ -185,15 +185,15 @@ services: source: ./lodestar/run_beacon_node_peer.sh target: /usr/local/bin/run_beacon_node_peer.sh - # jaeger-tracing: - # image: jaegertracing/all-in-one:1.35 - # environment: - # COLLECTOR_ZIPKIN_HTTP_PORT: 9411 - # ports: - # - '5775:5775/udp' - # - '6831:6831/udp' - # - '6832:6832/udp' - # - '5778:5778' - # - '16686:16686' - # - '14268:14268' - # - '9411:9411' + jaeger-tracing: + image: jaegertracing/all-in-one:1.35 + environment: + COLLECTOR_ZIPKIN_HTTP_PORT: 9411 + ports: + - '5775:5775/udp' + - '6831:6831/udp' + - '6832:6832/udp' + - '5778:5778' + - '16686:16686' + - '14268:14268' + - '9411:9411' diff --git a/lodestar/Dockerfile.lodestar b/lodestar/Dockerfile.lodestar index 7a2aa00..2854675 100644 --- a/lodestar/Dockerfile.lodestar +++ b/lodestar/Dockerfile.lodestar @@ -3,13 +3,30 @@ FROM node:16 RUN apt-get update && \ apt-get install -y jq -WORKDIR /app/lodestar +COPY ./lodestar/package.json /app/lodestar/package.json +COPY ./lodestar/yarn.lock /app/lodestar/yarn.lock -COPY ./lodestar /app/lodestar +copy ./lodestar/packages/api/package.json /app/lodestar/packages/api/package.json +copy ./lodestar/packages/beacon-node/package.json /app/lodestar/packages/beacon-node/package.json +copy ./lodestar/packages/cli/package.json /app/lodestar/packages/cli/package.json +copy ./lodestar/packages/config/package.json /app/lodestar/packages/config/package.json +copy ./lodestar/packages/db/package.json /app/lodestar/packages/db/package.json +copy ./lodestar/packages/flare/package.json /app/lodestar/packages/flare/package.json +copy ./lodestar/packages/fork-choice/package.json /app/lodestar/packages/fork-choice/package.json +copy ./lodestar/packages/light-client/package.json /app/lodestar/packages/light-client/package.json +copy ./lodestar/packages/params/package.json /app/lodestar/packages/params/package.json +copy ./lodestar/packages/spec-test-util/package.json /app/lodestar/packages/spec-test-util/package.json +copy ./lodestar/packages/state-transition/package.json /app/lodestar/packages/state-transition/package.json +copy ./lodestar/packages/types/package.json /app/lodestar/packages/types/package.json +copy ./lodestar/packages/utils/package.json /app/lodestar/packages/utils/package.json +copy ./lodestar/packages/validator/package.json /app/lodestar/packages/validator/package.json + +WORKDIR /app/lodestar RUN yarn install --ignore-optional +# RUN yarn global add lerna -RUN yarn global add lerna +COPY ./lodestar /app/lodestar RUN yarn build diff --git a/lodestar/chain-config.yml b/lodestar/chain-config.yml index 05622de..3ebec36 100644 --- a/lodestar/chain-config.yml +++ b/lodestar/chain-config.yml @@ -2,8 +2,8 @@ CONFIG_NAME: 'local' ALTAIR_FORK_EPOCH: 1 BELLATRIX_FORK_EPOCH: 2 EIP4844_FORK_EPOCH: 3 # ensure this happens at exactly shardingForkBlock in execution -SECONDS_PER_SLOT: 6 -SLOTS_PER_EPOCH: 3 +SECONDS_PER_SLOT: 4 +SLOTS_PER_EPOCH: 1 TERMINAL_TOTAL_DIFFICULTY: 2 # avoid collisions with mainnet/eip4844 config versioning diff --git a/lodestar/run_beacon_node.sh b/lodestar/run_beacon_node.sh index 0263311..7e0a79f 100755 --- a/lodestar/run_beacon_node.sh +++ b/lodestar/run_beacon_node.sh @@ -22,6 +22,7 @@ echo 'Execution client running. Starting Lodestar beacon node.' # https://chainsafe.github.io/lodestar/usage/local/ ./lodestar dev \ + --logLevel verbose \ --paramsFile /config/chain-config.yml \ --genesisValidators 1 \ --startValidators 0..1 \ From 48fe02f3e23ff57fc83d141dd0c2c8d5d12160b3 Mon Sep 17 00:00:00 2001 From: dancoffman Date: Tue, 18 Oct 2022 13:52:49 -0700 Subject: [PATCH 05/45] Build packages individually to allow them to cache --- lodestar/Dockerfile.lodestar | 66 ++++++++++++++++++++++++++---------- 1 file changed, 49 insertions(+), 17 deletions(-) diff --git a/lodestar/Dockerfile.lodestar b/lodestar/Dockerfile.lodestar index 2854675..f7cb243 100644 --- a/lodestar/Dockerfile.lodestar +++ b/lodestar/Dockerfile.lodestar @@ -6,28 +6,60 @@ RUN apt-get update && \ COPY ./lodestar/package.json /app/lodestar/package.json COPY ./lodestar/yarn.lock /app/lodestar/yarn.lock -copy ./lodestar/packages/api/package.json /app/lodestar/packages/api/package.json -copy ./lodestar/packages/beacon-node/package.json /app/lodestar/packages/beacon-node/package.json -copy ./lodestar/packages/cli/package.json /app/lodestar/packages/cli/package.json -copy ./lodestar/packages/config/package.json /app/lodestar/packages/config/package.json -copy ./lodestar/packages/db/package.json /app/lodestar/packages/db/package.json -copy ./lodestar/packages/flare/package.json /app/lodestar/packages/flare/package.json -copy ./lodestar/packages/fork-choice/package.json /app/lodestar/packages/fork-choice/package.json -copy ./lodestar/packages/light-client/package.json /app/lodestar/packages/light-client/package.json -copy ./lodestar/packages/params/package.json /app/lodestar/packages/params/package.json -copy ./lodestar/packages/spec-test-util/package.json /app/lodestar/packages/spec-test-util/package.json -copy ./lodestar/packages/state-transition/package.json /app/lodestar/packages/state-transition/package.json -copy ./lodestar/packages/types/package.json /app/lodestar/packages/types/package.json -copy ./lodestar/packages/utils/package.json /app/lodestar/packages/utils/package.json -copy ./lodestar/packages/validator/package.json /app/lodestar/packages/validator/package.json +COPY ./lodestar/packages/api/package.json /app/lodestar/packages/api/package.json +COPY ./lodestar/packages/beacon-node/package.json /app/lodestar/packages/beacon-node/package.json +COPY ./lodestar/packages/cli/package.json /app/lodestar/packages/cli/package.json +COPY ./lodestar/packages/config/package.json /app/lodestar/packages/config/package.json +COPY ./lodestar/packages/db/package.json /app/lodestar/packages/db/package.json +COPY ./lodestar/packages/flare/package.json /app/lodestar/packages/flare/package.json +COPY ./lodestar/packages/fork-choice/package.json /app/lodestar/packages/fork-choice/package.json +COPY ./lodestar/packages/light-client/package.json /app/lodestar/packages/light-client/package.json +COPY ./lodestar/packages/params/package.json /app/lodestar/packages/params/package.json +COPY ./lodestar/packages/spec-test-util/package.json /app/lodestar/packages/spec-test-util/package.json +COPY ./lodestar/packages/state-transition/package.json /app/lodestar/packages/state-transition/package.json +COPY ./lodestar/packages/types/package.json /app/lodestar/packages/types/package.json +COPY ./lodestar/packages/utils/package.json /app/lodestar/packages/utils/package.json +COPY ./lodestar/packages/validator/package.json /app/lodestar/packages/validator/package.json WORKDIR /app/lodestar RUN yarn install --ignore-optional -# RUN yarn global add lerna -COPY ./lodestar /app/lodestar +COPY ./lodestar/lerna.json /app/lodestar/lerna.json +COPY ./lodestar/tsconfig.build.json /app/lodestar/tsconfig.build.json +COPY ./lodestar/tsconfig.json /app/lodestar/tsconfig.json +COPY ./lodestar/types /app/lodestar/types -RUN yarn build +# Copy and build each package independently to allow Docker to cache their builds in layers + +COPY ./lodestar/packages/params /app/lodestar/packages/params +RUN yarn lerna run --scope @lodestar/params build + +COPY ./lodestar/packages/types /app/lodestar/packages/types +RUN yarn lerna run --scope @lodestar/types build + +COPY ./lodestar/packages/utils /app/lodestar/packages/utils +RUN yarn lerna run --scope @lodestar/utils build + +COPY ./lodestar/packages/config /app/lodestar/packages/config +RUN yarn lerna run --scope @lodestar/config build + +COPY ./lodestar/packages/state-transition /app/lodestar/packages/state-transition +RUN yarn lerna run --scope @lodestar/state-transition build + +COPY ./lodestar/packages/fork-choice /app/lodestar/packages/fork-choice +RUN yarn lerna run --scope @lodestar/fork-choice build + +COPY ./lodestar/packages/db /app/lodestar/packages/db +RUN yarn lerna run --scope @lodestar/db build + +COPY ./lodestar/packages/api /app/lodestar/packages/api +RUN yarn lerna run --scope @lodestar/api build + +COPY ./lodestar/packages/validator /app/lodestar/packages/validator +RUN yarn lerna run --scope @lodestar/validator build + +COPY ./lodestar/packages/beacon-node /app/lodestar/packages/beacon-node +RUN yarn lerna run --scope @lodestar/beacon-node build EXPOSE 3500 4000 7500 13000 12000 8080 From 042c4eb291a4b721a2dd811bba5eeacca42d3683 Mon Sep 17 00:00:00 2001 From: dancoffman Date: Tue, 18 Oct 2022 14:20:52 -0700 Subject: [PATCH 06/45] We must also build the CLI --- lodestar/Dockerfile.lodestar | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lodestar/Dockerfile.lodestar b/lodestar/Dockerfile.lodestar index f7cb243..4a3d6bd 100644 --- a/lodestar/Dockerfile.lodestar +++ b/lodestar/Dockerfile.lodestar @@ -25,6 +25,7 @@ WORKDIR /app/lodestar RUN yarn install --ignore-optional +COPY ./lodestar/lodestar /app/lodestar/lodestar COPY ./lodestar/lerna.json /app/lodestar/lerna.json COPY ./lodestar/tsconfig.build.json /app/lodestar/tsconfig.build.json COPY ./lodestar/tsconfig.json /app/lodestar/tsconfig.json @@ -56,10 +57,16 @@ RUN yarn lerna run --scope @lodestar/db build COPY ./lodestar/packages/api /app/lodestar/packages/api RUN yarn lerna run --scope @lodestar/api build +COPY ./lodestar/packages/light-client /app/lodestar/packages/light-client +RUN yarn lerna run --scope @lodestar/light-client build + COPY ./lodestar/packages/validator /app/lodestar/packages/validator RUN yarn lerna run --scope @lodestar/validator build COPY ./lodestar/packages/beacon-node /app/lodestar/packages/beacon-node RUN yarn lerna run --scope @lodestar/beacon-node build +COPY ./lodestar/packages/cli /app/lodestar/packages/cli +RUN yarn lerna run --scope @chainsafe/lodestar build + EXPOSE 3500 4000 7500 13000 12000 8080 From 5fe616d120c07ec7b1dbc3f76ca806da5fba7a3a Mon Sep 17 00:00:00 2001 From: dancoffman Date: Tue, 18 Oct 2022 15:41:05 -0700 Subject: [PATCH 07/45] Fix clean --- Makefile | 6 ++---- lodestar/chain-config.yml | 6 +++--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 19b5e13..0c2c699 100644 --- a/Makefile +++ b/Makefile @@ -10,9 +10,7 @@ devnet-up: lodestar-up: docker compose up -d\ execution-node\ - execution-node-2\ lodestar-beacon-node\ - lodestar-beacon-node-follower devnet-down: docker compose down -v @@ -21,7 +19,7 @@ devnet-restart: devnet-down devnet-up devnet-clean: docker compose down - docker image ls 'eip4844-interop*' --format='{{.Repository}}' | xargs -r docker rmi - docker volume ls --filter name=eip4844-interop --format='{{.Name}}' | xargs -r docker volume rm + docker image ls 'interop*' --format='{{.Repository}}' | xargs -r docker rmi + docker volume ls --filter name=interop --format='{{.Name}}' | xargs -r docker volume rm .PHONY: devnet-clean diff --git a/lodestar/chain-config.yml b/lodestar/chain-config.yml index 3ebec36..01c617e 100644 --- a/lodestar/chain-config.yml +++ b/lodestar/chain-config.yml @@ -2,9 +2,9 @@ CONFIG_NAME: 'local' ALTAIR_FORK_EPOCH: 1 BELLATRIX_FORK_EPOCH: 2 EIP4844_FORK_EPOCH: 3 # ensure this happens at exactly shardingForkBlock in execution -SECONDS_PER_SLOT: 4 -SLOTS_PER_EPOCH: 1 -TERMINAL_TOTAL_DIFFICULTY: 2 +SECONDS_PER_SLOT: 6 +# SLOTS_PER_EPOCH: 3 # Lodestar doesn't seem to respect this setting +TERMINAL_TOTAL_DIFFICULTY: 2 # Has to match geth-genesis # avoid collisions with mainnet/eip4844 config versioning GENESIS_FORK_VERSION: 0x00000ffe From ebccdf80434d4fcaccb2997a7439202a237235b7 Mon Sep 17 00:00:00 2001 From: dancoffman Date: Thu, 20 Oct 2022 10:17:26 -0700 Subject: [PATCH 08/45] Update to head of Lodestar --- lodestar/chain-config.yml | 19 ++++++++----------- lodestar/lodestar | 2 +- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/lodestar/chain-config.yml b/lodestar/chain-config.yml index 01c617e..bcefb86 100644 --- a/lodestar/chain-config.yml +++ b/lodestar/chain-config.yml @@ -1,15 +1,12 @@ -CONFIG_NAME: 'local' +CONFIG_NAME: 'minimal' + +TERMINAL_TOTAL_DIFFICULTY: 2 # Has to match geth-genesis + ALTAIR_FORK_EPOCH: 1 BELLATRIX_FORK_EPOCH: 2 -EIP4844_FORK_EPOCH: 3 # ensure this happens at exactly shardingForkBlock in execution -SECONDS_PER_SLOT: 6 -# SLOTS_PER_EPOCH: 3 # Lodestar doesn't seem to respect this setting -TERMINAL_TOTAL_DIFFICULTY: 2 # Has to match geth-genesis +CAPELLA_FORK_EPOCH: 3 +EIP4844_FORK_EPOCH: 4 # ensure this happens at exactly shardingForkBlock in execution -# avoid collisions with mainnet/eip4844 config versioning -GENESIS_FORK_VERSION: 0x00000ffe -ALTAIR_FORK_VERSION: 0x01000ffe -BELLATRIX_FORK_VERSION: 0x02000ffe -EIP4844_FORK_VERSION: 0x03000ffe +SECONDS_PER_SLOT: 4 +SLOTS_PER_EPOCH: 3 # Lodestar doesn't seem to respect this setting -DOMAIN_BLOBS_SIDECAR: 0x0a000000 diff --git a/lodestar/lodestar b/lodestar/lodestar index 6489264..9c65a22 160000 --- a/lodestar/lodestar +++ b/lodestar/lodestar @@ -1 +1 @@ -Subproject commit 64892640a4c60ea7901b3ac2f2df61d572cf3ffa +Subproject commit 9c65a22f3ab0b6f2d6b93a235e7a74e454fc55cd From f8f5d427a3ebdc37005e213d132559e06127fe1e Mon Sep 17 00:00:00 2001 From: dancoffman Date: Fri, 28 Oct 2022 11:59:26 -0700 Subject: [PATCH 09/45] Fun through Capella --- geth/geth-genesis.json | 2 +- lodestar/lodestar | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/geth/geth-genesis.json b/geth/geth-genesis.json index 121a4fd..6a4adf1 100644 --- a/geth/geth-genesis.json +++ b/geth/geth-genesis.json @@ -13,7 +13,7 @@ "muirGlacierBlock": 0, "berlinBlock": 0, "londonBlock": 0, - "shardingForkBlock": 5, + "shardingForkBlock": 8, "clique": { "period": 5, "epoch": 30000 diff --git a/lodestar/lodestar b/lodestar/lodestar index 9c65a22..07f13a5 160000 --- a/lodestar/lodestar +++ b/lodestar/lodestar @@ -1 +1 @@ -Subproject commit 9c65a22f3ab0b6f2d6b93a235e7a74e454fc55cd +Subproject commit 07f13a5af839f5a38070a0c517d124e17c44ec1f From 2b5e0834cb6334c9c26dc0bf0f7ddd93db888be9 Mon Sep 17 00:00:00 2001 From: dancoffman Date: Fri, 28 Oct 2022 15:57:55 -0700 Subject: [PATCH 10/45] Latest Lodestar --- lodestar/lodestar | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lodestar/lodestar b/lodestar/lodestar index 07f13a5..4b1d1fd 160000 --- a/lodestar/lodestar +++ b/lodestar/lodestar @@ -1 +1 @@ -Subproject commit 07f13a5af839f5a38070a0c517d124e17c44ec1f +Subproject commit 4b1d1fdccdb1ee7b9ef34bbed10a8b2542c22d1b From 6b04bac2cfc1341c23cb52cb32e7f3e23e0029ec Mon Sep 17 00:00:00 2001 From: Roberto Bayardo Date: Fri, 28 Oct 2022 20:41:11 -0700 Subject: [PATCH 11/45] latest prsym --- prysm/prysm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prysm/prysm b/prysm/prysm index 948127b..eb1b85d 160000 --- a/prysm/prysm +++ b/prysm/prysm @@ -1 +1 @@ -Subproject commit 948127b7c1c533469c20a64efb691b03f60fd267 +Subproject commit eb1b85d841bce912d67062bbb6fefc9aa4ae31af From 75c78da248456ac37c1ff243c2b08cc292c4b448 Mon Sep 17 00:00:00 2001 From: dancoffman Date: Fri, 28 Oct 2022 22:27:26 -0700 Subject: [PATCH 12/45] Remove nonfunctional setting --- lodestar/chain-config.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lodestar/chain-config.yml b/lodestar/chain-config.yml index bcefb86..72a488f 100644 --- a/lodestar/chain-config.yml +++ b/lodestar/chain-config.yml @@ -5,8 +5,6 @@ TERMINAL_TOTAL_DIFFICULTY: 2 # Has to match geth-genesis ALTAIR_FORK_EPOCH: 1 BELLATRIX_FORK_EPOCH: 2 CAPELLA_FORK_EPOCH: 3 -EIP4844_FORK_EPOCH: 4 # ensure this happens at exactly shardingForkBlock in execution +EIP4844_FORK_EPOCH: 4 SECONDS_PER_SLOT: 4 -SLOTS_PER_EPOCH: 3 # Lodestar doesn't seem to respect this setting - From ea6482c19f9ce30c388e8dfaf46d5ddc140064aa Mon Sep 17 00:00:00 2001 From: dancoffman Date: Fri, 28 Oct 2022 22:28:38 -0700 Subject: [PATCH 13/45] Bump Lodestar --- lodestar/lodestar | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lodestar/lodestar b/lodestar/lodestar index 4b1d1fd..2487cc0 160000 --- a/lodestar/lodestar +++ b/lodestar/lodestar @@ -1 +1 @@ -Subproject commit 4b1d1fdccdb1ee7b9ef34bbed10a8b2542c22d1b +Subproject commit 2487cc05c1ce801b66daf458a16f0a612e856660 From c7b628a4b970a5f6cec66bc92c72512512e2d857 Mon Sep 17 00:00:00 2001 From: Roberto Bayardo Date: Fri, 4 Nov 2022 15:15:39 -0700 Subject: [PATCH 14/45] update geth to latest merge w/ master (#46) --- .github/workflows/ci.yml | 4 ++-- geth/go-ethereum | 2 +- go.mod | 5 +++-- go.sum | 9 ++++++--- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7ee60b9..f879c2f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,9 +2,9 @@ name: CI on: push: - branches: [ "master" ] + branches: [ "master", "devnet-v3" ] pull_request: - branches: [ "master" ] + branches: [ "master", "devnet-v3" ] jobs: build: diff --git a/geth/go-ethereum b/geth/go-ethereum index 8925aee..c702b48 160000 --- a/geth/go-ethereum +++ b/geth/go-ethereum @@ -1 +1 @@ -Subproject commit 8925aee77ccf75ad9e381432e2c414f2e5d68998 +Subproject commit c702b48542848b7a7cf26f7c97be053be1aae53c diff --git a/go.mod b/go.mod index 89fe451..f02c746 100644 --- a/go.mod +++ b/go.mod @@ -64,6 +64,7 @@ require ( github.com/hashicorp/go-bexpr v0.1.11 // indirect github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect github.com/herumi/bls-eth-go-binary v1.28.1 // indirect + github.com/holiman/big v0.0.0-20221017200358-a027dc42d04e // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/huin/goupnp v1.0.3 // indirect github.com/ipfs/go-cid v0.2.0 // indirect @@ -165,7 +166,7 @@ require ( github.com/tklauser/numcpus v0.4.0 // indirect github.com/trailofbits/go-mutexasserts v0.0.0-20200708152505-19999e7d3cef // indirect github.com/uber/jaeger-client-go v2.25.0+incompatible // indirect - github.com/urfave/cli/v2 v2.10.2 // indirect + github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa // indirect github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 // indirect github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect @@ -180,7 +181,7 @@ require ( golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e // indirect golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b // indirect golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect - golang.org/x/sys v0.0.0-20220818161305-2296e01440c6 // indirect + golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43 // indirect golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect golang.org/x/text v0.3.7 // indirect golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 // indirect diff --git a/go.sum b/go.sum index 94f4cde..24544c4 100644 --- a/go.sum +++ b/go.sum @@ -429,6 +429,8 @@ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/herumi/bls-eth-go-binary v1.28.1 h1:fcIZ48y5EE9973k05XjE8+P3YiQgjZz4JI/YabAm8KA= github.com/herumi/bls-eth-go-binary v1.28.1/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U= +github.com/holiman/big v0.0.0-20221017200358-a027dc42d04e h1:pIYdhNkDh+YENVNi3gto8n9hAmRxKxoar0iE6BLucjw= +github.com/holiman/big v0.0.0-20221017200358-a027dc42d04e/go.mod h1:j9cQbcqHQujT0oKJ38PylVfqohClLr3CvDC+Qcg+lhU= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.1.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= @@ -1056,8 +1058,8 @@ github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljT github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.10.2 h1:x3p8awjp/2arX+Nl/G2040AZpOCHS/eMJJ1/a+mye4Y= -github.com/urfave/cli/v2 v2.10.2/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo= +github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa h1:5SqCsI/2Qya2bCzK15ozrqo2sZxkh0FHynJZOTVoV6Q= +github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa/go.mod h1:1CNUng3PtjQMtRzJO4FMXBQvkGtuYRxxiR9xMa7jMwI= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= github.com/wealdtech/go-bytesutil v1.1.1 h1:ocEg3Ke2GkZ4vQw5lp46rmO+pfqCCTgq35gqOy8JKVc= @@ -1365,8 +1367,9 @@ golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220818161305-2296e01440c6 h1:Sx/u41w+OwrInGdEckYmEuU5gHoGSL4QbDz3S9s6j4U= golang.org/x/sys v0.0.0-20220818161305-2296e01440c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43 h1:OK7RB6t2WQX54srQQYSXMW8dF5C6/8+oA/s5QBmmto4= +golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= From 591a01b0dbe9a95664573cfcfc034e5d530cae03 Mon Sep 17 00:00:00 2001 From: Jimmy Chen Date: Sun, 6 Nov 2022 03:30:12 +0800 Subject: [PATCH 15/45] Make all beacon chain config values explicit and move to common directory (#48) * Add common beacon chain config file * Move PRESET_BASE to top of config file * bump service start timeout from 1 to 2 min * Revert timeout change from 2 minutes to 60 sec Co-authored-by: Roberto Bayardo --- docker-compose.yml | 14 ++++---- prysm/prysm-chain-config.yml | 15 --------- prysm/run_beacon_node.sh | 2 +- shared/chain-config.yml | 64 ++++++++++++++++++++++++++++++++++++ shared/config.go | 2 +- 5 files changed, 73 insertions(+), 24 deletions(-) delete mode 100644 prysm/prysm-chain-config.yml create mode 100644 shared/chain-config.yml diff --git a/docker-compose.yml b/docker-compose.yml index 3d15345..b95d4d5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -59,8 +59,8 @@ services: volumes: - "beacon_node_data:/chaindata" - type: bind - source: ./prysm/prysm-chain-config.yml - target: /config/prysm-chain-config.yml + source: ./shared/chain-config.yml + target: /config/chain-config.yml - type: bind source: ./prysm/run_beacon_node.sh target: /usr/local/bin/run_beacon_node.sh @@ -91,8 +91,8 @@ services: volumes: - "beacon_node_follower_data:/chaindata" - type: bind - source: ./prysm/prysm-chain-config.yml - target: /config/prysm-chain-config.yml + source: ./shared/chain-config.yml + target: /config/chain-config.yml - type: bind source: ./prysm/run_beacon_node.sh target: /usr/local/bin/run_beacon_node.sh @@ -120,7 +120,7 @@ services: --interop-num-validators=4 --interop-start-index=0 --force-clear-db - --chain-config-file=/config/prysm-chain-config.yml + --chain-config-file=/config/chain-config.yml --suggested-fee-recipient 0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b --enable-tracing --tracing-endpoint http://jaeger-tracing:14268/api/traces @@ -129,8 +129,8 @@ services: - "7500:7500" volumes: - type: bind - source: ./prysm/prysm-chain-config.yml - target: /config/prysm-chain-config.yml + source: ./shared/chain-config.yml + target: /config/chain-config.yml jaeger-tracing: image: jaegertracing/all-in-one:1.35 diff --git a/prysm/prysm-chain-config.yml b/prysm/prysm-chain-config.yml deleted file mode 100644 index d0740af..0000000 --- a/prysm/prysm-chain-config.yml +++ /dev/null @@ -1,15 +0,0 @@ -CONFIG_NAME: "local" -ALTAIR_FORK_EPOCH: 1 -BELLATRIX_FORK_EPOCH: 2 -EIP4844_FORK_EPOCH: 3 # ensure this happens at exactly shardingForkBlock in execution -SECONDS_PER_SLOT: 6 -SLOTS_PER_EPOCH: 3 -TERMINAL_TOTAL_DIFFICULTY: 2 - -# avoid collisions with mainnet/eip4844 config versioning -GENESIS_FORK_VERSION: 0x00000ffe -ALTAIR_FORK_VERSION: 0x01000ffe -BELLATRIX_FORK_VERSION: 0x02000ffe -EIP4844_FORK_VERSION: 0x03000ffe - -DOMAIN_BLOBS_SIDECAR: 0x0a000000 diff --git a/prysm/run_beacon_node.sh b/prysm/run_beacon_node.sh index 3c2c34a..7c66219 100755 --- a/prysm/run_beacon_node.sh +++ b/prysm/run_beacon_node.sh @@ -32,7 +32,7 @@ beacon-node \ --interop-eth1data-votes \ --http-web3provider="$EXECUTION_NODE_URL" \ --deposit-contract 0x8A04d14125D0FDCDc742F4A05C051De07232EDa4 \ - --chain-config-file=/config/prysm-chain-config.yml \ + --chain-config-file=/config/chain-config.yml \ --contract-deployment-block 0 \ --interop-num-validators 4 \ --rpc-host 0.0.0.0 \ diff --git a/shared/chain-config.yml b/shared/chain-config.yml new file mode 100644 index 0000000..6e1c5c2 --- /dev/null +++ b/shared/chain-config.yml @@ -0,0 +1,64 @@ +PRESET_BASE: 'mainnet' +CONFIG_NAME: "local" + +ALTAIR_FORK_EPOCH: 1 +BELLATRIX_FORK_EPOCH: 2 +EIP4844_FORK_EPOCH: 3 # ensure this happens at exactly shardingForkBlock in execution +SECONDS_PER_SLOT: 6 +SLOTS_PER_EPOCH: 3 +TERMINAL_TOTAL_DIFFICULTY: 2 + +# avoid collisions with mainnet/eip4844 config versioning +GENESIS_FORK_VERSION: 0x00000ffe +ALTAIR_FORK_VERSION: 0x01000ffe +BELLATRIX_FORK_VERSION: 0x02000ffe +EIP4844_FORK_VERSION: 0x03000ffe + +DOMAIN_BLOBS_SIDECAR: 0x0a000000 + +# All missing values below (except for DEPOSIT_CONTRACT_ADDRESS) copied from mainnet + +# Genesis +# --------------------------------------------------------------- +# `2**14` (= 16,384) +MIN_GENESIS_ACTIVE_VALIDATOR_COUNT: 16384 +# Dec 1, 2020, 12pm UTC +MIN_GENESIS_TIME: 1606824000 +# 604800 seconds (7 days) +GENESIS_DELAY: 604800 + +# Time parameters +# --------------------------------------------------------------- +# 14 (estimate from Eth1 mainnet) +SECONDS_PER_ETH1_BLOCK: 14 +# 2**8 (= 256) epochs ~27 hours +MIN_VALIDATOR_WITHDRAWABILITY_DELAY: 256 +# 2**8 (= 256) epochs ~27 hours +SHARD_COMMITTEE_PERIOD: 256 +# 2**11 (= 2,048) Eth1 blocks ~8 hours +ETH1_FOLLOW_DISTANCE: 2048 + +# Validator cycle +# --------------------------------------------------------------- +# 2**2 (= 4) +INACTIVITY_SCORE_BIAS: 4 +# 2**4 (= 16) +INACTIVITY_SCORE_RECOVERY_RATE: 16 +# 2**4 * 10**9 (= 16,000,000,000) Gwei +EJECTION_BALANCE: 16000000000 +# 2**2 (= 4) +MIN_PER_EPOCH_CHURN_LIMIT: 4 +# 2**16 (= 65,536) +CHURN_LIMIT_QUOTIENT: 65536 + +# Fork choice +# --------------------------------------------------------------- +# 40% +PROPOSER_SCORE_BOOST: 40 + +# Deposit contract +# --------------------------------------------------------------- +# Ethereum PoW Mainnet +DEPOSIT_CHAIN_ID: 1 +DEPOSIT_NETWORK_ID: 1 +DEPOSIT_CONTRACT_ADDRESS: 0x8A04d14125D0FDCDc742F4A05C051De07232EDa4 diff --git a/shared/config.go b/shared/config.go index 363f346..18b87c3 100644 --- a/shared/config.go +++ b/shared/config.go @@ -27,7 +27,7 @@ func GethChainConfigFilepath() string { } func BeaconChainConfigFilepath() string { - return fmt.Sprintf("%s/prysm/prysm-chain-config.yml", GetBaseDir()) + return fmt.Sprintf("%s/shared/chain-config.yml", GetBaseDir()) } func UpdateChainConfig(config *params.ChainConfig) error { From 04aa67db72a07c10c25792f6a92d2950713125fc Mon Sep 17 00:00:00 2001 From: Roberto Bayardo Date: Mon, 7 Nov 2022 08:07:51 -0800 Subject: [PATCH 16/45] add BLST_PORTABLE to CGO_CFLAGS to fix SIGILL issue with blst (#49) --- .github/workflows/ci.yml | 4 ++++ geth/Dockerfile.geth | 1 + prysm/Dockerfile.prysm | 1 + 3 files changed, 6 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f879c2f..caa8f13 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,9 @@ name: CI +# The flag below may be needed if blst throws SIGILL, which happens with certain (older) CPUs +env: + CGO_CFLAGS: "-O -D__BLST_PORTABLE__" + on: push: branches: [ "master", "devnet-v3" ] diff --git a/geth/Dockerfile.geth b/geth/Dockerfile.geth index 117e8f3..ecd01f7 100644 --- a/geth/Dockerfile.geth +++ b/geth/Dockerfile.geth @@ -14,6 +14,7 @@ WORKDIR /app/go-ethereum # The flag below may be needed if blst throws SIGILL, which happens with certain (older) CPUs # ENV CGO_CFLAGS="-O -D__BLST_PORTABLE__" +ENV CGO_CFLAGS=$CGO_CFLAGS # Build directly as make geth doesn't work because it expects a normal git repository rather than a submodule. We set -buildvcs directly here to avoid this RUN go build \ diff --git a/prysm/Dockerfile.prysm b/prysm/Dockerfile.prysm index e7f4183..de7ea74 100644 --- a/prysm/Dockerfile.prysm +++ b/prysm/Dockerfile.prysm @@ -12,6 +12,7 @@ WORKDIR /app/prysm # The flag below may be needed if blst throws SIGILL, which happens with certain (older) CPUs # ENV CGO_CFLAGS="-O -D__BLST_PORTABLE__" +ENV CGO_CFLAGS=$CGO_CFLAGS RUN go build -o /build/beacon-node -buildvcs=false ./cmd/beacon-chain RUN go build -o /build/validator -buildvcs=false ./cmd/validator From b4f19b884c48601637392a5158de1f1723122d7e Mon Sep 17 00:00:00 2001 From: dancoffman Date: Tue, 8 Nov 2022 09:29:27 -0800 Subject: [PATCH 17/45] Update lodestar submodule. Copy trusted setup --- lodestar/Dockerfile.lodestar | 1 + lodestar/lodestar | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lodestar/Dockerfile.lodestar b/lodestar/Dockerfile.lodestar index 4a3d6bd..70617a0 100644 --- a/lodestar/Dockerfile.lodestar +++ b/lodestar/Dockerfile.lodestar @@ -5,6 +5,7 @@ RUN apt-get update && \ COPY ./lodestar/package.json /app/lodestar/package.json COPY ./lodestar/yarn.lock /app/lodestar/yarn.lock +COPY ./lodestar/trusted_setup.txt /app/lodestar/trusted_setup.txt COPY ./lodestar/packages/api/package.json /app/lodestar/packages/api/package.json COPY ./lodestar/packages/beacon-node/package.json /app/lodestar/packages/beacon-node/package.json diff --git a/lodestar/lodestar b/lodestar/lodestar index 2487cc0..6a8d536 160000 --- a/lodestar/lodestar +++ b/lodestar/lodestar @@ -1 +1 @@ -Subproject commit 2487cc05c1ce801b66daf458a16f0a612e856660 +Subproject commit 6a8d53660ebbffda039d0cd443612f449be1f944 From e8bf85c503c92167302891def3f7e07f52a662c1 Mon Sep 17 00:00:00 2001 From: Roberto Bayardo Date: Tue, 8 Nov 2022 13:36:11 -0800 Subject: [PATCH 18/45] Update devnet v3 with latest subrepos and new test from master (#51) * Add historical sync test (#44) Asserts that the beacon node follower can sync blobs during initial-sync. This patch also refactors the test harness to accommodate dynamic nodes. * update subrepos to latest Co-authored-by: Inphi --- .github/workflows/ci.yml | 3 + erigon/erigon | 2 +- geth/go-ethereum | 2 +- go.mod | 4 +- go.sum | 4 +- shared/config.go | 3 +- tests/blobtx/main.go | 255 ++++--------------------------------- tests/ctrl/bootstrap.go | 151 ++++++++++------------ tests/ctrl/ctrl.go | 41 +++--- tests/ctrl/services.go | 122 ++++++++++++++++++ tests/fee-market/main.go | 223 +++++--------------------------- tests/initial-sync/main.go | 161 +++++++++++++++++++++++ tests/pre-4844/main.go | 9 +- tests/util/util.go | 249 ++++++++++++++++++++++++++++++++++++ 14 files changed, 692 insertions(+), 537 deletions(-) create mode 100644 tests/ctrl/services.go create mode 100644 tests/initial-sync/main.go create mode 100644 tests/util/util.go diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index caa8f13..ac7b4e9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,6 +34,9 @@ jobs: - name: Run Fee market spec tests run: go run ./tests/fee-market + - name: Run Initial sync tests + run: go run ./tests/initial-sync + - name: Collect docker logs on failure if: failure() uses: jwalton/gh-docker-logs@v1 diff --git a/erigon/erigon b/erigon/erigon index d9ff645..c656c65 160000 --- a/erigon/erigon +++ b/erigon/erigon @@ -1 +1 @@ -Subproject commit d9ff645fbf64c42f71a4f8f2ee038b00fc0a8a11 +Subproject commit c656c6576fc086c5d8927b6e21523ebf411b4b88 diff --git a/geth/go-ethereum b/geth/go-ethereum index c702b48..bca26b3 160000 --- a/geth/go-ethereum +++ b/geth/go-ethereum @@ -1 +1 @@ -Subproject commit c702b48542848b7a7cf26f7c97be053be1aae53c +Subproject commit bca26b3cb8bf9153addcaa17c033b20ddcaa00ba diff --git a/go.mod b/go.mod index f02c746..a09cbc1 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ require ( github.com/protolambda/ztyp v0.2.1 github.com/prysmaticlabs/prysm/v3 v3.1.1 github.com/wealdtech/go-bytesutil v1.1.1 + golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f google.golang.org/grpc v1.40.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -141,7 +142,7 @@ require ( github.com/prometheus/procfs v0.7.3 // indirect github.com/prometheus/prom2json v1.3.0 // indirect github.com/prometheus/tsdb v0.10.0 // indirect - github.com/protolambda/go-kzg v0.0.0-20221025081131-f3a74d3b1d0c // indirect + github.com/protolambda/go-kzg v0.0.0-20221108193918-c6d0faa55038 // indirect github.com/prysmaticlabs/fastssz v0.0.0-20220628121656-93dfe28febab // indirect github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 // indirect github.com/prysmaticlabs/gohashtree v0.0.2-alpha // indirect @@ -180,7 +181,6 @@ require ( golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e // indirect golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b // indirect - golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43 // indirect golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect golang.org/x/text v0.3.7 // indirect diff --git a/go.sum b/go.sum index 24544c4..6b224b5 100644 --- a/go.sum +++ b/go.sum @@ -912,8 +912,8 @@ github.com/prometheus/prom2json v1.3.0/go.mod h1:rMN7m0ApCowcoDlypBHlkNbp5eJQf/+ github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/prometheus/tsdb v0.10.0 h1:If5rVCMTp6W2SiRAQFlbpJNgVlgMEd+U2GZckwK38ic= github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSgwXEyGCt4= -github.com/protolambda/go-kzg v0.0.0-20221025081131-f3a74d3b1d0c h1:9PBJD0rbR2dsgzUoi7GGbCJ3PZssM2eK//tHaAVS5Ds= -github.com/protolambda/go-kzg v0.0.0-20221025081131-f3a74d3b1d0c/go.mod h1:9Lk5SNX/61jq4lbyYcxCvOeldv4xEUAO6QMp/Fd5ALw= +github.com/protolambda/go-kzg v0.0.0-20221108193918-c6d0faa55038 h1:oTNfeC6fvE/m3iT62hR+umMXjdjtnhCQ6ez9Kl4Gwu0= +github.com/protolambda/go-kzg v0.0.0-20221108193918-c6d0faa55038/go.mod h1:9Lk5SNX/61jq4lbyYcxCvOeldv4xEUAO6QMp/Fd5ALw= github.com/protolambda/ztyp v0.2.1 h1:+rfw75/Zh8EopNlG652TGDXlLgJflj6XWxJ9yCVpJws= github.com/protolambda/ztyp v0.2.1/go.mod h1:9bYgKGqg3wJqT9ac1gI2hnVb0STQq7p/1lapqrqY1dU= github.com/prysmaticlabs/fastssz v0.0.0-20220628121656-93dfe28febab h1:Y3PcvUrnneMWLuypZpwPz8P70/DQsz6KgV9JveKpyZs= diff --git a/shared/config.go b/shared/config.go index 18b87c3..3198949 100644 --- a/shared/config.go +++ b/shared/config.go @@ -45,7 +45,8 @@ var ( BeaconRPC = "localhost:4000" BeaconGatewayGRPC = "localhost:3500" BeaconMultiAddress = "/ip4/0.0.0.0/tcp/13000" - BeaconFollowerRPC = "http://localhost:3501" + BeaconFollowerRPC = "localhost:4001" + BeaconGatewayFollowerGRPC = "localhost:3501" BeaconFollowerMultiAddress = "/ip4/0.0.0.0/tcp/13001" ValidatorRPC = "http://localhost:7500" ) diff --git a/tests/blobtx/main.go b/tests/blobtx/main.go index 7f33767..e6b8a1c 100644 --- a/tests/blobtx/main.go +++ b/tests/blobtx/main.go @@ -1,37 +1,20 @@ package main import ( - "bytes" "context" - "errors" - "fmt" - "io" "log" "math/big" - "strings" "time" "github.com/Inphi/eip4844-interop/shared" "github.com/Inphi/eip4844-interop/tests/ctrl" + "github.com/Inphi/eip4844-interop/tests/util" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/ethclient" "github.com/holiman/uint256" - "github.com/libp2p/go-libp2p" - libp2pcore "github.com/libp2p/go-libp2p-core" - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/protocol" - ma "github.com/multiformats/go-multiaddr" "github.com/protolambda/ztyp/view" - "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p" - "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p/encoder" - "github.com/prysmaticlabs/prysm/v3/beacon-chain/sync" - consensustypes "github.com/prysmaticlabs/prysm/v3/consensus-types/primitives" - ethpbv1 "github.com/prysmaticlabs/prysm/v3/proto/eth/v1" - ethpbv2 "github.com/prysmaticlabs/prysm/v3/proto/eth/v2" - ethpb "github.com/prysmaticlabs/prysm/v3/proto/prysm/v1alpha1" ) func GetBlobs() types.Blobs { @@ -47,61 +30,42 @@ func main() { ctrl.InitE2ETest() ctrl.WaitForShardingFork() ctrl.WaitForEip4844ForkEpoch() + env := ctrl.GetEnv() ctx, cancel := context.WithTimeout(context.Background(), time.Minute*20) defer cancel() + ethClient, err := ctrl.GetExecutionClient(ctx) + if err != nil { + log.Fatalf("unable to get execution client: %v", err) + } + beaconClient, err := ctrl.GetBeaconNodeClient(ctx) + if err != nil { + log.Fatalf("unable to get beacon client: %v", err) + } + blobs := GetBlobs() // Retrieve the current slot to being our blobs search on the beacon chain - startSlot := GetHeadSlot(ctx) + startSlot := util.GetHeadSlot(ctx, beaconClient) - UploadBlobs(ctx, blobs) - WaitForNextSlot(ctx) - slot := FindBlobSlot(ctx, startSlot) + UploadBlobs(ctx, ethClient, blobs) + util.WaitForNextSlots(ctx, beaconClient, 1) + slot := util.FindBlobSlot(ctx, beaconClient, startSlot) log.Printf("checking blob from beacon node") - downloadedData := DownloadBlobs(ctx, slot, 1, shared.BeaconMultiAddress) + downloadedData := util.DownloadBlobs(ctx, slot, 1, shared.BeaconMultiAddress) downloadedBlobs := shared.EncodeBlobs(downloadedData) - AssertBlobsEquals(blobs, downloadedBlobs) + util.AssertBlobsEquals(blobs, downloadedBlobs) log.Printf("checking blob from beacon node follower") - time.Sleep(time.Second * 2 * time.Duration(ctrl.Env.BeaconChainConfig.SecondsPerSlot)) // wait a bit for sync - downloadedData = DownloadBlobs(ctx, slot, 1, shared.BeaconFollowerMultiAddress) + time.Sleep(time.Second * 2 * time.Duration(env.BeaconChainConfig.SecondsPerSlot)) // wait a bit for sync + downloadedData = util.DownloadBlobs(ctx, slot, 1, shared.BeaconFollowerMultiAddress) downloadedBlobs = shared.EncodeBlobs(downloadedData) - AssertBlobsEquals(blobs, downloadedBlobs) + util.AssertBlobsEquals(blobs, downloadedBlobs) } -func AssertBlobsEquals(a, b types.Blobs) { - // redundant for nice for debugging - if len(a) != len(b) { - log.Fatalf("data length mismatch (%d != %d)", len(a), len(b)) - } - for i, _ := range a { - for j := 0; j < params.FieldElementsPerBlob; j++ { - if !bytes.Equal(a[i][j][:], b[i][j][:]) { - log.Fatal("blobs data mismatch") - } - } - } -} - -func WaitForNextSlot(ctx context.Context) { - if err := ctrl.WaitForSlot(ctx, GetHeadSlot(ctx).Add(1)); err != nil { - log.Fatalf("error waiting for next slot: %v", err) - } -} - -func GetHeadSlot(ctx context.Context) consensustypes.Slot { - req := ðpbv1.BlockRequest{BlockId: []byte("head")} - header, err := ctrl.Env.BeaconChainClient.GetBlockHeader(ctx, req) - if err != nil { - log.Fatalf("unable to get beacon chain head: %v", err) - } - return header.Data.Header.Message.Slot -} - -func UploadBlobs(ctx context.Context, blobs types.Blobs) { +func UploadBlobs(ctx context.Context, client *ethclient.Client, blobs types.Blobs) { chainId := big.NewInt(1) signer := types.NewDankSigner(chainId) @@ -110,7 +74,7 @@ func UploadBlobs(ctx context.Context, blobs types.Blobs) { log.Fatalf("Failed to load private key: %v", err) } - nonce, err := ctrl.Env.EthClient.PendingNonceAt(ctx, crypto.PubkeyToAddress(key.PublicKey)) + nonce, err := client.PendingNonceAt(ctx, crypto.PubkeyToAddress(key.PublicKey)) if err != nil { log.Fatalf("Error getting nonce: %v", err) } @@ -143,183 +107,14 @@ func UploadBlobs(ctx context.Context, blobs types.Blobs) { if err != nil { log.Fatalf("Error signing tx: %v", err) } - err = ctrl.Env.EthClient.SendTransaction(ctx, tx) + err = client.SendTransaction(ctx, tx) if err != nil { log.Fatalf("Error sending tx: %v", err) } log.Printf("Transaction submitted. hash=%v", tx.Hash()) log.Printf("Waiting for transaction (%v) to be included...", tx.Hash()) - if _, err := shared.WaitForReceipt(ctx, ctrl.Env.EthClient, tx.Hash()); err != nil { + if _, err := shared.WaitForReceipt(ctx, client, tx.Hash()); err != nil { log.Fatalf("Error waiting for transaction receipt %v: %v", tx.Hash(), err) } } - -func FindBlobSlot(ctx context.Context, startSlot consensustypes.Slot) consensustypes.Slot { - slot := startSlot - endSlot := GetHeadSlot(ctx) - for { - if slot == endSlot { - log.Fatalf("Unable to find beacon block containing blobs") - } - - blockID := fmt.Sprintf("%d", uint64(slot)) - req := ðpbv2.BlockRequestV2{BlockId: []byte(blockID)} - block, err := ctrl.Env.BeaconChainClient.GetBlockV2(ctx, req) - if err != nil { - log.Fatalf("beaconchainclient.GetBlock: %v", err) - } - eip4844, ok := block.Data.Message.(*ethpbv2.SignedBeaconBlockContainer_Eip4844Block) - if ok { - if len(eip4844.Eip4844Block.Body.BlobKzgs) != 0 { - return eip4844.Eip4844Block.Slot - } - } - - slot = slot.Add(1) - } -} - -func DownloadBlobs(ctx context.Context, startSlot consensustypes.Slot, count uint64, beaconMA string) []byte { - // TODO: Use Beacon gRPC to download blobs rather than p2p RPC - log.Print("downloading blobs...") - - req := ðpb.BlobsSidecarsByRangeRequest{ - StartSlot: startSlot, - Count: count, - } - - h, err := libp2p.New() - if err != nil { - log.Fatalf("failed to create libp2p context: %v", err) - } - defer func() { - _ = h.Close() - }() - - multiaddr, err := getMultiaddr(ctx, h, beaconMA) - if err != nil { - log.Fatalf("getMultiAddr: %v", err) - } - - addrInfo, err := peer.AddrInfoFromP2pAddr(multiaddr) - if err != nil { - log.Fatal(err) - } - - err = h.Connect(ctx, *addrInfo) - if err != nil { - log.Fatalf("libp2p host connect: %v", err) - } - - sidecars, err := sendBlobsSidecarsByRangeRequest(ctx, h, encoder.SszNetworkEncoder{}, addrInfo.ID, req) - if err != nil { - log.Fatalf("failed to send blobs p2p request: %v", err) - } - - anyBlobs := false - blobsBuffer := new(bytes.Buffer) - for _, sidecar := range sidecars { - if sidecar.Blobs == nil || len(sidecar.Blobs) == 0 { - continue - } - anyBlobs = true - for _, blob := range sidecar.Blobs { - data := shared.DecodeBlob(blob.Blob) - _, _ = blobsBuffer.Write(data) - } - - // stop after the first sidecar with blobs: - break - } - - if !anyBlobs { - log.Fatalf("No blobs found in requested slots, sidecar count: %d", len(sidecars)) - } - - return blobsBuffer.Bytes() -} - -func getMultiaddr(ctx context.Context, h host.Host, addr string) (ma.Multiaddr, error) { - multiaddr, err := ma.NewMultiaddr(addr) - if err != nil { - return nil, err - } - _, id := peer.SplitAddr(multiaddr) - if id != "" { - return multiaddr, nil - } - // peer ID wasn't provided, look it up - id, err = retrievePeerID(ctx, h, addr) - if err != nil { - return nil, err - } - return ma.NewMultiaddr(fmt.Sprintf("%s/p2p/%s", addr, string(id))) -} - -// Helper for retrieving the peer ID from a security error... obviously don't use this in production! -// See https://github.com/libp2p/go-libp2p-noise/blob/v0.3.0/handshake.go#L250 -func retrievePeerID(ctx context.Context, h host.Host, addr string) (peer.ID, error) { - incorrectPeerID := "16Uiu2HAmSifdT5QutTsaET8xqjWAMPp4obrQv7LN79f2RMmBe3nY" - addrInfo, err := peer.AddrInfoFromString(fmt.Sprintf("%s/p2p/%s", addr, incorrectPeerID)) - if err != nil { - return "", err - } - err = h.Connect(ctx, *addrInfo) - if err == nil { - return "", errors.New("unexpected successful connection") - } - if strings.Contains(err.Error(), "but remote key matches") { - split := strings.Split(err.Error(), " ") - return peer.ID(split[len(split)-1]), nil - } - return "", err -} - -func sendBlobsSidecarsByRangeRequest(ctx context.Context, h host.Host, encoding encoder.NetworkEncoding, pid peer.ID, req *ethpb.BlobsSidecarsByRangeRequest) ([]*ethpb.BlobsSidecar, error) { - topic := fmt.Sprintf("%s%s", p2p.RPCBlobsSidecarsByRangeTopicV1, encoding.ProtocolSuffix()) - - stream, err := h.NewStream(ctx, pid, protocol.ID(topic)) - if err != nil { - return nil, err - } - defer func() { - _ = stream.Close() - }() - - if _, err := encoding.EncodeWithMaxLength(stream, req); err != nil { - _ = stream.Reset() - return nil, err - } - - if err := stream.CloseWrite(); err != nil { - _ = stream.Reset() - return nil, err - } - - var blobsSidecars []*ethpb.BlobsSidecar - for { - blobs, err := readChunkedBlobsSidecar(stream, encoding) - if errors.Is(err, io.EOF) { - break - } - if err != nil { - return nil, err - } - blobsSidecars = append(blobsSidecars, blobs) - } - return blobsSidecars, nil -} - -func readChunkedBlobsSidecar(stream libp2pcore.Stream, encoding encoder.NetworkEncoding) (*ethpb.BlobsSidecar, error) { - code, errMsg, err := sync.ReadStatusCode(stream, encoding) - if err != nil { - return nil, err - } - if code != 0 { - return nil, errors.New(errMsg) - } - sidecar := new(ethpb.BlobsSidecar) - err = encoding.DecodeWithMaxLength(stream, sidecar) - return sidecar, err -} diff --git a/tests/ctrl/bootstrap.go b/tests/ctrl/bootstrap.go index 5624aae..2d3bd49 100644 --- a/tests/ctrl/bootstrap.go +++ b/tests/ctrl/bootstrap.go @@ -6,99 +6,54 @@ import ( "fmt" "io/ioutil" "log" - "net/http" "time" "github.com/Inphi/eip4844-interop/shared" "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/ethclient" "github.com/ethereum/go-ethereum/params" types "github.com/prysmaticlabs/prysm/v3/consensus-types/primitives" beaconservice "github.com/prysmaticlabs/prysm/v3/proto/eth/service" ethpbv1 "github.com/prysmaticlabs/prysm/v3/proto/eth/v1" - "google.golang.org/grpc" + "golang.org/x/sync/errgroup" "gopkg.in/yaml.v2" ) -func WaitForService(ctx context.Context, url string) error { - ctx, cancel := context.WithTimeout(ctx, time.Second*60) - defer cancel() - for { - if _, err := http.Get(url); err == nil { - break - } - select { - case <-ctx.Done(): - return ctx.Err() - case <-time.After(1 * time.Second): - } - } - return nil - -} - -func WaitForGeth(ctx context.Context) error { - log.Printf("waiting for geth") - return WaitForService(ctx, shared.GethRPC) -} +var env *TestEnvironment -func WaitForBeaconNode(ctx context.Context) error { - log.Printf("waiting for prysm beacon node") - return WaitForService(ctx, fmt.Sprintf("%s/eth/v1/beacon/genesis", fmt.Sprintf("http://%s", shared.BeaconGatewayGRPC))) -} - -func WaitForBeaconNodeFollower(ctx context.Context) error { - log.Printf("waiting for prysm beacon node follower") - return WaitForService(ctx, fmt.Sprintf("%s/eth/v1/beacon/genesis", shared.BeaconFollowerRPC)) -} - -func WaitForValidator(ctx context.Context) error { - log.Printf("waiting for validator") - return WaitForService(ctx, shared.ValidatorRPC) -} - -func WaitForServices(ctx context.Context) error { - if err := WaitForGeth(ctx); err != nil { - return fmt.Errorf("%w: geth offlinev", err) - } - if err := WaitForBeaconNode(ctx); err != nil { - return fmt.Errorf("%w: beacon node offline", err) - } - if err := WaitForBeaconNodeFollower(ctx); err != nil { - return fmt.Errorf("%w: beacon node follower offline", err) - } - if err := WaitForValidator(ctx); err != nil { - return fmt.Errorf("%w: validator is offline", err) +func InitE2ETest() { + ctx := context.Background() + if err := StopDevnet(); err != nil { + log.Fatalf("unable to stop devnet: %v", err) } - return nil + env := GetEnv() + env.StartAll(ctx) } -var Env *TestEnvironment - -func InitE2ETest() { - if err := RestartDevnet(); err != nil { - log.Fatalf("unable to restart devnet: %v", err) +func GetEnv() *TestEnvironment { + if env == nil { + env = newTestEnvironment() } - if err := WaitForServices(context.Background()); err != nil { - log.Fatal(err) - } - - Env = newTestEnvironment() + return env } func WaitForShardingFork() { ctx := context.Background() - config := Env.GethChainConfig + config := env.GethChainConfig eip4844ForkBlock := config.ShardingForkBlock.Uint64() stallTimeout := 1 * time.Minute + client, err := GetExecutionClient(ctx) + if err != nil { + log.Fatalf("unable to retrive beacon node client: %v", err) + } + log.Printf("waiting for sharding fork block...") var lastBn uint64 var lastUpdate time.Time for { - bn, err := Env.EthClient.BlockNumber(ctx) + bn, err := client.BlockNumber(ctx) if err != nil { log.Fatalf("ethclient.BlockNumber: %v", err) } @@ -143,9 +98,17 @@ func ReadBeaconChainConfig() *BeaconChainConfig { } func WaitForSlot(ctx context.Context, slot types.Slot) error { + client, err := GetBeaconNodeClient(ctx) + if err != nil { + return err + } + return WaitForSlotWithClient(ctx, client, slot) +} + +func WaitForSlotWithClient(ctx context.Context, client beaconservice.BeaconChainClient, slot types.Slot) error { req := ðpbv1.BlockRequest{BlockId: []byte("head")} for { - header, err := Env.BeaconChainClient.GetBlockHeader(ctx, req) + header, err := client.GetBlockHeader(ctx, req) if err != nil { return fmt.Errorf("unable to retrieve block header: %v", err) } @@ -153,17 +116,17 @@ func WaitForSlot(ctx context.Context, slot types.Slot) error { if headSlot >= slot { break } - time.Sleep(time.Second * time.Duration(Env.BeaconChainConfig.SecondsPerSlot)) + time.Sleep(time.Second * time.Duration(env.BeaconChainConfig.SecondsPerSlot)) } return nil } func WaitForEip4844ForkEpoch() { - log.Printf("waiting for eip4844 fork epoch...") + log.Println("waiting for eip4844 fork epoch...") ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute) defer cancel() - config := Env.BeaconChainConfig + config := env.BeaconChainConfig eip4844Slot := config.Eip4844ForkEpoch * config.SlotsPerEpoch if err := WaitForSlot(ctx, types.Slot(eip4844Slot)); err != nil { log.Fatal(err) @@ -180,27 +143,43 @@ type BeaconChainConfig struct { } type TestEnvironment struct { - GethChainConfig *params.ChainConfig - BeaconChainConfig *BeaconChainConfig - EthClient *ethclient.Client - BeaconChainClient beaconservice.BeaconChainClient + GethChainConfig *params.ChainConfig + BeaconChainConfig *BeaconChainConfig + BeaconNode Service + GethNode Service + ValidatorNode Service + BeaconNodeFollower Service + GethNode2 Service } func newTestEnvironment() *TestEnvironment { - ctx := context.Background() - eclient, err := ethclient.DialContext(ctx, shared.GethRPC) - if err != nil { - log.Fatalf("Failed to connect to the Ethereum client: %v", err) - } - beaconGRPCConn, err := grpc.DialContext(ctx, shared.BeaconRPC, grpc.WithInsecure()) - if err != nil { - log.Fatalf("Failed to dial beacon grpc", err) - } - return &TestEnvironment{ - GethChainConfig: ReadGethChainConfig(), - BeaconChainConfig: ReadBeaconChainConfig(), - EthClient: eclient, - BeaconChainClient: beaconservice.NewBeaconChainClient(beaconGRPCConn), + GethChainConfig: ReadGethChainConfig(), + BeaconChainConfig: ReadBeaconChainConfig(), + BeaconNode: NewBeaconNode(), + GethNode: NewGethNode(), + ValidatorNode: NewValidatorNode(), + BeaconNodeFollower: NewBeaconNodeFollower(), + GethNode2: NewGethNode2(), } } + +func (env *TestEnvironment) StartAll(ctx context.Context) error { + g, ctx := errgroup.WithContext(ctx) + g.Go(func() error { + return env.BeaconNode.Start(ctx) + }) + g.Go(func() error { + return env.GethNode.Start(ctx) + }) + g.Go(func() error { + return env.ValidatorNode.Start(ctx) + }) + g.Go(func() error { + return env.BeaconNodeFollower.Start(ctx) + }) + g.Go(func() error { + return env.GethNode2.Start(ctx) + }) + return g.Wait() +} diff --git a/tests/ctrl/ctrl.go b/tests/ctrl/ctrl.go index 92d7a9a..96fec59 100644 --- a/tests/ctrl/ctrl.go +++ b/tests/ctrl/ctrl.go @@ -1,20 +1,14 @@ package ctrl import ( + "fmt" "log" "os" "os/exec" + "strings" + "sync" ) -var services = []string{ - "execution-node", - "execution-node-2", - "beacon-node", - "beacon-node-follower", - "validator-node", - "jaeger-tracing", -} - func Run(cmd *exec.Cmd) error { cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr @@ -31,25 +25,34 @@ func Run(cmd *exec.Cmd) error { return nil } -func StartDevnet() error { - err := Run(exec.Command("/bin/sh", "-c", "docker-compose up -d")) +// guards against concurrent access to the docker daemon +var dockerMutex sync.Mutex + +func StartServices(svcs ...string) error { + dockerMutex.Lock() + defer dockerMutex.Unlock() + + svcArg := strings.Join(svcs, " ") + log.Printf("starting services %s", svcArg) + err := Run(exec.Command("/bin/sh", "-c", fmt.Sprintf("docker-compose up -d %s", svcArg))) if err != nil && err.(*exec.ExitError).ExitCode() == 127 { - err = Run(exec.Command("/bin/sh", "-c", "docker compose up -d")) + err = Run(exec.Command("/bin/sh", "-c", fmt.Sprintf("docker compose up -d %s", svcArg))) } return err } -func StopDevnet() error { - err := Run(exec.Command("/bin/sh", "-c", "docker-compose down -v")) +func StopService(svc string) error { + err := Run(exec.Command("/bin/sh", "-c", fmt.Sprintf("docker-compose stop %s", svc))) if err != nil && err.(*exec.ExitError).ExitCode() == 127 { - err = Run(exec.Command("/bin/sh", "-c", "docker compose down -v")) + err = Run(exec.Command("/bin/sh", "-c", fmt.Sprintf("docker compose stop %s", svc))) } return err } -func RestartDevnet() error { - if err := StopDevnet(); err != nil { - return err +func StopDevnet() error { + err := Run(exec.Command("/bin/sh", "-c", "docker-compose down -v")) + if err != nil && err.(*exec.ExitError).ExitCode() == 127 { + err = Run(exec.Command("/bin/sh", "-c", "docker compose down -v")) } - return StartDevnet() + return err } diff --git a/tests/ctrl/services.go b/tests/ctrl/services.go new file mode 100644 index 0000000..e193e11 --- /dev/null +++ b/tests/ctrl/services.go @@ -0,0 +1,122 @@ +package ctrl + +import ( + "context" + "fmt" + "net/http" + "time" + + "github.com/Inphi/eip4844-interop/shared" + "github.com/ethereum/go-ethereum/ethclient" + beaconservice "github.com/prysmaticlabs/prysm/v3/proto/eth/service" + "google.golang.org/grpc" +) + +type Service interface { + Start(ctx context.Context) error + Stop(ctx context.Context) error + Started() <-chan struct{} +} + +func NewBeaconNode() Service { + url := fmt.Sprintf("http://%s/eth/v1/beacon/genesis", shared.BeaconGatewayGRPC) + return newDockerService("beacon-node", url) +} + +func NewValidatorNode() Service { + return newDockerService("validator-node", shared.ValidatorRPC) +} + +func GetBeaconNodeClient(ctx context.Context) (beaconservice.BeaconChainClient, error) { + // TODO: cache conns for reuse + conn, err := grpc.DialContext(ctx, shared.BeaconRPC, grpc.WithInsecure()) + if err != nil { + return nil, fmt.Errorf("%w: failed to dial beacon grpc", err) + } + return beaconservice.NewBeaconChainClient(conn), nil +} + +func NewBeaconNodeFollower() Service { + url := fmt.Sprintf("http://%s/eth/v1/beacon/genesis", shared.BeaconGatewayFollowerGRPC) + return newDockerService("beacon-node-follower", url) +} + +func GetBeaconNodeFollowerClient(ctx context.Context) (beaconservice.BeaconChainClient, error) { + // TODO: cache conns for reuse + conn, err := grpc.DialContext(ctx, shared.BeaconFollowerRPC, grpc.WithInsecure()) + if err != nil { + return nil, fmt.Errorf("%w: failed to dial beacon follower grpc", err) + } + return beaconservice.NewBeaconChainClient(conn), nil +} + +func NewGethNode() Service { + return newDockerService("execution-node", shared.GethRPC) +} + +func NewGethNode2() Service { + return newDockerService("execution-node-2", shared.GethRPC) +} + +func GetExecutionClient(ctx context.Context) (*ethclient.Client, error) { + client, err := ethclient.DialContext(ctx, shared.GethRPC) + if err != nil { + return nil, fmt.Errorf("%w: Failed to connect to the Ethereum client", err) + } + return client, nil +} + +type dockerService struct { + started chan struct{} + svcname string + statusURL string +} + +func (s *dockerService) Start(ctx context.Context) error { + if err := StartServices(s.svcname); err != nil { + return err + } + req, err := http.NewRequestWithContext(ctx, "GET", s.statusURL, nil) + if err != nil { + return err + } + // loop until the status request returns successfully + for { + if _, err := http.DefaultClient.Do(req); err == nil { + close(s.started) + return nil + } + select { + case <-ctx.Done(): + return ctx.Err() + case <-time.After(1 * time.Second): + } + } +} + +func (s *dockerService) Stop(ctx context.Context) error { + return StopService(s.svcname) +} + +func (s *dockerService) Started() <-chan struct{} { + return s.started +} + +func ServiceReady(ctx context.Context, svc Service) error { + for { + select { + case <-ctx.Done(): + return ctx.Err() + case <-svc.Started(): + return nil + } + } +} + +func newDockerService(svcname string, statusURL string) Service { + return &dockerService{ + started: make(chan struct{}), + svcname: svcname, + statusURL: statusURL, + } +} diff --git a/tests/fee-market/main.go b/tests/fee-market/main.go index 65c5f52..f2ef894 100644 --- a/tests/fee-market/main.go +++ b/tests/fee-market/main.go @@ -3,37 +3,26 @@ package main import ( "bytes" "context" - "errors" "fmt" - "io" "log" "math/big" "sort" - "strings" "sync" "time" "github.com/Inphi/eip4844-interop/shared" "github.com/Inphi/eip4844-interop/tests/ctrl" + "github.com/Inphi/eip4844-interop/tests/util" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus/misc" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" "github.com/holiman/uint256" - "github.com/libp2p/go-libp2p" - libp2pcore "github.com/libp2p/go-libp2p-core" - "github.com/libp2p/go-libp2p-core/host" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/protocol" - ma "github.com/multiformats/go-multiaddr" "github.com/protolambda/ztyp/view" - "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p" - "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p/encoder" - beaconchainsync "github.com/prysmaticlabs/prysm/v3/beacon-chain/sync" consensustypes "github.com/prysmaticlabs/prysm/v3/consensus-types/primitives" - ethpbv1 "github.com/prysmaticlabs/prysm/v3/proto/eth/v1" + "github.com/prysmaticlabs/prysm/v3/proto/eth/service" ethpbv2 "github.com/prysmaticlabs/prysm/v3/proto/eth/v2" - ethpb "github.com/prysmaticlabs/prysm/v3/proto/prysm/v1alpha1" ) func GetBlob() types.Blobs { @@ -49,30 +38,40 @@ func main() { ctrl.InitE2ETest() ctrl.WaitForShardingFork() ctrl.WaitForEip4844ForkEpoch() + env := ctrl.GetEnv() ctx, cancel := context.WithTimeout(context.Background(), time.Minute*20) defer cancel() + ethClient, err := ctrl.GetExecutionClient(ctx) + if err != nil { + log.Fatalf("unable to get execution client: %v", err) + } + beaconClient, err := ctrl.GetBeaconNodeClient(ctx) + if err != nil { + log.Fatalf("unable to get beacon client: %v", err) + } + blobsData := make([]types.Blobs, 20) for i := range blobsData { blobsData[i] = GetBlob() } // Retrieve the current slot to being our blobs search on the beacon chain - startSlot := GetHeadSlot(ctx) + startSlot := util.GetHeadSlot(ctx, beaconClient) // Send multiple transactions at the same time to induce non-zero excess_blobs - UploadBlobsAndCheckBlockHeader(ctx, blobsData) + UploadBlobsAndCheckBlockHeader(ctx, ethClient, blobsData) - WaitForNextSlot(ctx) - WaitForNextSlot(ctx) + util.WaitForNextSlots(ctx, beaconClient, 1) + util.WaitForNextSlots(ctx, beaconClient, 1) - blocks := FindBlocksWithBlobs(ctx, startSlot) + blocks := FindBlocksWithBlobs(ctx, beaconClient, startSlot) log.Printf("checking blob from beacon node") var downloadedData []byte for _, b := range blocks { - data := DownloadBlobs(ctx, b.Slot, 1, shared.BeaconMultiAddress) + data := util.DownloadBlobs(ctx, b.Slot, 1, shared.BeaconMultiAddress) downloadedData = append(downloadedData, data...) } @@ -83,11 +82,11 @@ func main() { } log.Printf("checking blob from beacon node follower") - time.Sleep(time.Second * 2 * time.Duration(ctrl.Env.BeaconChainConfig.SecondsPerSlot)) // wait a bit for sync + time.Sleep(time.Second * 2 * time.Duration(env.BeaconChainConfig.SecondsPerSlot)) // wait a bit for sync downloadedData = nil for _, b := range blocks { - data := DownloadBlobs(ctx, b.Slot, 1, shared.BeaconFollowerMultiAddress) + data := util.DownloadBlobs(ctx, b.Slot, 1, shared.BeaconFollowerMultiAddress) downloadedData = append(downloadedData, data...) } if !bytes.Equal(flatBlobs, downloadedData) { @@ -110,22 +109,7 @@ func FlattenBlobs(blobsData []types.Blobs) []byte { return out } -func WaitForNextSlot(ctx context.Context) { - if err := ctrl.WaitForSlot(ctx, GetHeadSlot(ctx).Add(1)); err != nil { - log.Fatalf("error waiting for next slot: %v", err) - } -} - -func GetHeadSlot(ctx context.Context) consensustypes.Slot { - req := ðpbv1.BlockRequest{BlockId: []byte("head")} - header, err := ctrl.Env.BeaconChainClient.GetBlockHeader(ctx, req) - if err != nil { - log.Fatalf("unable to get beacon chain head: %v", err) - } - return header.Data.Header.Message.Slot -} - -func UploadBlobsAndCheckBlockHeader(ctx context.Context, blobsData []types.Blobs) { +func UploadBlobsAndCheckBlockHeader(ctx context.Context, client *ethclient.Client, blobsData []types.Blobs) { chainId := big.NewInt(1) signer := types.NewDankSigner(chainId) @@ -134,7 +118,7 @@ func UploadBlobsAndCheckBlockHeader(ctx context.Context, blobsData []types.Blobs log.Fatalf("Failed to load private key: %v", err) } - nonce, err := ctrl.Env.EthClient.PendingNonceAt(ctx, crypto.PubkeyToAddress(key.PublicKey)) + nonce, err := client.PendingNonceAt(ctx, crypto.PubkeyToAddress(key.PublicKey)) if err != nil { log.Fatalf("Error getting nonce: %v", err) } @@ -179,14 +163,14 @@ func UploadBlobsAndCheckBlockHeader(ctx context.Context, blobsData []types.Blobs tx := tx go func() { defer wg.Done() - err := ctrl.Env.EthClient.SendTransaction(ctx, tx) + err := client.SendTransaction(ctx, tx) if err != nil { log.Fatalf("Error sending tx: %v", err) } log.Printf("Waiting for transaction (%v) to be included...", tx.Hash()) - receipt, err := shared.WaitForReceipt(ctx, ctrl.Env.EthClient, tx.Hash()) + receipt, err := shared.WaitForReceipt(ctx, client, tx.Hash()) if err != nil { log.Fatalf("Error waiting for transaction receipt %v: %v", tx.Hash(), err) } @@ -203,7 +187,7 @@ func UploadBlobsAndCheckBlockHeader(ctx context.Context, blobsData []types.Blobs blocknum := receipt.BlockNumber.Uint64() if _, ok := blockNumbers[blocknum]; !ok { blockHash := receipt.BlockHash.Hex() - block, err := ctrl.Env.EthClient.BlockByHash(ctx, common.HexToHash(blockHash)) + block, err := client.BlockByHash(ctx, common.HexToHash(blockHash)) if err != nil { log.Fatalf("Error getting block: %v", err) } @@ -220,7 +204,7 @@ func UploadBlobsAndCheckBlockHeader(ctx context.Context, blobsData []types.Blobs }) prevExcessDataGas := new(big.Int) - parentBlock, err := ctrl.Env.EthClient.BlockByHash(ctx, blocks[0].ParentHash()) + parentBlock, err := client.BlockByHash(ctx, blocks[0].ParentHash()) if err != nil { log.Fatalf("Error getting block: %v", err) } @@ -238,9 +222,9 @@ func UploadBlobsAndCheckBlockHeader(ctx context.Context, blobsData []types.Blobs } } -func FindBlocksWithBlobs(ctx context.Context, startSlot consensustypes.Slot) []*ethpbv2.BeaconBlockEip4844 { +func FindBlocksWithBlobs(ctx context.Context, client service.BeaconChainClient, startSlot consensustypes.Slot) []*ethpbv2.BeaconBlockEip4844 { slot := startSlot - endSlot := GetHeadSlot(ctx) + endSlot := util.GetHeadSlot(ctx, client) var blocks []*ethpbv2.BeaconBlockEip4844 for { @@ -250,7 +234,7 @@ func FindBlocksWithBlobs(ctx context.Context, startSlot consensustypes.Slot) []* blockID := fmt.Sprintf("%d", uint64(slot)) req := ðpbv2.BlockRequestV2{BlockId: []byte(blockID)} - block, err := ctrl.Env.BeaconChainClient.GetBlockV2(ctx, req) + block, err := client.GetBlockV2(ctx, req) if err != nil { log.Fatalf("beaconchainclient.GetBlock: %v", err) } @@ -269,150 +253,3 @@ func FindBlocksWithBlobs(ctx context.Context, startSlot consensustypes.Slot) []* } return blocks } - -func DownloadBlobs(ctx context.Context, startSlot consensustypes.Slot, count uint64, beaconMA string) []byte { - // TODO: Use Beacon gRPC to download blobs rather than p2p RPC - log.Print("downloading blobs...") - - req := ðpb.BlobsSidecarsByRangeRequest{ - StartSlot: startSlot, - Count: count, - } - - h, err := libp2p.New() - if err != nil { - log.Fatalf("failed to create libp2p context: %v", err) - } - defer func() { - _ = h.Close() - }() - - multiaddr, err := getMultiaddr(ctx, h, beaconMA) - if err != nil { - log.Fatalf("getMultiAddr: %v", err) - } - - addrInfo, err := peer.AddrInfoFromP2pAddr(multiaddr) - if err != nil { - log.Fatal(err) - } - - err = h.Connect(ctx, *addrInfo) - if err != nil { - log.Fatalf("libp2p host connect: %v", err) - } - - // Hack to ensure that we are able to download blob chunks with larger chunk sizes (which is 10 MiB post-bellatrix) - encoder.MaxChunkSize = 10 << 20 - sidecars, err := sendBlobsSidecarsByRangeRequest(ctx, h, encoder.SszNetworkEncoder{}, addrInfo.ID, req) - if err != nil { - log.Fatalf("failed to send blobs p2p request: %v", err) - } - - anyBlobs := false - blobsBuffer := new(bytes.Buffer) - for _, sidecar := range sidecars { - log.Printf("found sidecar with %d blobs", len(sidecar.Blobs)) - if sidecar.Blobs == nil || len(sidecar.Blobs) == 0 { - continue - } - anyBlobs = true - for _, blob := range sidecar.Blobs { - data := shared.DecodeBlob(blob.Blob) - _, _ = blobsBuffer.Write(data) - } - - // stop after the first sidecar with blobs: - break - } - - if !anyBlobs { - log.Fatalf("No blobs found in requested slots, sidecar count: %d", len(sidecars)) - } - - return blobsBuffer.Bytes() -} - -func getMultiaddr(ctx context.Context, h host.Host, addr string) (ma.Multiaddr, error) { - multiaddr, err := ma.NewMultiaddr(addr) - if err != nil { - return nil, err - } - _, id := peer.SplitAddr(multiaddr) - if id != "" { - return multiaddr, nil - } - // peer ID wasn't provided, look it up - id, err = retrievePeerID(ctx, h, addr) - if err != nil { - return nil, err - } - return ma.NewMultiaddr(fmt.Sprintf("%s/p2p/%s", addr, string(id))) -} - -// Helper for retrieving the peer ID from a security error... obviously don't use this in production! -// See https://github.com/libp2p/go-libp2p-noise/blob/v0.3.0/handshake.go#L250 -func retrievePeerID(ctx context.Context, h host.Host, addr string) (peer.ID, error) { - incorrectPeerID := "16Uiu2HAmSifdT5QutTsaET8xqjWAMPp4obrQv7LN79f2RMmBe3nY" - addrInfo, err := peer.AddrInfoFromString(fmt.Sprintf("%s/p2p/%s", addr, incorrectPeerID)) - if err != nil { - return "", err - } - err = h.Connect(ctx, *addrInfo) - if err == nil { - return "", errors.New("unexpected successful connection") - } - if strings.Contains(err.Error(), "but remote key matches") { - split := strings.Split(err.Error(), " ") - return peer.ID(split[len(split)-1]), nil - } - return "", err -} - -func sendBlobsSidecarsByRangeRequest(ctx context.Context, h host.Host, encoding encoder.NetworkEncoding, pid peer.ID, req *ethpb.BlobsSidecarsByRangeRequest) ([]*ethpb.BlobsSidecar, error) { - topic := fmt.Sprintf("%s%s", p2p.RPCBlobsSidecarsByRangeTopicV1, encoding.ProtocolSuffix()) - - stream, err := h.NewStream(ctx, pid, protocol.ID(topic)) - if err != nil { - return nil, err - } - defer func() { - _ = stream.Close() - }() - - if _, err := encoding.EncodeWithMaxLength(stream, req); err != nil { - _ = stream.Reset() - return nil, err - } - - if err := stream.CloseWrite(); err != nil { - _ = stream.Reset() - return nil, err - } - - var blobsSidecars []*ethpb.BlobsSidecar - for { - blobs, err := readChunkedBlobsSidecar(stream, encoding) - if errors.Is(err, io.EOF) { - break - } - if err != nil { - return nil, err - } - blobsSidecars = append(blobsSidecars, blobs) - } - return blobsSidecars, nil -} - -func readChunkedBlobsSidecar(stream libp2pcore.Stream, encoding encoder.NetworkEncoding) (*ethpb.BlobsSidecar, error) { - code, errMsg, err := beaconchainsync.ReadStatusCode(stream, encoding) - if err != nil { - return nil, err - } - if code != 0 { - return nil, errors.New(errMsg) - } - sidecar := new(ethpb.BlobsSidecar) - err = encoding.DecodeWithMaxLength(stream, sidecar) - return sidecar, err -} diff --git a/tests/initial-sync/main.go b/tests/initial-sync/main.go new file mode 100644 index 0000000..182aff6 --- /dev/null +++ b/tests/initial-sync/main.go @@ -0,0 +1,161 @@ +package main + +import ( + "context" + "log" + "math/big" + "time" + + "github.com/Inphi/eip4844-interop/shared" + "github.com/Inphi/eip4844-interop/tests/ctrl" + "github.com/Inphi/eip4844-interop/tests/util" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/holiman/uint256" + "github.com/protolambda/ztyp/view" + "golang.org/x/sync/errgroup" +) + +func GetBlobs() types.Blobs { + // dummy data for the test + return shared.EncodeBlobs([]byte("EKANS")) +} + +// Asserts blob syncing functionality during initial-sync +// 1. Start a single EL/CL node +// 2. Upload blobs +// 3. Wait for blobs to be available +// 4. Start follower EL/CL nodes +// 5. Download blobs from follower +// 6. Asserts that downloaded blobs match the upload +// 7. Asserts execution and beacon block attributes +func main() { + ctx, cancel := context.WithTimeout(context.Background(), time.Minute*20) + defer cancel() + + ctrl.StopDevnet() + env := ctrl.GetEnv() + + g, gctx := errgroup.WithContext(ctx) + g.Go(func() error { + return env.GethNode.Start(gctx) + }) + g.Go(func() error { + return env.BeaconNode.Start(gctx) + }) + g.Go(func() error { + return env.ValidatorNode.Start(gctx) + }) + if err := g.Wait(); err != nil { + log.Fatalf("failed to start services: %v", err) + } + ctrl.WaitForShardingFork() + ctrl.WaitForEip4844ForkEpoch() + + ethClient, err := ctrl.GetExecutionClient(ctx) + if err != nil { + log.Fatalf("unable to get execution client: %v", err) + } + beaconClient, err := ctrl.GetBeaconNodeClient(ctx) + if err != nil { + log.Fatalf("unable to get beacon client: %v", err) + } + + // Retrieve the current slot to being our blobs search on the beacon chain + startSlot := util.GetHeadSlot(ctx, beaconClient) + + blobs := GetBlobs() + UploadBlobs(ctx, ethClient, blobs) + util.WaitForNextSlots(ctx, beaconClient, 1) + blobSlot := util.FindBlobSlot(ctx, beaconClient, startSlot) + + // Wait a bit to induce substantial initial-sync in the beacon node follower + util.WaitForNextSlots(ctx, beaconClient, 10) + + g.Go(func() error { + return env.GethNode2.Start(ctx) + }) + g.Go(func() error { + return env.BeaconNodeFollower.Start(ctx) + }) + if err := g.Wait(); err != nil { + log.Fatalf("failed to start services: %v", err) + } + + beaconNodeFollowerClient, err := ctrl.GetBeaconNodeFollowerClient(ctx) + if err != nil { + log.Fatalf("failed to get beacon node follower client: %v", err) + } + + syncSlot := util.GetHeadSlot(ctx, beaconClient) + if err := ctrl.WaitForSlotWithClient(ctx, beaconNodeFollowerClient, syncSlot); err != nil { + log.Fatalf("unable to wait for beacon follower sync: %v", err) + } + + log.Printf("checking blob from beacon node") + downloadedData := util.DownloadBlobs(ctx, blobSlot, 1, shared.BeaconMultiAddress) + downloadedBlobs := shared.EncodeBlobs(downloadedData) + util.AssertBlobsEquals(blobs, downloadedBlobs) + + log.Printf("checking blob from beacon node follower") + time.Sleep(time.Second * 2 * time.Duration(env.BeaconChainConfig.SecondsPerSlot)) // wait a bit for sync + downloadedData = util.DownloadBlobs(ctx, blobSlot, 1, shared.BeaconFollowerMultiAddress) + downloadedBlobs = shared.EncodeBlobs(downloadedData) + util.AssertBlobsEquals(blobs, downloadedBlobs) +} + +func UploadBlobs(ctx context.Context, client *ethclient.Client, blobs types.Blobs) { + chainId := big.NewInt(1) + signer := types.NewDankSigner(chainId) + + key, err := crypto.HexToECDSA(shared.PrivateKey) + if err != nil { + log.Fatalf("Failed to load private key: %v", err) + } + + nonce, err := client.PendingNonceAt(ctx, crypto.PubkeyToAddress(key.PublicKey)) + if err != nil { + log.Fatalf("Error getting nonce: %v", err) + } + log.Printf("Nonce: %d", nonce) + + commitments, versionedHashes, aggregatedProof, err := blobs.ComputeCommitmentsAndAggregatedProof() + + to := common.HexToAddress("ffb38a7a99e3e2335be83fc74b7faa19d5531243") + txData := types.SignedBlobTx{ + Message: types.BlobTxMessage{ + ChainID: view.Uint256View(*uint256.NewInt(chainId.Uint64())), + Nonce: view.Uint64View(nonce), + Gas: 210000, + GasFeeCap: view.Uint256View(*uint256.NewInt(5000000000)), + GasTipCap: view.Uint256View(*uint256.NewInt(5000000000)), + MaxFeePerDataGas: view.Uint256View(*uint256.NewInt(3000000000)), // needs to be at least the min fee + Value: view.Uint256View(*uint256.NewInt(12345678)), + To: types.AddressOptionalSSZ{Address: (*types.AddressSSZ)(&to)}, + BlobVersionedHashes: versionedHashes, + }, + } + + wrapData := types.BlobTxWrapData{ + BlobKzgs: commitments, + Blobs: blobs, + KzgAggregatedProof: aggregatedProof, + } + tx := types.NewTx(&txData, types.WithTxWrapData(&wrapData)) + tx, err = types.SignTx(tx, signer, key) + if err != nil { + log.Fatalf("Error signing tx: %v", err) + } + err = client.SendTransaction(ctx, tx) + if err != nil { + log.Fatalf("Error sending tx: %v", err) + } + log.Printf("Transaction submitted. hash=%v", tx.Hash()) + + log.Printf("Waiting for transaction (%v) to be included...", tx.Hash()) + if _, err := shared.WaitForReceipt(ctx, client, tx.Hash()); err != nil { + log.Fatalf("Error waiting for transaction receipt %v: %v", tx.Hash(), err) + } +} diff --git a/tests/pre-4844/main.go b/tests/pre-4844/main.go index 1e05429..b02ea60 100644 --- a/tests/pre-4844/main.go +++ b/tests/pre-4844/main.go @@ -18,6 +18,7 @@ import ( // Asserts that transaction still work before the 4844 fork in execution func main() { ctrl.InitE2ETest() + env := ctrl.GetEnv() chainId := big.NewInt(1) signer := types.NewDankSigner(chainId) @@ -25,12 +26,16 @@ func main() { ctx, cancel := context.WithTimeout(context.Background(), time.Minute*20) defer cancel() + client, err := ctrl.GetExecutionClient(ctx) + if err != nil { + log.Fatalf("unable to get execution client: %v", err) + } + key, err := crypto.HexToECDSA(shared.PrivateKey) if err != nil { log.Fatalf("Failed to load private key: %v", err) } - client := ctrl.Env.EthClient nonce, err := client.PendingNonceAt(ctx, crypto.PubkeyToAddress(key.PublicKey)) if err != nil { log.Fatalf("Error getting nonce: %v", err) @@ -79,7 +84,7 @@ func main() { log.Fatalf("Error getting block: %v", err) } - eip4844Block := ctrl.Env.GethChainConfig.ShardingForkBlock.Uint64() + eip4844Block := env.GethChainConfig.ShardingForkBlock.Uint64() if receipt.BlockNumber.Uint64() > eip4844Block { // TODO: Avoid this issue by configuring the chain config at runtime log.Fatalf("Test condition violation. Transaction must be included before eip4844 fork. Check the geth chain config") diff --git a/tests/util/util.go b/tests/util/util.go new file mode 100644 index 0000000..1f0d7a2 --- /dev/null +++ b/tests/util/util.go @@ -0,0 +1,249 @@ +package util + +import ( + "bytes" + "context" + "errors" + "fmt" + "io" + "log" + "strings" + "time" + + "github.com/Inphi/eip4844-interop/shared" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" + "github.com/libp2p/go-libp2p" + libp2pcore "github.com/libp2p/go-libp2p-core" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/protocol" + ma "github.com/multiformats/go-multiaddr" + "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p" + "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p/encoder" + "github.com/prysmaticlabs/prysm/v3/beacon-chain/sync" + consensustypes "github.com/prysmaticlabs/prysm/v3/consensus-types/primitives" + "github.com/prysmaticlabs/prysm/v3/proto/eth/service" + ethpbv1 "github.com/prysmaticlabs/prysm/v3/proto/eth/v1" + ethpbv2 "github.com/prysmaticlabs/prysm/v3/proto/eth/v2" + ethpb "github.com/prysmaticlabs/prysm/v3/proto/prysm/v1alpha1" +) + +func init() { + encoder.MaxChunkSize = 10 << 20 +} + +func WaitForSlot(ctx context.Context, client service.BeaconChainClient, slot consensustypes.Slot) error { + req := ðpbv1.BlockRequest{BlockId: []byte("head")} + for { + header, err := client.GetBlockHeader(ctx, req) + if err != nil { + return fmt.Errorf("unable to retrieve block header: %v", err) + } + headSlot := header.Data.Header.Message.Slot + if headSlot >= slot { + break + } + time.Sleep(time.Second * 1) + } + return nil +} + +func WaitForNextSlots(ctx context.Context, client service.BeaconChainClient, slots consensustypes.Slot) { + if err := WaitForSlot(ctx, client, GetHeadSlot(ctx, client).AddSlot(slots)); err != nil { + log.Fatalf("error waiting for next slot: %v", err) + } +} + +func GetHeadSlot(ctx context.Context, client service.BeaconChainClient) consensustypes.Slot { + req := ðpbv1.BlockRequest{BlockId: []byte("head")} + header, err := client.GetBlockHeader(ctx, req) + if err != nil { + log.Fatalf("unable to get beacon chain head: %v", err) + } + return header.Data.Header.Message.Slot +} + +// FindBlobSlot returns the first slot containing a blob since startSlot +// Panics if no such slot could be found +func FindBlobSlot(ctx context.Context, client service.BeaconChainClient, startSlot consensustypes.Slot) consensustypes.Slot { + slot := startSlot + endSlot := GetHeadSlot(ctx, client) + for { + if slot == endSlot { + log.Fatalf("Unable to find beacon block containing blobs") + } + + blockID := fmt.Sprintf("%d", uint64(slot)) + req := ðpbv2.BlockRequestV2{BlockId: []byte(blockID)} + block, err := client.GetBlockV2(ctx, req) + if err != nil { + log.Fatalf("beaconchainclient.GetBlock: %v", err) + } + eip4844, ok := block.Data.Message.(*ethpbv2.SignedBeaconBlockContainer_Eip4844Block) + if ok { + if len(eip4844.Eip4844Block.Body.BlobKzgs) != 0 { + return eip4844.Eip4844Block.Slot + } + } + + slot = slot.Add(1) + } +} + +func AssertBlobsEquals(a, b types.Blobs) { + if len(a) != len(b) { + log.Fatalf("data length mismatch (%d != %d)", len(a), len(b)) + } + for i, _ := range a { + for j := 0; j < params.FieldElementsPerBlob; j++ { + if !bytes.Equal(a[i][j][:], b[i][j][:]) { + log.Fatal("blobs data mismatch") + } + } + } +} + +func SendBlobsSidecarsByRangeRequest(ctx context.Context, h host.Host, encoding encoder.NetworkEncoding, pid peer.ID, req *ethpb.BlobsSidecarsByRangeRequest) ([]*ethpb.BlobsSidecar, error) { + topic := fmt.Sprintf("%s%s", p2p.RPCBlobsSidecarsByRangeTopicV1, encoding.ProtocolSuffix()) + + stream, err := h.NewStream(ctx, pid, protocol.ID(topic)) + if err != nil { + return nil, err + } + defer func() { + _ = stream.Close() + }() + + if _, err := encoding.EncodeWithMaxLength(stream, req); err != nil { + _ = stream.Reset() + return nil, err + } + + if err := stream.CloseWrite(); err != nil { + _ = stream.Reset() + return nil, err + } + + var blobsSidecars []*ethpb.BlobsSidecar + for { + blobs, err := readChunkedBlobsSidecar(stream, encoding) + if errors.Is(err, io.EOF) { + break + } + if err != nil { + return nil, err + } + blobsSidecars = append(blobsSidecars, blobs) + } + return blobsSidecars, nil +} + +func readChunkedBlobsSidecar(stream libp2pcore.Stream, encoding encoder.NetworkEncoding) (*ethpb.BlobsSidecar, error) { + code, errMsg, err := sync.ReadStatusCode(stream, encoding) + if err != nil { + return nil, err + } + if code != 0 { + return nil, errors.New(errMsg) + } + sidecar := new(ethpb.BlobsSidecar) + err = encoding.DecodeWithMaxLength(stream, sidecar) + return sidecar, err +} + +func DownloadBlobs(ctx context.Context, startSlot consensustypes.Slot, count uint64, beaconMA string) []byte { + // TODO: Use Beacon gRPC to download blobs rather than p2p RPC + log.Print("downloading blobs...") + + req := ðpb.BlobsSidecarsByRangeRequest{ + StartSlot: startSlot, + Count: count, + } + + h, err := libp2p.New() + if err != nil { + log.Fatalf("failed to create libp2p context: %v", err) + } + defer func() { + _ = h.Close() + }() + + multiaddr, err := getMultiaddr(ctx, h, beaconMA) + if err != nil { + log.Fatalf("getMultiAddr: %v", err) + } + + addrInfo, err := peer.AddrInfoFromP2pAddr(multiaddr) + if err != nil { + log.Fatal(err) + } + + err = h.Connect(ctx, *addrInfo) + if err != nil { + log.Fatalf("libp2p host connect: %v", err) + } + + sidecars, err := SendBlobsSidecarsByRangeRequest(ctx, h, encoder.SszNetworkEncoder{}, addrInfo.ID, req) + if err != nil { + log.Fatalf("failed to send blobs p2p request: %v", err) + } + + anyBlobs := false + blobsBuffer := new(bytes.Buffer) + for _, sidecar := range sidecars { + if sidecar.Blobs == nil || len(sidecar.Blobs) == 0 { + continue + } + anyBlobs = true + for _, blob := range sidecar.Blobs { + data := shared.DecodeBlob(blob.Blob) + _, _ = blobsBuffer.Write(data) + } + + // stop after the first sidecar with blobs: + break + } + + if !anyBlobs { + log.Fatalf("No blobs found in requested slots, sidecar count: %d", len(sidecars)) + } + + return blobsBuffer.Bytes() +} + +func getMultiaddr(ctx context.Context, h host.Host, addr string) (ma.Multiaddr, error) { + multiaddr, err := ma.NewMultiaddr(addr) + if err != nil { + return nil, err + } + _, id := peer.SplitAddr(multiaddr) + if id != "" { + return multiaddr, nil + } + // peer ID wasn't provided, look it up + id, err = retrievePeerID(ctx, h, addr) + if err != nil { + return nil, err + } + return ma.NewMultiaddr(fmt.Sprintf("%s/p2p/%s", addr, string(id))) +} + +// Helper for retrieving the peer ID from a security error... obviously don't use this in production! +// See https://github.com/libp2p/go-libp2p-noise/blob/v0.3.0/handshake.go#L250 +func retrievePeerID(ctx context.Context, h host.Host, addr string) (peer.ID, error) { + incorrectPeerID := "16Uiu2HAmSifdT5QutTsaET8xqjWAMPp4obrQv7LN79f2RMmBe3nY" + addrInfo, err := peer.AddrInfoFromString(fmt.Sprintf("%s/p2p/%s", addr, incorrectPeerID)) + if err != nil { + return "", err + } + err = h.Connect(ctx, *addrInfo) + if err == nil { + return "", errors.New("unexpected successful connection") + } + if strings.Contains(err.Error(), "but remote key matches") { + split := strings.Split(err.Error(), " ") + return peer.ID(split[len(split)-1]), nil + } + return "", err +} From b3c004d23aea47071ca688bbfcf51614536b0601 Mon Sep 17 00:00:00 2001 From: dancoffman Date: Wed, 9 Nov 2022 12:53:33 -0800 Subject: [PATCH 19/45] Update test harness to start either prysm or lodestar --- lodestar/lodestar | 2 +- shared/config.go | 4 +-- tests/blobtx/main.go | 7 ++++- tests/ctrl/bootstrap.go | 58 +++++++++++++++++++++++++--------------- tests/ctrl/services.go | 18 ++++++------- tests/fee-market/main.go | 8 ++++-- tests/pre-4844/main.go | 11 +++++--- 7 files changed, 69 insertions(+), 39 deletions(-) diff --git a/lodestar/lodestar b/lodestar/lodestar index 6a8d536..513b873 160000 --- a/lodestar/lodestar +++ b/lodestar/lodestar @@ -1 +1 @@ -Subproject commit 6a8d53660ebbffda039d0cd443612f449be1f944 +Subproject commit 513b8731eb4735122972e86c2c13dbd21001fe92 diff --git a/shared/config.go b/shared/config.go index 650df06..1365494 100644 --- a/shared/config.go +++ b/shared/config.go @@ -26,8 +26,8 @@ func GethChainConfigFilepath() string { return fmt.Sprintf("%s/geth/geth-genesis.json", GetBaseDir()) } -func BeaconChainConfigFilepath() string { - return fmt.Sprintf("%s/prysm/chain-config.yml", GetBaseDir()) +func BeaconChainConfigFilepath(clientName string) string { + return fmt.Sprintf("%s/%s/chain-config.yml", GetBaseDir(), clientName) } func UpdateChainConfig(config *params.ChainConfig) error { diff --git a/tests/blobtx/main.go b/tests/blobtx/main.go index e6b8a1c..80feeb5 100644 --- a/tests/blobtx/main.go +++ b/tests/blobtx/main.go @@ -4,6 +4,7 @@ import ( "context" "log" "math/big" + "os" "time" "github.com/Inphi/eip4844-interop/shared" @@ -27,7 +28,11 @@ func GetBlobs() types.Blobs { // 3. Asserts that downloaded blobs match the upload // 4. Asserts execution and beacon block attributes func main() { - ctrl.InitE2ETest() + clientName := "prysm" + if len(os.Args) > 1 { + clientName = os.Args[1] + } + ctrl.InitE2ETest(clientName) ctrl.WaitForShardingFork() ctrl.WaitForEip4844ForkEpoch() env := ctrl.GetEnv() diff --git a/tests/ctrl/bootstrap.go b/tests/ctrl/bootstrap.go index 2d3bd49..3346703 100644 --- a/tests/ctrl/bootstrap.go +++ b/tests/ctrl/bootstrap.go @@ -18,28 +18,31 @@ import ( "gopkg.in/yaml.v2" ) -var env *TestEnvironment +var consensusClientEnvironments = map[string]*TestEnvironment{ + "prysm": newPrysmTestEnvironment(), + "lodestar": newLodestarTestEnvironment(), + // ... lighthouse +} + +var client string + +func GetEnv() *TestEnvironment { + return consensusClientEnvironments[client] +} -func InitE2ETest() { +func InitE2ETest(clientName string) { ctx := context.Background() if err := StopDevnet(); err != nil { log.Fatalf("unable to stop devnet: %v", err) } - env := GetEnv() - env.StartAll(ctx) -} - -func GetEnv() *TestEnvironment { - if env == nil { - env = newTestEnvironment() - } - return env + client = clientName + GetEnv().StartAll(ctx) } func WaitForShardingFork() { ctx := context.Background() - config := env.GethChainConfig + config := GetEnv().GethChainConfig eip4844ForkBlock := config.ShardingForkBlock.Uint64() stallTimeout := 1 * time.Minute @@ -84,8 +87,8 @@ func ReadGethChainConfig() *params.ChainConfig { return genesis.Config } -func ReadBeaconChainConfig() *BeaconChainConfig { - path := shared.BeaconChainConfigFilepath() +func ReadBeaconChainConfig(clientName string) *BeaconChainConfig { + path := shared.BeaconChainConfigFilepath(clientName) data, err := ioutil.ReadFile(path) if err != nil { log.Fatalf("unable to read beacon chain config file at %v: %v", path, err) @@ -116,7 +119,7 @@ func WaitForSlotWithClient(ctx context.Context, client beaconservice.BeaconChain if headSlot >= slot { break } - time.Sleep(time.Second * time.Duration(env.BeaconChainConfig.SecondsPerSlot)) + time.Sleep(time.Second * time.Duration(GetEnv().BeaconChainConfig.SecondsPerSlot)) } return nil } @@ -126,7 +129,7 @@ func WaitForEip4844ForkEpoch() { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute) defer cancel() - config := env.BeaconChainConfig + config := GetEnv().BeaconChainConfig eip4844Slot := config.Eip4844ForkEpoch * config.SlotsPerEpoch if err := WaitForSlot(ctx, types.Slot(eip4844Slot)); err != nil { log.Fatal(err) @@ -152,14 +155,27 @@ type TestEnvironment struct { GethNode2 Service } -func newTestEnvironment() *TestEnvironment { +func newPrysmTestEnvironment() *TestEnvironment { + clientName := "prysm" + return &TestEnvironment{ + BeaconChainConfig: ReadBeaconChainConfig(clientName), + BeaconNode: NewBeaconNode(clientName), + BeaconNodeFollower: NewBeaconNodeFollower(clientName), + ValidatorNode: NewValidatorNode(clientName), + GethChainConfig: ReadGethChainConfig(), + GethNode: NewGethNode(), + GethNode2: NewGethNode2(), + } +} + +func newLodestarTestEnvironment() *TestEnvironment { + clientName := "lodestar" return &TestEnvironment{ + BeaconChainConfig: ReadBeaconChainConfig(clientName), + BeaconNode: NewBeaconNode(clientName), + BeaconNodeFollower: NewBeaconNodeFollower(clientName), GethChainConfig: ReadGethChainConfig(), - BeaconChainConfig: ReadBeaconChainConfig(), - BeaconNode: NewBeaconNode(), GethNode: NewGethNode(), - ValidatorNode: NewValidatorNode(), - BeaconNodeFollower: NewBeaconNodeFollower(), GethNode2: NewGethNode2(), } } diff --git a/tests/ctrl/services.go b/tests/ctrl/services.go index e193e11..6eb0a8d 100644 --- a/tests/ctrl/services.go +++ b/tests/ctrl/services.go @@ -18,13 +18,18 @@ type Service interface { Started() <-chan struct{} } -func NewBeaconNode() Service { +func NewBeaconNode(clientName string) Service { url := fmt.Sprintf("http://%s/eth/v1/beacon/genesis", shared.BeaconGatewayGRPC) - return newDockerService("beacon-node", url) + return newDockerService(fmt.Sprintf("%s-beacon-node", clientName), url) } -func NewValidatorNode() Service { - return newDockerService("validator-node", shared.ValidatorRPC) +func NewValidatorNode(clientName string) Service { + return newDockerService(fmt.Sprintf("%s-validator-node", clientName), shared.ValidatorRPC) +} + +func NewBeaconNodeFollower(clientName string) Service { + url := fmt.Sprintf("http://%s/eth/v1/beacon/genesis", shared.BeaconGatewayFollowerGRPC) + return newDockerService(fmt.Sprintf("%s-beacon-node-follower", clientName), url) } func GetBeaconNodeClient(ctx context.Context) (beaconservice.BeaconChainClient, error) { @@ -36,11 +41,6 @@ func GetBeaconNodeClient(ctx context.Context) (beaconservice.BeaconChainClient, return beaconservice.NewBeaconChainClient(conn), nil } -func NewBeaconNodeFollower() Service { - url := fmt.Sprintf("http://%s/eth/v1/beacon/genesis", shared.BeaconGatewayFollowerGRPC) - return newDockerService("beacon-node-follower", url) -} - func GetBeaconNodeFollowerClient(ctx context.Context) (beaconservice.BeaconChainClient, error) { // TODO: cache conns for reuse conn, err := grpc.DialContext(ctx, shared.BeaconFollowerRPC, grpc.WithInsecure()) diff --git a/tests/fee-market/main.go b/tests/fee-market/main.go index f2ef894..2f521cc 100644 --- a/tests/fee-market/main.go +++ b/tests/fee-market/main.go @@ -6,6 +6,7 @@ import ( "fmt" "log" "math/big" + "os" "sort" "sync" "time" @@ -35,11 +36,14 @@ func GetBlob() types.Blobs { // 3. Asserts that downloaded blobs match the upload // 4. Asserts execution and beacon block attributes func main() { - ctrl.InitE2ETest() + clientName := "prysm" + if len(os.Args) > 1 { + clientName = os.Args[1] + } + ctrl.InitE2ETest(clientName) ctrl.WaitForShardingFork() ctrl.WaitForEip4844ForkEpoch() env := ctrl.GetEnv() - ctx, cancel := context.WithTimeout(context.Background(), time.Minute*20) defer cancel() diff --git a/tests/pre-4844/main.go b/tests/pre-4844/main.go index b02ea60..d041649 100644 --- a/tests/pre-4844/main.go +++ b/tests/pre-4844/main.go @@ -4,6 +4,7 @@ import ( "context" "log" "math/big" + "os" "time" "github.com/Inphi/eip4844-interop/shared" @@ -17,8 +18,12 @@ import ( // Asserts that transaction still work before the 4844 fork in execution func main() { - ctrl.InitE2ETest() - env := ctrl.GetEnv() + clientName := "prysm" + if len(os.Args) > 1 { + clientName = os.Args[1] + } + + ctrl.InitE2ETest(clientName) chainId := big.NewInt(1) signer := types.NewDankSigner(chainId) @@ -84,7 +89,7 @@ func main() { log.Fatalf("Error getting block: %v", err) } - eip4844Block := env.GethChainConfig.ShardingForkBlock.Uint64() + eip4844Block := ctrl.GetEnv().GethChainConfig.ShardingForkBlock.Uint64() if receipt.BlockNumber.Uint64() > eip4844Block { // TODO: Avoid this issue by configuring the chain config at runtime log.Fatalf("Test condition violation. Transaction must be included before eip4844 fork. Check the geth chain config") From 05d73557f4bb4f997b2afc66299c6fe6666a179a Mon Sep 17 00:00:00 2001 From: dancoffman Date: Wed, 9 Nov 2022 13:23:20 -0800 Subject: [PATCH 20/45] Fix the Prysm communication --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 544c47a..fbeb696 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -81,7 +81,7 @@ services: EXECUTION_NODE_URL: http://execution-node-2:8545 TRACING_ENDPOINT: http://jaeger-tracing:14268/api/traces PROCESS_NAME: beacon-node-follower - BEACON_NODE_RPC: http://beacon-node:3500 + BEACON_NODE_RPC: http://prysm-beacon-node:3500 VERBOSITY: debug P2P_PRIV_KEY: /etc/prysm-priv-key entrypoint: run_beacon_node_peer.sh @@ -114,7 +114,7 @@ services: command: > validator --accept-terms-of-use - --beacon-rpc-provider beacon-node:4000 + --beacon-rpc-provider prysm-beacon-node:4000 --rpc --grpc-gateway-host 0.0.0.0 --grpc-gateway-port 7500 From 7da4527009a6d5959ffc0aba3f5d5047428bced4 Mon Sep 17 00:00:00 2001 From: dancoffman Date: Wed, 9 Nov 2022 14:20:14 -0800 Subject: [PATCH 21/45] Fix the Lodestar wiring --- Makefile | 2 ++ docker-compose.yml | 2 +- lodestar/run_beacon_node.sh | 3 +-- lodestar/run_beacon_node_peer.sh | 6 +++++- tests/ctrl/bootstrap.go | 5 ++++- 5 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 0c2c699..13045e2 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,9 @@ devnet-up: lodestar-up: docker compose up -d\ execution-node\ + execution-node-2\ lodestar-beacon-node\ + lodestar-beacon-follower\ devnet-down: docker compose down -v diff --git a/docker-compose.yml b/docker-compose.yml index fbeb696..67fea67 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -165,7 +165,7 @@ services: dockerfile: Dockerfile.lodestar environment: EXECUTION_NODE_URL: http://execution-node-2:8545 - BEACON_NODE_RPC: http://lodestar-beacon-node:4000 + BEACON_NODE_RPC: http://lodestar-beacon-node:3500 PROCESS_NAME: lodestar-beacon-node-follower VERBOSITY: debug entrypoint: run_beacon_node_peer.sh diff --git a/lodestar/run_beacon_node.sh b/lodestar/run_beacon_node.sh index 7e0a79f..23e375f 100755 --- a/lodestar/run_beacon_node.sh +++ b/lodestar/run_beacon_node.sh @@ -27,7 +27,6 @@ echo 'Execution client running. Starting Lodestar beacon node.' --genesisValidators 1 \ --startValidators 0..1 \ --enr.ip 127.0.0.1 \ - --server http://localhost:4000 \ --reset \ --eth1 \ --eth1.providerUrls="$EXECUTION_NODE_URL" \ @@ -35,7 +34,7 @@ echo 'Execution client running. Starting Lodestar beacon node.' --dataDir /chaindata \ --rest \ --rest.address 0.0.0.0 \ - --rest.port 4000 \ + --rest.port 3500 \ --rest.namespace "*" \ --metrics \ --logFile /logs/beacon.log \ diff --git a/lodestar/run_beacon_node_peer.sh b/lodestar/run_beacon_node_peer.sh index 6595c2e..94c7fd4 100755 --- a/lodestar/run_beacon_node_peer.sh +++ b/lodestar/run_beacon_node_peer.sh @@ -38,4 +38,8 @@ fi --bootnodes $ENR \ --eth1 \ --eth1.providerUrls="$EXECUTION_NODE_URL" \ - --reset + --reset \ + --rest \ + --rest.address 0.0.0.0 \ + --rest.port 3500 \ + --rest.namespace "*" \ diff --git a/tests/ctrl/bootstrap.go b/tests/ctrl/bootstrap.go index 3346703..54c6868 100644 --- a/tests/ctrl/bootstrap.go +++ b/tests/ctrl/bootstrap.go @@ -189,7 +189,10 @@ func (env *TestEnvironment) StartAll(ctx context.Context) error { return env.GethNode.Start(ctx) }) g.Go(func() error { - return env.ValidatorNode.Start(ctx) + if env.ValidatorNode != nil { + return env.ValidatorNode.Start(ctx) + } + return nil }) g.Go(func() error { return env.BeaconNodeFollower.Start(ctx) From 109b469cce0854e52cfda6df9cc68a8f0910d524 Mon Sep 17 00:00:00 2001 From: dancoffman Date: Wed, 9 Nov 2022 14:40:28 -0800 Subject: [PATCH 22/45] Fix up validator <-> beacon node communication --- lodestar/chain-config.yml | 2 +- lodestar/run_beacon_node.sh | 1 + lodestar/run_beacon_node_peer.sh | 1 + tests/ctrl/bootstrap.go | 10 ++++++++-- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lodestar/chain-config.yml b/lodestar/chain-config.yml index 72a488f..e4e1d01 100644 --- a/lodestar/chain-config.yml +++ b/lodestar/chain-config.yml @@ -7,4 +7,4 @@ BELLATRIX_FORK_EPOCH: 2 CAPELLA_FORK_EPOCH: 3 EIP4844_FORK_EPOCH: 4 -SECONDS_PER_SLOT: 4 +SECONDS_PER_SLOT: 6 diff --git a/lodestar/run_beacon_node.sh b/lodestar/run_beacon_node.sh index 23e375f..457b6e7 100755 --- a/lodestar/run_beacon_node.sh +++ b/lodestar/run_beacon_node.sh @@ -27,6 +27,7 @@ echo 'Execution client running. Starting Lodestar beacon node.' --genesisValidators 1 \ --startValidators 0..1 \ --enr.ip 127.0.0.1 \ + --server http://localhost:3500 \ --reset \ --eth1 \ --eth1.providerUrls="$EXECUTION_NODE_URL" \ diff --git a/lodestar/run_beacon_node_peer.sh b/lodestar/run_beacon_node_peer.sh index 94c7fd4..ff0cb59 100755 --- a/lodestar/run_beacon_node_peer.sh +++ b/lodestar/run_beacon_node_peer.sh @@ -39,6 +39,7 @@ fi --eth1 \ --eth1.providerUrls="$EXECUTION_NODE_URL" \ --reset \ + --server http://localhost:3500 \ --rest \ --rest.address 0.0.0.0 \ --rest.port 3500 \ diff --git a/tests/ctrl/bootstrap.go b/tests/ctrl/bootstrap.go index 54c6868..4b45675 100644 --- a/tests/ctrl/bootstrap.go +++ b/tests/ctrl/bootstrap.go @@ -195,10 +195,16 @@ func (env *TestEnvironment) StartAll(ctx context.Context) error { return nil }) g.Go(func() error { - return env.BeaconNodeFollower.Start(ctx) + if env.BeaconNodeFollower != nil { + return env.BeaconNodeFollower.Start(ctx) + } + return nil }) g.Go(func() error { - return env.GethNode2.Start(ctx) + if env.GethNode2 != nil { + return env.GethNode2.Start(ctx) + } + return nil }) return g.Wait() } From d39f2e9bcd88fe1675cdb5c60916b0ac6709fba9 Mon Sep 17 00:00:00 2001 From: dancoffman Date: Thu, 10 Nov 2022 12:19:17 -0800 Subject: [PATCH 23/45] Start switching tests to real beacon API --- go.mod | 5 ++- go.sum | 7 ++++ shared/config.go | 8 ++--- tests/ctrl/bootstrap.go | 20 +++++------ tests/ctrl/services.go | 27 +++++++-------- tests/fee-market/main.go | 29 ++++++++-------- tests/util/util.go | 73 ++++++++++++++++++++++++---------------- 7 files changed, 94 insertions(+), 75 deletions(-) diff --git a/go.mod b/go.mod index 424e9c3..f77478a 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,6 @@ require ( github.com/prysmaticlabs/prysm/v3 v3.1.1 github.com/wealdtech/go-bytesutil v1.1.1 golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f - google.golang.org/grpc v1.40.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -60,6 +59,7 @@ require ( github.com/google/gofuzz v1.2.0 // indirect github.com/google/gopacket v1.1.19 // indirect github.com/google/uuid v1.3.0 // indirect + github.com/gorilla/mux v1.8.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.0.1 // indirect github.com/hashicorp/go-bexpr v0.1.11 // indirect @@ -146,6 +146,7 @@ require ( github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 // indirect github.com/prysmaticlabs/gohashtree v0.0.2-alpha // indirect github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c // indirect + github.com/r3labs/sse v0.0.0-20210224172625-26fe804710bc // indirect github.com/raulk/clock v1.1.0 // indirect github.com/raulk/go-watchdog v1.2.0 // indirect github.com/rivo/uniseg v0.2.0 // indirect @@ -188,7 +189,9 @@ require ( google.golang.org/api v0.34.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20210426193834-eac7f76ac494 // indirect + google.golang.org/grpc v1.40.0 // indirect google.golang.org/protobuf v1.28.0 // indirect + gopkg.in/cenkalti/backoff.v1 v1.1.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect diff --git a/go.sum b/go.sum index 94f4cde..f5a02bd 100644 --- a/go.sum +++ b/go.sum @@ -384,6 +384,8 @@ github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1: github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= @@ -925,6 +927,8 @@ github.com/prysmaticlabs/grpc-gateway/v2 v2.3.1-0.20220721162526-0d1c40b5f064/go github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c h1:9PHRCuO/VN0s9k+RmLykho7AjDxblNYI5bYKed16NPU= github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c/go.mod h1:ZRws458tYHS/Zs936OQ6oCrL+Ict5O4Xpwve1UQ6C9M= github.com/prysmaticlabs/protoc-gen-go-cast v0.0.0-20211014160335-757fae4f38c6 h1:+jhXLjEYVW4qU2z5SOxlxN+Hv/A9FDf0HpfDurfMEz0= +github.com/r3labs/sse v0.0.0-20210224172625-26fe804710bc h1:zAsgcP8MhzAbhMnB1QQ2O7ZhWYVGYSR2iVcjzQuPV+o= +github.com/r3labs/sse v0.0.0-20210224172625-26fe804710bc/go.mod h1:S8xSOnV3CgpNrWd0GQ/OoQfMtlg2uPRSuTzcSGrzwK8= github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0= github.com/raulk/go-watchdog v1.2.0 h1:konN75pw2BMmZ+AfuAm5rtFsWcJpKF3m02rKituuXNo= @@ -1218,6 +1222,7 @@ golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191116160921-f9c825593386/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1577,6 +1582,8 @@ google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscL google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/bsm/ratelimit.v1 v1.0.0-20160220154919-db14e161995a/go.mod h1:KF9sEfUPAXdG8Oev9e99iLGnl2uJMjc5B+4y3O7x610= +gopkg.in/cenkalti/backoff.v1 v1.1.0 h1:Arh75ttbsvlpVA7WtVpH4u9h6Zl46xuptxqLxPiSo4Y= +gopkg.in/cenkalti/backoff.v1 v1.1.0/go.mod h1:J6Vskwqd+OMVJl8C33mmtxTBs2gyzfv7UDAkHu8BrjI= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/shared/config.go b/shared/config.go index 1365494..13b4c19 100644 --- a/shared/config.go +++ b/shared/config.go @@ -42,11 +42,9 @@ func UpdateChainConfig(config *params.ChainConfig) error { var ( GethRPC = "http://localhost:8545" PrivateKey = "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8" - BeaconRPC = "localhost:4000" - BeaconGatewayGRPC = "localhost:3500" + BeaconAPI = "localhost:3500" BeaconMultiAddress = "/ip4/0.0.0.0/tcp/13000" - BeaconFollowerRPC = "localhost:4001" - BeaconGatewayFollowerGRPC = "localhost:3501" + BeaconFollowerAPI = "localhost:3501" BeaconFollowerMultiAddress = "/ip4/0.0.0.0/tcp/13001" - ValidatorRPC = "http://localhost:7500" + ValidatorAPI = "http://localhost:7500" ) diff --git a/tests/ctrl/bootstrap.go b/tests/ctrl/bootstrap.go index 4b45675..d3b3c9f 100644 --- a/tests/ctrl/bootstrap.go +++ b/tests/ctrl/bootstrap.go @@ -3,17 +3,16 @@ package ctrl import ( "context" "encoding/json" - "fmt" "io/ioutil" "log" "time" "github.com/Inphi/eip4844-interop/shared" + "github.com/Inphi/eip4844-interop/tests/util" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/params" + "github.com/prysmaticlabs/prysm/v3/api/client/beacon" types "github.com/prysmaticlabs/prysm/v3/consensus-types/primitives" - beaconservice "github.com/prysmaticlabs/prysm/v3/proto/eth/service" - ethpbv1 "github.com/prysmaticlabs/prysm/v3/proto/eth/v1" "golang.org/x/sync/errgroup" "gopkg.in/yaml.v2" ) @@ -52,6 +51,8 @@ func WaitForShardingFork() { log.Fatalf("unable to retrive beacon node client: %v", err) } + beaconClient, _ := GetBeaconNodeClient(ctx) + log.Printf("waiting for sharding fork block...") var lastBn uint64 var lastUpdate time.Time @@ -60,6 +61,10 @@ func WaitForShardingFork() { if err != nil { log.Fatalf("ethclient.BlockNumber: %v", err) } + + slot := util.GetHeadSlot(ctx, beaconClient) + log.Print("Got beacon head slot: ", slot) + if bn >= eip4844ForkBlock { break } @@ -108,14 +113,9 @@ func WaitForSlot(ctx context.Context, slot types.Slot) error { return WaitForSlotWithClient(ctx, client, slot) } -func WaitForSlotWithClient(ctx context.Context, client beaconservice.BeaconChainClient, slot types.Slot) error { - req := ðpbv1.BlockRequest{BlockId: []byte("head")} +func WaitForSlotWithClient(ctx context.Context, client *beacon.Client, slot types.Slot) error { for { - header, err := client.GetBlockHeader(ctx, req) - if err != nil { - return fmt.Errorf("unable to retrieve block header: %v", err) - } - headSlot := header.Data.Header.Message.Slot + headSlot := util.GetHeadSlot(ctx, client) if headSlot >= slot { break } diff --git a/tests/ctrl/services.go b/tests/ctrl/services.go index 6eb0a8d..527eb25 100644 --- a/tests/ctrl/services.go +++ b/tests/ctrl/services.go @@ -8,8 +8,7 @@ import ( "github.com/Inphi/eip4844-interop/shared" "github.com/ethereum/go-ethereum/ethclient" - beaconservice "github.com/prysmaticlabs/prysm/v3/proto/eth/service" - "google.golang.org/grpc" + "github.com/prysmaticlabs/prysm/v3/api/client/beacon" ) type Service interface { @@ -19,35 +18,33 @@ type Service interface { } func NewBeaconNode(clientName string) Service { - url := fmt.Sprintf("http://%s/eth/v1/beacon/genesis", shared.BeaconGatewayGRPC) + url := fmt.Sprintf("http://%s/eth/v1/beacon/genesis", shared.BeaconAPI) return newDockerService(fmt.Sprintf("%s-beacon-node", clientName), url) } func NewValidatorNode(clientName string) Service { - return newDockerService(fmt.Sprintf("%s-validator-node", clientName), shared.ValidatorRPC) + return newDockerService(fmt.Sprintf("%s-validator-node", clientName), shared.ValidatorAPI) } func NewBeaconNodeFollower(clientName string) Service { - url := fmt.Sprintf("http://%s/eth/v1/beacon/genesis", shared.BeaconGatewayFollowerGRPC) + url := fmt.Sprintf("http://%s/eth/v1/beacon/genesis", shared.BeaconFollowerAPI) return newDockerService(fmt.Sprintf("%s-beacon-node-follower", clientName), url) } -func GetBeaconNodeClient(ctx context.Context) (beaconservice.BeaconChainClient, error) { - // TODO: cache conns for reuse - conn, err := grpc.DialContext(ctx, shared.BeaconRPC, grpc.WithInsecure()) +func GetBeaconNodeClient(ctx context.Context) (*beacon.Client, error) { + client, err := beacon.NewClient(shared.BeaconAPI) if err != nil { - return nil, fmt.Errorf("%w: failed to dial beacon grpc", err) + return nil, fmt.Errorf("%w: failed to create beacon API client", err) } - return beaconservice.NewBeaconChainClient(conn), nil + return client, nil } -func GetBeaconNodeFollowerClient(ctx context.Context) (beaconservice.BeaconChainClient, error) { - // TODO: cache conns for reuse - conn, err := grpc.DialContext(ctx, shared.BeaconFollowerRPC, grpc.WithInsecure()) +func GetBeaconNodeFollowerClient(ctx context.Context) (*beacon.Client, error) { + client, err := beacon.NewClient(shared.BeaconFollowerAPI) if err != nil { - return nil, fmt.Errorf("%w: failed to dial beacon follower grpc", err) + return nil, fmt.Errorf("%w: failed to create beacon follower API client", err) } - return beaconservice.NewBeaconChainClient(conn), nil + return client, nil } func NewGethNode() Service { diff --git a/tests/fee-market/main.go b/tests/fee-market/main.go index 2f521cc..c043ed5 100644 --- a/tests/fee-market/main.go +++ b/tests/fee-market/main.go @@ -3,7 +3,6 @@ package main import ( "bytes" "context" - "fmt" "log" "math/big" "os" @@ -21,8 +20,8 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/holiman/uint256" "github.com/protolambda/ztyp/view" + "github.com/prysmaticlabs/prysm/v3/api/client/beacon" consensustypes "github.com/prysmaticlabs/prysm/v3/consensus-types/primitives" - "github.com/prysmaticlabs/prysm/v3/proto/eth/service" ethpbv2 "github.com/prysmaticlabs/prysm/v3/proto/eth/v2" ) @@ -226,7 +225,7 @@ func UploadBlobsAndCheckBlockHeader(ctx context.Context, client *ethclient.Clien } } -func FindBlocksWithBlobs(ctx context.Context, client service.BeaconChainClient, startSlot consensustypes.Slot) []*ethpbv2.BeaconBlockEip4844 { +func FindBlocksWithBlobs(ctx context.Context, client *beacon.Client, startSlot consensustypes.Slot) []*ethpbv2.BeaconBlockEip4844 { slot := startSlot endSlot := util.GetHeadSlot(ctx, client) @@ -236,18 +235,18 @@ func FindBlocksWithBlobs(ctx context.Context, client service.BeaconChainClient, break } - blockID := fmt.Sprintf("%d", uint64(slot)) - req := ðpbv2.BlockRequestV2{BlockId: []byte(blockID)} - block, err := client.GetBlockV2(ctx, req) - if err != nil { - log.Fatalf("beaconchainclient.GetBlock: %v", err) - } - eip4844, ok := block.Data.Message.(*ethpbv2.SignedBeaconBlockContainer_Eip4844Block) - if ok { - if len(eip4844.Eip4844Block.Body.BlobKzgs) != 0 { - blocks = append(blocks, eip4844.Eip4844Block) - } - } + // blockID := fmt.Sprintf("%d", uint64(slot)) + // req := ðpbv2.BlockRequestV2{BlockId: []byte(blockID)} + // block, err := client.GetBlock(ctx, req) + // if err != nil { + // log.Fatalf("beaconchainclient.GetBlock: %v", err) + // } + // eip4844, ok := block.Data.Message.(*ethpbv2.SignedBeaconBlockContainer_Eip4844Block) + // if ok { + // if len(eip4844.Eip4844Block.Body.BlobKzgs) != 0 { + // blocks = append(blocks, eip4844.Eip4844Block) + // } + // } slot = slot.Add(1) } diff --git a/tests/util/util.go b/tests/util/util.go index 1f0d7a2..96aafb7 100644 --- a/tests/util/util.go +++ b/tests/util/util.go @@ -3,10 +3,12 @@ package util import ( "bytes" "context" + "encoding/json" "errors" "fmt" "io" "log" + "strconv" "strings" "time" @@ -19,13 +21,11 @@ import ( "github.com/libp2p/go-libp2p-core/peer" "github.com/libp2p/go-libp2p-core/protocol" ma "github.com/multiformats/go-multiaddr" + "github.com/prysmaticlabs/prysm/v3/api/client/beacon" "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p" "github.com/prysmaticlabs/prysm/v3/beacon-chain/p2p/encoder" "github.com/prysmaticlabs/prysm/v3/beacon-chain/sync" consensustypes "github.com/prysmaticlabs/prysm/v3/consensus-types/primitives" - "github.com/prysmaticlabs/prysm/v3/proto/eth/service" - ethpbv1 "github.com/prysmaticlabs/prysm/v3/proto/eth/v1" - ethpbv2 "github.com/prysmaticlabs/prysm/v3/proto/eth/v2" ethpb "github.com/prysmaticlabs/prysm/v3/proto/prysm/v1alpha1" ) @@ -33,14 +33,9 @@ func init() { encoder.MaxChunkSize = 10 << 20 } -func WaitForSlot(ctx context.Context, client service.BeaconChainClient, slot consensustypes.Slot) error { - req := ðpbv1.BlockRequest{BlockId: []byte("head")} +func WaitForSlot(ctx context.Context, client *beacon.Client, slot consensustypes.Slot) error { for { - header, err := client.GetBlockHeader(ctx, req) - if err != nil { - return fmt.Errorf("unable to retrieve block header: %v", err) - } - headSlot := header.Data.Header.Message.Slot + headSlot := GetHeadSlot(ctx, client) if headSlot >= slot { break } @@ -49,24 +44,44 @@ func WaitForSlot(ctx context.Context, client service.BeaconChainClient, slot con return nil } -func WaitForNextSlots(ctx context.Context, client service.BeaconChainClient, slots consensustypes.Slot) { +func WaitForNextSlots(ctx context.Context, client *beacon.Client, slots consensustypes.Slot) { if err := WaitForSlot(ctx, client, GetHeadSlot(ctx, client).AddSlot(slots)); err != nil { log.Fatalf("error waiting for next slot: %v", err) } } -func GetHeadSlot(ctx context.Context, client service.BeaconChainClient) consensustypes.Slot { - req := ðpbv1.BlockRequest{BlockId: []byte("head")} - header, err := client.GetBlockHeader(ctx, req) +type Message struct { + Slot string +} + +type Data struct { + Message Message +} + +type Block struct { + Data Data +} + +func GetHeadSlot(ctx context.Context, client *beacon.Client) consensustypes.Slot { + blockJSON, err := client.GetBlockJSON(ctx, "head") + if err != nil { + log.Fatalf("unable to get beacon chain head: %v", err) + } + var block Block + err = json.Unmarshal(blockJSON, &block) + if err != nil { + log.Fatalf("unable to get beacon chain head: %v", err) + } + slot, err := strconv.ParseUint(block.Data.Message.Slot, 10, 64) if err != nil { log.Fatalf("unable to get beacon chain head: %v", err) } - return header.Data.Header.Message.Slot + return (consensustypes.Slot)(slot) } // FindBlobSlot returns the first slot containing a blob since startSlot // Panics if no such slot could be found -func FindBlobSlot(ctx context.Context, client service.BeaconChainClient, startSlot consensustypes.Slot) consensustypes.Slot { +func FindBlobSlot(ctx context.Context, client *beacon.Client, startSlot consensustypes.Slot) consensustypes.Slot { slot := startSlot endSlot := GetHeadSlot(ctx, client) for { @@ -74,18 +89,18 @@ func FindBlobSlot(ctx context.Context, client service.BeaconChainClient, startSl log.Fatalf("Unable to find beacon block containing blobs") } - blockID := fmt.Sprintf("%d", uint64(slot)) - req := ðpbv2.BlockRequestV2{BlockId: []byte(blockID)} - block, err := client.GetBlockV2(ctx, req) - if err != nil { - log.Fatalf("beaconchainclient.GetBlock: %v", err) - } - eip4844, ok := block.Data.Message.(*ethpbv2.SignedBeaconBlockContainer_Eip4844Block) - if ok { - if len(eip4844.Eip4844Block.Body.BlobKzgs) != 0 { - return eip4844.Eip4844Block.Slot - } - } + // blockID := fmt.Sprintf("%d", uint64(slot)) + // req := ðpbv2.BlockRequestV2{BlockId: []byte(blockID)} + // block, err := client.GetBlockV2(ctx, req) + // if err != nil { + // log.Fatalf("beaconchainclient.GetBlock: %v", err) + // } + // eip4844, ok := block.Data.Message.(*ethpbv2.SignedBeaconBlockContainer_Eip4844Block) + // if ok { + // if len(eip4844.Eip4844Block.Body.BlobKzgs) != 0 { + // return eip4844.Eip4844Block.Slot + // } + // } slot = slot.Add(1) } @@ -152,8 +167,8 @@ func readChunkedBlobsSidecar(stream libp2pcore.Stream, encoding encoder.NetworkE return sidecar, err } +// Using p2p RPC func DownloadBlobs(ctx context.Context, startSlot consensustypes.Slot, count uint64, beaconMA string) []byte { - // TODO: Use Beacon gRPC to download blobs rather than p2p RPC log.Print("downloading blobs...") req := ðpb.BlobsSidecarsByRangeRequest{ From ff52aced1a1cd1d19fd38e5cc59150acacfe387a Mon Sep 17 00:00:00 2001 From: dancoffman Date: Thu, 10 Nov 2022 13:04:14 -0800 Subject: [PATCH 24/45] fee-market tests pass against Prysm without gRPC --- geth/geth-genesis.json | 2 +- tests/ctrl/bootstrap.go | 5 ----- tests/fee-market/main.go | 37 +++++++++++++++++++----------------- tests/util/util.go | 41 +++++++++++++++++++++++----------------- 4 files changed, 45 insertions(+), 40 deletions(-) diff --git a/geth/geth-genesis.json b/geth/geth-genesis.json index 6a4adf1..121a4fd 100644 --- a/geth/geth-genesis.json +++ b/geth/geth-genesis.json @@ -13,7 +13,7 @@ "muirGlacierBlock": 0, "berlinBlock": 0, "londonBlock": 0, - "shardingForkBlock": 8, + "shardingForkBlock": 5, "clique": { "period": 5, "epoch": 30000 diff --git a/tests/ctrl/bootstrap.go b/tests/ctrl/bootstrap.go index d3b3c9f..1258a52 100644 --- a/tests/ctrl/bootstrap.go +++ b/tests/ctrl/bootstrap.go @@ -51,8 +51,6 @@ func WaitForShardingFork() { log.Fatalf("unable to retrive beacon node client: %v", err) } - beaconClient, _ := GetBeaconNodeClient(ctx) - log.Printf("waiting for sharding fork block...") var lastBn uint64 var lastUpdate time.Time @@ -62,9 +60,6 @@ func WaitForShardingFork() { log.Fatalf("ethclient.BlockNumber: %v", err) } - slot := util.GetHeadSlot(ctx, beaconClient) - log.Print("Got beacon head slot: ", slot) - if bn >= eip4844ForkBlock { break } diff --git a/tests/fee-market/main.go b/tests/fee-market/main.go index c043ed5..cf140ce 100644 --- a/tests/fee-market/main.go +++ b/tests/fee-market/main.go @@ -7,6 +7,7 @@ import ( "math/big" "os" "sort" + "strconv" "sync" "time" @@ -22,7 +23,6 @@ import ( "github.com/protolambda/ztyp/view" "github.com/prysmaticlabs/prysm/v3/api/client/beacon" consensustypes "github.com/prysmaticlabs/prysm/v3/consensus-types/primitives" - ethpbv2 "github.com/prysmaticlabs/prysm/v3/proto/eth/v2" ) func GetBlob() types.Blobs { @@ -69,12 +69,14 @@ func main() { util.WaitForNextSlots(ctx, beaconClient, 1) util.WaitForNextSlots(ctx, beaconClient, 1) + log.Print("blobs uploaded. finding blocks with blobs") + blocks := FindBlocksWithBlobs(ctx, beaconClient, startSlot) log.Printf("checking blob from beacon node") var downloadedData []byte for _, b := range blocks { - data := util.DownloadBlobs(ctx, b.Slot, 1, shared.BeaconMultiAddress) + data := util.DownloadBlobs(ctx, SlotForBlock(b), 1, shared.BeaconMultiAddress) downloadedData = append(downloadedData, data...) } @@ -89,7 +91,7 @@ func main() { downloadedData = nil for _, b := range blocks { - data := util.DownloadBlobs(ctx, b.Slot, 1, shared.BeaconFollowerMultiAddress) + data := util.DownloadBlobs(ctx, SlotForBlock(b), 1, shared.BeaconFollowerMultiAddress) downloadedData = append(downloadedData, data...) } if !bytes.Equal(flatBlobs, downloadedData) { @@ -97,6 +99,11 @@ func main() { } } +func SlotForBlock(block util.Block) consensustypes.Slot { + slot, _ := strconv.ParseUint(block.Data.Message.Slot, 10, 64) + return consensustypes.Slot(slot) +} + func FlattenBlobs(blobsData []types.Blobs) []byte { var out []byte for _, blobs := range blobsData { @@ -225,28 +232,24 @@ func UploadBlobsAndCheckBlockHeader(ctx context.Context, client *ethclient.Clien } } -func FindBlocksWithBlobs(ctx context.Context, client *beacon.Client, startSlot consensustypes.Slot) []*ethpbv2.BeaconBlockEip4844 { +func FindBlocksWithBlobs(ctx context.Context, client *beacon.Client, startSlot consensustypes.Slot) []util.Block { slot := startSlot endSlot := util.GetHeadSlot(ctx, client) - var blocks []*ethpbv2.BeaconBlockEip4844 + var blocks []util.Block for { if slot == endSlot { break } - // blockID := fmt.Sprintf("%d", uint64(slot)) - // req := ðpbv2.BlockRequestV2{BlockId: []byte(blockID)} - // block, err := client.GetBlock(ctx, req) - // if err != nil { - // log.Fatalf("beaconchainclient.GetBlock: %v", err) - // } - // eip4844, ok := block.Data.Message.(*ethpbv2.SignedBeaconBlockContainer_Eip4844Block) - // if ok { - // if len(eip4844.Eip4844Block.Body.BlobKzgs) != 0 { - // blocks = append(blocks, eip4844.Eip4844Block) - // } - // } + block, err := util.GetBlock(ctx, client, beacon.IdFromSlot(slot)) + if err != nil { + log.Fatalf("Failed to GetBlock: %v", err) + } + + if len(block.Data.Message.Body.BlobKzgs) != 0 { + blocks = append(blocks, block) + } slot = slot.Add(1) } diff --git a/tests/util/util.go b/tests/util/util.go index 96aafb7..113394a 100644 --- a/tests/util/util.go +++ b/tests/util/util.go @@ -50,8 +50,13 @@ func WaitForNextSlots(ctx context.Context, client *beacon.Client, slots consensu } } +type Body struct { + BlobKzgs []string `json:"blob_kzgs"` +} + type Message struct { Slot string + Body Body } type Data struct { @@ -62,19 +67,25 @@ type Block struct { Data Data } -func GetHeadSlot(ctx context.Context, client *beacon.Client) consensustypes.Slot { - blockJSON, err := client.GetBlockJSON(ctx, "head") +func GetBlock(ctx context.Context, client *beacon.Client, blockId beacon.StateOrBlockId) (Block, error) { + blockJSON, err := client.GetBlockJSON(ctx, blockId) if err != nil { - log.Fatalf("unable to get beacon chain head: %v", err) + log.Fatalf("unable to get beacon chain block: %v", err) } var block Block err = json.Unmarshal(blockJSON, &block) if err != nil { - log.Fatalf("unable to get beacon chain head: %v", err) + log.Fatalf("unable to unmarshall beacon chain block JSON: %v", err) } + + return block, nil +} + +func GetHeadSlot(ctx context.Context, client *beacon.Client) consensustypes.Slot { + block, _ := GetBlock(ctx, client, "head") slot, err := strconv.ParseUint(block.Data.Message.Slot, 10, 64) if err != nil { - log.Fatalf("unable to get beacon chain head: %v", err) + log.Fatalf("unable to parse beacon chain head slot: %v", err) } return (consensustypes.Slot)(slot) } @@ -89,18 +100,14 @@ func FindBlobSlot(ctx context.Context, client *beacon.Client, startSlot consensu log.Fatalf("Unable to find beacon block containing blobs") } - // blockID := fmt.Sprintf("%d", uint64(slot)) - // req := ðpbv2.BlockRequestV2{BlockId: []byte(blockID)} - // block, err := client.GetBlockV2(ctx, req) - // if err != nil { - // log.Fatalf("beaconchainclient.GetBlock: %v", err) - // } - // eip4844, ok := block.Data.Message.(*ethpbv2.SignedBeaconBlockContainer_Eip4844Block) - // if ok { - // if len(eip4844.Eip4844Block.Body.BlobKzgs) != 0 { - // return eip4844.Eip4844Block.Slot - // } - // } + block, err := GetBlock(ctx, client, beacon.IdFromSlot(slot)) + if err != nil { + log.Fatalf("beaconchainclient.GetBlock: %v", err) + } + + if len(block.Data.Message.Body.BlobKzgs) != 0 { + return slot + } slot = slot.Add(1) } From 9bf202ff25fa2738bacbd1237bc383dbd7d83453 Mon Sep 17 00:00:00 2001 From: dancoffman Date: Thu, 10 Nov 2022 13:17:46 -0800 Subject: [PATCH 25/45] Fix initial-sync test --- tests/ctrl/bootstrap.go | 9 +++++++-- tests/initial-sync/main.go | 8 +++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/tests/ctrl/bootstrap.go b/tests/ctrl/bootstrap.go index 1258a52..56343ef 100644 --- a/tests/ctrl/bootstrap.go +++ b/tests/ctrl/bootstrap.go @@ -23,19 +23,24 @@ var consensusClientEnvironments = map[string]*TestEnvironment{ // ... lighthouse } +// Stateful. InitE2ETest sets this. var client string func GetEnv() *TestEnvironment { return consensusClientEnvironments[client] } +func InitEnvForClient(clientName string) *TestEnvironment { + client = clientName + return consensusClientEnvironments[clientName] +} + func InitE2ETest(clientName string) { ctx := context.Background() if err := StopDevnet(); err != nil { log.Fatalf("unable to stop devnet: %v", err) } - client = clientName - GetEnv().StartAll(ctx) + InitEnvForClient(clientName).StartAll(ctx) } func WaitForShardingFork() { diff --git a/tests/initial-sync/main.go b/tests/initial-sync/main.go index 182aff6..5b177a8 100644 --- a/tests/initial-sync/main.go +++ b/tests/initial-sync/main.go @@ -4,6 +4,7 @@ import ( "context" "log" "math/big" + "os" "time" "github.com/Inphi/eip4844-interop/shared" @@ -36,7 +37,12 @@ func main() { defer cancel() ctrl.StopDevnet() - env := ctrl.GetEnv() + + clientName := "prysm" + if len(os.Args) > 1 { + clientName = os.Args[1] + } + env := ctrl.InitEnvForClient(clientName) g, gctx := errgroup.WithContext(ctx) g.Go(func() error { From 0b427c75af3cb000960e2a5f6601811e29d4f2e3 Mon Sep 17 00:00:00 2001 From: dancoffman Date: Thu, 10 Nov 2022 13:33:43 -0800 Subject: [PATCH 26/45] Switch prysm to my branch which has GetBlockJSON --- .gitmodules | 2 +- prysm/prysm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index 9ec9a6c..1153779 100644 --- a/.gitmodules +++ b/.gitmodules @@ -5,7 +5,7 @@ [submodule "prysm/prysm"] path = prysm/prysm url = https://github.com/Inphi/prysm - branch = eip-4844 + branch = dgc/add-json-getblock [submodule "lodestar/lodestar"] path = lodestar/lodestar url = https://github.com/dgcoffman/lodestar diff --git a/prysm/prysm b/prysm/prysm index 948127b..7892f2c 160000 --- a/prysm/prysm +++ b/prysm/prysm @@ -1 +1 @@ -Subproject commit 948127b7c1c533469c20a64efb691b03f60fd267 +Subproject commit 7892f2c2bc447954008870c88d14a2cf764ba17b From 4eaf1869db5dff1a7200e1ad2f1c2509b1e4c9ae Mon Sep 17 00:00:00 2001 From: dancoffman Date: Thu, 10 Nov 2022 13:48:45 -0800 Subject: [PATCH 27/45] Configure Prysm to upgrade later (as though it had Capella). Also run Lodestar pre-4844 test in CI --- .github/workflows/ci.yml | 5 ++++- geth/geth-genesis.json | 2 +- lodestar/chain-config.yml | 1 + prysm/chain-config.yml | 10 +++++++--- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9796a23..147dc59 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,9 +20,12 @@ jobs: # go 1.19 is incompatible with the github.com/lucas-clemente/quic-go v0.27.2 dependency go-version: '1.18' - - name: Run pre-EIP4844 tests + - name: Prysm - Run pre-EIP4844 tests run: go run ./tests/pre-4844 + - name: Lodestar - Run pre-EIP4844 tests + run: go run ./tests/pre-4844 lodestar + # TODO: A bit redundant. combine this test with fee-market - name: Run Blob transaction tests run: go run ./tests/blobtx diff --git a/geth/geth-genesis.json b/geth/geth-genesis.json index 121a4fd..6a4adf1 100644 --- a/geth/geth-genesis.json +++ b/geth/geth-genesis.json @@ -13,7 +13,7 @@ "muirGlacierBlock": 0, "berlinBlock": 0, "londonBlock": 0, - "shardingForkBlock": 5, + "shardingForkBlock": 8, "clique": { "period": 5, "epoch": 30000 diff --git a/lodestar/chain-config.yml b/lodestar/chain-config.yml index e4e1d01..2481ff6 100644 --- a/lodestar/chain-config.yml +++ b/lodestar/chain-config.yml @@ -8,3 +8,4 @@ CAPELLA_FORK_EPOCH: 3 EIP4844_FORK_EPOCH: 4 SECONDS_PER_SLOT: 6 +# SLOTS_PER_EPOCH: 3 -- this is not configurable in Lodestar diff --git a/prysm/chain-config.yml b/prysm/chain-config.yml index d0740af..516a6b0 100644 --- a/prysm/chain-config.yml +++ b/prysm/chain-config.yml @@ -1,10 +1,14 @@ -CONFIG_NAME: "local" +CONFIG_NAME: 'local' + +TERMINAL_TOTAL_DIFFICULTY: 2 # Has to match geth-genesis + ALTAIR_FORK_EPOCH: 1 BELLATRIX_FORK_EPOCH: 2 -EIP4844_FORK_EPOCH: 3 # ensure this happens at exactly shardingForkBlock in execution +# CAPELLA_FORK_EPOCH: 3 +EIP4844_FORK_EPOCH: 4 + SECONDS_PER_SLOT: 6 SLOTS_PER_EPOCH: 3 -TERMINAL_TOTAL_DIFFICULTY: 2 # avoid collisions with mainnet/eip4844 config versioning GENESIS_FORK_VERSION: 0x00000ffe From ad8a2ee0c8d37b33c9498725cc4f9ebb2086c1f8 Mon Sep 17 00:00:00 2001 From: dancoffman Date: Thu, 10 Nov 2022 14:15:33 -0800 Subject: [PATCH 28/45] Fix make lodestar-up --- Makefile | 2 +- lodestar/run_beacon_node_peer.sh | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 13045e2..815de80 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ lodestar-up: execution-node\ execution-node-2\ lodestar-beacon-node\ - lodestar-beacon-follower\ + lodestar-beacon-node-follower\ devnet-down: docker compose down -v diff --git a/lodestar/run_beacon_node_peer.sh b/lodestar/run_beacon_node_peer.sh index ff0cb59..7c2c0bc 100755 --- a/lodestar/run_beacon_node_peer.sh +++ b/lodestar/run_beacon_node_peer.sh @@ -38,6 +38,7 @@ fi --bootnodes $ENR \ --eth1 \ --eth1.providerUrls="$EXECUTION_NODE_URL" \ + --execution.urls="$EXECUTION_NODE_URL" \ --reset \ --server http://localhost:3500 \ --rest \ From 8fe2d406e06a944c91b4d25f31e53ea01b964786 Mon Sep 17 00:00:00 2001 From: dancoffman Date: Thu, 10 Nov 2022 14:40:18 -0800 Subject: [PATCH 29/45] Remove Prysm-specific chain config. We used a shared config now. --- prysm/chain-config.yml | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 prysm/chain-config.yml diff --git a/prysm/chain-config.yml b/prysm/chain-config.yml deleted file mode 100644 index 516a6b0..0000000 --- a/prysm/chain-config.yml +++ /dev/null @@ -1,19 +0,0 @@ -CONFIG_NAME: 'local' - -TERMINAL_TOTAL_DIFFICULTY: 2 # Has to match geth-genesis - -ALTAIR_FORK_EPOCH: 1 -BELLATRIX_FORK_EPOCH: 2 -# CAPELLA_FORK_EPOCH: 3 -EIP4844_FORK_EPOCH: 4 - -SECONDS_PER_SLOT: 6 -SLOTS_PER_EPOCH: 3 - -# avoid collisions with mainnet/eip4844 config versioning -GENESIS_FORK_VERSION: 0x00000ffe -ALTAIR_FORK_VERSION: 0x01000ffe -BELLATRIX_FORK_VERSION: 0x02000ffe -EIP4844_FORK_VERSION: 0x03000ffe - -DOMAIN_BLOBS_SIDECAR: 0x0a000000 From 002b39aa5ef1e256d6041ad80148cb6ad33995fb Mon Sep 17 00:00:00 2001 From: dancoffman Date: Thu, 10 Nov 2022 14:44:31 -0800 Subject: [PATCH 30/45] Point Prysm back at the devnet-v3 branch --- .gitmodules | 2 +- prysm/prysm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index 3c6882e..2441ebd 100644 --- a/.gitmodules +++ b/.gitmodules @@ -5,7 +5,7 @@ [submodule "prysm/prysm"] path = prysm/prysm url = https://github.com/Inphi/prysm - branch = dgc/add-json-getblock + branch = devnet-v3 [submodule "lodestar/lodestar"] path = lodestar/lodestar url = https://github.com/dgcoffman/lodestar diff --git a/prysm/prysm b/prysm/prysm index 7892f2c..d457b19 160000 --- a/prysm/prysm +++ b/prysm/prysm @@ -1 +1 @@ -Subproject commit 7892f2c2bc447954008870c88d14a2cf764ba17b +Subproject commit d457b19fa3e02c092c8cc89a1a43b370795db48e From 9573bb2fedbbf49c2166f1d16e2c260c8b3e1bac Mon Sep 17 00:00:00 2001 From: dancoffman Date: Thu, 10 Nov 2022 15:22:02 -0800 Subject: [PATCH 31/45] Update geth to latest from devnet-v3 --- geth/go-ethereum | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geth/go-ethereum b/geth/go-ethereum index bca26b3..9ea1faa 160000 --- a/geth/go-ethereum +++ b/geth/go-ethereum @@ -1 +1 @@ -Subproject commit bca26b3cb8bf9153addcaa17c033b20ddcaa00ba +Subproject commit 9ea1faa4f756c8b45f4ab8198df4c1a7afd55df7 From 44b2b3f04a42a3255cf4fedc20c242b3d17d3846 Mon Sep 17 00:00:00 2001 From: dancoffman Date: Thu, 10 Nov 2022 15:25:35 -0800 Subject: [PATCH 32/45] Put erigon back --- erigon/erigon | 1 + 1 file changed, 1 insertion(+) create mode 160000 erigon/erigon diff --git a/erigon/erigon b/erigon/erigon new file mode 160000 index 0000000..c656c65 --- /dev/null +++ b/erigon/erigon @@ -0,0 +1 @@ +Subproject commit c656c6576fc086c5d8927b6e21523ebf411b4b88 From 4a6ee67e4aa0293fce35c7497faf3016aa7cba0b Mon Sep 17 00:00:00 2001 From: dancoffman Date: Thu, 10 Nov 2022 16:23:52 -0800 Subject: [PATCH 33/45] Remove preset base, let it take the default --- docker-compose.yml | 2 -- shared/chain-config.yml | 1 - 2 files changed, 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index fee8de6..b7c78d9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -145,7 +145,6 @@ services: entrypoint: ['run_beacon_node.sh'] ports: - '3500:3500' - - '4000:4000' - '13000:13000' volumes: - 'beacon_node_data:/chaindata' @@ -171,7 +170,6 @@ services: entrypoint: run_beacon_node_peer.sh ports: - '3501:3500' - - '4001:4000' - '13001:13000' volumes: - 'beacon_node_follower_data:/chaindata' diff --git a/shared/chain-config.yml b/shared/chain-config.yml index b4904af..cc32282 100644 --- a/shared/chain-config.yml +++ b/shared/chain-config.yml @@ -1,4 +1,3 @@ -PRESET_BASE: 'minimal' CONFIG_NAME: 'local' ALTAIR_FORK_EPOCH: 1 From a23b3f646cc5d89205cd22f7eaaad6da477d1ef7 Mon Sep 17 00:00:00 2001 From: dancoffman Date: Thu, 10 Nov 2022 16:56:27 -0800 Subject: [PATCH 34/45] Attempt to parallelize CI --- .github/workflows/ci.yml | 106 +++++++++++++++++++++++---------------- 1 file changed, 62 insertions(+), 44 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c0da747..5db0766 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,58 +2,76 @@ name: CI # The flag below may be needed if blst throws SIGILL, which happens with certain (older) CPUs env: - CGO_CFLAGS: "-O -D__BLST_PORTABLE__" + CGO_CFLAGS: '-O -D__BLST_PORTABLE__' on: push: - branches: [ "master", "devnet-v3" ] + branches: ['master', 'devnet-v3'] pull_request: - branches: [ "master", "devnet-v3" ] + branches: ['master', 'devnet-v3'] jobs: build: runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v3 - with: - submodules: recursive - - - uses: actions/setup-go@v3 - with: -# go 1.19 is incompatible with the github.com/lucas-clemente/quic-go v0.27.2 dependency - go-version: '1.18' - - - name: Prysm - Run pre-EIP4844 tests - run: go run ./tests/pre-4844 - - - name: Lodestar - Run pre-EIP4844 tests - run: go run ./tests/pre-4844 lodestar - - # TODO: A bit redundant. combine this test with fee-market - - name: Run Blob transaction tests - run: go run ./tests/blobtx - - - name: Run Fee market spec tests - run: go run ./tests/fee-market - - - name: Run Initial sync tests - run: go run ./tests/initial-sync - - - name: Collect docker logs on failure - if: failure() - uses: jwalton/gh-docker-logs@v1 - with: - images: 'eip4844-interop_beacon-node-follower,eip4844-interop_beacon-node,eip4844-interop_execution-node-2,eip4844-interop_execution-node,eip4844-interop_validator-node' - dest: './logs' - - - name: Tar logs - if: failure() - run: tar cvzf ./logs.tgz ./logs - - - name: Upload logs to GitHub - if: failure() - uses: actions/upload-artifact@master - with: + - name: Checkout + uses: actions/checkout@v3 + with: + submodules: recursive + + - uses: actions/setup-go@v3 + with: + # go 1.19 is incompatible with the github.com/lucas-clemente/quic-go v0.27.2 dependency + go-version: '1.18' + + test: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + ci_node_total: [2] + ci_node_index: [0, 1, 0, 0, 0] + + - name: Prysm - Run pre-EIP4844 tests + run: go run ./tests/pre-4844 prysm + + - name: Lodestar - Run pre-EIP4844 tests + run: go run ./tests/pre-4844 lodestar + + # TODO: A bit redundant. combine this test with fee-market + - name: Prysm - Run Blob transaction tests + run: go run ./tests/blobtx prysm + + - name: Prysm - Run Fee market spec tests + run: go run ./tests/fee-market prysm + + - name: Prysm - Run Initial sync tests + run: go run ./tests/initial-sync prysm + + # TODO - Make them pass + # - name: Lodestar - Run Blob transaction tests + # run: go run ./tests/blobtx lodestar + + # - name: Lodestar - Run Fee market spec tests + # run: go run ./tests/fee-market lodestar + + # - name: Lodestar - Run Initial sync tests + # run: go run ./tests/initial-sync lodestar + + - name: Collect docker logs on failure + if: failure() + uses: jwalton/gh-docker-logs@v1 + with: + images: 'eip4844-interop_beacon-node-follower,eip4844-interop_beacon-node,eip4844-interop_execution-node-2,eip4844-interop_execution-node,eip4844-interop_validator-node' + dest: './logs' + + - name: Tar logs + if: failure() + run: tar cvzf ./logs.tgz ./logs + + - name: Upload logs to GitHub + if: failure() + uses: actions/upload-artifact@master + with: name: logs.tgz path: ./logs.tgz From ee5b6c7df0518fb78153239dfa2a80ec8431f18f Mon Sep 17 00:00:00 2001 From: dancoffman Date: Thu, 10 Nov 2022 17:03:24 -0800 Subject: [PATCH 35/45] idunno lol --- .github/workflows/ci.yml | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5db0766..8411a5a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,20 +24,9 @@ jobs: # go 1.19 is incompatible with the github.com/lucas-clemente/quic-go v0.27.2 dependency go-version: '1.18' - test: - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - ci_node_total: [2] - ci_node_index: [0, 1, 0, 0, 0] - - name: Prysm - Run pre-EIP4844 tests run: go run ./tests/pre-4844 prysm - - name: Lodestar - Run pre-EIP4844 tests - run: go run ./tests/pre-4844 lodestar - # TODO: A bit redundant. combine this test with fee-market - name: Prysm - Run Blob transaction tests run: go run ./tests/blobtx prysm @@ -48,15 +37,17 @@ jobs: - name: Prysm - Run Initial sync tests run: go run ./tests/initial-sync prysm - # TODO - Make them pass - # - name: Lodestar - Run Blob transaction tests - # run: go run ./tests/blobtx lodestar + - name: Lodestar - Run pre-EIP4844 tests + run: go run ./tests/pre-4844 lodestar + + - name: Lodestar - Run Blob transaction tests + run: go run ./tests/blobtx lodestar - # - name: Lodestar - Run Fee market spec tests - # run: go run ./tests/fee-market lodestar + - name: Lodestar - Run Fee market spec tests + run: go run ./tests/fee-market lodestar - # - name: Lodestar - Run Initial sync tests - # run: go run ./tests/initial-sync lodestar + - name: Lodestar - Run Initial sync tests + run: go run ./tests/initial-sync lodestar - name: Collect docker logs on failure if: failure() From 4ed4ce910144b467db2091af58d117b9876affaf Mon Sep 17 00:00:00 2001 From: dancoffman Date: Thu, 10 Nov 2022 17:07:34 -0800 Subject: [PATCH 36/45] Try two jobs --- .github/workflows/ci.yml | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8411a5a..9f573a1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,7 +11,7 @@ on: branches: ['master', 'devnet-v3'] jobs: - build: + test-prysm: runs-on: ubuntu-latest steps: - name: Checkout @@ -37,6 +37,37 @@ jobs: - name: Prysm - Run Initial sync tests run: go run ./tests/initial-sync prysm + - name: Collect docker logs on failure + if: failure() + uses: jwalton/gh-docker-logs@v1 + with: + images: 'eip4844-interop_beacon-node-follower,eip4844-interop_beacon-node,eip4844-interop_execution-node-2,eip4844-interop_execution-node,eip4844-interop_validator-node' + dest: './logs' + + - name: Tar logs + if: failure() + run: tar cvzf ./logs.tgz ./logs + + - name: Upload logs to GitHub + if: failure() + uses: actions/upload-artifact@master + with: + name: logs.tgz + path: ./logs.tgz + + test-lodestar: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + submodules: recursive + + - uses: actions/setup-go@v3 + with: + # go 1.19 is incompatible with the github.com/lucas-clemente/quic-go v0.27.2 dependency + go-version: '1.18' + - name: Lodestar - Run pre-EIP4844 tests run: go run ./tests/pre-4844 lodestar From 1f7cb3430c55e6c7fc32a400e19fbd9100bb234e Mon Sep 17 00:00:00 2001 From: dancoffman Date: Mon, 14 Nov 2022 10:55:37 -0800 Subject: [PATCH 37/45] Comment failing Lodestar CI test --- .github/workflows/ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9f573a1..fdcf422 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -71,14 +71,14 @@ jobs: - name: Lodestar - Run pre-EIP4844 tests run: go run ./tests/pre-4844 lodestar - - name: Lodestar - Run Blob transaction tests - run: go run ./tests/blobtx lodestar + # - name: Lodestar - Run Blob transaction tests + # run: go run ./tests/blobtx lodestar - - name: Lodestar - Run Fee market spec tests - run: go run ./tests/fee-market lodestar + # - name: Lodestar - Run Fee market spec tests + # run: go run ./tests/fee-market lodestar - - name: Lodestar - Run Initial sync tests - run: go run ./tests/initial-sync lodestar + # - name: Lodestar - Run Initial sync tests + # run: go run ./tests/initial-sync lodestar - name: Collect docker logs on failure if: failure() From b1affe488b54fdcbb5dd07550301dc8aa7d547c0 Mon Sep 17 00:00:00 2001 From: dancoffman Date: Tue, 15 Nov 2022 08:10:41 -0800 Subject: [PATCH 38/45] Fix clean --- Makefile | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 815de80..d007c9b 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ devnet-up: - docker compose up -d\ + docker compose --project-name eip4844-interop up -d\ execution-node\ execution-node-2\ prysm-beacon-node\ @@ -8,7 +8,7 @@ devnet-up: jaeger-tracing lodestar-up: - docker compose up -d\ + docker compose --project-name eip4844-interop up -d\ execution-node\ execution-node-2\ lodestar-beacon-node\ @@ -21,7 +21,8 @@ devnet-restart: devnet-down devnet-up devnet-clean: docker compose down - docker image ls 'interop*' --format='{{.Repository}}' | xargs -r docker rmi - docker volume ls --filter name=interop --format='{{.Name}}' | xargs -r docker volume rm + docker compose down --volumes + docker image ls 'eip4844-interop*' --format='{{.Repository}}' | xargs -r docker image rm -f + docker volume ls --filter name=eip4844-interop --format='{{.Name}}' | xargs -r docker volume rm -f .PHONY: devnet-clean From 52f0c080d73250866681af7d476f3e66638c4fcb Mon Sep 17 00:00:00 2001 From: dancoffman Date: Tue, 15 Nov 2022 08:39:24 -0800 Subject: [PATCH 39/45] Use basename pwd instead --- Makefile | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index d007c9b..21eb115 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ devnet-up: - docker compose --project-name eip4844-interop up -d\ + docker compose up -d\ execution-node\ execution-node-2\ prysm-beacon-node\ @@ -8,7 +8,7 @@ devnet-up: jaeger-tracing lodestar-up: - docker compose --project-name eip4844-interop up -d\ + docker compose up -d\ execution-node\ execution-node-2\ lodestar-beacon-node\ @@ -20,9 +20,8 @@ devnet-down: devnet-restart: devnet-down devnet-up devnet-clean: - docker compose down - docker compose down --volumes - docker image ls 'eip4844-interop*' --format='{{.Repository}}' | xargs -r docker image rm -f - docker volume ls --filter name=eip4844-interop --format='{{.Name}}' | xargs -r docker volume rm -f + docker compose down --rmi local --volumes + docker image ls '`basename $PWD`-interop*' --format='{{.Repository}}' | xargs -r docker rmi + docker volume ls --filter name=`basename $PWD`-interop --format='{{.Name}}' | xargs -r docker volume rm .PHONY: devnet-clean From 12154e720aa3ea03d558c9edcdeec8c0577418cd Mon Sep 17 00:00:00 2001 From: dancoffman Date: Tue, 15 Nov 2022 09:58:14 -0800 Subject: [PATCH 40/45] Go back to using --project-name, but correctly supply it to docker compose down also --- Makefile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 21eb115..8be2d19 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ devnet-up: - docker compose up -d\ + docker compose --project-name eip-4844 up -d\ execution-node\ execution-node-2\ prysm-beacon-node\ @@ -8,20 +8,20 @@ devnet-up: jaeger-tracing lodestar-up: - docker compose up -d\ + docker compose --project-name eip-4844 up -d\ execution-node\ execution-node-2\ lodestar-beacon-node\ lodestar-beacon-node-follower\ devnet-down: - docker compose down -v + docker compose --project-name eip-4844 down -v devnet-restart: devnet-down devnet-up devnet-clean: - docker compose down --rmi local --volumes - docker image ls '`basename $PWD`-interop*' --format='{{.Repository}}' | xargs -r docker rmi - docker volume ls --filter name=`basename $PWD`-interop --format='{{.Name}}' | xargs -r docker volume rm + docker compose --project-name eip-4844 down --rmi local --volumes + docker image ls 'eip-4844-interop*' --format='{{.Repository}}' | xargs -r docker rmi + docker volume ls --filter name=eip-4844-interop --format='{{.Name}}' | xargs -r docker volume rm .PHONY: devnet-clean From d6fab97365ee9c0d47235ed1b555935b05960301 Mon Sep 17 00:00:00 2001 From: Roberto Bayardo Date: Tue, 15 Nov 2022 13:08:39 -0800 Subject: [PATCH 41/45] upgrade subrepos to latest (#56) --- erigon/erigon | 2 +- geth/go-ethereum | 2 +- prysm/prysm | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/erigon/erigon b/erigon/erigon index c656c65..242b5a7 160000 --- a/erigon/erigon +++ b/erigon/erigon @@ -1 +1 @@ -Subproject commit c656c6576fc086c5d8927b6e21523ebf411b4b88 +Subproject commit 242b5a76df3f25783b68411ebfd5a9c17a55d88a diff --git a/geth/go-ethereum b/geth/go-ethereum index 9ea1faa..1275844 160000 --- a/geth/go-ethereum +++ b/geth/go-ethereum @@ -1 +1 @@ -Subproject commit 9ea1faa4f756c8b45f4ab8198df4c1a7afd55df7 +Subproject commit 127584459da6c932d407307947c578d42853d629 diff --git a/prysm/prysm b/prysm/prysm index d457b19..8ec03ac 160000 --- a/prysm/prysm +++ b/prysm/prysm @@ -1 +1 @@ -Subproject commit d457b19fa3e02c092c8cc89a1a43b370795db48e +Subproject commit 8ec03acce5ad208e38bac202c4cb7b4d194d1ead From fa5537e7cd6417f24ac84b7bfa72217cd6cd14dc Mon Sep 17 00:00:00 2001 From: dancoffman Date: Thu, 17 Nov 2022 01:11:22 -0800 Subject: [PATCH 42/45] Lodestar should pass fee market test --- Makefile | 10 ++++++---- lodestar/.dockerignore | 1 + lodestar/Dockerfile.lodestar | 2 +- lodestar/lodestar | 2 +- tests/fee-market/main.go | 2 ++ tests/util/util.go | 3 ++- 6 files changed, 13 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 8be2d19..625272e 100644 --- a/Makefile +++ b/Makefile @@ -10,9 +10,7 @@ devnet-up: lodestar-up: docker compose --project-name eip-4844 up -d\ execution-node\ - execution-node-2\ lodestar-beacon-node\ - lodestar-beacon-node-follower\ devnet-down: docker compose --project-name eip-4844 down -v @@ -21,7 +19,11 @@ devnet-restart: devnet-down devnet-up devnet-clean: docker compose --project-name eip-4844 down --rmi local --volumes - docker image ls 'eip-4844-interop*' --format='{{.Repository}}' | xargs -r docker rmi - docker volume ls --filter name=eip-4844-interop --format='{{.Name}}' | xargs -r docker volume rm + docker image ls 'eip-4844*' --format='{{.Repository}}' | xargs -r docker rmi + docker volume ls --filter name=eip-4844 --format='{{.Name}}' | xargs -r docker volume rm + docker compose down --rmi local --volumes + docker image ls 'interop*' --format='{{.Repository}}' | xargs -r docker rmi + docker volume ls --filter name=interop --format='{{.Name}}' | xargs -r docker volume rm + .PHONY: devnet-clean diff --git a/lodestar/.dockerignore b/lodestar/.dockerignore index ad7c440..48f6af3 100644 --- a/lodestar/.dockerignore +++ b/lodestar/.dockerignore @@ -1,3 +1,4 @@ .git .github node_modules +**/node_modules diff --git a/lodestar/Dockerfile.lodestar b/lodestar/Dockerfile.lodestar index 70617a0..e5e1236 100644 --- a/lodestar/Dockerfile.lodestar +++ b/lodestar/Dockerfile.lodestar @@ -5,7 +5,7 @@ RUN apt-get update && \ COPY ./lodestar/package.json /app/lodestar/package.json COPY ./lodestar/yarn.lock /app/lodestar/yarn.lock -COPY ./lodestar/trusted_setup.txt /app/lodestar/trusted_setup.txt +COPY ./lodestar/testing_trusted_setups.json /app/lodestar/testing_trusted_setups.json COPY ./lodestar/packages/api/package.json /app/lodestar/packages/api/package.json COPY ./lodestar/packages/beacon-node/package.json /app/lodestar/packages/beacon-node/package.json diff --git a/lodestar/lodestar b/lodestar/lodestar index 513b873..2a3a9a0 160000 --- a/lodestar/lodestar +++ b/lodestar/lodestar @@ -1 +1 @@ -Subproject commit 513b8731eb4735122972e86c2c13dbd21001fe92 +Subproject commit 2a3a9a0367730fb9054693f4bd8ed7f814ad8087 diff --git a/tests/fee-market/main.go b/tests/fee-market/main.go index cf140ce..c1801c7 100644 --- a/tests/fee-market/main.go +++ b/tests/fee-market/main.go @@ -247,6 +247,8 @@ func FindBlocksWithBlobs(ctx context.Context, client *beacon.Client, startSlot c log.Fatalf("Failed to GetBlock: %v", err) } + log.Println("Found block!", len(block.Data.Message.Body.BlobKzgs)) + if len(block.Data.Message.Body.BlobKzgs) != 0 { blocks = append(blocks, block) } diff --git a/tests/util/util.go b/tests/util/util.go index 113394a..bf7d556 100644 --- a/tests/util/util.go +++ b/tests/util/util.go @@ -51,7 +51,8 @@ func WaitForNextSlots(ctx context.Context, client *beacon.Client, slots consensu } type Body struct { - BlobKzgs []string `json:"blob_kzgs"` + // Does Prysm call this "blob_kzgs"? That's wrong. + BlobKzgs []string `json:"blob_kzg_commitments"` } type Message struct { From 334ea3eece7c6462c4d2b63c6cf4ce698056af0b Mon Sep 17 00:00:00 2001 From: dancoffman Date: Thu, 17 Nov 2022 10:18:29 -0800 Subject: [PATCH 43/45] Revert gitmodules --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 9f60b70..7f3d654 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,7 +1,7 @@ [submodule "geth/go-ethereum"] path = geth/go-ethereum url = https://github.com/mdehoog/go-ethereum - branch = devnet-v3 + branch = eip-4844 [submodule "prysm/prysm"] path = prysm/prysm url = https://github.com/Inphi/prysm From a6e3b3d0c0664c2c762bbb7bda814bfb4004d2ac Mon Sep 17 00:00:00 2001 From: dancoffman Date: Thu, 17 Nov 2022 10:19:02 -0800 Subject: [PATCH 44/45] Update submodules --- erigon/erigon | 2 +- geth/go-ethereum | 2 +- prysm/prysm | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/erigon/erigon b/erigon/erigon index 242b5a7..c50d4e6 160000 --- a/erigon/erigon +++ b/erigon/erigon @@ -1 +1 @@ -Subproject commit 242b5a76df3f25783b68411ebfd5a9c17a55d88a +Subproject commit c50d4e6c0b35df4e341e8275b0572566a6e6adfd diff --git a/geth/go-ethereum b/geth/go-ethereum index 1275844..a720ac1 160000 --- a/geth/go-ethereum +++ b/geth/go-ethereum @@ -1 +1 @@ -Subproject commit 127584459da6c932d407307947c578d42853d629 +Subproject commit a720ac19cc795529b462c0bb27e05b301dcebe6d diff --git a/prysm/prysm b/prysm/prysm index 8ec03ac..e25840e 160000 --- a/prysm/prysm +++ b/prysm/prysm @@ -1 +1 @@ -Subproject commit 8ec03acce5ad208e38bac202c4cb7b4d194d1ead +Subproject commit e25840ee7e2e8a84e1bbdb9f094ac6e8656629cd From 8a6ceb028cf03e53dc2b4b9a9dd22e8cc0a194b9 Mon Sep 17 00:00:00 2001 From: dancoffman Date: Thu, 17 Nov 2022 16:10:10 -0800 Subject: [PATCH 45/45] Update submodules --- lodestar/lodestar | 2 +- prysm/prysm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lodestar/lodestar b/lodestar/lodestar index 2a3a9a0..dec9841 160000 --- a/lodestar/lodestar +++ b/lodestar/lodestar @@ -1 +1 @@ -Subproject commit 2a3a9a0367730fb9054693f4bd8ed7f814ad8087 +Subproject commit dec9841c553081efea38b75ebaed7a094a0789f6 diff --git a/prysm/prysm b/prysm/prysm index e25840e..a0c49f1 160000 --- a/prysm/prysm +++ b/prysm/prysm @@ -1 +1 @@ -Subproject commit e25840ee7e2e8a84e1bbdb9f094ac6e8656629cd +Subproject commit a0c49f12a7039e6d95aeccb30743d86fd02fff76