diff --git a/README.md b/README.md index 4890e21..e2407f4 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ As a general rule, any function that starts with `Fetch` will fetch data from th ## Built with -- [attestantio/go-eth2-client](github.com/attestantio/go-eth2-client) +- [attestantio/go-eth2-client](github.com/ethpandaops/go-eth2-client) - [ethpandaops/ethwallclock](github.com/ethpandaops/ethwallclock) ## Options diff --git a/go.mod b/go.mod index 9e75bdd..6c10f84 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.25.1 require ( github.com/chuckpreslar/emission v0.0.0-20170206194824-a7ddd980baf9 - github.com/ethereum/go-ethereum v1.16.4 + github.com/ethereum/go-ethereum v1.17.3-0.20260507223249-73944e329925 github.com/ethpandaops/ethwallclock v0.2.0 github.com/ethpandaops/go-eth2-client v0.1.3-0.20260513062559-5fb497ba414f github.com/go-co-op/gocron v1.16.2 @@ -18,15 +18,16 @@ require ( require ( 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.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/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/goccy/go-yaml v1.19.2 // 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/klauspost/cpuid/v2 v2.3.0 // indirect @@ -42,16 +43,17 @@ require ( github.com/r3labs/sse/v2 v2.10.0 // indirect github.com/robfig/cron/v3 v3.0.1 // indirect github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // 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.42.0 // indirect - golang.org/x/net v0.44.0 // indirect - golang.org/x/sync v0.17.0 // indirect - golang.org/x/sys v0.36.0 // indirect + golang.org/x/crypto v0.47.0 // indirect + golang.org/x/net v0.49.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/sys v0.40.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 0838dd1..307e22e 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ 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.10.0 h1:ffGw51/hYH3w3rZcxO/KcaUIDOLP84w7nsidMVgaDG0= @@ -16,12 +18,10 @@ 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/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/ethereum/go-ethereum v1.17.3-0.20260507223249-73944e329925 h1:d0kQnVKgCER1xIEYB0ucuNLfq4PtBZw+abMceZKUO8g= +github.com/ethereum/go-ethereum v1.17.3-0.20260507223249-73944e329925/go.mod h1:f2EhRwqewIZkGoQekywI2Y2RZAMTSavLNkD9qItFy1A= 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.2 h1:nJr0YBmqHtbVeLeWEDyXwjCEO0AFt1Z0lIciMYlowfU= -github.com/ethpandaops/go-eth2-client v0.1.2/go.mod h1:U3KdR8QSq8vqs9LWSGAF4ETHJpcB62E1DFf0gVMgWv0= github.com/ethpandaops/go-eth2-client v0.1.3-0.20260513062559-5fb497ba414f h1:9k0z0tEayikToEqZn71xKIRtCNzH6mwUkIJk70kbSSk= github.com/ethpandaops/go-eth2-client v0.1.3-0.20260513062559-5fb497ba414f/go.mod h1:U3KdR8QSq8vqs9LWSGAF4ETHJpcB62E1DFf0gVMgWv0= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= @@ -33,8 +33,8 @@ github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbS github.com/go-co-op/gocron v1.16.2 h1:p9ghzsN5PqqPyWXYDO2JlvD1DOUNT8pPSyGYC62XBcY= github.com/go-co-op/gocron v1.16.2/go.mod h1:W/N9G7bntRo5fVQlmjncvqSt74jxCxHfjyHlgcB33T8= 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/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM= @@ -48,8 +48,8 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 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= @@ -108,8 +108,8 @@ 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.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= @@ -124,30 +124,32 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= -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= go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= -golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= +golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8= +golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20191116160921-f9c825593386/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= -golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= +golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= +golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= -golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -161,13 +163,13 @@ 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.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= -golang.org/x/sys v0.36.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/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= -golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= +golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= +golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -179,8 +181,8 @@ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -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/api/api.go b/pkg/beacon/api/api.go index b3d24dd..040da2e 100644 --- a/pkg/beacon/api/api.go +++ b/pkg/beacon/api/api.go @@ -62,7 +62,7 @@ func (c *consensusClient) post(ctx context.Context, path string, body map[string req.Header.Set(k, v) } - rsp, err := c.client.Do(req) //nolint:gosec // URL is constructed from configured base URL, not user input. + rsp, err := c.client.Do(req) //nolint:gosec // url is operator-supplied beacon node config, not user input if err != nil { return nil, err } @@ -98,7 +98,7 @@ func (c *consensusClient) get(ctx context.Context, path string) (json.RawMessage req.Header.Set(k, v) } - rsp, err := c.client.Do(req) //nolint:gosec // URL is constructed from configured base URL, not user input. + rsp, err := c.client.Do(req) //nolint:gosec // url is operator-supplied beacon node config, not user input if err != nil { return nil, err } @@ -144,7 +144,7 @@ func (c *consensusClient) getRaw(ctx context.Context, path string, contentType s req.Header.Set("Accept", contentType) - rsp, err := c.client.Do(req) //nolint:gosec // URL is constructed from configured base URL, not user input. + rsp, err := c.client.Do(req) //nolint:gosec // url is operator-supplied beacon node config, not user input if err != nil { return nil, err } diff --git a/pkg/beacon/beacon.go b/pkg/beacon/beacon.go index 0b1eb83..8b06a10 100644 --- a/pkg/beacon/beacon.go +++ b/pkg/beacon/beacon.go @@ -20,6 +20,7 @@ import ( "github.com/ethpandaops/go-eth2-client/spec/altair" "github.com/ethpandaops/go-eth2-client/spec/deneb" "github.com/ethpandaops/go-eth2-client/spec/electra" + "github.com/ethpandaops/go-eth2-client/spec/gloas" "github.com/ethpandaops/go-eth2-client/spec/phase0" "github.com/go-co-op/gocron" "github.com/rs/zerolog" @@ -136,6 +137,20 @@ type Node interface { // OnFastConfirmation is called when a fast confirmation is received. OnFastConfirmation(ctx context.Context, handler func(ctx context.Context, ev *v1.FastConfirmationEvent) error) + // EIP-7732 ePBS subscriptions. + // OnExecutionPayload is called when a SignedExecutionPayloadEnvelope has been imported into fork-choice. + OnExecutionPayload(ctx context.Context, handler func(ctx context.Context, ev *gloas.SignedExecutionPayloadEnvelope) error) + // OnExecutionPayloadGossip is called when a SignedExecutionPayloadEnvelope has passed gossip validation. + OnExecutionPayloadGossip(ctx context.Context, handler func(ctx context.Context, ev *gloas.SignedExecutionPayloadEnvelope) error) + // OnExecutionPayloadAvailable is called when the node has verified the execution payload and blobs are locally available. + OnExecutionPayloadAvailable(ctx context.Context, handler func(ctx context.Context, ev *v1.ExecutionPayloadAvailableEvent) error) + // OnExecutionPayloadBid is called when a SignedExecutionPayloadBid passes gossip validation. + OnExecutionPayloadBid(ctx context.Context, handler func(ctx context.Context, ev *gloas.SignedExecutionPayloadBid) error) + // OnPayloadAttestationMessage is called when a PayloadAttestationMessage is received. + OnPayloadAttestationMessage(ctx context.Context, handler func(ctx context.Context, ev *gloas.PayloadAttestationMessage) error) + // OnProposerPreferences is called when a SignedProposerPreferences is received. + OnProposerPreferences(ctx context.Context, handler func(ctx context.Context, ev *gloas.SignedProposerPreferences) error) + // - Custom events // OnReady is called when the node is ready. OnReady(ctx context.Context, handler func(ctx context.Context, event *ReadyEvent) error) diff --git a/pkg/beacon/event.go b/pkg/beacon/event.go index 69b8ed4..7d6e8fd 100644 --- a/pkg/beacon/event.go +++ b/pkg/beacon/event.go @@ -54,6 +54,14 @@ const ( topicDataColumnSidecar = "data_column_sidecar" topicFastConfirmation = "fast_confirmation" topicEvent = "raw_event" + + // EIP-7732 ePBS beacon SSE topics. + topicExecutionPayload = "execution_payload" + topicExecutionPayloadAvailable = "execution_payload_available" + topicExecutionPayloadBid = "execution_payload_bid" + topicExecutionPayloadGossip = "execution_payload_gossip" + topicPayloadAttestationMessage = "payload_attestation_message" + topicProposerPreferences = "proposer_preferences" ) type ReadyEvent struct { diff --git a/pkg/beacon/metrics.go b/pkg/beacon/metrics.go index 7469ef2..a5c1e53 100644 --- a/pkg/beacon/metrics.go +++ b/pkg/beacon/metrics.go @@ -8,6 +8,11 @@ import ( "github.com/sirupsen/logrus" ) +const ( + metricsLabelBlockID = "block_id" + metricsLabelVersion = "version" +) + // Metrics contains all the metrics jobs. type Metrics struct { jobs map[string]MetricsJob diff --git a/pkg/beacon/metrics_beacon.go b/pkg/beacon/metrics_beacon.go index d4a7a4b..390dcc2 100644 --- a/pkg/beacon/metrics_beacon.go +++ b/pkg/beacon/metrics_beacon.go @@ -62,8 +62,8 @@ func NewBeaconMetrics(beac Node, log logrus.FieldLogger, namespace string, const ConstLabels: constLabels, }, []string{ - "block_id", - "version", + metricsLabelBlockID, + metricsLabelVersion, }, ), Transactions: *prometheus.NewGaugeVec( @@ -74,8 +74,8 @@ func NewBeaconMetrics(beac Node, log logrus.FieldLogger, namespace string, const ConstLabels: constLabels, }, []string{ - "block_id", - "version", + metricsLabelBlockID, + metricsLabelVersion, }, ), Slashings: *prometheus.NewGaugeVec( @@ -86,8 +86,8 @@ func NewBeaconMetrics(beac Node, log logrus.FieldLogger, namespace string, const ConstLabels: constLabels, }, []string{ - "block_id", - "version", + metricsLabelBlockID, + metricsLabelVersion, "type", }, ), @@ -99,8 +99,8 @@ func NewBeaconMetrics(beac Node, log logrus.FieldLogger, namespace string, const ConstLabels: constLabels, }, []string{ - "block_id", - "version", + metricsLabelBlockID, + metricsLabelVersion, }, ), Deposits: *prometheus.NewGaugeVec( @@ -111,8 +111,8 @@ func NewBeaconMetrics(beac Node, log logrus.FieldLogger, namespace string, const ConstLabels: constLabels, }, []string{ - "block_id", - "version", + metricsLabelBlockID, + metricsLabelVersion, }, ), VoluntaryExits: *prometheus.NewGaugeVec( @@ -123,8 +123,8 @@ func NewBeaconMetrics(beac Node, log logrus.FieldLogger, namespace string, const ConstLabels: constLabels, }, []string{ - "block_id", - "version", + metricsLabelBlockID, + metricsLabelVersion, }, ), FinalityCheckpoints: *prometheus.NewGaugeVec( @@ -180,8 +180,8 @@ func NewBeaconMetrics(beac Node, log logrus.FieldLogger, namespace string, const ConstLabels: constLabels, }, []string{ - "block_id", - "version", + metricsLabelBlockID, + metricsLabelVersion, }, ), WithdrawalsAmount: *prometheus.NewGaugeVec( @@ -192,8 +192,8 @@ func NewBeaconMetrics(beac Node, log logrus.FieldLogger, namespace string, const ConstLabels: constLabels, }, []string{ - "block_id", - "version", + metricsLabelBlockID, + metricsLabelVersion, }, ), WithdrawalsIndexMax: *prometheus.NewGaugeVec( @@ -204,8 +204,8 @@ func NewBeaconMetrics(beac Node, log logrus.FieldLogger, namespace string, const ConstLabels: constLabels, }, []string{ - "block_id", - "version", + metricsLabelBlockID, + metricsLabelVersion, }, ), WithdrawalsIndexMin: *prometheus.NewGaugeVec( @@ -216,8 +216,8 @@ func NewBeaconMetrics(beac Node, log logrus.FieldLogger, namespace string, const ConstLabels: constLabels, }, []string{ - "block_id", - "version", + metricsLabelBlockID, + metricsLabelVersion, }, ), BlobKZGCommitments: *prometheus.NewGaugeVec( @@ -228,8 +228,8 @@ func NewBeaconMetrics(beac Node, log logrus.FieldLogger, namespace string, const ConstLabels: constLabels, }, []string{ - "block_id", - "version", + metricsLabelBlockID, + metricsLabelVersion, }, ), } @@ -448,28 +448,28 @@ func (b *BeaconMetrics) recordNewBeaconBlock(blockID string, block *spec.Version slot, err := block.Slot() if err != nil { - b.log.WithError(err).WithField("block_id", blockID).Error("Failed to get slot from block") + b.log.WithError(err).WithField(metricsLabelBlockID, blockID).Error("Failed to get slot from block") } else { b.Slot.WithLabelValues(blockID, version).Set(float64(slot)) } attesterSlashing, err := block.AttesterSlashings() if err != nil { - b.log.WithError(err).WithField("block_id", blockID).Error("Failed to get attester slashing from block") + b.log.WithError(err).WithField(metricsLabelBlockID, blockID).Error("Failed to get attester slashing from block") } else { b.Slashings.WithLabelValues(blockID, version, "attester").Set(float64(len(attesterSlashing))) } proposerSlashing, err := block.ProposerSlashings() if err != nil { - b.log.WithError(err).WithField("block_id", blockID).Error("Failed to get proposer slashing from block") + b.log.WithError(err).WithField(metricsLabelBlockID, blockID).Error("Failed to get proposer slashing from block") } else { b.Slashings.WithLabelValues(blockID, version, "proposer").Set(float64(len(proposerSlashing))) } attestations, err := block.Attestations() if err != nil { - b.log.WithError(err).WithField("block_id", blockID).Error("Failed to get attestations from block") + b.log.WithError(err).WithField(metricsLabelBlockID, blockID).Error("Failed to get attestations from block") } else { b.Attestations.WithLabelValues(blockID, version).Set(float64(len(attestations))) } diff --git a/pkg/beacon/metrics_events.go b/pkg/beacon/metrics_events.go index 2c97065..51c4503 100644 --- a/pkg/beacon/metrics_events.go +++ b/pkg/beacon/metrics_events.go @@ -46,7 +46,7 @@ func NewEventJob(bc Node, log logrus.FieldLogger, namespace string, constLabels ConstLabels: constLabels, }, []string{ - "event", + metricsJobNameEvent, }, ), TimeSinceLastEvent: prometheus.NewGauge( diff --git a/pkg/beacon/metrics_events_test.go b/pkg/beacon/metrics_events_test.go index afc853f..5f44b2d 100644 --- a/pkg/beacon/metrics_events_test.go +++ b/pkg/beacon/metrics_events_test.go @@ -34,7 +34,7 @@ func TestEventMetrics_ConcurrentAccess(t *testing.T) { Name: "event_count", Help: "Test event count", }, - []string{"event"}, + []string{metricsJobNameEvent}, ), TimeSinceLastEvent: prometheus.NewGauge( prometheus.GaugeOpts{ @@ -128,7 +128,7 @@ func TestEventMetrics_LastEventTime(t *testing.T) { Name: "event_count", Help: "Test event count", }, - []string{"event"}, + []string{metricsJobNameEvent}, ), TimeSinceLastEvent: prometheus.NewGauge( prometheus.GaugeOpts{ diff --git a/pkg/beacon/metrics_fork.go b/pkg/beacon/metrics_fork.go index 68eead1..0db657f 100644 --- a/pkg/beacon/metrics_fork.go +++ b/pkg/beacon/metrics_fork.go @@ -39,7 +39,7 @@ func NewForksJob(beac Node, log logrus.FieldLogger, namespace string, constLabel ConstLabels: constLabels, }, []string{ - "fork", + metricsJobNameFork, }, ), Activated: *prometheus.NewGaugeVec( @@ -50,7 +50,7 @@ func NewForksJob(beac Node, log logrus.FieldLogger, namespace string, constLabel ConstLabels: constLabels, }, []string{ - "fork", + metricsJobNameFork, }, ), Current: *prometheus.NewGaugeVec( @@ -61,7 +61,7 @@ func NewForksJob(beac Node, log logrus.FieldLogger, namespace string, constLabel ConstLabels: constLabels, }, []string{ - "fork", + metricsJobNameFork, }, ), } diff --git a/pkg/beacon/metrics_general.go b/pkg/beacon/metrics_general.go index 598a3aa..d07a636 100644 --- a/pkg/beacon/metrics_general.go +++ b/pkg/beacon/metrics_general.go @@ -36,7 +36,7 @@ func NewGeneralJob(beac Node, log logrus.FieldLogger, namespace string, constLab ConstLabels: constLabels, }, []string{ - "version", + metricsLabelVersion, }, ), Peers: *prometheus.NewGaugeVec( diff --git a/pkg/beacon/options.go b/pkg/beacon/options.go index ec23856..60a3f50 100644 --- a/pkg/beacon/options.go +++ b/pkg/beacon/options.go @@ -83,6 +83,11 @@ func DefaultDisabledBeaconSubscriptionOptions() BeaconSubscriptionOptions { } // DefaultEnabledBeaconSubscriptionOptions returns the default options for an enabled beacon subscription. +// +// execution_payload, execution_payload_gossip, execution_payload_available, +// execution_payload_bid, payload_attestation_message, and proposer_preferences +// can be added once Gloas is live if you want them defaulting. Not adding for +// now due to connection thrashing, etc. func DefaultEnabledBeaconSubscriptionOptions() BeaconSubscriptionOptions { return BeaconSubscriptionOptions{ Enabled: true, diff --git a/pkg/beacon/publisher.go b/pkg/beacon/publisher.go index cca22a9..e1f7fce 100644 --- a/pkg/beacon/publisher.go +++ b/pkg/beacon/publisher.go @@ -10,6 +10,7 @@ import ( "github.com/ethpandaops/go-eth2-client/spec" "github.com/ethpandaops/go-eth2-client/spec/altair" "github.com/ethpandaops/go-eth2-client/spec/electra" + "github.com/ethpandaops/go-eth2-client/spec/gloas" "github.com/ethpandaops/go-eth2-client/spec/phase0" ) @@ -122,3 +123,28 @@ func (n *node) publishFirstTimeHealthy(ctx context.Context) { func (n *node) publishSingleAttestation(ctx context.Context, event *electra.SingleAttestation) { n.broker.Emit(topicSingleAttestation, event) } + +// EIP-7732 ePBS beacon SSE event publishers. +func (n *node) publishExecutionPayload(ctx context.Context, event *gloas.SignedExecutionPayloadEnvelope) { + n.broker.Emit(topicExecutionPayload, event) +} + +func (n *node) publishExecutionPayloadGossip(ctx context.Context, event *gloas.SignedExecutionPayloadEnvelope) { + n.broker.Emit(topicExecutionPayloadGossip, event) +} + +func (n *node) publishExecutionPayloadAvailable(ctx context.Context, event *v1.ExecutionPayloadAvailableEvent) { + n.broker.Emit(topicExecutionPayloadAvailable, event) +} + +func (n *node) publishExecutionPayloadBid(ctx context.Context, event *gloas.SignedExecutionPayloadBid) { + n.broker.Emit(topicExecutionPayloadBid, event) +} + +func (n *node) publishPayloadAttestationMessage(ctx context.Context, event *gloas.PayloadAttestationMessage) { + n.broker.Emit(topicPayloadAttestationMessage, event) +} + +func (n *node) publishProposerPreferences(ctx context.Context, event *gloas.SignedProposerPreferences) { + n.broker.Emit(topicProposerPreferences, event) +} diff --git a/pkg/beacon/subscriber.go b/pkg/beacon/subscriber.go index ff37bd7..99bd8e1 100644 --- a/pkg/beacon/subscriber.go +++ b/pkg/beacon/subscriber.go @@ -7,6 +7,7 @@ import ( "github.com/ethpandaops/go-eth2-client/spec" "github.com/ethpandaops/go-eth2-client/spec/altair" "github.com/ethpandaops/go-eth2-client/spec/electra" + "github.com/ethpandaops/go-eth2-client/spec/gloas" "github.com/ethpandaops/go-eth2-client/spec/phase0" ) @@ -89,6 +90,43 @@ func (n *node) OnSingleAttestation(ctx context.Context, handler func(ctx context }) } +// EIP-7732 ePBS beacon SSE event handlers. +func (n *node) OnExecutionPayload(ctx context.Context, handler func(ctx context.Context, event *gloas.SignedExecutionPayloadEnvelope) error) { + n.broker.On(topicExecutionPayload, func(event *gloas.SignedExecutionPayloadEnvelope) { + n.handleSubscriberError(handler(ctx, event), topicExecutionPayload) + }) +} + +func (n *node) OnExecutionPayloadGossip(ctx context.Context, handler func(ctx context.Context, event *gloas.SignedExecutionPayloadEnvelope) error) { + n.broker.On(topicExecutionPayloadGossip, func(event *gloas.SignedExecutionPayloadEnvelope) { + n.handleSubscriberError(handler(ctx, event), topicExecutionPayloadGossip) + }) +} + +func (n *node) OnExecutionPayloadAvailable(ctx context.Context, handler func(ctx context.Context, event *v1.ExecutionPayloadAvailableEvent) error) { + n.broker.On(topicExecutionPayloadAvailable, func(event *v1.ExecutionPayloadAvailableEvent) { + n.handleSubscriberError(handler(ctx, event), topicExecutionPayloadAvailable) + }) +} + +func (n *node) OnExecutionPayloadBid(ctx context.Context, handler func(ctx context.Context, event *gloas.SignedExecutionPayloadBid) error) { + n.broker.On(topicExecutionPayloadBid, func(event *gloas.SignedExecutionPayloadBid) { + n.handleSubscriberError(handler(ctx, event), topicExecutionPayloadBid) + }) +} + +func (n *node) OnPayloadAttestationMessage(ctx context.Context, handler func(ctx context.Context, event *gloas.PayloadAttestationMessage) error) { + n.broker.On(topicPayloadAttestationMessage, func(event *gloas.PayloadAttestationMessage) { + n.handleSubscriberError(handler(ctx, event), topicPayloadAttestationMessage) + }) +} + +func (n *node) OnProposerPreferences(ctx context.Context, handler func(ctx context.Context, event *gloas.SignedProposerPreferences) error) { + n.broker.On(topicProposerPreferences, func(event *gloas.SignedProposerPreferences) { + n.handleSubscriberError(handler(ctx, event), topicProposerPreferences) + }) +} + func (n *node) OnEvent(ctx context.Context, handler func(ctx context.Context, event *v1.Event) error) { n.broker.On(topicEvent, func(event *v1.Event) { n.handleSubscriberError(handler(ctx, event), topicEvent) diff --git a/pkg/beacon/subscriptions.go b/pkg/beacon/subscriptions.go index 538b3c4..ea6fcc1 100644 --- a/pkg/beacon/subscriptions.go +++ b/pkg/beacon/subscriptions.go @@ -12,6 +12,7 @@ import ( "github.com/ethpandaops/go-eth2-client/spec" "github.com/ethpandaops/go-eth2-client/spec/altair" "github.com/ethpandaops/go-eth2-client/spec/electra" + "github.com/ethpandaops/go-eth2-client/spec/gloas" "github.com/ethpandaops/go-eth2-client/spec/phase0" ) @@ -104,6 +105,18 @@ func (n *node) handleEvent(ctx context.Context, event *v1.Event) error { return n.handleDataColumnSidecar(ctx, event) case topicFastConfirmation: return n.handleFastConfirmation(ctx, event) + case topicExecutionPayload: + return n.handleExecutionPayload(ctx, event) + case topicExecutionPayloadGossip: + return n.handleExecutionPayloadGossip(ctx, event) + case topicExecutionPayloadAvailable: + return n.handleExecutionPayloadAvailable(ctx, event) + case topicExecutionPayloadBid: + return n.handleExecutionPayloadBid(ctx, event) + case topicPayloadAttestationMessage: + return n.handlePayloadAttestationMessage(ctx, event) + case topicProposerPreferences: + return n.handleProposerPreferences(ctx, event) default: return fmt.Errorf("unknown event topic %s", event.Topic) @@ -241,3 +254,69 @@ func (n *node) handleDataColumnSidecar(ctx context.Context, event *v1.Event) err return nil } + +func (n *node) handleExecutionPayload(ctx context.Context, event *v1.Event) error { + envelope, valid := event.Data.(*gloas.SignedExecutionPayloadEnvelope) + if !valid { + return errors.New("invalid execution payload event") + } + + n.publishExecutionPayload(ctx, envelope) + + return nil +} + +func (n *node) handleExecutionPayloadGossip(ctx context.Context, event *v1.Event) error { + envelope, valid := event.Data.(*gloas.SignedExecutionPayloadEnvelope) + if !valid { + return errors.New("invalid execution payload gossip event") + } + + n.publishExecutionPayloadGossip(ctx, envelope) + + return nil +} + +func (n *node) handleExecutionPayloadAvailable(ctx context.Context, event *v1.Event) error { + available, valid := event.Data.(*v1.ExecutionPayloadAvailableEvent) + if !valid { + return errors.New("invalid execution payload available event") + } + + n.publishExecutionPayloadAvailable(ctx, available) + + return nil +} + +func (n *node) handleExecutionPayloadBid(ctx context.Context, event *v1.Event) error { + bid, valid := event.Data.(*gloas.SignedExecutionPayloadBid) + if !valid { + return errors.New("invalid execution payload bid event") + } + + n.publishExecutionPayloadBid(ctx, bid) + + return nil +} + +func (n *node) handlePayloadAttestationMessage(ctx context.Context, event *v1.Event) error { + message, valid := event.Data.(*gloas.PayloadAttestationMessage) + if !valid { + return errors.New("invalid payload attestation message event") + } + + n.publishPayloadAttestationMessage(ctx, message) + + return nil +} + +func (n *node) handleProposerPreferences(ctx context.Context, event *v1.Event) error { + prefs, valid := event.Data.(*gloas.SignedProposerPreferences) + if !valid { + return errors.New("invalid proposer preferences event") + } + + n.publishProposerPreferences(ctx, prefs) + + return nil +}