diff --git a/.golangci.yml b/.golangci.yml index 2698b112..174789f6 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -22,7 +22,7 @@ linters: - tparallel - unconvert - whitespace - - wsl + - wsl_v5 settings: errcheck: check-type-assertions: true @@ -39,6 +39,10 @@ linters: nolintlint: require-explanation: true require-specific: true + wsl_v5: + allow-first-in-block: true + allow-whole-block: false + branch-max-lines: 2 exclusions: generated: lax presets: diff --git a/cmd/root.go b/cmd/root.go index 11a537b1..a6fee8b6 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -17,6 +17,7 @@ var rootCmd = &cobra.Command{ Short: "Checkpoint sync provider for Ethereum beacon nodes", Run: func(cmd *cobra.Command, args []string) { cfg := initCommon() + p := checkpointz.NewServer(log, cfg) if err := p.Start(context.Background()); err != nil { log.WithError(err).Fatal("failed to serve") @@ -54,7 +55,6 @@ func loadConfigFromFile(file string) (*checkpointz.Config, error) { } yamlFile, err := os.ReadFile(file) - if err != nil { return nil, err } diff --git a/go.mod b/go.mod index b678c0dc..73ce2d0c 100644 --- a/go.mod +++ b/go.mod @@ -3,15 +3,15 @@ module github.com/ethpandaops/checkpointz go 1.26.1 require ( - github.com/attestantio/go-eth2-client v0.27.2 github.com/chuckpreslar/emission v0.0.0-20170206194824-a7ddd980baf9 github.com/creasty/defaults v1.6.0 - github.com/ethpandaops/beacon v0.66.0 + github.com/ethpandaops/beacon v0.67.1-0.20260414085454-4de46d12471e github.com/ethpandaops/ethwallclock v0.2.0 + github.com/ethpandaops/go-eth2-client v0.1.0 github.com/go-co-op/gocron v1.18.0 github.com/julienschmidt/httprouter v1.3.0 github.com/nanmu42/gzip v1.2.0 - github.com/pk910/dynamic-ssz v1.1.1 + github.com/pk910/dynamic-ssz v1.3.0 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.23.2 github.com/sirupsen/logrus v1.9.3 @@ -21,45 +21,42 @@ require ( ) require ( - github.com/OffchainLabs/hashtree v0.2.1-0.20250530191054-577f0b75c7f7 // indirect + github.com/OffchainLabs/go-bitfield v0.0.0-20251031151322-f427d04d8506 // indirect + github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/casbin/govaluate v1.8.0 // indirect + github.com/casbin/govaluate v1.10.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect - github.com/emicklei/dot v1.6.4 // indirect - github.com/ethereum/go-ethereum v1.16.4 // indirect + github.com/ethereum/go-ethereum v1.17.2-0.20260324190457-8f361e342cb9 // indirect github.com/fatih/color v1.18.0 // indirect - github.com/ferranbt/fastssz v0.1.4 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/gin-gonic/gin v1.7.4 // indirect - github.com/go-logr/logr v1.2.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-playground/locales v0.14.0 // indirect github.com/go-playground/universal-translator v0.18.0 // indirect github.com/go-playground/validator/v10 v10.9.0 // indirect github.com/goccy/go-yaml v1.9.5 // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/golang/snappy v1.0.0 // indirect github.com/holiman/uint256 v1.3.2 // indirect github.com/huandu/go-clone v1.6.0 // indirect github.com/inconshreveable/mousetrap v1.0.1 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.18.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.9 // indirect + github.com/klauspost/cpuid/v2 v2.3.0 // indirect github.com/leodido/go-urn v1.2.1 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/minio/sha256-simd v1.0.1 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/pk910/hashtree-bindings v0.1.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.66.1 // indirect github.com/prometheus/procfs v0.16.1 // indirect - github.com/prysmaticlabs/go-bitfield v0.0.0-20240618144021-706c95b2dd15 // indirect github.com/r3labs/sse/v2 v2.10.0 // indirect github.com/robfig/cron/v3 v3.0.1 // indirect github.com/rs/zerolog v1.32.0 // indirect @@ -68,17 +65,18 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect github.com/ugorji/go/codec v1.2.6 // indirect - go.opentelemetry.io/otel v1.16.0 // indirect - go.opentelemetry.io/otel/metric v1.16.0 // indirect - go.opentelemetry.io/otel/trace v1.16.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/otel v1.40.0 // indirect + go.opentelemetry.io/otel/metric v1.40.0 // indirect + go.opentelemetry.io/otel/trace v1.40.0 // indirect go.yaml.in/yaml/v2 v2.4.2 // indirect golang.org/x/crypto v0.45.0 // indirect golang.org/x/net v0.47.0 // indirect golang.org/x/sync v0.18.0 // indirect - golang.org/x/sys v0.38.0 // indirect + golang.org/x/sys v0.40.0 // indirect golang.org/x/text v0.31.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect - google.golang.org/protobuf v1.36.8 // indirect + google.golang.org/protobuf v1.36.11 // indirect gopkg.in/cenkalti/backoff.v1 v1.1.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index b1982573..fd0ef09f 100644 --- a/go.sum +++ b/go.sum @@ -1,11 +1,11 @@ -github.com/OffchainLabs/hashtree v0.2.1-0.20250530191054-577f0b75c7f7 h1:0r1HjExe/tyypkt380UTpjvILd5kLw51Xzl6a+hknQ8= -github.com/OffchainLabs/hashtree v0.2.1-0.20250530191054-577f0b75c7f7/go.mod h1:b07+cRZs+eAR8TR57CB9TQlt5Gnl/06Xs76xt/1wq0M= -github.com/attestantio/go-eth2-client v0.27.2 h1:VjA9R39ovy8ryb7IpFfD5eLYBg/20biztxh6fKZ7/K0= -github.com/attestantio/go-eth2-client v0.27.2/go.mod h1:i56XBegxVt7wXupnLBOj9IyGwy5cqaoTsCSKlwTubEU= +github.com/OffchainLabs/go-bitfield v0.0.0-20251031151322-f427d04d8506 h1:d/SJkN8/9Ca+1YmuDiUJxAiV4w/a9S8NcsG7GMQSrVI= +github.com/OffchainLabs/go-bitfield v0.0.0-20251031151322-f427d04d8506/go.mod h1:6TZI4FU6zT8x6ZfWa1J8YQ2NgW0wLV/W3fHRca8ISBo= +github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6 h1:1zYrtlhrZ6/b6SAjLSfKzWtdgqK0U+HtH/VcBWh1BaU= +github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6/go.mod h1:ioLG6R+5bUSO1oeGSDxOV3FADARuMoytZCSX6MEMQkI= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/casbin/govaluate v1.8.0 h1:1dUaV/I0LFP2tcY1uNQEb6wBCbp8GMTcC/zhwQDWvZo= -github.com/casbin/govaluate v1.8.0/go.mod h1:G/UnbIjZk/0uMNaLwZZmFQrR72tYRZWQkO70si/iR7A= +github.com/casbin/govaluate v1.10.0 h1:ffGw51/hYH3w3rZcxO/KcaUIDOLP84w7nsidMVgaDG0= +github.com/casbin/govaluate v1.10.0/go.mod h1:G/UnbIjZk/0uMNaLwZZmFQrR72tYRZWQkO70si/iR7A= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chuckpreslar/emission v0.0.0-20170206194824-a7ddd980baf9 h1:xz6Nv3zcwO2Lila35hcb0QloCQsc38Al13RNEzWRpX4= @@ -22,19 +22,17 @@ github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/emicklei/dot v1.6.4 h1:cG9ycT67d9Yw22G+mAb4XiuUz6E6H1S0zePp/5Cwe/c= -github.com/emicklei/dot v1.6.4/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= -github.com/ethereum/go-ethereum v1.16.4 h1:H6dU0r2p/amA7cYg6zyG9Nt2JrKKH6oX2utfcqrSpkQ= -github.com/ethereum/go-ethereum v1.16.4/go.mod h1:P7551slMFbjn2zOQaKrJShZVN/d8bGxp4/I6yZVlb5w= -github.com/ethpandaops/beacon v0.66.0 h1:BRnf4yTEzkZwHW6sTp1x+mBoO5pwbQOX6wtLt3Nh1Y4= -github.com/ethpandaops/beacon v0.66.0/go.mod h1:lgzrJjQVV77wZ+PJymsY3bQbAK4jrtP8n3WOwMf1Pcs= +github.com/ethereum/go-ethereum v1.17.2-0.20260324190457-8f361e342cb9 h1:87oCZDemf+tvCIUtKt9EUtkfXbU/llIl41ML8+vZ8Mo= +github.com/ethereum/go-ethereum v1.17.2-0.20260324190457-8f361e342cb9/go.mod h1:KHcRXfGOUfUmKg51IhQ0IowiqZ6PqZf08CMtk0g5K1o= +github.com/ethpandaops/beacon v0.67.1-0.20260414085454-4de46d12471e h1:SVNjoOoy1OrEdhpO+MYCxh/ChssgBMZy47U29Z2AirU= +github.com/ethpandaops/beacon v0.67.1-0.20260414085454-4de46d12471e/go.mod h1:huTiadnAh+6EfLqDu+HhI72Zfr2alJh4tjTt5Rt7C2g= github.com/ethpandaops/ethwallclock v0.2.0 h1:EeFKtZ7v6TAdn/oAh0xaPujD7N4amjBxrWIByraUfLM= github.com/ethpandaops/ethwallclock v0.2.0/go.mod h1:y0Cu+mhGLlem19vnAV2x0hpFS5KZ7oOi2SWYayv9l24= +github.com/ethpandaops/go-eth2-client v0.1.0 h1:migUQIIL3fcWWMmIwF4Rh05rvJPuj+LOgDJkIWZ+gIE= +github.com/ethpandaops/go-eth2-client v0.1.0/go.mod h1:9BBd/XIw1egZTkxtFGMvgXnsxX6ypKHKNKD7itqjmNQ= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= -github.com/ferranbt/fastssz v0.1.4 h1:OCDB+dYDEQDvAgtAGnTSidK1Pe2tW3nFV40XyMkTeDY= -github.com/ferranbt/fastssz v0.1.4/go.mod h1:Ea3+oeoRGGLGm5shYAeDgu6PGUlcvQhE2fILyD9+tGg= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -48,8 +46,8 @@ github.com/gin-gonic/gin v1.7.4/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjX github.com/go-co-op/gocron v1.18.0 h1:SxTyJ5xnSN4byCq7b10LmmszFdxQlSQJod8s3gbnXxA= github.com/go-co-op/gocron v1.18.0/go.mod h1:sD/a0Aadtw5CpflUJ/lpP9Vfdk979Wl1Sg33HPHg0FY= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= @@ -79,8 +77,8 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 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= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -107,8 +105,8 @@ github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8 github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= -github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= +github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= +github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= @@ -133,10 +131,6 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= -github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= 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= @@ -156,8 +150,10 @@ github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9k github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/pk910/dynamic-ssz v1.1.1 h1:b8sPR8fyhBvz8SHa2RH20SNtt5VDzAEY6fKsPCUcYX4= -github.com/pk910/dynamic-ssz v1.1.1/go.mod h1:3zyemisUysY2PWACZ8LeZS2tAw8AkuTb2GaLmqYsg1I= +github.com/pk910/dynamic-ssz v1.3.0 h1:b6v5v3HWAmdxSVKWk4GS7Y/lhURZPAHRQ7EEMUparQk= +github.com/pk910/dynamic-ssz v1.3.0/go.mod h1:NmeFF4jxzVwWC8cnEhUB7xMI++8hd/0OZvZHFrUvFfs= +github.com/pk910/hashtree-bindings v0.1.0 h1:w7NyRWFi2OaYEFvo9ADcE/QU6PMuVLl3hBgx92KiH9c= +github.com/pk910/hashtree-bindings v0.1.0/go.mod h1:zrWt88783JmhBfcgni6kkIMYRdXTZi/FL//OyI5T/l4= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -171,18 +167,14 @@ github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9Z github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= -github.com/prysmaticlabs/go-bitfield v0.0.0-20240618144021-706c95b2dd15 h1:lC8kiphgdOBTcbTvo8MwkvpKjO0SlAgjv4xIK5FGJ94= -github.com/prysmaticlabs/go-bitfield v0.0.0-20240618144021-706c95b2dd15/go.mod h1:8svFBIKKu31YriBG/pNizo9N0Jr9i5PQ+dFkxWg3x5k= -github.com/prysmaticlabs/gohashtree v0.0.4-beta h1:H/EbCuXPeTV3lpKeXGPpEV9gsUpkqOOVnWapUyeWro4= -github.com/prysmaticlabs/gohashtree v0.0.4-beta/go.mod h1:BFdtALS+Ffhg3lGQIHv9HDWuHS8cTvHZzrHWxwOtGOs= github.com/r3labs/sse/v2 v2.10.0 h1:hFEkLLFY4LDifoHdiCN/LlGBAdVJYsANaLqNYa1l/v0= github.com/r3labs/sse/v2 v2.10.0/go.mod h1:Igau6Whc+F17QUgML1fYe1VPZzTV6EMCnYktEmkNJ7I= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0= github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= @@ -211,12 +203,14 @@ github.com/ugorji/go v1.2.6/go.mod h1:anCg0y61KIhDlPZmnH+so+RQbysYVyDko0IMgJv0Nn github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ugorji/go/codec v1.2.6 h1:7kbGefxLoDBuYXOms4yD7223OpNMMPNPZxXk5TvFcyQ= github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw= -go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= -go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= -go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= -go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= -go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= -go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms= +go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g= +go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g= +go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc= +go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw= +go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= @@ -258,8 +252,8 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= -golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= +golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= @@ -282,8 +276,8 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= -google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/cenkalti/backoff.v1 v1.1.0 h1:Arh75ttbsvlpVA7WtVpH4u9h6Zl46xuptxqLxPiSo4Y= gopkg.in/cenkalti/backoff.v1 v1.1.0/go.mod h1:J6Vskwqd+OMVJl8C33mmtxTBs2gyzfv7UDAkHu8BrjI= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/pkg/beacon/checkpoints/checkpoints.go b/pkg/beacon/checkpoints/checkpoints.go index ddf29946..00bbfd5e 100644 --- a/pkg/beacon/checkpoints/checkpoints.go +++ b/pkg/beacon/checkpoints/checkpoints.go @@ -1,8 +1,8 @@ package checkpoints import ( - v1 "github.com/attestantio/go-eth2-client/api/v1" "github.com/ethpandaops/checkpointz/pkg/beacon/checkpoints/majority" + v1 "github.com/ethpandaops/go-eth2-client/api/v1" ) type Decider interface { diff --git a/pkg/beacon/checkpoints/majority/majority.go b/pkg/beacon/checkpoints/majority/majority.go index c027be8a..88fd2fb3 100644 --- a/pkg/beacon/checkpoints/majority/majority.go +++ b/pkg/beacon/checkpoints/majority/majority.go @@ -3,8 +3,8 @@ package majority import ( "errors" - v1 "github.com/attestantio/go-eth2-client/api/v1" "github.com/ethpandaops/checkpointz/pkg/eth" + v1 "github.com/ethpandaops/go-eth2-client/api/v1" ) type Decider struct{} diff --git a/pkg/beacon/checkpoints/majority/majority_test.go b/pkg/beacon/checkpoints/majority/majority_test.go index 111c99d5..e392f2e4 100644 --- a/pkg/beacon/checkpoints/majority/majority_test.go +++ b/pkg/beacon/checkpoints/majority/majority_test.go @@ -3,8 +3,8 @@ package majority import ( "testing" - v1 "github.com/attestantio/go-eth2-client/api/v1" - "github.com/attestantio/go-eth2-client/spec/phase0" + v1 "github.com/ethpandaops/go-eth2-client/api/v1" + "github.com/ethpandaops/go-eth2-client/spec/phase0" ) var ( diff --git a/pkg/beacon/default.go b/pkg/beacon/default.go index fd456152..43562d78 100644 --- a/pkg/beacon/default.go +++ b/pkg/beacon/default.go @@ -7,10 +7,6 @@ import ( "sync" "time" - v1 "github.com/attestantio/go-eth2-client/api/v1" - "github.com/attestantio/go-eth2-client/spec" - "github.com/attestantio/go-eth2-client/spec/deneb" - "github.com/attestantio/go-eth2-client/spec/phase0" "github.com/chuckpreslar/emission" "github.com/ethpandaops/beacon/pkg/beacon" "github.com/ethpandaops/beacon/pkg/beacon/api/types" @@ -21,6 +17,10 @@ import ( "github.com/ethpandaops/checkpointz/pkg/beacon/store" "github.com/ethpandaops/checkpointz/pkg/eth" "github.com/ethpandaops/ethwallclock" + v1 "github.com/ethpandaops/go-eth2-client/api/v1" + "github.com/ethpandaops/go-eth2-client/spec" + "github.com/ethpandaops/go-eth2-client/spec/deneb" + "github.com/ethpandaops/go-eth2-client/spec/phase0" "github.com/go-co-op/gocron" perrors "github.com/pkg/errors" "github.com/sirupsen/logrus" @@ -748,9 +748,18 @@ func (d *Default) ListFinalizedSlots(ctx context.Context) ([]phase0.Slot, error) return slots, errors.New("no finalized checkpoint available") } - latestSlot := phase0.Slot(uint64(finality.Finalized.Epoch) * uint64(sp.SlotsPerEpoch)) + latestSlot := uint64(finality.Finalized.Epoch) * uint64(sp.SlotsPerEpoch) + //nolint:gosec // HistoricalEpochCount is validated as positive in config. + lookback := uint64(sp.SlotsPerEpoch) * uint64(d.config.HistoricalEpochCount) - for i, val := uint64(latestSlot), uint64(latestSlot)-uint64(sp.SlotsPerEpoch)*uint64(d.config.HistoricalEpochCount); i > val; i -= uint64(sp.SlotsPerEpoch) { //nolint:gosec // values are always positive + // Clamp the lower bound at 0 so short-lived chains (finalized epoch < + // HistoricalEpochCount) don't underflow uint64 and skip the loop entirely. + var earliest uint64 + if latestSlot > lookback { + earliest = latestSlot - lookback + } + + for i := latestSlot; i > earliest; i -= uint64(sp.SlotsPerEpoch) { slots = append(slots, phase0.Slot(i)) } diff --git a/pkg/beacon/download.go b/pkg/beacon/download.go index 2c97dd69..cb376460 100644 --- a/pkg/beacon/download.go +++ b/pkg/beacon/download.go @@ -6,10 +6,10 @@ import ( "fmt" "time" - v1 "github.com/attestantio/go-eth2-client/api/v1" - "github.com/attestantio/go-eth2-client/spec" - "github.com/attestantio/go-eth2-client/spec/phase0" "github.com/ethpandaops/checkpointz/pkg/eth" + v1 "github.com/ethpandaops/go-eth2-client/api/v1" + "github.com/ethpandaops/go-eth2-client/spec" + "github.com/ethpandaops/go-eth2-client/spec/phase0" perrors "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -177,9 +177,7 @@ func (d *Default) fetchHistoricalCheckpoints(ctx context.Context, checkpoint *v1 break } - slot := phase0.Slot(currentSlot - uint64(i)*uint64(sp.SlotsPerEpoch)) - - slotsInScope[slot] = struct{}{} + slotsInScope[phase0.Slot(currentSlot-uint64(i)*uint64(sp.SlotsPerEpoch))] = struct{}{} } for slot := range slotsInScope { @@ -354,7 +352,9 @@ func (d *Default) fetchBundle(ctx context.Context, root phase0.Root, upstream *N if denebFork.Active(epoch) { // Check if Fulu is active - if so, don't fetch blobs as they're no longer in blocks fuluFork, fuluErr := sp.ForkEpochs.GetByName("fulu") - if fuluErr == nil && fuluFork != nil && fuluFork.Active(epoch) { + fuluActive := fuluErr == nil && fuluFork != nil && fuluFork.Active(epoch) + + if fuluActive { d.log.WithField("epoch", epoch).Debug("Skipping blob sidecar download - Fulu fork active") } else { // Download and store blob sidecars diff --git a/pkg/beacon/expire_test.go b/pkg/beacon/expire_test.go index 034c0d64..d97db651 100644 --- a/pkg/beacon/expire_test.go +++ b/pkg/beacon/expire_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - "github.com/attestantio/go-eth2-client/spec/phase0" + "github.com/ethpandaops/go-eth2-client/spec/phase0" ) var ( @@ -13,11 +13,13 @@ var ( ) func CalculateSlotExpiration(slot phase0.Slot, slotsOfHistory int) phase0.Slot { - return slot + phase0.Slot(uint64(slotsOfHistory)) //nolint:gosec // slotsOfHistory is always positive + //nolint:gosec // slotsOfHistory is a small positive test value + return slot + phase0.Slot(slotsOfHistory) } func GetSlotTime(slot phase0.Slot, secondsPerSlot time.Duration, genesis time.Time) time.Time { - return genesis.Add(time.Duration(int64(slot)) * secondsPerSlot) //nolint:gosec // slot fits in int64 + //nolint:gosec // slot values are within safe range for time.Duration + return genesis.Add(time.Duration(slot) * secondsPerSlot) } func TestExpiresAtSlot(t *testing.T) { diff --git a/pkg/beacon/finality_provider.go b/pkg/beacon/finality_provider.go index 0b3c61c9..1dc84ffe 100644 --- a/pkg/beacon/finality_provider.go +++ b/pkg/beacon/finality_provider.go @@ -3,14 +3,14 @@ package beacon import ( "context" - v1 "github.com/attestantio/go-eth2-client/api/v1" - "github.com/attestantio/go-eth2-client/spec" - "github.com/attestantio/go-eth2-client/spec/deneb" - "github.com/attestantio/go-eth2-client/spec/phase0" "github.com/ethpandaops/beacon/pkg/beacon/api/types" "github.com/ethpandaops/beacon/pkg/beacon/state" "github.com/ethpandaops/checkpointz/pkg/beacon/ssz" "github.com/ethpandaops/checkpointz/pkg/eth" + v1 "github.com/ethpandaops/go-eth2-client/api/v1" + "github.com/ethpandaops/go-eth2-client/spec" + "github.com/ethpandaops/go-eth2-client/spec/deneb" + "github.com/ethpandaops/go-eth2-client/spec/phase0" ) // FinalityProvider is a provider of finality information. diff --git a/pkg/beacon/metrics.go b/pkg/beacon/metrics.go index b119ba8e..d8942619 100644 --- a/pkg/beacon/metrics.go +++ b/pkg/beacon/metrics.go @@ -1,7 +1,7 @@ package beacon import ( - "github.com/attestantio/go-eth2-client/spec/phase0" + "github.com/ethpandaops/go-eth2-client/spec/phase0" "github.com/prometheus/client_golang/prometheus" ) diff --git a/pkg/beacon/nodes.go b/pkg/beacon/nodes.go index 3329b7f2..e9ae3abf 100644 --- a/pkg/beacon/nodes.go +++ b/pkg/beacon/nodes.go @@ -7,10 +7,10 @@ import ( "strings" "time" - v1 "github.com/attestantio/go-eth2-client/api/v1" - ehttp "github.com/attestantio/go-eth2-client/http" sbeacon "github.com/ethpandaops/beacon/pkg/beacon" "github.com/ethpandaops/checkpointz/pkg/beacon/node" + v1 "github.com/ethpandaops/go-eth2-client/api/v1" + ehttp "github.com/ethpandaops/go-eth2-client/http" "github.com/sirupsen/logrus" ) diff --git a/pkg/beacon/ssz/encoder.go b/pkg/beacon/ssz/encoder.go index d0c21088..ad48cfb8 100644 --- a/pkg/beacon/ssz/encoder.go +++ b/pkg/beacon/ssz/encoder.go @@ -5,9 +5,9 @@ import ( "errors" "sync" - "github.com/attestantio/go-eth2-client/spec" - "github.com/attestantio/go-eth2-client/spec/phase0" "github.com/ethpandaops/beacon/pkg/beacon/state" + "github.com/ethpandaops/go-eth2-client/spec" + "github.com/ethpandaops/go-eth2-client/spec/phase0" dynssz "github.com/pk910/dynamic-ssz" "github.com/pk910/dynamic-ssz/sszutils" @@ -45,6 +45,25 @@ func (e *Encoder) SetSpec(newSpec *state.Spec) { e.dynssz = nil } +func (e *Encoder) marshalSSZ(obj sszutils.FastsszMarshaler) ([]byte, error) { + var ( + ssz []byte + err error + ) + + if e.customPreset { + ssz, err = e.getDynamicSSZ().MarshalSSZ(obj) + } else { + ssz, err = obj.MarshalSSZ() + } + + if err != nil { + return nil, err + } + + return ssz, nil +} + func (e *Encoder) GetBlockRoot(block *spec.VersionedSignedBeaconBlock) (root phase0.Root, err error) { var blockObj sszutils.FastsszHashRoot @@ -63,6 +82,8 @@ func (e *Encoder) GetBlockRoot(block *spec.VersionedSignedBeaconBlock) (root pha blockObj = block.Electra.Message case spec.DataVersionFulu: blockObj = block.Fulu.Message + case spec.DataVersionGloas: + blockObj = block.Gloas.Message default: return phase0.Root{}, errors.New("unknown block version") } @@ -80,7 +101,7 @@ func (e *Encoder) GetBlockRoot(block *spec.VersionedSignedBeaconBlock) (root pha return root, nil } -func (e *Encoder) EncodeBlockSSZ(block *spec.VersionedSignedBeaconBlock) (ssz []byte, err error) { +func (e *Encoder) EncodeBlockSSZ(block *spec.VersionedSignedBeaconBlock) ([]byte, error) { var blockObj sszutils.FastsszMarshaler switch block.Version { @@ -98,21 +119,13 @@ func (e *Encoder) EncodeBlockSSZ(block *spec.VersionedSignedBeaconBlock) (ssz [] blockObj = block.Electra case spec.DataVersionFulu: blockObj = block.Fulu + case spec.DataVersionGloas: + blockObj = block.Gloas default: return nil, errors.New("unknown block version") } - if e.customPreset { - ssz, err = e.getDynamicSSZ().MarshalSSZ(blockObj) - } else { - ssz, err = blockObj.MarshalSSZ() - } - - if err != nil { - return nil, err - } - - return ssz, nil + return e.marshalSSZ(blockObj) } func (e *Encoder) EncodeBlockJSON(block *spec.VersionedSignedBeaconBlock) ([]byte, error) { @@ -133,6 +146,8 @@ func (e *Encoder) EncodeBlockJSON(block *spec.VersionedSignedBeaconBlock) ([]byt blockObj = block.Electra case spec.DataVersionFulu: blockObj = block.Fulu + case spec.DataVersionGloas: + blockObj = block.Gloas default: return nil, errors.New("unknown block version") } @@ -163,6 +178,8 @@ func (e *Encoder) GetStateRoot(beaconState *spec.VersionedBeaconState) (root pha stateObj = beaconState.Electra case spec.DataVersionFulu: stateObj = beaconState.Fulu + case spec.DataVersionGloas: + stateObj = beaconState.Gloas default: return phase0.Root{}, errors.New("unknown state version") } @@ -179,7 +196,7 @@ func (e *Encoder) GetStateRoot(beaconState *spec.VersionedBeaconState) (root pha return root, nil } -func (e *Encoder) EncodeStateSSZ(beaconState *spec.VersionedBeaconState) (ssz []byte, err error) { +func (e *Encoder) EncodeStateSSZ(beaconState *spec.VersionedBeaconState) ([]byte, error) { var stateObj sszutils.FastsszMarshaler switch beaconState.Version { @@ -197,19 +214,11 @@ func (e *Encoder) EncodeStateSSZ(beaconState *spec.VersionedBeaconState) (ssz [] stateObj = beaconState.Electra case spec.DataVersionFulu: stateObj = beaconState.Fulu + case spec.DataVersionGloas: + stateObj = beaconState.Gloas default: return nil, errors.New("unknown state version") } - if e.customPreset { - ssz, err = e.getDynamicSSZ().MarshalSSZ(stateObj) - } else { - ssz, err = stateObj.MarshalSSZ() - } - - if err != nil { - return nil, err - } - - return ssz, nil + return e.marshalSSZ(stateObj) } diff --git a/pkg/beacon/status.go b/pkg/beacon/status.go index b90d538e..9a27a455 100644 --- a/pkg/beacon/status.go +++ b/pkg/beacon/status.go @@ -1,7 +1,7 @@ package beacon import ( - v1 "github.com/attestantio/go-eth2-client/api/v1" + v1 "github.com/ethpandaops/go-eth2-client/api/v1" ) type UpstreamStatus struct { diff --git a/pkg/beacon/store/blob_sidecars.go b/pkg/beacon/store/blob_sidecars.go index d0ed611d..97117b1b 100644 --- a/pkg/beacon/store/blob_sidecars.go +++ b/pkg/beacon/store/blob_sidecars.go @@ -4,10 +4,10 @@ import ( "errors" "time" - "github.com/attestantio/go-eth2-client/spec/deneb" - "github.com/attestantio/go-eth2-client/spec/phase0" "github.com/ethpandaops/checkpointz/pkg/cache" "github.com/ethpandaops/checkpointz/pkg/eth" + "github.com/ethpandaops/go-eth2-client/spec/deneb" + "github.com/ethpandaops/go-eth2-client/spec/phase0" "github.com/sirupsen/logrus" ) diff --git a/pkg/beacon/store/blob_sidecars_test.go b/pkg/beacon/store/blob_sidecars_test.go index 18bc9434..dbf44a89 100644 --- a/pkg/beacon/store/blob_sidecars_test.go +++ b/pkg/beacon/store/blob_sidecars_test.go @@ -4,8 +4,8 @@ import ( "testing" "time" - "github.com/attestantio/go-eth2-client/spec/deneb" - "github.com/attestantio/go-eth2-client/spec/phase0" + "github.com/ethpandaops/go-eth2-client/spec/deneb" + "github.com/ethpandaops/go-eth2-client/spec/phase0" "github.com/sirupsen/logrus/hooks/test" "github.com/stretchr/testify/assert" ) diff --git a/pkg/beacon/store/block.go b/pkg/beacon/store/block.go index e3222fde..e4e29878 100644 --- a/pkg/beacon/store/block.go +++ b/pkg/beacon/store/block.go @@ -5,10 +5,10 @@ import ( "sync" "time" - "github.com/attestantio/go-eth2-client/spec" - "github.com/attestantio/go-eth2-client/spec/phase0" "github.com/ethpandaops/checkpointz/pkg/cache" "github.com/ethpandaops/checkpointz/pkg/eth" + "github.com/ethpandaops/go-eth2-client/spec" + "github.com/ethpandaops/go-eth2-client/spec/phase0" "github.com/sirupsen/logrus" ) diff --git a/pkg/beacon/store/deposit_snapshot.go b/pkg/beacon/store/deposit_snapshot.go index f67aeaab..d80fa014 100644 --- a/pkg/beacon/store/deposit_snapshot.go +++ b/pkg/beacon/store/deposit_snapshot.go @@ -4,10 +4,10 @@ import ( "errors" "time" - "github.com/attestantio/go-eth2-client/spec/phase0" "github.com/ethpandaops/beacon/pkg/beacon/api/types" "github.com/ethpandaops/checkpointz/pkg/cache" "github.com/ethpandaops/checkpointz/pkg/eth" + "github.com/ethpandaops/go-eth2-client/spec/phase0" "github.com/sirupsen/logrus" ) diff --git a/pkg/beacon/store/state.go b/pkg/beacon/store/state.go index a9430cd7..a867d5cd 100644 --- a/pkg/beacon/store/state.go +++ b/pkg/beacon/store/state.go @@ -4,10 +4,10 @@ import ( "errors" "time" - "github.com/attestantio/go-eth2-client/spec" - "github.com/attestantio/go-eth2-client/spec/phase0" "github.com/ethpandaops/checkpointz/pkg/cache" "github.com/ethpandaops/checkpointz/pkg/eth" + "github.com/ethpandaops/go-eth2-client/spec" + "github.com/ethpandaops/go-eth2-client/spec/phase0" "github.com/sirupsen/logrus" ) diff --git a/pkg/cache/ttl.go b/pkg/cache/ttl.go index b9813cb8..9348acae 100644 --- a/pkg/cache/ttl.go +++ b/pkg/cache/ttl.go @@ -40,6 +40,7 @@ func NewTTLMap(maxItems int, name, namespace string) (m *TTLMap) { go func() { for now := range time.Tick(time.Second * 1) { m.l.Lock() + for k, v := range m.m { if v.invincible { continue @@ -49,6 +50,7 @@ func NewTTLMap(maxItems int, name, namespace string) (m *TTLMap) { m.delete(k, v.value, v.expiresAt) } } + m.l.Unlock() } }() diff --git a/pkg/eth/slot.go b/pkg/eth/slot.go index d619d591..375696da 100644 --- a/pkg/eth/slot.go +++ b/pkg/eth/slot.go @@ -3,7 +3,7 @@ package eth import ( "time" - "github.com/attestantio/go-eth2-client/spec/phase0" + "github.com/ethpandaops/go-eth2-client/spec/phase0" ) type SlotTime struct { @@ -14,7 +14,8 @@ type SlotTime struct { } func CalculateSlotTime(slot phase0.Slot, genesisTime time.Time, durationPerSlot time.Duration) SlotTime { - slotStartTime := genesisTime.Add(time.Duration(int64(slot)) * durationPerSlot).UTC() //nolint:gosec // slot fits in int64 + //nolint:gosec // slot values are within safe range for time.Duration + slotStartTime := genesisTime.Add(time.Duration(slot) * durationPerSlot).UTC() return SlotTime{ StartTime: slotStartTime, diff --git a/pkg/eth/slot_test.go b/pkg/eth/slot_test.go index 2b86c6cc..a520abc7 100644 --- a/pkg/eth/slot_test.go +++ b/pkg/eth/slot_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - "github.com/attestantio/go-eth2-client/spec/phase0" + "github.com/ethpandaops/go-eth2-client/spec/phase0" ) func TestCalculateSlotTime(t *testing.T) { diff --git a/pkg/eth/string.go b/pkg/eth/string.go index 43dfab62..0c457a51 100644 --- a/pkg/eth/string.go +++ b/pkg/eth/string.go @@ -3,7 +3,7 @@ package eth import ( "fmt" - "github.com/attestantio/go-eth2-client/spec/phase0" + "github.com/ethpandaops/go-eth2-client/spec/phase0" ) func RootAsString(root phase0.Root) string { diff --git a/pkg/eth/string_test.go b/pkg/eth/string_test.go index add45d20..44a2653d 100644 --- a/pkg/eth/string_test.go +++ b/pkg/eth/string_test.go @@ -3,7 +3,7 @@ package eth import ( "testing" - "github.com/attestantio/go-eth2-client/spec/phase0" + "github.com/ethpandaops/go-eth2-client/spec/phase0" ) func TestRootToString(t *testing.T) { diff --git a/pkg/service/checkpointz/requests.go b/pkg/service/checkpointz/requests.go index ce3e8e4e..450dad81 100644 --- a/pkg/service/checkpointz/requests.go +++ b/pkg/service/checkpointz/requests.go @@ -1,6 +1,6 @@ package checkpointz -import "github.com/attestantio/go-eth2-client/spec/phase0" +import "github.com/ethpandaops/go-eth2-client/spec/phase0" type StatusRequest struct { } diff --git a/pkg/service/checkpointz/responses.go b/pkg/service/checkpointz/responses.go index da3986ed..e233046a 100644 --- a/pkg/service/checkpointz/responses.go +++ b/pkg/service/checkpointz/responses.go @@ -1,11 +1,11 @@ package checkpointz import ( - v1 "github.com/attestantio/go-eth2-client/api/v1" - "github.com/attestantio/go-eth2-client/spec" - "github.com/attestantio/go-eth2-client/spec/phase0" "github.com/ethpandaops/checkpointz/pkg/beacon" "github.com/ethpandaops/checkpointz/pkg/eth" + v1 "github.com/ethpandaops/go-eth2-client/api/v1" + "github.com/ethpandaops/go-eth2-client/spec" + "github.com/ethpandaops/go-eth2-client/spec/phase0" ) type StatusResponse struct { diff --git a/pkg/service/eth/block_id.go b/pkg/service/eth/block_id.go index 70e9a623..f80eeae2 100644 --- a/pkg/service/eth/block_id.go +++ b/pkg/service/eth/block_id.go @@ -6,7 +6,7 @@ import ( "strconv" "strings" - "github.com/attestantio/go-eth2-client/spec/phase0" + "github.com/ethpandaops/go-eth2-client/spec/phase0" "github.com/pkg/errors" ) @@ -88,7 +88,11 @@ func NewSlotFromString(id string) (phase0.Slot, error) { return 0, err } - return phase0.Slot(uint64(slot)), nil //nolint:gosec // slot parsed from string is validated + if slot < 0 { + return 0, errors.New("slot cannot be negative") + } + + return phase0.Slot(slot), nil } func NewRootFromString(id string) (phase0.Root, error) { diff --git a/pkg/service/eth/eth.go b/pkg/service/eth/eth.go index 6865a730..e7d5dcd4 100644 --- a/pkg/service/eth/eth.go +++ b/pkg/service/eth/eth.go @@ -4,14 +4,14 @@ import ( "context" "fmt" - v1 "github.com/attestantio/go-eth2-client/api/v1" - "github.com/attestantio/go-eth2-client/spec" - "github.com/attestantio/go-eth2-client/spec/deneb" - "github.com/attestantio/go-eth2-client/spec/phase0" "github.com/ethpandaops/beacon/pkg/beacon/api/types" "github.com/ethpandaops/beacon/pkg/beacon/state" "github.com/ethpandaops/checkpointz/pkg/beacon" "github.com/ethpandaops/checkpointz/pkg/version" + v1 "github.com/ethpandaops/go-eth2-client/api/v1" + "github.com/ethpandaops/go-eth2-client/spec" + "github.com/ethpandaops/go-eth2-client/spec/deneb" + "github.com/ethpandaops/go-eth2-client/spec/phase0" "github.com/sirupsen/logrus" ) @@ -572,7 +572,7 @@ func (h *Handler) BlobSidecars(ctx context.Context, blockID BlockIdentifier, ind // Find the sidecar with the given index for i, sidecar := range sidecars { - if index == int(sidecar.Index) { //nolint:gosec // index is validated non-negative above + if deneb.BlobIndex(index) == sidecar.Index { filtered = append(filtered, sidecars[i]) break diff --git a/pkg/service/eth/state_id.go b/pkg/service/eth/state_id.go index fc4e9e11..f930c82f 100644 --- a/pkg/service/eth/state_id.go +++ b/pkg/service/eth/state_id.go @@ -5,7 +5,7 @@ import ( "strconv" "strings" - "github.com/attestantio/go-eth2-client/spec/phase0" + "github.com/ethpandaops/go-eth2-client/spec/phase0" ) type StateIDType int diff --git a/web/src/parts/slot/Slot.tsx b/web/src/parts/slot/Slot.tsx index b2c49519..605350ab 100644 --- a/web/src/parts/slot/Slot.tsx +++ b/web/src/parts/slot/Slot.tsx @@ -38,6 +38,8 @@ export default function Slot(props: { slot: number }) { return data?.data?.block?.Electra; case 'FULU': return data?.data?.block?.Fulu; + case 'GLOAS': + return data?.data?.block?.Gloas; case 'PHASE0': return data?.data?.block?.Phase0; } diff --git a/web/src/types/index.ts b/web/src/types/index.ts index a0d2af15..53a2291f 100644 --- a/web/src/types/index.ts +++ b/web/src/types/index.ts @@ -76,7 +76,7 @@ export interface APIBeaconBlockMessage { } export interface APIBeaconBlock { - Version: 'BELLATRIX' | 'ALTAIR' | 'PHASE0' | 'CAPELLA' | 'DENEB' | 'ELECTRA' | 'FULU'; + Version: 'BELLATRIX' | 'ALTAIR' | 'PHASE0' | 'CAPELLA' | 'DENEB' | 'ELECTRA' | 'FULU' | 'GLOAS'; Altair?: APIBeaconBlockMessage; Bellatrix?: APIBeaconBlockMessage; Capella?: APIBeaconBlockMessage; @@ -84,6 +84,7 @@ export interface APIBeaconBlock { Phase0?: APIBeaconBlockMessage; Electra?: APIBeaconBlockMessage; Fulu?: APIBeaconBlockMessage; + Gloas?: APIBeaconBlockMessage; } export interface APIBeaconSlotBlock {