diff --git a/CHANGELOG.md b/CHANGELOG.md index ff640f8..369cde5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +0.8.0: + - support deneb + - add t_blob_sidecars for Deneb + - add f_blob_kzg_commitments to t_blocks for Deneb + - add f_blob_gas_used to t_block_execution_payloads for Deneb + - add f_excess_blob_gas to t_block_execution_payloads for Deneb + 0.7.7: - add attestations provider - do not attempt to summarize ahead of finalized epoch diff --git a/Dockerfile b/Dockerfile index 63c00df..c3e0d41 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.20-bullseye as builder +FROM golang:1.20-bookworm as builder WORKDIR /app @@ -10,7 +10,7 @@ COPY . . RUN go build -FROM debian:bullseye-slim +FROM debian:bookworm-slim RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt install -y ca-certificates && apt-get clean && rm -rf /var/lib/apt/lists/* diff --git a/clients.go b/clients.go index d045b61..1a8bf53 100644 --- a/clients.go +++ b/clients.go @@ -18,7 +18,7 @@ import ( "sync" eth2client "github.com/attestantio/go-eth2-client" - autoclient "github.com/attestantio/go-eth2-client/auto" + "github.com/attestantio/go-eth2-client/http" "github.com/pkg/errors" "github.com/spf13/viper" "github.com/wealdtech/chaind/util" @@ -41,10 +41,10 @@ func fetchClient(ctx context.Context, address string) (eth2client.Service, error var exists bool if client, exists = clients[address]; !exists { var err error - client, err = autoclient.New(ctx, - autoclient.WithLogLevel(util.LogLevel("eth2client")), - autoclient.WithTimeout(viper.GetDuration("eth2client.timeout")), - autoclient.WithAddress(address)) + client, err = http.New(ctx, + http.WithLogLevel(util.LogLevel("eth2client")), + http.WithTimeout(viper.GetDuration("eth2client.timeout")), + http.WithAddress(address)) if err != nil { return nil, errors.Wrap(err, "failed to initiate client") } diff --git a/go.mod b/go.mod index f1f5eb0..79e252a 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/wealdtech/chaind go 1.20 require ( - github.com/attestantio/go-eth2-client v0.19.5 + github.com/attestantio/go-eth2-client v0.19.8 github.com/aws/aws-sdk-go v1.47.10 github.com/jackc/pgx-shopspring-decimal v0.0.0-20220624020537-1d36b5a1853e github.com/jackc/pgx-zerolog v0.0.0-20230315001418-f978528409eb @@ -30,46 +30,46 @@ require ( ) require ( - cloud.google.com/go/compute v1.23.0 // indirect + cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.1 // indirect - cloud.google.com/go/secretmanager v1.11.1 // indirect + cloud.google.com/go/iam v1.1.5 // indirect + cloud.google.com/go/secretmanager v1.11.4 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/fatih/color v1.14.1 // indirect + github.com/fatih/color v1.16.0 // indirect github.com/ferranbt/fastssz v0.1.3 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logr/logr v1.3.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/goccy/go-yaml v1.9.2 // indirect + github.com/goccy/go-yaml v1.11.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/s2a-go v0.1.7 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.1 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/holiman/uint256 v1.2.2 // indirect - github.com/huandu/go-clone v1.6.0 // indirect + github.com/holiman/uint256 v1.2.4 // indirect + github.com/huandu/go-clone v1.7.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/klauspost/cpuid/v2 v2.0.9 // indirect + github.com/klauspost/cpuid/v2 v2.2.6 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/minio/sha256-simd v1.0.0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect + github.com/minio/sha256-simd v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/pelletier/go-toml/v2 v2.1.0 // indirect - github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // indirect + github.com/petermattis/goid v0.0.0-20230904192822-1876fd5063bc // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 // indirect - github.com/prometheus/common v0.44.0 // indirect - github.com/prometheus/procfs v0.11.1 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.45.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/r3labs/sse/v2 v2.10.0 // indirect github.com/sagikazarmark/locafero v0.3.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect @@ -80,19 +80,20 @@ require ( go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/otel/metric v1.20.0 // indirect go.opentelemetry.io/proto/otlp v1.0.0 // indirect - go.uber.org/multierr v1.9.0 // indirect - golang.org/x/crypto v0.14.0 // indirect - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/oauth2 v0.12.0 // indirect - golang.org/x/sys v0.14.0 // indirect - golang.org/x/text v0.13.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.143.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/crypto v0.18.0 // indirect + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/net v0.18.0 // indirect + golang.org/x/oauth2 v0.14.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.4.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/api v0.150.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/cenkalti/backoff.v1 v1.1.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index c92146a..bf45939 100644 --- a/go.sum +++ b/go.sum @@ -32,7 +32,7 @@ cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w9 cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.103.0/go.mod h1:vwLx1nqLrzLX/fpwSMOXmFIqBOyHsvHbnAdbGSJ+mKk= -cloud.google.com/go v0.110.7 h1:rJyC7nWRg2jWGZ4wSJ5nY65GTdYJkg0cd/uXb+ACI6o= +cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -45,22 +45,22 @@ cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6m cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v1.1.1 h1:lW7fzj15aVIXYHREOqjRBV9PsH0Z6u8Y46a1YGvQP4Y= -cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= +cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/secretmanager v1.5.0/go.mod h1:5C9kM+RwSpkURNovKySkNvGQLUaOgyoR5W0RUx2SyHQ= -cloud.google.com/go/secretmanager v1.11.1 h1:cLTCwAjFh9fKvU6F13Y4L9vPcx9yiWPyWXE4+zkuEQs= -cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= +cloud.google.com/go/secretmanager v1.11.4 h1:krnX9qpG2kR2fJ+u+uNyNo+ACVhplIAS4Pu7u+4gd+k= +cloud.google.com/go/secretmanager v1.11.4/go.mod h1:wreJlbS9Zdq21lMzWmJ0XhWW2ZxgPeahsqeV/vZoJ3w= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= @@ -74,8 +74,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/attestantio/go-eth2-client v0.19.5 h1:4V+vhXsCYji5jWrlONbr03GV7qoLRdzq96dLgXaqmek= -github.com/attestantio/go-eth2-client v0.19.5/go.mod h1:mZve1kV9Ctj0I1HH9gdg+MnI8lZ+Cb2EktEtOYrBlsM= +github.com/attestantio/go-eth2-client v0.19.8 h1:7hn5X1MohW+wpfnwOpysPpjSktZwTB0A2ClohOCgZLI= +github.com/attestantio/go-eth2-client v0.19.8/go.mod h1:mZve1kV9Ctj0I1HH9gdg+MnI8lZ+Cb2EktEtOYrBlsM= github.com/aws/aws-sdk-go v1.44.81/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.47.10 h1:cvufN7WkD1nlOgpRopsmxKQlFp5X1MfyAw4r7BBORQc= github.com/aws/aws-sdk-go v1.47.10/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= @@ -117,14 +117,13 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= -github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/ferranbt/fastssz v0.1.3 h1:ZI+z3JH05h4kgmFXdHuR1aWYsgrg7o+Fw7/NCzM16Mo= github.com/ferranbt/fastssz v0.1.3/go.mod h1:0Y9TEd/9XuFlh7mskMPfXiI2Dkw4Ddg9EyXt1W7MRvE= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +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/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 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= @@ -134,18 +133,13 @@ github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= github.com/go-logr/logr v1.3.0/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/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/goccy/go-yaml v1.9.2 h1:2Njwzw+0+pjU2gb805ZC1B/uBuAs2VcZ3K+ZgHwDs7w= -github.com/goccy/go-yaml v1.9.2/go.mod h1:U/jl18uSupI5rdI2jmuCswEA2htH9eXfferR3KfscvA= +github.com/goccy/go-yaml v1.11.2 h1:joq77SxuyIs9zzxEjgyLBugMQ9NEgTWxXfz2wVqwAaQ= +github.com/goccy/go-yaml v1.11.2/go.mod h1:wKnAMd44+9JAAnGQpWVEgBzGt3YuTaQ4uXoHvE4m7WU= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -224,8 +218,8 @@ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.3.1 h1:SBWmZhjUDRorQxrN0nwzf+AHBxnbFjViHQS4P0yVpmQ= -github.com/googleapis/enterprise-certificate-proxy v0.3.1/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= @@ -238,18 +232,18 @@ github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qK github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/holiman/uint256 v1.2.2 h1:TXKcSGc2WaxPD2+bmzAsVthL4+pEN0YwXcL5qED83vk= -github.com/holiman/uint256 v1.2.2/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= -github.com/huandu/go-clone v1.6.0 h1:HMo5uvg4wgfiy5FoGOqlFLQED/VGRm2D9Pi8g1FXPGc= -github.com/huandu/go-clone v1.6.0/go.mod h1:ReGivhG6op3GYr+UY3lS6mxjKp7MIGTknuU5TbTVaXE= +github.com/huandu/go-clone v1.7.0 h1:N+U/hh2bKrHmlzcBrIl68pQVbojbz086LqzmB87c/pY= +github.com/huandu/go-clone v1.7.0/go.mod h1:ReGivhG6op3GYr+UY3lS6mxjKp7MIGTknuU5TbTVaXE= github.com/huandu/go-clone/generic v1.6.0 h1:Wgmt/fUZ28r16F2Y3APotFD59sHk1p78K0XLdbUYN5U= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -272,9 +266,8 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfC 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= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc= +github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -282,30 +275,29 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +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/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= +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/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 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/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= -github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= +github.com/petermattis/goid v0.0.0-20230904192822-1876fd5063bc h1:8bQZVK1X6BJR/6nYUPxQEP+ReTsceJTKizeuwjWOPUA= +github.com/petermattis/goid v0.0.0-20230904192822-1876fd5063bc/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= @@ -315,12 +307,12 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 h1:v7DLqVdK4VrYkVD5diGdl4sxJurKJEMnODWRJlxV9oM= -github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= -github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= -github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 h1:0tVE4tdWQK9ZpYygoV7+vS6QkDvQVySboMVEIxBJmXw= github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7/go.mod h1:wmuf/mdK4VMD+jA9ThwcUKjg3a2XWM9cVfFYjDyY4j4= github.com/r3labs/sse/v2 v2.10.0 h1:hFEkLLFY4LDifoHdiCN/LlGBAdVJYsANaLqNYa1l/v0= @@ -375,6 +367,7 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -402,17 +395,18 @@ go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v8 go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= -go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= -go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -423,8 +417,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -450,6 +444,7 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= 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= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -496,8 +491,9 @@ golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= +golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -519,8 +515,8 @@ golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= -golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= +golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= +golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -533,6 +529,7 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -548,7 +545,6 @@ golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -599,13 +595,14 @@ 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-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220818161305-2296e01440c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/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.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -617,11 +614,14 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 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= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY= +golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -674,6 +674,7 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= 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= @@ -681,8 +682,8 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -725,16 +726,17 @@ google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3p google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= google.golang.org/api v0.86.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.143.0 h1:o8cekTkqhywkbZT6p1UHJPZ9+9uuCAJs/KYomxZB8fA= -google.golang.org/api v0.143.0/go.mod h1:FoX9DO9hT7DLNn97OuoZAGSDuNAXdJRuGK98rSUgurk= +google.golang.org/api v0.150.0 h1:Z9k22qD289SZ8gCJrk4DrWXkNjtfvKAUo/l1ma8eBYE= +google.golang.org/api v0.150.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -819,12 +821,12 @@ google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljW google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220819174105-e9f053255caa/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb h1:XFBgcDwm7irdHTbz4Zk2h7Mh+eis4nfJEFQFYzJzuIA= -google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb h1:lK0oleSc7IQsUxO3U5TjL9DWlsxpEBemh+zpB7IqhWI= -google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 h1:N3bU/SQDCDyD6R528GJ/PwW9KjYcJA3dgyH+MovAkIM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:KSqppvjFjtoCI+KGd4PELB0qLNxdJHRGqRI09mB6pQA= +google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= +google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= diff --git a/main.go b/main.go index 27d67c8..cf1ff33 100644 --- a/main.go +++ b/main.go @@ -61,7 +61,7 @@ import ( ) // ReleaseVersion is the release version for the code. -var ReleaseVersion = "0.7.8" +var ReleaseVersion = "0.8.0" func main() { os.Exit(main2()) diff --git a/services/blocks/standard/handler.go b/services/blocks/standard/handler.go index 4e1cf3c..f83e0cb 100644 --- a/services/blocks/standard/handler.go +++ b/services/blocks/standard/handler.go @@ -403,6 +403,11 @@ func (s *Service) onBlockDeneb(ctx context.Context, signedBlock *deneb.SignedBea signedBlock.Message.Body.SyncAggregate); err != nil { return errors.Wrap(err, "failed to update sync aggregate") } + if len(signedBlock.Message.Body.BlobKZGCommitments) > 0 { + if err := s.updateBlobSidecarsForBlock(ctx, dbBlock.Root); err != nil { + return errors.Wrap(err, "failed to update blob sidecars") + } + } return nil } @@ -544,6 +549,31 @@ func (s *Service) updateSyncAggregateForBlock(ctx context.Context, return nil } +func (s *Service) updateBlobSidecarsForBlock(ctx context.Context, + blockRoot phase0.Root, +) error { + ctx, span := otel.Tracer("wealdtech.chaind.services.blocks.standard").Start(ctx, "updateBlobSidecarsForBlock") + defer span.End() + + response, err := s.eth2Client.(eth2client.BlobSidecarsProvider).BlobSidecars(ctx, &api.BlobSidecarsOpts{ + Block: blockRoot.String(), + }) + if err != nil { + return errors.Wrap(err, "failed to obtain beacon block blobs") + } + + dbBlobSidecars := make([]*chaindb.BlobSidecar, len(response.Data)) + for i := range response.Data { + dbBlobSidecars[i] = s.dbBlobSidecar(ctx, blockRoot, response.Data[i]) + } + + if err := s.blobSidecarsSetter.SetBlobSidecars(ctx, dbBlobSidecars); err != nil { + return errors.Wrap(err, "failed to set blob sidecars") + } + + return nil +} + func (s *Service) dbBlock( ctx context.Context, block *spec.VersionedSignedBeaconBlock, @@ -865,9 +895,10 @@ func (*Service) dbBlockDeneb( BlockHash: block.Body.ExecutionPayload.BlockHash, Withdrawals: withdrawals, BlobGasUsed: block.Body.ExecutionPayload.BlobGasUsed, - ExcessDataGas: block.Body.ExecutionPayload.ExcessBlobGas, + ExcessBlobGas: block.Body.ExecutionPayload.ExcessBlobGas, }, BLSToExecutionChanges: blsToExecutionChanges, + BlobKZGCommitments: block.Body.BlobKZGCommitments, } return dbBlock, nil @@ -1146,3 +1177,18 @@ func (s *Service) beaconCommittee(ctx context.Context, return nil, errors.Wrap(err, "failed to obtain beacon committees") } + +func (*Service) dbBlobSidecar(_ context.Context, + blockRoot phase0.Root, + blobSidecar *deneb.BlobSidecar, +) *chaindb.BlobSidecar { + return &chaindb.BlobSidecar{ + InclusionBlockRoot: blockRoot, + InclusionSlot: blobSidecar.SignedBlockHeader.Message.Slot, + InclusionIndex: blobSidecar.Index, + Blob: blobSidecar.Blob, + KZGCommitment: blobSidecar.KZGCommitment, + KZGProof: blobSidecar.KZGProof, + KZGCommitmentInclusionProof: blobSidecar.KZGCommitmentInclusionProof, + } +} diff --git a/services/blocks/standard/service.go b/services/blocks/standard/service.go index fc79be6..4c3583b 100644 --- a/services/blocks/standard/service.go +++ b/services/blocks/standard/service.go @@ -40,6 +40,7 @@ type Service struct { voluntaryExitsSetter chaindb.VoluntaryExitsSetter beaconCommitteesProvider chaindb.BeaconCommitteesProvider syncCommitteesProvider chaindb.SyncCommitteesProvider + blobSidecarsSetter chaindb.BlobSidecarsSetter chainTime chaintime.Service refetch bool lastHandledBlockRoot phase0.Root @@ -109,6 +110,11 @@ func New(ctx context.Context, params ...Parameter) (*Service, error) { return nil, errors.New("chain DB does not support sync committee providing") } + blobSidecarsSetter, isBlobSidecarsSetter := parameters.chainDB.(chaindb.BlobSidecarsSetter) + if !isBlobSidecarsSetter { + return nil, errors.New("chain DB does not support blob sidecar setting") + } + s := &Service{ eth2Client: parameters.eth2Client, chainDB: parameters.chainDB, @@ -121,6 +127,7 @@ func New(ctx context.Context, params ...Parameter) (*Service, error) { voluntaryExitsSetter: voluntaryExitsSetter, beaconCommitteesProvider: beaconCommitteesProvider, syncCommitteesProvider: syncCommitteesProvider, + blobSidecarsSetter: blobSidecarsSetter, chainTime: parameters.chainTime, refetch: parameters.refetch, activitySem: parameters.activitySem, diff --git a/services/chaindb/postgresql/blobsidecars.go b/services/chaindb/postgresql/blobsidecars.go new file mode 100644 index 0000000..c64f49b --- /dev/null +++ b/services/chaindb/postgresql/blobsidecars.go @@ -0,0 +1,161 @@ +// Copyright © 2023 Weald Technology Trading. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package postgresql + +import ( + "context" + "fmt" + "sort" + "strings" + + "github.com/pkg/errors" + "github.com/wealdtech/chaind/services/chaindb" + "go.opentelemetry.io/otel" +) + +// BlobSidecars provides blob sidecars according to the filter. +func (s *Service) BlobSidecars(ctx context.Context, + filter *chaindb.BlobSidecarFilter, +) ( + []*chaindb.BlobSidecar, + error, +) { + ctx, span := otel.Tracer("wealdtech.chaind.services.chaindb.postgresql").Start(ctx, "BlobSidecars") + defer span.End() + + tx := s.tx(ctx) + if tx == nil { + ctx, err := s.BeginROTx(ctx) + if err != nil { + return nil, errors.Wrap(err, "failed to begin transaction") + } + defer s.CommitROTx(ctx) + tx = s.tx(ctx) + } + + // Build the query. + queryBuilder := strings.Builder{} + queryVals := make([]interface{}, 0) + + queryBuilder.WriteString(` +SELECT f_block_root + ,f_slot + ,f_index + ,f_blob + ,f_kzg_commitment + ,f_kzg_proof + ,f_kzg_commitment_inclusion_proof +FROM t_blob_sidecars`) + + conditions := make([]string, 0) + + if filter.From != nil { + queryVals = append(queryVals, *filter.From) + conditions = append(conditions, fmt.Sprintf("f_slot >= $%d", len(queryVals))) + } + + if filter.To != nil { + queryVals = append(queryVals, *filter.To) + queryBuilder.WriteString(fmt.Sprintf("f_slot <= $%d", len(queryVals))) + } + + if len(filter.BlockRoots) > 0 { + queryVals = append(queryVals, filter.BlockRoots) + queryBuilder.WriteString(fmt.Sprintf("f_block_root = ANY($%d)", len(queryVals))) + } + + if len(filter.Indices) > 0 { + queryVals = append(queryVals, filter.Indices) + queryBuilder.WriteString(fmt.Sprintf("f_index = ANY($%d)", len(queryVals))) + } + + if len(conditions) > 0 { + queryBuilder.WriteString("\nWHERE ") + queryBuilder.WriteString(strings.Join(conditions, "\n AND ")) + } + + switch filter.Order { + case chaindb.OrderEarliest: + queryBuilder.WriteString(` +ORDER BY f_slot, f_index`) + case chaindb.OrderLatest: + queryBuilder.WriteString(` +ORDER BY f_slot DESC,f_index DESC`) + default: + return nil, errors.New("no order specified") + } + + if filter.Limit > 0 { + queryVals = append(queryVals, filter.Limit) + queryBuilder.WriteString(fmt.Sprintf(` +LIMIT $%d`, len(queryVals))) + } + + if e := log.Trace(); e.Enabled() { + params := make([]string, len(queryVals)) + for i := range queryVals { + params[i] = fmt.Sprintf("%v", queryVals[i]) + } + e.Str("query", strings.ReplaceAll(queryBuilder.String(), "\n", " ")).Strs("params", params).Msg("SQL query") + } + + rows, err := tx.Query(ctx, + queryBuilder.String(), + queryVals..., + ) + if err != nil { + return nil, err + } + defer rows.Close() + + blobSidecars := make([]*chaindb.BlobSidecar, 0) + for rows.Next() { + blobSidecar := &chaindb.BlobSidecar{} + var blockRoot []byte + var blob []byte + var kzgCommitment []byte + var kzgProof []byte + var kzgCommitmentInclusionProof [][]byte + err := rows.Scan( + &blockRoot, + &blobSidecar.InclusionSlot, + &blobSidecar.InclusionIndex, + &blob, + &kzgCommitment, + &kzgProof, + &kzgCommitmentInclusionProof, + ) + if err != nil { + return nil, errors.Wrap(err, "failed to scan row") + } + copy(blobSidecar.InclusionBlockRoot[:], blockRoot) + copy(blobSidecar.Blob[:], blob) + copy(blobSidecar.KZGCommitment[:], kzgCommitment) + copy(blobSidecar.KZGProof[:], kzgProof) + for i := range kzgCommitmentInclusionProof { + copy(blobSidecar.KZGCommitmentInclusionProof[i][:], kzgCommitmentInclusionProof[i]) + } + blobSidecars = append(blobSidecars, blobSidecar) + } + + // Always return order of slot then index. + sort.Slice(blobSidecars, func(i int, j int) bool { + if blobSidecars[i].InclusionSlot != blobSidecars[j].InclusionSlot { + return blobSidecars[i].InclusionSlot < blobSidecars[j].InclusionSlot + } + return blobSidecars[i].InclusionIndex < blobSidecars[j].InclusionIndex + }) + + return blobSidecars, nil +} diff --git a/services/chaindb/postgresql/blocks.go b/services/chaindb/postgresql/blocks.go index 45511c1..3927b95 100644 --- a/services/chaindb/postgresql/blocks.go +++ b/services/chaindb/postgresql/blocks.go @@ -1,4 +1,4 @@ -// Copyright © 2020 - 2022 Weald Technology Trading. +// Copyright © 2020 - 2023 Weald Technology Trading. // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -21,6 +21,7 @@ import ( "sort" "strings" + "github.com/attestantio/go-eth2-client/spec/deneb" "github.com/attestantio/go-eth2-client/spec/phase0" "github.com/pkg/errors" "github.com/wealdtech/chaind/services/chaindb" @@ -37,6 +38,14 @@ func (s *Service) SetBlock(ctx context.Context, block *chaindb.Block) error { return ErrNoTransaction } + var blobKZGCommitments [][]byte + if len(block.BlobKZGCommitments) > 0 { + blobKZGCommitments = make([][]byte, len(block.BlobKZGCommitments)) + for i := range block.BlobKZGCommitments { + blobKZGCommitments[i] = block.BlobKZGCommitments[i][:] + } + } + var canonical sql.NullBool if block.Canonical != nil { canonical.Valid = true @@ -55,8 +64,9 @@ func (s *Service) SetBlock(ctx context.Context, block *chaindb.Block) error { ,f_eth1_block_hash ,f_eth1_deposit_count ,f_eth1_deposit_root + ,f_blob_kzg_commitments ) - VALUES($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12) + VALUES($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13) ON CONFLICT (f_root) DO UPDATE SET f_slot = excluded.f_slot @@ -70,6 +80,7 @@ func (s *Service) SetBlock(ctx context.Context, block *chaindb.Block) error { ,f_eth1_block_hash = excluded.f_eth1_block_hash ,f_eth1_deposit_count = excluded.f_eth1_deposit_count ,f_eth1_deposit_root = excluded.f_eth1_deposit_root + ,f_blob_kzg_commitments = excluded.f_blob_kzg_commitments `, block.Slot, block.ProposerIndex, @@ -83,6 +94,7 @@ func (s *Service) SetBlock(ctx context.Context, block *chaindb.Block) error { block.ETH1BlockHash, block.ETH1DepositCount, block.ETH1DepositRoot[:], + blobKZGCommitments, ); err != nil { return err } @@ -100,7 +112,7 @@ func (s *Service) SetBlock(ctx context.Context, block *chaindb.Block) error { return nil } -// Blocks provides withdrawals according to the filter. +// Blocks provides blocks according to the filter. func (s *Service) Blocks(ctx context.Context, filter *chaindb.BlockFilter) ([]*chaindb.Block, error) { ctx, span := otel.Tracer("wealdtech.chaind.services.chaindb.postgresql").Start(ctx, "Blocks") defer span.End() @@ -132,6 +144,7 @@ SELECT f_slot ,f_eth1_block_hash ,f_eth1_deposit_count ,f_eth1_deposit_root + ,f_blob_kzg_commitments FROM t_blocks`) wherestr := "WHERE" @@ -199,6 +212,7 @@ LIMIT $%d`, len(queryVals))) var stateRoot []byte var canonical sql.NullBool var eth1DepositRoot []byte + var blobKZGCommitments [][]byte err := rows.Scan( &block.Slot, &block.ProposerIndex, @@ -212,6 +226,7 @@ LIMIT $%d`, len(queryVals))) &block.ETH1BlockHash, &block.ETH1DepositCount, ð1DepositRoot, + &blobKZGCommitments, ) if err != nil { return nil, errors.Wrap(err, "failed to scan row") @@ -226,6 +241,12 @@ LIMIT $%d`, len(queryVals))) block.Canonical = &val } copy(block.ETH1DepositRoot[:], eth1DepositRoot) + if len(blobKZGCommitments) > 0 { + block.BlobKZGCommitments = make([]deneb.KZGCommitment, len(blobKZGCommitments)) + for i := range blobKZGCommitments { + copy(block.BlobKZGCommitments[i][:], blobKZGCommitments[i]) + } + } blocks = append(blocks, block) } @@ -285,6 +306,7 @@ func (s *Service) BlocksBySlot(ctx context.Context, slot phase0.Slot) ([]*chaind ,f_eth1_block_hash ,f_eth1_deposit_count ,f_eth1_deposit_root + ,f_blob_kzg_commitments FROM t_blocks WHERE f_slot = $1`, slot, @@ -305,6 +327,7 @@ func (s *Service) BlocksBySlot(ctx context.Context, slot phase0.Slot) ([]*chaind var stateRoot []byte var canonical sql.NullBool var eth1DepositRoot []byte + var blobKZGCommitments [][]byte err := rows.Scan( &block.Slot, &block.ProposerIndex, @@ -318,6 +341,7 @@ func (s *Service) BlocksBySlot(ctx context.Context, slot phase0.Slot) ([]*chaind &block.ETH1BlockHash, &block.ETH1DepositCount, ð1DepositRoot, + &blobKZGCommitments, ) if err != nil { return nil, errors.Wrap(err, "failed to scan row") @@ -332,6 +356,12 @@ func (s *Service) BlocksBySlot(ctx context.Context, slot phase0.Slot) ([]*chaind block.Canonical = &val } copy(block.ETH1DepositRoot[:], eth1DepositRoot) + if len(blobKZGCommitments) > 0 { + block.BlobKZGCommitments = make([]deneb.KZGCommitment, len(blobKZGCommitments)) + for i := range blobKZGCommitments { + copy(block.BlobKZGCommitments[i][:], blobKZGCommitments[i]) + } + } blocks = append(blocks, block) } @@ -378,6 +408,7 @@ func (s *Service) BlocksForSlotRange(ctx context.Context, startSlot phase0.Slot, ,f_eth1_block_hash ,f_eth1_deposit_count ,f_eth1_deposit_root + ,f_blob_kzg_commitments FROM t_blocks WHERE f_slot >= $1 AND f_slot < $2 @@ -400,6 +431,7 @@ func (s *Service) BlocksForSlotRange(ctx context.Context, startSlot phase0.Slot, var stateRoot []byte var canonical sql.NullBool var eth1DepositRoot []byte + var blobKZGCommitments [][]byte err := rows.Scan( &block.Slot, &block.ProposerIndex, @@ -413,6 +445,7 @@ func (s *Service) BlocksForSlotRange(ctx context.Context, startSlot phase0.Slot, &block.ETH1BlockHash, &block.ETH1DepositCount, ð1DepositRoot, + &blobKZGCommitments, ) if err != nil { return nil, errors.Wrap(err, "failed to scan row") @@ -427,6 +460,12 @@ func (s *Service) BlocksForSlotRange(ctx context.Context, startSlot phase0.Slot, block.Canonical = &val } copy(block.ETH1DepositRoot[:], eth1DepositRoot) + if len(blobKZGCommitments) > 0 { + block.BlobKZGCommitments = make([]deneb.KZGCommitment, len(blobKZGCommitments)) + for i := range blobKZGCommitments { + copy(block.BlobKZGCommitments[i][:], blobKZGCommitments[i]) + } + } blocks = append(blocks, block) } @@ -466,6 +505,7 @@ func (s *Service) BlockByRoot(ctx context.Context, root phase0.Root) (*chaindb.B var stateRoot []byte var canonical sql.NullBool var eth1DepositRoot []byte + var blobKZGCommitments [][]byte err = tx.QueryRow(ctx, ` SELECT f_slot @@ -480,6 +520,7 @@ func (s *Service) BlockByRoot(ctx context.Context, root phase0.Root) (*chaindb.B ,f_eth1_block_hash ,f_eth1_deposit_count ,f_eth1_deposit_root + ,f_blob_kzg_commitments FROM t_blocks WHERE f_root = $1`, root[:], @@ -496,6 +537,7 @@ func (s *Service) BlockByRoot(ctx context.Context, root phase0.Root) (*chaindb.B &block.ETH1BlockHash, &block.ETH1DepositCount, ð1DepositRoot, + &blobKZGCommitments, ) if err != nil { return nil, err @@ -510,6 +552,12 @@ func (s *Service) BlockByRoot(ctx context.Context, root phase0.Root) (*chaindb.B block.Canonical = &val } copy(block.ETH1DepositRoot[:], eth1DepositRoot) + if len(blobKZGCommitments) > 0 { + block.BlobKZGCommitments = make([]deneb.KZGCommitment, len(blobKZGCommitments)) + for i := range blobKZGCommitments { + copy(block.BlobKZGCommitments[i][:], blobKZGCommitments[i]) + } + } // Add execution payload to the block if available. block.ExecutionPayload, err = s.executionPayload(ctx, tx, block.Root) @@ -600,6 +648,7 @@ func (s *Service) BlocksByParentRoot(ctx context.Context, parentRoot phase0.Root ,f_eth1_block_hash ,f_eth1_deposit_count ,f_eth1_deposit_root + ,f_blob_kzg_commitments FROM t_blocks WHERE f_parent_root = $1`, parentRoot[:], @@ -619,6 +668,7 @@ func (s *Service) BlocksByParentRoot(ctx context.Context, parentRoot phase0.Root var stateRoot []byte var canonical sql.NullBool var eth1DepositRoot []byte + var blobKZGCommitments [][]byte err := rows.Scan( &block.Slot, &block.ProposerIndex, @@ -632,6 +682,7 @@ func (s *Service) BlocksByParentRoot(ctx context.Context, parentRoot phase0.Root &block.ETH1BlockHash, &block.ETH1DepositCount, ð1DepositRoot, + &blobKZGCommitments, ) if err != nil { return nil, errors.Wrap(err, "failed to scan row") @@ -646,6 +697,12 @@ func (s *Service) BlocksByParentRoot(ctx context.Context, parentRoot phase0.Root block.Canonical = &val } copy(block.ETH1DepositRoot[:], eth1DepositRoot) + if len(blobKZGCommitments) > 0 { + block.BlobKZGCommitments = make([]deneb.KZGCommitment, len(blobKZGCommitments)) + for i := range blobKZGCommitments { + copy(block.BlobKZGCommitments[i][:], blobKZGCommitments[i]) + } + } blocks = append(blocks, block) } @@ -781,6 +838,7 @@ func (s *Service) LatestBlocks(ctx context.Context) ([]*chaindb.Block, error) { ,f_eth1_block_hash ,f_eth1_deposit_count ,f_eth1_deposit_root + ,f_blob_kzg_commitments FROM t_blocks WHERE f_slot = (SELECT MAX(f_slot) FROM t_blocks)`) if err != nil { @@ -799,6 +857,7 @@ func (s *Service) LatestBlocks(ctx context.Context) ([]*chaindb.Block, error) { var stateRoot []byte var canonical sql.NullBool var eth1DepositRoot []byte + var blobKZGCommitments [][]byte err := rows.Scan( &block.Slot, &block.ProposerIndex, @@ -812,6 +871,7 @@ func (s *Service) LatestBlocks(ctx context.Context) ([]*chaindb.Block, error) { &block.ETH1BlockHash, &block.ETH1DepositCount, ð1DepositRoot, + &blobKZGCommitments, ) if err != nil { return nil, errors.Wrap(err, "failed to scan row") @@ -826,6 +886,12 @@ func (s *Service) LatestBlocks(ctx context.Context) ([]*chaindb.Block, error) { block.Canonical = &val } copy(block.ETH1DepositRoot[:], eth1DepositRoot) + if len(blobKZGCommitments) > 0 { + block.BlobKZGCommitments = make([]deneb.KZGCommitment, len(blobKZGCommitments)) + for i := range blobKZGCommitments { + copy(block.BlobKZGCommitments[i][:], blobKZGCommitments[i]) + } + } if err != nil { return nil, err } diff --git a/services/chaindb/postgresql/chainspec.go b/services/chaindb/postgresql/chainspec.go index a5c8e45..bf1bd8f 100644 --- a/services/chaindb/postgresql/chainspec.go +++ b/services/chaindb/postgresql/chainspec.go @@ -43,9 +43,9 @@ func (s *Service) SetChainSpecValue(ctx context.Context, key string, value any) case phase0.Root, phase0.Version, phase0.DomainType, phase0.ForkDigest, phase0.Domain, phase0.BLSPubKey, phase0.BLSSignature, []byte: dbVal = fmt.Sprintf("%#x", v) case time.Duration: - dbVal = fmt.Sprintf("%d", int(v.Seconds())) + dbVal = strconv.Itoa(int(v.Seconds())) case time.Time: - dbVal = fmt.Sprintf("%d", v.Unix()) + dbVal = strconv.FormatInt(v.Unix(), 10) default: dbVal = fmt.Sprintf("%v", v) } diff --git a/services/chaindb/postgresql/executionpayload.go b/services/chaindb/postgresql/executionpayload.go index 9c95646..6901e38 100644 --- a/services/chaindb/postgresql/executionpayload.go +++ b/services/chaindb/postgresql/executionpayload.go @@ -69,9 +69,10 @@ INSERT INTO t_block_execution_payloads(f_block_root ,f_base_fee_per_gas ,f_timestamp ,f_extra_data - ,f_excess_data_gas + ,f_blob_gas_used + ,f_excess_blob_gas ) -VALUES($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15) +VALUES($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16) ON CONFLICT (f_block_root) DO UPDATE SET f_block_number = excluded.f_block_number @@ -87,7 +88,8 @@ SET f_block_number = excluded.f_block_number ,f_base_fee_per_gas = excluded.f_base_fee_per_gas ,f_timestamp = excluded.f_timestamp ,f_extra_data = excluded.f_extra_data - ,f_excess_data_gas = excluded.f_excess_data_gas + ,f_blob_gas_used = excluded.f_blob_gas_used + ,f_excess_blob_gas = excluded.f_excess_blob_gas `, block.Root[:], block.ExecutionPayload.BlockNumber, @@ -103,7 +105,8 @@ SET f_block_number = excluded.f_block_number decimal.NewFromBigInt(block.ExecutionPayload.BaseFeePerGas, 0), block.ExecutionPayload.Timestamp, extraData, - block.ExecutionPayload.ExcessDataGas, + block.ExecutionPayload.BlobGasUsed, + block.ExecutionPayload.ExcessBlobGas, ) if err != nil { return err @@ -151,7 +154,8 @@ SELECT f_block_number ,f_base_fee_per_gas ,f_timestamp ,f_extra_data - ,f_excess_data_gas + ,f_blob_gas_used + ,f_excess_blob_gas FROM t_block_execution_payloads WHERE f_block_root = $1`, root[:], @@ -169,7 +173,8 @@ WHERE f_block_root = $1`, &baseFeePerGas, &payload.Timestamp, &payload.ExtraData, - &payload.ExcessDataGas, + &payload.BlobGasUsed, + &payload.ExcessBlobGas, ) if err != nil { if errors.Is(err, pgx.ErrNoRows) { @@ -221,7 +226,8 @@ SELECT f_block_root ,f_base_fee_per_gas ,f_timestamp ,f_extra_data - ,f_excess_data_gas + ,f_blob_gas_used + ,f_excess_blob_gas FROM t_block_execution_payloads WHERE f_block_root = ANY($1)`, broots, @@ -257,7 +263,8 @@ WHERE f_block_root = ANY($1)`, &baseFeePerGas, &payload.Timestamp, &payload.ExtraData, - &payload.ExcessDataGas, + &payload.BlobGasUsed, + &payload.ExcessBlobGas, ) if err != nil { return nil, errors.Wrap(err, "failed to scan row") diff --git a/services/chaindb/postgresql/forkschedule_test.go b/services/chaindb/postgresql/forkschedule_test.go index 4df709e..430b6e1 100644 --- a/services/chaindb/postgresql/forkschedule_test.go +++ b/services/chaindb/postgresql/forkschedule_test.go @@ -37,8 +37,8 @@ func TestForkSchedule(t *testing.T) { ) require.NoError(t, err) - // Ensure this meets the eth2client interface requirement. - _, isProvider := s.(eth2client.ForkScheduleProvider) + // Ensure this meets the chaindb interface requirement. + _, isProvider := s.(chaindb.ForkScheduleProvider) require.True(t, isProvider) // Ensure the value. diff --git a/services/chaindb/postgresql/setblobsidecar.go b/services/chaindb/postgresql/setblobsidecar.go new file mode 100644 index 0000000..f7c0c13 --- /dev/null +++ b/services/chaindb/postgresql/setblobsidecar.go @@ -0,0 +1,75 @@ +// Copyright © 2023 Weald Technology Trading. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package postgresql + +import ( + "bytes" + "context" + + "github.com/wealdtech/chaind/services/chaindb" + "go.opentelemetry.io/otel" +) + +// SetBlobSidecar sets a blob sidecar. +func (s *Service) SetBlobSidecar(ctx context.Context, blobSidecar *chaindb.BlobSidecar) error { + ctx, span := otel.Tracer("wealdtech.chaind.services.chaindb.postgresql").Start(ctx, "SetBlobSidecar") + defer span.End() + + tx := s.tx(ctx) + if tx == nil { + return ErrNoTransaction + } + + var blob *[]byte + if len(blobSidecar.Blob) > 0 { + blobBytes := blobSidecar.Blob[:] + // Trim trailing 0s. + blobBytes = bytes.TrimRight(blobBytes, string([]byte{0x00})) + blob = &blobBytes + } + kzgCommitmentInclusionProof := make([]byte, 0, 17*32) + for i := range blobSidecar.KZGCommitmentInclusionProof[:] { + kzgCommitmentInclusionProof = append(kzgCommitmentInclusionProof, blobSidecar.KZGCommitmentInclusionProof[i][:]...) + } + + if _, err := tx.Exec(ctx, ` +INSERT INTO t_blob_sidecars(f_block_root + ,f_slot + ,f_index + ,f_blob + ,f_kzg_commitment + ,f_kzg_proof + ,f_kzg_commitment_inclusion_proof + ) +VALUES($1,$2,$3,$4,$5,$6,$7) +ON CONFLICT(f_block_root,f_index) DO +UPDATE +SET f_slot = excluded.f_slot + ,f_blob = excluded.f_blob + ,f_kzg_commitment = excluded.f_kzg_commitment + ,f_kzg_proof = excluded.f_kzg_proof + ,f_kzg_commitment_inclusion_proof = excluded.f_kzg_commitment_inclusion_proof +`, + blobSidecar.InclusionBlockRoot[:], + blobSidecar.InclusionSlot, + blobSidecar.InclusionIndex, + blob, + blobSidecar.KZGCommitment[:], + blobSidecar.KZGProof[:], + kzgCommitmentInclusionProof, + ); err != nil { + return err + } + return nil +} diff --git a/services/chaindb/postgresql/setblobsidecars.go b/services/chaindb/postgresql/setblobsidecars.go new file mode 100644 index 0000000..b5f4808 --- /dev/null +++ b/services/chaindb/postgresql/setblobsidecars.go @@ -0,0 +1,91 @@ +// Copyright © 2023 Weald Technology Trading. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package postgresql + +import ( + "bytes" + "context" + + "github.com/jackc/pgx/v5" + "github.com/pkg/errors" + "github.com/wealdtech/chaind/services/chaindb" + "go.opentelemetry.io/otel" +) + +// SetBlobSidecars sets blob sidecars. +func (s *Service) SetBlobSidecars(ctx context.Context, blobSidecars []*chaindb.BlobSidecar) error { + ctx, span := otel.Tracer("wealdtech.chaind.services.chaindb.postgresql").Start(ctx, "SetBlobSidecars") + defer span.End() + + tx := s.tx(ctx) + if tx == nil { + return ErrNoTransaction + } + + // Create a savepoint in case the copy fails. + nestedTx, err := tx.Begin(ctx) + if err != nil { + return errors.Wrap(err, "failed to create nested transaction") + } + + _, err = nestedTx.CopyFrom(ctx, + pgx.Identifier{"t_blob_sidecars"}, + []string{ + "f_block_root", + "f_slot", + "f_index", + "f_blob", + "f_kzg_commitment", + "f_kzg_proof", + "f_kzg_commitment_inclusion_proof", + }, + pgx.CopyFromSlice(len(blobSidecars), func(i int) ([]interface{}, error) { + var blob *[]byte + if len(blobSidecars[i].Blob) > 0 { + blobBytes := blobSidecars[i].Blob[:] + // Trim trailing 0s. + blobBytes = bytes.TrimRight(blobBytes, string([]byte{0x00})) + blob = &blobBytes + } + kzgCommitmentInclusionProof := make([]byte, 0, 17*32) + for j := range blobSidecars[i].KZGCommitmentInclusionProof[:] { + kzgCommitmentInclusionProof = append(kzgCommitmentInclusionProof, blobSidecars[i].KZGCommitmentInclusionProof[j][:]...) + } + + return []interface{}{ + blobSidecars[i].InclusionBlockRoot[:], + blobSidecars[i].InclusionSlot, + blobSidecars[i].InclusionIndex, + blob, + blobSidecars[i].KZGCommitment[:], + blobSidecars[i].KZGProof[:], + kzgCommitmentInclusionProof, + }, nil + })) + + if err != nil { + if err := nestedTx.Rollback(ctx); err != nil { + return errors.Wrap(err, "failed to roll back nested transaction") + } + + log.Debug().Err(err).Msg("Failed to copy insert blob sidecars; applying one at a time") + for _, blobSidecar := range blobSidecars { + if err := s.SetBlobSidecar(ctx, blobSidecar); err != nil { + return err + } + } + } + + return nil +} diff --git a/services/chaindb/postgresql/spec_test.go b/services/chaindb/postgresql/spec_test.go index beeab84..bb0daae 100644 --- a/services/chaindb/postgresql/spec_test.go +++ b/services/chaindb/postgresql/spec_test.go @@ -37,8 +37,8 @@ func TestSpec(t *testing.T) { ) require.NoError(t, err) - // Ensure this meets the eth2client interface requirement. - _, isProvider := s.(eth2client.SpecProvider) + // Ensure this meets the chaindb interface requirement. + _, isProvider := s.(chaindb.ChainSpecProvider) require.True(t, isProvider) // Ensure the value. diff --git a/services/chaindb/postgresql/upgrader.go b/services/chaindb/postgresql/upgrader.go index ca89b1f..9426f23 100644 --- a/services/chaindb/postgresql/upgrader.go +++ b/services/chaindb/postgresql/upgrader.go @@ -27,7 +27,7 @@ type schemaMetadata struct { Version uint64 `json:"version"` } -var currentVersion = uint64(13) +var currentVersion = uint64(14) type upgrade struct { requiresRefetch bool @@ -118,6 +118,14 @@ var upgrades = map[uint64]*upgrade{ addExcessDataGas, }, }, + 14: { + funcs: []func(context.Context, *Service) error{ + renameExcessDataGas, + addBlobKzgCommitments, + addBlobSidecars, + addBlobGasUsed, + }, + }, } // Upgrade upgrades the database. @@ -890,6 +898,7 @@ CREATE TABLE t_blocks ( ,f_eth1_block_hash BYTEA NOT NULL ,f_eth1_deposit_count BIGINT NOT NULL ,f_eth1_deposit_root BYTEA NOT NULL + ,f_blob_kzg_commitments BYTEA[] ); CREATE UNIQUE INDEX i_blocks_1 ON t_blocks(f_slot,f_root); CREATE UNIQUE INDEX i_blocks_2 ON t_blocks(f_root); @@ -911,7 +920,8 @@ CREATE TABLE t_block_execution_payloads ( ,f_base_fee_per_gas NUMERIC NOT NULL ,f_extra_data BYTEA ,f_timestamp BIGINT NOT NULL - ,f_excess_data_gas BIGINT NOT NULL DEFAULT 0 + ,f_blob_gas_used BIGINT NOT NULL DEFAULT 0 + ,f_excess_blob_gas BIGINT NOT NULL DEFAULT 0 ); -- t_beacon_committees contains all beacon committees. @@ -1177,6 +1187,18 @@ CREATE UNIQUE INDEX IF NOT EXISTS i_block_withdrawals_1 ON t_block_withdrawals(f CREATE INDEX IF NOT EXISTS i_block_withdrawals_2 ON t_block_withdrawals(f_block_number); CREATE INDEX IF NOT EXISTS i_block_withdrawals_3 ON t_block_withdrawals(f_validator_index); CREATE INDEX IF NOT EXISTS i_block_withdrawals_4 ON t_block_withdrawals(f_address); + +CREATE TABLE t_blob_sidecars ( + f_block_root BYTEA NOT NULL REFERENCES t_blocks(f_root) ON DELETE CASCADE + ,f_slot BIGINT NOT NULL + ,f_index INTEGER NOT NULL + ,f_blob BYTEA NOT NULL + ,f_kzg_commitment BYTEA NOT NULL + ,f_kzg_proof BYTEA NOT NULL + ,f_kzg_commitment_inclusion_proof BYTEA NOT NULL +); +CREATE UNIQUE INDEX i_blob_sidecars_1 ON t_blob_sidecars(f_block_root,f_index); +CREATE INDEX i_blob_sidecars_2 ON t_blob_sidecars(f_slot); `); err != nil { cancel() return errors.Wrap(err, "failed to create initial tables") @@ -1726,3 +1748,86 @@ ADD COLUMN f_excess_data_gas BIGINT NOT NULL DEFAULT 0 return nil } + +func renameExcessDataGas(ctx context.Context, s *Service) error { + tx := s.tx(ctx) + if tx == nil { + return ErrNoTransaction + } + + if _, err := tx.Exec(ctx, ` +ALTER TABLE t_block_execution_payloads +RENAME f_excess_data_gas TO f_excess_blob_gas +`); err != nil { + return errors.Wrap(err, "failed to rename f_excess_data_gas to f_excess_blob_gas") + } + + return nil +} + +func addBlobKzgCommitments(ctx context.Context, s *Service) error { + tx := s.tx(ctx) + if tx == nil { + return ErrNoTransaction + } + + if _, err := tx.Exec(ctx, ` +ALTER TABLE t_blocks +ADD COLUMN f_blob_kzg_commitments BYTEA[] +`); err != nil { + return errors.Wrap(err, "failed to add f_blob_kzg_commitments to t_blocks") + } + + return nil +} + +func addBlobSidecars(ctx context.Context, s *Service) error { + tx := s.tx(ctx) + if tx == nil { + return ErrNoTransaction + } + + if _, err := tx.Exec(ctx, ` +CREATE TABLE t_blob_sidecars ( + f_block_root BYTEA NOT NULL REFERENCES t_blocks(f_root) ON DELETE CASCADE + ,f_slot BIGINT NOT NULL + ,f_index INTEGER NOT NULL + ,f_blob BYTEA NOT NULL + ,f_kzg_commitment BYTEA NOT NULL + ,f_kzg_proof BYTEA NOT NULL + ,f_kzg_commitment_inclusion_proof BYTEA NOT NULL +) +`); err != nil { + return errors.Wrap(err, "failed to create t_blob_sidecars") + } + + if _, err := tx.Exec(ctx, ` +CREATE UNIQUE INDEX i_blob_sidecars_1 ON t_blob_sidecars(f_block_root,f_index) +`); err != nil { + return errors.Wrap(err, "failed to create i_blob_sidecars_1") + } + + if _, err := tx.Exec(ctx, ` +CREATE INDEX i_blob_sidecars_2 ON t_blob_sidecars(f_slot) +`); err != nil { + return errors.Wrap(err, "failed to create i_blob_sidecars_1") + } + + return nil +} + +func addBlobGasUsed(ctx context.Context, s *Service) error { + tx := s.tx(ctx) + if tx == nil { + return ErrNoTransaction + } + + if _, err := tx.Exec(ctx, ` +ALTER TABLE t_block_execution_payloads +ADD COLUMN f_blob_gas_used BIGINT NOT NULL DEFAULT 0 +`); err != nil { + return errors.Wrap(err, "failed to add f_blob_gas_used to t_block_execution_payloads") + } + + return nil +} diff --git a/services/chaindb/service.go b/services/chaindb/service.go index 6bf5020..c780e9a 100644 --- a/services/chaindb/service.go +++ b/services/chaindb/service.go @@ -135,6 +135,21 @@ type BlocksSetter interface { SetBlock(ctx context.Context, block *Block) error } +// BlobSidecarsProvider defines functions to obtain blob sidecars. +type BlobSidecarsProvider interface { + // BlobSidecars provides blob sidecars according to the filter. + BlobSidecars(ctx context.Context, filter *BlobSidecarFilter) ([]*BlobSidecar, error) +} + +// BlobSidecarsSetter defines functions to create and update blob sidecars. +type BlobSidecarsSetter interface { + // SetBlobSidecars sets or updates blob sidecars. + SetBlobSidecars(ctx context.Context, blobSidecars []*BlobSidecar) error + + // SetBlobSidecar sets or updates a blob sidecar. + SetBlobSidecar(ctx context.Context, blobSidecar *BlobSidecar) error +} + // ChainSpecProvider defines functions to access chain specification. type ChainSpecProvider interface { // ChainSpec fetches all chain specification values. diff --git a/services/chaindb/types.go b/services/chaindb/types.go index 99833a3..fc5660b 100644 --- a/services/chaindb/types.go +++ b/services/chaindb/types.go @@ -18,6 +18,7 @@ import ( "time" "github.com/attestantio/go-eth2-client/spec/capella" + "github.com/attestantio/go-eth2-client/spec/deneb" "github.com/attestantio/go-eth2-client/spec/phase0" ) @@ -39,6 +40,8 @@ type Block struct { ExecutionPayload *ExecutionPayload // Information only available from Capella onwards. BLSToExecutionChanges []*BLSToExecutionChange + // Information only available from Deneb onwards. + BlobKZGCommitments []deneb.KZGCommitment } // Validator holds information about a validator. @@ -298,7 +301,7 @@ type ExecutionPayload struct { // No transactions, they are stored in execd. Withdrawals []*Withdrawal BlobGasUsed uint64 - ExcessDataGas uint64 + ExcessBlobGas uint64 } // BLSToExecutionChange holds information about credentials change operations. @@ -321,3 +324,14 @@ type Withdrawal struct { Address [20]byte Amount phase0.Gwei } + +// BlobSidecar holds information about a blob sidecar for a block. +type BlobSidecar struct { + InclusionBlockRoot phase0.Root + InclusionSlot phase0.Slot + InclusionIndex deneb.BlobIndex + Blob deneb.Blob + KZGCommitment deneb.KZGCommitment + KZGProof deneb.KZGProof + KZGCommitmentInclusionProof deneb.KZGCommitmentInclusionProof +} diff --git a/services/chaintime/standard/service.go b/services/chaintime/standard/service.go index 3f14e50..b266705 100644 --- a/services/chaintime/standard/service.go +++ b/services/chaintime/standard/service.go @@ -1,4 +1,4 @@ -// Copyright © 2020, 2021 Weald Technology Trading. +// Copyright © 2020 2023 Weald Technology Trading. // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -110,7 +110,6 @@ func New(ctx context.Context, params ...Parameter) (*Service, error) { capellaForkEpoch = 0xffffffffffffffff } log.Trace().Uint64("epoch", uint64(capellaForkEpoch)).Msg("Obtained Capella fork epoch") - denebForkEpoch, err := fetchDenebForkEpoch(ctx, parameters.specProvider) if err != nil { // Set to far future epoch. diff --git a/services/eth1deposits/getlogs/logresponse.go b/services/eth1deposits/getlogs/logresponse.go index ec2bd96..e6d55cd 100644 --- a/services/eth1deposits/getlogs/logresponse.go +++ b/services/eth1deposits/getlogs/logresponse.go @@ -133,11 +133,11 @@ func (l *logResponse) MarshalJSON() ([]byte, error) { Address: fmt.Sprintf("%#x", l.Address), Topics: topics, Data: fmt.Sprintf("%#x", l.Data), - BlockNumber: fmt.Sprintf("%d", l.BlockNumber), + BlockNumber: strconv.FormatUint(l.BlockNumber, 10), TransactionHash: fmt.Sprintf("%#x", l.TransactionHash), - TransactionIndex: fmt.Sprintf("%d", l.TransactionIndex), + TransactionIndex: strconv.FormatUint(l.TransactionIndex, 10), BlockHash: fmt.Sprintf("%#x", l.BlockHash), - LogIndex: fmt.Sprintf("%d", l.LogIndex), + LogIndex: strconv.FormatUint(l.LogIndex, 10), Removed: l.Removed, }) } diff --git a/services/eth1deposits/getlogs/transactionreceipt.go b/services/eth1deposits/getlogs/transactionreceipt.go index 7c35076..ae8861b 100644 --- a/services/eth1deposits/getlogs/transactionreceipt.go +++ b/services/eth1deposits/getlogs/transactionreceipt.go @@ -111,7 +111,7 @@ func (t *transactionReceipt) UnmarshalJSON(input []byte) error { func (t *transactionReceipt) MarshalJSON() ([]byte, error) { return json.Marshal(&transactionReceiptJSON{ BlockHash: fmt.Sprintf("%#x", t.BlockHash), - BlockNumber: fmt.Sprintf("%d", t.BlockNumber), + BlockNumber: strconv.FormatUint(t.BlockNumber, 10), ContractAddress: fmt.Sprintf("%#x", t.ContractAddress), From: fmt.Sprintf("%#x", t.From), To: fmt.Sprintf("%#x", t.To), diff --git a/services/finalizer/standard/handler.go b/services/finalizer/standard/handler.go index c4e6add..9ac675a 100644 --- a/services/finalizer/standard/handler.go +++ b/services/finalizer/standard/handler.go @@ -222,11 +222,6 @@ func (s *Service) canonicalizeBlocks(ctx context.Context, root phase0.Root, limi return err } - if block == nil { - log.Error().Str("block_root", fmt.Sprintf("%#x", root)).Msg("Block not found for root") - return errors.New("block not found for root") - } - if limit != 0 && block.Slot == limit { break } diff --git a/services/finalizer/standard/service_test.go b/services/finalizer/standard/service_test.go index aeff194..a4f0f93 100644 --- a/services/finalizer/standard/service_test.go +++ b/services/finalizer/standard/service_test.go @@ -36,6 +36,11 @@ func TestService(t *testing.T) { ) require.NoError(t, err) + consensusClient, err := http.New(ctx, + http.WithAddress(os.Getenv("ETH2CLIENT_ADDRESS")), + ) + require.NoError(t, err) + chainTime, err := standardchaintime.New(ctx, standardchaintime.WithGenesisProvider(chainDB), standardchaintime.WithSpecProvider(chainDB), @@ -45,11 +50,6 @@ func TestService(t *testing.T) { blocks := mockblocks.New() - consensusClient, err := http.New(ctx, - http.WithAddress(os.Getenv("ETH2CLIENT_ADDRESS")), - ) - require.NoError(t, err) - tests := []struct { name string params []standard.Parameter diff --git a/services/summarizer/standard/handler.go b/services/summarizer/standard/handler.go index b7d091f..220a65c 100644 --- a/services/summarizer/standard/handler.go +++ b/services/summarizer/standard/handler.go @@ -52,17 +52,17 @@ func (s *Service) OnFinalityUpdated( log.Debug().Msg("Not summarizing on epoch 0") return } - summaryEpoch := finalizedEpoch - 1 + targetEpoch := finalizedEpoch - 1 - if err := s.summarizeEpochs(ctx, summaryEpoch); err != nil { + if err := s.summarizeEpochs(ctx, targetEpoch); err != nil { log.Warn().Err(err).Msg("Failed to update epochs; finished handling finality checkpoint") return } - if err := s.summarizeBlocks(ctx, summaryEpoch); err != nil { + if err := s.summarizeBlocks(ctx, targetEpoch); err != nil { log.Warn().Err(err).Msg("Failed to update blocks; finished handling finality checkpoint") return } - if err := s.summarizeValidators(ctx, summaryEpoch); err != nil { + if err := s.summarizeValidators(ctx, targetEpoch); err != nil { log.Warn().Err(err).Msg("Failed to update validators; finished handling finality checkpoint") return } @@ -78,7 +78,7 @@ func (s *Service) OnFinalityUpdated( return } - if err := s.prune(ctx, summaryEpoch); err != nil { + if err := s.prune(ctx, targetEpoch); err != nil { log.Warn().Err(err).Msg("Failed to prune summaries; finished handling finality checkpoint") return } @@ -88,10 +88,10 @@ func (s *Service) OnFinalityUpdated( log.Trace().Msg("Finished handling finality checkpoint") } -func (s *Service) summarizeEpochs(ctx context.Context, summaryEpoch phase0.Epoch) error { +func (s *Service) summarizeEpochs(ctx context.Context, targetEpoch phase0.Epoch) error { ctx, span := otel.Tracer("wealdtech.chaind.services.summarizer.standard").Start(ctx, "summarizeEpochs", trace.WithAttributes( - attribute.Int64("target epoch", int64(summaryEpoch)), + attribute.Int64("target epoch", int64(targetEpoch)), )) defer span.End() @@ -110,15 +110,11 @@ func (s *Service) summarizeEpochs(ctx context.Context, summaryEpoch phase0.Epoch } // Limit the number of epochs summarised per pass, if we are also pruning. - targetEpoch := summaryEpoch maxEpochsPerRun := phase0.Epoch(s.maxDaysPerRun) * s.epochsPerDay() - if s.validatorEpochRetention != nil && maxEpochsPerRun > 0 && summaryEpoch-firstEpoch > maxEpochsPerRun { + if s.validatorEpochRetention != nil && maxEpochsPerRun > 0 && targetEpoch-firstEpoch > maxEpochsPerRun { + log.Trace().Uint64("old_target_epoch", uint64(targetEpoch)).Uint64("new_target_epoch", uint64(firstEpoch+maxEpochsPerRun)).Msg("Reducing target epoch") targetEpoch = firstEpoch + maxEpochsPerRun - if targetEpoch > summaryEpoch { - targetEpoch = summaryEpoch - } } - log.Trace().Uint64("first_epoch", uint64(firstEpoch)).Uint64("target_epoch", uint64(targetEpoch)).Msg("Epochs catchup bounds") for epoch := firstEpoch; epoch <= targetEpoch; epoch++ { @@ -136,11 +132,11 @@ func (s *Service) summarizeEpochs(ctx context.Context, summaryEpoch phase0.Epoch } func (s *Service) summarizeBlocks(ctx context.Context, - summaryEpoch phase0.Epoch, + targetEpoch phase0.Epoch, ) error { ctx, span := otel.Tracer("wealdtech.chaind.services.summarizer.standard").Start(ctx, "summarizeBlocks", trace.WithAttributes( - attribute.Int64("target epoch", int64(summaryEpoch)), + attribute.Int64("target epoch", int64(targetEpoch)), )) defer span.End() @@ -153,12 +149,10 @@ func (s *Service) summarizeBlocks(ctx context.Context, return errors.Wrap(err, "failed to obtain metadata for block finality") } - targetEpoch := summaryEpoch firstEpoch := md.LastBlockEpoch if firstEpoch != 0 { firstEpoch++ } - log.Trace().Uint64("first_epoch", uint64(firstEpoch)).Uint64("target_epoch", uint64(targetEpoch)).Msg("Blocks catchup bounds") // The last epoch updated in the metadata tells us how far we can summarize, // as it checks for the component data. As such, if the finalized epoch @@ -168,6 +162,7 @@ func (s *Service) summarizeBlocks(ctx context.Context, if targetEpoch > md.LastEpoch && md.LastEpoch != 0 { targetEpoch = md.LastEpoch } + log.Trace().Uint64("first_epoch", uint64(firstEpoch)).Uint64("target_epoch", uint64(targetEpoch)).Msg("Blocks catchup bounds") for epoch := firstEpoch; epoch <= targetEpoch; epoch++ { if err := s.summarizeBlocksInEpoch(ctx, md, epoch); err != nil { @@ -178,10 +173,10 @@ func (s *Service) summarizeBlocks(ctx context.Context, return nil } -func (s *Service) summarizeValidators(ctx context.Context, summaryEpoch phase0.Epoch) error { +func (s *Service) summarizeValidators(ctx context.Context, targetEpoch phase0.Epoch) error { ctx, span := otel.Tracer("wealdtech.chaind.services.summarizer.standard").Start(ctx, "summarizeValidators", trace.WithAttributes( - attribute.Int64("target epoch", int64(summaryEpoch)), + attribute.Int64("target epoch", int64(targetEpoch)), )) defer span.End() @@ -194,32 +189,30 @@ func (s *Service) summarizeValidators(ctx context.Context, summaryEpoch phase0.E return errors.Wrap(err, "failed to obtain metadata for validator summarizer") } + firstEpoch := md.LastValidatorEpoch + if firstEpoch != 0 { + firstEpoch++ + } + // The last epoch updated in the metadata tells us how far we can summarize, // as it checks for the component data. As such, if the finalized epoch // is beyond our summarized epoch we truncate to the summarized value. // However, if we don't have validator balances the summarizer won't run at all // for epochs, so if the last epoch is 0 we continue. - if summaryEpoch > md.LastEpoch && md.LastEpoch != 0 { - summaryEpoch = md.LastEpoch - } - - firstEpoch := md.LastValidatorEpoch - if firstEpoch != 0 { - firstEpoch++ + if targetEpoch > md.LastEpoch && md.LastEpoch > 0 { + targetEpoch = md.LastEpoch } // Limit the number of epochs summarised per pass, if we are also pruning. maxEpochsPerRun := phase0.Epoch(s.maxDaysPerRun) * s.epochsPerDay() - targetEpoch := summaryEpoch - if s.validatorEpochRetention != nil && maxEpochsPerRun > 0 && targetEpoch-firstEpoch > maxEpochsPerRun { + if s.validatorEpochRetention != nil && maxEpochsPerRun > 0 && firstEpoch-targetEpoch > maxEpochsPerRun { + log.Trace().Uint64("first_epoch", uint64(firstEpoch)).Uint64("old_target_epoch", uint64(targetEpoch)).Uint64("new_target_epoch", uint64(firstEpoch+maxEpochsPerRun)).Msg("Reducing target epoch") targetEpoch = firstEpoch + maxEpochsPerRun - if targetEpoch > summaryEpoch { - targetEpoch = summaryEpoch - } } log.Trace().Uint64("first_epoch", uint64(firstEpoch)).Uint64("target_epoch", uint64(targetEpoch)).Msg("Validators catchup bounds") for epoch := firstEpoch; epoch <= targetEpoch; epoch++ { + log.Trace().Uint64("epoch", uint64(epoch)).Msg("Summarizing epoch") if err := s.summarizeValidatorsInEpoch(ctx, md, epoch); err != nil { return errors.Wrap(err, fmt.Sprintf("failed to update validator summaries in epoch %d", epoch)) } diff --git a/services/summarizer/standard/service.go b/services/summarizer/standard/service.go index 2813753..8a38b2d 100644 --- a/services/summarizer/standard/service.go +++ b/services/summarizer/standard/service.go @@ -201,10 +201,16 @@ func (s *Service) catchup(ctx context.Context) { } defer s.activitySem.Release(1) - finalityResponse, err := s.eth2Client.(eth2client.FinalityProvider).Finality(ctx, &api.FinalityOpts{State: "head"}) + response, err := s.eth2Client.(eth2client.FinalityProvider).Finality(ctx, &api.FinalityOpts{ + State: "head", + }) // If we receive an error it could be because the chain hasn't yet started. // Even if not, the handler will kick the process off again. - if err != nil || finalityResponse.Data.Finalized.Epoch <= 2 { + if err != nil { + return + } + finality := response.Data + if finality.Finalized.Epoch <= 2 { return } diff --git a/services/summarizer/standard/service_test.go b/services/summarizer/standard/service_test.go index 5d966ee..91d8b73 100644 --- a/services/summarizer/standard/service_test.go +++ b/services/summarizer/standard/service_test.go @@ -36,6 +36,11 @@ func TestService(t *testing.T) { ) require.NoError(t, err) + consensusClient, err := http.New(ctx, + http.WithAddress(os.Getenv("ETH2CLIENT_ADDRESS")), + ) + require.NoError(t, err) + chainTime, err := standardchaintime.New(ctx, standardchaintime.WithGenesisProvider(chainDB), standardchaintime.WithSpecProvider(chainDB), @@ -45,11 +50,6 @@ func TestService(t *testing.T) { blocks := mockblocks.New() - consensusClient, err := http.New(ctx, - http.WithAddress(os.Getenv("ETH2CLIENT_ADDRESS")), - ) - require.NoError(t, err) - tests := []struct { name string params []standard.Parameter