diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ac7b4e9..c0da747 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,9 +24,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/.gitmodules b/.gitmodules index fab8c84..2441ebd 100644 --- a/.gitmodules +++ b/.gitmodules @@ -6,6 +6,10 @@ path = prysm/prysm url = https://github.com/Inphi/prysm branch = devnet-v3 +[submodule "lodestar/lodestar"] + path = lodestar/lodestar + url = https://github.com/dgcoffman/lodestar + branch = dgc/eip-4844 [submodule "erigon/erigon"] path = erigon/erigon url = https://github.com/roberto-bayardo/erigon diff --git a/Makefile b/Makefile index e0061db..815de80 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 @@ -14,7 +21,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/docker-compose.yml b/docker-compose.yml index b95d4d5..b7c78d9 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: ./shared/chain-config.yml target: /config/chain-config.yml @@ -68,10 +69,10 @@ 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 + - prysm-beacon-node - jaeger-tracing build: context: ./prysm @@ -80,16 +81,16 @@ 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 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: ./shared/chain-config.yml target: /config/chain-config.yml @@ -103,9 +104,9 @@ services: source: ./prysm/prysm-follower-priv-key target: /etc/prysm-priv-key - validator-node: + prysm-validator-node: depends_on: - - beacon-node + - prysm-beacon-node - jaeger-tracing build: context: ./prysm @@ -113,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 @@ -126,21 +127,71 @@ services: --tracing-endpoint http://jaeger-tracing:14268/api/traces --tracing-process-name validator-node ports: - - "7500:7500" + - '7500:7500' volumes: - type: bind source: ./shared/chain-config.yml target: /config/chain-config.yml + 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' + - '13000:13000' + volumes: + - 'beacon_node_data:/chaindata' + - type: bind + source: ./shared/chain-config.yml + target: /config/chain-config.yml + - 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: + EXECUTION_NODE_URL: http://execution-node-2:8545 + BEACON_NODE_RPC: http://lodestar-beacon-node:3500 + PROCESS_NAME: lodestar-beacon-node-follower + VERBOSITY: debug + entrypoint: run_beacon_node_peer.sh + ports: + - '3501:3500' + - '13001:13000' + volumes: + - 'beacon_node_follower_data:/chaindata' + - type: bind + source: ./shared/chain-config.yml + target: /config/chain-config.yml + - 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" + - '5775:5775/udp' + - '6831:6831/udp' + - '6832:6832/udp' + - '5778:5778' + - '16686:16686' + - '14268:14268' + - '9411:9411' 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/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 diff --git a/go.mod b/go.mod index a09cbc1..6874faf 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 @@ -147,6 +147,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 @@ -189,7 +190,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 6b224b5..91f49c9 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= @@ -927,6 +929,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= @@ -1220,6 +1224,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= @@ -1580,6 +1585,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/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..70617a0 --- /dev/null +++ b/lodestar/Dockerfile.lodestar @@ -0,0 +1,73 @@ +FROM node:16 + +RUN apt-get update && \ + apt-get install -y jq + +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 +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 + +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 +COPY ./lodestar/types /app/lodestar/types + +# 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/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 diff --git a/lodestar/lodestar b/lodestar/lodestar new file mode 160000 index 0000000..513b873 --- /dev/null +++ b/lodestar/lodestar @@ -0,0 +1 @@ +Subproject commit 513b8731eb4735122972e86c2c13dbd21001fe92 diff --git a/lodestar/run_beacon_node.sh b/lodestar/run_beacon_node.sh new file mode 100755 index 0000000..457b6e7 --- /dev/null +++ b/lodestar/run_beacon_node.sh @@ -0,0 +1,43 @@ +#!/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 \ + --logLevel verbose \ + --paramsFile /config/chain-config.yml \ + --genesisValidators 1 \ + --startValidators 0..1 \ + --enr.ip 127.0.0.1 \ + --server http://localhost:3500 \ + --reset \ + --eth1 \ + --eth1.providerUrls="$EXECUTION_NODE_URL" \ + --execution.urls="$EXECUTION_NODE_URL" \ + --dataDir /chaindata \ + --rest \ + --rest.address 0.0.0.0 \ + --rest.port 3500 \ + --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..7c2c0bc --- /dev/null +++ b/lodestar/run_beacon_node_peer.sh @@ -0,0 +1,47 @@ +#!/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 \ + --paramsFile /config/chain-config.yml \ + --genesisValidators 1 \ + --genesisTime "$INTEROP_GENESIS_TIME" \ + --dataDir /chaindata \ + --network.connectToDiscv5Bootnodes true \ + --bootnodes $ENR \ + --eth1 \ + --eth1.providerUrls="$EXECUTION_NODE_URL" \ + --execution.urls="$EXECUTION_NODE_URL" \ + --reset \ + --server http://localhost:3500 \ + --rest \ + --rest.address 0.0.0.0 \ + --rest.port 3500 \ + --rest.namespace "*" \ diff --git a/prysm/prysm b/prysm/prysm index eb1b85d..d457b19 160000 --- a/prysm/prysm +++ b/prysm/prysm @@ -1 +1 @@ -Subproject commit eb1b85d841bce912d67062bbb6fefc9aa4ae31af +Subproject commit d457b19fa3e02c092c8cc89a1a43b370795db48e diff --git a/shared/chain-config.yml b/shared/chain-config.yml index 6e1c5c2..cc32282 100644 --- a/shared/chain-config.yml +++ b/shared/chain-config.yml @@ -1,9 +1,9 @@ -PRESET_BASE: 'mainnet' -CONFIG_NAME: "local" +CONFIG_NAME: 'local' 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 # ensure this happens at exactly shardingForkBlock in execution SECONDS_PER_SLOT: 6 SLOTS_PER_EPOCH: 3 TERMINAL_TOTAL_DIFFICULTY: 2 @@ -16,7 +16,7 @@ EIP4844_FORK_VERSION: 0x03000ffe DOMAIN_BLOBS_SIDECAR: 0x0a000000 -# All missing values below (except for DEPOSIT_CONTRACT_ADDRESS) copied from mainnet +# All missing values below (except for DEPOSIT_CONTRACT_ADDRESS) copied from mainnet # Genesis # --------------------------------------------------------------- diff --git a/shared/config.go b/shared/config.go index 3198949..669b8f4 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/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..936f570 100644 --- a/tests/ctrl/bootstrap.go +++ b/tests/ctrl/bootstrap.go @@ -3,43 +3,50 @@ 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" ) -var env *TestEnvironment +var consensusClientEnvironments = map[string]*TestEnvironment{ + "prysm": newPrysmTestEnvironment(), + "lodestar": newLodestarTestEnvironment(), + // "lighthouse": newLighthouseTestEnvironment(), +} + +// 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() { +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 + InitEnvForClient(clientName).StartAll(ctx) } func WaitForShardingFork() { ctx := context.Background() - config := env.GethChainConfig + config := GetEnv().GethChainConfig eip4844ForkBlock := config.ShardingForkBlock.Uint64() stallTimeout := 1 * time.Minute @@ -57,6 +64,7 @@ func WaitForShardingFork() { if err != nil { log.Fatalf("ethclient.BlockNumber: %v", err) } + if bn >= eip4844ForkBlock { break } @@ -105,18 +113,13 @@ 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 } - 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(), + BeaconNode: NewBeaconNode(clientName), + BeaconNodeFollower: NewBeaconNodeFollower(clientName), + ValidatorNode: NewValidatorNode(clientName), GethChainConfig: ReadGethChainConfig(), + GethNode: NewGethNode(), + GethNode2: NewGethNode2(), + } +} + +func newLodestarTestEnvironment() *TestEnvironment { + clientName := "lodestar" + return &TestEnvironment{ BeaconChainConfig: ReadBeaconChainConfig(), - BeaconNode: NewBeaconNode(), + BeaconNode: NewBeaconNode(clientName), + BeaconNodeFollower: NewBeaconNodeFollower(clientName), + GethChainConfig: ReadGethChainConfig(), GethNode: NewGethNode(), - ValidatorNode: NewValidatorNode(), - BeaconNodeFollower: NewBeaconNodeFollower(), GethNode2: NewGethNode2(), } } @@ -173,13 +189,22 @@ 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) + 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() } diff --git a/tests/ctrl/services.go b/tests/ctrl/services.go index e193e11..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 { @@ -18,36 +17,34 @@ type Service interface { Started() <-chan struct{} } -func NewBeaconNode() Service { - url := fmt.Sprintf("http://%s/eth/v1/beacon/genesis", shared.BeaconGatewayGRPC) - return newDockerService("beacon-node", url) +func NewBeaconNode(clientName string) Service { + url := fmt.Sprintf("http://%s/eth/v1/beacon/genesis", shared.BeaconAPI) + 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.ValidatorAPI) } -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(clientName string) Service { + url := fmt.Sprintf("http://%s/eth/v1/beacon/genesis", shared.BeaconFollowerAPI) + return newDockerService(fmt.Sprintf("%s-beacon-node-follower", clientName), url) } -func NewBeaconNodeFollower() Service { - url := fmt.Sprintf("http://%s/eth/v1/beacon/genesis", shared.BeaconGatewayFollowerGRPC) - return newDockerService("beacon-node-follower", url) +func GetBeaconNodeClient(ctx context.Context) (*beacon.Client, error) { + client, err := beacon.NewClient(shared.BeaconAPI) + if err != nil { + return nil, fmt.Errorf("%w: failed to create beacon API client", err) + } + 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 f2ef894..cf140ce 100644 --- a/tests/fee-market/main.go +++ b/tests/fee-market/main.go @@ -3,10 +3,11 @@ package main import ( "bytes" "context" - "fmt" "log" "math/big" + "os" "sort" + "strconv" "sync" "time" @@ -20,9 +21,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" ) func GetBlob() types.Blobs { @@ -35,11 +35,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() @@ -66,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...) } @@ -86,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) { @@ -94,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 { @@ -222,27 +232,23 @@ 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) []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.GetBlockV2(ctx, req) + block, err := util.GetBlock(ctx, client, beacon.IdFromSlot(slot)) if err != nil { - log.Fatalf("beaconchainclient.GetBlock: %v", err) + log.Fatalf("Failed to 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) - } + + if len(block.Data.Message.Body.BlobKzgs) != 0 { + blocks = append(blocks, block) } slot = slot.Add(1) 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 { 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") diff --git a/tests/util/util.go b/tests/util/util.go index 1f0d7a2..113394a 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,55 @@ 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 Body struct { + BlobKzgs []string `json:"blob_kzgs"` +} + +type Message struct { + Slot string + Body Body +} + +type Data struct { + Message Message +} + +type Block struct { + Data Data +} + +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) } - return header.Data.Header.Message.Slot + var block Block + err = json.Unmarshal(blockJSON, &block) + if err != nil { + 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 parse beacon chain head slot: %v", err) + } + 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,17 +100,13 @@ 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) + block, err := GetBlock(ctx, client, beacon.IdFromSlot(slot)) 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 - } + + if len(block.Data.Message.Body.BlobKzgs) != 0 { + return slot } slot = slot.Add(1) @@ -152,8 +174,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{