diff --git a/Makefile b/Makefile index def65cc137..429cd20994 100644 --- a/Makefile +++ b/Makefile @@ -152,6 +152,12 @@ test-integration-race: @go test -race -tags=$(TAGS) ./nodebuilder/tests .PHONY: test-integration-race +## test-e2e: Run end to end tests via knuu. This command requires a kube/config file to configure kubernetes. +test-e2e: + @echo "--> Running end to end tests" + go run ./test/e2e $(filter-out $@,$(MAKECMDGOALS)) +.PHONY: test-e2e + ## benchmark: Run all benchmarks. benchmark: @echo "--> Running benchmarks" diff --git a/go.mod b/go.mod index b2ad5e8a62..ce50b15fc5 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,7 @@ require ( github.com/celestiaorg/go-libp2p-messenger v0.2.0 github.com/celestiaorg/go-square/merkle v0.0.0-20240117232118-fd78256df076 github.com/celestiaorg/go-square/v2 v2.1.0 + github.com/celestiaorg/knuu v0.16.2 github.com/celestiaorg/nmt v0.22.2 github.com/celestiaorg/rsmt2d v0.14.0 github.com/cosmos/cosmos-sdk v0.46.16 @@ -56,7 +57,7 @@ require ( github.com/rollkit/go-da v0.8.0 github.com/spf13/cobra v1.8.1 github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.9.0 + github.com/stretchr/testify v1.10.0 github.com/tendermint/tendermint v0.34.29 go.opentelemetry.io/contrib/instrumentation/runtime v0.45.0 go.opentelemetry.io/otel v1.31.0 @@ -70,12 +71,13 @@ require ( go.opentelemetry.io/proto/otlp v1.3.1 go.uber.org/fx v1.23.0 go.uber.org/zap v1.27.0 - golang.org/x/crypto v0.28.0 + golang.org/x/crypto v0.29.0 golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c - golang.org/x/sync v0.8.0 - golang.org/x/text v0.19.0 + golang.org/x/sync v0.9.0 + golang.org/x/text v0.20.0 google.golang.org/grpc v1.68.0 - google.golang.org/protobuf v1.35.1 + google.golang.org/protobuf v1.35.2 + k8s.io/apimachinery v0.31.3 ) require ( @@ -100,6 +102,7 @@ require ( github.com/bgentry/speakeasy v0.1.0 // indirect github.com/bits-and-blooms/bitset v1.13.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect + github.com/celestiaorg/bittwister v0.0.0-20231213180407-65cdbaf5b8c7 // indirect github.com/celestiaorg/blobstream-contracts/v3 v3.1.0 // indirect github.com/celestiaorg/go-square v1.1.1 // indirect github.com/celestiaorg/merkletree v0.0.0-20230308153949-c33506a7aa26 // indirect @@ -107,6 +110,7 @@ require ( github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chzyer/readline v1.5.1 // indirect + github.com/cilium/ebpf v0.12.3 // indirect github.com/cockroachdb/apd/v2 v2.0.2 // indirect github.com/cockroachdb/errors v1.11.3 // indirect github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect @@ -143,21 +147,23 @@ require ( github.com/dgraph-io/badger/v2 v2.2007.4 // indirect github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect - github.com/docker/go-connections v0.4.1-0.20210727194412-58542c764a11 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/dvsekhvalnov/jose2go v1.6.0 // indirect github.com/elastic/gosigar v0.14.3 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/etclabscore/go-jsonschema-walk v0.0.6 // indirect github.com/ethereum/c-kzg-4844 v1.0.0 // indirect - github.com/ethereum/go-ethereum v1.14.11 // indirect + github.com/ethereum/go-ethereum v1.14.12 // indirect github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/flynn/noise v1.1.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/gammazero/deque v0.2.0 // indirect github.com/getsentry/sentry-go v0.27.0 // indirect + github.com/go-ini/ini v1.67.0 // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect @@ -169,6 +175,7 @@ require ( github.com/go-openapi/spec v0.19.11 // indirect github.com/go-openapi/swag v0.22.4 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect + github.com/goccy/go-json v0.10.3 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/gogo/gateway v1.1.0 // indirect @@ -177,7 +184,9 @@ require ( github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/btree v1.1.3 // indirect github.com/google/flatbuffers v1.12.1 // indirect + github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect github.com/google/gopacket v1.1.19 // indirect github.com/google/orderedcode v0.0.1 // indirect github.com/google/pprof v0.0.0-20241017200806-017d972448fc // indirect @@ -224,6 +233,7 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.17.11 // indirect github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/koron/go-ssdp v0.0.4 // indirect @@ -252,10 +262,15 @@ require ( github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/minio/highwayhash v1.0.3 // indirect + github.com/minio/md5-simd v1.1.2 // indirect + github.com/minio/minio-go/v7 v7.0.74 // indirect github.com/minio/sha256-simd v1.0.1 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/moby/spdystream v0.4.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mr-tron/base58 v1.2.0 // indirect github.com/mtibben/percent v0.2.1 // indirect github.com/multiformats/go-base36 v0.2.0 // indirect @@ -265,6 +280,7 @@ require ( github.com/multiformats/go-multistream v0.6.0 // indirect github.com/multiformats/go-varint v0.0.7 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect github.com/onsi/ginkgo/v2 v2.20.2 // indirect github.com/opencontainers/runtime-spec v1.2.0 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect @@ -302,9 +318,11 @@ require ( github.com/regen-network/cosmos-proto v0.3.1 // indirect github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/rs/cors v1.8.3 // indirect + github.com/rs/xid v1.5.0 // indirect github.com/rs/zerolog v1.33.0 // indirect github.com/sasha-s/go-deadlock v0.3.1 // indirect github.com/shirou/gopsutil v3.21.6+incompatible // indirect + github.com/sirupsen/logrus v1.9.3 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.6.0 // indirect @@ -321,6 +339,7 @@ require ( github.com/ulikunitz/xz v0.5.10 // indirect github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect github.com/wlynxg/anet v0.0.5 // indirect + github.com/x448/float16 v0.8.4 // indirect github.com/zondax/hid v0.9.2 // indirect github.com/zondax/ledger-go v0.14.3 // indirect go.etcd.io/bbolt v1.3.11 // indirect @@ -331,29 +350,39 @@ require ( go.uber.org/dig v1.18.0 // indirect go.uber.org/mock v0.5.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/mod v0.21.0 // indirect - golang.org/x/net v0.30.0 // indirect + golang.org/x/mod v0.22.0 // indirect + golang.org/x/net v0.31.0 // indirect golang.org/x/oauth2 v0.23.0 // indirect - golang.org/x/sys v0.26.0 // indirect - golang.org/x/term v0.25.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/term v0.26.0 // indirect golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.26.0 // indirect + golang.org/x/tools v0.27.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect gonum.org/v1/gonum v0.15.0 // indirect google.golang.org/api v0.169.0 // indirect google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/api v0.30.2 // indirect + k8s.io/client-go v0.30.2 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect + k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect lukechampine.com/blake3 v1.3.0 // indirect nhooyr.io/websocket v1.8.17 // indirect rsc.io/tmplfunc v0.0.3 // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect sigs.k8s.io/yaml v1.4.0 // indirect ) replace ( + github.com/celestiaorg/celestia-app/v3 => github.com/celestiaorg/celestia-app/v3 v3.0.0-rc0.0.20241209133443-8f22051d48c7 + github.com/cosmos/cosmos-sdk => github.com/celestiaorg/cosmos-sdk v1.25.0-sdk-v0.46.16 github.com/filecoin-project/dagstore => github.com/celestiaorg/dagstore v0.0.0-20230824094345-537c012aa403 github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 diff --git a/go.sum b/go.sum index bbb12f2221..7996f00821 100644 --- a/go.sum +++ b/go.sum @@ -229,7 +229,6 @@ github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go github.com/Masterminds/glide v0.13.2/go.mod h1:STyF5vcenH/rUqTEv+/hBXlSTo7KYwg2oc2f4tzPWic= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/vcs v1.13.0/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= @@ -277,6 +276,8 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= @@ -343,12 +344,14 @@ github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7 github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/celestiaorg/bittwister v0.0.0-20231213180407-65cdbaf5b8c7 h1:nxplQi8wrLMjhu260RuigXylC3pWoDu4OVumPHeojnk= +github.com/celestiaorg/bittwister v0.0.0-20231213180407-65cdbaf5b8c7/go.mod h1:1EF5MfOxVf0WC51Gb7pJ6bcZxnXKNAf9pqWtjgPBAYc= github.com/celestiaorg/blobstream-contracts/v3 v3.1.0 h1:h1Y4V3EMQ2mFmNtWt2sIhZIuyASInj1a9ExI8xOsTOw= github.com/celestiaorg/blobstream-contracts/v3 v3.1.0/go.mod h1:x4DKyfKOSv1ZJM9NwV+Pw01kH2CD7N5zTFclXIVJ6GQ= github.com/celestiaorg/boxo v0.0.0-20241118122411-70a650316c3b h1:M9X7s1WJ/7Ju84ZUbO/6/8XlODkFsj/ln85AE0F6pj8= github.com/celestiaorg/boxo v0.0.0-20241118122411-70a650316c3b/go.mod h1:OpUrJtGmZZktUqJvPOtmP8wSfEFcdF/55d3PNCcYLwc= -github.com/celestiaorg/celestia-app/v3 v3.0.2 h1:N9KOGcedhbQpK4XfDZ/OG5za/bV94N4QE72o4gSZ+EA= -github.com/celestiaorg/celestia-app/v3 v3.0.2/go.mod h1:Ut3ytZG2+RcmeCxrYyJ5KOGaFoGnVcShIN+IufyDDSY= +github.com/celestiaorg/celestia-app/v3 v3.0.0-rc0.0.20241209133443-8f22051d48c7 h1:MORILyUUnyFW+EqkJnQiu8HkTzzBE+GLtkxc2zzf0gU= +github.com/celestiaorg/celestia-app/v3 v3.0.0-rc0.0.20241209133443-8f22051d48c7/go.mod h1:8dXFtgY51tl6fQSbrtVh+aPsDFHFkl0w1mFNd+o1q9g= github.com/celestiaorg/celestia-core v1.43.0-tm-v0.34.35 h1:L4GTm+JUXhB0a/nGPMq6jEqqe6THuYSQ8m2kUCtZYqw= github.com/celestiaorg/celestia-core v1.43.0-tm-v0.34.35/go.mod h1:bFr0lAGwaJ0mOHSBmib5/ca5pbBf1yKWGPs93Td0HPw= github.com/celestiaorg/cosmos-sdk v1.25.0-sdk-v0.46.16 h1:f+fTe7GGk0/qgdzyqB8kk8EcDf9d6MC22khBTQiDXsU= @@ -365,6 +368,8 @@ github.com/celestiaorg/go-square/merkle v0.0.0-20240117232118-fd78256df076 h1:PY github.com/celestiaorg/go-square/merkle v0.0.0-20240117232118-fd78256df076/go.mod h1:hlidgivKyvv7m4Yl2Fdf2mSTmazZYxX8+bnr5IQrI98= github.com/celestiaorg/go-square/v2 v2.1.0 h1:ECIvYEeHIWiIJGDCJxQNtzqm5DmnBly7XGhSpLsl+Lw= github.com/celestiaorg/go-square/v2 v2.1.0/go.mod h1:n3ztrh8CBjWOD6iWYMo3pPOlQIgzLK9yrnqMPcNo6g8= +github.com/celestiaorg/knuu v0.16.2 h1:OOl2xMf+5ryWtPcSF+M6gmw4YQPEh6lsCA/lTDl8fwI= +github.com/celestiaorg/knuu v0.16.2/go.mod h1:nB7IGCR984YKEDW+j5xHPOidYfbO4DoZI1rDKijvF5E= github.com/celestiaorg/merkletree v0.0.0-20230308153949-c33506a7aa26 h1:P2RI1xJ49EZ8cuHMcH+ZSBonfRDtBS8OS9Jdt1BWX3k= github.com/celestiaorg/merkletree v0.0.0-20230308153949-c33506a7aa26/go.mod h1:2m8ukndOegwB0PU0AfJCwDUQHqd7QQRlSXvQL5VToVY= github.com/celestiaorg/nmt v0.22.2 h1:JmOMtZL9zWAed1hiwb9DDs+ELcKp/ZQZ3rPverge/V8= @@ -398,6 +403,8 @@ github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.12.3 h1:8ht6F9MquybnY97at+VDZb3eQQr8ev79RueWeVaEcG4= +github.com/cilium/ebpf v0.12.3/go.mod h1:TctK1ivibvI3znr66ljgi4hqOT8EYQjz1KWBfb1UVgM= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= @@ -570,6 +577,8 @@ github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0 github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/elastic/gosigar v0.14.3 h1:xwkKwPia+hSfg9GqrCUKYdId102m9qTJIIr7egmK/uo= github.com/elastic/gosigar v0.14.3/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -588,10 +597,12 @@ github.com/etclabscore/go-openrpc-reflect v0.0.37/go.mod h1:0404Ky3igAasAOpyj1eE github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.10.17/go.mod h1:Lt5WzjM07XlXc95YzrhosmR4J9Ahd6X2wyEV2SvGhk0= -github.com/ethereum/go-ethereum v1.14.11 h1:8nFDCUUE67rPc6AKxFj7JKaOa2W/W1Rse3oS6LvvxEY= -github.com/ethereum/go-ethereum v1.14.11/go.mod h1:+l/fr42Mma+xBnhefL/+z11/hcmJ2egl+ScIVPjhc7E= +github.com/ethereum/go-ethereum v1.14.12 h1:8hl57x77HSUo+cXExrURjU/w1VhL+ShCTJrTwcCQSe4= +github.com/ethereum/go-ethereum v1.14.12/go.mod h1:RAC2gVMWJ6FkxSPESfbshrcKpIokgQKsVKmAuqdekDY= github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 h1:8NfxH2iXvJ60YRB8ChToFTUzl8awsc3cJ8CbLjGIl/A= github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= +github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= +github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= @@ -626,11 +637,12 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4 github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/gammazero/deque v0.2.0 h1:SkieyNB4bg2/uZZLxvya0Pq6diUlwx7m2TeT7GAIWaA= github.com/gammazero/deque v0.2.0/go.mod h1:LFroj8x4cMYCukHJDbxFCkT+r9AndaJnFMuZDV34tuU= github.com/gammazero/workerpool v1.1.3 h1:WixN4xzukFoN0XSeXF6puqEqFTl2mECI9S6W44HWy9Q= github.com/gammazero/workerpool v1.1.3/go.mod h1:wPjyBLDbyKnUn2XwwyD3EEwo9dHutia9/fwNmSHWACc= -github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= @@ -649,6 +661,8 @@ github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3Bop github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= +github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= @@ -709,6 +723,8 @@ github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaL github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -722,8 +738,8 @@ github.com/gogo/gateway v1.1.0 h1:u0SuhL9+Il+UbjM9VIE3ntfRujKbvVpFvNB4HbjeVQ0= github.com/gogo/gateway v1.1.0/go.mod h1:S7rR8FRQyG3QFESeSv4l2WnsyzlCLG0CzBbUUo/mbic= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= +github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -777,6 +793,8 @@ github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl76 github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/flatbuffers v1.12.1 h1:MVlul7pQNoDzWRLTw5imwYsl+usrS1TXG2H4jg6ImGw= github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -1093,6 +1111,7 @@ github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= @@ -1118,6 +1137,7 @@ github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrD github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= @@ -1353,6 +1373,10 @@ github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0/go.mod h1:43+3pMjjK github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q= github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= +github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.74 h1:fTo/XlPBTSpo3BAMshlwKL5RspXRv9us5UeHEGYCFe0= +github.com/minio/minio-go/v7 v7.0.74/go.mod h1:qydcVzV8Hqtj1VtEocfxbmVFa2siu6HGa+LDEPogjD8= github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= @@ -1381,10 +1405,14 @@ github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8oh github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +github.com/moby/spdystream v0.4.0 h1:Vy79D6mHeJJjiPdFEL2yku1kl0chZpJfZcPpb16BRl8= +github.com/moby/spdystream v0.4.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= @@ -1456,6 +1484,8 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= @@ -1689,6 +1719,7 @@ github.com/rollkit/go-da v0.8.0/go.mod h1:3eHWK5gkv8lhwq6bjOZOi82WwHyS2B9rQOlUrE github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= @@ -1733,7 +1764,6 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= @@ -1778,8 +1808,6 @@ github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= -github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= -github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= @@ -1802,8 +1830,9 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/supranational/blst v0.3.13 h1:AYeSxdOMacwu7FBmpfloBz5pbFXDmJL33RuwnKtmTjk= @@ -1843,8 +1872,6 @@ github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+l github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/tyler-smith/go-bip39 v1.0.2/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= -github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= -github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= @@ -1879,6 +1906,8 @@ github.com/wlynxg/anet v0.0.3/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguH github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU= github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= @@ -2021,8 +2050,8 @@ golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= -golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= +golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2069,8 +2098,8 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= -golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2154,8 +2183,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= -golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2201,8 +2230,8 @@ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= +golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2318,6 +2347,7 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2332,8 +2362,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -2343,8 +2373,8 @@ golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= -golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= +golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU= +golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2359,8 +2389,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2439,8 +2469,8 @@ golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyj golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= -golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= +golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o= +golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2702,8 +2732,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= -google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 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= @@ -2716,6 +2746,7 @@ gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -2755,6 +2786,18 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +k8s.io/api v0.30.2 h1:+ZhRj+28QT4UOH+BKznu4CBgPWgkXO7XAvMcMl0qKvI= +k8s.io/api v0.30.2/go.mod h1:ULg5g9JvOev2dG0u2hig4Z7tQ2hHIuS+m8MNZ+X6EmI= +k8s.io/apimachinery v0.31.3 h1:6l0WhcYgasZ/wk9ktLq5vLaoXJJr5ts6lkaQzgeYPq4= +k8s.io/apimachinery v0.31.3/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= +k8s.io/client-go v0.30.2 h1:sBIVJdojUNPDU/jObC+18tXWcTJVcwyqS9diGdWHk50= +k8s.io/client-go v0.30.2/go.mod h1:JglKSWULm9xlJLx4KCkfLLQ7XwtlbflV6uFFSHTMgVs= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= lukechampine.com/blake3 v1.3.0 h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE= @@ -2770,6 +2813,10 @@ rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/test/e2e/helper.go b/test/e2e/helper.go new file mode 100644 index 0000000000..9df287649a --- /dev/null +++ b/test/e2e/helper.go @@ -0,0 +1,72 @@ +package main + +import ( + "context" + "errors" + "fmt" + "log" + "time" + + "github.com/celestiaorg/celestia-app/v3/test/util/testnode" + + "github.com/tendermint/tendermint/rpc/client/http" +) + +func queryTxCount(ctx context.Context, rpcAddr string) (int, error) { + blockchain, err := testnode.ReadBlockchain(ctx, rpcAddr) + if err != nil { + return 0, err + } + + totalTxs := 0 + for _, block := range blockchain { + totalTxs += len(block.Data.Txs) + } + return totalTxs, nil +} + +func waitForTxs(ctx context.Context, rpcAddr string, expectedTxs int, logger *log.Logger) error { + ticker := time.NewTicker(queryTxCountInterval) + defer ticker.Stop() + + for range ticker.C { + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + + totalTxs, err := queryTxCount(ctx, rpcAddr) + if err != nil { + return err + } + + if totalTxs >= expectedTxs { + logger.Printf("Found %d transactions", totalTxs) + return nil + } + logger.Printf("Waiting for at least %d transactions, got %d so far", expectedTxs, totalTxs) + } + return nil +} + +func getHeight(ctx context.Context, client *http.HTTP, period time.Duration) (int64, error) { + timer := time.NewTimer(period) + defer timer.Stop() + ticker := time.NewTicker(100 * time.Millisecond) + defer ticker.Stop() + for { + select { + case <-timer.C: + return 0, fmt.Errorf("failed to get height after %.2f seconds", period.Seconds()) + case <-ticker.C: + status, err := client.Status(ctx) + if err == nil { + return status.SyncInfo.LatestBlockHeight, nil + } + if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) { + return 0, err + } + } + } +} diff --git a/test/e2e/main.go b/test/e2e/main.go new file mode 100644 index 0000000000..8f6536eb95 --- /dev/null +++ b/test/e2e/main.go @@ -0,0 +1,65 @@ +package main + +import ( + "log" + "os" + "strings" +) + +const ( + seed = 42 +) + +type TestFunc func(*log.Logger) error + +type Test struct { + Name string + Func TestFunc +} + +func main() { + logger := log.New(os.Stdout, "test-e2e", log.LstdFlags) + + tests := []Test{ + {"E2ESimple", E2ESimple}, + } + + // check if a specific test is passed and run it + specificTestFound := false + for _, arg := range os.Args[1:] { + for _, test := range tests { + if test.Name == arg { + runTest(logger, test) + specificTestFound = true + break + } + } + } + + if !specificTestFound { + logger.Println("No particular test specified. Running all tests.") + logger.Println("make test-e2e to run a specific test") + logger.Printf("Valid tests are: %s\n\n", getTestNames(tests)) + // if no specific test is passed, run all tests + for _, test := range tests { + runTest(logger, test) + } + } +} + +func runTest(logger *log.Logger, test Test) { + logger.Printf("=== RUN %s", test.Name) + err := test.Func(logger) + if err != nil { + logger.Fatalf("--- ERROR %s: %v", test.Name, err) + } + logger.Printf("--- ✅ PASS: %s \n\n", test.Name) +} + +func getTestNames(tests []Test) string { + testNames := make([]string, 0, len(tests)) + for _, test := range tests { + testNames = append(testNames, test.Name) + } + return strings.Join(testNames, ", ") +} diff --git a/test/e2e/prometheus/errors.go b/test/e2e/prometheus/errors.go new file mode 100644 index 0000000000..d24fb48074 --- /dev/null +++ b/test/e2e/prometheus/errors.go @@ -0,0 +1,12 @@ +package prometheus + +import "github.com/celestiaorg/knuu/pkg/errors" + +var ( + ErrPrometheusAlreadyRunning = errors.New("PrometheusAlreadyRunning", "prometheus instance is already running") + ErrEmptyScrapeJobName = errors.New("EmptyScrapeJobName", "scrape job name is empty") + ErrEmptyScrapeJobTarget = errors.New("EmptyScrapeJobTarget", "scrape job target is empty") + ErrFailedToFetchPrometheusData = errors.New("FailedToFetchPrometheusData", "failed to fetch prometheus data") + ErrFailedToParsePrometheusMetrics = errors.New("FailedToParsePrometheusMetrics", "failed to parse prometheus metrics") + ErrMetricNotFound = errors.New("MetricNotFound", "metric not found") +) diff --git a/test/e2e/prometheus/prometheus.go b/test/e2e/prometheus/prometheus.go new file mode 100644 index 0000000000..8edc597538 --- /dev/null +++ b/test/e2e/prometheus/prometheus.go @@ -0,0 +1,195 @@ +package prometheus + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "strconv" + "strings" + "time" + + "github.com/celestiaorg/knuu/pkg/instance" + "github.com/celestiaorg/knuu/pkg/knuu" +) + +const ( + instanceName = "prometheus" + image = "prom/prometheus:v2.49.0" + apiPort = 9090 + defaultScrapeInterval = 15 * time.Second + prometheusConfig = "/etc/prometheus/prometheus.yml" + prometheusArgs = "--config.file=" + prometheusConfig + fileOwner = "0:0" +) + +type ScrapeJob struct { + Name string + Target string + Interval time.Duration +} + +type Prometheus struct { + knuu *knuu.Knuu + instance *instance.Instance + prometheusProxyHost string + scrapeJobs []ScrapeJob +} + +type MetricFilter struct { + MetricName string + Labels map[string]string +} + +func New(kn *knuu.Knuu) (*Prometheus, error) { + ins, err := kn.NewInstance(instanceName) + if err != nil { + return nil, err + } + return &Prometheus{knuu: kn, instance: ins}, nil +} + +func (p *Prometheus) AddScrapeJob(ctx context.Context, scrapeJob ScrapeJob) error { + if p.instance.IsState(instance.StateStarted) { + return ErrPrometheusAlreadyRunning + } + + if scrapeJob.Name == "" { + return ErrEmptyScrapeJobName + } + if scrapeJob.Target == "" { + return ErrEmptyScrapeJobTarget + } + p.scrapeJobs = append(p.scrapeJobs, scrapeJob) + return nil +} + +func (p *Prometheus) Destroy(ctx context.Context) error { + return p.instance.Execution().Destroy(ctx) +} + +func (p *Prometheus) Start(ctx context.Context) error { + if err := p.instance.Build().SetImage(ctx, image); err != nil { + return err + } + + if err := p.instance.Network().AddPortTCP(apiPort); err != nil { + return err + } + + if err := p.instance.Build().Commit(ctx); err != nil { + return err + } + + if err := p.instance.Storage().AddFileBytes([]byte(p.generateConfig()), prometheusConfig, fileOwner); err != nil { + return err + } + + if err := p.instance.Build().SetArgs(prometheusArgs); err != nil { + return err + } + + if err := p.instance.Execution().Start(ctx); err != nil { + return err + } + + proxyHost, err := p.instance.Network().AddHost(ctx, apiPort) + if err != nil { + return err + } + p.prometheusProxyHost = proxyHost + + return nil +} + +// GetMetric returns the first matching metric from the prometheus instance +// Example: +// GetMetric(MetricFilter{MetricName: "node_start_ts", Labels: map[string]string{"instance_name": "12D3KooWNHuCns..."}}) +func (p *Prometheus) GetMetric(filter MetricFilter) (float64, error) { + + labels := []string{} + for k, v := range filter.Labels { + labels = append(labels, fmt.Sprintf(`%s="%s"`, k, v)) + } + query := fmt.Sprintf("%s{%s}", filter.MetricName, strings.Join(labels, ",")) + + client := &http.Client{ + Timeout: 10 * time.Second, + } + resp, err := client.Get(fmt.Sprintf("%s/api/v1/query?query=%s", p.prometheusProxyHost, query)) + if err != nil { + return 0, ErrFailedToFetchPrometheusData.Wrap(err) + } + defer resp.Body.Close() + body, err := io.ReadAll(resp.Body) + if err != nil { + return 0, ErrFailedToFetchPrometheusData.Wrap(err) + } + + var result map[string]interface{} + if err := json.Unmarshal(body, &result); err != nil { + return 0, ErrFailedToParsePrometheusMetrics.Wrap(err) + } + + data, ok := result["data"].(map[string]interface{}) + if !ok { + return 0, ErrFailedToParsePrometheusMetrics. + Wrap(fmt.Errorf("unexpected data format: 'data' field is missing or not a map")) + } + + results, ok := data["result"].([]interface{}) + if !ok || len(results) == 0 { + return 0, ErrFailedToParsePrometheusMetrics. + Wrap(fmt.Errorf("unexpected data format: 'result' field is missing or not a non-empty array")) + } + + metric, ok := results[0].(map[string]interface{}) + if !ok { + return 0, ErrFailedToParsePrometheusMetrics. + Wrap(fmt.Errorf("unexpected data format: first result is not a map")) + } + + valueArray, ok := metric["value"].([]interface{}) + if !ok || len(valueArray) < 2 { + return 0, ErrFailedToParsePrometheusMetrics. + Wrap(fmt.Errorf("unexpected data format: 'value' field is missing or not an array with at least two elements")) + } + + // valueArray[0] is the timestamp + // valueArray[1] is the metric value + metricValueStr, ok := valueArray[1].(string) + if !ok { + return 0, ErrFailedToParsePrometheusMetrics. + Wrap(fmt.Errorf("value is not a string is %T", valueArray[1])) + } + + metricValue, err := strconv.ParseFloat(metricValueStr, 64) + if err != nil { + return 0, ErrFailedToParsePrometheusMetrics.Wrap(err) + } + + return metricValue, nil +} + +func (p *Prometheus) generateConfig() string { + conf := fmt.Sprintf(` +global: + scrape_interval: %s + +scrape_configs: +`, defaultScrapeInterval.String()) + + var builder strings.Builder + for _, j := range p.scrapeJobs { + builder.WriteString(fmt.Sprintf(` + - job_name: %s + scrape_interval: %s + static_configs: + - targets: [%s] +`, j.Name, j.Interval.String(), j.Target)) + } + conf += builder.String() + + return conf +} diff --git a/test/e2e/simple.go b/test/e2e/simple.go new file mode 100644 index 0000000000..8fc5111667 --- /dev/null +++ b/test/e2e/simple.go @@ -0,0 +1,172 @@ +package main + +import ( + "context" + "fmt" + "log" + "time" + + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/test/e2e/testnet" + "github.com/celestiaorg/celestia-node/test/e2e/prometheus" + nodeTestnet "github.com/celestiaorg/celestia-node/test/e2e/testnet" + "github.com/celestiaorg/knuu/pkg/knuu" +) + +const ( + appVersion = "v3.0.2" + nodeVersion = "v0.20.4" + timeFormat = "20060102_150405" + heightMetricsName = "hdr_store_head_height_gauge" + instanceMetricName = "exported_instance" + queryTxCountInterval = 10 * time.Second + queryTxCountTimeout = 3 * time.Minute + + metricRetryInterval = 5 * time.Second + metricRetryTimeout = 30 * time.Second +) + +func E2ESimple(logger *log.Logger) error { + const ( + testName = "E2ESimple" + validatorsCount = 4 + bootstrapperBridgeCount = 1 + bootstrapperFullCount = 1 + bridgeCount = 1 + fullCount = 1 + lightCount = 1 + expectedTxs = 10 + ) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // Logging test information + logger.Printf("Running test: %s, app_version: %s, node_version: %s, validators_count: %d, bootstrapper_bridge_count: %d, bootstrapper_full_count: %d, bridge_count: %d, full_count: %d, light_count: %d", testName, appVersion, nodeVersion, validatorsCount, bootstrapperBridgeCount, bootstrapperFullCount, bridgeCount, fullCount, lightCount) + + // Initializing Kubernetes and Minio clients + scope := fmt.Sprintf("%s-%s", testName, time.Now().Format(timeFormat)) + + // Initializing Knuu + kn, err := knuu.New(ctx, knuu.Options{ + Scope: scope, + ProxyEnabled: true, + }) + testnet.NoError("failed to initialize knuu", err) + kn.HandleStopSignal(ctx) + logger.Printf("Knuu initialized, scope: %s", kn.Scope) + + // Creating and setting up the testnet + tn, err := nodeTestnet.NewNodeTestnet(ctx, logger, kn, testnet.Options{}) + testnet.NoError("failed to create testnet", err) + defer tn.Cleanup(ctx) + + tn.SetConsensusParams(app.DefaultInitialConsensusParams()) + + // Creating genesis nodes + logger.Println("Creating testnet validators") + testnet.NoError("failed to create genesis nodes", tn.CreateGenesisNodes(ctx, validatorsCount, appVersion, 10000000, 0, testnet.DefaultResources, true)) + + // Creating transaction simulator + logger.Println("Creating txsim") + endpoints, err := tn.RemoteGRPCEndpoints(ctx) + testnet.NoError("failed to get remote gRPC endpoints", err) + err = tn.CreateTxClient(ctx, "txsim", testnet.TxsimVersion, 1, "100-2000", 100, testnet.DefaultResources, endpoints[0], nil) + testnet.NoError("failed to create tx client", err) + + // Setting up and starting the testnet + logger.Println("Setting up testnet") + testnet.NoError("failed to setup testnet", tn.Setup(ctx)) + + logger.Println("Starting testnet") + testnet.NoError("failed to start testnet", tn.Start(ctx)) + + // Retrieving chain ID and genesis hash + chainID := tn.ChainID() + genesisHash, err := tn.GenesisHash(ctx) + testnet.NoError("failed to get genesis hash", err) + coreIP := tn.Node(0).Instance.Network().HostName() + + // Creating bootstrapper nodes + testnet.NoError("failed to create bootstrapper bridge nodes", + tn.CreateBridgeNodes(ctx, bootstrapperBridgeCount, nodeVersion, chainID, genesisHash, coreIP, true, true, nodeTestnet.DefaultBridgeResources), + ) + testnet.NoError("failed to create bootstrapper full nodes", + tn.CreateFullNodes(ctx, bootstrapperFullCount, nodeVersion, chainID, genesisHash, coreIP, true, true, nodeTestnet.DefaultFullResources), + ) + + // Creating other nodes + testnet.NoError("failed to create bridge nodes", + tn.CreateBridgeNodes(ctx, bridgeCount, nodeVersion, chainID, genesisHash, coreIP, false, true, nodeTestnet.DefaultBridgeResources), + ) + testnet.NoError("failed to create full nodes", + tn.CreateFullNodes(ctx, fullCount, nodeVersion, chainID, genesisHash, coreIP, false, true, nodeTestnet.DefaultFullResources), + ) + testnet.NoError("failed to create light nodes", + tn.CreateLightNodes(ctx, lightCount, nodeVersion, chainID, genesisHash, coreIP, nodeTestnet.DefaultLightResources), + ) + + // Enabling Prometheus + testnet.NoError("failed to enable prometheus", tn.EnablePrometheus(ctx)) + + // Setting up and starting the DA testnet + logger.Println("Setting up DA testnet") + testnet.NoError("failed to setup DA testnet", tn.SetupDA(ctx)) + + logger.Println("Starting DA testnet") + testnet.NoError("failed to start DA testnet", tn.StartDA(ctx)) + + // Waiting for transactions + logger.Printf("Waiting for at least %d transactions", expectedTxs) + waitCtx, waitCancel := context.WithTimeout(ctx, queryTxCountTimeout) + defer waitCancel() + err = waitForTxs(waitCtx, tn.Node(0).AddressRPC(), expectedTxs, logger) + testnet.NoError("failed to wait for transactions", err) + + // Retrieving consensus height + client, err := tn.Node(0).Client() + testnet.NoError("failed to get client", err) + consensusHeight, err := getHeight(ctx, client, 10*time.Second) + testnet.NoError("failed to get consensus height", err) + logger.Printf("Consensus height: %d", consensusHeight) + + // Waiting for Prometheus metrics + logger.Println("Waiting for prometheus metrics to be scraped from the DA nodes") + for _, n := range tn.DaNodes() { + nodeID, err := n.GetNodeID(ctx) + testnet.NoError("failed to get node ID", err) + if nodeID == "" { + return fmt.Errorf("node ID is empty") + } + + // Retry for a maximum of 1 minute, checking every 10 seconds + retryCtx, cancel := context.WithTimeout(ctx, 1*time.Minute) + defer cancel() + + ticker := time.NewTicker(10 * time.Second) + defer ticker.Stop() + + success := false + for !success { + select { + case <-retryCtx.Done(): + testnet.NoError("failed to get metric within 1 minute", fmt.Errorf("timeout reached")) + return fmt.Errorf("failed to get metric within 1 minute") + case <-ticker.C: + value, err := tn.Prometheus.GetMetric(prometheus.MetricFilter{ + MetricName: heightMetricsName, + Labels: map[string]string{instanceMetricName: nodeID}, + }) + if err == nil { + logger.Printf("node: %s, metric value: %v", n.Name, value) + if int(value) >= int(consensusHeight) { + success = true + break + } + } + } + } + } + + return nil +} diff --git a/test/e2e/testnet/defaults.go b/test/e2e/testnet/defaults.go new file mode 100644 index 0000000000..c1b1924c68 --- /dev/null +++ b/test/e2e/testnet/defaults.go @@ -0,0 +1,47 @@ +package testnet + +import ( + "time" + + "github.com/celestiaorg/celestia-app/v3/test/e2e/testnet" + "k8s.io/apimachinery/pkg/api/resource" +) + +const ( + p2pPortTcp = 2121 + p2pPortUdp = 2121 + websocketPort = 2122 + restPort = 26659 + rpcPort = 26658 + prometheusPort = 6060 + dockerSrcURL = "ghcr.io/celestiaorg/celestia-node" + remoteRootDir = "/home/celestia" + celestiaCustomEnv = "CELESTIA_CUSTOM" + celestiaBootstrapEnv = "CELESTIA_BOOTSTRAPPER" + + prometheusExporterPort = 9091 + prometheusScrapeInterval = time.Second * 2 + otlpPort = 4317 + otlpRemotePort = 4318 +) + +var DefaultBridgeResources = testnet.Resources{ + MemoryRequest: resource.MustParse("1Gi"), + MemoryLimit: resource.MustParse("1Gi"), + CPU: resource.MustParse("300m"), + Volume: resource.MustParse("1Gi"), +} + +var DefaultFullResources = testnet.Resources{ + MemoryRequest: resource.MustParse("1Gi"), + MemoryLimit: resource.MustParse("1Gi"), + CPU: resource.MustParse("300m"), + Volume: resource.MustParse("1Gi"), +} + +var DefaultLightResources = testnet.Resources{ + MemoryRequest: resource.MustParse("500Mi"), + MemoryLimit: resource.MustParse("500Mi"), + CPU: resource.MustParse("150m"), + Volume: resource.MustParse("1Gi"), +} diff --git a/test/e2e/testnet/errors.go b/test/e2e/testnet/errors.go new file mode 100644 index 0000000000..87ddf095d5 --- /dev/null +++ b/test/e2e/testnet/errors.go @@ -0,0 +1,53 @@ +package testnet + +import ( + "github.com/celestiaorg/knuu/pkg/errors" +) + +type Error = errors.Error + +var ( + ErrEmptyInstanceName = errors.New("EmptyInstanceName", "instance name is empty") + ErrInvalidNodeType = errors.New("InvalidNodeType", "invalid node type") + ErrEmptyVersion = errors.New("EmptyVersion", "version is empty") + ErrEmptyChainID = errors.New("EmptyChainID", "chain id is empty") + ErrEmptyGenesisHash = errors.New("EmptyGenesisHash", "genesis hash is empty") + ErrEmptyExecutor = errors.New("EmptyExecutor", "executor is empty") + ErrEmptyConsensus = errors.New("EmptyConsensus", "consensus is empty") + ErrExecutorNotSet = errors.New("ExecutorNotSet", "executor is not set") + ErrConsensusNotSet = errors.New("ConsensusNotSet", "consensus is not set") + ErrEmptyAppHostName = errors.New("EmptyAppHostName", "app host name is empty") + ErrFailedToGetStatus = errors.New("FailedToGetStatus", "failed to get status") + ErrFailedToUnmarshalStatus = errors.New("FailedToUnmarshalStatus", "failed to unmarshal status") + ErrFailedToGetResultFromStatus = errors.New("FailedToGetResultFromStatus", "failed to get result from status") + ErrFailedToGetNodeInfoFromStatus = errors.New("FailedToGetNodeInfoFromStatus", "failed to get node info from status") + ErrFailedToGetNetworkFromNodeInfo = errors.New("FailedToGetNetworkFromNodeInfo", "failed to get network from node info") + ErrFailedToGetErrorDataFromStatus = errors.New("FailedToGetErrorDataFromStatus", "failed to get error data from status") + ErrFailedToGetIdFromNodeInfo = errors.New("FailedToGetIdFromNodeInfo", "failed to get id from node info") + ErrFailedToGetHashFromBlockId = errors.New("FailedToGetHashFromBlockId", "failed to get hash from block id") + ErrFailedToGetLatestBlockHeight = errors.New("FailedToGetLatestBlockHeight", "failed to get latest block height") + ErrFailedToConvertLatestBlockHeightToInt = errors.New("FailedToConvertLatestBlockHeightToInt", "failed to convert latest block height to int") + ErrFailedToUnmarshalBlock = errors.New("FailedToUnmarshalBlock", "failed to unmarshal block") + ErrFailedToGetResultFromBlock = errors.New("FailedToGetResultFromBlock", "failed to get result from block") + ErrFailedToGetBlockIdFromBlock = errors.New("FailedToGetBlockIdFromBlock", "failed to get block id from block") + ErrFailedToGetSyncInfoFromStatus = errors.New("FailedToGetSyncInfoFromStatus", "failed to get sync info from status") + ErrFailedToGetLatestBlockHeightFromSyncInfo = errors.New("FailedToGetLatestBlockHeightFromSyncInfo", "failed to get latest block height from sync info") + ErrFailedToConvertLatestBlockHeightFromSyncInfoToInt = errors.New("FailedToConvertLatestBlockHeightFromSyncInfoToInt", "failed to convert latest block height from sync info to int") + ErrFailedToGetValidatorIP = errors.New("FailedToGetValidatorIP", "failed to get validator ip") + ErrFailedToGetBlock = errors.New("FailedToGetBlock", "failed to get block") + ErrFailedToGetHashFromBlock = errors.New("FailedToGetHashFromBlock", "failed to get hash from block") + ErrFailedToCreateBridge = errors.New("FailedToCreateBridge", "failed to create bridge") + ErrFailedToCreateNode = errors.New("FailedToCreateNode", "failed to create node") + ErrMetricNotFound = errors.New("MetricNotFound", "metric '%s' not found") + ErrFailedToFetchPrometheusData = errors.New("FailedToFetchPrometheusData", "failed to fetch Prometheus data") + ErrFailedToParsePrometheusMetrics = errors.New("FailedToParsePrometheusMetrics", "failed to parse Prometheus metrics") + ErrFailedToGetP2PInfo = errors.New("FailedToGetP2PInfo", "failed to get p2p info") + ErrFailedToGetIP = errors.New("FailedToGetIP", "failed to get ip") + ErrFailedToGetBridgeID = errors.New("FailedToGetBridgeID", "failed to get bridge id") + ErrFailedToGetNodeID = errors.New("FailedToGetNodeID", "failed to get node id") + ErrFailedToGetNodeHostName = errors.New("FailedToGetNodeHostName", "failed to get node host name") + ErrFailedToUnmarshalP2PInfo = errors.New("FailedToUnmarshalP2PInfo", "failed to unmarshal p2p info") + ErrFailedToGetResultFromP2PInfo = errors.New("FailedToGetResultFromP2PInfo", "failed to get result from p2p info") + ErrFailedToGetIDFromP2PInfo = errors.New("FailedToGetIDFromP2PInfo", "failed to get id from p2p info") + ErrOperationCanceled = errors.New("OperationCanceled", "operation canceled") +) diff --git a/test/e2e/testnet/node.go b/test/e2e/testnet/node.go new file mode 100644 index 0000000000..a4680748ae --- /dev/null +++ b/test/e2e/testnet/node.go @@ -0,0 +1,289 @@ +package testnet + +import ( + "context" + "fmt" + "log" + "os" + "path/filepath" + "strings" + + "github.com/cosmos/cosmos-sdk/crypto/keyring" + "github.com/libp2p/go-libp2p/core/peer" + + "github.com/celestiaorg/celestia-app/v3/app" + "github.com/celestiaorg/celestia-app/v3/app/encoding" + "github.com/celestiaorg/celestia-app/v3/test/e2e/testnet" + "github.com/celestiaorg/celestia-node/nodebuilder" + "github.com/celestiaorg/celestia-node/nodebuilder/node" + nodebuilderNode "github.com/celestiaorg/celestia-node/nodebuilder/node" + "github.com/celestiaorg/celestia-node/nodebuilder/p2p" + e2ePrometheus "github.com/celestiaorg/celestia-node/test/e2e/prometheus" + "github.com/celestiaorg/knuu/pkg/instance" + "github.com/celestiaorg/knuu/pkg/knuu" + "github.com/celestiaorg/knuu/pkg/sidecars/observability" + "github.com/libp2p/go-libp2p/core/host" +) + +type Node struct { + Name string + Type nodebuilderNode.Type + Version string + Instance *instance.Instance + sidecars []instance.SidecarManager + ChainID string + GenesisHash string + CoreIP string + nodeID string + bootstrapper bool + archival bool + rpcProxyHost string + + logger *log.Logger +} + +type JSONRPCError struct { + Code int + Message string + Data string +} + +func (e *JSONRPCError) Error() string { + return fmt.Sprintf("JSONRPC Error - Code: %d, Message: %s, Data: %s", e.Code, e.Message, e.Data) +} + +func NewNode(ctx context.Context, + logger *log.Logger, + name string, + version string, + nodeType nodebuilderNode.Type, + chainID string, + genesisHash string, + coreIP string, + bootstrapper bool, + archival bool, + resources testnet.Resources, + kn *knuu.Knuu, +) (*Node, error) { + // only type bridge and full can be bootstrapper + if bootstrapper && nodeType != node.Bridge && nodeType != node.Full { + return nil, fmt.Errorf("bootstrapper can only be true for bridge and full nodes") + } + knInstance, err := kn.NewInstance(name) + if err != nil { + return nil, err + } + err = knInstance.Build().SetImage(ctx, DockerImageName(version)) + if err != nil { + return nil, err + } + + for _, port := range []int{p2pPortTcp, websocketPort, restPort, rpcPort} { + if err := knInstance.Network().AddPortTCP(port); err != nil { + return nil, err + } + } + for _, port := range []int{p2pPortUdp} { + if err := knInstance.Network().AddPortUDP(port); err != nil { + return nil, err + } + } + // TODO: add obsy sidecar + err = knInstance.Resources().SetMemory(resources.MemoryRequest, resources.MemoryLimit) + if err != nil { + return nil, err + } + err = knInstance.Resources().SetCPU(resources.CPU) + if err != nil { + return nil, err + } + err = knInstance.Storage().AddVolumeWithOwner(remoteRootDir, resources.Volume, 10001) + if err != nil { + return nil, err + } + + return &Node{ + Name: name, + Type: nodeType, + Version: version, + Instance: knInstance, + ChainID: chainID, + GenesisHash: genesisHash, + CoreIP: coreIP, + bootstrapper: bootstrapper, + archival: archival, + logger: logger, + }, nil +} + +func (n *Node) Init(ctx context.Context, prometheus *e2ePrometheus.Prometheus) error { + tmpFolder, err := os.MkdirTemp("", "e2e_test_") + if err != nil { + return fmt.Errorf("creating temporary folder: %w", err) + } + defer os.RemoveAll(tmpFolder) + + nodeConfig := nodebuilder.DefaultConfig(n.Type) + nodeConfig.Core.IP = n.CoreIP + nodeConfig.RPC.Address = "0.0.0.0" + err = nodebuilder.Init(*nodeConfig, tmpFolder, n.Type) + if err != nil { + return fmt.Errorf("initializing node: %w", err) + } + encConf := encoding.MakeConfig(app.ModuleEncodingRegisters...) + keysPath := filepath.Join(tmpFolder, "keys") + ring, err := keyring.New(app.Name, nodeConfig.State.DefaultBackendName, keysPath, os.Stdin, encConf.Codec) + if err != nil { + return fmt.Errorf("creating keyring: %w", err) + } + store, err := nodebuilder.OpenStore(tmpFolder, ring) + if err != nil { + return fmt.Errorf("opening store: %w", err) + } + node, err := nodebuilder.NewWithConfig(n.Type, p2p.Mainnet, store, nodeConfig) + if err != nil { + return fmt.Errorf("creating node: %w", err) + } + err = os.RemoveAll(filepath.Join(tmpFolder, "blocks")) + if err != nil { + return fmt.Errorf("removing blocks folder: %w", err) + } + err = os.RemoveAll(filepath.Join(tmpFolder, "data")) + if err != nil { + return fmt.Errorf("removing data folder: %w", err) + } + err = os.MkdirAll(filepath.Join(tmpFolder, "data"), 0755) + if err != nil { + return fmt.Errorf("creating data folder: %w", err) + } + n.nodeID = peer.AddrInfosToIDs([]peer.AddrInfo{*host.InfoFromHost(node.Host)})[0].String() + n.logger.Printf("id: %+v", n.nodeID) + err = os.WriteFile(filepath.Join(tmpFolder, "data", ".folderkeep"), []byte("This file is needed so that knuu can start the node"), 0644) + if err != nil { + return fmt.Errorf("writing placeholder file: %w", err) + } + + if prometheus != nil { + obsy, err := createObservability() + if err != nil { + return err + } + + if err := n.Instance.Sidecars().Add(ctx, obsy); err != nil { + return err + } + + // Expose the prometheus exporter on the otel collector instance + if err := obsy.Instance().Network().AddPortTCP(prometheusExporterPort); err != nil { + return err + } + + err = prometheus.AddScrapeJob(ctx, e2ePrometheus.ScrapeJob{ + Name: n.Name, + Target: fmt.Sprintf("%s:%d", n.Name, prometheusExporterPort), + Interval: prometheusScrapeInterval, + }) + if err != nil { + return err + } + } + + err = n.Instance.Build().Commit(ctx) + if err != nil { + return fmt.Errorf("committing: %w", err) + } + + for _, sc := range n.sidecars { + if err := n.Instance.Sidecars().Add(ctx, sc); err != nil { + return fmt.Errorf("adding sidecar: %w", err) + } + } + + if err := n.Instance.Storage().AddFolder(tmpFolder, "/home/celestia", "10001:10001"); err != nil { + return fmt.Errorf("adding folder: %w", err) + } + if n.bootstrapper { + if err := n.Instance.Build().SetEnvironmentVariable(celestiaBootstrapEnv, fmt.Sprintf("%t", n.bootstrapper)); err != nil { + return fmt.Errorf("setting bootstrap env: %w", err) + } + } + + args := fmt.Sprintf("celestia %s start --node.store %s", strings.ToLower(n.Type.String()), remoteRootDir) + if n.archival { + args = fmt.Sprintf("%s --archival", args) + } + if prometheus != nil { + args = fmt.Sprintf("%s --metrics --metrics.endpoint 0.0.0.0:%d --metrics.tls=false", args, otlpPort) + } + if err := n.Instance.Build().SetStartCommand("bash", "-c"); err != nil { + return fmt.Errorf("setting start command: %w", err) + } + if err := n.Instance.Build().SetArgs(args); err != nil { + return fmt.Errorf("setting args: %w", err) + } + + return nil +} + +func (n *Node) GetNodeID(ctx context.Context) (string, error) { + return n.nodeID, nil +} + +func (n *Node) AddressP2P(ctx context.Context) (string, error) { + hostName := n.Instance.Network().HostName() + return fmt.Sprintf("/dns/%s/tcp/2121/p2p/%s", hostName, n.nodeID), nil +} + +func createObservability() (*observability.Obsy, error) { + obsy := observability.New() + if err := obsy.SetOtelEndpoint(otlpPort); err != nil { + return nil, err + } + if err := obsy.SetPrometheusEndpoint(prometheusPort, "libp2p", "10s"); err != nil { + return nil, err + } + + if err := obsy.SetPrometheusExporter(fmt.Sprintf("0.0.0.0:%d", prometheusExporterPort)); err != nil { + return nil, err + } + + return obsy, nil +} + +func (n *Node) Start(ctx context.Context, bootstrappers []string) error { + if err := n.StartAsync(ctx, bootstrappers); err != nil { + return fmt.Errorf("starting async: %w", err) + } + + return n.WaitUntilStarted(ctx) +} + +func (n *Node) StartAsync(ctx context.Context, bootstrappers []string) error { + envValue := fmt.Sprintf("%s:%s", n.ChainID, n.GenesisHash) + if len(bootstrappers) > 0 { + envValue = fmt.Sprintf("%s:%s", envValue, strings.Join(bootstrappers, ",")) + } + if err := n.Instance.Build().SetEnvironmentVariable(celestiaCustomEnv, envValue); err != nil { + return fmt.Errorf("setting celestia custom env: %w", err) + } + + return n.Instance.Execution().StartAsync(ctx) +} + +func (n *Node) WaitUntilStarted(ctx context.Context) error { + if err := n.Instance.Execution().WaitInstanceIsRunning(ctx); err != nil { + return fmt.Errorf("waiting for instance to start: %w", err) + } + + return nil +} + +// AddressRPC returns an RPC endpoint address for the node. +// This returns the proxy host that can be used to communicate with the node +func (n Node) AddressRPC() string { + return n.rpcProxyHost +} + +func DockerImageName(version string) string { + return fmt.Sprintf("%s:%s", dockerSrcURL, version) +} diff --git a/test/e2e/testnet/testnet.go b/test/e2e/testnet/testnet.go new file mode 100644 index 0000000000..3944b50f87 --- /dev/null +++ b/test/e2e/testnet/testnet.go @@ -0,0 +1,213 @@ +package testnet + +import ( + "context" + "fmt" + "log" + + "github.com/celestiaorg/celestia-app/v3/test/e2e/testnet" + + nodebuilderNode "github.com/celestiaorg/celestia-node/nodebuilder/node" + "github.com/celestiaorg/celestia-node/test/e2e/prometheus" + "github.com/celestiaorg/knuu/pkg/instance" + "github.com/celestiaorg/knuu/pkg/knuu" +) + +// LocalTestnet extends the testnet from celestia-app +type NodeTestnet struct { + testnet.Testnet + knuu *knuu.Knuu + nodes []*Node + + Prometheus *prometheus.Prometheus + + logger *log.Logger +} + +// NewLocalTestnet creates a new instance of LocalTestnet +func NewNodeTestnet(ctx context.Context, logger *log.Logger, kn *knuu.Knuu, opts testnet.Options) (*NodeTestnet, error) { + tn, err := testnet.New(logger, kn, opts) + if err != nil { + return nil, err + } + + return &NodeTestnet{ + Testnet: *tn, + nodes: []*Node{}, + knuu: kn, + logger: logger, + }, nil +} + +func (nt *NodeTestnet) EnablePrometheus(ctx context.Context) error { + prom, err := prometheus.New(nt.knuu) + if err != nil { + return err + } + nt.Prometheus = prom + return nil +} + +func (nt *NodeTestnet) CreateBridgeNode(ctx context.Context, version string, chainID string, genesisHash string, coreIP string, bootstrapper bool, archival bool, resources testnet.Resources) error { + err := nt.CreateDANode(ctx, version, nodebuilderNode.Bridge, chainID, genesisHash, coreIP, bootstrapper, archival, resources) + if err != nil { + return err + } + return nil +} + +func (nt *NodeTestnet) CreateBridgeNodes(ctx context.Context, count int, version string, chainID string, genesisHash string, coreIP string, bootstrapper bool, archival bool, resources testnet.Resources) error { + for i := 0; i < count; i++ { + err := nt.CreateBridgeNode(ctx, version, chainID, genesisHash, coreIP, bootstrapper, archival, resources) + if err != nil { + return err + } + } + return nil +} + +func (nt *NodeTestnet) CreateFullNode(ctx context.Context, version string, chainID string, genesisHash string, coreIP string, bootstrapper bool, archival bool, resources testnet.Resources) error { + err := nt.CreateDANode(ctx, version, nodebuilderNode.Full, chainID, genesisHash, coreIP, bootstrapper, archival, resources) + if err != nil { + return err + } + return nil +} + +func (nt *NodeTestnet) CreateFullNodes(ctx context.Context, count int, version string, chainID string, genesisHash string, coreIP string, bootstrapper bool, archival bool, resources testnet.Resources) error { + for i := 0; i < count; i++ { + err := nt.CreateFullNode(ctx, version, chainID, genesisHash, coreIP, bootstrapper, archival, resources) + if err != nil { + return err + } + } + return nil +} + +func (nt *NodeTestnet) CreateLightNode(ctx context.Context, version string, chainID string, genesisHash string, coreIP string, resources testnet.Resources) error { + err := nt.CreateDANode(ctx, version, nodebuilderNode.Light, chainID, genesisHash, coreIP, false, false, resources) + if err != nil { + return err + } + return nil +} + +func (nt *NodeTestnet) CreateLightNodes(ctx context.Context, count int, version string, chainID string, genesisHash string, coreIP string, resources testnet.Resources) error { + for i := 0; i < count; i++ { + err := nt.CreateLightNode(ctx, version, chainID, genesisHash, coreIP, resources) + if err != nil { + return err + } + } + return nil +} + +func (nt *NodeTestnet) CreateDANode( + ctx context.Context, + version string, + nodeType nodebuilderNode.Type, + chainID string, + genesisHash string, + coreIP string, + bootstrapper bool, + archival bool, + resources testnet.Resources, +) error { + nt.logger.Printf("Creating %s node", nodeType) + node, err := NewNode(ctx, nt.logger, fmt.Sprintf("%s%d", nodeType, len(nt.nodes)), version, nodeType, chainID, genesisHash, coreIP, bootstrapper, archival, resources, nt.knuu) + if err != nil { + return err + } + nt.nodes = append(nt.nodes, node) + return nil +} + +func (nt *NodeTestnet) SetupDA(ctx context.Context) error { + for _, node := range nt.nodes { + nt.logger.Printf("Initializing %s node", node.Type) + trustedPeers := []string{} + for _, otherNode := range nt.nodes { + if otherNode.Name != node.Name { + trustedPeers = append(trustedPeers, otherNode.Name) + } + } + if err := node.Init(ctx, nt.Prometheus); err != nil { + return err + } + } + return nil +} + +func (nt *NodeTestnet) WaitToSyncDANodes(_ context.Context) error { + // TODO: not needed right now, but maybe later + return nil +} + +func (nt *NodeTestnet) StartDANodes(ctx context.Context) error { + bootstrapperNodes := []*Node{} + otherNodes := []*Node{} + bootstrapperAddresses := []string{} + for _, node := range nt.nodes { + if node.bootstrapper { + bootstrapperNodes = append(bootstrapperNodes, node) + bootstrapperAddress, err := node.AddressP2P(ctx) + if err != nil { + return err + } + bootstrapperAddresses = append(bootstrapperAddresses, bootstrapperAddress) + } else { + otherNodes = append(otherNodes, node) + } + } + + for _, node := range bootstrapperNodes { + if err := node.StartAsync(ctx, bootstrapperAddresses); err != nil { + return err + } + } + for _, node := range bootstrapperNodes { + if err := node.WaitUntilStarted(ctx); err != nil { + return err + } + } + for _, node := range otherNodes { + if err := node.StartAsync(ctx, bootstrapperAddresses); err != nil { + return err + } + } + for _, node := range otherNodes { + if err := node.WaitUntilStarted(ctx); err != nil { + return err + } + } + return nil +} + +func (nt *NodeTestnet) StartDA(ctx context.Context) error { + err := nt.StartDANodes(ctx) + if err != nil { + return err + } + // wait for nodes to sync + nt.logger.Printf("waiting for DA nodes to sync") + err = nt.WaitToSync(ctx) + if err != nil { + return err + } + if nt.Prometheus != nil { + err = nt.Prometheus.Start(ctx) + if err != nil { + return fmt.Errorf("failed to start prometheus: %w", err) + } + } + return nil +} + +// DaNodes returns all DA nodes +func (nt *NodeTestnet) DaNodes() []*Node { + return nt.nodes +} + +func (nt *NodeTestnet) NewInstance(name string) (*instance.Instance, error) { + return nt.knuu.NewInstance(name) +}