Geth 1.13 (Cancun) update #8
52
.github/workflows/test.yml
vendored
52
.github/workflows/test.yml
vendored
@ -12,9 +12,8 @@ on:
|
|||||||
- ci-test
|
- ci-test
|
||||||
|
|
||||||
env:
|
env:
|
||||||
# Needed until we can incorporate docker startup into the executor container
|
SO_VERSION: v1.1.0-36d4969-202407091537
|
||||||
DOCKER_HOST: unix:///var/run/dind.sock
|
FIXTURENET_ETH_STACKS_REF: main
|
||||||
SO_VERSION: v1.1.0-e0b5318-202309201927 # contains fixes for plugeth stack
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
unit-tests:
|
unit-tests:
|
||||||
@ -26,18 +25,9 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
go-version-file: 'go.mod'
|
go-version-file: 'go.mod'
|
||||||
check-latest: true
|
check-latest: true
|
||||||
- name: Run dockerd
|
|
||||||
run: |
|
|
||||||
dockerd -H $DOCKER_HOST --userland-proxy=false &
|
|
||||||
sleep 5
|
|
||||||
- name: Run DB container
|
- name: Run DB container
|
||||||
run: |
|
run: |
|
||||||
docker compose -f test/compose-db.yml up --wait --quiet-pull
|
docker compose -f test/compose-db.yml up --wait --quiet-pull
|
||||||
- name: Set access token
|
|
||||||
env:
|
|
||||||
TOKEN: ${{ secrets.CICD_REPO_TOKEN }}
|
|
||||||
run: |
|
|
||||||
git config --global url."https://$TOKEN:@git.vdb.to/".insteadOf https://git.vdb.to/
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: go test -p 1 -v ./pkg/...
|
run: go test -p 1 -v ./pkg/...
|
||||||
|
|
||||||
@ -50,21 +40,16 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
go-version-file: 'go.mod'
|
go-version-file: 'go.mod'
|
||||||
check-latest: true
|
check-latest: true
|
||||||
- name: Run dockerd
|
|
||||||
run: |
|
|
||||||
dockerd -H $DOCKER_HOST --userland-proxy=false &
|
|
||||||
sleep 5
|
|
||||||
- name: Set Gitea access token
|
|
||||||
env:
|
|
||||||
TOKEN: ${{ secrets.CICD_REPO_TOKEN }}
|
|
||||||
run: |
|
|
||||||
git config --global url."https://$TOKEN:@git.vdb.to/".insteadOf https://git.vdb.to/
|
|
||||||
|
|
||||||
- name: Install jq
|
# At present the stock setup-python action fails on Linux/aarch64
|
||||||
env:
|
# Conditional steps below workaroud this by using deadsnakes for that case only
|
||||||
DEBIAN_FRONTEND: noninteractive
|
- name: "Install Python for ARM on Linux"
|
||||||
run: apt-get update && apt-get install -y jq
|
if: ${{ runner.arch == 'arm64' && runner.os == 'Linux' }}
|
||||||
- name: Install Python
|
uses: deadsnakes/action@v3.0.1
|
||||||
|
with:
|
||||||
|
python-version: 3.11
|
||||||
|
- name: "Install Python cases other than ARM on Linux"
|
||||||
|
if: ${{ ! (runner.arch == 'arm64' && runner.os == 'Linux') }}
|
||||||
uses: actions/setup-python@v4
|
uses: actions/setup-python@v4
|
||||||
with:
|
with:
|
||||||
python-version: '3.11'
|
python-version: '3.11'
|
||||||
@ -75,24 +60,31 @@ jobs:
|
|||||||
ref: ${{ env.SO_VERSION }}
|
ref: ${{ env.SO_VERSION }}
|
||||||
path: ./stack-orchestrator
|
path: ./stack-orchestrator
|
||||||
- run: pip install ./stack-orchestrator
|
- run: pip install ./stack-orchestrator
|
||||||
|
- name: Clone fixturenet stack repo
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
repository: cerc-io/fixturenet-eth-stacks
|
||||||
|
ref: ${{ env.FIXTURENET_ETH_STACKS_REF }}
|
||||||
|
path: ./fixturenet-eth-stacks
|
||||||
|
progress: false
|
||||||
|
|
||||||
- name: Run testnet stack
|
- name: Run testnet stack
|
||||||
env:
|
env:
|
||||||
CERC_GO_AUTH_TOKEN: ${{ secrets.CICD_REPO_TOKEN }}
|
CERC_GO_AUTH_TOKEN: ${{ secrets.CICD_REPO_TOKEN }}
|
||||||
run: ./scripts/integration-setup.sh
|
run: ./scripts/run-test-stack.sh ./fixturenet-eth-stacks/stack-orchestrator/stacks/fixturenet-plugeth
|
||||||
- name: Run contract deployer
|
- name: Run contract deployer
|
||||||
run: |
|
run: |
|
||||||
docker compose -f test/compose-deployer.yml up --wait --quiet-pull
|
docker compose -f test/compose-deployer.yml up --wait --quiet-pull
|
||||||
- name: Wait for testnet
|
- name: Wait for testnet
|
||||||
run: |
|
run: |
|
||||||
# Start validator at current head, but not before Merge (block 1 on test chain)
|
# Start validator at current head, but not before Merge (block 1 on test chain)
|
||||||
echo "Waiting for chain head to progress..."
|
|
||||||
while
|
while
|
||||||
|
echo "Waiting for chain head to progress..."
|
||||||
height=$(./scripts/get-block-number.sh $ETH_HTTP_PATH)
|
height=$(./scripts/get-block-number.sh $ETH_HTTP_PATH)
|
||||||
[[ "$height" < 2 ]];
|
[[ "$height" -lt 2 ]];
|
||||||
do sleep 5; done
|
do sleep 5; done
|
||||||
echo "Chain has reached block $height"
|
echo "Chain has reached block $height"
|
||||||
echo VALIDATE_FROM_BLOCK=$height >> "$GITHUB_ENV"
|
echo VALIDATE_FROM_BLOCK=$height >> "$GITHUB_ENV"
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: |
|
run: |
|
||||||
go test ./integration/... -v -timeout=20m
|
go test -v -p 1 ./integration/... -timeout=20m
|
||||||
|
11
Makefile
11
Makefile
@ -1,18 +1,13 @@
|
|||||||
CONTRACTS_DIR := ./test/contract/contracts
|
CONTRACTS_DIR := ./test/contract/contracts
|
||||||
CONTRACTS_OUTPUT_DIR := ./internal/testdata/build
|
CONTRACTS_OUTPUT_DIR := ./internal/testdata/build
|
||||||
|
|
||||||
GINKGO := go run github.com/onsi/ginkgo/v2/ginkgo
|
CONTRACTS := GLDToken Test
|
||||||
|
|
||||||
contracts: $(CONTRACTS_OUTPUT_DIR)/Test.bin $(CONTRACTS_OUTPUT_DIR)/Test.abi
|
contracts: $(foreach C,$(CONTRACTS), $(CONTRACTS_OUTPUT_DIR)/$C.bin $(CONTRACTS_OUTPUT_DIR)/$C.abi)
|
||||||
.PHONY: contracts
|
.PHONY: contracts
|
||||||
|
|
||||||
# Solidity 0.8.20 defaults to the Shanghai fork which includes the PUSH0 opcode
|
|
||||||
# which our testnet doesn't yet support, so use Paris.
|
|
||||||
$(CONTRACTS_OUTPUT_DIR)/%.bin $(CONTRACTS_OUTPUT_DIR)/%.abi: $(CONTRACTS_DIR)/%.sol
|
|
||||||
solc $< --abi --bin -o $(CONTRACTS_OUTPUT_DIR) --overwrite --evm-version=paris
|
|
||||||
|
|
||||||
test: contracts
|
test: contracts
|
||||||
$(GINKGO) -v -r ./validator_test
|
go test -p 1 -v ./pkg/...
|
||||||
.PHONY: test
|
.PHONY: test
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
325
go.mod
325
go.mod
@ -1,158 +1,137 @@
|
|||||||
module github.com/cerc-io/ipld-eth-db-validator/v5
|
module github.com/cerc-io/ipld-eth-db-validator/v5
|
||||||
|
|
||||||
go 1.19
|
go 1.21
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/cerc-io/ipfs-ethdb/v5 v5.0.1-alpha
|
github.com/cerc-io/ipfs-ethdb/v5 v5.1.0-alpha
|
||||||
github.com/cerc-io/ipld-eth-server/v5 v5.1.1-alpha
|
github.com/cerc-io/ipld-eth-server/v5 v5.3.0-alpha
|
||||||
github.com/cerc-io/ipld-eth-statedb v0.0.5-alpha
|
github.com/cerc-io/ipld-eth-statedb v0.1.1
|
||||||
github.com/cerc-io/plugeth-statediff v0.1.1
|
github.com/cerc-io/plugeth-statediff v0.3.2
|
||||||
github.com/ethereum/go-ethereum v1.11.6
|
github.com/ethereum/go-ethereum v1.13.14
|
||||||
|
github.com/holiman/uint256 v1.2.4
|
||||||
github.com/jmoiron/sqlx v1.3.5
|
github.com/jmoiron/sqlx v1.3.5
|
||||||
github.com/onsi/ginkgo/v2 v2.9.2
|
github.com/onsi/ginkgo/v2 v2.15.0
|
||||||
github.com/onsi/gomega v1.27.4
|
github.com/onsi/gomega v1.30.0
|
||||||
github.com/prometheus/client_golang v1.16.0
|
github.com/prometheus/client_golang v1.18.0
|
||||||
github.com/sirupsen/logrus v1.9.0
|
github.com/sirupsen/logrus v1.9.3
|
||||||
github.com/spf13/cobra v1.4.0
|
github.com/spf13/cobra v1.8.0
|
||||||
github.com/spf13/viper v1.11.0
|
github.com/spf13/viper v1.18.2
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
bazil.org/fuse v0.0.0-20200117225306-7b5117fecadc // indirect
|
bazil.org/fuse v0.0.0-20200117225306-7b5117fecadc // indirect
|
||||||
github.com/DataDog/zstd v1.5.5 // indirect
|
github.com/DataDog/zstd v1.5.5 // indirect
|
||||||
github.com/VictoriaMetrics/fastcache v1.12.1 // indirect
|
github.com/Jorropo/jsync v1.0.1 // indirect
|
||||||
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect
|
github.com/Microsoft/go-winio v0.6.1 // indirect
|
||||||
github.com/benbjohnson/clock v1.3.0 // indirect
|
github.com/VictoriaMetrics/fastcache v1.12.2 // indirect
|
||||||
|
github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 // indirect
|
||||||
|
github.com/benbjohnson/clock v1.3.5 // indirect
|
||||||
github.com/beorn7/perks v1.0.1 // indirect
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
|
github.com/bits-and-blooms/bitset v1.10.0 // indirect
|
||||||
github.com/blang/semver/v4 v4.0.0 // indirect
|
github.com/blang/semver/v4 v4.0.0 // indirect
|
||||||
github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect
|
github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect
|
||||||
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 // indirect
|
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 // indirect
|
||||||
github.com/cenkalti/backoff v2.2.1+incompatible // indirect
|
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
|
||||||
github.com/cenkalti/backoff/v4 v4.1.3 // indirect
|
github.com/cerc-io/eth-ipfs-state-validator/v5 v5.2.0-alpha // indirect
|
||||||
github.com/cerc-io/eth-ipfs-state-validator/v5 v5.0.0-alpha // indirect
|
github.com/cerc-io/eth-iterator-utils v0.3.1 // indirect
|
||||||
github.com/cerc-io/eth-iterator-utils v0.1.1 // indirect
|
|
||||||
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
||||||
github.com/cockroachdb/errors v1.10.0 // indirect
|
github.com/cockroachdb/errors v1.10.0 // indirect
|
||||||
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
|
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
|
||||||
github.com/cockroachdb/pebble v0.0.0-20230720154706-692f3b61a3c4 // indirect
|
github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect
|
||||||
github.com/cockroachdb/redact v1.1.5 // indirect
|
github.com/cockroachdb/redact v1.1.5 // indirect
|
||||||
github.com/cockroachdb/tokenbucket v0.0.0-20230613231145-182959a1fad6 // indirect
|
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
|
||||||
github.com/containerd/cgroups v1.0.4 // indirect
|
github.com/consensys/bavard v0.1.13 // indirect
|
||||||
|
github.com/consensys/gnark-crypto v0.12.1 // indirect
|
||||||
|
github.com/containerd/cgroups v1.1.0 // indirect
|
||||||
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
|
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
|
github.com/crackcomm/go-gitignore v0.0.0-20231225121904-e25f5bc08668 // indirect
|
||||||
github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 // indirect
|
github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 // indirect
|
||||||
|
github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect
|
||||||
github.com/cskr/pubsub v1.0.2 // indirect
|
github.com/cskr/pubsub v1.0.2 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||||
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect
|
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect
|
||||||
github.com/deckarep/golang-set/v2 v2.3.0 // indirect
|
github.com/deckarep/golang-set/v2 v2.3.0 // indirect
|
||||||
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect
|
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect
|
||||||
github.com/docker/go-units v0.5.0 // indirect
|
github.com/docker/go-units v0.5.0 // indirect
|
||||||
github.com/dustin/go-humanize v1.0.0 // indirect
|
github.com/dustin/go-humanize v1.0.1 // indirect
|
||||||
github.com/edsrzf/mmap-go v1.0.0 // indirect
|
|
||||||
github.com/elastic/gosigar v0.14.2 // indirect
|
github.com/elastic/gosigar v0.14.2 // indirect
|
||||||
github.com/emirpasic/gods v1.18.1 // indirect
|
github.com/ethereum/c-kzg-4844 v0.4.0 // indirect
|
||||||
github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 // indirect
|
github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 // indirect
|
||||||
github.com/fjl/memsize v0.0.1 // indirect
|
github.com/flynn/noise v1.1.0 // indirect
|
||||||
github.com/flynn/noise v1.0.0 // indirect
|
|
||||||
github.com/francoispqt/gojay v1.2.13 // indirect
|
github.com/francoispqt/gojay v1.2.13 // indirect
|
||||||
github.com/fsnotify/fsnotify v1.6.0 // indirect
|
github.com/fsnotify/fsnotify v1.7.0 // indirect
|
||||||
|
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
|
||||||
github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect
|
github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect
|
||||||
github.com/georgysavva/scany v1.2.1 // indirect
|
github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect
|
||||||
|
github.com/georgysavva/scany v0.2.9 // indirect
|
||||||
github.com/getsentry/sentry-go v0.22.0 // indirect
|
github.com/getsentry/sentry-go v0.22.0 // indirect
|
||||||
github.com/go-logr/logr v1.2.4 // indirect
|
github.com/go-logr/logr v1.4.1 // indirect
|
||||||
github.com/go-logr/stdr v1.2.2 // indirect
|
github.com/go-logr/stdr v1.2.2 // indirect
|
||||||
github.com/go-ole/go-ole v1.2.6 // indirect
|
github.com/go-ole/go-ole v1.3.0 // indirect
|
||||||
github.com/go-stack/stack v1.8.1 // indirect
|
github.com/go-stack/stack v1.8.1 // indirect
|
||||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
|
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
|
||||||
github.com/godbus/dbus/v5 v5.1.0 // indirect
|
github.com/godbus/dbus/v5 v5.1.0 // indirect
|
||||||
github.com/gofrs/flock v0.8.1 // indirect
|
github.com/gofrs/flock v0.8.1 // indirect
|
||||||
github.com/gogo/protobuf v1.3.2 // indirect
|
github.com/gogo/protobuf v1.3.2 // indirect
|
||||||
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
|
|
||||||
github.com/golang/mock v1.6.0 // indirect
|
|
||||||
github.com/golang/protobuf v1.5.3 // indirect
|
github.com/golang/protobuf v1.5.3 // indirect
|
||||||
github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect
|
github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect
|
||||||
github.com/google/go-cmp v0.5.9 // indirect
|
github.com/google/go-cmp v0.6.0 // indirect
|
||||||
github.com/google/gopacket v1.1.19 // indirect
|
github.com/google/gopacket v1.1.19 // indirect
|
||||||
github.com/google/pprof v0.0.0-20230406165453-00490a63f317 // indirect
|
github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5 // indirect
|
||||||
github.com/google/uuid v1.3.0 // indirect
|
github.com/google/uuid v1.6.0 // indirect
|
||||||
github.com/gorilla/mux v1.8.0 // indirect
|
github.com/gorilla/websocket v1.5.1 // indirect
|
||||||
github.com/gorilla/websocket v1.5.0 // indirect
|
|
||||||
github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e // indirect
|
|
||||||
github.com/hashicorp/errwrap v1.1.0 // indirect
|
github.com/hashicorp/errwrap v1.1.0 // indirect
|
||||||
github.com/hashicorp/go-bexpr v0.1.12 // indirect
|
|
||||||
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
||||||
github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect
|
github.com/hashicorp/golang-lru v1.0.2 // indirect
|
||||||
|
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
|
||||||
github.com/hashicorp/hcl v1.0.0 // indirect
|
github.com/hashicorp/hcl v1.0.0 // indirect
|
||||||
github.com/holiman/bloomfilter/v2 v2.0.3 // indirect
|
github.com/holiman/bloomfilter/v2 v2.0.3 // indirect
|
||||||
github.com/holiman/uint256 v1.2.3 // indirect
|
github.com/huin/goupnp v1.3.0 // indirect
|
||||||
github.com/huin/goupnp v1.2.0 // indirect
|
|
||||||
github.com/inconshreveable/log15 v2.16.0+incompatible // indirect
|
github.com/inconshreveable/log15 v2.16.0+incompatible // indirect
|
||||||
github.com/inconshreveable/mousetrap v1.0.0 // indirect
|
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||||
github.com/ipfs/bbloom v0.0.4 // indirect
|
github.com/ipfs/bbloom v0.0.4 // indirect
|
||||||
github.com/ipfs/go-bitfield v1.0.0 // indirect
|
github.com/ipfs/boxo v0.19.0 // indirect
|
||||||
github.com/ipfs/go-bitswap v0.11.0 // indirect
|
github.com/ipfs/go-bitfield v1.1.0 // indirect
|
||||||
github.com/ipfs/go-block-format v0.0.3 // indirect
|
github.com/ipfs/go-block-format v0.2.0 // indirect
|
||||||
github.com/ipfs/go-blockservice v0.5.0 // indirect
|
|
||||||
github.com/ipfs/go-cid v0.4.1 // indirect
|
github.com/ipfs/go-cid v0.4.1 // indirect
|
||||||
github.com/ipfs/go-cidutil v0.1.0 // indirect
|
github.com/ipfs/go-cidutil v0.1.0 // indirect
|
||||||
github.com/ipfs/go-datastore v0.6.0 // indirect
|
github.com/ipfs/go-datastore v0.6.0 // indirect
|
||||||
github.com/ipfs/go-delegated-routing v0.7.0 // indirect
|
|
||||||
github.com/ipfs/go-ds-measure v0.2.0 // indirect
|
github.com/ipfs/go-ds-measure v0.2.0 // indirect
|
||||||
github.com/ipfs/go-fetcher v1.6.1 // indirect
|
|
||||||
github.com/ipfs/go-filestore v1.2.0 // indirect
|
|
||||||
github.com/ipfs/go-fs-lock v0.0.7 // indirect
|
github.com/ipfs/go-fs-lock v0.0.7 // indirect
|
||||||
github.com/ipfs/go-graphsync v0.14.1 // indirect
|
|
||||||
github.com/ipfs/go-ipfs-blockstore v1.2.0 // indirect
|
|
||||||
github.com/ipfs/go-ipfs-chunker v0.0.5 // indirect
|
|
||||||
github.com/ipfs/go-ipfs-delay v0.0.1 // indirect
|
github.com/ipfs/go-ipfs-delay v0.0.1 // indirect
|
||||||
github.com/ipfs/go-ipfs-ds-help v1.1.0 // indirect
|
github.com/ipfs/go-ipfs-ds-help v1.1.0 // indirect
|
||||||
github.com/ipfs/go-ipfs-exchange-interface v0.2.0 // indirect
|
github.com/ipfs/go-ipfs-pq v0.0.3 // indirect
|
||||||
github.com/ipfs/go-ipfs-exchange-offline v0.3.0 // indirect
|
github.com/ipfs/go-ipfs-redirects-file v0.1.1 // indirect
|
||||||
github.com/ipfs/go-ipfs-keystore v0.1.0 // indirect
|
github.com/ipfs/go-ipfs-util v0.0.3 // indirect
|
||||||
github.com/ipfs/go-ipfs-pinner v0.2.1 // indirect
|
github.com/ipfs/go-ipld-cbor v0.1.0 // indirect
|
||||||
github.com/ipfs/go-ipfs-posinfo v0.0.1 // indirect
|
github.com/ipfs/go-ipld-format v0.6.0 // indirect
|
||||||
github.com/ipfs/go-ipfs-pq v0.0.2 // indirect
|
github.com/ipfs/go-ipld-legacy v0.2.1 // indirect
|
||||||
github.com/ipfs/go-ipfs-provider v0.8.1 // indirect
|
|
||||||
github.com/ipfs/go-ipfs-routing v0.3.0 // indirect
|
|
||||||
github.com/ipfs/go-ipfs-util v0.0.2 // indirect
|
|
||||||
github.com/ipfs/go-ipld-cbor v0.0.6 // indirect
|
|
||||||
github.com/ipfs/go-ipld-format v0.4.0 // indirect
|
|
||||||
github.com/ipfs/go-ipld-legacy v0.1.1 // indirect
|
|
||||||
github.com/ipfs/go-ipns v0.3.0 // indirect
|
|
||||||
github.com/ipfs/go-libipfs v0.2.0 // indirect
|
|
||||||
github.com/ipfs/go-log v1.0.5 // indirect
|
github.com/ipfs/go-log v1.0.5 // indirect
|
||||||
github.com/ipfs/go-log/v2 v2.5.1 // indirect
|
github.com/ipfs/go-log/v2 v2.5.1 // indirect
|
||||||
github.com/ipfs/go-merkledag v0.9.0 // indirect
|
|
||||||
github.com/ipfs/go-metrics-interface v0.0.1 // indirect
|
github.com/ipfs/go-metrics-interface v0.0.1 // indirect
|
||||||
github.com/ipfs/go-mfs v0.2.1 // indirect
|
github.com/ipfs/go-peertaskqueue v0.8.1 // indirect
|
||||||
github.com/ipfs/go-namesys v0.6.0 // indirect
|
github.com/ipfs/go-unixfsnode v1.9.0 // indirect
|
||||||
github.com/ipfs/go-path v0.3.0 // indirect
|
github.com/ipfs/kubo v0.27.0 // indirect
|
||||||
github.com/ipfs/go-peertaskqueue v0.8.0 // indirect
|
github.com/ipld/go-car/v2 v2.13.1 // indirect
|
||||||
github.com/ipfs/go-unixfs v0.4.2 // indirect
|
github.com/ipld/go-codec-dagpb v1.6.0 // indirect
|
||||||
github.com/ipfs/go-unixfsnode v1.5.1 // indirect
|
github.com/ipld/go-ipld-prime v0.21.0 // indirect
|
||||||
github.com/ipfs/go-verifcid v0.0.2 // indirect
|
|
||||||
github.com/ipfs/interface-go-ipfs-core v0.8.2 // indirect
|
|
||||||
github.com/ipfs/kubo v0.18.1 // indirect
|
|
||||||
github.com/ipld/edelweiss v0.2.0 // indirect
|
|
||||||
github.com/ipld/go-codec-dagpb v1.5.0 // indirect
|
|
||||||
github.com/ipld/go-ipld-prime v0.19.0 // indirect
|
|
||||||
github.com/jackc/chunkreader/v2 v2.0.1 // indirect
|
github.com/jackc/chunkreader/v2 v2.0.1 // indirect
|
||||||
github.com/jackc/pgconn v1.14.0 // indirect
|
github.com/jackc/pgconn v1.14.3 // indirect
|
||||||
github.com/jackc/pgio v1.0.0 // indirect
|
github.com/jackc/pgio v1.0.0 // indirect
|
||||||
github.com/jackc/pgpassfile v1.0.0 // indirect
|
github.com/jackc/pgpassfile v1.0.0 // indirect
|
||||||
github.com/jackc/pgproto3/v2 v2.3.2 // indirect
|
github.com/jackc/pgproto3/v2 v2.3.3 // indirect
|
||||||
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
|
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
|
||||||
github.com/jackc/pgtype v1.14.0 // indirect
|
github.com/jackc/pgtype v1.14.0 // indirect
|
||||||
github.com/jackc/pgx/v4 v4.18.1 // indirect
|
github.com/jackc/pgx/v4 v4.18.3 // indirect
|
||||||
github.com/jackc/puddle v1.3.0 // indirect
|
github.com/jackc/puddle v1.3.0 // indirect
|
||||||
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
|
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
|
||||||
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
|
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
|
||||||
github.com/jbenet/goprocess v0.1.4 // indirect
|
github.com/jbenet/goprocess v0.1.4 // indirect
|
||||||
github.com/jinzhu/inflection v1.0.0 // indirect
|
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||||
github.com/jinzhu/now v1.1.4 // indirect
|
github.com/jinzhu/now v1.1.4 // indirect
|
||||||
github.com/klauspost/compress v1.16.7 // indirect
|
github.com/klauspost/compress v1.17.6 // indirect
|
||||||
github.com/klauspost/cpuid/v2 v2.2.5 // indirect
|
github.com/klauspost/cpuid/v2 v2.2.7 // indirect
|
||||||
github.com/koron/go-ssdp v0.0.3 // indirect
|
github.com/koron/go-ssdp v0.0.4 // indirect
|
||||||
github.com/kr/pretty v0.3.1 // indirect
|
github.com/kr/pretty v0.3.1 // indirect
|
||||||
github.com/kr/text v0.2.0 // indirect
|
github.com/kr/text v0.2.0 // indirect
|
||||||
github.com/lib/pq v1.10.9 // indirect
|
github.com/lib/pq v1.10.9 // indirect
|
||||||
@ -160,136 +139,136 @@ require (
|
|||||||
github.com/libp2p/go-cidranger v1.1.0 // indirect
|
github.com/libp2p/go-cidranger v1.1.0 // indirect
|
||||||
github.com/libp2p/go-doh-resolver v0.4.0 // indirect
|
github.com/libp2p/go-doh-resolver v0.4.0 // indirect
|
||||||
github.com/libp2p/go-flow-metrics v0.1.0 // indirect
|
github.com/libp2p/go-flow-metrics v0.1.0 // indirect
|
||||||
github.com/libp2p/go-libp2p v0.24.2 // indirect
|
github.com/libp2p/go-libp2p v0.33.0 // indirect
|
||||||
github.com/libp2p/go-libp2p-asn-util v0.2.0 // indirect
|
github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect
|
||||||
github.com/libp2p/go-libp2p-kad-dht v0.20.0 // indirect
|
github.com/libp2p/go-libp2p-kad-dht v0.24.4 // indirect
|
||||||
github.com/libp2p/go-libp2p-kbucket v0.5.0 // indirect
|
github.com/libp2p/go-libp2p-kbucket v0.6.3 // indirect
|
||||||
github.com/libp2p/go-libp2p-pubsub v0.8.3 // indirect
|
github.com/libp2p/go-libp2p-pubsub v0.10.0 // indirect
|
||||||
github.com/libp2p/go-libp2p-pubsub-router v0.6.0 // indirect
|
github.com/libp2p/go-libp2p-pubsub-router v0.6.0 // indirect
|
||||||
github.com/libp2p/go-libp2p-record v0.2.0 // indirect
|
github.com/libp2p/go-libp2p-record v0.2.0 // indirect
|
||||||
github.com/libp2p/go-libp2p-routing-helpers v0.6.0 // indirect
|
github.com/libp2p/go-libp2p-routing-helpers v0.7.3 // indirect
|
||||||
github.com/libp2p/go-libp2p-xor v0.1.0 // indirect
|
github.com/libp2p/go-libp2p-xor v0.1.0 // indirect
|
||||||
github.com/libp2p/go-mplex v0.7.0 // indirect
|
github.com/libp2p/go-msgio v0.3.0 // indirect
|
||||||
github.com/libp2p/go-msgio v0.2.0 // indirect
|
github.com/libp2p/go-nat v0.2.0 // indirect
|
||||||
github.com/libp2p/go-nat v0.1.0 // indirect
|
|
||||||
github.com/libp2p/go-netroute v0.2.1 // indirect
|
github.com/libp2p/go-netroute v0.2.1 // indirect
|
||||||
github.com/libp2p/go-openssl v0.1.0 // indirect
|
github.com/libp2p/go-reuseport v0.4.0 // indirect
|
||||||
github.com/libp2p/go-reuseport v0.2.0 // indirect
|
github.com/libp2p/go-yamux/v4 v4.0.1 // indirect
|
||||||
github.com/libp2p/go-yamux/v4 v4.0.0 // indirect
|
|
||||||
github.com/libp2p/zeroconf/v2 v2.2.0 // indirect
|
github.com/libp2p/zeroconf/v2 v2.2.0 // indirect
|
||||||
github.com/lucas-clemente/quic-go v0.31.1 // indirect
|
github.com/magiconair/properties v1.8.7 // indirect
|
||||||
github.com/magiconair/properties v1.8.6 // indirect
|
|
||||||
github.com/mailgun/groupcache/v2 v2.3.0 // indirect
|
github.com/mailgun/groupcache/v2 v2.3.0 // indirect
|
||||||
github.com/marten-seemann/qpack v0.3.0 // indirect
|
|
||||||
github.com/marten-seemann/qtls-go1-18 v0.1.3 // indirect
|
|
||||||
github.com/marten-seemann/qtls-go1-19 v0.1.1 // indirect
|
|
||||||
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
|
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
|
||||||
github.com/marten-seemann/webtransport-go v0.4.3 // indirect
|
|
||||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.19 // indirect
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||||
github.com/mattn/go-pointer v0.0.1 // indirect
|
|
||||||
github.com/mattn/go-runewidth v0.0.14 // indirect
|
github.com/mattn/go-runewidth v0.0.14 // indirect
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
github.com/miekg/dns v1.1.58 // indirect
|
||||||
github.com/miekg/dns v1.1.50 // indirect
|
|
||||||
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
|
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
|
||||||
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
|
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
|
||||||
github.com/minio/sha256-simd v1.0.1 // indirect
|
github.com/minio/sha256-simd v1.0.1 // indirect
|
||||||
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
||||||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||||
github.com/mitchellh/pointerstructure v1.2.1 // indirect
|
github.com/mmcloughlin/addchain v0.4.0 // indirect
|
||||||
github.com/mr-tron/base58 v1.2.0 // indirect
|
github.com/mr-tron/base58 v1.2.0 // indirect
|
||||||
github.com/multiformats/go-base32 v0.1.0 // indirect
|
github.com/multiformats/go-base32 v0.1.0 // indirect
|
||||||
github.com/multiformats/go-base36 v0.2.0 // indirect
|
github.com/multiformats/go-base36 v0.2.0 // indirect
|
||||||
github.com/multiformats/go-multiaddr v0.8.0 // indirect
|
github.com/multiformats/go-multiaddr v0.12.2 // indirect
|
||||||
github.com/multiformats/go-multiaddr-dns v0.3.1 // indirect
|
github.com/multiformats/go-multiaddr-dns v0.3.1 // indirect
|
||||||
github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect
|
github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect
|
||||||
github.com/multiformats/go-multibase v0.2.0 // indirect
|
github.com/multiformats/go-multibase v0.2.0 // indirect
|
||||||
github.com/multiformats/go-multicodec v0.7.0 // indirect
|
github.com/multiformats/go-multicodec v0.9.0 // indirect
|
||||||
github.com/multiformats/go-multihash v0.2.3 // indirect
|
github.com/multiformats/go-multihash v0.2.3 // indirect
|
||||||
github.com/multiformats/go-multistream v0.3.3 // indirect
|
github.com/multiformats/go-multistream v0.5.0 // indirect
|
||||||
github.com/multiformats/go-varint v0.0.7 // indirect
|
github.com/multiformats/go-varint v0.0.7 // indirect
|
||||||
github.com/olekukonko/tablewriter v0.0.5 // indirect
|
github.com/olekukonko/tablewriter v0.0.5 // indirect
|
||||||
github.com/opencontainers/runtime-spec v1.0.2 // indirect
|
github.com/opencontainers/runtime-spec v1.2.0 // indirect
|
||||||
github.com/openrelayxyz/plugeth-utils v1.2.0 // indirect
|
github.com/openrelayxyz/plugeth-utils v1.5.0 // indirect
|
||||||
github.com/opentracing/opentracing-go v1.2.0 // indirect
|
github.com/opentracing/opentracing-go v1.2.0 // indirect
|
||||||
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
|
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
|
||||||
github.com/pelletier/go-toml v1.9.4 // indirect
|
github.com/pelletier/go-toml/v2 v2.1.0 // indirect
|
||||||
github.com/pelletier/go-toml/v2 v2.0.5 // indirect
|
github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect
|
||||||
github.com/pganalyze/pg_query_go/v4 v4.2.1 // indirect
|
github.com/pganalyze/pg_query_go/v4 v4.2.1 // indirect
|
||||||
|
github.com/pion/datachannel v1.5.5 // indirect
|
||||||
|
github.com/pion/dtls/v2 v2.2.8 // indirect
|
||||||
|
github.com/pion/ice/v2 v2.3.11 // indirect
|
||||||
|
github.com/pion/interceptor v0.1.25 // indirect
|
||||||
|
github.com/pion/logging v0.2.2 // indirect
|
||||||
|
github.com/pion/mdns v0.0.9 // indirect
|
||||||
|
github.com/pion/randutil v0.1.0 // indirect
|
||||||
|
github.com/pion/rtcp v1.2.13 // indirect
|
||||||
|
github.com/pion/rtp v1.8.3 // indirect
|
||||||
|
github.com/pion/sctp v1.8.9 // indirect
|
||||||
|
github.com/pion/sdp/v3 v3.0.6 // indirect
|
||||||
|
github.com/pion/srtp/v2 v2.0.18 // indirect
|
||||||
|
github.com/pion/stun v0.6.1 // indirect
|
||||||
|
github.com/pion/transport/v2 v2.2.4 // indirect
|
||||||
|
github.com/pion/turn/v2 v2.1.4 // indirect
|
||||||
|
github.com/pion/webrtc/v3 v3.2.23 // indirect
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||||
github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e // indirect
|
github.com/polydawn/refmt v0.89.0 // indirect
|
||||||
github.com/prometheus/client_model v0.4.0 // indirect
|
github.com/prometheus/client_model v0.6.0 // indirect
|
||||||
github.com/prometheus/common v0.44.0 // indirect
|
github.com/prometheus/common v0.47.0 // indirect
|
||||||
github.com/prometheus/procfs v0.11.0 // indirect
|
github.com/prometheus/procfs v0.12.0 // indirect
|
||||||
|
github.com/quic-go/qpack v0.4.0 // indirect
|
||||||
|
github.com/quic-go/quic-go v0.41.0 // indirect
|
||||||
|
github.com/quic-go/webtransport-go v0.6.0 // indirect
|
||||||
github.com/raulk/go-watchdog v1.3.0 // indirect
|
github.com/raulk/go-watchdog v1.3.0 // indirect
|
||||||
github.com/rivo/uniseg v0.4.4 // indirect
|
github.com/rivo/uniseg v0.4.4 // indirect
|
||||||
github.com/rogpeppe/go-internal v1.11.0 // indirect
|
github.com/rogpeppe/go-internal v1.12.0 // indirect
|
||||||
github.com/rs/cors v1.9.0 // indirect
|
github.com/sagikazarmark/locafero v0.4.0 // indirect
|
||||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
|
||||||
github.com/samber/lo v1.36.0 // indirect
|
github.com/samber/lo v1.39.0 // indirect
|
||||||
github.com/segmentio/fasthash v1.0.3 // indirect
|
github.com/segmentio/fasthash v1.0.3 // indirect
|
||||||
github.com/shirou/gopsutil v3.21.11+incompatible // indirect
|
github.com/shirou/gopsutil v3.21.11+incompatible // indirect
|
||||||
github.com/shopspring/decimal v1.2.0 // indirect
|
github.com/shopspring/decimal v1.2.0 // indirect
|
||||||
github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 // indirect
|
github.com/sourcegraph/conc v0.3.0 // indirect
|
||||||
github.com/spaolacci/murmur3 v1.1.0 // indirect
|
github.com/spaolacci/murmur3 v1.1.0 // indirect
|
||||||
github.com/spf13/afero v1.8.2 // indirect
|
github.com/spf13/afero v1.11.0 // indirect
|
||||||
github.com/spf13/cast v1.4.1 // indirect
|
github.com/spf13/cast v1.6.0 // indirect
|
||||||
github.com/spf13/jwalterweatherman v1.1.0 // indirect
|
|
||||||
github.com/spf13/pflag v1.0.5 // indirect
|
github.com/spf13/pflag v1.0.5 // indirect
|
||||||
github.com/status-im/keycard-go v0.2.0 // indirect
|
github.com/status-im/keycard-go v0.2.0 // indirect
|
||||||
github.com/stretchr/testify v1.8.2 // indirect
|
github.com/stretchr/objx v0.5.2 // indirect
|
||||||
github.com/subosito/gotenv v1.2.0 // indirect
|
github.com/stretchr/testify v1.9.0 // indirect
|
||||||
|
github.com/subosito/gotenv v1.6.0 // indirect
|
||||||
|
github.com/supranational/blst v0.3.11 // indirect
|
||||||
github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect
|
github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect
|
||||||
github.com/thoas/go-funk v0.9.3 // indirect
|
github.com/thoas/go-funk v0.9.3 // indirect
|
||||||
github.com/tklauser/go-sysconf v0.3.11 // indirect
|
github.com/tklauser/go-sysconf v0.3.12 // indirect
|
||||||
github.com/tklauser/numcpus v0.6.1 // indirect
|
github.com/tklauser/numcpus v0.6.1 // indirect
|
||||||
github.com/tyler-smith/go-bip39 v1.1.0 // indirect
|
github.com/tyler-smith/go-bip39 v1.1.0 // indirect
|
||||||
github.com/urfave/cli/v2 v2.25.7 // indirect
|
github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb // indirect
|
||||||
github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc // indirect
|
github.com/whyrusleeping/base32 v0.0.0-20170828182744-c30ac30633cc // indirect
|
||||||
github.com/whyrusleeping/cbor-gen v0.0.0-20221220214510-0333c149dec0 // indirect
|
github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect
|
||||||
|
github.com/whyrusleeping/cbor-gen v0.0.0-20240109153615-66e95c3e8a87 // indirect
|
||||||
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect
|
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect
|
||||||
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect
|
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect
|
||||||
github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 // indirect
|
github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 // indirect
|
||||||
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
|
|
||||||
github.com/yusufpapurcu/wmi v1.2.3 // indirect
|
github.com/yusufpapurcu/wmi v1.2.3 // indirect
|
||||||
go.opencensus.io v0.24.0 // indirect
|
go.opencensus.io v0.24.0 // indirect
|
||||||
go.opentelemetry.io/otel v1.7.0 // indirect
|
go.opentelemetry.io/otel v1.25.0 // indirect
|
||||||
go.opentelemetry.io/otel/trace v1.7.0 // indirect
|
go.opentelemetry.io/otel/metric v1.25.0 // indirect
|
||||||
go.uber.org/atomic v1.10.0 // indirect
|
go.opentelemetry.io/otel/trace v1.25.0 // indirect
|
||||||
go.uber.org/dig v1.15.0 // indirect
|
go.uber.org/dig v1.17.1 // indirect
|
||||||
go.uber.org/fx v1.18.2 // indirect
|
go.uber.org/fx v1.20.1 // indirect
|
||||||
go.uber.org/multierr v1.9.0 // indirect
|
go.uber.org/mock v0.4.0 // indirect
|
||||||
go.uber.org/zap v1.24.0 // indirect
|
go.uber.org/multierr v1.11.0 // indirect
|
||||||
go4.org v0.0.0-20200411211856-f5505b9728dd // indirect
|
go.uber.org/zap v1.27.0 // indirect
|
||||||
golang.org/x/crypto v0.11.0 // indirect
|
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
|
||||||
golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 // indirect
|
golang.org/x/crypto v0.22.0 // indirect
|
||||||
golang.org/x/mod v0.11.0 // indirect
|
golang.org/x/exp v0.0.0-20240409090435-93d18d7e34b8 // indirect
|
||||||
golang.org/x/net v0.10.0 // indirect
|
golang.org/x/mod v0.17.0 // indirect
|
||||||
golang.org/x/sync v0.3.0 // indirect
|
golang.org/x/net v0.24.0 // indirect
|
||||||
golang.org/x/sys v0.10.0 // indirect
|
golang.org/x/sync v0.7.0 // indirect
|
||||||
golang.org/x/term v0.10.0 // indirect
|
golang.org/x/sys v0.19.0 // indirect
|
||||||
golang.org/x/text v0.11.0 // indirect
|
golang.org/x/term v0.19.0 // indirect
|
||||||
golang.org/x/tools v0.8.0 // indirect
|
golang.org/x/text v0.14.0 // indirect
|
||||||
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
|
golang.org/x/tools v0.20.0 // indirect
|
||||||
google.golang.org/protobuf v1.31.0 // indirect
|
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
|
||||||
|
gonum.org/v1/gonum v0.14.0 // indirect
|
||||||
|
google.golang.org/protobuf v1.32.0 // indirect
|
||||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
|
|
||||||
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect
|
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
gorm.io/driver/postgres v1.3.7 // indirect
|
gorm.io/driver/postgres v1.3.7 // indirect
|
||||||
gorm.io/gorm v1.23.5 // indirect
|
gorm.io/gorm v1.23.5 // indirect
|
||||||
lukechampine.com/blake3 v1.2.1 // indirect
|
lukechampine.com/blake3 v1.2.2 // indirect
|
||||||
)
|
rsc.io/tmplfunc v0.0.3 // indirect
|
||||||
|
|
||||||
replace (
|
|
||||||
github.com/cerc-io/eth-ipfs-state-validator/v5 => git.vdb.to/cerc-io/eth-ipfs-state-validator/v5 v5.1.1-alpha
|
|
||||||
github.com/cerc-io/eth-iterator-utils => git.vdb.to/cerc-io/eth-iterator-utils v0.1.2
|
|
||||||
github.com/cerc-io/eth-testing => git.vdb.to/cerc-io/eth-testing v0.3.1
|
|
||||||
github.com/cerc-io/ipld-eth-server/v5 => git.vdb.to/cerc-io/ipld-eth-server/v5 v5.1.2-alpha
|
|
||||||
github.com/cerc-io/ipld-eth-statedb => git.vdb.to/cerc-io/ipld-eth-statedb v0.0.7-alpha
|
|
||||||
github.com/cerc-io/plugeth-statediff => git.vdb.to/cerc-io/plugeth-statediff v0.1.4
|
|
||||||
github.com/ethereum/go-ethereum => git.vdb.to/cerc-io/plugeth v0.0.0-20230808125822-691dc334fab1
|
|
||||||
github.com/openrelayxyz/plugeth-utils => git.vdb.to/cerc-io/plugeth-utils v0.0.0-20230706160122-cd41de354c46
|
|
||||||
)
|
)
|
||||||
|
@ -6,12 +6,12 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/cerc-io/plugeth-statediff/indexer/database/sql/postgres"
|
||||||
"github.com/onsi/gomega"
|
"github.com/onsi/gomega"
|
||||||
. "github.com/onsi/gomega"
|
. "github.com/onsi/gomega"
|
||||||
|
|
||||||
"github.com/cerc-io/ipld-eth-db-validator/v5/cmd" // this registers env vars with viper
|
"github.com/cerc-io/ipld-eth-db-validator/v5/cmd" // this registers env vars with viper
|
||||||
"github.com/cerc-io/ipld-eth-db-validator/v5/integration"
|
"github.com/cerc-io/ipld-eth-db-validator/v5/integration"
|
||||||
"github.com/cerc-io/ipld-eth-db-validator/v5/internal/helpers"
|
|
||||||
"github.com/cerc-io/ipld-eth-db-validator/v5/pkg/validator"
|
"github.com/cerc-io/ipld-eth-db-validator/v5/pkg/validator"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ func setup(t *testing.T, progressChan chan uint64) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
// set the default DB config to the testing defaults
|
// set the default DB config to the testing defaults
|
||||||
cfg.DBConfig, _ = helpers.TestDBConfig.WithEnv()
|
cfg.DBConfig, _ = postgres.TestConfig.WithEnv()
|
||||||
// update the start block if we have already validated past it
|
// update the start block if we have already validated past it
|
||||||
if lastValidated > cfg.FromBlock {
|
if lastValidated > cfg.FromBlock {
|
||||||
cfg.FromBlock = lastValidated
|
cfg.FromBlock = lastValidated
|
||||||
|
@ -1,22 +0,0 @@
|
|||||||
package chaingen
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/accounts/abi"
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
|
||||||
)
|
|
||||||
|
|
||||||
type ContractSpec struct {
|
|
||||||
DeploymentCode []byte
|
|
||||||
ABI abi.ABI
|
|
||||||
}
|
|
||||||
|
|
||||||
func ParseContract(abiStr, binStr string) (*ContractSpec, error) {
|
|
||||||
parsedABI, err := abi.JSON(strings.NewReader(abiStr))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
data := common.Hex2Bytes(binStr)
|
|
||||||
return &ContractSpec{data, parsedABI}, nil
|
|
||||||
}
|
|
@ -1,162 +0,0 @@
|
|||||||
package chaingen
|
|
||||||
|
|
||||||
import (
|
|
||||||
"crypto/ecdsa"
|
|
||||||
"errors"
|
|
||||||
"math/big"
|
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
|
||||||
"github.com/ethereum/go-ethereum/consensus/ethash"
|
|
||||||
"github.com/ethereum/go-ethereum/core"
|
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
|
||||||
"github.com/ethereum/go-ethereum/core/vm"
|
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
|
||||||
"github.com/ethereum/go-ethereum/ethdb"
|
|
||||||
"github.com/ethereum/go-ethereum/params"
|
|
||||||
)
|
|
||||||
|
|
||||||
type GenContext struct {
|
|
||||||
ChainConfig *params.ChainConfig
|
|
||||||
GenFuncs []func(int, *core.BlockGen)
|
|
||||||
DB ethdb.Database
|
|
||||||
|
|
||||||
Keys map[common.Address]*ecdsa.PrivateKey
|
|
||||||
Contracts map[string]*ContractSpec
|
|
||||||
Genesis *types.Block
|
|
||||||
|
|
||||||
block *core.BlockGen // cache the current block for my methods' use
|
|
||||||
deployed map[common.Address]string
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewGenContext(chainConfig *params.ChainConfig, db ethdb.Database) *GenContext {
|
|
||||||
return &GenContext{
|
|
||||||
ChainConfig: chainConfig,
|
|
||||||
DB: db,
|
|
||||||
Keys: make(map[common.Address]*ecdsa.PrivateKey),
|
|
||||||
Contracts: make(map[string]*ContractSpec),
|
|
||||||
|
|
||||||
deployed: make(map[common.Address]string),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (gen *GenContext) AddFunction(fn func(int, *core.BlockGen)) {
|
|
||||||
gen.GenFuncs = append(gen.GenFuncs, fn)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (gen *GenContext) AddOwnedAccount(key *ecdsa.PrivateKey) common.Address {
|
|
||||||
addr := crypto.PubkeyToAddress(key.PublicKey)
|
|
||||||
gen.Keys[addr] = key
|
|
||||||
return addr
|
|
||||||
}
|
|
||||||
|
|
||||||
func (gen *GenContext) AddContract(name string, spec *ContractSpec) {
|
|
||||||
gen.Contracts[name] = spec
|
|
||||||
}
|
|
||||||
|
|
||||||
func (gen *GenContext) generate(i int, block *core.BlockGen) {
|
|
||||||
gen.block = block
|
|
||||||
for _, fn := range gen.GenFuncs {
|
|
||||||
fn(i, block)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MakeChain creates a chain of n blocks starting at and including the genesis block.
|
|
||||||
// the returned hash chain is ordered head->parent.
|
|
||||||
func (gen *GenContext) MakeChain(n int) ([]*types.Block, []types.Receipts, *core.BlockChain) {
|
|
||||||
blocks, receipts := core.GenerateChain(
|
|
||||||
gen.ChainConfig, gen.Genesis, ethash.NewFaker(), gen.DB, n, gen.generate,
|
|
||||||
)
|
|
||||||
chain, err := core.NewBlockChain(gen.DB, nil, nil, nil, ethash.NewFaker(), vm.Config{}, nil, nil)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
return append([]*types.Block{gen.Genesis}, blocks...), receipts, chain
|
|
||||||
}
|
|
||||||
|
|
||||||
func (gen *GenContext) CreateSendTx(from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) {
|
|
||||||
return gen.createTx(from, &to, amount, params.TxGas, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (gen *GenContext) CreateContractTx(from common.Address, contractName string) (*types.Transaction, error) {
|
|
||||||
contract := gen.Contracts[contractName]
|
|
||||||
if contract == nil {
|
|
||||||
return nil, errors.New("No contract with name " + contractName)
|
|
||||||
}
|
|
||||||
return gen.createTx(from, nil, big.NewInt(0), 1000000, contract.DeploymentCode)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (gen *GenContext) CreateCallTx(from common.Address, to common.Address, methodName string, args ...interface{}) (*types.Transaction, error) {
|
|
||||||
contractName, ok := gen.deployed[to]
|
|
||||||
if !ok {
|
|
||||||
return nil, errors.New("No contract deployed at address " + to.String())
|
|
||||||
}
|
|
||||||
contract := gen.Contracts[contractName]
|
|
||||||
if contract == nil {
|
|
||||||
return nil, errors.New("No contract with name " + contractName)
|
|
||||||
}
|
|
||||||
|
|
||||||
packed, err := contract.ABI.Pack(methodName, args...)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
return gen.createTx(from, &to, big.NewInt(0), 100000, packed)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (gen *GenContext) DeployContract(from common.Address, contractName string) (common.Address, error) {
|
|
||||||
tx, err := gen.CreateContractTx(from, contractName)
|
|
||||||
if err != nil {
|
|
||||||
return common.Address{}, err
|
|
||||||
}
|
|
||||||
addr := crypto.CreateAddress(from, gen.block.TxNonce(from))
|
|
||||||
gen.deployed[addr] = contractName
|
|
||||||
gen.block.AddTx(tx)
|
|
||||||
return addr, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (gen *GenContext) createTx(from common.Address, to *common.Address, amount *big.Int, gasLimit uint64, data []byte) (*types.Transaction, error) {
|
|
||||||
signer := types.MakeSigner(gen.ChainConfig, gen.block.Number())
|
|
||||||
nonce := gen.block.TxNonce(from)
|
|
||||||
priv, ok := gen.Keys[from]
|
|
||||||
if !ok {
|
|
||||||
return nil, errors.New("No private key for sender address" + from.String())
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx *types.Transaction
|
|
||||||
if gen.ChainConfig.IsLondon(gen.block.Number()) {
|
|
||||||
tx = types.NewTx(&types.DynamicFeeTx{
|
|
||||||
ChainID: gen.ChainConfig.ChainID,
|
|
||||||
Nonce: nonce,
|
|
||||||
To: to,
|
|
||||||
Gas: gasLimit,
|
|
||||||
GasTipCap: big.NewInt(50),
|
|
||||||
GasFeeCap: big.NewInt(1000000000),
|
|
||||||
Value: amount,
|
|
||||||
Data: data,
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
tx = types.NewTx(&types.LegacyTx{
|
|
||||||
Nonce: nonce,
|
|
||||||
To: to,
|
|
||||||
Value: amount,
|
|
||||||
Gas: gasLimit,
|
|
||||||
Data: data,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return types.SignTx(tx, signer, priv)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (gen *GenContext) CreateLondonTx(block *core.BlockGen, addr *common.Address, key *ecdsa.PrivateKey) (*types.Transaction, error) {
|
|
||||||
londonTrx := types.NewTx(&types.DynamicFeeTx{
|
|
||||||
ChainID: gen.ChainConfig.ChainID,
|
|
||||||
Nonce: block.TxNonce(*addr),
|
|
||||||
GasTipCap: big.NewInt(50),
|
|
||||||
GasFeeCap: big.NewInt(1000000000),
|
|
||||||
Gas: 21000,
|
|
||||||
To: addr,
|
|
||||||
Value: big.NewInt(1000),
|
|
||||||
Data: []byte{},
|
|
||||||
})
|
|
||||||
|
|
||||||
transactionSigner := types.MakeSigner(gen.ChainConfig, block.Number())
|
|
||||||
return types.SignTx(londonTrx, transactionSigner, key)
|
|
||||||
}
|
|
@ -4,6 +4,7 @@ import (
|
|||||||
"math/big"
|
"math/big"
|
||||||
|
|
||||||
"github.com/cerc-io/plugeth-statediff/test_helpers"
|
"github.com/cerc-io/plugeth-statediff/test_helpers"
|
||||||
|
"github.com/cerc-io/plugeth-statediff/test_helpers/chaingen"
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/core"
|
"github.com/ethereum/go-ethereum/core"
|
||||||
"github.com/ethereum/go-ethereum/ethdb"
|
"github.com/ethereum/go-ethereum/ethdb"
|
||||||
@ -16,20 +17,20 @@ var (
|
|||||||
bank, acct1, acct2 common.Address
|
bank, acct1, acct2 common.Address
|
||||||
contractAddr common.Address
|
contractAddr common.Address
|
||||||
contractDataRoot string
|
contractDataRoot string
|
||||||
defaultContract *ContractSpec
|
defaultContract *chaingen.ContractSpec
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
var err error
|
var err error
|
||||||
defaultContract, err = ParseContract(testdata.TestContractABI, testdata.TestContractCode)
|
defaultContract, err = chaingen.ParseContract(testdata.TestContractABI, testdata.TestContractCode)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// A GenContext which exactly replicates the chain generator used in existing tests
|
// A GenContext which exactly replicates the chain generator used in existing tests
|
||||||
func DefaultGenContext(chainConfig *params.ChainConfig, db ethdb.Database) *GenContext {
|
func DefaultGenContext(chainConfig *params.ChainConfig, db ethdb.Database) *chaingen.GenContext {
|
||||||
gen := NewGenContext(chainConfig, db)
|
gen := chaingen.NewGenContext(chainConfig, db)
|
||||||
bank = gen.AddOwnedAccount(test_helpers.TestBankKey)
|
bank = gen.AddOwnedAccount(test_helpers.TestBankKey)
|
||||||
acct1 = gen.AddOwnedAccount(test_helpers.Account1Key)
|
acct1 = gen.AddOwnedAccount(test_helpers.Account1Key)
|
||||||
acct2 = gen.AddOwnedAccount(test_helpers.Account2Key)
|
acct2 = gen.AddOwnedAccount(test_helpers.Account2Key)
|
||||||
@ -46,7 +47,7 @@ func DefaultGenContext(chainConfig *params.ChainConfig, db ethdb.Database) *GenC
|
|||||||
return gen
|
return gen
|
||||||
}
|
}
|
||||||
|
|
||||||
func defaultChainGen(gen *GenContext, i int, block *core.BlockGen) error {
|
func defaultChainGen(gen *chaingen.GenContext, i int, block *core.BlockGen) error {
|
||||||
switch i {
|
switch i {
|
||||||
case 0:
|
case 0:
|
||||||
// In block 1, the test bank sends account #1 some ether.
|
// In block 1, the test bank sends account #1 some ether.
|
||||||
|
@ -1,46 +0,0 @@
|
|||||||
package helpers
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/cerc-io/plugeth-statediff/indexer/database/sql/postgres"
|
|
||||||
"github.com/jmoiron/sqlx"
|
|
||||||
)
|
|
||||||
|
|
||||||
var TestDBConfig, _ = postgres.TestConfig.WithEnv()
|
|
||||||
|
|
||||||
// SetupDB is use to setup a db for watcher tests
|
|
||||||
func SetupDB() *sqlx.DB {
|
|
||||||
db, err := postgres.ConnectSQLX(context.Background(), TestDBConfig)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
return db
|
|
||||||
}
|
|
||||||
|
|
||||||
// TearDownDB is used to tear down the watcher dbs after tests
|
|
||||||
func TearDownDB(db *sqlx.DB) error {
|
|
||||||
tx, err := db.Beginx()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
statements := []string{
|
|
||||||
`TRUNCATE nodes`,
|
|
||||||
`TRUNCATE ipld.blocks`,
|
|
||||||
`TRUNCATE eth.header_cids`,
|
|
||||||
`TRUNCATE eth.uncle_cids`,
|
|
||||||
`TRUNCATE eth.transaction_cids`,
|
|
||||||
`TRUNCATE eth.receipt_cids`,
|
|
||||||
`TRUNCATE eth.state_cids`,
|
|
||||||
`TRUNCATE eth.storage_cids`,
|
|
||||||
`TRUNCATE eth.log_cids`,
|
|
||||||
`TRUNCATE eth_meta.watched_addresses`,
|
|
||||||
}
|
|
||||||
for _, stm := range statements {
|
|
||||||
if _, err = tx.Exec(stm); err != nil {
|
|
||||||
return fmt.Errorf("error executing `%s`: %w", stm, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return tx.Commit()
|
|
||||||
}
|
|
@ -1,100 +0,0 @@
|
|||||||
package helpers
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"math/big"
|
|
||||||
|
|
||||||
"github.com/cerc-io/plugeth-statediff"
|
|
||||||
"github.com/cerc-io/plugeth-statediff/adapt"
|
|
||||||
"github.com/cerc-io/plugeth-statediff/indexer"
|
|
||||||
"github.com/cerc-io/plugeth-statediff/indexer/interfaces"
|
|
||||||
"github.com/cerc-io/plugeth-statediff/indexer/node"
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
|
||||||
"github.com/ethereum/go-ethereum/core/state"
|
|
||||||
"github.com/ethereum/go-ethereum/core/types"
|
|
||||||
"github.com/ethereum/go-ethereum/params"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestStateDiffIndexer(ctx context.Context, chainConfig *params.ChainConfig, genHash common.Hash) (interfaces.StateDiffIndexer, error) {
|
|
||||||
testInfo := node.Info{
|
|
||||||
GenesisBlock: genHash.String(),
|
|
||||||
NetworkID: "1",
|
|
||||||
ID: "1",
|
|
||||||
ClientName: "geth",
|
|
||||||
ChainID: chainConfig.ChainID.Uint64(),
|
|
||||||
}
|
|
||||||
_, indexer, err := indexer.NewStateDiffIndexer(ctx, chainConfig, testInfo, TestDBConfig, true)
|
|
||||||
return indexer, err
|
|
||||||
}
|
|
||||||
|
|
||||||
type IndexChainParams struct {
|
|
||||||
Blocks []*types.Block
|
|
||||||
Receipts []types.Receipts
|
|
||||||
StateCache state.Database
|
|
||||||
|
|
||||||
StateDiffParams statediff.Params
|
|
||||||
TotalDifficulty *big.Int
|
|
||||||
// Whether to skip indexing state nodes (state_cids, storage_cids)
|
|
||||||
SkipStateNodes bool
|
|
||||||
// Whether to skip indexing IPLD blocks
|
|
||||||
SkipIPLDs bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func IndexChain(indexer interfaces.StateDiffIndexer, params IndexChainParams) error {
|
|
||||||
builder := statediff.NewBuilder(adapt.GethStateView(params.StateCache))
|
|
||||||
// iterate over the blocks, generating statediff payloads, and transforming the data into Postgres
|
|
||||||
for i, block := range params.Blocks {
|
|
||||||
var args statediff.Args
|
|
||||||
var rcts types.Receipts
|
|
||||||
if i == 0 {
|
|
||||||
args = statediff.Args{
|
|
||||||
OldStateRoot: common.Hash{},
|
|
||||||
NewStateRoot: block.Root(),
|
|
||||||
BlockNumber: block.Number(),
|
|
||||||
BlockHash: block.Hash(),
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
args = statediff.Args{
|
|
||||||
OldStateRoot: params.Blocks[i-1].Root(),
|
|
||||||
NewStateRoot: block.Root(),
|
|
||||||
BlockNumber: block.Number(),
|
|
||||||
BlockHash: block.Hash(),
|
|
||||||
}
|
|
||||||
rcts = params.Receipts[i-1]
|
|
||||||
}
|
|
||||||
|
|
||||||
diff, err := builder.BuildStateDiffObject(args, params.StateDiffParams)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to build diff (block %d): %w", block.Number(), err)
|
|
||||||
}
|
|
||||||
tx, err := indexer.PushBlock(block, rcts, params.TotalDifficulty)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to index block (block %d): %w", block.Number(), err)
|
|
||||||
}
|
|
||||||
defer tx.RollbackOnFailure(err)
|
|
||||||
|
|
||||||
if !params.SkipStateNodes {
|
|
||||||
for _, node := range diff.Nodes {
|
|
||||||
if err = indexer.PushStateNode(tx, node, block.Hash().String()); err != nil {
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to index state node: %w", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !params.SkipIPLDs {
|
|
||||||
for _, ipld := range diff.IPLDs {
|
|
||||||
if err := indexer.PushIPLD(tx, ipld); err != nil {
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to index IPLD: %w", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err = tx.Submit(); err != nil {
|
|
||||||
return fmt.Errorf("failed to commit diff: %w", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
@ -25,120 +25,19 @@ import (
|
|||||||
var errNotSupported = errors.New("this operation is not supported")
|
var errNotSupported = errors.New("this operation is not supported")
|
||||||
|
|
||||||
type database struct {
|
type database struct {
|
||||||
ethDB ethdb.Database
|
ethdb.Database
|
||||||
}
|
}
|
||||||
|
|
||||||
func newDatabase(db ethdb.Database) *database {
|
func newDatabase(db ethdb.Database) *database {
|
||||||
return &database{
|
return &database{
|
||||||
ethDB: db,
|
Database: db,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *database) NewIterator(prefix []byte, start []byte) ethdb.Iterator {
|
|
||||||
return d.ethDB.NewIterator(prefix, start)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *database) Has(key []byte) (bool, error) {
|
|
||||||
return d.ethDB.Has(key)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *database) Get(key []byte) ([]byte, error) {
|
|
||||||
return d.ethDB.Get(key)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *database) Put(key []byte, value []byte) error {
|
func (d *database) Put(key []byte, value []byte) error {
|
||||||
return nil
|
return errNotSupported
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *database) Delete(key []byte) error {
|
func (d *database) Delete(key []byte) error {
|
||||||
return nil
|
return errNotSupported
|
||||||
}
|
|
||||||
|
|
||||||
func (d *database) Stat(property string) (string, error) {
|
|
||||||
return d.ethDB.Stat(property)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *database) Compact(start []byte, limit []byte) error {
|
|
||||||
return d.ethDB.Compact(start, limit)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HasAncient returns an error as we don't have a backing chain freezer.
|
|
||||||
func (d *database) HasAncient(kind string, number uint64) (bool, error) {
|
|
||||||
return d.ethDB.HasAncient(kind, number)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ancient returns an error as we don't have a backing chain freezer.
|
|
||||||
func (d *database) Ancient(kind string, number uint64) ([]byte, error) {
|
|
||||||
return d.ethDB.Ancient(kind, number)
|
|
||||||
}
|
|
||||||
|
|
||||||
// AncientRange returns an error as we don't have a backing chain freezer.
|
|
||||||
func (d *database) AncientRange(kind string, start, max, maxByteSize uint64) ([][]byte, error) {
|
|
||||||
return d.ethDB.AncientRange(kind, start, max, maxByteSize)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ancients returns an error as we don't have a backing chain freezer.
|
|
||||||
func (d *database) Ancients() (uint64, error) {
|
|
||||||
return d.ethDB.Ancients()
|
|
||||||
}
|
|
||||||
|
|
||||||
// AncientSize returns an error as we don't have a backing chain freezer.
|
|
||||||
func (d *database) AncientSize(kind string) (uint64, error) {
|
|
||||||
return d.ethDB.AncientSize(kind)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tail returns the number of first stored item in the freezer.
|
|
||||||
func (d *database) Tail() (uint64, error) {
|
|
||||||
return d.Tail()
|
|
||||||
}
|
|
||||||
|
|
||||||
// ModifyAncients is not supported.
|
|
||||||
func (d *database) ModifyAncients(fn func(ethdb.AncientWriteOp) error) (int64, error) {
|
|
||||||
return 0, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// TruncateHead discards all but the first n ancient data from the ancient store.
|
|
||||||
func (d *database) TruncateHead(n uint64) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// TruncateTail discards the first n ancient data from the ancient store.
|
|
||||||
func (d *database) TruncateTail(n uint64) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *database) Sync() error {
|
|
||||||
return d.ethDB.Sync()
|
|
||||||
}
|
|
||||||
|
|
||||||
// MigrateTable processes and migrates entries of a given table to a new format.
|
|
||||||
func (d *database) MigrateTable(string, func([]byte) ([]byte, error)) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *database) NewBatch() ethdb.Batch {
|
|
||||||
return d.ethDB.NewBatch()
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewBatchWithSize creates a write-only database batch with pre-allocated buffer.
|
|
||||||
func (d *database) NewBatchWithSize(size int) ethdb.Batch {
|
|
||||||
return d.ethDB.NewBatchWithSize(size)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *database) ReadAncients(fn func(ethdb.AncientReaderOp) error) (err error) {
|
|
||||||
return d.ethDB.ReadAncients(fn)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *database) Close() error {
|
|
||||||
return d.ethDB.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewSnapshot creates a database snapshot based on the current state.
|
|
||||||
func (d *database) NewSnapshot() (ethdb.Snapshot, error) {
|
|
||||||
return d.NewSnapshot()
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewSnapshot creates a database snapshot based on the current state.
|
|
||||||
func (d *database) AncientDatadir() (string, error) {
|
|
||||||
return "", errNotSupported
|
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,8 @@ import (
|
|||||||
"math/big"
|
"math/big"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
indexer_helpers "github.com/cerc-io/plugeth-statediff/indexer/test_helpers"
|
||||||
|
helpers "github.com/cerc-io/plugeth-statediff/test_helpers"
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/core"
|
"github.com/ethereum/go-ethereum/core"
|
||||||
"github.com/ethereum/go-ethereum/core/rawdb"
|
"github.com/ethereum/go-ethereum/core/rawdb"
|
||||||
@ -15,7 +17,6 @@ import (
|
|||||||
. "github.com/onsi/gomega"
|
. "github.com/onsi/gomega"
|
||||||
|
|
||||||
"github.com/cerc-io/ipld-eth-db-validator/v5/internal/chaingen"
|
"github.com/cerc-io/ipld-eth-db-validator/v5/internal/chaingen"
|
||||||
"github.com/cerc-io/ipld-eth-db-validator/v5/internal/helpers"
|
|
||||||
"github.com/cerc-io/ipld-eth-db-validator/v5/pkg/validator"
|
"github.com/cerc-io/ipld-eth-db-validator/v5/pkg/validator"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -55,7 +56,7 @@ var _ = Describe("referential integrity", Ordered, func() {
|
|||||||
})
|
})
|
||||||
blocks, receipts, chain = gen.MakeChain(5)
|
blocks, receipts, chain = gen.MakeChain(5)
|
||||||
|
|
||||||
indexer, err := helpers.TestStateDiffIndexer(context.Background(), chainConfig, gen.Genesis.Hash())
|
indexer, err := helpers.NewIndexer(context.Background(), chainConfig, gen.Genesis.Hash(), TestDBConfig)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
helpers.IndexChain(indexer, helpers.IndexChainParams{
|
helpers.IndexChain(indexer, helpers.IndexChainParams{
|
||||||
StateCache: chain.StateCache(),
|
StateCache: chain.StateCache(),
|
||||||
@ -65,9 +66,9 @@ var _ = Describe("referential integrity", Ordered, func() {
|
|||||||
})
|
})
|
||||||
checkedBlock = blocks[5]
|
checkedBlock = blocks[5]
|
||||||
|
|
||||||
db = helpers.SetupDB()
|
db = SetupDB()
|
||||||
})
|
})
|
||||||
AfterAll(func() { helpers.TearDownDB(db) })
|
AfterAll(func() { Expect(indexer_helpers.ClearSqlxDB(db)).ToNot(HaveOccurred()) })
|
||||||
|
|
||||||
BeforeEach(func() { tx = db.MustBegin() })
|
BeforeEach(func() { tx = db.MustBegin() })
|
||||||
AfterEach(func() {
|
AfterEach(func() {
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
package validator_test
|
package validator_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"math/big"
|
"math/big"
|
||||||
|
|
||||||
|
"github.com/cerc-io/plugeth-statediff/indexer/database/sql/postgres"
|
||||||
"github.com/ethereum/go-ethereum/params"
|
"github.com/ethereum/go-ethereum/params"
|
||||||
|
"github.com/jmoiron/sqlx"
|
||||||
)
|
)
|
||||||
|
|
||||||
var TestChainConfig = ¶ms.ChainConfig{
|
var TestChainConfig = ¶ms.ChainConfig{
|
||||||
@ -23,3 +26,21 @@ var TestChainConfig = ¶ms.ChainConfig{
|
|||||||
GrayGlacierBlock: big.NewInt(0),
|
GrayGlacierBlock: big.NewInt(0),
|
||||||
Ethash: new(params.EthashConfig),
|
Ethash: new(params.EthashConfig),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var TestDBConfig postgres.Config
|
||||||
roysc marked this conversation as resolved
Outdated
|
|||||||
|
|
||||||
|
func init() {
|
||||||
|
var err error
|
||||||
|
TestDBConfig, err = postgres.TestConfig.WithEnv()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetupDB() *sqlx.DB {
|
||||||
|
db, err := postgres.ConnectSQLX(context.Background(), TestDBConfig)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return db
|
||||||
|
}
|
@ -25,7 +25,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/cerc-io/plugeth-statediff"
|
statediff "github.com/cerc-io/plugeth-statediff"
|
||||||
"github.com/cerc-io/plugeth-statediff/indexer/database/sql/postgres"
|
"github.com/cerc-io/plugeth-statediff/indexer/database/sql/postgres"
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/consensus"
|
"github.com/ethereum/go-ethereum/consensus"
|
||||||
@ -36,6 +36,7 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/core/vm"
|
"github.com/ethereum/go-ethereum/core/vm"
|
||||||
"github.com/ethereum/go-ethereum/params"
|
"github.com/ethereum/go-ethereum/params"
|
||||||
"github.com/ethereum/go-ethereum/rpc"
|
"github.com/ethereum/go-ethereum/rpc"
|
||||||
|
"github.com/holiman/uint256"
|
||||||
"github.com/jmoiron/sqlx"
|
"github.com/jmoiron/sqlx"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
|
|
||||||
@ -246,13 +247,13 @@ func ethBackend(db *sqlx.DB, c *ipldeth.Config) (*ipldeth.Backend, error) {
|
|||||||
ExpiryDuration: time.Minute * time.Duration(gcc.StateDB.CacheExpiryInMins),
|
ExpiryDuration: time.Minute * time.Duration(gcc.StateDB.CacheExpiryInMins),
|
||||||
})
|
})
|
||||||
// Read only wrapper around ipfs-ethdb eth.Database implementation
|
// Read only wrapper around ipfs-ethdb eth.Database implementation
|
||||||
customEthDB := newDatabase(ethDB)
|
ethDB = newDatabase(ethDB)
|
||||||
|
|
||||||
return &ipldeth.Backend{
|
return &ipldeth.Backend{
|
||||||
DB: db,
|
DB: db,
|
||||||
Retriever: r,
|
Retriever: r,
|
||||||
EthDB: customEthDB,
|
EthDB: ethDB,
|
||||||
IpldTrieStateDatabase: ipldstate.NewDatabase(customEthDB),
|
IpldTrieStateDatabase: ipldstate.NewDatabase(ethDB),
|
||||||
Config: c,
|
Config: c,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
@ -294,10 +295,13 @@ func (s *Service) writeStateDiffAt(height uint64) error {
|
|||||||
|
|
||||||
// applyTransaction attempts to apply block transactions to the given state database
|
// applyTransaction attempts to apply block transactions to the given state database
|
||||||
// and uses the input parameters for its environment. It returns the stateDB of parent with applied txs.
|
// and uses the input parameters for its environment. It returns the stateDB of parent with applied txs.
|
||||||
|
//
|
||||||
|
// Note: this skips the DAO hard fork refund
|
||||||
func applyTransactions(block *types.Block, backend *ipldeth.Backend) (*ipldstate.StateDB, error) {
|
func applyTransactions(block *types.Block, backend *ipldeth.Backend) (*ipldstate.StateDB, error) {
|
||||||
if block.NumberU64() == 0 {
|
if block.NumberU64() == 0 {
|
||||||
return nil, errors.New("no transaction in genesis")
|
return nil, errors.New("no transaction in genesis")
|
||||||
}
|
}
|
||||||
|
config := backend.Config.ChainConfig
|
||||||
|
|
||||||
// Create the parent state database
|
// Create the parent state database
|
||||||
parentHash := block.ParentHash()
|
parentHash := block.ParentHash()
|
||||||
@ -310,10 +314,13 @@ func applyTransactions(block *types.Block, backend *ipldeth.Backend) (*ipldstate
|
|||||||
var gp core.GasPool
|
var gp core.GasPool
|
||||||
gp.AddGas(block.GasLimit())
|
gp.AddGas(block.GasLimit())
|
||||||
|
|
||||||
signer := types.MakeSigner(backend.Config.ChainConfig, block.Number())
|
|
||||||
blockContext := core.NewEVMBlockContext(block.Header(), backend, getAuthor(backend, block.Header()))
|
blockContext := core.NewEVMBlockContext(block.Header(), backend, getAuthor(backend, block.Header()))
|
||||||
evm := vm.NewEVM(blockContext, vm.TxContext{}, statedb, backend.Config.ChainConfig, vm.Config{})
|
evm := vm.NewEVM(blockContext, vm.TxContext{}, statedb, config, vm.Config{})
|
||||||
rules := backend.Config.ChainConfig.Rules(block.Number(), true, block.Time())
|
signer := types.MakeSigner(config, block.Number(), block.Time())
|
||||||
|
|
||||||
|
if beaconRoot := block.BeaconRoot(); beaconRoot != nil {
|
||||||
|
ProcessBeaconBlockRoot(*beaconRoot, evm, statedb)
|
||||||
|
}
|
||||||
|
|
||||||
// Iterate over and process the individual transactions
|
// Iterate over and process the individual transactions
|
||||||
for i, tx := range block.Transactions() {
|
for i, tx := range block.Transactions() {
|
||||||
@ -322,18 +329,31 @@ func applyTransactions(block *types.Block, backend *ipldeth.Backend) (*ipldstate
|
|||||||
return nil, fmt.Errorf("error converting transaction to message: %w", err)
|
return nil, fmt.Errorf("error converting transaction to message: %w", err)
|
||||||
}
|
}
|
||||||
statedb.SetTxContext(tx.Hash(), i)
|
statedb.SetTxContext(tx.Hash(), i)
|
||||||
statedb.Prepare(rules, msg.From, block.Coinbase(), msg.To, nil, nil)
|
|
||||||
|
|
||||||
// Create a new context to be used in the EVM environment.
|
// Create a new context to be used in the EVM environment.
|
||||||
evm.Reset(core.NewEVMTxContext(msg), statedb)
|
evm.Reset(core.NewEVMTxContext(msg), statedb)
|
||||||
// Apply the transaction to the current state (included in the env).
|
// Apply the transaction to the current state (included in the env).
|
||||||
if _, err := core.ApplyMessage(evm, msg, &gp); err != nil {
|
if _, err := core.ApplyMessage(evm, msg, &gp); err != nil {
|
||||||
return nil, fmt.Errorf("transaction %#x failed: %w", tx.Hash(), err)
|
return nil, fmt.Errorf("error applying tx %#x: %w", tx.Hash(), err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if config.IsByzantium(block.Number()) {
|
||||||
|
statedb.Finalise(true)
|
||||||
|
} else {
|
||||||
|
statedb.IntermediateRoot(config.IsEIP158(block.Number())).Bytes()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if backend.Config.ChainConfig.Ethash != nil {
|
// Withdrawals processing.
|
||||||
accumulateRewards(backend.Config.ChainConfig, statedb, block.Header(), block.Uncles())
|
for _, w := range block.Withdrawals() {
|
||||||
|
// Convert amount from gwei to wei.
|
||||||
|
amount := new(uint256.Int).SetUint64(w.Amount)
|
||||||
|
amount = amount.Mul(amount, uint256.NewInt(params.GWei))
|
||||||
|
statedb.AddBalance(w.Address, amount)
|
||||||
|
}
|
||||||
|
|
||||||
|
if config.Ethash != nil {
|
||||||
|
accumulateRewards(config, statedb, block.Header(), block.Uncles())
|
||||||
}
|
}
|
||||||
|
|
||||||
return statedb, nil
|
return statedb, nil
|
||||||
@ -354,20 +374,40 @@ func accumulateRewards(config *params.ChainConfig, state *ipldstate.StateDB, hea
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Accumulate the rewards for the miner and any included uncles
|
// Accumulate the rewards for the miner and any included uncles
|
||||||
reward := new(big.Int).Set(blockReward)
|
reward := new(big.Int).Set(blockReward.ToBig())
|
||||||
r := new(big.Int)
|
r := new(big.Int)
|
||||||
for _, uncle := range uncles {
|
for _, uncle := range uncles {
|
||||||
r.Add(uncle.Number, big8)
|
r.Add(uncle.Number, big8)
|
||||||
r.Sub(r, header.Number)
|
r.Sub(r, header.Number)
|
||||||
r.Mul(r, blockReward)
|
r.Mul(r, blockReward.ToBig())
|
||||||
r.Div(r, big8)
|
r.Div(r, big8)
|
||||||
state.AddBalance(uncle.Coinbase, r)
|
state.AddBalance(uncle.Coinbase, uint256.MustFromBig(r))
|
||||||
|
|
||||||
r.Div(blockReward, big32)
|
r.Div(blockReward.ToBig(), big32)
|
||||||
reward.Add(reward, r)
|
reward.Add(reward, r)
|
||||||
}
|
}
|
||||||
|
|
||||||
state.AddBalance(header.Coinbase, reward)
|
state.AddBalance(header.Coinbase, uint256.MustFromBig(reward))
|
||||||
|
}
|
||||||
|
|
||||||
|
// ProcessBeaconBlockRoot applies the EIP-4788 system call to the beacon block root
|
||||||
|
// contract. This method is exported to be used in tests.
|
||||||
|
func ProcessBeaconBlockRoot(beaconRoot common.Hash, vmenv *vm.EVM, statedb *ipldstate.StateDB) {
|
||||||
|
// If EIP-4788 is enabled, we need to invoke the beaconroot storage contract with
|
||||||
|
// the new root
|
||||||
|
msg := &core.Message{
|
||||||
|
From: params.SystemAddress,
|
||||||
|
GasLimit: 30_000_000,
|
||||||
|
GasPrice: common.Big0,
|
||||||
|
GasFeeCap: common.Big0,
|
||||||
|
GasTipCap: common.Big0,
|
||||||
|
To: ¶ms.BeaconRootsStorageAddress,
|
||||||
|
Data: beaconRoot[:],
|
||||||
|
}
|
||||||
|
vmenv.Reset(core.NewEVMTxContext(msg), statedb)
|
||||||
|
statedb.AddAddressToAccessList(params.BeaconRootsStorageAddress)
|
||||||
|
_, _, _ = vmenv.Call(vm.AccountRef(msg.From), *msg.To, msg.Data, 30_000_000, common.U2560)
|
||||||
|
statedb.Finalise(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
func setChainConfig(ghash common.Hash) *params.ChainConfig {
|
func setChainConfig(ghash common.Hash) *params.ChainConfig {
|
||||||
@ -376,8 +416,6 @@ func setChainConfig(ghash common.Hash) *params.ChainConfig {
|
|||||||
return params.MainnetChainConfig
|
return params.MainnetChainConfig
|
||||||
case ghash == params.SepoliaGenesisHash:
|
case ghash == params.SepoliaGenesisHash:
|
||||||
return params.SepoliaChainConfig
|
return params.SepoliaChainConfig
|
||||||
case ghash == params.RinkebyGenesisHash:
|
|
||||||
return params.RinkebyChainConfig
|
|
||||||
case ghash == params.GoerliGenesisHash:
|
case ghash == params.GoerliGenesisHash:
|
||||||
return params.GoerliChainConfig
|
return params.GoerliChainConfig
|
||||||
default:
|
default:
|
||||||
|
@ -5,19 +5,19 @@ import (
|
|||||||
"math/big"
|
"math/big"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/jmoiron/sqlx"
|
|
||||||
|
|
||||||
"github.com/cerc-io/plugeth-statediff/indexer/ipld"
|
"github.com/cerc-io/plugeth-statediff/indexer/ipld"
|
||||||
|
indexer_helpers "github.com/cerc-io/plugeth-statediff/indexer/test_helpers"
|
||||||
|
helpers "github.com/cerc-io/plugeth-statediff/test_helpers"
|
||||||
sdtypes "github.com/cerc-io/plugeth-statediff/types"
|
sdtypes "github.com/cerc-io/plugeth-statediff/types"
|
||||||
"github.com/ethereum/go-ethereum/core/rawdb"
|
"github.com/ethereum/go-ethereum/core/rawdb"
|
||||||
"github.com/ethereum/go-ethereum/log"
|
"github.com/ethereum/go-ethereum/log"
|
||||||
"github.com/ethereum/go-ethereum/rpc"
|
"github.com/ethereum/go-ethereum/rpc"
|
||||||
|
"github.com/jmoiron/sqlx"
|
||||||
|
|
||||||
// import server helpers for non-canonical chain data
|
// import server helpers for non-canonical chain data
|
||||||
server_mocks "github.com/cerc-io/ipld-eth-server/v5/pkg/eth/test_helpers"
|
server_mocks "github.com/cerc-io/ipld-eth-server/v5/pkg/eth/test_helpers"
|
||||||
|
|
||||||
"github.com/cerc-io/ipld-eth-db-validator/v5/internal/chaingen"
|
"github.com/cerc-io/ipld-eth-db-validator/v5/internal/chaingen"
|
||||||
"github.com/cerc-io/ipld-eth-db-validator/v5/internal/helpers"
|
|
||||||
"github.com/cerc-io/ipld-eth-db-validator/v5/pkg/validator"
|
"github.com/cerc-io/ipld-eth-db-validator/v5/pkg/validator"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -34,7 +34,7 @@ var (
|
|||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
// The geth sync logs are noisy, silence them
|
// The geth sync logs are noisy, silence them
|
||||||
log.Root().SetHandler(log.DiscardHandler())
|
log.SetDefault(log.NewLogger(log.DiscardHandler()))
|
||||||
}
|
}
|
||||||
|
|
||||||
func setupStateValidator(t *testing.T) *sqlx.DB {
|
func setupStateValidator(t *testing.T) *sqlx.DB {
|
||||||
@ -46,7 +46,7 @@ func setupStateValidator(t *testing.T) *sqlx.DB {
|
|||||||
chain.Stop()
|
chain.Stop()
|
||||||
})
|
})
|
||||||
|
|
||||||
indexer, err := helpers.TestStateDiffIndexer(context.Background(), chainConfig, gen.Genesis.Hash())
|
indexer, err := helpers.NewIndexer(context.Background(), chainConfig, gen.Genesis.Hash(), TestDBConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@ -98,10 +98,11 @@ func setupStateValidator(t *testing.T) *sqlx.DB {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
db := helpers.SetupDB()
|
db := SetupDB()
|
||||||
|
|
||||||
t.Cleanup(func() {
|
t.Cleanup(func() {
|
||||||
helpers.TearDownDB(db)
|
if err := indexer_helpers.ClearSqlxDB(db); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
return db
|
return db
|
||||||
}
|
}
|
||||||
@ -121,7 +122,7 @@ func TestStateValidation(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
if blockToBeValidated == nil {
|
if blockToBeValidated == nil {
|
||||||
t.Fatal("blockToBeValidated is nil")
|
t.Fatal("block was not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
err = validator.ValidateBlock(blockToBeValidated, api.B, i)
|
err = validator.ValidateBlock(blockToBeValidated, api.B, i)
|
||||||
|
@ -2,10 +2,11 @@
|
|||||||
|
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
geth_endpoint="$1"
|
geth_endpoint="${1:-$ETH_HTTP_PATH}"
|
||||||
|
|
||||||
latest_block_hex=$(curl -s $geth_endpoint -X POST -H "Content-Type: application/json" \
|
latest_block_hex=$(curl -s $geth_endpoint -X POST -H "Content-Type: application/json" \
|
||||||
--data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":42}' | \
|
--data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":42}' | \
|
||||||
jq -r .result)
|
python3 -c 'import json, sys; print(int(json.load(sys.stdin)["result"], 16))' \
|
||||||
|
)
|
||||||
|
|
||||||
printf "%d" $latest_block_hex
|
printf "%d" $latest_block_hex
|
||||||
|
@ -1,55 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# Builds and deploys a stack with only what we need.
|
|
||||||
# This script assumes we are running in the project root.
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
CONFIG_DIR=$(readlink -f "${CONFIG_DIR:-$(mktemp -d)}")
|
|
||||||
|
|
||||||
# Point stack-orchestrator to the multi-project root
|
|
||||||
export CERC_REPO_BASE_DIR="${CERC_REPO_BASE_DIR:-..}"
|
|
||||||
# v5 migrations only go up to version 18
|
|
||||||
echo CERC_STATEDIFF_DB_GOOSE_MIN_VER=18 >> $CONFIG_DIR/stack.env
|
|
||||||
|
|
||||||
laconic_so="${LACONIC_SO:-laconic-so} --stack fixturenet-plugeth-tx --verbose"
|
|
||||||
|
|
||||||
set -x
|
|
||||||
|
|
||||||
if [[ -z $SKIP_BUILD ]]; then
|
|
||||||
$laconic_so setup-repositories \
|
|
||||||
--exclude github.com/cerc-io/ipld-eth-server,github.com/cerc-io/tx-spammer,github.com/dboreham/foundry \
|
|
||||||
--branches-file ./test/stack-refs.txt
|
|
||||||
|
|
||||||
$laconic_so build-containers \
|
|
||||||
--exclude cerc/ipld-eth-server,cerc/keycloak,cerc/tx-spammer,cerc/foundry
|
|
||||||
fi
|
|
||||||
|
|
||||||
$laconic_so deploy \
|
|
||||||
--include fixturenet-plugeth,ipld-eth-db \
|
|
||||||
--env-file $CONFIG_DIR/stack.env \
|
|
||||||
--cluster test up
|
|
||||||
|
|
||||||
set +x
|
|
||||||
|
|
||||||
bootnode_endpoint=localhost:$(docker port test-fixturenet-eth-bootnode-geth-1 9898 | head -1 | cut -d':' -f2)
|
|
||||||
geth_endpoint=localhost:$(docker port test-fixturenet-eth-geth-1-1 8545 | head -1 | cut -d':' -f2)
|
|
||||||
|
|
||||||
# Extract the chain config and ID from genesis file
|
|
||||||
curl -s $bootnode_endpoint/geth.json | jq '.config' > "$CONFIG_DIR/chain.json"
|
|
||||||
|
|
||||||
# Output vars if we are running on Github
|
|
||||||
if [[ -n "$GITHUB_ENV" ]]; then
|
|
||||||
echo ETH_CHAIN_ID="$(jq '.chainId' $CONFIG_DIR/chain.json)" >> "$GITHUB_ENV"
|
|
||||||
echo ETH_CHAIN_CONFIG="$CONFIG_DIR/chain.json" >> "$GITHUB_ENV"
|
|
||||||
echo ETH_HTTP_PATH=$geth_endpoint >> "$GITHUB_ENV"
|
|
||||||
# Read a private key so we can send from a funded account
|
|
||||||
echo DEPLOYER_PRIVATE_KEY="$(curl -s $bootnode_endpoint/accounts.csv | head -1 | cut -d',' -f3)" >> "$GITHUB_ENV"
|
|
||||||
fi
|
|
||||||
|
|
||||||
export PGPASSWORD=password
|
|
||||||
query_blocks_exist='SELECT exists(SELECT block_number FROM ipld.blocks LIMIT 1);'
|
|
||||||
|
|
||||||
echo "Waiting until we have some data written..."
|
|
||||||
until [[ "$(psql -qtA cerc_testing -h localhost -U vdbm -p 8077 -c "$query_blocks_exist")" -eq 't' ]]; do
|
|
||||||
sleep 2
|
|
||||||
done
|
|
55
scripts/run-test-stack.sh
Executable file
55
scripts/run-test-stack.sh
Executable file
@ -0,0 +1,55 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -ex -o pipefail
|
||||||
|
|
||||||
|
stack_dir=$(readlink -f "$1")
|
||||||
|
[[ -d "$stack_dir" ]]
|
||||||
|
|
||||||
|
CONFIG_DIR=$(readlink -f "${CONFIG_DIR:-$(mktemp -d)}")
|
||||||
|
# By default assume we are running in the project root.
|
||||||
|
export CERC_REPO_BASE_DIR="${CERC_REPO_BASE_DIR:-$(git rev-parse --show-toplevel)/..}"
|
||||||
|
|
||||||
|
laconic_so="laconic-so --verbose --stack $stack_dir"
|
||||||
|
|
||||||
|
# Don't run geth/plugeth in the debugger, it will swallow error backtraces
|
||||||
|
echo CERC_REMOTE_DEBUG=false >> $CONFIG_DIR/stack.env
|
||||||
|
# Passing this lets us run eth_call forwarding tests without running ipld-eth-db
|
||||||
|
echo CERC_RUN_STATEDIFF=${CERC_RUN_STATEDIFF:-true} >> $CONFIG_DIR/stack.env
|
||||||
|
|
||||||
|
|
||||||
|
if [[ -z $SKIP_BUILD ]]; then
|
||||||
|
# Prevent conflicting tty output
|
||||||
|
export BUILDKIT_PROGRESS=plain
|
||||||
|
|
||||||
|
$laconic_so setup-repositories \
|
||||||
|
--exclude git.vdb.to/cerc-io/ipld-eth-server
|
||||||
|
$laconic_so build-containers \
|
||||||
|
--exclude cerc/ipld-eth-server
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! $laconic_so deploy \
|
||||||
|
--exclude ipld-eth-server \
|
||||||
|
--env-file $CONFIG_DIR/stack.env \
|
||||||
|
--cluster test up
|
||||||
|
then
|
||||||
|
$laconic_so deploy --cluster test logs
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
set +x
|
||||||
|
|
||||||
|
# Get IPv4 endpoint of geth and bootnode file server
|
||||||
|
bootnode_endpoint=localhost:$(docker port test-fixturenet-eth-bootnode-geth-1 9898 | head -1 | cut -d':' -f2)
|
||||||
|
geth_endpoint=localhost:$(docker port test-fixturenet-eth-geth-1-1 8545 | head -1 | cut -d':' -f2)
|
||||||
|
|
||||||
|
# Extract the chain config and ID from genesis file
|
||||||
|
curl -s $bootnode_endpoint/geth.json | jq '.config' > "$CONFIG_DIR/chain.json"
|
||||||
|
|
||||||
|
# Output vars if we are running on Github
|
||||||
|
if [[ -n "$GITHUB_ENV" ]]; then
|
||||||
|
echo ETH_CHAIN_ID="$(jq '.chainId' $CONFIG_DIR/chain.json)" >> "$GITHUB_ENV"
|
||||||
|
echo ETH_CHAIN_CONFIG="$CONFIG_DIR/chain.json" >> "$GITHUB_ENV"
|
||||||
|
echo ETH_HTTP_PATH=$geth_endpoint >> "$GITHUB_ENV"
|
||||||
|
# Read a private key so we can send from a funded account
|
||||||
|
echo DEPLOYER_PRIVATE_KEY="$(curl -s $bootnode_endpoint/accounts.csv | head -1 | cut -d',' -f3)" >> "$GITHUB_ENV"
|
||||||
|
fi
|
@ -5,7 +5,7 @@ services:
|
|||||||
restart: on-failure
|
restart: on-failure
|
||||||
depends_on:
|
depends_on:
|
||||||
- ipld-eth-db
|
- ipld-eth-db
|
||||||
image: git.vdb.to/cerc-io/ipld-eth-db/ipld-eth-db:v5.0.5-alpha
|
image: git.vdb.to/cerc-io/ipld-eth-db/ipld-eth-db:v5.3.0-alpha
|
||||||
environment:
|
environment:
|
||||||
DATABASE_USER: "vdbm"
|
DATABASE_USER: "vdbm"
|
||||||
DATABASE_NAME: "cerc_testing"
|
DATABASE_NAME: "cerc_testing"
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
services:
|
services:
|
||||||
contract-deployer:
|
contract-deployer:
|
||||||
restart: on-failure
|
restart: on-failure
|
||||||
image: cerc/ipld-eth-db-validator/contract-deployer:local
|
image: cerc/ipld-eth-db-validator/test-contract-deployer:local
|
||||||
build: ./contract
|
build: ./contract
|
||||||
networks:
|
networks:
|
||||||
- test_default
|
- test_default
|
||||||
|
@ -1,8 +1,5 @@
|
|||||||
# Downgrade from 18.16, see https://github.com/NomicFoundation/hardhat/issues/3877
|
# Downgrade from 18.16, see https://github.com/NomicFoundation/hardhat/issues/3877
|
||||||
FROM node:18.15-slim
|
FROM node:20-slim
|
||||||
|
|
||||||
ARG ETH_ADDR
|
|
||||||
ENV ETH_ADDR $ETH_ADDR
|
|
||||||
|
|
||||||
WORKDIR /usr/src/app
|
WORKDIR /usr/src/app
|
||||||
COPY package*.json ./
|
COPY package*.json ./
|
||||||
|
@ -1,11 +1,16 @@
|
|||||||
pragma solidity ^0.8.0;
|
pragma solidity ^0.8.25;
|
||||||
|
|
||||||
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
|
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
|
||||||
|
|
||||||
contract GLDToken is ERC20 {
|
contract GLDToken is ERC20 {
|
||||||
constructor() ERC20("Gold", "GLD") {
|
constructor() ERC20("Gold", "GLD") {
|
||||||
_mint(msg.sender, 1000000000000000000000);
|
_mint(msg.sender, 1000000000000000000000);
|
||||||
}
|
}
|
||||||
|
|
||||||
function destroy() public {
|
function destroy() public {
|
||||||
selfdestruct(payable(msg.sender));
|
(bool ok, ) = payable(msg.sender).call{value: address(this).balance}("");
|
||||||
|
require(ok, "ETH transfer failed");
|
||||||
|
|
||||||
|
_burn(msg.sender, balanceOf(msg.sender));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,7 @@ contract Test {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function close() public onlyOwner {
|
function close() public onlyOwner {
|
||||||
owner.transfer(address(this).balance);
|
(bool ok, ) = owner.call{value: address(this).balance}("");
|
||||||
|
require(ok, "ETH transfer failed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,9 +28,8 @@ if (process.env.DEPLOYER_PRIVATE_KEY) {
|
|||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
solidity: {
|
solidity: {
|
||||||
version: '0.8.20',
|
version: "0.8.25",
|
||||||
settings: {
|
settings: {
|
||||||
evmVersion: 'paris', // see Makefile
|
|
||||||
outputSelection: {
|
outputSelection: {
|
||||||
'*': {
|
'*': {
|
||||||
'*': [
|
'*': [
|
||||||
|
2151
test/contract/package-lock.json
generated
2151
test/contract/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -11,9 +11,10 @@
|
|||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"description": "Solidity contract deployment server for integration testing",
|
"description": "Solidity contract deployment server for integration testing",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@openzeppelin/contracts": "^4.0.0",
|
"@openzeppelin/contracts": "^5.0.2",
|
||||||
"fastify": "^4.0.0",
|
"fastify": "^4.26.2",
|
||||||
"hardhat": "^2.14.0"
|
"hardhat": "^2.22.3",
|
||||||
|
"solidity-create2-deployer": "^0.4.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@nomiclabs/hardhat-ethers": "^2.2.3",
|
"@nomiclabs/hardhat-ethers": "^2.2.3",
|
||||||
|
@ -1,2 +0,0 @@
|
|||||||
github.com/cerc-io/ipld-eth-db v5.0.5-alpha
|
|
||||||
git.vdb.to/cerc-io/plugeth-statediff v0.1.1
|
|
Loading…
Reference in New Issue
Block a user
is the _ an error? Should be checked if so