Compare commits

..

6 Commits

Author SHA1 Message Date
james-prysm
2c17c64e15 Merge branch 'develop' into gloas-ptc-api 2026-02-03 08:24:15 -08:00
james-prysm
a21cf5545a self review 2026-02-03 10:23:37 -06:00
james-prysm
241e93b137 changelog 2026-02-03 09:51:11 -06:00
james-prysm
0a843cf742 self review 2026-02-02 16:10:23 -06:00
james-prysm
a1506f5df4 replacing pool implementation with interface 2026-02-02 09:01:54 -06:00
james-prysm
768da3cbea wip 2026-01-30 14:34:09 -06:00
145 changed files with 2218 additions and 5964 deletions

View File

@@ -12,11 +12,11 @@ jobs:
- name: Check version consistency
run: |
WORKSPACE_VERSION=$(grep 'consensus_spec_version = ' WORKSPACE | sed 's/.*"\(.*\)"/\1/')
ETHSPECIFY_VERSION=$(grep '^version:' .ethspecify.yml | sed 's/version: //')
ETHSPECIFY_VERSION=$(grep '^version:' specrefs/.ethspecify.yml | sed 's/version: //')
if [ "$WORKSPACE_VERSION" != "$ETHSPECIFY_VERSION" ]; then
echo "Version mismatch between WORKSPACE and ethspecify"
echo " WORKSPACE: $WORKSPACE_VERSION"
echo " .ethspecify.yml: $ETHSPECIFY_VERSION"
echo " specrefs/.ethspecify.yml: $ETHSPECIFY_VERSION"
exit 1
else
echo "Versions match: $WORKSPACE_VERSION"
@@ -26,7 +26,7 @@ jobs:
run: python3 -mpip install ethspecify
- name: Update spec references
run: ethspecify
run: ethspecify process --path=specrefs
- name: Check for differences
run: |
@@ -40,4 +40,4 @@ jobs:
fi
- name: Check spec references
run: ethspecify check
run: ethspecify check --path=specrefs

View File

@@ -1,19 +0,0 @@
load("@prysm//tools/go:def.bzl", "go_library", "go_test")
go_library(
name = "go_default_library",
srcs = [
"fallback.go",
"log.go",
],
importpath = "github.com/OffchainLabs/prysm/v7/api/fallback",
visibility = ["//visibility:public"],
deps = ["@com_github_sirupsen_logrus//:go_default_library"],
)
go_test(
name = "go_default_test",
srcs = ["fallback_test.go"],
embed = [":go_default_library"],
deps = ["//testing/assert:go_default_library"],
)

View File

@@ -1,66 +0,0 @@
package fallback
import (
"context"
"github.com/sirupsen/logrus"
)
// HostProvider is the subset of connection-provider methods that EnsureReady
// needs. Both grpc.GrpcConnectionProvider and rest.RestConnectionProvider
// satisfy this interface.
type HostProvider interface {
Hosts() []string
CurrentHost() string
SwitchHost(index int) error
}
// ReadyChecker can report whether the current endpoint is ready.
// iface.NodeClient satisfies this implicitly.
type ReadyChecker interface {
IsReady(ctx context.Context) bool
}
// EnsureReady iterates through the configured hosts and returns true as soon as
// one responds as ready. It starts from the provider's current host and wraps
// around using modular arithmetic, performing failover when a host is not ready.
func EnsureReady(ctx context.Context, provider HostProvider, checker ReadyChecker) bool {
hosts := provider.Hosts()
numHosts := len(hosts)
startingHost := provider.CurrentHost()
var attemptedHosts []string
// Find current index
currentIdx := 0
for i, h := range hosts {
if h == startingHost {
currentIdx = i
break
}
}
for i := range numHosts {
if checker.IsReady(ctx) {
if len(attemptedHosts) > 0 {
log.WithFields(logrus.Fields{
"previous": startingHost,
"current": provider.CurrentHost(),
"tried": attemptedHosts,
}).Info("Switched to responsive beacon node")
}
return true
}
attemptedHosts = append(attemptedHosts, provider.CurrentHost())
// Try next host if not the last iteration
if i < numHosts-1 {
nextIdx := (currentIdx + i + 1) % numHosts
if err := provider.SwitchHost(nextIdx); err != nil {
log.WithError(err).Error("Failed to switch host")
}
}
}
log.WithField("tried", attemptedHosts).Warn("No responsive beacon node found")
return false
}

View File

@@ -1,94 +0,0 @@
package fallback
import (
"context"
"testing"
"github.com/OffchainLabs/prysm/v7/testing/assert"
)
// mockHostProvider is a minimal HostProvider for unit tests.
type mockHostProvider struct {
hosts []string
hostIndex int
}
func (m *mockHostProvider) Hosts() []string { return m.hosts }
func (m *mockHostProvider) CurrentHost() string {
return m.hosts[m.hostIndex%len(m.hosts)]
}
func (m *mockHostProvider) SwitchHost(index int) error { m.hostIndex = index; return nil }
// mockReadyChecker records per-call IsReady results in sequence.
type mockReadyChecker struct {
results []bool
idx int
}
func (m *mockReadyChecker) IsReady(_ context.Context) bool {
if m.idx >= len(m.results) {
return false
}
r := m.results[m.idx]
m.idx++
return r
}
func TestEnsureReady_SingleHostReady(t *testing.T) {
provider := &mockHostProvider{hosts: []string{"http://host1:3500"}, hostIndex: 0}
checker := &mockReadyChecker{results: []bool{true}}
assert.Equal(t, true, EnsureReady(t.Context(), provider, checker))
assert.Equal(t, 0, provider.hostIndex)
}
func TestEnsureReady_SingleHostNotReady(t *testing.T) {
provider := &mockHostProvider{hosts: []string{"http://host1:3500"}, hostIndex: 0}
checker := &mockReadyChecker{results: []bool{false}}
assert.Equal(t, false, EnsureReady(t.Context(), provider, checker))
}
func TestEnsureReady_SingleHostError(t *testing.T) {
provider := &mockHostProvider{hosts: []string{"http://host1:3500"}, hostIndex: 0}
checker := &mockReadyChecker{results: []bool{false}}
assert.Equal(t, false, EnsureReady(t.Context(), provider, checker))
}
func TestEnsureReady_MultipleHostsFirstReady(t *testing.T) {
provider := &mockHostProvider{
hosts: []string{"http://host1:3500", "http://host2:3500"},
hostIndex: 0,
}
checker := &mockReadyChecker{results: []bool{true}}
assert.Equal(t, true, EnsureReady(t.Context(), provider, checker))
assert.Equal(t, 0, provider.hostIndex)
}
func TestEnsureReady_MultipleHostsFailoverToSecond(t *testing.T) {
provider := &mockHostProvider{
hosts: []string{"http://host1:3500", "http://host2:3500"},
hostIndex: 0,
}
checker := &mockReadyChecker{results: []bool{false, true}}
assert.Equal(t, true, EnsureReady(t.Context(), provider, checker))
assert.Equal(t, 1, provider.hostIndex)
}
func TestEnsureReady_MultipleHostsNoneReady(t *testing.T) {
provider := &mockHostProvider{
hosts: []string{"http://host1:3500", "http://host2:3500", "http://host3:3500"},
hostIndex: 0,
}
checker := &mockReadyChecker{results: []bool{false, false, false}}
assert.Equal(t, false, EnsureReady(t.Context(), provider, checker))
}
func TestEnsureReady_WrapAroundFromNonZeroIndex(t *testing.T) {
provider := &mockHostProvider{
hosts: []string{"http://host0:3500", "http://host1:3500", "http://host2:3500"},
hostIndex: 1,
}
// host1 (start) fails, host2 fails, host0 succeeds
checker := &mockReadyChecker{results: []bool{false, false, true}}
assert.Equal(t, true, EnsureReady(t.Context(), provider, checker))
assert.Equal(t, 0, provider.hostIndex)
}

View File

@@ -1,9 +0,0 @@
// Code generated by hack/gen-logs.sh; DO NOT EDIT.
// This file is created and regenerated automatically. Anything added here might get removed.
package fallback
import "github.com/sirupsen/logrus"
// The prefix for logs from this package will be the text after the last slash in the package path.
// If you wish to change this, you should add your desired name in the runtime/logging/logrus-prefixed-formatter/prefix-replacement.go file.
var log = logrus.WithField("package", "api/fallback")

View File

@@ -25,11 +25,6 @@ type GrpcConnectionProvider interface {
// SwitchHost switches to the endpoint at the given index.
// The new connection is created lazily on next CurrentConn() call.
SwitchHost(index int) error
// ConnectionCounter returns a monotonically increasing counter that increments
// each time SwitchHost changes the active endpoint. This allows consumers to
// detect connection changes even when the host string returns to a previous value
// (e.g., host0 → host1 → host0).
ConnectionCounter() uint64
// Close closes the current connection.
Close()
}
@@ -43,7 +38,6 @@ type grpcConnectionProvider struct {
// Current connection state (protected by mutex)
currentIndex uint64
conn *grpc.ClientConn
connCounter uint64
mu sync.Mutex
closed bool
@@ -144,7 +138,6 @@ func (p *grpcConnectionProvider) SwitchHost(index int) error {
p.conn = nil // Clear immediately - new connection created lazily
p.currentIndex = uint64(index)
p.connCounter++
// Close old connection asynchronously to avoid blocking the caller
if oldConn != nil {
@@ -162,12 +155,6 @@ func (p *grpcConnectionProvider) SwitchHost(index int) error {
return nil
}
func (p *grpcConnectionProvider) ConnectionCounter() uint64 {
p.mu.Lock()
defer p.mu.Unlock()
return p.connCounter
}
func (p *grpcConnectionProvider) Close() {
p.mu.Lock()
defer p.mu.Unlock()

View File

@@ -4,24 +4,17 @@ import "google.golang.org/grpc"
// MockGrpcProvider implements GrpcConnectionProvider for testing.
type MockGrpcProvider struct {
MockConn *grpc.ClientConn
MockHosts []string
CurrentIndex int
ConnCounter uint64
MockConn *grpc.ClientConn
MockHosts []string
}
func (m *MockGrpcProvider) CurrentConn() *grpc.ClientConn { return m.MockConn }
func (m *MockGrpcProvider) CurrentHost() string {
if len(m.MockHosts) > 0 {
return m.MockHosts[m.CurrentIndex]
return m.MockHosts[0]
}
return ""
}
func (m *MockGrpcProvider) Hosts() []string { return m.MockHosts }
func (m *MockGrpcProvider) SwitchHost(idx int) error {
m.CurrentIndex = idx
m.ConnCounter++
return nil
}
func (m *MockGrpcProvider) ConnectionCounter() uint64 { return m.ConnCounter }
func (m *MockGrpcProvider) Close() {}
func (m *MockGrpcProvider) Hosts() []string { return m.MockHosts }
func (m *MockGrpcProvider) SwitchHost(int) error { return nil }
func (m *MockGrpcProvider) Close() {}

View File

@@ -9,13 +9,13 @@ import (
// MockRestProvider implements RestConnectionProvider for testing.
type MockRestProvider struct {
MockClient *http.Client
MockHandler Handler
MockHandler RestHandler
MockHosts []string
HostIndex int
}
func (m *MockRestProvider) HttpClient() *http.Client { return m.MockClient }
func (m *MockRestProvider) Handler() Handler { return m.MockHandler }
func (m *MockRestProvider) RestHandler() RestHandler { return m.MockHandler }
func (m *MockRestProvider) CurrentHost() string {
if len(m.MockHosts) > 0 {
return m.MockHosts[m.HostIndex%len(m.MockHosts)]
@@ -25,22 +25,25 @@ func (m *MockRestProvider) CurrentHost() string {
func (m *MockRestProvider) Hosts() []string { return m.MockHosts }
func (m *MockRestProvider) SwitchHost(index int) error { m.HostIndex = index; return nil }
// MockHandler implements Handler for testing.
type MockHandler struct {
MockHost string
// MockRestHandler implements RestHandler for testing.
type MockRestHandler struct {
MockHost string
MockClient *http.Client
}
func (m *MockHandler) Get(_ context.Context, _ string, _ any) error { return nil }
func (m *MockHandler) GetStatusCode(_ context.Context, _ string) (int, error) {
func (m *MockRestHandler) Get(_ context.Context, _ string, _ any) error { return nil }
func (m *MockRestHandler) GetStatusCode(_ context.Context, _ string) (int, error) {
return http.StatusOK, nil
}
func (m *MockHandler) GetSSZ(_ context.Context, _ string) ([]byte, http.Header, error) {
func (m *MockRestHandler) GetSSZ(_ context.Context, _ string) ([]byte, http.Header, error) {
return nil, nil, nil
}
func (m *MockHandler) Post(_ context.Context, _ string, _ map[string]string, _ *bytes.Buffer, _ any) error {
func (m *MockRestHandler) Post(_ context.Context, _ string, _ map[string]string, _ *bytes.Buffer, _ any) error {
return nil
}
func (m *MockHandler) PostSSZ(_ context.Context, _ string, _ map[string]string, _ *bytes.Buffer) ([]byte, http.Header, error) {
func (m *MockRestHandler) PostSSZ(_ context.Context, _ string, _ map[string]string, _ *bytes.Buffer) ([]byte, http.Header, error) {
return nil, nil, nil
}
func (m *MockHandler) Host() string { return m.MockHost }
func (m *MockRestHandler) HttpClient() *http.Client { return m.MockClient }
func (m *MockRestHandler) Host() string { return m.MockHost }
func (m *MockRestHandler) SwitchHost(host string) { m.MockHost = host }

View File

@@ -17,8 +17,8 @@ import (
type RestConnectionProvider interface {
// HttpClient returns the configured HTTP client with headers, timeout, and optional tracing.
HttpClient() *http.Client
// Handler returns the REST handler for making API requests.
Handler() Handler
// RestHandler returns the REST handler for making API requests.
RestHandler() RestHandler
// CurrentHost returns the current REST API endpoint URL.
CurrentHost() string
// Hosts returns all configured REST API endpoint URLs.
@@ -54,7 +54,7 @@ func WithTracing() RestConnectionProviderOption {
type restConnectionProvider struct {
endpoints []string
httpClient *http.Client
restHandler *handler
restHandler RestHandler
currentIndex atomic.Uint64
timeout time.Duration
headers map[string][]string
@@ -96,7 +96,7 @@ func NewRestConnectionProvider(endpoint string, opts ...RestConnectionProviderOp
}
// Create the REST handler with the HTTP client and initial host
p.restHandler = newHandler(*p.httpClient, endpoints[0])
p.restHandler = newRestHandler(*p.httpClient, endpoints[0])
log.WithFields(logrus.Fields{
"endpoints": endpoints,
@@ -124,7 +124,7 @@ func (p *restConnectionProvider) HttpClient() *http.Client {
return p.httpClient
}
func (p *restConnectionProvider) Handler() Handler {
func (p *restConnectionProvider) RestHandler() RestHandler {
return p.restHandler
}

View File

@@ -21,35 +21,32 @@ import (
type reqOption func(*http.Request)
// Handler defines the interface for making REST API requests.
type Handler interface {
// RestHandler defines the interface for making REST API requests.
type RestHandler interface {
Get(ctx context.Context, endpoint string, resp any) error
GetStatusCode(ctx context.Context, endpoint string) (int, error)
GetSSZ(ctx context.Context, endpoint string) ([]byte, http.Header, error)
Post(ctx context.Context, endpoint string, headers map[string]string, data *bytes.Buffer, resp any) error
PostSSZ(ctx context.Context, endpoint string, headers map[string]string, data *bytes.Buffer) ([]byte, http.Header, error)
HttpClient() *http.Client
Host() string
SwitchHost(host string)
}
type handler struct {
type restHandler struct {
client http.Client
host string
reqOverrides []reqOption
}
// newHandler returns a *handler for internal use within the rest package.
func newHandler(client http.Client, host string) *handler {
rh := &handler{
client: client,
host: host,
}
rh.appendAcceptOverride()
return rh
// newRestHandler returns a RestHandler (internal use)
func newRestHandler(client http.Client, host string) RestHandler {
return NewRestHandler(client, host)
}
// NewHandler returns a Handler
func NewHandler(client http.Client, host string) Handler {
rh := &handler{
// NewRestHandler returns a RestHandler
func NewRestHandler(client http.Client, host string) RestHandler {
rh := &restHandler{
client: client,
host: host,
}
@@ -60,7 +57,7 @@ func NewHandler(client http.Client, host string) Handler {
// appendAcceptOverride enables the Accept header to be customized at runtime via an environment variable.
// This is specified as an env var because it is a niche option that prysm may use for performance testing or debugging
// bug which users are unlikely to need. Using an env var keeps the set of user-facing flags cleaner.
func (c *handler) appendAcceptOverride() {
func (c *restHandler) appendAcceptOverride() {
if accept := os.Getenv(params.EnvNameOverrideAccept); accept != "" {
c.reqOverrides = append(c.reqOverrides, func(req *http.Request) {
req.Header.Set("Accept", accept)
@@ -69,18 +66,18 @@ func (c *handler) appendAcceptOverride() {
}
// HttpClient returns the underlying HTTP client of the handler
func (c *handler) HttpClient() *http.Client {
func (c *restHandler) HttpClient() *http.Client {
return &c.client
}
// Host returns the underlying HTTP host
func (c *handler) Host() string {
func (c *restHandler) Host() string {
return c.host
}
// Get sends a GET request and decodes the response body as a JSON object into the passed in object.
// If an HTTP error is returned, the body is decoded as a DefaultJsonError JSON object and returned as the first return value.
func (c *handler) Get(ctx context.Context, endpoint string, resp any) error {
func (c *restHandler) Get(ctx context.Context, endpoint string, resp any) error {
url := c.host + endpoint
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil {
@@ -103,7 +100,7 @@ func (c *handler) Get(ctx context.Context, endpoint string, resp any) error {
// GetStatusCode sends a GET request and returns only the HTTP status code.
// This is useful for endpoints like /eth/v1/node/health that communicate status via HTTP codes
// (200 = ready, 206 = syncing, 503 = unavailable) rather than response bodies.
func (c *handler) GetStatusCode(ctx context.Context, endpoint string) (int, error) {
func (c *restHandler) GetStatusCode(ctx context.Context, endpoint string) (int, error) {
url := c.host + endpoint
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil {
@@ -122,7 +119,7 @@ func (c *handler) GetStatusCode(ctx context.Context, endpoint string) (int, erro
return httpResp.StatusCode, nil
}
func (c *handler) GetSSZ(ctx context.Context, endpoint string) ([]byte, http.Header, error) {
func (c *restHandler) GetSSZ(ctx context.Context, endpoint string) ([]byte, http.Header, error) {
url := c.host + endpoint
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil {
@@ -177,7 +174,7 @@ func (c *handler) GetSSZ(ctx context.Context, endpoint string) ([]byte, http.Hea
// Post sends a POST request and decodes the response body as a JSON object into the passed in object.
// If an HTTP error is returned, the body is decoded as a DefaultJsonError JSON object and returned as the first return value.
func (c *handler) Post(
func (c *restHandler) Post(
ctx context.Context,
apiEndpoint string,
headers map[string]string,
@@ -213,7 +210,7 @@ func (c *handler) Post(
}
// PostSSZ sends a POST request and prefers an SSZ (application/octet-stream) response body.
func (c *handler) PostSSZ(
func (c *restHandler) PostSSZ(
ctx context.Context,
apiEndpoint string,
headers map[string]string,
@@ -314,6 +311,6 @@ func decodeResp(httpResp *http.Response, resp any) error {
return nil
}
func (c *handler) SwitchHost(host string) {
func (c *restHandler) SwitchHost(host string) {
c.host = host
}

View File

@@ -540,6 +540,12 @@ type PayloadAttestation struct {
Signature string `json:"signature"`
}
type PayloadAttestationMessage struct {
ValidatorIndex string `json:"validator_index"`
Data *PayloadAttestationData `json:"data"`
Signature string `json:"signature"`
}
type BeaconBlockBodyGloas struct {
RandaoReveal string `json:"randao_reveal"`
Eth1Data *Eth1Data `json:"eth1_data"`

View File

@@ -3263,3 +3263,34 @@ func (d *PayloadAttestationData) ToConsensus() (*eth.PayloadAttestationData, err
BlobDataAvailable: d.BlobDataAvailable,
}, nil
}
func PayloadAttestationMessageFromConsensus(msg *eth.PayloadAttestationMessage) *PayloadAttestationMessage {
return &PayloadAttestationMessage{
ValidatorIndex: fmt.Sprintf("%d", msg.ValidatorIndex),
Data: PayloadAttestationDataFromConsensus(msg.Data),
Signature: hexutil.Encode(msg.Signature),
}
}
func (p *PayloadAttestationMessage) ToConsensus() (*eth.PayloadAttestationMessage, error) {
if p == nil {
return nil, errNilValue
}
validatorIndex, err := strconv.ParseUint(p.ValidatorIndex, 10, 64)
if err != nil {
return nil, server.NewDecodeError(err, "ValidatorIndex")
}
data, err := p.Data.ToConsensus()
if err != nil {
return nil, server.NewDecodeError(err, "Data")
}
sig, err := bytesutil.DecodeHexWithLength(p.Signature, fieldparams.BLSSignatureLength)
if err != nil {
return nil, server.NewDecodeError(err, "Signature")
}
return &eth.PayloadAttestationMessage{
ValidatorIndex: primitives.ValidatorIndex(validatorIndex),
Data: data,
Signature: sig,
}, nil
}

View File

@@ -188,6 +188,11 @@ type BLSToExecutionChangesPoolResponse struct {
Data []*SignedBLSToExecutionChange `json:"data"`
}
type GetPoolPayloadAttestationsResponse struct {
Version string `json:"version"`
Data []*PayloadAttestation `json:"data"`
}
type GetAttesterSlashingsResponse struct {
Version string `json:"version,omitempty"`
Data json.RawMessage `json:"data"` // Accepts both `[]*AttesterSlashing` and `[]*AttesterSlashingElectra` types

View File

@@ -31,6 +31,11 @@ type GetAttestationDataResponse struct {
Data *AttestationData `json:"data"`
}
type GetPayloadAttestationDataResponse struct {
Version string `json:"version"`
Data *PayloadAttestationData `json:"data"`
}
type ProduceSyncCommitteeContributionResponse struct {
Data *SyncCommitteeContribution `json:"data"`
}

View File

@@ -27,7 +27,6 @@ go_library(
"receive_blob.go",
"receive_block.go",
"receive_data_column.go",
"receive_payload_attestation_message.go",
"service.go",
"setup_forkchoice.go",
"tracked_proposer.go",

View File

@@ -1,19 +0,0 @@
package blockchain
import (
"context"
ethpb "github.com/OffchainLabs/prysm/v7/proto/prysm/v1alpha1"
)
// PayloadAttestationReceiver interface defines the methods of chain service for receiving
// validated payload attestation messages.
type PayloadAttestationReceiver interface {
ReceivePayloadAttestationMessage(context.Context, *ethpb.PayloadAttestationMessage) error
}
// ReceivePayloadAttestationMessage accepts a payload attestation message.
// TODO: implement actual processing; for now this is a stub for sync integration.
func (s *Service) ReceivePayloadAttestationMessage(ctx context.Context, a *ethpb.PayloadAttestationMessage) error {
return nil
}

View File

@@ -757,11 +757,6 @@ func (c *ChainService) ReceiveDataColumns(dcs []blocks.VerifiedRODataColumn) err
return nil
}
// ReceivePayloadAttestationMessage implements the same method in the chain service.
func (c *ChainService) ReceivePayloadAttestationMessage(_ context.Context, _ *ethpb.PayloadAttestationMessage) error {
return nil
}
// DependentRootForEpoch mocks the same method in the chain service
func (c *ChainService) DependentRootForEpoch(_ [32]byte, _ primitives.Epoch) ([32]byte, error) {
return c.TargetRoot, nil

View File

@@ -17,7 +17,6 @@ go_library(
"error.go",
"interfaces.go",
"log.go",
"payload_attestation.go",
"payload_id.go",
"proposer_indices.go",
"proposer_indices_disabled.go", # keep

View File

@@ -1,62 +0,0 @@
package cache
import (
"errors"
"sync"
"github.com/OffchainLabs/prysm/v7/encoding/bytesutil"
eth "github.com/OffchainLabs/prysm/v7/proto/prysm/v1alpha1"
)
var errNilPayloadAttestationMessage = errors.New("nil Payload Attestation Message")
// PayloadAttestationCache tracks seen payload attestation messages for a single block root.
type PayloadAttestationCache struct {
root [32]byte
seen map[uint64]struct{}
sync.Mutex
}
// Seen returns true if a vote for the given beacon block root has already been
// processed for this validator index.
func (p *PayloadAttestationCache) Seen(root [32]byte, idx uint64) bool {
p.Lock()
defer p.Unlock()
if p.root != root {
return false
}
if p.seen == nil {
return false
}
_, ok := p.seen[idx]
return ok
}
// Add marks the given payload attestation message as seen for this validator index.
// This function assumes that the message has already been validated.
func (p *PayloadAttestationCache) Add(att *eth.PayloadAttestationMessage, idx uint64) error {
if att == nil || att.Data == nil || len(att.Data.BeaconBlockRoot) == 0 {
return errNilPayloadAttestationMessage
}
root := bytesutil.ToBytes32(att.Data.BeaconBlockRoot)
p.Lock()
defer p.Unlock()
if p.root != root {
p.root = root
p.seen = make(map[uint64]struct{})
}
if p.seen == nil {
p.seen = make(map[uint64]struct{})
}
p.seen[idx] = struct{}{}
return nil
}
// Clear clears the internal cache.
func (p *PayloadAttestationCache) Clear() {
p.Lock()
defer p.Unlock()
p.root = [32]byte{}
p.seen = nil
}

View File

@@ -17,50 +17,27 @@ import (
)
// ProcessExecutionPayloadBid processes a signed execution payload bid in the Gloas fork.
// Spec v1.7.0-alpha.0 (pseudocode):
// process_execution_payload_bid(state: BeaconState, block: BeaconBlock):
//
// <spec fn="process_execution_payload_bid" fork="gloas" hash="6dc696bb">
// def process_execution_payload_bid(state: BeaconState, block: BeaconBlock) -> None:
// signed_bid = block.body.signed_execution_payload_bid
// bid = signed_bid.message
// builder_index = bid.builder_index
// amount = bid.value
//
// # For self-builds, amount must be zero regardless of withdrawal credential prefix
// if builder_index == BUILDER_INDEX_SELF_BUILD:
// assert amount == 0
// assert signed_bid.signature == bls.G2_POINT_AT_INFINITY
// else:
// # Verify that the builder is active
// assert is_active_builder(state, builder_index)
// # Verify that the builder has funds to cover the bid
// assert can_builder_cover_bid(state, builder_index, amount)
// # Verify that the bid signature is valid
// assert verify_execution_payload_bid_signature(state, signed_bid)
//
// # Verify that the bid is for the current slot
// assert bid.slot == block.slot
// # Verify that the bid is for the right parent block
// assert bid.parent_block_hash == state.latest_block_hash
// assert bid.parent_block_root == block.parent_root
// assert bid.prev_randao == get_randao_mix(state, get_current_epoch(state))
//
// # Record the pending payment if there is some payment
// if amount > 0:
// pending_payment = BuilderPendingPayment(
// weight=0,
// withdrawal=BuilderPendingWithdrawal(
// fee_recipient=bid.fee_recipient,
// amount=amount,
// builder_index=builder_index,
// ),
// )
// state.builder_pending_payments[SLOTS_PER_EPOCH + bid.slot % SLOTS_PER_EPOCH] = (
// pending_payment
// )
//
// # Cache the signed execution payload bid
// state.latest_execution_payload_bid = bid
// </spec>
// signed_bid = block.body.signed_execution_payload_bid
// bid = signed_bid.message
// builder_index = bid.builder_index
// amount = bid.value
// if builder_index == BUILDER_INDEX_SELF_BUILD:
// assert amount == 0
// assert signed_bid.signature == G2_POINT_AT_INFINITY
// else:
// assert is_active_builder(state, builder_index)
// assert can_builder_cover_bid(state, builder_index, amount)
// assert verify_execution_payload_bid_signature(state, signed_bid)
// assert bid.slot == block.slot
// assert bid.parent_block_hash == state.latest_block_hash
// assert bid.parent_block_root == block.parent_root
// assert bid.prev_randao == get_randao_mix(state, get_current_epoch(state))
// if amount > 0:
// state.builder_pending_payments[...] = BuilderPendingPayment(weight=0, withdrawal=BuilderPendingWithdrawal(fee_recipient=bid.fee_recipient, amount=amount, builder_index=builder_index))
// state.latest_execution_payload_bid = bid
func ProcessExecutionPayloadBid(st state.BeaconState, block interfaces.ReadOnlyBeaconBlock) error {
signedBid, err := block.Body().SignedExecutionPayloadBid()
if err != nil {

View File

@@ -24,21 +24,14 @@ import (
)
// ProcessPayloadAttestations validates payload attestations in a block body.
// Spec v1.7.0-alpha.0 (pseudocode):
// process_payload_attestation(state: BeaconState, payload_attestation: PayloadAttestation):
//
// <spec fn="process_payload_attestation" fork="gloas" hash="f46bf0b0">
// def process_payload_attestation(
// state: BeaconState, payload_attestation: PayloadAttestation
// ) -> None:
// data = payload_attestation.data
//
// # Check that the attestation is for the parent beacon block
// assert data.beacon_block_root == state.latest_block_header.parent_root
// # Check that the attestation is for the previous slot
// assert data.slot + 1 == state.slot
// # Verify signature
// indexed_payload_attestation = get_indexed_payload_attestation(state, payload_attestation)
// assert is_valid_indexed_payload_attestation(state, indexed_payload_attestation)
// </spec>
// data = payload_attestation.data
// assert data.beacon_block_root == state.latest_block_header.parent_root
// assert data.slot + 1 == state.slot
// indexed = get_indexed_payload_attestation(state, data.slot, payload_attestation)
// assert is_valid_indexed_payload_attestation(state, indexed)
func ProcessPayloadAttestations(ctx context.Context, st state.BeaconState, body interfaces.ReadOnlyBeaconBlockBody) error {
atts, err := body.PayloadAttestations()
if err != nil {
@@ -97,24 +90,17 @@ func indexedPayloadAttestation(ctx context.Context, st state.ReadOnlyBeaconState
}
// payloadCommittee returns the payload timeliness committee for a given slot for the state.
// Spec v1.7.0-alpha.0 (pseudocode):
// get_ptc(state: BeaconState, slot: Slot) -> Vector[ValidatorIndex, PTC_SIZE]:
//
// <spec fn="get_ptc" fork="gloas" hash="ae15f761">
// def get_ptc(state: BeaconState, slot: Slot) -> Vector[ValidatorIndex, PTC_SIZE]:
// """
// Get the payload timeliness committee for the given ``slot``.
// """
// epoch = compute_epoch_at_slot(slot)
// seed = hash(get_seed(state, epoch, DOMAIN_PTC_ATTESTER) + uint_to_bytes(slot))
// indices: List[ValidatorIndex] = []
// # Concatenate all committees for this slot in order
// committees_per_slot = get_committee_count_per_slot(state, epoch)
// for i in range(committees_per_slot):
// committee = get_beacon_committee(state, slot, CommitteeIndex(i))
// indices.extend(committee)
// return compute_balance_weighted_selection(
// state, indices, seed, size=PTC_SIZE, shuffle_indices=False
// )
// </spec>
// epoch = compute_epoch_at_slot(slot)
// seed = hash(get_seed(state, epoch, DOMAIN_PTC_ATTESTER) + uint_to_bytes(slot))
// indices = []
// committees_per_slot = get_committee_count_per_slot(state, epoch)
// for i in range(committees_per_slot):
// committee = get_beacon_committee(state, slot, CommitteeIndex(i))
// indices.extend(committee)
// return compute_balance_weighted_selection(state, indices, seed, size=PTC_SIZE, shuffle_indices=False)
func payloadCommittee(ctx context.Context, st state.ReadOnlyBeaconState, slot primitives.Slot) ([]primitives.ValidatorIndex, error) {
epoch := slots.ToEpoch(slot)
seed, err := ptcSeed(st, epoch, slot)
@@ -156,11 +142,6 @@ func payloadCommittee(ctx context.Context, st state.ReadOnlyBeaconState, slot pr
return selected, nil
}
// PayloadTimelinessCommittee returns the payload timeliness committee for a given slot.
func PayloadTimelinessCommittee(ctx context.Context, st state.ReadOnlyBeaconState, slot primitives.Slot) ([]primitives.ValidatorIndex, error) {
return payloadCommittee(ctx, st, slot)
}
// ptcSeed computes the seed for the payload timeliness committee.
func ptcSeed(st state.ReadOnlyBeaconState, epoch primitives.Epoch, slot primitives.Slot) ([32]byte, error) {
seed, err := helpers.Seed(st, epoch, params.BeaconConfig().DomainPTCAttester)
@@ -171,35 +152,17 @@ func ptcSeed(st state.ReadOnlyBeaconState, epoch primitives.Epoch, slot primitiv
}
// selectByBalance selects a balance-weighted subset of input candidates.
// Spec v1.7.0-alpha.0 (pseudocode):
// compute_balance_weighted_selection(state, indices, seed, size, shuffle_indices):
// Note: shuffle_indices is false for PTC.
//
// <spec fn="compute_balance_weighted_selection" fork="gloas" hash="2c9f1c23">
// def compute_balance_weighted_selection(
// state: BeaconState,
// indices: Sequence[ValidatorIndex],
// seed: Bytes32,
// size: uint64,
// shuffle_indices: bool,
// ) -> Sequence[ValidatorIndex]:
// """
// Return ``size`` indices sampled by effective balance, using ``indices``
// as candidates. If ``shuffle_indices`` is ``True``, candidate indices
// are themselves sampled from ``indices`` by shuffling it, otherwise
// ``indices`` is traversed in order.
// """
// total = uint64(len(indices))
// assert total > 0
// selected: List[ValidatorIndex] = []
// i = uint64(0)
// while len(selected) < size:
// next_index = i % total
// if shuffle_indices:
// next_index = compute_shuffled_index(next_index, total, seed)
// candidate_index = indices[next_index]
// if compute_balance_weighted_acceptance(state, candidate_index, seed, i):
// selected.append(candidate_index)
// i += 1
// return selected
// </spec>
// total = len(indices); selected = []; i = 0
// while len(selected) < size:
// next = i % total
// if shuffle_indices: next = compute_shuffled_index(next, total, seed)
// if compute_balance_weighted_acceptance(state, indices[next], seed, i):
// selected.append(indices[next])
// i += 1
func selectByBalanceFill(
ctx context.Context,
st state.ReadOnlyBeaconState,
@@ -236,22 +199,15 @@ func selectByBalanceFill(
}
// acceptByBalance determines if a validator is accepted based on its effective balance.
// Spec v1.7.0-alpha.0 (pseudocode):
// compute_balance_weighted_acceptance(state, index, seed, i):
//
// <spec fn="compute_balance_weighted_acceptance" fork="gloas" hash="9954dcd0">
// def compute_balance_weighted_acceptance(
// state: BeaconState, index: ValidatorIndex, seed: Bytes32, i: uint64
// ) -> bool:
// """
// Return whether to accept the selection of the validator ``index``, with probability
// proportional to its ``effective_balance``, and randomness given by ``seed`` and ``i``.
// """
// MAX_RANDOM_VALUE = 2**16 - 1
// random_bytes = hash(seed + uint_to_bytes(i // 16))
// offset = i % 16 * 2
// random_value = bytes_to_uint64(random_bytes[offset : offset + 2])
// effective_balance = state.validators[index].effective_balance
// return effective_balance * MAX_RANDOM_VALUE >= MAX_EFFECTIVE_BALANCE_ELECTRA * random_value
// </spec>
// MAX_RANDOM_VALUE = 2**16 - 1
// random_bytes = hash(seed + uint_to_bytes(i // 16))
// offset = i % 16 * 2
// random_value = bytes_to_uint64(random_bytes[offset:offset+2])
// effective_balance = state.validators[index].effective_balance
// return effective_balance * MAX_RANDOM_VALUE >= MAX_EFFECTIVE_BALANCE_ELECTRA * random_value
func acceptByBalance(st state.ReadOnlyBeaconState, idx primitives.ValidatorIndex, seedBuf []byte, hashFunc func([]byte) [32]byte, maxBalance uint64, round uint64) (bool, error) {
// Reuse the seed buffer by overwriting the last 8 bytes with the round counter.
binary.LittleEndian.PutUint64(seedBuf[len(seedBuf)-8:], round/16)
@@ -268,26 +224,16 @@ func acceptByBalance(st state.ReadOnlyBeaconState, idx primitives.ValidatorIndex
}
// validIndexedPayloadAttestation verifies the signature of an indexed payload attestation.
// Spec v1.7.0-alpha.0 (pseudocode):
// is_valid_indexed_payload_attestation(state: BeaconState, indexed_payload_attestation: IndexedPayloadAttestation) -> bool:
//
// <spec fn="is_valid_indexed_payload_attestation" fork="gloas" hash="cf1e65b5">
// def is_valid_indexed_payload_attestation(
// state: BeaconState, indexed_payload_attestation: IndexedPayloadAttestation
// ) -> bool:
// """
// Check if ``indexed_payload_attestation`` is non-empty, has sorted indices, and has
// a valid aggregate signature.
// """
// # Verify indices are non-empty and sorted
// indices = indexed_payload_attestation.attesting_indices
// if len(indices) == 0 or not indices == sorted(indices):
// return False
//
// # Verify aggregate signature
// pubkeys = [state.validators[i].pubkey for i in indices]
// domain = get_domain(state, DOMAIN_PTC_ATTESTER, None)
// signing_root = compute_signing_root(indexed_payload_attestation.data, domain)
// return bls.FastAggregateVerify(pubkeys, signing_root, indexed_payload_attestation.signature)
// </spec>
// indices = indexed_payload_attestation.attesting_indices
// return len(indices) > 0 and indices == sorted(indices) and
// bls.FastAggregateVerify(
// [state.validators[i].pubkey for i in indices],
// compute_signing_root(indexed_payload_attestation.data, get_domain(state, DOMAIN_PTC_ATTESTER, compute_epoch_at_slot(attestation.data.slot)),
// indexed_payload_attestation.signature,
// )
func validIndexedPayloadAttestation(st state.ReadOnlyBeaconState, att *consensus_types.IndexedPayloadAttestation) error {
indices := att.AttestingIndices
if len(indices) == 0 || !slices.IsSorted(indices) {

View File

@@ -10,21 +10,17 @@ import (
)
// ProcessBuilderPendingPayments processes the builder pending payments from the previous epoch.
// Spec v1.7.0-alpha.0 (pseudocode):
// def process_builder_pending_payments(state: BeaconState) -> None:
//
// <spec fn="process_builder_pending_payments" fork="gloas" hash="10da48dd">
// def process_builder_pending_payments(state: BeaconState) -> None:
// """
// Processes the builder pending payments from the previous epoch.
// """
// quorum = get_builder_payment_quorum_threshold(state)
// for payment in state.builder_pending_payments[:SLOTS_PER_EPOCH]:
// if payment.weight >= quorum:
// state.builder_pending_withdrawals.append(payment.withdrawal)
// quorum = get_builder_payment_quorum_threshold(state)
// for payment in state.builder_pending_payments[:SLOTS_PER_EPOCH]:
// if payment.weight >= quorum:
// state.builder_pending_withdrawals.append(payment.withdrawal)
//
// old_payments = state.builder_pending_payments[SLOTS_PER_EPOCH:]
// new_payments = [BuilderPendingPayment() for _ in range(SLOTS_PER_EPOCH)]
// state.builder_pending_payments = old_payments + new_payments
// </spec>
// old_payments = state.builder_pending_payments[SLOTS_PER_EPOCH:]
// new_payments = [BuilderPendingPayment() for _ in range(SLOTS_PER_EPOCH)]
// state.builder_pending_payments = old_payments + new_payments
func ProcessBuilderPendingPayments(state state.BeaconState) error {
quorum, err := builderQuorumThreshold(state)
if err != nil {
@@ -57,16 +53,12 @@ func ProcessBuilderPendingPayments(state state.BeaconState) error {
}
// builderQuorumThreshold calculates the quorum threshold for builder payments.
// Spec v1.7.0-alpha.0 (pseudocode):
// def get_builder_payment_quorum_threshold(state: BeaconState) -> uint64:
//
// <spec fn="get_builder_payment_quorum_threshold" fork="gloas" hash="a64b7ffb">
// def get_builder_payment_quorum_threshold(state: BeaconState) -> uint64:
// """
// Calculate the quorum threshold for builder payments.
// """
// per_slot_balance = get_total_active_balance(state) // SLOTS_PER_EPOCH
// quorum = per_slot_balance * BUILDER_PAYMENT_THRESHOLD_NUMERATOR
// return uint64(quorum // BUILDER_PAYMENT_THRESHOLD_DENOMINATOR)
// </spec>
// per_slot_balance = get_total_active_balance(state) // SLOTS_PER_EPOCH
// quorum = per_slot_balance * BUILDER_PAYMENT_THRESHOLD_NUMERATOR
// return uint64(quorum // BUILDER_PAYMENT_THRESHOLD_DENOMINATOR)
func builderQuorumThreshold(state state.ReadOnlyBeaconState) (primitives.Gwei, error) {
activeBalance, err := helpers.TotalActiveBalance(state)
if err != nil {

View File

@@ -11,20 +11,16 @@ import (
)
// RemoveBuilderPendingPayment removes the pending builder payment for the proposal slot.
// Spec v1.7.0 (pseudocode):
//
// <spec fn="process_proposer_slashing" fork="gloas" lines="22-32" hash="4da721ef">
// # [New in Gloas:EIP7732]
// # Remove the BuilderPendingPayment corresponding to
// # this proposal if it is still in the 2-epoch window.
// slot = header_1.slot
// proposal_epoch = compute_epoch_at_slot(slot)
// if proposal_epoch == get_current_epoch(state):
// payment_index = SLOTS_PER_EPOCH + slot % SLOTS_PER_EPOCH
// state.builder_pending_payments[payment_index] = BuilderPendingPayment()
// payment_index = SLOTS_PER_EPOCH + slot % SLOTS_PER_EPOCH
// state.builder_pending_payments[payment_index] = BuilderPendingPayment()
// elif proposal_epoch == get_previous_epoch(state):
// payment_index = slot % SLOTS_PER_EPOCH
// state.builder_pending_payments[payment_index] = BuilderPendingPayment()
// </spec>
// payment_index = slot % SLOTS_PER_EPOCH
// state.builder_pending_payments[payment_index] = BuilderPendingPayment()
func RemoveBuilderPendingPayment(st state.BeaconState, header *eth.BeaconBlockHeader) error {
proposalEpoch := slots.ToEpoch(header.Slot)
currentEpoch := time.CurrentEpoch(st)

View File

@@ -143,11 +143,10 @@ func ProcessSlot(ctx context.Context, state state.BeaconState) (state.BeaconStat
return nil, err
}
// <spec fn="process_slot" fork="gloas" lines="11-13" hash="62b28839">
// Spec v1.6.1 (pseudocode):
// # [New in Gloas:EIP7732]
// # Unset the next payload availability
// state.execution_payload_availability[(state.slot + 1) % SLOTS_PER_HISTORICAL_ROOT] = 0b0
// </spec>
if state.Version() >= version.Gloas {
index := uint64((state.Slot() + 1) % params.BeaconConfig().SlotsPerHistoricalRoot)
if err := state.UpdateExecutionPayloadAvailabilityAtIndex(index, 0x0); err != nil {

View File

@@ -37,6 +37,7 @@ go_library(
"//beacon-chain/node/registration:go_default_library",
"//beacon-chain/operations/attestations:go_default_library",
"//beacon-chain/operations/blstoexec:go_default_library",
"//beacon-chain/operations/payloadattestation:go_default_library",
"//beacon-chain/operations/slashings:go_default_library",
"//beacon-chain/operations/synccommittee:go_default_library",
"//beacon-chain/operations/voluntaryexits:go_default_library",

View File

@@ -40,6 +40,7 @@ import (
"github.com/OffchainLabs/prysm/v7/beacon-chain/node/registration"
"github.com/OffchainLabs/prysm/v7/beacon-chain/operations/attestations"
"github.com/OffchainLabs/prysm/v7/beacon-chain/operations/blstoexec"
"github.com/OffchainLabs/prysm/v7/beacon-chain/operations/payloadattestation"
"github.com/OffchainLabs/prysm/v7/beacon-chain/operations/slashings"
"github.com/OffchainLabs/prysm/v7/beacon-chain/operations/synccommittee"
"github.com/OffchainLabs/prysm/v7/beacon-chain/operations/voluntaryexits"
@@ -101,6 +102,7 @@ type BeaconNode struct {
slashingsPool slashings.PoolManager
syncCommitteePool synccommittee.Pool
blsToExecPool blstoexec.PoolManager
payloadAttestationPool payloadattestation.PoolManager
depositCache cache.DepositCache
trackedValidatorsCache *cache.TrackedValidatorsCache
payloadIDCache *cache.PayloadIDCache
@@ -134,37 +136,28 @@ type BeaconNode struct {
// New creates a new node instance, sets up configuration options, and registers
// every required service to the node.
func New(cliCtx *cli.Context, cancel context.CancelFunc, optFuncs []func(*cli.Context) ([]Option, error), opts ...Option) (*BeaconNode, error) {
func New(cliCtx *cli.Context, cancel context.CancelFunc, opts ...Option) (*BeaconNode, error) {
if err := configureBeacon(cliCtx); err != nil {
return nil, errors.Wrap(err, "could not set beacon configuration options")
}
for _, of := range optFuncs {
ofo, err := of(cliCtx)
if err != nil {
return nil, err
}
if ofo != nil {
opts = append(opts, ofo...)
}
}
ctx := cliCtx.Context
beacon := &BeaconNode{
cliCtx: cliCtx,
ctx: ctx,
cancel: cancel,
services: runtime.NewServiceRegistry(),
stop: make(chan struct{}),
stateFeed: new(event.Feed),
blockFeed: new(event.Feed),
opFeed: new(event.Feed),
attestationCache: cache.NewAttestationCache(),
attestationPool: attestations.NewPool(),
exitPool: voluntaryexits.NewPool(),
slashingsPool: slashings.NewPool(),
syncCommitteePool: synccommittee.NewPool(),
blsToExecPool: blstoexec.NewPool(),
cliCtx: cliCtx,
ctx: ctx,
cancel: cancel,
services: runtime.NewServiceRegistry(),
stop: make(chan struct{}),
stateFeed: new(event.Feed),
blockFeed: new(event.Feed),
opFeed: new(event.Feed),
attestationCache: cache.NewAttestationCache(),
attestationPool: attestations.NewPool(),
exitPool: voluntaryexits.NewPool(),
slashingsPool: slashings.NewPool(),
syncCommitteePool: synccommittee.NewPool(),
blsToExecPool: blstoexec.NewPool(),
// TODO payloadAttestationPool: set once a PoolManager implementation exists.
trackedValidatorsCache: cache.NewTrackedValidatorsCache(),
payloadIDCache: cache.NewPayloadIDCache(),
slasherBlockHeadersFeed: new(event.Feed),
@@ -982,6 +975,7 @@ func (b *BeaconNode) registerRPCService(router *http.ServeMux) error {
SlashingsPool: b.slashingsPool,
BLSChangesPool: b.blsToExecPool,
SyncCommitteeObjectPool: b.syncCommitteePool,
PayloadAttestationPool: b.payloadAttestationPool,
ExecutionChainService: web3Service,
ExecutionChainInfoFetcher: web3Service,
ChainStartFetcher: chainStartFetcher,

View File

@@ -59,7 +59,7 @@ func TestNodeClose_OK(t *testing.T) {
WithDataColumnStorage(filesystem.NewEphemeralDataColumnStorage(t)),
}
node, err := New(ctx, cancel, nil, options...)
node, err := New(ctx, cancel, options...)
require.NoError(t, err)
node.Close()
@@ -87,7 +87,7 @@ func TestNodeStart_Ok(t *testing.T) {
WithDataColumnStorage(filesystem.NewEphemeralDataColumnStorage(t)),
}
node, err := New(ctx, cancel, nil, options...)
node, err := New(ctx, cancel, options...)
require.NoError(t, err)
require.NotNil(t, node.lcStore)
node.services = &runtime.ServiceRegistry{}
@@ -116,7 +116,7 @@ func TestNodeStart_SyncChecker(t *testing.T) {
WithDataColumnStorage(filesystem.NewEphemeralDataColumnStorage(t)),
}
node, err := New(ctx, cancel, nil, options...)
node, err := New(ctx, cancel, options...)
require.NoError(t, err)
go func() {
node.Start()
@@ -151,7 +151,7 @@ func TestClearDB(t *testing.T) {
WithDataColumnStorage(filesystem.NewEphemeralDataColumnStorage(t)),
}
_, err = New(context, cancel, nil, options...)
_, err = New(context, cancel, options...)
require.NoError(t, err)
require.LogsContain(t, hook, "Removing database")
}

View File

@@ -0,0 +1,12 @@
load("@prysm//tools/go:def.bzl", "go_library")
go_library(
name = "go_default_library",
srcs = ["pool.go"],
importpath = "github.com/OffchainLabs/prysm/v7/beacon-chain/operations/payloadattestation",
visibility = ["//visibility:public"],
deps = [
"//consensus-types/primitives:go_default_library",
"//proto/prysm/v1alpha1:go_default_library",
],
)

View File

@@ -0,0 +1,9 @@
load("@prysm//tools/go:def.bzl", "go_library")
go_library(
name = "go_default_library",
srcs = ["mock.go"],
importpath = "github.com/OffchainLabs/prysm/v7/beacon-chain/operations/payloadattestation/mock",
visibility = ["//visibility:public"],
deps = ["//proto/prysm/v1alpha1:go_default_library"],
)

View File

@@ -0,0 +1,28 @@
package mock
import (
ethpb "github.com/OffchainLabs/prysm/v7/proto/prysm/v1alpha1"
)
// PoolMock is a fake implementation of PoolManager.
type PoolMock struct {
Attestations []*ethpb.PayloadAttestation
}
// PendingPayloadAttestations --
func (m *PoolMock) PendingPayloadAttestations() []*ethpb.PayloadAttestation {
return m.Attestations
}
// InsertPayloadAttestation --
func (m *PoolMock) InsertPayloadAttestation(msg *ethpb.PayloadAttestationMessage) error {
m.Attestations = append(m.Attestations, &ethpb.PayloadAttestation{
Data: msg.Data,
Signature: msg.Signature,
})
return nil
}
// MarkIncluded --
func (*PoolMock) MarkIncluded(_ *ethpb.PayloadAttestation) {
}

View File

@@ -0,0 +1,20 @@
package payloadattestation
import (
"github.com/OffchainLabs/prysm/v7/consensus-types/primitives"
ethpb "github.com/OffchainLabs/prysm/v7/proto/prysm/v1alpha1"
)
// PoolManager maintains pending payload attestations.
// This pool is used by proposers to insert payload attestations into new blocks.
type PoolManager interface {
PendingPayloadAttestations() []*ethpb.PayloadAttestation
InsertPayloadAttestation(msg *ethpb.PayloadAttestationMessage) error
MarkIncluded(att *ethpb.PayloadAttestation)
}
// PayloadStatusFetcher determines the payload presence and blob data availability
// for a given slot. This is used by PTC validators to produce PayloadAttestationData.
type PayloadStatusFetcher interface {
PayloadStatus(slot primitives.Slot) (payloadPresent bool, blobDataAvailable bool, err error)
}

View File

@@ -25,7 +25,6 @@ var gossipTopicMappings = map[string]func() proto.Message{
LightClientOptimisticUpdateTopicFormat: func() proto.Message { return &ethpb.LightClientOptimisticUpdateAltair{} },
LightClientFinalityUpdateTopicFormat: func() proto.Message { return &ethpb.LightClientFinalityUpdateAltair{} },
DataColumnSubnetTopicFormat: func() proto.Message { return &ethpb.DataColumnSidecar{} },
PayloadAttestationMessageTopicFormat: func() proto.Message { return &ethpb.PayloadAttestationMessage{} },
}
// GossipTopicMappings is a function to return the assigned data type
@@ -145,7 +144,4 @@ func init() {
// Specially handle Fulu objects.
GossipTypeMapping[reflect.TypeFor[*ethpb.SignedBeaconBlockFulu]()] = BlockSubnetTopicFormat
// Payload attestation messages.
GossipTypeMapping[reflect.TypeFor[*ethpb.PayloadAttestationMessage]()] = PayloadAttestationMessageTopicFormat
}

View File

@@ -46,8 +46,6 @@ const (
GossipLightClientOptimisticUpdateMessage = "light_client_optimistic_update"
// GossipDataColumnSidecarMessage is the name for the data column sidecar message type.
GossipDataColumnSidecarMessage = "data_column_sidecar"
// GossipPayloadAttestationMessage is the name for the payload attestation message type.
GossipPayloadAttestationMessage = "payload_attestation_message"
// Topic Formats
//
@@ -77,8 +75,6 @@ const (
LightClientOptimisticUpdateTopicFormat = GossipProtocolAndDigest + GossipLightClientOptimisticUpdateMessage
// DataColumnSubnetTopicFormat is the topic format for the data column subnet.
DataColumnSubnetTopicFormat = GossipProtocolAndDigest + GossipDataColumnSidecarMessage + "_%d"
// PayloadAttestationMessageTopicFormat is the topic format for payload attestation messages.
PayloadAttestationMessageTopicFormat = GossipProtocolAndDigest + GossipPayloadAttestationMessage
)
// topic is a struct representing a single gossipsub topic.
@@ -152,7 +148,6 @@ func (s *Service) allTopics() []topic {
empty := [4]byte{0, 0, 0, 0} // empty digest for templates, replaced by real digests in per-fork copies.
templates := []topic{
newTopic(genesis, future, empty, GossipBlockMessage),
newTopic(genesis, future, empty, GossipPayloadAttestationMessage),
newTopic(genesis, future, empty, GossipAggregateAndProofMessage),
newTopic(genesis, future, empty, GossipExitMessage),
newTopic(genesis, future, empty, GossipProposerSlashingMessage),

View File

@@ -26,6 +26,7 @@ go_library(
"//beacon-chain/light-client:go_default_library",
"//beacon-chain/operations/attestations:go_default_library",
"//beacon-chain/operations/blstoexec:go_default_library",
"//beacon-chain/operations/payloadattestation:go_default_library",
"//beacon-chain/operations/slashings:go_default_library",
"//beacon-chain/operations/synccommittee:go_default_library",
"//beacon-chain/operations/voluntaryexits:go_default_library",

View File

@@ -217,6 +217,7 @@ func (s *Service) validatorEndpoints(
OperationNotifier: s.cfg.OperationNotifier,
TrackedValidatorsCache: s.cfg.TrackedValidatorsCache,
PayloadIDCache: s.cfg.PayloadIDCache,
PayloadAttestationPool: s.cfg.PayloadAttestationPool,
CoreService: coreService,
BlockRewardFetcher: rewardFetcher,
}
@@ -390,6 +391,16 @@ func (s *Service) validatorEndpoints(
handler: server.SyncCommitteeSelections,
methods: []string{http.MethodPost},
},
{
template: "/eth/v1/validator/payload_attestation_data/{slot}",
name: namespace + ".GetPayloadAttestationData",
middleware: []middleware.Middleware{
middleware.AcceptHeaderHandler([]string{api.JsonMediaType, api.OctetStreamMediaType}),
middleware.AcceptEncodingHeaderHandler(),
},
handler: server.GetPayloadAttestationData,
methods: []string{http.MethodGet},
},
}
}
@@ -512,6 +523,7 @@ func (s *Service) beaconEndpoints(
SyncChecker: s.cfg.SyncService,
ExecutionReconstructor: s.cfg.ExecutionReconstructor,
BLSChangesPool: s.cfg.BLSChangesPool,
PayloadAttestationPool: s.cfg.PayloadAttestationPool,
FinalizationFetcher: s.cfg.FinalizationFetcher,
ForkchoiceFetcher: s.cfg.ForkchoiceFetcher,
CoreService: coreService,
@@ -869,6 +881,27 @@ func (s *Service) beaconEndpoints(
handler: server.GetProposerLookahead,
methods: []string{http.MethodGet},
},
{
template: "/eth/v1/beacon/pool/payload_attestations",
name: namespace + ".ListPayloadAttestations",
middleware: []middleware.Middleware{
middleware.AcceptHeaderHandler([]string{api.JsonMediaType}),
middleware.AcceptEncodingHeaderHandler(),
},
handler: server.ListPayloadAttestations,
methods: []string{http.MethodGet},
},
{
template: "/eth/v1/beacon/pool/payload_attestations",
name: namespace + ".SubmitPayloadAttestations",
middleware: []middleware.Middleware{
middleware.ContentTypeHandler([]string{api.JsonMediaType}),
middleware.AcceptHeaderHandler([]string{api.JsonMediaType}),
middleware.AcceptEncodingHeaderHandler(),
},
handler: server.SubmitPayloadAttestations,
methods: []string{http.MethodPost},
},
}
}

View File

@@ -48,6 +48,7 @@ func Test_endpoints(t *testing.T) {
"/eth/v1/beacon/pool/sync_committees": {http.MethodPost},
"/eth/v1/beacon/pool/voluntary_exits": {http.MethodGet, http.MethodPost},
"/eth/v1/beacon/pool/bls_to_execution_changes": {http.MethodGet, http.MethodPost},
"/eth/v1/beacon/pool/payload_attestations": {http.MethodGet, http.MethodPost},
"/prysm/v1/beacon/individual_votes": {http.MethodPost},
}
@@ -91,22 +92,23 @@ func Test_endpoints(t *testing.T) {
}
validatorRoutes := map[string][]string{
"/eth/v1/validator/duties/attester/{epoch}": {http.MethodPost},
"/eth/v1/validator/duties/proposer/{epoch}": {http.MethodGet},
"/eth/v1/validator/duties/sync/{epoch}": {http.MethodPost},
"/eth/v3/validator/blocks/{slot}": {http.MethodGet},
"/eth/v1/validator/attestation_data": {http.MethodGet},
"/eth/v2/validator/aggregate_attestation": {http.MethodGet},
"/eth/v2/validator/aggregate_and_proofs": {http.MethodPost},
"/eth/v1/validator/beacon_committee_subscriptions": {http.MethodPost},
"/eth/v1/validator/sync_committee_subscriptions": {http.MethodPost},
"/eth/v1/validator/beacon_committee_selections": {http.MethodPost},
"/eth/v1/validator/sync_committee_selections": {http.MethodPost},
"/eth/v1/validator/sync_committee_contribution": {http.MethodGet},
"/eth/v1/validator/contribution_and_proofs": {http.MethodPost},
"/eth/v1/validator/prepare_beacon_proposer": {http.MethodPost},
"/eth/v1/validator/register_validator": {http.MethodPost},
"/eth/v1/validator/liveness/{epoch}": {http.MethodPost},
"/eth/v1/validator/duties/attester/{epoch}": {http.MethodPost},
"/eth/v1/validator/duties/proposer/{epoch}": {http.MethodGet},
"/eth/v1/validator/duties/sync/{epoch}": {http.MethodPost},
"/eth/v3/validator/blocks/{slot}": {http.MethodGet},
"/eth/v1/validator/attestation_data": {http.MethodGet},
"/eth/v2/validator/aggregate_attestation": {http.MethodGet},
"/eth/v2/validator/aggregate_and_proofs": {http.MethodPost},
"/eth/v1/validator/beacon_committee_subscriptions": {http.MethodPost},
"/eth/v1/validator/sync_committee_subscriptions": {http.MethodPost},
"/eth/v1/validator/beacon_committee_selections": {http.MethodPost},
"/eth/v1/validator/sync_committee_selections": {http.MethodPost},
"/eth/v1/validator/sync_committee_contribution": {http.MethodGet},
"/eth/v1/validator/contribution_and_proofs": {http.MethodPost},
"/eth/v1/validator/prepare_beacon_proposer": {http.MethodPost},
"/eth/v1/validator/register_validator": {http.MethodPost},
"/eth/v1/validator/liveness/{epoch}": {http.MethodPost},
"/eth/v1/validator/payload_attestation_data/{slot}": {http.MethodGet},
}
prysmBeaconRoutes := map[string][]string{

View File

@@ -32,6 +32,7 @@ go_library(
"//beacon-chain/execution:go_default_library",
"//beacon-chain/operations/attestations:go_default_library",
"//beacon-chain/operations/blstoexec:go_default_library",
"//beacon-chain/operations/payloadattestation:go_default_library",
"//beacon-chain/operations/slashings:go_default_library",
"//beacon-chain/operations/voluntaryexits:go_default_library",
"//beacon-chain/p2p:go_default_library",
@@ -94,6 +95,7 @@ go_test(
"//beacon-chain/operations/attestations:go_default_library",
"//beacon-chain/operations/blstoexec:go_default_library",
"//beacon-chain/operations/blstoexec/mock:go_default_library",
"//beacon-chain/operations/payloadattestation/mock:go_default_library",
"//beacon-chain/operations/slashings/mock:go_default_library",
"//beacon-chain/operations/synccommittee:go_default_library",
"//beacon-chain/operations/voluntaryexits/mock:go_default_library",

View File

@@ -893,3 +893,99 @@ func (s *Server) SubmitProposerSlashing(w http.ResponseWriter, r *http.Request)
}
}
}
// SubmitPayloadAttestations submits payload attestation messages to the node's pool.
func (s *Server) SubmitPayloadAttestations(w http.ResponseWriter, r *http.Request) {
ctx, span := trace.StartSpan(r.Context(), "beacon.SubmitPayloadAttestations")
defer span.End()
currentEpoch := slots.ToEpoch(s.TimeFetcher.CurrentSlot())
if currentEpoch < params.BeaconConfig().GloasForkEpoch {
httputil.HandleError(w, fmt.Sprintf("payload attestations require the Gloas fork, current epoch %d, Gloas epoch %d", currentEpoch, params.BeaconConfig().GloasForkEpoch), http.StatusBadRequest)
return
}
if shared.IsSyncing(ctx, w, s.SyncChecker, s.HeadFetcher, s.TimeFetcher, s.OptimisticModeFetcher) {
return
}
versionHeader := r.Header.Get(api.VersionHeader)
if versionHeader == "" {
httputil.HandleError(w, api.VersionHeader+" header is required", http.StatusBadRequest)
return
}
var msgs []*structs.PayloadAttestationMessage
if err := json.NewDecoder(r.Body).Decode(&msgs); err != nil {
httputil.HandleError(w, "Could not decode request body: "+err.Error(), http.StatusBadRequest)
return
}
var failures []*server.IndexedError
for i, msg := range msgs {
consensusMsg, err := msg.ToConsensus()
if err != nil {
failures = append(failures, &server.IndexedError{
Index: i,
Message: "Could not convert message: " + err.Error(),
})
continue
}
// TODO: Add full gossip validation (BLS signatures, PTC membership).
if err := s.PayloadAttestationPool.InsertPayloadAttestation(consensusMsg); err != nil {
failures = append(failures, &server.IndexedError{
Index: i,
Message: "Could not insert payload attestation: " + err.Error(),
})
continue
}
if err := s.Broadcaster.Broadcast(ctx, consensusMsg); err != nil {
log.WithError(err).Error("Could not broadcast payload attestation message")
}
}
if len(failures) > 0 {
failuresErr := &server.IndexedErrorContainer{
Code: http.StatusBadRequest,
Message: server.ErrIndexedValidationFail,
Failures: failures,
}
httputil.WriteError(w, failuresErr)
return
}
}
// ListPayloadAttestations retrieves payload attestations from the pool.
func (s *Server) ListPayloadAttestations(w http.ResponseWriter, r *http.Request) {
_, span := trace.StartSpan(r.Context(), "beacon.ListPayloadAttestations")
defer span.End()
currentEpoch := slots.ToEpoch(s.TimeFetcher.CurrentSlot())
if currentEpoch < params.BeaconConfig().GloasForkEpoch {
httputil.HandleError(w, fmt.Sprintf("payload attestations require the Gloas fork, current epoch %d, Gloas epoch %d", currentEpoch, params.BeaconConfig().GloasForkEpoch), http.StatusBadRequest)
return
}
rawSlot, slot, ok := shared.UintFromQuery(w, r, "slot", false)
if !ok {
return
}
allAtts := s.PayloadAttestationPool.PendingPayloadAttestations()
var data []*structs.PayloadAttestation
for _, att := range allAtts {
if rawSlot != "" && att.Data.Slot != primitives.Slot(slot) {
continue
}
data = append(data, structs.PayloadAttestationFromConsensus(att))
}
w.Header().Set(api.VersionHeader, version.String(version.Gloas))
httputil.WriteJson(w, &structs.GetPoolPayloadAttestationsResponse{
Version: version.String(version.Gloas),
Data: data,
})
}

View File

@@ -21,6 +21,7 @@ import (
"github.com/OffchainLabs/prysm/v7/beacon-chain/operations/attestations"
"github.com/OffchainLabs/prysm/v7/beacon-chain/operations/blstoexec"
blstoexecmock "github.com/OffchainLabs/prysm/v7/beacon-chain/operations/blstoexec/mock"
payloadattestationmock "github.com/OffchainLabs/prysm/v7/beacon-chain/operations/payloadattestation/mock"
slashingsmock "github.com/OffchainLabs/prysm/v7/beacon-chain/operations/slashings/mock"
"github.com/OffchainLabs/prysm/v7/beacon-chain/operations/synccommittee"
"github.com/OffchainLabs/prysm/v7/beacon-chain/operations/voluntaryexits/mock"
@@ -2547,3 +2548,253 @@ var (
}
}`
)
func TestSubmitPayloadAttestations(t *testing.T) {
t.Run("pre-gloas fork returns error", func(t *testing.T) {
params.SetupTestConfigCleanup(t)
cfg := params.BeaconConfig().Copy()
cfg.GloasForkEpoch = 100
params.OverrideBeaconConfig(cfg)
slot := primitives.Slot(0)
chainService := &blockchainmock.ChainService{Slot: &slot}
s := &Server{
TimeFetcher: chainService,
}
request := httptest.NewRequest(http.MethodPost, "http://example.com", nil)
writer := httptest.NewRecorder()
writer.Body = &bytes.Buffer{}
s.SubmitPayloadAttestations(writer, request)
assert.Equal(t, http.StatusBadRequest, writer.Code)
assert.StringContains(t, "Gloas fork", writer.Body.String())
})
t.Run("no version header", func(t *testing.T) {
params.SetupTestConfigCleanup(t)
cfg := params.BeaconConfig().Copy()
cfg.GloasForkEpoch = 0
params.OverrideBeaconConfig(cfg)
slot := primitives.Slot(0)
chainService := &blockchainmock.ChainService{Slot: &slot}
s := &Server{
SyncChecker: &mockSync.Sync{IsSyncing: false},
HeadFetcher: chainService,
TimeFetcher: chainService,
OptimisticModeFetcher: chainService,
}
request := httptest.NewRequest(http.MethodPost, "http://example.com", nil)
writer := httptest.NewRecorder()
writer.Body = &bytes.Buffer{}
s.SubmitPayloadAttestations(writer, request)
assert.Equal(t, http.StatusBadRequest, writer.Code)
assert.StringContains(t, "Eth-Consensus-Version", writer.Body.String())
})
t.Run("ok", func(t *testing.T) {
params.SetupTestConfigCleanup(t)
cfg := params.BeaconConfig().Copy()
cfg.GloasForkEpoch = 0
params.OverrideBeaconConfig(cfg)
slot := primitives.Slot(1)
chainService := &blockchainmock.ChainService{Slot: &slot}
broadcaster := &p2pMock.MockBroadcaster{}
pool := &payloadattestationmock.PoolMock{}
s := &Server{
SyncChecker: &mockSync.Sync{IsSyncing: false},
HeadFetcher: chainService,
TimeFetcher: chainService,
OptimisticModeFetcher: chainService,
Broadcaster: broadcaster,
PayloadAttestationPool: pool,
}
body := `[{
"validator_index": "1",
"data": {
"beacon_block_root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2",
"slot": "1",
"payload_present": true,
"blob_data_available": true
},
"signature": "0x1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505cc411d61252fb6cb3fa0017b679f8bb2305b26a285fa2737f175668d0dff91cc1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505"
}]`
request := httptest.NewRequest(http.MethodPost, "http://example.com", strings.NewReader(body))
request.Header.Set(api.VersionHeader, "gloas")
writer := httptest.NewRecorder()
writer.Body = &bytes.Buffer{}
s.SubmitPayloadAttestations(writer, request)
assert.Equal(t, http.StatusOK, writer.Code)
assert.Equal(t, 1, len(pool.Attestations))
assert.Equal(t, true, broadcaster.BroadcastCalled.Load())
})
t.Run("invalid body", func(t *testing.T) {
params.SetupTestConfigCleanup(t)
cfg := params.BeaconConfig().Copy()
cfg.GloasForkEpoch = 0
params.OverrideBeaconConfig(cfg)
slot := primitives.Slot(1)
chainService := &blockchainmock.ChainService{Slot: &slot}
s := &Server{
SyncChecker: &mockSync.Sync{IsSyncing: false},
HeadFetcher: chainService,
TimeFetcher: chainService,
OptimisticModeFetcher: chainService,
}
request := httptest.NewRequest(http.MethodPost, "http://example.com", strings.NewReader("invalid"))
request.Header.Set(api.VersionHeader, "gloas")
writer := httptest.NewRecorder()
writer.Body = &bytes.Buffer{}
s.SubmitPayloadAttestations(writer, request)
assert.Equal(t, http.StatusBadRequest, writer.Code)
})
}
func TestListPayloadAttestations(t *testing.T) {
t.Run("pre-gloas fork returns error", func(t *testing.T) {
params.SetupTestConfigCleanup(t)
cfg := params.BeaconConfig().Copy()
cfg.GloasForkEpoch = 100
params.OverrideBeaconConfig(cfg)
slot := primitives.Slot(0)
chainService := &blockchainmock.ChainService{Slot: &slot}
s := &Server{
TimeFetcher: chainService,
}
request := httptest.NewRequest(http.MethodGet, "http://example.com", nil)
writer := httptest.NewRecorder()
writer.Body = &bytes.Buffer{}
s.ListPayloadAttestations(writer, request)
assert.Equal(t, http.StatusBadRequest, writer.Code)
assert.StringContains(t, "Gloas fork", writer.Body.String())
})
t.Run("empty pool", func(t *testing.T) {
params.SetupTestConfigCleanup(t)
cfg := params.BeaconConfig().Copy()
cfg.GloasForkEpoch = 0
params.OverrideBeaconConfig(cfg)
slot := primitives.Slot(0)
chainService := &blockchainmock.ChainService{Slot: &slot}
pool := &payloadattestationmock.PoolMock{}
s := &Server{
TimeFetcher: chainService,
PayloadAttestationPool: pool,
}
request := httptest.NewRequest(http.MethodGet, "http://example.com", nil)
writer := httptest.NewRecorder()
writer.Body = &bytes.Buffer{}
s.ListPayloadAttestations(writer, request)
assert.Equal(t, http.StatusOK, writer.Code)
resp := &structs.GetPoolPayloadAttestationsResponse{}
require.NoError(t, json.Unmarshal(writer.Body.Bytes(), resp))
assert.Equal(t, 0, len(resp.Data))
})
t.Run("returns attestations", func(t *testing.T) {
params.SetupTestConfigCleanup(t)
cfg := params.BeaconConfig().Copy()
cfg.GloasForkEpoch = 0
params.OverrideBeaconConfig(cfg)
slot := primitives.Slot(0)
chainService := &blockchainmock.ChainService{Slot: &slot}
pool := &payloadattestationmock.PoolMock{
Attestations: []*ethpbv1alpha1.PayloadAttestation{
{
Data: &ethpbv1alpha1.PayloadAttestationData{
BeaconBlockRoot: bytesutil.PadTo([]byte("root1"), 32),
Slot: 1,
PayloadPresent: true,
BlobDataAvailable: true,
},
Signature: bytesutil.PadTo([]byte("sig1"), 96),
},
{
Data: &ethpbv1alpha1.PayloadAttestationData{
BeaconBlockRoot: bytesutil.PadTo([]byte("root2"), 32),
Slot: 2,
PayloadPresent: false,
BlobDataAvailable: false,
},
Signature: bytesutil.PadTo([]byte("sig2"), 96),
},
},
}
s := &Server{
TimeFetcher: chainService,
PayloadAttestationPool: pool,
}
request := httptest.NewRequest(http.MethodGet, "http://example.com", nil)
writer := httptest.NewRecorder()
writer.Body = &bytes.Buffer{}
s.ListPayloadAttestations(writer, request)
assert.Equal(t, http.StatusOK, writer.Code)
resp := &structs.GetPoolPayloadAttestationsResponse{}
require.NoError(t, json.Unmarshal(writer.Body.Bytes(), resp))
assert.Equal(t, 2, len(resp.Data))
assert.Equal(t, "gloas", resp.Version)
})
t.Run("filter by slot", func(t *testing.T) {
params.SetupTestConfigCleanup(t)
cfg := params.BeaconConfig().Copy()
cfg.GloasForkEpoch = 0
params.OverrideBeaconConfig(cfg)
slot := primitives.Slot(0)
chainService := &blockchainmock.ChainService{Slot: &slot}
pool := &payloadattestationmock.PoolMock{
Attestations: []*ethpbv1alpha1.PayloadAttestation{
{
Data: &ethpbv1alpha1.PayloadAttestationData{
BeaconBlockRoot: bytesutil.PadTo([]byte("root1"), 32),
Slot: 1,
PayloadPresent: true,
BlobDataAvailable: true,
},
Signature: bytesutil.PadTo([]byte("sig1"), 96),
},
{
Data: &ethpbv1alpha1.PayloadAttestationData{
BeaconBlockRoot: bytesutil.PadTo([]byte("root2"), 32),
Slot: 2,
PayloadPresent: false,
BlobDataAvailable: false,
},
Signature: bytesutil.PadTo([]byte("sig2"), 96),
},
},
}
s := &Server{
TimeFetcher: chainService,
PayloadAttestationPool: pool,
}
request := httptest.NewRequest(http.MethodGet, "http://example.com?slot=1", nil)
writer := httptest.NewRecorder()
writer.Body = &bytes.Buffer{}
s.ListPayloadAttestations(writer, request)
assert.Equal(t, http.StatusOK, writer.Code)
resp := &structs.GetPoolPayloadAttestationsResponse{}
require.NoError(t, json.Unmarshal(writer.Body.Bytes(), resp))
assert.Equal(t, 1, len(resp.Data))
assert.Equal(t, "1", resp.Data[0].Data.Slot)
})
}

View File

@@ -12,6 +12,7 @@ import (
"github.com/OffchainLabs/prysm/v7/beacon-chain/execution"
"github.com/OffchainLabs/prysm/v7/beacon-chain/operations/attestations"
"github.com/OffchainLabs/prysm/v7/beacon-chain/operations/blstoexec"
"github.com/OffchainLabs/prysm/v7/beacon-chain/operations/payloadattestation"
"github.com/OffchainLabs/prysm/v7/beacon-chain/operations/slashings"
"github.com/OffchainLabs/prysm/v7/beacon-chain/operations/voluntaryexits"
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p"
@@ -48,6 +49,7 @@ type Server struct {
ExecutionReconstructor execution.Reconstructor
FinalizationFetcher blockchain.FinalizationFetcher
BLSChangesPool blstoexec.PoolManager
PayloadAttestationPool payloadattestation.PoolManager
ForkchoiceFetcher blockchain.ForkchoiceFetcher
CoreService *core.Service
AttestationStateFetcher blockchain.AttestationStateFetcher

View File

@@ -21,6 +21,7 @@ go_library(
"//beacon-chain/core/helpers:go_default_library",
"//beacon-chain/db:go_default_library",
"//beacon-chain/operations/attestations:go_default_library",
"//beacon-chain/operations/payloadattestation:go_default_library",
"//beacon-chain/operations/synccommittee:go_default_library",
"//beacon-chain/p2p:go_default_library",
"//beacon-chain/rpc/core:go_default_library",

View File

@@ -1427,3 +1427,61 @@ func sortProposerDuties(duties []*structs.ProposerDuty) error {
})
return err
}
// GetPayloadAttestationData produces payload attestation data for the requested slot.
func (s *Server) GetPayloadAttestationData(w http.ResponseWriter, r *http.Request) {
ctx, span := trace.StartSpan(r.Context(), "validator.GetPayloadAttestationData")
defer span.End()
currentEpoch := slots.ToEpoch(s.TimeFetcher.CurrentSlot())
if currentEpoch < params.BeaconConfig().GloasForkEpoch {
httputil.HandleError(w, fmt.Sprintf("payload attestation data requires the Gloas fork, current epoch %d, Gloas epoch %d", currentEpoch, params.BeaconConfig().GloasForkEpoch), http.StatusBadRequest)
return
}
if shared.IsSyncing(ctx, w, s.SyncChecker, s.HeadFetcher, s.TimeFetcher, s.OptimisticModeFetcher) {
return
}
_, slot, ok := shared.UintFromRoute(w, r, "slot")
if !ok {
return
}
headRoot, err := s.HeadFetcher.HeadRoot(ctx)
if err != nil {
httputil.HandleError(w, "Could not get head root: "+err.Error(), http.StatusInternalServerError)
return
}
payloadPresent, blobDataAvailable, err := s.PayloadStatusFetcher.PayloadStatus(primitives.Slot(slot))
if err != nil {
httputil.HandleError(w, "Could not get payload status: "+err.Error(), http.StatusInternalServerError)
return
}
data := &ethpbalpha.PayloadAttestationData{
BeaconBlockRoot: headRoot,
Slot: primitives.Slot(slot),
PayloadPresent: payloadPresent,
BlobDataAvailable: blobDataAvailable,
}
if httputil.RespondWithSsz(r) {
sszData, err := data.MarshalSSZ()
if err != nil {
httputil.HandleError(w, "Could not marshal payload attestation data: "+err.Error(), http.StatusInternalServerError)
return
}
w.Header().Set(api.VersionHeader, version.String(version.Gloas))
httputil.WriteSsz(w, sszData)
return
}
response := &structs.GetPayloadAttestationDataResponse{
Version: version.String(version.Gloas),
Data: structs.PayloadAttestationDataFromConsensus(data),
}
w.Header().Set(api.VersionHeader, version.String(version.Gloas))
httputil.WriteJson(w, response)
}

View File

@@ -7,6 +7,7 @@ import (
"github.com/OffchainLabs/prysm/v7/beacon-chain/core/feed/operation"
"github.com/OffchainLabs/prysm/v7/beacon-chain/db"
"github.com/OffchainLabs/prysm/v7/beacon-chain/operations/attestations"
"github.com/OffchainLabs/prysm/v7/beacon-chain/operations/payloadattestation"
"github.com/OffchainLabs/prysm/v7/beacon-chain/operations/synccommittee"
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p"
"github.com/OffchainLabs/prysm/v7/beacon-chain/rpc/core"
@@ -38,4 +39,6 @@ type Server struct {
BlockRewardFetcher rewards.BlockRewardsFetcher
TrackedValidatorsCache *cache.TrackedValidatorsCache
PayloadIDCache *cache.PayloadIDCache
PayloadAttestationPool payloadattestation.PoolManager
PayloadStatusFetcher payloadattestation.PayloadStatusFetcher
}

View File

@@ -22,6 +22,7 @@ import (
lightClient "github.com/OffchainLabs/prysm/v7/beacon-chain/light-client"
"github.com/OffchainLabs/prysm/v7/beacon-chain/operations/attestations"
"github.com/OffchainLabs/prysm/v7/beacon-chain/operations/blstoexec"
"github.com/OffchainLabs/prysm/v7/beacon-chain/operations/payloadattestation"
"github.com/OffchainLabs/prysm/v7/beacon-chain/operations/slashings"
"github.com/OffchainLabs/prysm/v7/beacon-chain/operations/synccommittee"
"github.com/OffchainLabs/prysm/v7/beacon-chain/operations/voluntaryexits"
@@ -103,6 +104,7 @@ type Config struct {
SlashingsPool slashings.PoolManager
SyncCommitteeObjectPool synccommittee.Pool
BLSChangesPool blstoexec.PoolManager
PayloadAttestationPool payloadattestation.PoolManager
SyncService chainSync.Checker
Broadcaster p2p.Broadcaster
PeersFetcher p2p.PeersProvider

View File

@@ -46,20 +46,14 @@ func (b *BeaconState) BuilderPubkey(builderIndex primitives.BuilderIndex) ([fiel
}
// IsActiveBuilder returns true if the builder placement is finalized and it has not initiated exit.
// Spec v1.7.0-alpha.0 (pseudocode):
// def is_active_builder(state: BeaconState, builder_index: BuilderIndex) -> bool:
//
// <spec fn="is_active_builder" fork="gloas" hash="1a599fb2">
// def is_active_builder(state: BeaconState, builder_index: BuilderIndex) -> bool:
// """
// Check if the builder at ``builder_index`` is active for the given ``state``.
// """
// builder = state.builders[builder_index]
// return (
// # Placement in builder list is finalized
// builder.deposit_epoch < state.finalized_checkpoint.epoch
// # Has not initiated exit
// and builder.withdrawable_epoch == FAR_FUTURE_EPOCH
// )
// </spec>
// builder = state.builders[builder_index]
// return (
// builder.deposit_epoch < state.finalized_checkpoint.epoch
// and builder.withdrawable_epoch == FAR_FUTURE_EPOCH
// )
func (b *BeaconState) IsActiveBuilder(builderIndex primitives.BuilderIndex) (bool, error) {
if b.version < version.Gloas {
return false, errNotSupported("IsActiveBuilder", b.version)
@@ -78,18 +72,15 @@ func (b *BeaconState) IsActiveBuilder(builderIndex primitives.BuilderIndex) (boo
}
// CanBuilderCoverBid returns true if the builder has enough balance to cover the given bid amount.
// Spec v1.7.0-alpha.0 (pseudocode):
// def can_builder_cover_bid(state: BeaconState, builder_index: BuilderIndex, bid_amount: Gwei) -> bool:
//
// <spec fn="can_builder_cover_bid" fork="gloas" hash="9e3f2d7c">
// def can_builder_cover_bid(
// state: BeaconState, builder_index: BuilderIndex, bid_amount: Gwei
// ) -> bool:
// builder_balance = state.builders[builder_index].balance
// pending_withdrawals_amount = get_pending_balance_to_withdraw_for_builder(state, builder_index)
// min_balance = MIN_DEPOSIT_AMOUNT + pending_withdrawals_amount
// if builder_balance < min_balance:
// return False
// return builder_balance - min_balance >= bid_amount
// </spec>
// builder_balance = state.builders[builder_index].balance
// pending_withdrawals_amount = get_pending_balance_to_withdraw_for_builder(state, builder_index)
// min_balance = MIN_DEPOSIT_AMOUNT + pending_withdrawals_amount
// if builder_balance < min_balance:
// return False
// return builder_balance - min_balance >= bid_amount
func (b *BeaconState) CanBuilderCoverBid(builderIndex primitives.BuilderIndex, bidAmount primitives.Gwei) (bool, error) {
if b.version < version.Gloas {
return false, errNotSupported("CanBuilderCoverBid", b.version)

View File

@@ -20,7 +20,6 @@ go_library(
"metrics.go",
"once.go",
"options.go",
"payload_attestations.go",
"pending_attestations_queue.go",
"pending_blocks_queue.go",
"rate_limiter.go",
@@ -114,7 +113,6 @@ go_library(
"//config/fieldparams:go_default_library",
"//config/params:go_default_library",
"//consensus-types/blocks:go_default_library",
"//consensus-types/epbs/payload-attestation:go_default_library",
"//consensus-types/interfaces:go_default_library",
"//consensus-types/primitives:go_default_library",
"//consensus-types/wrapper:go_default_library",
@@ -179,7 +177,6 @@ go_test(
"fork_watcher_test.go",
"kzg_batch_verifier_test.go",
"once_test.go",
"payload_attestations_test.go",
"pending_attestations_queue_bucket_test.go",
"pending_attestations_queue_test.go",
"pending_blocks_queue_test.go",
@@ -266,7 +263,6 @@ go_test(
"//config/fieldparams:go_default_library",
"//config/params:go_default_library",
"//consensus-types/blocks:go_default_library",
"//consensus-types/epbs/payload-attestation:go_default_library",
"//consensus-types/interfaces:go_default_library",
"//consensus-types/primitives:go_default_library",
"//consensus-types/wrapper:go_default_library",

View File

@@ -207,13 +207,6 @@ func WithTrackedValidatorsCache(c *cache.TrackedValidatorsCache) Option {
}
}
func WithPayloadAttestationCache(r *cache.PayloadAttestationCache) Option {
return func(s *Service) error {
s.payloadAttestationCache = r
return nil
}
}
// WithSlasherEnabled configures the sync package to support slashing detection.
func WithSlasherEnabled(enabled bool) Option {
return func(s *Service) error {

View File

@@ -1,94 +0,0 @@
package sync
import (
"context"
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p"
"github.com/OffchainLabs/prysm/v7/beacon-chain/verification"
payloadattestation "github.com/OffchainLabs/prysm/v7/consensus-types/epbs/payload-attestation"
"github.com/OffchainLabs/prysm/v7/monitoring/tracing"
"github.com/OffchainLabs/prysm/v7/monitoring/tracing/trace"
eth "github.com/OffchainLabs/prysm/v7/proto/prysm/v1alpha1"
pubsub "github.com/libp2p/go-libp2p-pubsub"
"github.com/libp2p/go-libp2p/core/peer"
"github.com/pkg/errors"
"google.golang.org/protobuf/proto"
)
var (
errAlreadySeenPayloadAttestation = errors.New("payload attestation already seen for validator index")
)
func (s *Service) validatePayloadAttestation(ctx context.Context, pid peer.ID, msg *pubsub.Message) (pubsub.ValidationResult, error) {
if pid == s.cfg.p2p.PeerID() {
return pubsub.ValidationAccept, nil
}
if s.cfg.initialSync.Syncing() {
return pubsub.ValidationIgnore, nil
}
ctx, span := trace.StartSpan(ctx, "sync.validatePayloadAttestation")
defer span.End()
if msg.Topic == nil {
return pubsub.ValidationReject, p2p.ErrInvalidTopic
}
m, err := s.decodePubsubMessage(msg)
if err != nil {
tracing.AnnotateError(span, err)
return pubsub.ValidationReject, err
}
att, ok := m.(*eth.PayloadAttestationMessage)
if !ok {
return pubsub.ValidationReject, errWrongMessage
}
pa, err := payloadattestation.NewReadOnly(att)
if err != nil {
log.WithError(err).Error("Failed to create read only payload attestation")
return pubsub.ValidationIgnore, err
}
v := s.newPayloadAttestationVerifier(pa, verification.GossipPayloadAttestationMessageRequirements)
if err := v.VerifyCurrentSlot(); err != nil {
return pubsub.ValidationIgnore, err
}
if err := v.VerifyPayloadStatus(); err != nil {
return pubsub.ValidationReject, err
}
if err := v.VerifyBlockRootSeen(s.hasBadBlock); err != nil {
return pubsub.ValidationIgnore, err
}
if err := v.VerifyBlockRootValid(s.hasBadBlock); err != nil {
return pubsub.ValidationReject, err
}
st, err := s.cfg.chain.HeadState(ctx)
if err != nil {
return pubsub.ValidationIgnore, err
}
if err := v.VerifyValidatorInPTC(ctx, st); err != nil {
return pubsub.ValidationReject, err
}
if err := v.VerifySignature(st); err != nil {
return pubsub.ValidationReject, err
}
if s.payloadAttestationCache.Seen(pa.BeaconBlockRoot(), uint64(pa.ValidatorIndex())) {
return pubsub.ValidationIgnore, errAlreadySeenPayloadAttestation
}
msg.ValidatorData = att
return pubsub.ValidationAccept, nil
}
func (s *Service) payloadAttestationSubscriber(ctx context.Context, msg proto.Message) error {
a, ok := msg.(*eth.PayloadAttestationMessage)
if !ok {
return errWrongMessage
}
return s.cfg.chain.ReceivePayloadAttestationMessage(ctx, a)
}

View File

@@ -1,172 +0,0 @@
package sync
import (
"bytes"
"context"
"reflect"
"testing"
"time"
mock "github.com/OffchainLabs/prysm/v7/beacon-chain/blockchain/testing"
"github.com/OffchainLabs/prysm/v7/beacon-chain/cache"
"github.com/OffchainLabs/prysm/v7/beacon-chain/p2p"
p2ptest "github.com/OffchainLabs/prysm/v7/beacon-chain/p2p/testing"
"github.com/OffchainLabs/prysm/v7/beacon-chain/startup"
mockSync "github.com/OffchainLabs/prysm/v7/beacon-chain/sync/initial-sync/testing"
"github.com/OffchainLabs/prysm/v7/beacon-chain/verification"
fieldparams "github.com/OffchainLabs/prysm/v7/config/fieldparams"
"github.com/OffchainLabs/prysm/v7/config/params"
payloadattestation "github.com/OffchainLabs/prysm/v7/consensus-types/epbs/payload-attestation"
ethpb "github.com/OffchainLabs/prysm/v7/proto/prysm/v1alpha1"
"github.com/OffchainLabs/prysm/v7/testing/require"
"github.com/OffchainLabs/prysm/v7/testing/util"
pubsub "github.com/libp2p/go-libp2p-pubsub"
pb "github.com/libp2p/go-libp2p-pubsub/pb"
"github.com/pkg/errors"
)
func TestValidatePayloadAttestationMessage_IncorrectTopic(t *testing.T) {
ctx := context.Background()
p := p2ptest.NewTestP2P(t)
chainService := &mock.ChainService{Genesis: time.Unix(time.Now().Unix()-int64(params.BeaconConfig().SecondsPerSlot), 0)}
s := &Service{
payloadAttestationCache: &cache.PayloadAttestationCache{},
cfg: &config{chain: chainService, p2p: p, initialSync: &mockSync.Sync{}, clock: startup.NewClock(chainService.Genesis, chainService.ValidatorsRoot)}}
msg := util.HydratePayloadAttestation(&ethpb.PayloadAttestation{}) // Using payload attestation for message should fail.
buf := new(bytes.Buffer)
_, err := p.Encoding().EncodeGossip(buf, msg)
require.NoError(t, err)
topic := p2p.GossipTypeMapping[reflect.TypeFor[*ethpb.PayloadAttestation]()]
digest, err := s.currentForkDigest()
require.NoError(t, err)
topic = s.addDigestToTopic(topic, digest)
result, err := s.validatePayloadAttestation(ctx, "", &pubsub.Message{
Message: &pb.Message{
Data: buf.Bytes(),
Topic: &topic,
}})
require.ErrorContains(t, "extraction failed for topic", err)
require.Equal(t, result, pubsub.ValidationReject)
}
func TestValidatePayloadAttestationMessage_ErrorPathsWithMock(t *testing.T) {
tests := []struct {
error error
verifier verification.NewPayloadAttestationMsgVerifier
result pubsub.ValidationResult
}{
{
error: errors.New("incorrect slot"),
verifier: func(pa payloadattestation.ROMessage, reqs []verification.Requirement) verification.PayloadAttestationMsgVerifier {
return &verification.MockPayloadAttestation{ErrIncorrectPayloadAttSlot: errors.New("incorrect slot")}
},
result: pubsub.ValidationIgnore,
},
{
error: errors.New("incorrect status"),
verifier: func(pa payloadattestation.ROMessage, reqs []verification.Requirement) verification.PayloadAttestationMsgVerifier {
return &verification.MockPayloadAttestation{ErrIncorrectPayloadAttStatus: errors.New("incorrect status")}
},
result: pubsub.ValidationReject,
},
{
error: errors.New("block root seen"),
verifier: func(pa payloadattestation.ROMessage, reqs []verification.Requirement) verification.PayloadAttestationMsgVerifier {
return &verification.MockPayloadAttestation{ErrPayloadAttBlockRootNotSeen: errors.New("block root seen")}
},
result: pubsub.ValidationIgnore,
},
{
error: errors.New("block root invalid"),
verifier: func(pa payloadattestation.ROMessage, reqs []verification.Requirement) verification.PayloadAttestationMsgVerifier {
return &verification.MockPayloadAttestation{ErrPayloadAttBlockRootInvalid: errors.New("block root invalid")}
},
result: pubsub.ValidationReject,
},
{
error: errors.New("validator not in PTC"),
verifier: func(pa payloadattestation.ROMessage, reqs []verification.Requirement) verification.PayloadAttestationMsgVerifier {
return &verification.MockPayloadAttestation{ErrIncorrectPayloadAttValidator: errors.New("validator not in PTC")}
},
result: pubsub.ValidationReject,
},
{
error: errors.New("incorrect signature"),
verifier: func(pa payloadattestation.ROMessage, reqs []verification.Requirement) verification.PayloadAttestationMsgVerifier {
return &verification.MockPayloadAttestation{ErrInvalidMessageSignature: errors.New("incorrect signature")}
},
result: pubsub.ValidationReject,
},
}
for _, tt := range tests {
t.Run(tt.error.Error(), func(t *testing.T) {
ctx := context.Background()
p := p2ptest.NewTestP2P(t)
chainService := &mock.ChainService{Genesis: time.Unix(time.Now().Unix()-int64(params.BeaconConfig().SecondsPerSlot), 0)}
s := &Service{
payloadAttestationCache: &cache.PayloadAttestationCache{},
cfg: &config{chain: chainService, p2p: p, initialSync: &mockSync.Sync{}, clock: startup.NewClock(chainService.Genesis, chainService.ValidatorsRoot)}}
s.newPayloadAttestationVerifier = tt.verifier
msg := newPayloadAttestationMessage()
buf := new(bytes.Buffer)
_, err := p.Encoding().EncodeGossip(buf, msg)
require.NoError(t, err)
topic := p2p.GossipTypeMapping[reflect.TypeFor[*ethpb.PayloadAttestationMessage]()]
digest, err := s.currentForkDigest()
require.NoError(t, err)
topic = s.addDigestToTopic(topic, digest)
result, err := s.validatePayloadAttestation(ctx, "", &pubsub.Message{
Message: &pb.Message{
Data: buf.Bytes(),
Topic: &topic,
}})
require.ErrorContains(t, tt.error.Error(), err)
require.Equal(t, result, tt.result)
})
}
}
func TestValidatePayloadAttestationMessage_Accept(t *testing.T) {
ctx := context.Background()
p := p2ptest.NewTestP2P(t)
chainService := &mock.ChainService{Genesis: time.Unix(time.Now().Unix()-int64(params.BeaconConfig().SecondsPerSlot), 0)}
s := &Service{
payloadAttestationCache: &cache.PayloadAttestationCache{},
cfg: &config{chain: chainService, p2p: p, initialSync: &mockSync.Sync{}, clock: startup.NewClock(chainService.Genesis, chainService.ValidatorsRoot)}}
s.newPayloadAttestationVerifier = func(pa payloadattestation.ROMessage, reqs []verification.Requirement) verification.PayloadAttestationMsgVerifier {
return &verification.MockPayloadAttestation{}
}
msg := newPayloadAttestationMessage()
buf := new(bytes.Buffer)
_, err := p.Encoding().EncodeGossip(buf, msg)
require.NoError(t, err)
topic := p2p.GossipTypeMapping[reflect.TypeFor[*ethpb.PayloadAttestationMessage]()]
digest, err := s.currentForkDigest()
require.NoError(t, err)
topic = s.addDigestToTopic(topic, digest)
result, err := s.validatePayloadAttestation(ctx, "", &pubsub.Message{
Message: &pb.Message{
Data: buf.Bytes(),
Topic: &topic,
}})
require.NoError(t, err)
require.Equal(t, result, pubsub.ValidationAccept)
}
func newPayloadAttestationMessage() *ethpb.PayloadAttestationMessage {
return &ethpb.PayloadAttestationMessage{
ValidatorIndex: 0,
Data: util.HydratePayloadAttestationData(&ethpb.PayloadAttestationData{Slot: 1}),
Signature: make([]byte, fieldparams.BLSSignatureLength),
}
}

View File

@@ -37,7 +37,6 @@ import (
"github.com/OffchainLabs/prysm/v7/cmd/beacon-chain/flags"
"github.com/OffchainLabs/prysm/v7/config/params"
"github.com/OffchainLabs/prysm/v7/consensus-types/blocks"
payloadattestation "github.com/OffchainLabs/prysm/v7/consensus-types/epbs/payload-attestation"
"github.com/OffchainLabs/prysm/v7/consensus-types/interfaces"
"github.com/OffchainLabs/prysm/v7/consensus-types/primitives"
leakybucket "github.com/OffchainLabs/prysm/v7/container/leaky-bucket"
@@ -122,7 +121,6 @@ type blockchainService interface {
blockchain.FinalizationFetcher
blockchain.ForkFetcher
blockchain.AttestationReceiver
blockchain.PayloadAttestationReceiver
blockchain.TimeFetcher
blockchain.GenesisFetcher
blockchain.CanonicalFetcher
@@ -175,7 +173,6 @@ type Service struct {
verifierWaiter *verification.InitializerWaiter
newBlobVerifier verification.NewBlobVerifier
newColumnsVerifier verification.NewDataColumnsVerifier
newPayloadAttestationVerifier verification.NewPayloadAttestationMsgVerifier
columnSidecarsExecSingleFlight singleflight.Group
reconstructionSingleFlight singleflight.Group
availableBlocker coverage.AvailableBlocker
@@ -185,7 +182,6 @@ type Service struct {
slasherEnabled bool
lcStore *lightClient.Store
dataColumnLogCh chan dataColumnLogEntry
payloadAttestationCache *cache.PayloadAttestationCache
digestActions perDigestSet
subscriptionSpawner func(func()) // see Service.spawn for details
}
@@ -194,16 +190,15 @@ type Service struct {
func NewService(ctx context.Context, opts ...Option) *Service {
ctx, cancel := context.WithCancel(ctx)
r := &Service{
ctx: ctx,
cancel: cancel,
chainStarted: abool.New(),
cfg: &config{clock: startup.NewClock(time.Unix(0, 0), [32]byte{})},
slotToPendingBlocks: gcache.New(pendingBlockExpTime /* exp time */, 0 /* disable janitor */),
seenPendingBlocks: make(map[[32]byte]bool),
blkRootToPendingAtts: make(map[[32]byte][]any),
dataColumnLogCh: make(chan dataColumnLogEntry, 1000),
reconstructionRandGen: rand.NewGenerator(),
payloadAttestationCache: &cache.PayloadAttestationCache{},
ctx: ctx,
cancel: cancel,
chainStarted: abool.New(),
cfg: &config{clock: startup.NewClock(time.Unix(0, 0), [32]byte{})},
slotToPendingBlocks: gcache.New(pendingBlockExpTime /* exp time */, 0 /* disable janitor */),
seenPendingBlocks: make(map[[32]byte]bool),
blkRootToPendingAtts: make(map[[32]byte][]any),
dataColumnLogCh: make(chan dataColumnLogEntry, 1000),
reconstructionRandGen: rand.NewGenerator(),
}
for _, opt := range opts {
@@ -255,12 +250,6 @@ func newDataColumnsVerifierFromInitializer(ini *verification.Initializer) verifi
}
}
func newPayloadAttestationMessageFromInitializer(ini *verification.Initializer) verification.NewPayloadAttestationMsgVerifier {
return func(pa payloadattestation.ROMessage, reqs []verification.Requirement) verification.PayloadAttestationMsgVerifier {
return ini.NewPayloadAttestationMsgVerifier(pa, reqs)
}
}
// Start the regular sync service.
func (s *Service) Start() {
v, err := s.verifierWaiter.WaitForInitializer(s.ctx)
@@ -270,7 +259,6 @@ func (s *Service) Start() {
}
s.newBlobVerifier = newBlobVerifierFromInitializer(v)
s.newColumnsVerifier = newDataColumnsVerifierFromInitializer(v)
s.newPayloadAttestationVerifier = newPayloadAttestationMessageFromInitializer(v)
go s.verifierRoutine()
go s.startDiscoveryAndSubscriptions()

View File

@@ -7,25 +7,20 @@ go_library(
"blob.go",
"cache.go",
"data_column.go",
"epbs.go",
"error.go",
"fake.go",
"filesystem.go",
"initializer.go",
"initializer_epbs.go",
"interface.go",
"log.go",
"metrics.go",
"mock.go",
"payload_attestation.go",
"payload_attestation_mock.go",
"result.go",
],
importpath = "github.com/OffchainLabs/prysm/v7/beacon-chain/verification",
visibility = ["//visibility:public"],
deps = [
"//beacon-chain/blockchain/kzg:go_default_library",
"//beacon-chain/core/gloas:go_default_library",
"//beacon-chain/core/helpers:go_default_library",
"//beacon-chain/core/peerdas:go_default_library",
"//beacon-chain/core/signing:go_default_library",
@@ -37,7 +32,6 @@ go_library(
"//config/fieldparams:go_default_library",
"//config/params:go_default_library",
"//consensus-types/blocks:go_default_library",
"//consensus-types/epbs/payload-attestation:go_default_library",
"//consensus-types/primitives:go_default_library",
"//crypto/bls:go_default_library",
"//encoding/bytesutil:go_default_library",

View File

@@ -1,24 +0,0 @@
package verification
import (
"context"
"github.com/OffchainLabs/prysm/v7/beacon-chain/state"
payloadattestation "github.com/OffchainLabs/prysm/v7/consensus-types/epbs/payload-attestation"
)
// PayloadAttestationMsgVerifier defines the methods implemented by the ROPayloadAttestation.
type PayloadAttestationMsgVerifier interface {
VerifyCurrentSlot() error
VerifyPayloadStatus() error
VerifyBlockRootSeen(func([32]byte) bool) error
VerifyBlockRootValid(func([32]byte) bool) error
VerifyValidatorInPTC(context.Context, state.BeaconState) error
VerifySignature(state.BeaconState) error
VerifiedPayloadAttestation() (payloadattestation.VerifiedROMessage, error)
SatisfyRequirement(Requirement)
}
// NewPayloadAttestationMsgVerifier is a function signature that can be used by code that needs to be
// able to mock Initializer.NewPayloadAttestationMsgVerifier without complex setup.
type NewPayloadAttestationMsgVerifier func(pa payloadattestation.ROMessage, reqs []Requirement) PayloadAttestationMsgVerifier

View File

@@ -1,15 +0,0 @@
package verification
import (
payloadattestation "github.com/OffchainLabs/prysm/v7/consensus-types/epbs/payload-attestation"
)
// NewPayloadAttestationMsgVerifier creates a PayloadAttestationMsgVerifier for a single payload attestation message,
// with the given set of requirements.
func (ini *Initializer) NewPayloadAttestationMsgVerifier(pa payloadattestation.ROMessage, reqs []Requirement) *PayloadAttMsgVerifier {
return &PayloadAttMsgVerifier{
sharedResources: ini.shared,
results: newResults(reqs...),
pa: pa,
}
}

View File

@@ -1,218 +0,0 @@
package verification
import (
"context"
"fmt"
"slices"
"github.com/OffchainLabs/prysm/v7/beacon-chain/core/gloas"
"github.com/OffchainLabs/prysm/v7/beacon-chain/core/signing"
"github.com/OffchainLabs/prysm/v7/beacon-chain/state"
"github.com/OffchainLabs/prysm/v7/config/params"
payloadattestation "github.com/OffchainLabs/prysm/v7/consensus-types/epbs/payload-attestation"
"github.com/OffchainLabs/prysm/v7/crypto/bls"
"github.com/OffchainLabs/prysm/v7/time/slots"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
)
// RequirementList defines a list of requirements.
type RequirementList []Requirement
const (
RequireCurrentSlot Requirement = iota
RequireMessageNotSeen
RequireKnownPayloadStatus
RequireValidatorInPTC
RequireBlockRootSeen
RequireBlockRootValid
RequireSignatureValid
)
// PayloadAttGossipRequirements defines the list of requirements for gossip payload attestation messages.
var PayloadAttGossipRequirements = []Requirement{
RequireCurrentSlot,
RequireMessageNotSeen,
RequireKnownPayloadStatus,
RequireValidatorInPTC,
RequireBlockRootSeen,
RequireBlockRootValid,
RequireSignatureValid,
}
// GossipPayloadAttestationMessageRequirements is a requirement list for gossip payload attestation messages.
var GossipPayloadAttestationMessageRequirements = RequirementList(PayloadAttGossipRequirements)
var (
ErrIncorrectPayloadAttSlot = errors.New("payload att slot does not match the current slot")
ErrIncorrectPayloadAttStatus = errors.New("unknown payload att status")
ErrPayloadAttBlockRootNotSeen = errors.New("block root not seen")
ErrPayloadAttBlockRootInvalid = errors.New("block root invalid")
ErrIncorrectPayloadAttValidator = errors.New("validator not present in payload timeliness committee")
ErrInvalidPayloadAttMessage = errors.New("invalid payload attestation message")
)
var _ PayloadAttestationMsgVerifier = &PayloadAttMsgVerifier{}
// PayloadAttMsgVerifier is a read-only verifier for payload attestation messages.
type PayloadAttMsgVerifier struct {
*sharedResources
results *results
pa payloadattestation.ROMessage
}
// VerifyCurrentSlot verifies if the current slot matches the expected slot.
// Represents the following spec verification:
// [IGNORE] data.slot is the current slot.
func (v *PayloadAttMsgVerifier) VerifyCurrentSlot() (err error) {
defer v.record(RequireCurrentSlot, &err)
if v.pa.Slot() != v.clock.CurrentSlot() {
log.WithFields(logFields(v.pa)).Errorf("does not match current slot %d", v.clock.CurrentSlot())
return ErrIncorrectPayloadAttSlot
}
return nil
}
// VerifyPayloadStatus verifies if the payload status is known.
// In Gloas, payload status is represented by booleans, so there is no invalid enum to reject.
func (v *PayloadAttMsgVerifier) VerifyPayloadStatus() (err error) {
defer v.record(RequireKnownPayloadStatus, &err)
return nil
}
// VerifyBlockRootSeen verifies if the block root has been seen before.
// Represents the following spec verification:
// [IGNORE] The attestation's data.beacon_block_root has been seen (via both gossip and non-gossip sources).
func (v *PayloadAttMsgVerifier) VerifyBlockRootSeen(parentSeen func([32]byte) bool) (err error) {
defer v.record(RequireBlockRootSeen, &err)
if parentSeen != nil && parentSeen(v.pa.BeaconBlockRoot()) {
return nil
}
log.WithFields(logFields(v.pa)).Error(ErrPayloadAttBlockRootNotSeen.Error())
return ErrPayloadAttBlockRootNotSeen
}
// VerifyBlockRootValid verifies if the block root is valid.
// Represents the following spec verification:
// [REJECT] The beacon block with root data.beacon_block_root passes validation.
func (v *PayloadAttMsgVerifier) VerifyBlockRootValid(badBlock func([32]byte) bool) (err error) {
defer v.record(RequireBlockRootValid, &err)
if badBlock != nil && badBlock(v.pa.BeaconBlockRoot()) {
log.WithFields(logFields(v.pa)).Error(ErrPayloadAttBlockRootInvalid.Error())
return ErrPayloadAttBlockRootInvalid
}
return nil
}
// VerifyValidatorInPTC verifies if the validator is present.
// Represents the following spec verification:
// [REJECT] The validator index is within the payload committee in get_ptc(state, data.slot). For the current's slot head state.
func (v *PayloadAttMsgVerifier) VerifyValidatorInPTC(ctx context.Context, st state.BeaconState) (err error) {
defer v.record(RequireValidatorInPTC, &err)
ptc, err := gloas.PayloadTimelinessCommittee(ctx, st, v.pa.Slot())
if err != nil {
return err
}
idx := slices.Index(ptc, v.pa.ValidatorIndex())
if idx == -1 {
log.WithFields(logFields(v.pa)).Error(ErrIncorrectPayloadAttValidator.Error())
return ErrIncorrectPayloadAttValidator
}
return nil
}
// VerifySignature verifies the signature of the payload attestation message.
// Represents the following spec verification:
// [REJECT] The signature of payload_attestation_message.signature is valid with respect to the validator index.
func (v *PayloadAttMsgVerifier) VerifySignature(st state.BeaconState) (err error) {
defer v.record(RequireSignatureValid, &err)
err = validatePayloadAttestationMessageSignature(st, v.pa)
if err != nil {
if errors.Is(err, signing.ErrSigFailedToVerify) {
log.WithFields(logFields(v.pa)).Error("Signature failed to validate")
} else {
log.WithFields(logFields(v.pa)).WithError(err).Error("Could not validate signature")
}
return err
}
return nil
}
// VerifiedPayloadAttestation returns a verified payload attestation message by checking all requirements.
func (v *PayloadAttMsgVerifier) VerifiedPayloadAttestation() (payloadattestation.VerifiedROMessage, error) {
if v.results.allSatisfied() {
return payloadattestation.NewVerifiedROMessage(v.pa), nil
}
return payloadattestation.VerifiedROMessage{}, ErrInvalidPayloadAttMessage
}
// SatisfyRequirement allows the caller to manually mark a requirement as satisfied.
func (v *PayloadAttMsgVerifier) SatisfyRequirement(req Requirement) {
v.record(req, nil)
}
// ValidatePayloadAttestationMessageSignature verifies the signature of a payload attestation message.
func validatePayloadAttestationMessageSignature(st state.BeaconState, payloadAtt payloadattestation.ROMessage) error {
val, err := st.ValidatorAtIndex(payloadAtt.ValidatorIndex())
if err != nil {
return err
}
pub, err := bls.PublicKeyFromBytes(val.PublicKey)
if err != nil {
return err
}
s := payloadAtt.Signature()
sig, err := bls.SignatureFromBytes(s[:])
if err != nil {
return err
}
currentEpoch := slots.ToEpoch(st.Slot())
domain, err := signing.Domain(st.Fork(), currentEpoch, params.BeaconConfig().DomainPTCAttester, st.GenesisValidatorsRoot())
if err != nil {
return err
}
root, err := payloadAtt.SigningRoot(domain)
if err != nil {
return err
}
if !sig.Verify(pub, root[:]) {
return signing.ErrSigFailedToVerify
}
return nil
}
// record records the result of a requirement verification.
func (v *PayloadAttMsgVerifier) record(req Requirement, err *error) {
if err == nil || *err == nil {
v.results.record(req, nil)
return
}
v.results.record(req, *err)
}
// logFields returns log fields for a ROMessage instance.
func logFields(payload payloadattestation.ROMessage) logrus.Fields {
return logrus.Fields{
"slot": payload.Slot(),
"validatorIndex": payload.ValidatorIndex(),
"signature": fmt.Sprintf("%#x", payload.Signature()),
"beaconBlockRoot": fmt.Sprintf("%#x", payload.BeaconBlockRoot()),
"payloadPresent": payload.PayloadPresent(),
"blobDataAvailable": payload.BlobDataAvailable(),
}
}

View File

@@ -1,51 +0,0 @@
package verification
import (
"context"
"github.com/OffchainLabs/prysm/v7/beacon-chain/state"
payloadattestation "github.com/OffchainLabs/prysm/v7/consensus-types/epbs/payload-attestation"
)
type MockPayloadAttestation struct {
ErrIncorrectPayloadAttSlot error
ErrIncorrectPayloadAttStatus error
ErrIncorrectPayloadAttValidator error
ErrPayloadAttBlockRootNotSeen error
ErrPayloadAttBlockRootInvalid error
ErrInvalidPayloadAttMessage error
ErrInvalidMessageSignature error
ErrUnsatisfiedRequirement error
}
var _ PayloadAttestationMsgVerifier = &MockPayloadAttestation{}
func (m *MockPayloadAttestation) VerifyCurrentSlot() error {
return m.ErrIncorrectPayloadAttSlot
}
func (m *MockPayloadAttestation) VerifyPayloadStatus() error {
return m.ErrIncorrectPayloadAttStatus
}
func (m *MockPayloadAttestation) VerifyValidatorInPTC(ctx context.Context, st state.BeaconState) error {
return m.ErrIncorrectPayloadAttValidator
}
func (m *MockPayloadAttestation) VerifyBlockRootSeen(func([32]byte) bool) error {
return m.ErrPayloadAttBlockRootNotSeen
}
func (m *MockPayloadAttestation) VerifyBlockRootValid(func([32]byte) bool) error {
return m.ErrPayloadAttBlockRootInvalid
}
func (m *MockPayloadAttestation) VerifySignature(st state.BeaconState) (err error) {
return m.ErrInvalidMessageSignature
}
func (m *MockPayloadAttestation) VerifiedPayloadAttestation() (payloadattestation.VerifiedROMessage, error) {
return payloadattestation.VerifiedROMessage{}, nil
}
func (m *MockPayloadAttestation) SatisfyRequirement(req Requirement) {}

View File

@@ -1,3 +0,0 @@
### Added
- Set beacon node options after reading the config file.

View File

@@ -0,0 +1,4 @@
### Added
- GET /eth/v1/validator/payload_attestation_data/{slot}
- POST & GET /eth/v1/beacon/pool/payload_attestations

View File

@@ -1,11 +0,0 @@
### Ignored
- moved finding healthy node logic to connection provider and other various cleanup on naming.
### Changed
- Improved node fallback logs.
### Fixed
- a potential race condition when switching hosts quickly and reconnecting to same host on an old connection.

View File

@@ -1,3 +0,0 @@
### Changed
- Improved integrations with ethspecify so specrefs can be used throughout the codebase.

View File

@@ -367,8 +367,17 @@ func startNode(ctx *cli.Context, cancel context.CancelFunc) error {
backfill.BeaconNodeOptions,
das.BeaconNodeOptions,
}
for _, of := range optFuncs {
ofo, err := of(ctx)
if err != nil {
return err
}
if ofo != nil {
opts = append(opts, ofo...)
}
}
beacon, err := node.New(ctx, cancel, optFuncs, opts...)
beacon, err := node.New(ctx, cancel, opts...)
if err != nil {
return fmt.Errorf("unable to start beacon node: %w", err)
}

View File

@@ -1,15 +0,0 @@
load("@prysm//tools/go:def.bzl", "go_library")
go_library(
name = "go_default_library",
srcs = ["readonly_message.go"],
importpath = "github.com/OffchainLabs/prysm/v7/consensus-types/epbs/payload-attestation",
visibility = ["//visibility:public"],
deps = [
"//beacon-chain/core/signing:go_default_library",
"//consensus-types/primitives:go_default_library",
"//encoding/bytesutil:go_default_library",
"//proto/prysm/v1alpha1:go_default_library",
"@com_github_pkg_errors//:go_default_library",
],
)

View File

@@ -1,87 +0,0 @@
package payloadattestation
import (
"github.com/OffchainLabs/prysm/v7/beacon-chain/core/signing"
"github.com/OffchainLabs/prysm/v7/consensus-types/primitives"
"github.com/OffchainLabs/prysm/v7/encoding/bytesutil"
ethpb "github.com/OffchainLabs/prysm/v7/proto/prysm/v1alpha1"
"github.com/pkg/errors"
)
var (
errNilPayloadAttMessage = errors.New("received nil payload attestation message")
errNilPayloadAttData = errors.New("received nil payload attestation data")
errNilPayloadAttSignature = errors.New("received nil payload attestation signature")
)
// ROMessage represents a read-only payload attestation message.
type ROMessage struct {
m *ethpb.PayloadAttestationMessage
}
// validatePayloadAtt checks if the given payload attestation message is valid.
func validatePayloadAtt(m *ethpb.PayloadAttestationMessage) error {
if m == nil {
return errNilPayloadAttMessage
}
if m.Data == nil {
return errNilPayloadAttData
}
if len(m.Signature) == 0 {
return errNilPayloadAttSignature
}
return nil
}
// NewReadOnly creates a new ReadOnly instance after validating the message.
func NewReadOnly(m *ethpb.PayloadAttestationMessage) (ROMessage, error) {
if err := validatePayloadAtt(m); err != nil {
return ROMessage{}, err
}
return ROMessage{m}, nil
}
// ValidatorIndex returns the validator index from the payload attestation message.
func (r *ROMessage) ValidatorIndex() primitives.ValidatorIndex {
return r.m.ValidatorIndex
}
// Signature returns the signature from the payload attestation message.
func (r *ROMessage) Signature() [96]byte {
return bytesutil.ToBytes96(r.m.Signature)
}
// BeaconBlockRoot returns the beacon block root from the payload attestation message.
func (r *ROMessage) BeaconBlockRoot() [32]byte {
return bytesutil.ToBytes32(r.m.Data.BeaconBlockRoot)
}
// Slot returns the slot from the payload attestation message.
func (r *ROMessage) Slot() primitives.Slot {
return r.m.Data.Slot
}
// PayloadPresent returns whether the payload was present.
func (r *ROMessage) PayloadPresent() bool {
return r.m.Data.PayloadPresent
}
// BlobDataAvailable returns whether blob data was available.
func (r *ROMessage) BlobDataAvailable() bool {
return r.m.Data.BlobDataAvailable
}
// SigningRoot returns the signing root from the payload attestation message.
func (r *ROMessage) SigningRoot(domain []byte) ([32]byte, error) {
return signing.ComputeSigningRoot(r.m.Data, domain)
}
// VerifiedROMessage represents a verified read-only payload attestation message.
type VerifiedROMessage struct {
ROMessage
}
// NewVerifiedROMessage creates a new VerifiedROMessage instance after validating the message.
func NewVerifiedROMessage(r ROMessage) VerifiedROMessage {
return VerifiedROMessage{r}
}

View File

@@ -2,38 +2,24 @@ version: v1.7.0-alpha.1
style: full
specrefs:
search_root: .
auto_standardize_names: true
auto_add_missing_entries: true
require_exceptions_have_fork: true
search_root: ..
files:
- specrefs/configs.yml
- specrefs/constants.yml
- specrefs/containers.yml
- specrefs/dataclasses.yml
- specrefs/functions.yml
- specrefs/presets.yml
- configs.yml
- constants.yml
- containers.yml
- dataclasses.yml
- functions.yml
- presets.yml
exceptions:
presets:
# gloas
# Not implemented: gloas (future fork)
- BUILDER_PENDING_WITHDRAWALS_LIMIT#gloas
- MAX_PAYLOAD_ATTESTATIONS#gloas
- PTC_SIZE#gloas
constants:
# phase0
- BASIS_POINTS#phase0
- ENDIANNESS#phase0
- MAX_CONCURRENT_REQUESTS#phase0
- UINT64_MAX#phase0
- UINT64_MAX_SQRT#phase0
# altair
- PARTICIPATION_FLAG_WEIGHTS#altair
# bellatrix
- SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY#bellatrix
# deneb
# Constants in the KZG library
- BLS_MODULUS#deneb
- BYTES_PER_COMMITMENT#deneb
- BYTES_PER_FIELD_ELEMENT#deneb
@@ -47,9 +33,18 @@ exceptions:
- PRIMITIVE_ROOT_OF_UNITY#deneb
- RANDOM_CHALLENGE_KZG_BATCH_DOMAIN#deneb
- RANDOM_CHALLENGE_KZG_CELL_BATCH_DOMAIN#fulu
# fulu
# Not implemented
- BASIS_POINTS#phase0
- ENDIANNESS#phase0
- MAX_CONCURRENT_REQUESTS#phase0
- PARTICIPATION_FLAG_WEIGHTS#altair
- SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY#bellatrix
- UINT256_MAX#fulu
# gloas
- UINT64_MAX#phase0
- UINT64_MAX_SQRT#phase0
# Not implemented: gloas (future fork)
- BUILDER_PAYMENT_THRESHOLD_DENOMINATOR#gloas
- BUILDER_PAYMENT_THRESHOLD_NUMERATOR#gloas
- BUILDER_WITHDRAWAL_PREFIX#gloas
@@ -66,62 +61,61 @@ exceptions:
- PTC_TIMELINESS_INDEX#gloas
configs:
# gloas
# Not implemented: gloas (future fork)
- AGGREGATE_DUE_BPS_GLOAS#gloas
- ATTESTATION_DUE_BPS_GLOAS#gloas
- CONTRIBUTION_DUE_BPS_GLOAS#gloas
- GLOAS_FORK_EPOCH#gloas
- GLOAS_FORK_VERSION#gloas
- MAX_REQUEST_PAYLOADS#gloas
- MIN_BUILDER_WITHDRAWABILITY_DELAY#gloas
- PAYLOAD_ATTESTATION_DUE_BPS#gloas
- SYNC_MESSAGE_DUE_BPS_GLOAS#gloas
- MIN_BUILDER_WITHDRAWABILITY_DELAY#gloas
ssz_objects:
# phase0
# Not implemented
- Eth1Block#phase0
# capella
- MatrixEntry#fulu
# Not implemented: capella
- LightClientBootstrap#capella
- LightClientFinalityUpdate#capella
- LightClientOptimisticUpdate#capella
- LightClientUpdate#capella
# fulu
- MatrixEntry#fulu
# gloas
# Not implemented: gloas (future fork)
- BeaconBlockBody#gloas
- BeaconState#gloas
- Builder#gloas
- BuilderPendingPayment#gloas
- BuilderPendingWithdrawal#gloas
- DataColumnSidecar#gloas
- ExecutionPayloadBid#gloas
- ExecutionPayloadEnvelope#gloas
- ExecutionPayloadBid#gloas
- ForkChoiceNode#gloas
- IndexedPayloadAttestation#gloas
- PayloadAttestation#gloas
- PayloadAttestationData#gloas
- PayloadAttestationMessage#gloas
- ProposerPreferences#gloas
- SignedExecutionPayloadBid#gloas
- SignedExecutionPayloadEnvelope#gloas
- SignedExecutionPayloadBid#gloas
- Builder#gloas
- ProposerPreferences#gloas
- SignedProposerPreferences#gloas
dataclasses:
# phase0
- LatestMessage#phase0
- Store#phase0
# altair
- LightClientStore#altair
# bellatrix
- OptimisticStore#bellatrix
# capella
- ExpectedWithdrawals#capella
- LightClientStore#capella
# electra
- ExpectedWithdrawals#electra
# fulu
# Not implemented
- BlobParameters#fulu
# gloas
- ExpectedWithdrawals#capella
- ExpectedWithdrawals#electra
- LatestMessage#phase0
- LightClientStore#altair
- OptimisticStore#bellatrix
- Store#phase0
# Not implemented: capella
- LightClientStore#capella
# Not implemented: gloas (future fork)
- ExpectedWithdrawals#gloas
- LatestMessage#gloas
- Store#gloas
@@ -181,12 +175,7 @@ exceptions:
- verify_cell_kzg_proof_batch#fulu
- verify_cell_kzg_proof_batch_impl#fulu
# phase0
- update_proposer_boost_root#phase0
- is_proposer_equivocation#phase0
- record_block_timeliness#phase0
- compute_proposer_score#phase0
- get_attestation_score#phase0
# Not implemented: phase0
- calculate_committee_fraction#phase0
- compute_fork_version#phase0
- compute_pulled_up_tip#phase0
@@ -232,7 +221,8 @@ exceptions:
- validate_on_attestation#phase0
- validate_target_epoch_against_current_time#phase0
- xor#phase0
# altair
# Not implemented: altair
- compute_merkle_proof#altair
- compute_sync_committee_period_at_slot#altair
- get_contribution_and_proof#altair
@@ -254,29 +244,27 @@ exceptions:
- process_sync_committee_contributions#altair
- set_or_append_list#altair
- validate_light_client_update#altair
# bellatrix
# Not implemented: bellatrix
- get_execution_payload#bellatrix
- is_merge_transition_block#bellatrix
- is_optimistic_candidate_block#bellatrix
- latest_verified_ancestor#bellatrix
- prepare_execution_payload#bellatrix
# capella
- apply_withdrawals#capella
- get_balance_after_withdrawals#capella
# Not implemented: capella
- get_lc_execution_root#capella
- get_validators_sweep_withdrawals#capella
- is_valid_light_client_header#capella
- prepare_execution_payload#capella
- process_epoch#capella
- update_next_withdrawal_index#capella
- update_next_withdrawal_validator_index#capella
- upgrade_lc_bootstrap_to_capella#capella
- upgrade_lc_finality_update_to_capella#capella
- upgrade_lc_header_to_capella#capella
- upgrade_lc_optimistic_update_to_capella#capella
- upgrade_lc_store_to_capella#capella
- upgrade_lc_update_to_capella#capella
# deneb
# Not implemented: deneb
- get_lc_execution_root#deneb
- is_valid_light_client_header#deneb
- prepare_execution_payload#deneb
@@ -286,34 +274,33 @@ exceptions:
- upgrade_lc_optimistic_update_to_deneb#deneb
- upgrade_lc_store_to_deneb#deneb
- upgrade_lc_update_to_deneb#deneb
# electra
# Not implemented: electra
- compute_weak_subjectivity_period#electra
- current_sync_committee_gindex_at_slot#electra
- finalized_root_gindex_at_slot#electra
- get_eth1_vote#electra
- get_lc_execution_root#electra
- get_pending_partial_withdrawals#electra
- get_validators_sweep_withdrawals#electra
- is_compounding_withdrawal_credential#electra
- is_eligible_for_partial_withdrawals#electra
- is_within_weak_subjectivity_period#electra
- next_sync_committee_gindex_at_slot#electra
- normalize_merkle_branch#electra
- prepare_execution_payload#electra
- update_pending_partial_withdrawals#electra
- upgrade_lc_bootstrap_to_electra#electra
- upgrade_lc_finality_update_to_electra#electra
- upgrade_lc_header_to_electra#electra
- upgrade_lc_optimistic_update_to_electra#electra
- upgrade_lc_store_to_electra#electra
- upgrade_lc_update_to_electra#electra
# fulu
# Not implemented: fulu
- compute_matrix#fulu
- get_blob_parameters#fulu
- get_data_column_sidecars_from_block#fulu
- get_data_column_sidecars_from_column_sidecar#fulu
- recover_matrix#fulu
# gloas
# Not implemented: gloas (future fork)
- compute_balance_weighted_acceptance#gloas
- compute_balance_weighted_selection#gloas
- compute_fork_version#gloas
@@ -381,36 +368,49 @@ exceptions:
- verify_execution_payload_bid_signature#gloas
- add_builder_to_registry#gloas
- apply_deposit_for_builder#gloas
- apply_withdrawals#capella
- apply_withdrawals#gloas
- can_builder_cover_bid#gloas
- compute_proposer_score#phase0
- convert_builder_index_to_validator_index#gloas
- convert_validator_index_to_builder_index#gloas
- get_attestation_score#gloas
- get_attestation_score#phase0
- get_balance_after_withdrawals#capella
- get_builder_from_deposit#gloas
- get_builder_withdrawals#gloas
- get_builders_sweep_withdrawals#gloas
- get_index_for_new_builder#gloas
- get_pending_balance_to_withdraw_for_builder#gloas
- get_pending_partial_withdrawals#electra
- get_proposer_preferences_signature#gloas
- get_upcoming_proposal_slots#gloas
- get_validators_sweep_withdrawals#capella
- get_validators_sweep_withdrawals#electra
- initiate_builder_exit#gloas
- is_active_builder#gloas
- is_builder_index#gloas
- is_eligible_for_partial_withdrawals#electra
- is_head_late#gloas
- is_head_weak#gloas
- is_parent_strong#gloas
- is_proposer_equivocation#phase0
- is_valid_proposal_slot#gloas
- process_deposit_request#gloas
- process_voluntary_exit#gloas
- record_block_timeliness#gloas
- record_block_timeliness#phase0
- should_apply_proposer_boost#gloas
- update_builder_pending_withdrawals#gloas
- update_next_withdrawal_builder_index#gloas
- update_next_withdrawal_index#capella
- update_next_withdrawal_validator_index#capella
- update_payload_expected_withdrawals#gloas
- update_pending_partial_withdrawals#electra
- update_proposer_boost_root#gloas
- update_proposer_boost_root#phase0
presets:
# gloas
- BUILDER_PENDING_WITHDRAWALS_LIMIT#gloas
- BUILDER_REGISTRY_LIMIT#gloas
- MAX_BUILDERS_PER_WITHDRAWALS_SWEEP#gloas

View File

@@ -11,12 +11,17 @@ Install `ethspecify` with the following command:
pipx install ethspecify
```
> [!NOTE]
> You can run `ethspecify <cmd>` in the `specrefs` directory or
> `ethspecify <cmd> --path=specrefs` from the project's root directory.
## Maintenance
When adding support for a new specification version, follow these steps:
0. Change directory into the `specrefs` directory.
1. Update the version in `.ethspecify.yml` configuration.
2. Run `ethspecify` to update/populate specrefs.
2. Run `ethspecify process` to update/populate specrefs.
3. Run `ethspecify check` to check specrefs.
4. If there are errors, use the error message as a guide to fix the issue. If
there are new specrefs with empty sources, implement/locate each item and

View File

@@ -1,4 +1,4 @@
- name: AGGREGATE_DUE_BPS#phase0
- name: AGGREGATE_DUE_BPS
sources:
- file: config/params/config.go
search: AggregateDueBPS\s+primitives.BP
@@ -8,14 +8,7 @@
AGGREGATE_DUE_BPS: uint64 = 6667
</spec>
- name: AGGREGATE_DUE_BPS_GLOAS#gloas
sources: []
spec: |
<spec config_var="AGGREGATE_DUE_BPS_GLOAS" fork="gloas" hash="34aa3164">
AGGREGATE_DUE_BPS_GLOAS: uint64 = 5000
</spec>
- name: ALTAIR_FORK_EPOCH#altair
- name: ALTAIR_FORK_EPOCH
sources:
- file: config/params/config.go
search: AltairForkEpoch\s+primitives.Epoch
@@ -25,7 +18,7 @@
ALTAIR_FORK_EPOCH: Epoch = 74240
</spec>
- name: ALTAIR_FORK_VERSION#altair
- name: ALTAIR_FORK_VERSION
sources:
- file: config/params/config.go
search: AltairForkVersion\s+\[]byte
@@ -35,7 +28,7 @@
ALTAIR_FORK_VERSION: Version = '0x01000000'
</spec>
- name: ATTESTATION_DUE_BPS#phase0
- name: ATTESTATION_DUE_BPS
sources:
- file: config/params/config.go
search: AttestationDueBPS\s+primitives.BP
@@ -45,14 +38,7 @@
ATTESTATION_DUE_BPS: uint64 = 3333
</spec>
- name: ATTESTATION_DUE_BPS_GLOAS#gloas
sources: []
spec: |
<spec config_var="ATTESTATION_DUE_BPS_GLOAS" fork="gloas" hash="3863c1ef">
ATTESTATION_DUE_BPS_GLOAS: uint64 = 2500
</spec>
- name: ATTESTATION_PROPAGATION_SLOT_RANGE#phase0
- name: ATTESTATION_PROPAGATION_SLOT_RANGE
sources:
- file: config/params/config.go
search: AttestationPropagationSlotRange\s+primitives.Slot
@@ -62,7 +48,7 @@
ATTESTATION_PROPAGATION_SLOT_RANGE = 32
</spec>
- name: ATTESTATION_SUBNET_COUNT#phase0
- name: ATTESTATION_SUBNET_COUNT
sources:
- file: config/params/config.go
search: AttestationSubnetCount\s+uint64
@@ -72,7 +58,7 @@
ATTESTATION_SUBNET_COUNT = 64
</spec>
- name: ATTESTATION_SUBNET_EXTRA_BITS#phase0
- name: ATTESTATION_SUBNET_EXTRA_BITS
sources:
- file: config/params/config.go
search: AttestationSubnetExtraBits\s+uint64
@@ -82,7 +68,7 @@
ATTESTATION_SUBNET_EXTRA_BITS = 0
</spec>
- name: ATTESTATION_SUBNET_PREFIX_BITS#phase0
- name: ATTESTATION_SUBNET_PREFIX_BITS
sources:
- file: config/params/config.go
search: AttestationSubnetPrefixBits\s+uint64
@@ -92,7 +78,7 @@
ATTESTATION_SUBNET_PREFIX_BITS: int = 6
</spec>
- name: BALANCE_PER_ADDITIONAL_CUSTODY_GROUP#fulu
- name: BALANCE_PER_ADDITIONAL_CUSTODY_GROUP
sources:
- file: config/params/config.go
search: BalancePerAdditionalCustodyGroup\s+uint64
@@ -102,7 +88,7 @@
BALANCE_PER_ADDITIONAL_CUSTODY_GROUP: Gwei = 32000000000
</spec>
- name: BELLATRIX_FORK_EPOCH#bellatrix
- name: BELLATRIX_FORK_EPOCH
sources:
- file: config/params/config.go
search: BellatrixForkEpoch\s+primitives.Epoch
@@ -112,7 +98,7 @@
BELLATRIX_FORK_EPOCH: Epoch = 144896
</spec>
- name: BELLATRIX_FORK_VERSION#bellatrix
- name: BELLATRIX_FORK_VERSION
sources:
- file: config/params/config.go
search: BellatrixForkVersion\s+\[]byte
@@ -122,7 +108,7 @@
BELLATRIX_FORK_VERSION: Version = '0x02000000'
</spec>
- name: BLOB_SCHEDULE#fulu
- name: BLOB_SCHEDULE
sources:
- file: config/params/config.go
search: BlobSchedule\s+\[]BlobScheduleEntry
@@ -141,7 +127,7 @@
)
</spec>
- name: BLOB_SIDECAR_SUBNET_COUNT#deneb
- name: BLOB_SIDECAR_SUBNET_COUNT
sources:
- file: config/params/config.go
search: BlobsidecarSubnetCount\s+uint64
@@ -151,7 +137,7 @@
BLOB_SIDECAR_SUBNET_COUNT = 6
</spec>
- name: BLOB_SIDECAR_SUBNET_COUNT_ELECTRA#electra
- name: BLOB_SIDECAR_SUBNET_COUNT_ELECTRA
sources:
- file: config/params/config.go
search: BlobsidecarSubnetCountElectra\s+uint64
@@ -161,7 +147,7 @@
BLOB_SIDECAR_SUBNET_COUNT_ELECTRA = 9
</spec>
- name: CAPELLA_FORK_EPOCH#capella
- name: CAPELLA_FORK_EPOCH
sources:
- file: config/params/config.go
search: CapellaForkEpoch\s+primitives.Epoch
@@ -171,7 +157,7 @@
CAPELLA_FORK_EPOCH: Epoch = 194048
</spec>
- name: CAPELLA_FORK_VERSION#capella
- name: CAPELLA_FORK_VERSION
sources:
- file: config/params/config.go
search: CapellaForkVersion\s+\[]byte
@@ -181,7 +167,7 @@
CAPELLA_FORK_VERSION: Version = '0x03000000'
</spec>
- name: CHURN_LIMIT_QUOTIENT#phase0
- name: CHURN_LIMIT_QUOTIENT
sources:
- file: config/params/config.go
search: ChurnLimitQuotient\s+uint64
@@ -191,7 +177,7 @@
CHURN_LIMIT_QUOTIENT: uint64 = 65536
</spec>
- name: CONTRIBUTION_DUE_BPS#altair
- name: CONTRIBUTION_DUE_BPS
sources:
- file: config/params/config.go
search: ContributionDueBPS\s+primitives.BP
@@ -201,14 +187,7 @@
CONTRIBUTION_DUE_BPS: uint64 = 6667
</spec>
- name: CONTRIBUTION_DUE_BPS_GLOAS#gloas
sources: []
spec: |
<spec config_var="CONTRIBUTION_DUE_BPS_GLOAS" fork="gloas" hash="0ead2ac1">
CONTRIBUTION_DUE_BPS_GLOAS: uint64 = 5000
</spec>
- name: CUSTODY_REQUIREMENT#fulu
- name: CUSTODY_REQUIREMENT
sources:
- file: config/params/config.go
search: CustodyRequirement\s+uint64.*yaml:"CUSTODY_REQUIREMENT"
@@ -218,7 +197,7 @@
CUSTODY_REQUIREMENT = 4
</spec>
- name: DATA_COLUMN_SIDECAR_SUBNET_COUNT#fulu
- name: DATA_COLUMN_SIDECAR_SUBNET_COUNT
sources:
- file: config/params/config.go
search: DataColumnSidecarSubnetCount\s+uint64
@@ -228,7 +207,7 @@
DATA_COLUMN_SIDECAR_SUBNET_COUNT = 128
</spec>
- name: DENEB_FORK_EPOCH#deneb
- name: DENEB_FORK_EPOCH
sources:
- file: config/params/config.go
search: DenebForkEpoch\s+primitives.Epoch
@@ -238,7 +217,7 @@
DENEB_FORK_EPOCH: Epoch = 269568
</spec>
- name: DENEB_FORK_VERSION#deneb
- name: DENEB_FORK_VERSION
sources:
- file: config/params/config.go
search: DenebForkVersion\s+\[]byte
@@ -248,7 +227,7 @@
DENEB_FORK_VERSION: Version = '0x04000000'
</spec>
- name: EJECTION_BALANCE#phase0
- name: EJECTION_BALANCE
sources:
- file: config/params/config.go
search: EjectionBalance\s+uint64
@@ -258,7 +237,7 @@
EJECTION_BALANCE: Gwei = 16000000000
</spec>
- name: ELECTRA_FORK_EPOCH#electra
- name: ELECTRA_FORK_EPOCH
sources:
- file: config/params/config.go
search: ElectraForkEpoch\s+primitives.Epoch
@@ -268,7 +247,7 @@
ELECTRA_FORK_EPOCH: Epoch = 364032
</spec>
- name: ELECTRA_FORK_VERSION#electra
- name: ELECTRA_FORK_VERSION
sources:
- file: config/params/config.go
search: ElectraForkVersion\s+\[]byte
@@ -278,7 +257,7 @@
ELECTRA_FORK_VERSION: Version = '0x05000000'
</spec>
- name: EPOCHS_PER_SUBNET_SUBSCRIPTION#phase0
- name: EPOCHS_PER_SUBNET_SUBSCRIPTION
sources:
- file: config/params/config.go
search: EpochsPerSubnetSubscription\s+uint64
@@ -288,7 +267,7 @@
EPOCHS_PER_SUBNET_SUBSCRIPTION = 256
</spec>
- name: ETH1_FOLLOW_DISTANCE#phase0
- name: ETH1_FOLLOW_DISTANCE
sources:
- file: config/params/config.go
search: Eth1FollowDistance\s+uint64
@@ -298,7 +277,7 @@
ETH1_FOLLOW_DISTANCE: uint64 = 2048
</spec>
- name: FULU_FORK_EPOCH#fulu
- name: FULU_FORK_EPOCH
sources:
- file: config/params/config.go
search: FuluForkEpoch\s+primitives.Epoch
@@ -308,7 +287,7 @@
FULU_FORK_EPOCH: Epoch = 411392
</spec>
- name: FULU_FORK_VERSION#fulu
- name: FULU_FORK_VERSION
sources:
- file: config/params/config.go
search: FuluForkVersion\s+\[]byte
@@ -318,7 +297,7 @@
FULU_FORK_VERSION: Version = '0x06000000'
</spec>
- name: GENESIS_DELAY#phase0
- name: GENESIS_DELAY
sources:
- file: config/params/config.go
search: GenesisDelay\s+uint64
@@ -328,7 +307,7 @@
GENESIS_DELAY: uint64 = 604800
</spec>
- name: GENESIS_FORK_VERSION#phase0
- name: GENESIS_FORK_VERSION
sources:
- file: config/params/config.go
search: GenesisForkVersion\s+\[]byte
@@ -338,21 +317,7 @@
GENESIS_FORK_VERSION: Version = '0x00000000'
</spec>
- name: GLOAS_FORK_EPOCH#gloas
sources: []
spec: |
<spec config_var="GLOAS_FORK_EPOCH" fork="gloas" hash="c25152cf">
GLOAS_FORK_EPOCH: Epoch = 18446744073709551615
</spec>
- name: GLOAS_FORK_VERSION#gloas
sources: []
spec: |
<spec config_var="GLOAS_FORK_VERSION" fork="gloas" hash="c1c5c007">
GLOAS_FORK_VERSION: Version = '0x07000000'
</spec>
- name: INACTIVITY_SCORE_BIAS#altair
- name: INACTIVITY_SCORE_BIAS
sources:
- file: config/params/config.go
search: InactivityScoreBias\s+uint64
@@ -362,7 +327,7 @@
INACTIVITY_SCORE_BIAS: uint64 = 4
</spec>
- name: INACTIVITY_SCORE_RECOVERY_RATE#altair
- name: INACTIVITY_SCORE_RECOVERY_RATE
sources:
- file: config/params/config.go
search: InactivityScoreRecoveryRate\s+uint64
@@ -372,7 +337,7 @@
INACTIVITY_SCORE_RECOVERY_RATE: uint64 = 16
</spec>
- name: MAXIMUM_GOSSIP_CLOCK_DISPARITY#phase0
- name: MAXIMUM_GOSSIP_CLOCK_DISPARITY
sources:
- file: config/params/config.go
search: MaximumGossipClockDisparity\s+uint64
@@ -382,7 +347,7 @@
MAXIMUM_GOSSIP_CLOCK_DISPARITY = 500
</spec>
- name: MAX_BLOBS_PER_BLOCK#deneb
- name: MAX_BLOBS_PER_BLOCK
sources:
- file: config/params/config.go
search: DeprecatedMaxBlobsPerBlock\s+int
@@ -392,7 +357,7 @@
MAX_BLOBS_PER_BLOCK: uint64 = 6
</spec>
- name: MAX_BLOBS_PER_BLOCK_ELECTRA#electra
- name: MAX_BLOBS_PER_BLOCK_ELECTRA
sources:
- file: config/params/config.go
search: DeprecatedMaxBlobsPerBlockElectra\s+int
@@ -402,7 +367,7 @@
MAX_BLOBS_PER_BLOCK_ELECTRA: uint64 = 9
</spec>
- name: MAX_PAYLOAD_SIZE#phase0
- name: MAX_PAYLOAD_SIZE
sources:
- file: config/params/config.go
search: MaxPayloadSize\s+uint64
@@ -412,7 +377,7 @@
MAX_PAYLOAD_SIZE = 10485760
</spec>
- name: MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT#deneb
- name: MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT
sources:
- file: config/params/config.go
search: MaxPerEpochActivationChurnLimit\s+uint64
@@ -422,7 +387,7 @@
MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT: uint64 = 8
</spec>
- name: MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT#electra
- name: MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT
sources:
- file: config/params/config.go
search: MaxPerEpochActivationExitChurnLimit\s+uint64
@@ -432,7 +397,7 @@
MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT: Gwei = 256000000000
</spec>
- name: MAX_REQUEST_BLOB_SIDECARS#deneb
- name: MAX_REQUEST_BLOB_SIDECARS
sources:
- file: config/params/config.go
search: MaxRequestBlobSidecars\s+uint64
@@ -442,7 +407,7 @@
MAX_REQUEST_BLOB_SIDECARS = 768
</spec>
- name: MAX_REQUEST_BLOB_SIDECARS_ELECTRA#electra
- name: MAX_REQUEST_BLOB_SIDECARS_ELECTRA
sources:
- file: config/params/config.go
search: MaxRequestBlobSidecarsElectra\s+uint64
@@ -452,7 +417,7 @@
MAX_REQUEST_BLOB_SIDECARS_ELECTRA = 1152
</spec>
- name: MAX_REQUEST_BLOCKS#phase0
- name: MAX_REQUEST_BLOCKS
sources:
- file: config/params/config.go
search: MaxRequestBlocks\s+uint64
@@ -462,7 +427,7 @@
MAX_REQUEST_BLOCKS = 1024
</spec>
- name: MAX_REQUEST_BLOCKS_DENEB#deneb
- name: MAX_REQUEST_BLOCKS_DENEB
sources:
- file: config/params/config.go
search: MaxRequestBlocksDeneb\s+uint64
@@ -472,7 +437,7 @@
MAX_REQUEST_BLOCKS_DENEB = 128
</spec>
- name: MAX_REQUEST_DATA_COLUMN_SIDECARS#fulu
- name: MAX_REQUEST_DATA_COLUMN_SIDECARS
sources:
- file: config/params/config.go
search: MaxRequestDataColumnSidecars\s+uint64
@@ -482,14 +447,7 @@
MAX_REQUEST_DATA_COLUMN_SIDECARS = 16384
</spec>
- name: MAX_REQUEST_PAYLOADS#gloas
sources: []
spec: |
<spec config_var="MAX_REQUEST_PAYLOADS" fork="gloas" hash="23399ee5">
MAX_REQUEST_PAYLOADS = 128
</spec>
- name: MESSAGE_DOMAIN_INVALID_SNAPPY#phase0
- name: MESSAGE_DOMAIN_INVALID_SNAPPY
sources:
- file: config/params/config.go
search: MessageDomainInvalidSnappy\s+\[4\]byte
@@ -499,7 +457,7 @@
MESSAGE_DOMAIN_INVALID_SNAPPY: DomainType = '0x00000000'
</spec>
- name: MESSAGE_DOMAIN_VALID_SNAPPY#phase0
- name: MESSAGE_DOMAIN_VALID_SNAPPY
sources:
- file: config/params/config.go
search: MessageDomainValidSnappy\s+\[4\]byte
@@ -509,14 +467,7 @@
MESSAGE_DOMAIN_VALID_SNAPPY: DomainType = '0x01000000'
</spec>
- name: MIN_BUILDER_WITHDRAWABILITY_DELAY#gloas
sources: []
spec: |
<spec config_var="MIN_BUILDER_WITHDRAWABILITY_DELAY" fork="gloas" hash="d378428f">
MIN_BUILDER_WITHDRAWABILITY_DELAY: uint64 = 4096
</spec>
- name: MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS#deneb
- name: MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS
sources:
- file: config/params/config.go
search: MinEpochsForBlobsSidecarsRequest\s+primitives.Epoch
@@ -526,7 +477,7 @@
MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS = 4096
</spec>
- name: MIN_EPOCHS_FOR_BLOCK_REQUESTS#phase0
- name: MIN_EPOCHS_FOR_BLOCK_REQUESTS
sources:
- file: config/params/config.go
search: MinEpochsForBlockRequests\s+uint64
@@ -536,7 +487,7 @@
MIN_EPOCHS_FOR_BLOCK_REQUESTS = 33024
</spec>
- name: MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS#fulu
- name: MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS
sources:
- file: config/params/config.go
search: MinEpochsForDataColumnSidecarsRequest\s+primitives.Epoch
@@ -546,7 +497,7 @@
MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS = 4096
</spec>
- name: MIN_GENESIS_ACTIVE_VALIDATOR_COUNT#phase0
- name: MIN_GENESIS_ACTIVE_VALIDATOR_COUNT
sources:
- file: config/params/config.go
search: MinGenesisActiveValidatorCount\s+uint64
@@ -556,7 +507,7 @@
MIN_GENESIS_ACTIVE_VALIDATOR_COUNT: uint64 = 16384
</spec>
- name: MIN_GENESIS_TIME#phase0
- name: MIN_GENESIS_TIME
sources:
- file: config/params/config.go
search: MinGenesisTime\s+uint64
@@ -566,7 +517,7 @@
MIN_GENESIS_TIME: uint64 = 1606824000
</spec>
- name: MIN_PER_EPOCH_CHURN_LIMIT#phase0
- name: MIN_PER_EPOCH_CHURN_LIMIT
sources:
- file: config/params/config.go
search: MinPerEpochChurnLimit\s+uint64
@@ -576,7 +527,7 @@
MIN_PER_EPOCH_CHURN_LIMIT: uint64 = 4
</spec>
- name: MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA#electra
- name: MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA
sources:
- file: config/params/config.go
search: MinPerEpochChurnLimitElectra\s+uint64
@@ -586,7 +537,7 @@
MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA: Gwei = 128000000000
</spec>
- name: MIN_VALIDATOR_WITHDRAWABILITY_DELAY#phase0
- name: MIN_VALIDATOR_WITHDRAWABILITY_DELAY
sources:
- file: config/params/config.go
search: MinValidatorWithdrawabilityDelay\s+primitives.Epoch
@@ -596,7 +547,7 @@
MIN_VALIDATOR_WITHDRAWABILITY_DELAY: uint64 = 256
</spec>
- name: NUMBER_OF_CUSTODY_GROUPS#fulu
- name: NUMBER_OF_CUSTODY_GROUPS
sources:
- file: config/params/config.go
search: NumberOfCustodyGroups\s+uint64
@@ -606,14 +557,7 @@
NUMBER_OF_CUSTODY_GROUPS = 128
</spec>
- name: PAYLOAD_ATTESTATION_DUE_BPS#gloas
sources: []
spec: |
<spec config_var="PAYLOAD_ATTESTATION_DUE_BPS" fork="gloas" hash="17307d0e">
PAYLOAD_ATTESTATION_DUE_BPS: uint64 = 7500
</spec>
- name: PROPOSER_REORG_CUTOFF_BPS#phase0
- name: PROPOSER_REORG_CUTOFF_BPS
sources:
- file: config/params/config.go
search: ProposerReorgCutoffBPS\s+primitives.BP
@@ -623,7 +567,7 @@
PROPOSER_REORG_CUTOFF_BPS: uint64 = 1667
</spec>
- name: PROPOSER_SCORE_BOOST#phase0
- name: PROPOSER_SCORE_BOOST
sources:
- file: config/params/config.go
search: ProposerScoreBoost\s+uint64
@@ -633,7 +577,7 @@
PROPOSER_SCORE_BOOST: uint64 = 40
</spec>
- name: REORG_HEAD_WEIGHT_THRESHOLD#phase0
- name: REORG_HEAD_WEIGHT_THRESHOLD
sources:
- file: config/params/config.go
search: ReorgHeadWeightThreshold\s+uint64
@@ -643,7 +587,7 @@
REORG_HEAD_WEIGHT_THRESHOLD: uint64 = 20
</spec>
- name: REORG_MAX_EPOCHS_SINCE_FINALIZATION#phase0
- name: REORG_MAX_EPOCHS_SINCE_FINALIZATION
sources:
- file: config/params/config.go
search: ReorgMaxEpochsSinceFinalization\s+primitives.Epoch
@@ -653,7 +597,7 @@
REORG_MAX_EPOCHS_SINCE_FINALIZATION: Epoch = 2
</spec>
- name: REORG_PARENT_WEIGHT_THRESHOLD#phase0
- name: REORG_PARENT_WEIGHT_THRESHOLD
sources:
- file: config/params/config.go
search: ReorgParentWeightThreshold\s+uint64
@@ -663,7 +607,7 @@
REORG_PARENT_WEIGHT_THRESHOLD: uint64 = 160
</spec>
- name: SAMPLES_PER_SLOT#fulu
- name: SAMPLES_PER_SLOT
sources:
- file: config/params/config.go
search: SamplesPerSlot\s+uint64
@@ -673,7 +617,7 @@
SAMPLES_PER_SLOT = 8
</spec>
- name: SECONDS_PER_ETH1_BLOCK#phase0
- name: SECONDS_PER_ETH1_BLOCK
sources:
- file: config/params/config.go
search: SecondsPerETH1Block\s+uint64
@@ -683,7 +627,7 @@
SECONDS_PER_ETH1_BLOCK: uint64 = 14
</spec>
- name: SECONDS_PER_SLOT#phase0
- name: SECONDS_PER_SLOT
sources:
- file: config/params/config.go
search: SecondsPerSlot\s+uint64
@@ -693,7 +637,7 @@
SECONDS_PER_SLOT: uint64 = 12
</spec>
- name: SHARD_COMMITTEE_PERIOD#phase0
- name: SHARD_COMMITTEE_PERIOD
sources:
- file: config/params/config.go
search: ShardCommitteePeriod\s+primitives.Epoch
@@ -703,7 +647,7 @@
SHARD_COMMITTEE_PERIOD: uint64 = 256
</spec>
- name: SLOT_DURATION_MS#phase0
- name: SLOT_DURATION_MS
sources:
- file: config/params/config.go
search: SlotDurationMilliseconds\s+uint64
@@ -713,7 +657,7 @@
SLOT_DURATION_MS: uint64 = 12000
</spec>
- name: SUBNETS_PER_NODE#phase0
- name: SUBNETS_PER_NODE
sources:
- file: config/params/config.go
search: SubnetsPerNode\s+uint64
@@ -723,7 +667,7 @@
SUBNETS_PER_NODE = 2
</spec>
- name: SYNC_MESSAGE_DUE_BPS#altair
- name: SYNC_MESSAGE_DUE_BPS
sources:
- file: config/params/config.go
search: SyncMessageDueBPS\s+primitives.BP
@@ -733,14 +677,7 @@
SYNC_MESSAGE_DUE_BPS: uint64 = 3333
</spec>
- name: SYNC_MESSAGE_DUE_BPS_GLOAS#gloas
sources: []
spec: |
<spec config_var="SYNC_MESSAGE_DUE_BPS_GLOAS" fork="gloas" hash="47f14d95">
SYNC_MESSAGE_DUE_BPS_GLOAS: uint64 = 2500
</spec>
- name: TERMINAL_BLOCK_HASH#bellatrix
- name: TERMINAL_BLOCK_HASH
sources:
- file: config/params/config.go
search: TerminalBlockHash\s+common.Hash
@@ -750,7 +687,7 @@
TERMINAL_BLOCK_HASH: Hash32 = '0x0000000000000000000000000000000000000000000000000000000000000000'
</spec>
- name: TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH#bellatrix
- name: TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH
sources:
- file: config/params/config.go
search: TerminalBlockHashActivationEpoch\s+primitives.Epoch
@@ -760,7 +697,7 @@
TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH = 18446744073709551615
</spec>
- name: TERMINAL_TOTAL_DIFFICULTY#bellatrix
- name: TERMINAL_TOTAL_DIFFICULTY
sources:
- file: config/params/config.go
search: TerminalTotalDifficulty\s+string
@@ -770,7 +707,7 @@
TERMINAL_TOTAL_DIFFICULTY = 58750000000000000000000
</spec>
- name: VALIDATOR_CUSTODY_REQUIREMENT#fulu
- name: VALIDATOR_CUSTODY_REQUIREMENT
sources:
- file: config/params/config.go
search: ValidatorCustodyRequirement\s+uint64

File diff suppressed because one or more lines are too long

View File

@@ -50,7 +50,7 @@
committee_bits: Bitvector[MAX_COMMITTEES_PER_SLOT]
</spec>
- name: AttestationData#phase0
- name: AttestationData
sources:
- file: proto/eth/v1/attestation.proto
search: message AttestationData {
@@ -88,7 +88,7 @@
attestation_2: IndexedAttestation
</spec>
- name: BLSToExecutionChange#capella
- name: BLSToExecutionChange
sources:
- file: proto/prysm/v1alpha1/withdrawals.proto
search: message BLSToExecutionChange {
@@ -100,7 +100,7 @@
to_execution_address: ExecutionAddress
</spec>
- name: BeaconBlock#phase0
- name: BeaconBlock
sources:
- file: proto/eth/v1/beacon_block.proto
search: message BeaconBlock {
@@ -239,34 +239,7 @@
execution_requests: ExecutionRequests
</spec>
- name: BeaconBlockBody#gloas
sources: []
spec: |
<spec ssz_object="BeaconBlockBody" fork="gloas" hash="7e472a77">
class BeaconBlockBody(Container):
randao_reveal: BLSSignature
eth1_data: Eth1Data
graffiti: Bytes32
proposer_slashings: List[ProposerSlashing, MAX_PROPOSER_SLASHINGS]
attester_slashings: List[AttesterSlashing, MAX_ATTESTER_SLASHINGS_ELECTRA]
attestations: List[Attestation, MAX_ATTESTATIONS_ELECTRA]
deposits: List[Deposit, MAX_DEPOSITS]
voluntary_exits: List[SignedVoluntaryExit, MAX_VOLUNTARY_EXITS]
sync_aggregate: SyncAggregate
# [Modified in Gloas:EIP7732]
# Removed `execution_payload`
bls_to_execution_changes: List[SignedBLSToExecutionChange, MAX_BLS_TO_EXECUTION_CHANGES]
# [Modified in Gloas:EIP7732]
# Removed `blob_kzg_commitments`
# [Modified in Gloas:EIP7732]
# Removed `execution_requests`
# [New in Gloas:EIP7732]
signed_execution_payload_bid: SignedExecutionPayloadBid
# [New in Gloas:EIP7732]
payload_attestations: List[PayloadAttestation, MAX_PAYLOAD_ATTESTATIONS]
</spec>
- name: BeaconBlockHeader#phase0
- name: BeaconBlockHeader
sources:
- file: proto/eth/v1/beacon_block.proto
search: message BeaconBlockHeader {
@@ -565,69 +538,7 @@
proposer_lookahead: Vector[ValidatorIndex, (MIN_SEED_LOOKAHEAD + 1) * SLOTS_PER_EPOCH]
</spec>
- name: BeaconState#gloas
sources: []
spec: |
<spec ssz_object="BeaconState" fork="gloas" hash="c33b0db2">
class BeaconState(Container):
genesis_time: uint64
genesis_validators_root: Root
slot: Slot
fork: Fork
latest_block_header: BeaconBlockHeader
block_roots: Vector[Root, SLOTS_PER_HISTORICAL_ROOT]
state_roots: Vector[Root, SLOTS_PER_HISTORICAL_ROOT]
historical_roots: List[Root, HISTORICAL_ROOTS_LIMIT]
eth1_data: Eth1Data
eth1_data_votes: List[Eth1Data, EPOCHS_PER_ETH1_VOTING_PERIOD * SLOTS_PER_EPOCH]
eth1_deposit_index: uint64
validators: List[Validator, VALIDATOR_REGISTRY_LIMIT]
balances: List[Gwei, VALIDATOR_REGISTRY_LIMIT]
randao_mixes: Vector[Bytes32, EPOCHS_PER_HISTORICAL_VECTOR]
slashings: Vector[Gwei, EPOCHS_PER_SLASHINGS_VECTOR]
previous_epoch_participation: List[ParticipationFlags, VALIDATOR_REGISTRY_LIMIT]
current_epoch_participation: List[ParticipationFlags, VALIDATOR_REGISTRY_LIMIT]
justification_bits: Bitvector[JUSTIFICATION_BITS_LENGTH]
previous_justified_checkpoint: Checkpoint
current_justified_checkpoint: Checkpoint
finalized_checkpoint: Checkpoint
inactivity_scores: List[uint64, VALIDATOR_REGISTRY_LIMIT]
current_sync_committee: SyncCommittee
next_sync_committee: SyncCommittee
# [Modified in Gloas:EIP7732]
# Removed `latest_execution_payload_header`
# [New in Gloas:EIP7732]
latest_execution_payload_bid: ExecutionPayloadBid
next_withdrawal_index: WithdrawalIndex
next_withdrawal_validator_index: ValidatorIndex
historical_summaries: List[HistoricalSummary, HISTORICAL_ROOTS_LIMIT]
deposit_requests_start_index: uint64
deposit_balance_to_consume: Gwei
exit_balance_to_consume: Gwei
earliest_exit_epoch: Epoch
consolidation_balance_to_consume: Gwei
earliest_consolidation_epoch: Epoch
pending_deposits: List[PendingDeposit, PENDING_DEPOSITS_LIMIT]
pending_partial_withdrawals: List[PendingPartialWithdrawal, PENDING_PARTIAL_WITHDRAWALS_LIMIT]
pending_consolidations: List[PendingConsolidation, PENDING_CONSOLIDATIONS_LIMIT]
proposer_lookahead: Vector[ValidatorIndex, (MIN_SEED_LOOKAHEAD + 1) * SLOTS_PER_EPOCH]
# [New in Gloas:EIP7732]
builders: List[Builder, BUILDER_REGISTRY_LIMIT]
# [New in Gloas:EIP7732]
next_withdrawal_builder_index: BuilderIndex
# [New in Gloas:EIP7732]
execution_payload_availability: Bitvector[SLOTS_PER_HISTORICAL_ROOT]
# [New in Gloas:EIP7732]
builder_pending_payments: Vector[BuilderPendingPayment, 2 * SLOTS_PER_EPOCH]
# [New in Gloas:EIP7732]
builder_pending_withdrawals: List[BuilderPendingWithdrawal, BUILDER_PENDING_WITHDRAWALS_LIMIT]
# [New in Gloas:EIP7732]
latest_block_hash: Hash32
# [New in Gloas:EIP7732]
payload_expected_withdrawals: List[Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD]
</spec>
- name: BlobIdentifier#deneb
- name: BlobIdentifier
sources:
- file: proto/prysm/v1alpha1/blobs.proto
search: message BlobIdentifier {
@@ -638,7 +549,7 @@
index: BlobIndex
</spec>
- name: BlobSidecar#deneb
- name: BlobSidecar
sources:
- file: proto/prysm/v1alpha1/beacon_block.proto
search: message BlobSidecar {
@@ -653,39 +564,7 @@
kzg_commitment_inclusion_proof: Vector[Bytes32, KZG_COMMITMENT_INCLUSION_PROOF_DEPTH]
</spec>
- name: Builder#gloas
sources: []
spec: |
<spec ssz_object="Builder" fork="gloas" hash="ae177179">
class Builder(Container):
pubkey: BLSPubkey
version: uint8
execution_address: ExecutionAddress
balance: Gwei
deposit_epoch: Epoch
withdrawable_epoch: Epoch
</spec>
- name: BuilderPendingPayment#gloas
sources: []
spec: |
<spec ssz_object="BuilderPendingPayment" fork="gloas" hash="73cf1649">
class BuilderPendingPayment(Container):
weight: Gwei
withdrawal: BuilderPendingWithdrawal
</spec>
- name: BuilderPendingWithdrawal#gloas
sources: []
spec: |
<spec ssz_object="BuilderPendingWithdrawal" fork="gloas" hash="0579f0ac">
class BuilderPendingWithdrawal(Container):
fee_recipient: ExecutionAddress
amount: Gwei
builder_index: BuilderIndex
</spec>
- name: Checkpoint#phase0
- name: Checkpoint
sources:
- file: proto/eth/v1/attestation.proto
search: message Checkpoint {
@@ -696,7 +575,7 @@
root: Root
</spec>
- name: ConsolidationRequest#electra
- name: ConsolidationRequest
sources:
- file: proto/engine/v1/electra.proto
search: message ConsolidationRequest {
@@ -708,7 +587,7 @@
target_pubkey: BLSPubkey
</spec>
- name: ContributionAndProof#altair
- name: ContributionAndProof
sources:
- file: proto/prysm/v1alpha1/sync_committee.proto
search: message ContributionAndProof {
@@ -720,7 +599,7 @@
selection_proof: BLSSignature
</spec>
- name: DataColumnSidecar#fulu
- name: DataColumnSidecar
sources:
- file: proto/prysm/v1alpha1/data_columns.proto
search: message DataColumnSidecar {
@@ -735,26 +614,7 @@
kzg_commitments_inclusion_proof: Vector[Bytes32, KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH]
</spec>
- name: DataColumnSidecar#gloas
sources: []
spec: |
<spec ssz_object="DataColumnSidecar" fork="gloas" hash="8028928b">
class DataColumnSidecar(Container):
index: ColumnIndex
column: List[Cell, MAX_BLOB_COMMITMENTS_PER_BLOCK]
kzg_commitments: List[KZGCommitment, MAX_BLOB_COMMITMENTS_PER_BLOCK]
kzg_proofs: List[KZGProof, MAX_BLOB_COMMITMENTS_PER_BLOCK]
# [Modified in Gloas:EIP7732]
# Removed `signed_block_header`
# [Modified in Gloas:EIP7732]
# Removed `kzg_commitments_inclusion_proof`
# [New in Gloas:EIP7732]
slot: Slot
# [New in Gloas:EIP7732]
beacon_block_root: Root
</spec>
- name: DataColumnsByRootIdentifier#fulu
- name: DataColumnsByRootIdentifier
sources:
- file: proto/prysm/v1alpha1/data_columns.proto
search: message DataColumnsByRootIdentifier {
@@ -765,7 +625,7 @@
columns: List[ColumnIndex, NUMBER_OF_COLUMNS]
</spec>
- name: Deposit#phase0
- name: Deposit
sources:
- file: proto/eth/v1/beacon_block.proto
search: message Deposit {
@@ -776,7 +636,7 @@
data: DepositData
</spec>
- name: DepositData#phase0
- name: DepositData
sources:
- file: proto/prysm/v1alpha1/beacon_core_types.proto
search: message Data {
@@ -789,7 +649,7 @@
signature: BLSSignature
</spec>
- name: DepositMessage#phase0
- name: DepositMessage
sources:
- file: proto/prysm/v1alpha1/beacon_state.proto
search: message DepositMessage {
@@ -801,7 +661,7 @@
amount: Gwei
</spec>
- name: DepositRequest#electra
- name: DepositRequest
sources:
- file: proto/engine/v1/electra.proto
search: message DepositRequest {
@@ -815,17 +675,7 @@
index: uint64
</spec>
- name: Eth1Block#phase0
sources: []
spec: |
<spec ssz_object="Eth1Block" fork="phase0" hash="0a5c6b45">
class Eth1Block(Container):
timestamp: uint64
deposit_root: Root
deposit_count: uint64
</spec>
- name: Eth1Data#phase0
- name: Eth1Data
sources:
- file: proto/prysm/v1alpha1/beacon_core_types.proto
search: message Eth1Data {
@@ -913,38 +763,6 @@
excess_blob_gas: uint64
</spec>
- name: ExecutionPayloadBid#gloas
sources: []
spec: |
<spec ssz_object="ExecutionPayloadBid" fork="gloas" hash="aa71ba16">
class ExecutionPayloadBid(Container):
parent_block_hash: Hash32
parent_block_root: Root
block_hash: Hash32
prev_randao: Bytes32
fee_recipient: ExecutionAddress
gas_limit: uint64
builder_index: BuilderIndex
slot: Slot
value: Gwei
execution_payment: Gwei
blob_kzg_commitments_root: Root
</spec>
- name: ExecutionPayloadEnvelope#gloas
sources: []
spec: |
<spec ssz_object="ExecutionPayloadEnvelope" fork="gloas" hash="cd522f7f">
class ExecutionPayloadEnvelope(Container):
payload: ExecutionPayload
execution_requests: ExecutionRequests
builder_index: BuilderIndex
beacon_block_root: Root
slot: Slot
blob_kzg_commitments: List[KZGCommitment, MAX_BLOB_COMMITMENTS_PER_BLOCK]
state_root: Root
</spec>
- name: ExecutionPayloadHeader#bellatrix
sources:
- file: proto/engine/v1/execution_engine.proto
@@ -1021,7 +839,7 @@
excess_blob_gas: uint64
</spec>
- name: ExecutionRequests#electra
- name: ExecutionRequests
sources:
- file: proto/engine/v1/electra.proto
search: message ExecutionRequests {
@@ -1036,7 +854,7 @@
consolidations: List[ConsolidationRequest, MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD]
</spec>
- name: Fork#phase0
- name: Fork
sources:
- file: proto/prysm/v1alpha1/beacon_core_types.proto
search: message Fork {
@@ -1048,16 +866,7 @@
epoch: Epoch
</spec>
- name: ForkChoiceNode#gloas
sources: []
spec: |
<spec ssz_object="ForkChoiceNode" fork="gloas" hash="755a4b34">
class ForkChoiceNode(Container):
root: Root
payload_status: PayloadStatus # One of PAYLOAD_STATUS_* values
</spec>
- name: ForkData#phase0
- name: ForkData
sources:
- file: proto/prysm/v1alpha1/beacon_state.proto
search: message ForkData {
@@ -1068,7 +877,7 @@
genesis_validators_root: Root
</spec>
- name: HistoricalBatch#phase0
- name: HistoricalBatch
sources:
- file: proto/prysm/v1alpha1/beacon_state.proto
search: message HistoricalBatch {
@@ -1079,7 +888,7 @@
state_roots: Vector[Root, SLOTS_PER_HISTORICAL_ROOT]
</spec>
- name: HistoricalSummary#capella
- name: HistoricalSummary
sources:
- file: proto/prysm/v1alpha1/beacon_core_types.proto
search: message HistoricalSummary {
@@ -1115,17 +924,7 @@
signature: BLSSignature
</spec>
- name: IndexedPayloadAttestation#gloas
sources: []
spec: |
<spec ssz_object="IndexedPayloadAttestation" fork="gloas" hash="fa4832c8">
class IndexedPayloadAttestation(Container):
attesting_indices: List[ValidatorIndex, PTC_SIZE]
data: PayloadAttestationData
signature: BLSSignature
</spec>
- name: LightClientBootstrap#altair
- name: LightClientBootstrap
sources:
- file: proto/prysm/v1alpha1/light_client.proto
search: message LightClientBootstrapAltair {
@@ -1139,18 +938,7 @@
current_sync_committee_branch: CurrentSyncCommitteeBranch
</spec>
- name: LightClientBootstrap#capella
sources: []
spec: |
<spec ssz_object="LightClientBootstrap" fork="capella" hash="85f4f5fe">
class LightClientBootstrap(Container):
# [Modified in Capella]
header: LightClientHeader
current_sync_committee: SyncCommittee
current_sync_committee_branch: CurrentSyncCommitteeBranch
</spec>
- name: LightClientFinalityUpdate#altair
- name: LightClientFinalityUpdate
sources:
- file: proto/prysm/v1alpha1/light_client.proto
search: message LightClientFinalityUpdateAltair {
@@ -1168,20 +956,6 @@
signature_slot: Slot
</spec>
- name: LightClientFinalityUpdate#capella
sources: []
spec: |
<spec ssz_object="LightClientFinalityUpdate" fork="capella" hash="9d2b55dd">
class LightClientFinalityUpdate(Container):
# [Modified in Capella]
attested_header: LightClientHeader
# [Modified in Capella]
finalized_header: LightClientHeader
finality_branch: FinalityBranch
sync_aggregate: SyncAggregate
signature_slot: Slot
</spec>
- name: LightClientHeader#altair
sources:
- file: proto/prysm/v1alpha1/light_client.proto
@@ -1206,7 +980,7 @@
execution_branch: ExecutionBranch
</spec>
- name: LightClientOptimisticUpdate#altair
- name: LightClientOptimisticUpdate
sources:
- file: proto/prysm/v1alpha1/light_client.proto
search: message LightClientOptimisticUpdateAltair {
@@ -1221,18 +995,7 @@
signature_slot: Slot
</spec>
- name: LightClientOptimisticUpdate#capella
sources: []
spec: |
<spec ssz_object="LightClientOptimisticUpdate" fork="capella" hash="bdce7b1d">
class LightClientOptimisticUpdate(Container):
# [Modified in Capella]
attested_header: LightClientHeader
sync_aggregate: SyncAggregate
signature_slot: Slot
</spec>
- name: LightClientUpdate#altair
- name: LightClientUpdate
sources:
- file: proto/prysm/v1alpha1/light_client.proto
search: message LightClientUpdateAltair {
@@ -1253,65 +1016,7 @@
signature_slot: Slot
</spec>
- name: LightClientUpdate#capella
sources: []
spec: |
<spec ssz_object="LightClientUpdate" fork="capella" hash="8d215165">
class LightClientUpdate(Container):
# [Modified in Capella]
attested_header: LightClientHeader
next_sync_committee: SyncCommittee
next_sync_committee_branch: NextSyncCommitteeBranch
# [Modified in Capella]
finalized_header: LightClientHeader
finality_branch: FinalityBranch
sync_aggregate: SyncAggregate
signature_slot: Slot
</spec>
- name: MatrixEntry#fulu
sources: []
spec: |
<spec ssz_object="MatrixEntry" fork="fulu" hash="0da9cc8e">
class MatrixEntry(Container):
cell: Cell
kzg_proof: KZGProof
column_index: ColumnIndex
row_index: RowIndex
</spec>
- name: PayloadAttestation#gloas
sources: []
spec: |
<spec ssz_object="PayloadAttestation" fork="gloas" hash="c769473d">
class PayloadAttestation(Container):
aggregation_bits: Bitvector[PTC_SIZE]
data: PayloadAttestationData
signature: BLSSignature
</spec>
- name: PayloadAttestationData#gloas
sources: []
spec: |
<spec ssz_object="PayloadAttestationData" fork="gloas" hash="9f1b7f92">
class PayloadAttestationData(Container):
beacon_block_root: Root
slot: Slot
payload_present: boolean
blob_data_available: boolean
</spec>
- name: PayloadAttestationMessage#gloas
sources: []
spec: |
<spec ssz_object="PayloadAttestationMessage" fork="gloas" hash="3707678d">
class PayloadAttestationMessage(Container):
validator_index: ValidatorIndex
data: PayloadAttestationData
signature: BLSSignature
</spec>
- name: PendingAttestation#phase0
- name: PendingAttestation
sources:
- file: proto/prysm/v1alpha1/beacon_state.proto
search: message PendingAttestation {
@@ -1324,7 +1029,7 @@
proposer_index: ValidatorIndex
</spec>
- name: PendingConsolidation#electra
- name: PendingConsolidation
sources:
- file: proto/prysm/v1alpha1/eip_7251.proto
search: message PendingConsolidation {
@@ -1335,7 +1040,7 @@
target_index: ValidatorIndex
</spec>
- name: PendingDeposit#electra
- name: PendingDeposit
sources:
- file: proto/prysm/v1alpha1/eip_7251.proto
search: message PendingDeposit {
@@ -1349,7 +1054,7 @@
slot: Slot
</spec>
- name: PendingPartialWithdrawal#electra
- name: PendingPartialWithdrawal
sources:
- file: proto/prysm/v1alpha1/eip_7251.proto
search: message PendingPartialWithdrawal {
@@ -1361,7 +1066,7 @@
withdrawable_epoch: Epoch
</spec>
- name: PowBlock#bellatrix
- name: PowBlock
sources:
- file: proto/prysm/v1alpha1/beacon_state.proto
search: message PowBlock {
@@ -1373,18 +1078,7 @@
total_difficulty: uint256
</spec>
- name: ProposerPreferences#gloas
sources: []
spec: |
<spec ssz_object="ProposerPreferences" fork="gloas" hash="2a38b149">
class ProposerPreferences(Container):
proposal_slot: Slot
validator_index: ValidatorIndex
fee_recipient: ExecutionAddress
gas_limit: uint64
</spec>
- name: ProposerSlashing#phase0
- name: ProposerSlashing
sources:
- file: proto/eth/v1/beacon_block.proto
search: message ProposerSlashing {
@@ -1418,7 +1112,7 @@
signature: BLSSignature
</spec>
- name: SignedBLSToExecutionChange#capella
- name: SignedBLSToExecutionChange
sources:
- file: proto/prysm/v1alpha1/withdrawals.proto
search: message SignedBLSToExecutionChange {
@@ -1429,7 +1123,7 @@
signature: BLSSignature
</spec>
- name: SignedBeaconBlock#phase0
- name: SignedBeaconBlock
sources:
- file: proto/prysm/v1alpha1/beacon_block.proto
search: message SignedBeaconBlock {
@@ -1440,7 +1134,7 @@
signature: BLSSignature
</spec>
- name: SignedBeaconBlockHeader#phase0
- name: SignedBeaconBlockHeader
sources:
- file: proto/prysm/v1alpha1/beacon_core_types.proto
search: message SignedBeaconBlockHeader {
@@ -1451,7 +1145,7 @@
signature: BLSSignature
</spec>
- name: SignedContributionAndProof#altair
- name: SignedContributionAndProof
sources:
- file: proto/prysm/v1alpha1/sync_committee.proto
search: message SignedContributionAndProof {
@@ -1462,34 +1156,7 @@
signature: BLSSignature
</spec>
- name: SignedExecutionPayloadBid#gloas
sources: []
spec: |
<spec ssz_object="SignedExecutionPayloadBid" fork="gloas" hash="6b344341">
class SignedExecutionPayloadBid(Container):
message: ExecutionPayloadBid
signature: BLSSignature
</spec>
- name: SignedExecutionPayloadEnvelope#gloas
sources: []
spec: |
<spec ssz_object="SignedExecutionPayloadEnvelope" fork="gloas" hash="ab8f3404">
class SignedExecutionPayloadEnvelope(Container):
message: ExecutionPayloadEnvelope
signature: BLSSignature
</spec>
- name: SignedProposerPreferences#gloas
sources: []
spec: |
<spec ssz_object="SignedProposerPreferences" fork="gloas" hash="2142774c">
class SignedProposerPreferences(Container):
message: ProposerPreferences
signature: BLSSignature
</spec>
- name: SignedVoluntaryExit#phase0
- name: SignedVoluntaryExit
sources:
- file: proto/prysm/v1alpha1/beacon_core_types.proto
search: message SignedVoluntaryExit {
@@ -1500,7 +1167,7 @@
signature: BLSSignature
</spec>
- name: SigningData#phase0
- name: SigningData
sources:
- file: proto/prysm/v1alpha1/beacon_state.proto
search: message SigningData {
@@ -1511,7 +1178,7 @@
domain: Domain
</spec>
- name: SingleAttestation#electra
- name: SingleAttestation
sources:
- file: proto/prysm/v1alpha1/attestation.proto
search: message SingleAttestation {
@@ -1524,7 +1191,7 @@
signature: BLSSignature
</spec>
- name: SyncAggregate#altair
- name: SyncAggregate
sources:
- file: proto/prysm/v1alpha1/beacon_core_types.proto
search: message SyncAggregate {
@@ -1535,7 +1202,7 @@
sync_committee_signature: BLSSignature
</spec>
- name: SyncAggregatorSelectionData#altair
- name: SyncAggregatorSelectionData
sources:
- file: proto/prysm/v1alpha1/beacon_state.proto
search: message SyncAggregatorSelectionData {
@@ -1546,7 +1213,7 @@
subcommittee_index: uint64
</spec>
- name: SyncCommittee#altair
- name: SyncCommittee
sources:
- file: proto/prysm/v1alpha1/beacon_core_types.proto
search: message SyncCommittee {
@@ -1557,7 +1224,7 @@
aggregate_pubkey: BLSPubkey
</spec>
- name: SyncCommitteeContribution#altair
- name: SyncCommitteeContribution
sources:
- file: proto/prysm/v1alpha1/sync_committee.proto
search: message SyncCommitteeContribution {
@@ -1571,7 +1238,7 @@
signature: BLSSignature
</spec>
- name: SyncCommitteeMessage#altair
- name: SyncCommitteeMessage
sources:
- file: proto/prysm/v1alpha1/sync_committee.proto
search: message SyncCommitteeMessage {
@@ -1584,7 +1251,7 @@
signature: BLSSignature
</spec>
- name: Validator#phase0
- name: Validator
sources:
- file: proto/prysm/v1alpha1/beacon_core_types.proto
search: message Validator {
@@ -1601,7 +1268,7 @@
withdrawable_epoch: Epoch
</spec>
- name: VoluntaryExit#phase0
- name: VoluntaryExit
sources:
- file: proto/eth/v1/beacon_block.proto
search: message VoluntaryExit {
@@ -1612,7 +1279,7 @@
validator_index: ValidatorIndex
</spec>
- name: Withdrawal#capella
- name: Withdrawal
sources:
- file: proto/engine/v1/execution_engine.proto
search: message Withdrawal {
@@ -1625,7 +1292,7 @@
amount: Gwei
</spec>
- name: WithdrawalRequest#electra
- name: WithdrawalRequest
sources:
- file: proto/engine/v1/electra.proto
search: message WithdrawalRequest {

View File

@@ -1,4 +1,4 @@
- name: BlobParameters#fulu
- name: BlobParameters
sources: []
spec: |
<spec dataclass="BlobParameters" fork="fulu" hash="a4575aa8">
@@ -54,20 +54,6 @@
processed_sweep_withdrawals_count: uint64
</spec>
- name: ExpectedWithdrawals#gloas
sources: []
spec: |
<spec dataclass="ExpectedWithdrawals" fork="gloas" hash="b32cc9c9">
class ExpectedWithdrawals(object):
withdrawals: Sequence[Withdrawal]
# [New in Gloas:EIP7732]
processed_builder_withdrawals_count: uint64
processed_partial_withdrawals_count: uint64
# [New in Gloas:EIP7732]
processed_builders_sweep_count: uint64
processed_sweep_withdrawals_count: uint64
</spec>
- name: GetPayloadResponse#bellatrix
sources:
- file: consensus-types/blocks/get_payload.go
@@ -140,7 +126,7 @@
execution_requests: Sequence[bytes]
</spec>
- name: LatestMessage#phase0
- name: LatestMessage
sources: []
spec: |
<spec dataclass="LatestMessage" fork="phase0" hash="44e832d0">
@@ -150,18 +136,7 @@
root: Root
</spec>
- name: LatestMessage#gloas
sources: []
spec: |
<spec dataclass="LatestMessage" fork="gloas" hash="a0030894">
@dataclass(eq=True, frozen=True)
class LatestMessage(object):
slot: Slot
root: Root
payload_present: boolean
</spec>
- name: LightClientStore#altair
- name: LightClientStore
sources: []
spec: |
<spec dataclass="LightClientStore" fork="altair" hash="24725cec">
@@ -180,23 +155,6 @@
current_max_active_participants: uint64
</spec>
- name: LightClientStore#capella
sources: []
spec: |
<spec dataclass="LightClientStore" fork="capella" hash="04b41062">
class LightClientStore(object):
# [Modified in Capella]
finalized_header: LightClientHeader
current_sync_committee: SyncCommittee
next_sync_committee: SyncCommittee
# [Modified in Capella]
best_valid_update: Optional[LightClientUpdate]
# [Modified in Capella]
optimistic_header: LightClientHeader
previous_max_active_participants: uint64
current_max_active_participants: uint64
</spec>
- name: NewPayloadRequest#bellatrix
sources:
- file: beacon-chain/execution/engine_client.go
@@ -233,7 +191,7 @@
execution_requests: ExecutionRequests
</spec>
- name: OptimisticStore#bellatrix
- name: OptimisticStore
sources: []
spec: |
<spec dataclass="OptimisticStore" fork="bellatrix" hash="a2b2182c">
@@ -288,7 +246,7 @@
parent_beacon_block_root: Root
</spec>
- name: Store#phase0
- name: Store
sources: []
spec: |
<spec dataclass="Store" fork="phase0" hash="abe525d6">
@@ -308,30 +266,3 @@
latest_messages: Dict[ValidatorIndex, LatestMessage] = field(default_factory=dict)
unrealized_justifications: Dict[Root, Checkpoint] = field(default_factory=dict)
</spec>
- name: Store#gloas
sources: []
spec: |
<spec dataclass="Store" fork="gloas" hash="4dbfec46">
class Store(object):
time: uint64
genesis_time: uint64
justified_checkpoint: Checkpoint
finalized_checkpoint: Checkpoint
unrealized_justified_checkpoint: Checkpoint
unrealized_finalized_checkpoint: Checkpoint
proposer_boost_root: Root
equivocating_indices: Set[ValidatorIndex]
blocks: Dict[Root, BeaconBlock] = field(default_factory=dict)
block_states: Dict[Root, BeaconState] = field(default_factory=dict)
block_timeliness: Dict[Root, Vector[boolean, NUM_BLOCK_TIMELINESS_DEADLINES]] = field(
default_factory=dict
)
checkpoint_states: Dict[Checkpoint, BeaconState] = field(default_factory=dict)
latest_messages: Dict[ValidatorIndex, LatestMessage] = field(default_factory=dict)
unrealized_justifications: Dict[Root, Checkpoint] = field(default_factory=dict)
# [New in Gloas:EIP7732]
execution_payload_states: Dict[Root, BeaconState] = field(default_factory=dict)
# [New in Gloas:EIP7732]
ptc_vote: Dict[Root, Vector[boolean, PTC_SIZE]] = field(default_factory=dict)
</spec>

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
- name: BASE_REWARD_FACTOR#phase0
- name: BASE_REWARD_FACTOR
sources:
- file: config/params/config.go
search: BaseRewardFactor\s+.*yaml:"BASE_REWARD_FACTOR"
@@ -8,21 +8,7 @@
BASE_REWARD_FACTOR: uint64 = 64
</spec>
- name: BUILDER_PENDING_WITHDRAWALS_LIMIT#gloas
sources: []
spec: |
<spec preset_var="BUILDER_PENDING_WITHDRAWALS_LIMIT" fork="gloas" hash="40b31377">
BUILDER_PENDING_WITHDRAWALS_LIMIT: uint64 = 1048576
</spec>
- name: BUILDER_REGISTRY_LIMIT#gloas
sources: []
spec: |
<spec preset_var="BUILDER_REGISTRY_LIMIT" fork="gloas" hash="e951ff73">
BUILDER_REGISTRY_LIMIT: uint64 = 1099511627776
</spec>
- name: BYTES_PER_LOGS_BLOOM#bellatrix
- name: BYTES_PER_LOGS_BLOOM
sources:
- file: config/params/config.go
search: BytesPerLogsBloom\s+.*yaml:"BYTES_PER_LOGS_BLOOM"
@@ -32,7 +18,7 @@
BYTES_PER_LOGS_BLOOM: uint64 = 256
</spec>
- name: CELLS_PER_EXT_BLOB#fulu
- name: CELLS_PER_EXT_BLOB
sources:
- file: beacon-chain/rpc/eth/config/handlers.go
search: data\["CELLS_PER_EXT_BLOB"\]
@@ -42,7 +28,7 @@
CELLS_PER_EXT_BLOB = 128
</spec>
- name: EFFECTIVE_BALANCE_INCREMENT#phase0
- name: EFFECTIVE_BALANCE_INCREMENT
sources:
- file: config/params/config.go
search: EffectiveBalanceIncrement\s+.*yaml:"EFFECTIVE_BALANCE_INCREMENT"
@@ -52,7 +38,7 @@
EFFECTIVE_BALANCE_INCREMENT: Gwei = 1000000000
</spec>
- name: EPOCHS_PER_ETH1_VOTING_PERIOD#phase0
- name: EPOCHS_PER_ETH1_VOTING_PERIOD
sources:
- file: config/params/config.go
search: EpochsPerEth1VotingPeriod\s+.*yaml:"EPOCHS_PER_ETH1_VOTING_PERIOD"
@@ -62,7 +48,7 @@
EPOCHS_PER_ETH1_VOTING_PERIOD: uint64 = 64
</spec>
- name: EPOCHS_PER_HISTORICAL_VECTOR#phase0
- name: EPOCHS_PER_HISTORICAL_VECTOR
sources:
- file: config/fieldparams/mainnet.go
search: RandaoMixesLength\s*=
@@ -72,7 +58,7 @@
EPOCHS_PER_HISTORICAL_VECTOR: uint64 = 65536
</spec>
- name: EPOCHS_PER_SLASHINGS_VECTOR#phase0
- name: EPOCHS_PER_SLASHINGS_VECTOR
sources:
- file: config/fieldparams/mainnet.go
search: SlashingsLength\s*=
@@ -82,7 +68,7 @@
EPOCHS_PER_SLASHINGS_VECTOR: uint64 = 8192
</spec>
- name: EPOCHS_PER_SYNC_COMMITTEE_PERIOD#altair
- name: EPOCHS_PER_SYNC_COMMITTEE_PERIOD
sources:
- file: config/params/config.go
search: EpochsPerSyncCommitteePeriod\s+.*yaml:"EPOCHS_PER_SYNC_COMMITTEE_PERIOD"
@@ -92,7 +78,7 @@
EPOCHS_PER_SYNC_COMMITTEE_PERIOD: uint64 = 256
</spec>
- name: FIELD_ELEMENTS_PER_BLOB#deneb
- name: FIELD_ELEMENTS_PER_BLOB
sources:
- file: config/params/config.go
search: FieldElementsPerBlob\s+.*yaml:"FIELD_ELEMENTS_PER_BLOB"
@@ -102,7 +88,7 @@
FIELD_ELEMENTS_PER_BLOB: uint64 = 4096
</spec>
- name: FIELD_ELEMENTS_PER_CELL#fulu
- name: FIELD_ELEMENTS_PER_CELL
sources:
- file: config/fieldparams/mainnet.go
search: CellsPerBlob\s*=
@@ -112,7 +98,7 @@
FIELD_ELEMENTS_PER_CELL: uint64 = 64
</spec>
- name: FIELD_ELEMENTS_PER_EXT_BLOB#fulu
- name: FIELD_ELEMENTS_PER_EXT_BLOB
sources:
- file: proto/ssz_proto_library.bzl
search: mainnet\s*=\s*\{[^}]*"field_elements_per_ext_blob\.size".*[^}]*\}
@@ -122,7 +108,7 @@
FIELD_ELEMENTS_PER_EXT_BLOB = 8192
</spec>
- name: HISTORICAL_ROOTS_LIMIT#phase0
- name: HISTORICAL_ROOTS_LIMIT
sources:
- file: config/fieldparams/mainnet.go
search: HistoricalRootsLength\s*=
@@ -132,7 +118,7 @@
HISTORICAL_ROOTS_LIMIT: uint64 = 16777216
</spec>
- name: HYSTERESIS_DOWNWARD_MULTIPLIER#phase0
- name: HYSTERESIS_DOWNWARD_MULTIPLIER
sources:
- file: config/params/config.go
search: HysteresisDownwardMultiplier\s+.*yaml:"HYSTERESIS_DOWNWARD_MULTIPLIER"
@@ -142,7 +128,7 @@
HYSTERESIS_DOWNWARD_MULTIPLIER: uint64 = 1
</spec>
- name: HYSTERESIS_QUOTIENT#phase0
- name: HYSTERESIS_QUOTIENT
sources:
- file: config/params/config.go
search: HysteresisQuotient\s+.*yaml:"HYSTERESIS_QUOTIENT"
@@ -152,7 +138,7 @@
HYSTERESIS_QUOTIENT: uint64 = 4
</spec>
- name: HYSTERESIS_UPWARD_MULTIPLIER#phase0
- name: HYSTERESIS_UPWARD_MULTIPLIER
sources:
- file: config/params/config.go
search: HysteresisUpwardMultiplier\s+.*yaml:"HYSTERESIS_UPWARD_MULTIPLIER"
@@ -162,7 +148,7 @@
HYSTERESIS_UPWARD_MULTIPLIER: uint64 = 5
</spec>
- name: INACTIVITY_PENALTY_QUOTIENT#phase0
- name: INACTIVITY_PENALTY_QUOTIENT
sources:
- file: config/params/config.go
search: InactivityPenaltyQuotient\s+.*yaml:"INACTIVITY_PENALTY_QUOTIENT"
@@ -172,7 +158,7 @@
INACTIVITY_PENALTY_QUOTIENT: uint64 = 67108864
</spec>
- name: INACTIVITY_PENALTY_QUOTIENT_ALTAIR#altair
- name: INACTIVITY_PENALTY_QUOTIENT_ALTAIR
sources:
- file: config/params/config.go
search: InactivityPenaltyQuotientAltair\s+.*yaml:"INACTIVITY_PENALTY_QUOTIENT_ALTAIR"
@@ -182,7 +168,7 @@
INACTIVITY_PENALTY_QUOTIENT_ALTAIR: uint64 = 50331648
</spec>
- name: INACTIVITY_PENALTY_QUOTIENT_BELLATRIX#bellatrix
- name: INACTIVITY_PENALTY_QUOTIENT_BELLATRIX
sources:
- file: config/params/config.go
search: InactivityPenaltyQuotientBellatrix\s+.*yaml:"INACTIVITY_PENALTY_QUOTIENT_BELLATRIX"
@@ -192,7 +178,7 @@
INACTIVITY_PENALTY_QUOTIENT_BELLATRIX: uint64 = 16777216
</spec>
- name: KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH#fulu
- name: KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH
sources:
- file: proto/ssz_proto_library.bzl
search: mainnet\s*=\s*\{[^}]*"kzg_commitments_inclusion_proof_depth\.size":.*[^}]*\}
@@ -202,7 +188,7 @@
KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH: uint64 = 4
</spec>
- name: KZG_COMMITMENT_INCLUSION_PROOF_DEPTH#deneb
- name: KZG_COMMITMENT_INCLUSION_PROOF_DEPTH
sources:
- file: config/fieldparams/mainnet.go
search: KzgCommitmentInclusionProofDepth\s*=
@@ -212,7 +198,7 @@
KZG_COMMITMENT_INCLUSION_PROOF_DEPTH: uint64 = 17
</spec>
- name: MAX_ATTESTATIONS#phase0
- name: MAX_ATTESTATIONS
sources:
- file: config/params/config.go
search: MaxAttestations\s+.*yaml:"MAX_ATTESTATIONS"
@@ -222,7 +208,7 @@
MAX_ATTESTATIONS = 128
</spec>
- name: MAX_ATTESTATIONS_ELECTRA#electra
- name: MAX_ATTESTATIONS_ELECTRA
sources:
- file: config/params/config.go
search: MaxAttestationsElectra\s+.*yaml:"MAX_ATTESTATIONS_ELECTRA"
@@ -232,7 +218,7 @@
MAX_ATTESTATIONS_ELECTRA = 8
</spec>
- name: MAX_ATTESTER_SLASHINGS#phase0
- name: MAX_ATTESTER_SLASHINGS
sources:
- file: config/params/config.go
search: MaxAttesterSlashings\s+.*yaml:"MAX_ATTESTER_SLASHINGS"
@@ -242,7 +228,7 @@
MAX_ATTESTER_SLASHINGS = 2
</spec>
- name: MAX_ATTESTER_SLASHINGS_ELECTRA#electra
- name: MAX_ATTESTER_SLASHINGS_ELECTRA
sources:
- file: config/params/config.go
search: MaxAttesterSlashingsElectra\s+.*yaml:"MAX_ATTESTER_SLASHINGS_ELECTRA"
@@ -252,7 +238,7 @@
MAX_ATTESTER_SLASHINGS_ELECTRA = 1
</spec>
- name: MAX_BLOB_COMMITMENTS_PER_BLOCK#deneb
- name: MAX_BLOB_COMMITMENTS_PER_BLOCK
sources:
- file: config/fieldparams/mainnet.go
search: MaxBlobCommitmentsPerBlock\s*=
@@ -262,7 +248,7 @@
MAX_BLOB_COMMITMENTS_PER_BLOCK: uint64 = 4096
</spec>
- name: MAX_BLS_TO_EXECUTION_CHANGES#capella
- name: MAX_BLS_TO_EXECUTION_CHANGES
sources:
- file: config/params/config.go
search: MaxBlsToExecutionChanges\s+.*yaml:"MAX_BLS_TO_EXECUTION_CHANGES"
@@ -272,14 +258,7 @@
MAX_BLS_TO_EXECUTION_CHANGES = 16
</spec>
- name: MAX_BUILDERS_PER_WITHDRAWALS_SWEEP#gloas
sources: []
spec: |
<spec preset_var="MAX_BUILDERS_PER_WITHDRAWALS_SWEEP" fork="gloas" hash="1556b314">
MAX_BUILDERS_PER_WITHDRAWALS_SWEEP = 16384
</spec>
- name: MAX_BYTES_PER_TRANSACTION#bellatrix
- name: MAX_BYTES_PER_TRANSACTION
sources:
- file: config/params/config.go
search: MaxBytesPerTransaction\s+.*yaml:"MAX_BYTES_PER_TRANSACTION"
@@ -309,7 +288,7 @@
MAX_COMMITTEES_PER_SLOT: uint64 = 64
</spec>
- name: MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD#electra
- name: MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD
sources:
- file: config/params/config.go
search: MaxConsolidationsRequestsPerPayload\s+.*yaml:"MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD"
@@ -319,7 +298,7 @@
MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD: uint64 = 2
</spec>
- name: MAX_DEPOSITS#phase0
- name: MAX_DEPOSITS
sources:
- file: config/params/config.go
search: MaxDeposits\s+.*yaml:"MAX_DEPOSITS"
@@ -329,7 +308,7 @@
MAX_DEPOSITS = 16
</spec>
- name: MAX_DEPOSIT_REQUESTS_PER_PAYLOAD#electra
- name: MAX_DEPOSIT_REQUESTS_PER_PAYLOAD
sources:
- file: config/params/config.go
search: MaxDepositRequestsPerPayload\s+.*yaml:"MAX_DEPOSIT_REQUESTS_PER_PAYLOAD"
@@ -339,7 +318,7 @@
MAX_DEPOSIT_REQUESTS_PER_PAYLOAD: uint64 = 8192
</spec>
- name: MAX_EFFECTIVE_BALANCE#phase0
- name: MAX_EFFECTIVE_BALANCE
sources:
- file: config/params/config.go
search: MaxEffectiveBalance\s+.*yaml:"MAX_EFFECTIVE_BALANCE"
@@ -349,7 +328,7 @@
MAX_EFFECTIVE_BALANCE: Gwei = 32000000000
</spec>
- name: MAX_EFFECTIVE_BALANCE_ELECTRA#electra
- name: MAX_EFFECTIVE_BALANCE_ELECTRA
sources:
- file: config/params/config.go
search: MaxEffectiveBalanceElectra\s+.*yaml:"MAX_EFFECTIVE_BALANCE_ELECTRA"
@@ -359,7 +338,7 @@
MAX_EFFECTIVE_BALANCE_ELECTRA: Gwei = 2048000000000
</spec>
- name: MAX_EXTRA_DATA_BYTES#bellatrix
- name: MAX_EXTRA_DATA_BYTES
sources:
- file: config/params/config.go
search: MaxExtraDataBytes\s+.*yaml:"MAX_EXTRA_DATA_BYTES"
@@ -369,14 +348,7 @@
MAX_EXTRA_DATA_BYTES = 32
</spec>
- name: MAX_PAYLOAD_ATTESTATIONS#gloas
sources: []
spec: |
<spec preset_var="MAX_PAYLOAD_ATTESTATIONS" fork="gloas" hash="fc24e7ea">
MAX_PAYLOAD_ATTESTATIONS = 4
</spec>
- name: MAX_PENDING_DEPOSITS_PER_EPOCH#electra
- name: MAX_PENDING_DEPOSITS_PER_EPOCH
sources:
- file: config/params/config.go
search: MaxPendingDepositsPerEpoch\s+.*yaml:"MAX_PENDING_DEPOSITS_PER_EPOCH"
@@ -386,7 +358,7 @@
MAX_PENDING_DEPOSITS_PER_EPOCH: uint64 = 16
</spec>
- name: MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP#electra
- name: MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP
sources:
- file: config/params/config.go
search: MaxPendingPartialsPerWithdrawalsSweep\s+.*yaml:"MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP"
@@ -396,7 +368,7 @@
MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP: uint64 = 8
</spec>
- name: MAX_PROPOSER_SLASHINGS#phase0
- name: MAX_PROPOSER_SLASHINGS
sources:
- file: config/params/config.go
search: MaxProposerSlashings\s+.*yaml:"MAX_PROPOSER_SLASHINGS"
@@ -406,7 +378,7 @@
MAX_PROPOSER_SLASHINGS = 16
</spec>
- name: MAX_SEED_LOOKAHEAD#phase0
- name: MAX_SEED_LOOKAHEAD
sources:
- file: config/params/config.go
search: MaxSeedLookahead\s+.*yaml:"MAX_SEED_LOOKAHEAD"
@@ -416,7 +388,7 @@
MAX_SEED_LOOKAHEAD: uint64 = 4
</spec>
- name: MAX_TRANSACTIONS_PER_PAYLOAD#bellatrix
- name: MAX_TRANSACTIONS_PER_PAYLOAD
sources:
- file: config/params/config.go
search: MaxTransactionsPerPayload\s+.*yaml:"MAX_TRANSACTIONS_PER_PAYLOAD"
@@ -446,7 +418,7 @@
MAX_VALIDATORS_PER_COMMITTEE: uint64 = 2048
</spec>
- name: MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP#capella
- name: MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP
sources:
- file: config/params/config.go
search: MaxValidatorsPerWithdrawalsSweep\s+.*yaml:"MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP"
@@ -456,7 +428,7 @@
MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP = 16384
</spec>
- name: MAX_VOLUNTARY_EXITS#phase0
- name: MAX_VOLUNTARY_EXITS
sources:
- file: config/params/config.go
search: MaxVoluntaryExits\s+.*yaml:"MAX_VOLUNTARY_EXITS"
@@ -466,7 +438,7 @@
MAX_VOLUNTARY_EXITS = 16
</spec>
- name: MAX_WITHDRAWALS_PER_PAYLOAD#capella
- name: MAX_WITHDRAWALS_PER_PAYLOAD
sources:
- file: config/fieldparams/mainnet.go
search: MaxWithdrawalsPerPayload\s*=
@@ -476,7 +448,7 @@
MAX_WITHDRAWALS_PER_PAYLOAD: uint64 = 16
</spec>
- name: MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD#electra
- name: MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD
sources:
- file: config/params/config.go
search: MaxWithdrawalRequestsPerPayload\s+.*yaml:"MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD"
@@ -486,7 +458,7 @@
MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD: uint64 = 16
</spec>
- name: MIN_ACTIVATION_BALANCE#electra
- name: MIN_ACTIVATION_BALANCE
sources:
- file: config/params/config.go
search: MinActivationBalance\s+.*yaml:"MIN_ACTIVATION_BALANCE"
@@ -496,7 +468,7 @@
MIN_ACTIVATION_BALANCE: Gwei = 32000000000
</spec>
- name: MIN_ATTESTATION_INCLUSION_DELAY#phase0
- name: MIN_ATTESTATION_INCLUSION_DELAY
sources:
- file: config/params/config.go
search: MinAttestationInclusionDelay\s+.*yaml:"MIN_ATTESTATION_INCLUSION_DELAY"
@@ -506,7 +478,7 @@
MIN_ATTESTATION_INCLUSION_DELAY: uint64 = 1
</spec>
- name: MIN_DEPOSIT_AMOUNT#phase0
- name: MIN_DEPOSIT_AMOUNT
sources:
- file: config/params/config.go
search: MinDepositAmount\s+.*yaml:"MIN_DEPOSIT_AMOUNT"
@@ -516,7 +488,7 @@
MIN_DEPOSIT_AMOUNT: Gwei = 1000000000
</spec>
- name: MIN_EPOCHS_TO_INACTIVITY_PENALTY#phase0
- name: MIN_EPOCHS_TO_INACTIVITY_PENALTY
sources:
- file: config/params/config.go
search: MinEpochsToInactivityPenalty\s+.*yaml:"MIN_EPOCHS_TO_INACTIVITY_PENALTY"
@@ -526,7 +498,7 @@
MIN_EPOCHS_TO_INACTIVITY_PENALTY: uint64 = 4
</spec>
- name: MIN_SEED_LOOKAHEAD#phase0
- name: MIN_SEED_LOOKAHEAD
sources:
- file: config/params/config.go
search: MinSeedLookahead\s+.*yaml:"MIN_SEED_LOOKAHEAD"
@@ -536,7 +508,7 @@
MIN_SEED_LOOKAHEAD: uint64 = 1
</spec>
- name: MIN_SLASHING_PENALTY_QUOTIENT#phase0
- name: MIN_SLASHING_PENALTY_QUOTIENT
sources:
- file: config/params/config.go
search: MinSlashingPenaltyQuotient\s+.*yaml:"MIN_SLASHING_PENALTY_QUOTIENT"
@@ -546,7 +518,7 @@
MIN_SLASHING_PENALTY_QUOTIENT: uint64 = 128
</spec>
- name: MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR#altair
- name: MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR
sources:
- file: config/params/config.go
search: MinSlashingPenaltyQuotientAltair\s+.*yaml:"MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR"
@@ -556,7 +528,7 @@
MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR: uint64 = 64
</spec>
- name: MIN_SLASHING_PENALTY_QUOTIENT_BELLATRIX#bellatrix
- name: MIN_SLASHING_PENALTY_QUOTIENT_BELLATRIX
sources:
- file: config/params/config.go
search: MinSlashingPenaltyQuotientBellatrix\s+.*yaml:"MIN_SLASHING_PENALTY_QUOTIENT_BELLATRIX"
@@ -566,7 +538,7 @@
MIN_SLASHING_PENALTY_QUOTIENT_BELLATRIX: uint64 = 32
</spec>
- name: MIN_SLASHING_PENALTY_QUOTIENT_ELECTRA#electra
- name: MIN_SLASHING_PENALTY_QUOTIENT_ELECTRA
sources:
- file: config/params/config.go
search: MinSlashingPenaltyQuotientElectra\s+.*yaml:"MIN_SLASHING_PENALTY_QUOTIENT_ELECTRA"
@@ -576,7 +548,7 @@
MIN_SLASHING_PENALTY_QUOTIENT_ELECTRA: uint64 = 4096
</spec>
- name: MIN_SYNC_COMMITTEE_PARTICIPANTS#altair
- name: MIN_SYNC_COMMITTEE_PARTICIPANTS
sources:
- file: config/params/config.go
search: MinSyncCommitteeParticipants\s+.*yaml:"MIN_SYNC_COMMITTEE_PARTICIPANTS"
@@ -586,7 +558,7 @@
MIN_SYNC_COMMITTEE_PARTICIPANTS = 1
</spec>
- name: NUMBER_OF_COLUMNS#fulu
- name: NUMBER_OF_COLUMNS
sources:
- file: config/fieldparams/mainnet.go
search: NumberOfColumns\s*=
@@ -596,7 +568,7 @@
NUMBER_OF_COLUMNS: uint64 = 128
</spec>
- name: PENDING_CONSOLIDATIONS_LIMIT#electra
- name: PENDING_CONSOLIDATIONS_LIMIT
sources:
- file: config/fieldparams/mainnet.go
search: PendingConsolidationsLimit\s*=
@@ -606,7 +578,7 @@
PENDING_CONSOLIDATIONS_LIMIT: uint64 = 262144
</spec>
- name: PENDING_DEPOSITS_LIMIT#electra
- name: PENDING_DEPOSITS_LIMIT
sources:
- file: config/fieldparams/mainnet.go
search: PendingDepositsLimit\s*=
@@ -616,7 +588,7 @@
PENDING_DEPOSITS_LIMIT: uint64 = 134217728
</spec>
- name: PENDING_PARTIAL_WITHDRAWALS_LIMIT#electra
- name: PENDING_PARTIAL_WITHDRAWALS_LIMIT
sources:
- file: config/fieldparams/mainnet.go
search: PendingPartialWithdrawalsLimit\s*=
@@ -626,7 +598,7 @@
PENDING_PARTIAL_WITHDRAWALS_LIMIT: uint64 = 134217728
</spec>
- name: PROPORTIONAL_SLASHING_MULTIPLIER#phase0
- name: PROPORTIONAL_SLASHING_MULTIPLIER
sources:
- file: config/params/config.go
search: ProportionalSlashingMultiplier\s+.*yaml:"PROPORTIONAL_SLASHING_MULTIPLIER"
@@ -636,7 +608,7 @@
PROPORTIONAL_SLASHING_MULTIPLIER: uint64 = 1
</spec>
- name: PROPORTIONAL_SLASHING_MULTIPLIER_ALTAIR#altair
- name: PROPORTIONAL_SLASHING_MULTIPLIER_ALTAIR
sources:
- file: config/params/config.go
search: ProportionalSlashingMultiplierAltair\s+.*yaml:"PROPORTIONAL_SLASHING_MULTIPLIER_ALTAIR"
@@ -646,7 +618,7 @@
PROPORTIONAL_SLASHING_MULTIPLIER_ALTAIR: uint64 = 2
</spec>
- name: PROPORTIONAL_SLASHING_MULTIPLIER_BELLATRIX#bellatrix
- name: PROPORTIONAL_SLASHING_MULTIPLIER_BELLATRIX
sources:
- file: config/params/config.go
search: ProportionalSlashingMultiplierBellatrix\s+.*yaml:"PROPORTIONAL_SLASHING_MULTIPLIER_BELLATRIX"
@@ -656,7 +628,7 @@
PROPORTIONAL_SLASHING_MULTIPLIER_BELLATRIX: uint64 = 3
</spec>
- name: PROPOSER_REWARD_QUOTIENT#phase0
- name: PROPOSER_REWARD_QUOTIENT
sources:
- file: config/params/config.go
search: ProposerRewardQuotient\s+.*yaml:"PROPOSER_REWARD_QUOTIENT"
@@ -666,14 +638,7 @@
PROPOSER_REWARD_QUOTIENT: uint64 = 8
</spec>
- name: PTC_SIZE#gloas
sources: []
spec: |
<spec preset_var="PTC_SIZE" fork="gloas" hash="d61c5930">
PTC_SIZE: uint64 = 512
</spec>
- name: SHUFFLE_ROUND_COUNT#phase0
- name: SHUFFLE_ROUND_COUNT
sources:
- file: config/params/config.go
search: ShuffleRoundCount\s+.*yaml:"SHUFFLE_ROUND_COUNT"
@@ -683,7 +648,7 @@
SHUFFLE_ROUND_COUNT: uint64 = 90
</spec>
- name: SLOTS_PER_EPOCH#phase0
- name: SLOTS_PER_EPOCH
sources:
- file: config/fieldparams/mainnet.go
search: SlotsPerEpoch\s*=
@@ -693,7 +658,7 @@
SLOTS_PER_EPOCH: uint64 = 32
</spec>
- name: SLOTS_PER_HISTORICAL_ROOT#phase0
- name: SLOTS_PER_HISTORICAL_ROOT
sources:
- file: config/fieldparams/mainnet.go
search: BlockRootsLength\s*=
@@ -703,7 +668,7 @@
SLOTS_PER_HISTORICAL_ROOT: uint64 = 8192
</spec>
- name: SYNC_COMMITTEE_SIZE#altair
- name: SYNC_COMMITTEE_SIZE
sources:
- file: config/fieldparams/mainnet.go
search: SyncCommitteeLength\s*=
@@ -713,7 +678,7 @@
SYNC_COMMITTEE_SIZE: uint64 = 512
</spec>
- name: TARGET_COMMITTEE_SIZE#phase0
- name: TARGET_COMMITTEE_SIZE
sources:
- file: config/params/config.go
search: TargetCommitteeSize\s+.*yaml:"TARGET_COMMITTEE_SIZE"
@@ -723,7 +688,7 @@
TARGET_COMMITTEE_SIZE: uint64 = 128
</spec>
- name: UPDATE_TIMEOUT#altair
- name: UPDATE_TIMEOUT
sources:
- file: beacon-chain/rpc/eth/config/handlers.go
search: data\["UPDATE_TIMEOUT"\]
@@ -733,7 +698,7 @@
UPDATE_TIMEOUT = 8192
</spec>
- name: VALIDATOR_REGISTRY_LIMIT#phase0
- name: VALIDATOR_REGISTRY_LIMIT
sources:
- file: config/fieldparams/mainnet.go
search: ValidatorRegistryLimit\s*=
@@ -743,7 +708,7 @@
VALIDATOR_REGISTRY_LIMIT: uint64 = 1099511627776
</spec>
- name: WHISTLEBLOWER_REWARD_QUOTIENT#phase0
- name: WHISTLEBLOWER_REWARD_QUOTIENT
sources:
- file: config/params/config.go
search: WhistleBlowerRewardQuotient\s+.*yaml:"WHISTLEBLOWER_REWARD_QUOTIENT"
@@ -753,7 +718,7 @@
WHISTLEBLOWER_REWARD_QUOTIENT: uint64 = 512
</spec>
- name: WHISTLEBLOWER_REWARD_QUOTIENT_ELECTRA#electra
- name: WHISTLEBLOWER_REWARD_QUOTIENT_ELECTRA
sources:
- file: config/params/config.go
search: WhistleBlowerRewardQuotientElectra\s+.*yaml:"WHISTLEBLOWER_REWARD_QUOTIENT_ELECTRA"

View File

@@ -283,18 +283,16 @@ func (mr *MockValidatorClientMockRecorder) ProposeExit(ctx, in any) *gomock.Call
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ProposeExit", reflect.TypeOf((*MockValidatorClient)(nil).ProposeExit), ctx, in)
}
// EnsureReady mocks base method.
func (m *MockValidatorClient) EnsureReady(ctx context.Context) bool {
// SwitchHost mocks base method.
func (m *MockValidatorClient) SwitchHost(host string) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "EnsureReady", ctx)
ret0, _ := ret[0].(bool)
return ret0
m.ctrl.Call(m, "SwitchHost", host)
}
// EnsureReady indicates an expected call of EnsureReady.
func (mr *MockValidatorClientMockRecorder) EnsureReady(ctx any) *gomock.Call {
// SwitchHost indicates an expected call of SwitchHost.
func (mr *MockValidatorClientMockRecorder) SwitchHost(host any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EnsureReady", reflect.TypeOf((*MockValidatorClient)(nil).EnsureReady), ctx)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SwitchHost", reflect.TypeOf((*MockValidatorClient)(nil).SwitchHost), host)
}
// StartEventStream mocks base method.

View File

@@ -128,18 +128,18 @@ func (mr *MockValidatorMockRecorder) EventsChan() *gomock.Call {
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EventsChan", reflect.TypeOf((*MockValidator)(nil).EventsChan))
}
// EnsureReady mocks base method.
func (m *MockValidator) EnsureReady(arg0 context.Context) bool {
// FindHealthyHost mocks base method.
func (m *MockValidator) FindHealthyHost(arg0 context.Context) bool {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "EnsureReady", arg0)
ret := m.ctrl.Call(m, "FindHealthyHost", arg0)
ret0, _ := ret[0].(bool)
return ret0
}
// EnsureReady indicates an expected call of EnsureReady.
func (mr *MockValidatorMockRecorder) EnsureReady(arg0 any) *gomock.Call {
// FindHealthyHost indicates an expected call of FindHealthyHost.
func (mr *MockValidatorMockRecorder) FindHealthyHost(arg0 any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EnsureReady", reflect.TypeOf((*MockValidator)(nil).EnsureReady), arg0)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindHealthyHost", reflect.TypeOf((*MockValidator)(nil).FindHealthyHost), arg0)
}
// GenesisTime mocks base method.

View File

@@ -122,6 +122,7 @@ go_test(
embed = [":go_default_library"],
deps = [
"//api/grpc:go_default_library",
"//api/rest:go_default_library",
"//api/server/structs:go_default_library",
"//async/event:go_default_library",
"//beacon-chain/core/signing:go_default_library",

View File

@@ -42,7 +42,6 @@ go_library(
"//api:go_default_library",
"//api/apiutil:go_default_library",
"//api/client/event:go_default_library",
"//api/fallback:go_default_library",
"//api/rest:go_default_library",
"//api/server/structs:go_default_library",
"//beacon-chain/core/helpers:go_default_library",

View File

@@ -26,7 +26,7 @@ func (c *beaconApiValidatorClient) attestationData(
query := apiutil.BuildURL("/eth/v1/validator/attestation_data", params)
produceAttestationDataResponseJson := structs.GetAttestationDataResponse{}
if err := c.handler.Get(ctx, query, &produceAttestationDataResponseJson); err != nil {
if err := c.jsonRestHandler.Get(ctx, query, &produceAttestationDataResponseJson); err != nil {
return nil, err
}

View File

@@ -28,10 +28,10 @@ func TestGetAttestationData_ValidAttestation(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
produceAttestationDataResponseJson := structs.GetAttestationDataResponse{}
handler.EXPECT().Get(
jsonRestHandler.EXPECT().Get(
gomock.Any(),
fmt.Sprintf("/eth/v1/validator/attestation_data?committee_index=%d&slot=%d", expectedCommitteeIndex, expectedSlot),
&produceAttestationDataResponseJson,
@@ -56,7 +56,7 @@ func TestGetAttestationData_ValidAttestation(t *testing.T) {
},
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
resp, err := validatorClient.attestationData(ctx, primitives.Slot(expectedSlot), primitives.CommitteeIndex(expectedCommitteeIndex))
assert.NoError(t, err)
@@ -180,8 +180,8 @@ func TestGetAttestationData_InvalidData(t *testing.T) {
defer ctrl.Finish()
produceAttestationDataResponseJson := structs.GetAttestationDataResponse{}
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Get(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get(
gomock.Any(),
"/eth/v1/validator/attestation_data?committee_index=2&slot=1",
&produceAttestationDataResponseJson,
@@ -192,7 +192,7 @@ func TestGetAttestationData_InvalidData(t *testing.T) {
testCase.generateData(),
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
_, err := validatorClient.attestationData(ctx, 1, 2)
assert.ErrorContains(t, testCase.expectedErrorMessage, err)
})
@@ -208,9 +208,9 @@ func TestGetAttestationData_JsonResponseError(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
produceAttestationDataResponseJson := structs.GetAttestationDataResponse{}
handler.EXPECT().Get(
jsonRestHandler.EXPECT().Get(
gomock.Any(),
fmt.Sprintf("/eth/v1/validator/attestation_data?committee_index=%d&slot=%d", committeeIndex, slot),
&produceAttestationDataResponseJson,
@@ -218,7 +218,7 @@ func TestGetAttestationData_JsonResponseError(t *testing.T) {
errors.New("some specific json response error"),
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
_, err := validatorClient.attestationData(ctx, slot, committeeIndex)
assert.ErrorContains(t, "some specific json response error", err)
}

View File

@@ -18,13 +18,13 @@ import (
type beaconApiChainClient struct {
fallbackClient iface.ChainClient
handler rest.Handler
jsonRestHandler rest.RestHandler
stateValidatorsProvider StateValidatorsProvider
}
func (c beaconApiChainClient) headBlockHeaders(ctx context.Context) (*structs.GetBlockHeaderResponse, error) {
blockHeader := structs.GetBlockHeaderResponse{}
err := c.handler.Get(ctx, "/eth/v1/beacon/headers/head", &blockHeader)
err := c.jsonRestHandler.Get(ctx, "/eth/v1/beacon/headers/head", &blockHeader)
if err != nil {
return nil, err
}
@@ -44,7 +44,7 @@ func (c beaconApiChainClient) ChainHead(ctx context.Context, _ *empty.Empty) (*e
const endpoint = "/eth/v1/beacon/states/head/finality_checkpoints"
finalityCheckpoints := structs.GetFinalityCheckpointsResponse{}
if err := c.handler.Get(ctx, endpoint, &finalityCheckpoints); err != nil {
if err := c.jsonRestHandler.Get(ctx, endpoint, &finalityCheckpoints); err != nil {
return nil, err
}
@@ -328,10 +328,10 @@ func (c beaconApiChainClient) ValidatorParticipation(ctx context.Context, in *et
return nil, errors.New("beaconApiChainClient.ValidatorParticipation is not implemented. To use a fallback client, pass a fallback client as the last argument of NewBeaconApiChainClientWithFallback.")
}
func NewBeaconApiChainClientWithFallback(handler rest.Handler, fallbackClient iface.ChainClient) iface.ChainClient {
func NewBeaconApiChainClientWithFallback(jsonRestHandler rest.RestHandler, fallbackClient iface.ChainClient) iface.ChainClient {
return &beaconApiChainClient{
handler: handler,
jsonRestHandler: jsonRestHandler,
fallbackClient: fallbackClient,
stateValidatorsProvider: beaconApiStateValidatorsProvider{handler: handler},
stateValidatorsProvider: beaconApiStateValidatorsProvider{jsonRestHandler: jsonRestHandler},
}
}

View File

@@ -115,12 +115,12 @@ func TestListValidators(t *testing.T) {
nil,
)
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Get(gomock.Any(), blockHeaderEndpoint, gomock.Any()).Return(errors.New("bar error"))
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get(gomock.Any(), blockHeaderEndpoint, gomock.Any()).Return(errors.New("bar error"))
beaconChainClient := beaconApiChainClient{
stateValidatorsProvider: stateValidatorsProvider,
handler: handler,
jsonRestHandler: jsonRestHandler,
}
_, err := beaconChainClient.Validators(ctx, &ethpb.ListValidatorsRequest{
QueryFilter: nil,
@@ -188,8 +188,8 @@ func TestListValidators(t *testing.T) {
nil,
)
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Get(gomock.Any(), blockHeaderEndpoint, gomock.Any()).Return(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get(gomock.Any(), blockHeaderEndpoint, gomock.Any()).Return(
nil,
).SetArg(
2,
@@ -198,7 +198,7 @@ func TestListValidators(t *testing.T) {
beaconChainClient := beaconApiChainClient{
stateValidatorsProvider: stateValidatorsProvider,
handler: handler,
jsonRestHandler: jsonRestHandler,
}
_, err := beaconChainClient.Validators(ctx, &ethpb.ListValidatorsRequest{
QueryFilter: nil,
@@ -740,15 +740,15 @@ func TestGetChainHead(t *testing.T) {
ctx := t.Context()
finalityCheckpointsResponse := structs.GetFinalityCheckpointsResponse{}
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Get(gomock.Any(), finalityCheckpointsEndpoint, &finalityCheckpointsResponse).Return(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get(gomock.Any(), finalityCheckpointsEndpoint, &finalityCheckpointsResponse).Return(
testCase.finalityCheckpointsError,
).SetArg(
2,
testCase.generateFinalityCheckpointsResponse(),
)
beaconChainClient := beaconApiChainClient{handler: handler}
beaconChainClient := beaconApiChainClient{jsonRestHandler: jsonRestHandler}
_, err := beaconChainClient.ChainHead(ctx, &emptypb.Empty{})
assert.ErrorContains(t, testCase.expectedError, err)
})
@@ -837,10 +837,10 @@ func TestGetChainHead(t *testing.T) {
defer ctrl.Finish()
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
finalityCheckpointsResponse := structs.GetFinalityCheckpointsResponse{}
handler.EXPECT().Get(gomock.Any(), finalityCheckpointsEndpoint, &finalityCheckpointsResponse).Return(
jsonRestHandler.EXPECT().Get(gomock.Any(), finalityCheckpointsEndpoint, &finalityCheckpointsResponse).Return(
nil,
).SetArg(
2,
@@ -848,14 +848,14 @@ func TestGetChainHead(t *testing.T) {
)
headBlockHeadersResponse := structs.GetBlockHeaderResponse{}
handler.EXPECT().Get(gomock.Any(), headBlockHeadersEndpoint, &headBlockHeadersResponse).Return(
jsonRestHandler.EXPECT().Get(gomock.Any(), headBlockHeadersEndpoint, &headBlockHeadersResponse).Return(
testCase.headBlockHeadersError,
).SetArg(
2,
testCase.generateHeadBlockHeadersResponse(),
)
beaconChainClient := beaconApiChainClient{handler: handler}
beaconChainClient := beaconApiChainClient{jsonRestHandler: jsonRestHandler}
_, err := beaconChainClient.ChainHead(ctx, &emptypb.Empty{})
assert.ErrorContains(t, testCase.expectedError, err)
})
@@ -867,10 +867,10 @@ func TestGetChainHead(t *testing.T) {
defer ctrl.Finish()
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
finalityCheckpointsResponse := structs.GetFinalityCheckpointsResponse{}
handler.EXPECT().Get(gomock.Any(), finalityCheckpointsEndpoint, &finalityCheckpointsResponse).Return(
jsonRestHandler.EXPECT().Get(gomock.Any(), finalityCheckpointsEndpoint, &finalityCheckpointsResponse).Return(
nil,
).SetArg(
2,
@@ -878,7 +878,7 @@ func TestGetChainHead(t *testing.T) {
)
headBlockHeadersResponse := structs.GetBlockHeaderResponse{}
handler.EXPECT().Get(gomock.Any(), headBlockHeadersEndpoint, &headBlockHeadersResponse).Return(
jsonRestHandler.EXPECT().Get(gomock.Any(), headBlockHeadersEndpoint, &headBlockHeadersResponse).Return(
nil,
).SetArg(
2,
@@ -909,7 +909,7 @@ func TestGetChainHead(t *testing.T) {
HeadEpoch: slots.ToEpoch(8),
}
beaconChainClient := beaconApiChainClient{handler: handler}
beaconChainClient := beaconApiChainClient{jsonRestHandler: jsonRestHandler}
chainHead, err := beaconChainClient.ChainHead(ctx, &emptypb.Empty{})
require.NoError(t, err)
assert.DeepEqual(t, expectedChainHead, chainHead)

View File

@@ -29,7 +29,7 @@ func (c *beaconApiValidatorClient) fork(ctx context.Context) (*structs.GetStateF
stateForkResponseJson := &structs.GetStateForkResponse{}
if err := c.handler.Get(ctx, endpoint, stateForkResponseJson); err != nil {
if err := c.jsonRestHandler.Get(ctx, endpoint, stateForkResponseJson); err != nil {
return nil, err
}
@@ -41,7 +41,7 @@ func (c *beaconApiValidatorClient) headers(ctx context.Context) (*structs.GetBlo
blockHeadersResponseJson := &structs.GetBlockHeadersResponse{}
if err := c.handler.Get(ctx, endpoint, blockHeadersResponseJson); err != nil {
if err := c.jsonRestHandler.Get(ctx, endpoint, blockHeadersResponseJson); err != nil {
return nil, err
}
@@ -59,7 +59,7 @@ func (c *beaconApiValidatorClient) liveness(ctx context.Context, epoch primitive
return nil, errors.Wrapf(err, "failed to marshal validator indexes")
}
if err = c.handler.Post(ctx, url, nil, bytes.NewBuffer(marshalledJsonValidatorIndexes), livenessResponseJson); err != nil {
if err = c.jsonRestHandler.Post(ctx, url, nil, bytes.NewBuffer(marshalledJsonValidatorIndexes), livenessResponseJson); err != nil {
return nil, err
}
@@ -71,7 +71,7 @@ func (c *beaconApiValidatorClient) syncing(ctx context.Context) (*structs.SyncSt
syncingResponseJson := &structs.SyncStatusResponse{}
if err := c.handler.Get(ctx, endpoint, syncingResponseJson); err != nil {
if err := c.jsonRestHandler.Get(ctx, endpoint, syncingResponseJson); err != nil {
return nil, err
}

View File

@@ -20,7 +20,7 @@ func TestGetFork_Nominal(t *testing.T) {
defer ctrl.Finish()
stateForkResponseJson := structs.GetStateForkResponse{}
handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
expected := structs.GetStateForkResponse{
Data: &structs.Fork{
@@ -32,7 +32,7 @@ func TestGetFork_Nominal(t *testing.T) {
ctx := t.Context()
handler.EXPECT().Get(
jsonRestHandler.EXPECT().Get(
gomock.Any(),
forkEndpoint,
&stateForkResponseJson,
@@ -44,7 +44,7 @@ func TestGetFork_Nominal(t *testing.T) {
).Times(1)
validatorClient := beaconApiValidatorClient{
handler: handler,
jsonRestHandler: jsonRestHandler,
}
fork, err := validatorClient.fork(ctx)
@@ -56,11 +56,11 @@ func TestGetFork_Invalid(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
ctx := t.Context()
handler.EXPECT().Get(
jsonRestHandler.EXPECT().Get(
gomock.Any(),
forkEndpoint,
gomock.Any(),
@@ -69,7 +69,7 @@ func TestGetFork_Invalid(t *testing.T) {
).Times(1)
validatorClient := beaconApiValidatorClient{
handler: handler,
jsonRestHandler: jsonRestHandler,
}
_, err := validatorClient.fork(ctx)
@@ -83,7 +83,7 @@ func TestGetHeaders_Nominal(t *testing.T) {
defer ctrl.Finish()
blockHeadersResponseJson := structs.GetBlockHeadersResponse{}
handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
expected := structs.GetBlockHeadersResponse{
Data: []*structs.SignedBeaconBlockHeaderContainer{
@@ -99,7 +99,7 @@ func TestGetHeaders_Nominal(t *testing.T) {
ctx := t.Context()
handler.EXPECT().Get(
jsonRestHandler.EXPECT().Get(
gomock.Any(),
headersEndpoint,
&blockHeadersResponseJson,
@@ -111,7 +111,7 @@ func TestGetHeaders_Nominal(t *testing.T) {
).Times(1)
validatorClient := beaconApiValidatorClient{
handler: handler,
jsonRestHandler: jsonRestHandler,
}
headers, err := validatorClient.headers(ctx)
@@ -123,11 +123,11 @@ func TestGetHeaders_Invalid(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
ctx := t.Context()
handler.EXPECT().Get(
jsonRestHandler.EXPECT().Get(
gomock.Any(),
headersEndpoint,
gomock.Any(),
@@ -136,7 +136,7 @@ func TestGetHeaders_Invalid(t *testing.T) {
).Times(1)
validatorClient := beaconApiValidatorClient{
handler: handler,
jsonRestHandler: jsonRestHandler,
}
_, err := validatorClient.headers(ctx)
@@ -170,8 +170,8 @@ func TestGetLiveness_Nominal(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Post(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post(
gomock.Any(),
livenessEndpoint,
nil,
@@ -184,7 +184,7 @@ func TestGetLiveness_Nominal(t *testing.T) {
nil,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
liveness, err := validatorClient.liveness(ctx, 42, indexes)
require.NoError(t, err)
@@ -197,8 +197,8 @@ func TestGetLiveness_Invalid(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Post(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post(
gomock.Any(),
livenessEndpoint,
nil,
@@ -208,7 +208,7 @@ func TestGetLiveness_Invalid(t *testing.T) {
errors.New("custom error"),
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
_, err := validatorClient.liveness(ctx, 42, nil)
require.ErrorContains(t, "custom error", err)
@@ -237,7 +237,7 @@ func TestGetIsSyncing_Nominal(t *testing.T) {
defer ctrl.Finish()
syncingResponseJson := structs.SyncStatusResponse{}
handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
expected := structs.SyncStatusResponse{
Data: &structs.SyncStatusResponseData{
@@ -247,7 +247,7 @@ func TestGetIsSyncing_Nominal(t *testing.T) {
ctx := t.Context()
handler.EXPECT().Get(
jsonRestHandler.EXPECT().Get(
gomock.Any(),
syncingEndpoint,
&syncingResponseJson,
@@ -259,7 +259,7 @@ func TestGetIsSyncing_Nominal(t *testing.T) {
).Times(1)
validatorClient := beaconApiValidatorClient{
handler: handler,
jsonRestHandler: jsonRestHandler,
}
isSyncing, err := validatorClient.isSyncing(ctx)
@@ -274,11 +274,11 @@ func TestGetIsSyncing_Invalid(t *testing.T) {
defer ctrl.Finish()
syncingResponseJson := structs.SyncStatusResponse{}
handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
ctx := t.Context()
handler.EXPECT().Get(
jsonRestHandler.EXPECT().Get(
gomock.Any(),
syncingEndpoint,
&syncingResponseJson,
@@ -287,7 +287,7 @@ func TestGetIsSyncing_Invalid(t *testing.T) {
).Times(1)
validatorClient := beaconApiValidatorClient{
handler: handler,
jsonRestHandler: jsonRestHandler,
}
isSyncing, err := validatorClient.isSyncing(ctx)

View File

@@ -21,13 +21,13 @@ var (
type beaconApiNodeClient struct {
fallbackClient iface.NodeClient
handler rest.Handler
jsonRestHandler rest.RestHandler
genesisProvider GenesisProvider
}
func (c *beaconApiNodeClient) SyncStatus(ctx context.Context, _ *empty.Empty) (*ethpb.SyncStatus, error) {
syncingResponse := structs.SyncStatusResponse{}
if err := c.handler.Get(ctx, "/eth/v1/node/syncing", &syncingResponse); err != nil {
if err := c.jsonRestHandler.Get(ctx, "/eth/v1/node/syncing", &syncingResponse); err != nil {
return nil, err
}
@@ -57,7 +57,7 @@ func (c *beaconApiNodeClient) Genesis(ctx context.Context, _ *empty.Empty) (*eth
}
depositContractJson := structs.GetDepositContractResponse{}
if err = c.handler.Get(ctx, "/eth/v1/config/deposit_contract", &depositContractJson); err != nil {
if err = c.jsonRestHandler.Get(ctx, "/eth/v1/config/deposit_contract", &depositContractJson); err != nil {
return nil, err
}
@@ -81,7 +81,7 @@ func (c *beaconApiNodeClient) Genesis(ctx context.Context, _ *empty.Empty) (*eth
func (c *beaconApiNodeClient) Version(ctx context.Context, _ *empty.Empty) (*ethpb.Version, error) {
var versionResponse structs.GetVersionResponse
if err := c.handler.Get(ctx, "/eth/v1/node/version", &versionResponse); err != nil {
if err := c.jsonRestHandler.Get(ctx, "/eth/v1/node/version", &versionResponse); err != nil {
return nil, err
}
@@ -106,9 +106,9 @@ func (c *beaconApiNodeClient) Peers(ctx context.Context, in *empty.Empty) (*ethp
// IsReady returns true only if the node is fully synced (200 OK).
// A 206 Partial Content response indicates the node is syncing and not ready.
func (c *beaconApiNodeClient) IsReady(ctx context.Context) bool {
statusCode, err := c.handler.GetStatusCode(ctx, "/eth/v1/node/health")
statusCode, err := c.jsonRestHandler.GetStatusCode(ctx, "/eth/v1/node/health")
if err != nil {
log.WithError(err).WithField("url", c.handler.Host()).Error("failed to get health of node")
log.WithError(err).Error("failed to get health of node")
return false
}
// Only 200 OK means the node is fully synced and ready.
@@ -116,11 +116,11 @@ func (c *beaconApiNodeClient) IsReady(ctx context.Context) bool {
return statusCode == http.StatusOK
}
func NewNodeClientWithFallback(handler rest.Handler, fallbackClient iface.NodeClient) iface.NodeClient {
func NewNodeClientWithFallback(jsonRestHandler rest.RestHandler, fallbackClient iface.NodeClient) iface.NodeClient {
b := &beaconApiNodeClient{
handler: handler,
jsonRestHandler: jsonRestHandler,
fallbackClient: fallbackClient,
genesisProvider: &beaconApiGenesisProvider{handler: handler},
genesisProvider: &beaconApiGenesisProvider{jsonRestHandler: jsonRestHandler},
}
return b
}

View File

@@ -120,10 +120,10 @@ func TestGetGenesis(t *testing.T) {
)
depositContractJson := structs.GetDepositContractResponse{}
handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
if testCase.queriesDepositContract {
handler.EXPECT().Get(
jsonRestHandler.EXPECT().Get(
gomock.Any(),
"/eth/v1/config/deposit_contract",
&depositContractJson,
@@ -137,7 +137,7 @@ func TestGetGenesis(t *testing.T) {
nodeClient := &beaconApiNodeClient{
genesisProvider: genesisProvider,
handler: handler,
jsonRestHandler: jsonRestHandler,
}
response, err := nodeClient.Genesis(ctx, &emptypb.Empty{})
@@ -201,8 +201,8 @@ func TestGetSyncStatus(t *testing.T) {
ctx := t.Context()
syncingResponse := structs.SyncStatusResponse{}
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Get(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get(
gomock.Any(),
syncingEndpoint,
&syncingResponse,
@@ -213,7 +213,7 @@ func TestGetSyncStatus(t *testing.T) {
testCase.restEndpointResponse,
)
nodeClient := &beaconApiNodeClient{handler: handler}
nodeClient := &beaconApiNodeClient{jsonRestHandler: jsonRestHandler}
syncStatus, err := nodeClient.SyncStatus(ctx, &emptypb.Empty{})
if testCase.expectedResponse == nil {
@@ -265,8 +265,8 @@ func TestGetVersion(t *testing.T) {
ctx := t.Context()
var versionResponse structs.GetVersionResponse
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Get(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get(
gomock.Any(),
versionEndpoint,
&versionResponse,
@@ -277,7 +277,7 @@ func TestGetVersion(t *testing.T) {
testCase.restEndpointResponse,
)
nodeClient := &beaconApiNodeClient{handler: handler}
nodeClient := &beaconApiNodeClient{jsonRestHandler: jsonRestHandler}
version, err := nodeClient.Version(ctx, &emptypb.Empty{})
if testCase.expectedResponse == nil {
@@ -331,14 +331,13 @@ func TestIsReady(t *testing.T) {
defer ctrl.Finish()
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetStatusCode(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetStatusCode(
gomock.Any(),
healthEndpoint,
).Return(tc.statusCode, tc.err)
handler.EXPECT().Host().Return("http://localhost:3500").AnyTimes()
nodeClient := &beaconApiNodeClient{handler: handler}
nodeClient := &beaconApiNodeClient{jsonRestHandler: jsonRestHandler}
result := nodeClient.IsReady(ctx)
assert.Equal(t, tc.expectedResult, result)

View File

@@ -6,7 +6,6 @@ import (
"time"
"github.com/OffchainLabs/prysm/v7/api/client/event"
"github.com/OffchainLabs/prysm/v7/api/fallback"
"github.com/OffchainLabs/prysm/v7/api/rest"
"github.com/OffchainLabs/prysm/v7/consensus-types/primitives"
"github.com/OffchainLabs/prysm/v7/encoding/bytesutil"
@@ -24,28 +23,22 @@ type beaconApiValidatorClient struct {
genesisProvider GenesisProvider
dutiesProvider dutiesProvider
stateValidatorsProvider StateValidatorsProvider
restProvider rest.RestConnectionProvider
handler rest.Handler
nodeClient *beaconApiNodeClient
jsonRestHandler rest.RestHandler
beaconBlockConverter BeaconBlockConverter
prysmChainClient iface.PrysmChainClient
isEventStreamRunning bool
}
func NewBeaconApiValidatorClient(provider rest.RestConnectionProvider, opts ...ValidatorClientOpt) iface.ValidatorClient {
handler := provider.Handler()
nc := &beaconApiNodeClient{handler: handler}
func NewBeaconApiValidatorClient(jsonRestHandler rest.RestHandler, opts ...ValidatorClientOpt) iface.ValidatorClient {
c := &beaconApiValidatorClient{
genesisProvider: &beaconApiGenesisProvider{handler: handler},
dutiesProvider: beaconApiDutiesProvider{handler: handler},
stateValidatorsProvider: beaconApiStateValidatorsProvider{handler: handler},
restProvider: provider,
handler: handler,
nodeClient: nc,
genesisProvider: &beaconApiGenesisProvider{jsonRestHandler: jsonRestHandler},
dutiesProvider: beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler},
stateValidatorsProvider: beaconApiStateValidatorsProvider{jsonRestHandler: jsonRestHandler},
jsonRestHandler: jsonRestHandler,
beaconBlockConverter: beaconApiBeaconBlockConverter{},
prysmChainClient: prysmChainClient{
nodeClient: nc,
handler: handler,
nodeClient: &beaconApiNodeClient{jsonRestHandler: jsonRestHandler},
jsonRestHandler: jsonRestHandler,
},
isEventStreamRunning: false,
}
@@ -287,8 +280,8 @@ func (c *beaconApiValidatorClient) WaitForChainStart(ctx context.Context, _ *emp
}
func (c *beaconApiValidatorClient) StartEventStream(ctx context.Context, topics []string, eventsChannel chan<- *event.Event) {
client := &http.Client{} // event stream should not be subject to the same settings as other api calls
eventStream, err := event.NewEventStream(ctx, client, c.handler.Host(), topics)
client := &http.Client{} // event stream should not be subject to the same settings as other api calls, so we won't use c.jsonRestHandler.HttpClient()
eventStream, err := event.NewEventStream(ctx, client, c.jsonRestHandler.Host(), topics)
if err != nil {
eventsChannel <- &event.Event{
EventType: event.EventError,
@@ -336,9 +329,9 @@ func wrapInMetrics[Resp any](action string, f func() (Resp, error)) (Resp, error
}
func (c *beaconApiValidatorClient) Host() string {
return c.handler.Host()
return c.jsonRestHandler.Host()
}
func (c *beaconApiValidatorClient) EnsureReady(ctx context.Context) bool {
return fallback.EnsureReady(ctx, c.restProvider, c.nodeClient)
func (c *beaconApiValidatorClient) SwitchHost(host string) {
c.jsonRestHandler.SwitchHost(host)
}

View File

@@ -31,9 +31,9 @@ func TestBeaconApiValidatorClient_GetAttestationDataValid(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
produceAttestationDataResponseJson := structs.GetAttestationDataResponse{}
handler.EXPECT().Get(
jsonRestHandler.EXPECT().Get(
gomock.Any(),
fmt.Sprintf("/eth/v1/validator/attestation_data?committee_index=%d&slot=%d", committeeIndex, slot),
&produceAttestationDataResponseJson,
@@ -44,7 +44,7 @@ func TestBeaconApiValidatorClient_GetAttestationDataValid(t *testing.T) {
generateValidAttestation(uint64(slot), uint64(committeeIndex)),
).Times(2)
validatorClient := beaconApiValidatorClient{handler: handler}
validatorClient := beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
expectedResp, expectedErr := validatorClient.attestationData(ctx, slot, committeeIndex)
resp, err := validatorClient.AttestationData(
@@ -65,9 +65,9 @@ func TestBeaconApiValidatorClient_GetAttestationDataError(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
produceAttestationDataResponseJson := structs.GetAttestationDataResponse{}
handler.EXPECT().Get(
jsonRestHandler.EXPECT().Get(
gomock.Any(),
fmt.Sprintf("/eth/v1/validator/attestation_data?committee_index=%d&slot=%d", committeeIndex, slot),
&produceAttestationDataResponseJson,
@@ -78,7 +78,7 @@ func TestBeaconApiValidatorClient_GetAttestationDataError(t *testing.T) {
generateValidAttestation(uint64(slot), uint64(committeeIndex)),
).Times(2)
validatorClient := beaconApiValidatorClient{handler: handler}
validatorClient := beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
expectedResp, expectedErr := validatorClient.attestationData(ctx, slot, committeeIndex)
resp, err := validatorClient.AttestationData(
@@ -139,8 +139,8 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockValid(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().PostSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().PostSSZ(
gomock.Any(),
"/eth/v2/beacon/blocks",
gomock.Any(),
@@ -149,7 +149,7 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockValid(t *testing.T) {
nil, nil, nil,
).Times(1)
validatorClient := beaconApiValidatorClient{handler: handler}
validatorClient := beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
expectedResp, expectedErr := validatorClient.proposeBeaconBlock(
ctx,
&ethpb.GenericSignedBeaconBlock{
@@ -166,8 +166,8 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockError_ThenPass(t *testing.T)
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().PostSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().PostSSZ(
gomock.Any(),
"/eth/v2/beacon/blocks",
gomock.Any(),
@@ -179,7 +179,7 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockError_ThenPass(t *testing.T)
},
).Times(1)
handler.EXPECT().Post(
jsonRestHandler.EXPECT().Post(
gomock.Any(),
"/eth/v2/beacon/blocks",
gomock.Any(),
@@ -189,7 +189,7 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockError_ThenPass(t *testing.T)
nil,
).Times(1)
validatorClient := beaconApiValidatorClient{handler: handler}
validatorClient := beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
expectedResp, expectedErr := validatorClient.proposeBeaconBlock(
ctx,
&ethpb.GenericSignedBeaconBlock{
@@ -308,10 +308,10 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockAllTypes(t *testing.T) {
defer ctrl.Finish()
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
if !tt.wantErr {
handler.EXPECT().PostSSZ(
jsonRestHandler.EXPECT().PostSSZ(
gomock.Any(),
tt.expectedPath,
gomock.Any(),
@@ -319,7 +319,7 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockAllTypes(t *testing.T) {
).Return(nil, nil, nil).Times(1)
}
validatorClient := beaconApiValidatorClient{handler: handler}
validatorClient := beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
resp, err := validatorClient.proposeBeaconBlock(ctx, tt.block)
if tt.wantErr {
@@ -366,9 +366,9 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockHTTPErrors(t *testing.T) {
defer ctrl.Finish()
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().PostSSZ(
jsonRestHandler.EXPECT().PostSSZ(
gomock.Any(),
"/eth/v2/beacon/blocks",
gomock.Any(),
@@ -377,7 +377,7 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockHTTPErrors(t *testing.T) {
if tt.expectJSON {
// When SSZ fails, it falls back to JSON
handler.EXPECT().Post(
jsonRestHandler.EXPECT().Post(
gomock.Any(),
"/eth/v2/beacon/blocks",
gomock.Any(),
@@ -386,7 +386,7 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockHTTPErrors(t *testing.T) {
).Return(tt.sszError).Times(1)
}
validatorClient := beaconApiValidatorClient{handler: handler}
validatorClient := beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
_, err := validatorClient.proposeBeaconBlock(
ctx,
&ethpb.GenericSignedBeaconBlock{
@@ -507,10 +507,10 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockJSONFallback(t *testing.T) {
defer ctrl.Finish()
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
// SSZ call fails with 406 to trigger JSON fallback
handler.EXPECT().PostSSZ(
jsonRestHandler.EXPECT().PostSSZ(
gomock.Any(),
tt.expectedPath,
gomock.Any(),
@@ -521,7 +521,7 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockJSONFallback(t *testing.T) {
}).Times(1)
// JSON fallback
handler.EXPECT().Post(
jsonRestHandler.EXPECT().Post(
gomock.Any(),
tt.expectedPath,
gomock.Any(),
@@ -529,7 +529,7 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockJSONFallback(t *testing.T) {
gomock.Any(),
).Return(tt.jsonError).Times(1)
validatorClient := beaconApiValidatorClient{handler: handler}
validatorClient := beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
resp, err := validatorClient.proposeBeaconBlock(ctx, tt.block)
if tt.wantErr {
@@ -547,12 +547,29 @@ func TestBeaconApiValidatorClient_Host(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Host().Return("http://localhost:8080").Times(1)
hosts := []string{"http://localhost:8080", "http://localhost:8081"}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().SwitchHost(
hosts[0],
).Times(1)
jsonRestHandler.EXPECT().Host().Return(
hosts[0],
).Times(1)
validatorClient := beaconApiValidatorClient{handler: handler}
validatorClient := beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
validatorClient.SwitchHost(hosts[0])
host := validatorClient.Host()
require.Equal(t, "http://localhost:8080", host)
require.Equal(t, hosts[0], host)
jsonRestHandler.EXPECT().SwitchHost(
hosts[1],
).Times(1)
jsonRestHandler.EXPECT().Host().Return(
hosts[1],
).Times(1)
validatorClient.SwitchHost(hosts[1])
host = validatorClient.Host()
require.Equal(t, hosts[1], host)
}
// Helper functions for generating test blocks for newer consensus versions

View File

@@ -20,7 +20,7 @@ func (c *beaconApiValidatorClient) aggregatedSelection(ctx context.Context, sele
}
var resp aggregatedSelectionResponse
err = c.handler.Post(ctx, "/eth/v1/validator/beacon_committee_selections", nil, bytes.NewBuffer(body), &resp)
err = c.jsonRestHandler.Post(ctx, "/eth/v1/validator/beacon_committee_selections", nil, bytes.NewBuffer(body), &resp)
if err != nil {
return nil, errors.Wrap(err, "error calling post endpoint")
}

View File

@@ -89,13 +89,13 @@ func TestGetAggregatedSelections(t *testing.T) {
for _, test := range testcases {
t.Run(test.name, func(t *testing.T) {
ctrl := gomock.NewController(t)
handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
reqBody, err := json.Marshal(test.req)
require.NoError(t, err)
ctx := t.Context()
handler.EXPECT().Post(
jsonRestHandler.EXPECT().Post(
gomock.Any(),
"/eth/v1/validator/beacon_committee_selections",
nil,
@@ -108,7 +108,7 @@ func TestGetAggregatedSelections(t *testing.T) {
test.endpointError,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
res, err := validatorClient.AggregatedSelections(ctx, test.req)
if test.expectedErrorMessage != "" {
require.ErrorContains(t, test.expectedErrorMessage, err)

View File

@@ -288,12 +288,12 @@ func TestCheckDoppelGanger_Nominal(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
if testCase.getSyncingOutput != nil {
syncingResponseJson := structs.SyncStatusResponse{}
handler.EXPECT().Get(
jsonRestHandler.EXPECT().Get(
gomock.Any(),
syncingEndpoint,
&syncingResponseJson,
@@ -308,7 +308,7 @@ func TestCheckDoppelGanger_Nominal(t *testing.T) {
if testCase.getForkOutput != nil {
stateForkResponseJson := structs.GetStateForkResponse{}
handler.EXPECT().Get(
jsonRestHandler.EXPECT().Get(
gomock.Any(),
forkEndpoint,
&stateForkResponseJson,
@@ -323,7 +323,7 @@ func TestCheckDoppelGanger_Nominal(t *testing.T) {
if testCase.getHeadersOutput != nil {
blockHeadersResponseJson := structs.GetBlockHeadersResponse{}
handler.EXPECT().Get(
jsonRestHandler.EXPECT().Get(
gomock.Any(),
headersEndpoint,
&blockHeadersResponseJson,
@@ -342,7 +342,7 @@ func TestCheckDoppelGanger_Nominal(t *testing.T) {
marshalledIndexes, err := json.Marshal(iface.inputStringIndexes)
require.NoError(t, err)
handler.EXPECT().Post(
jsonRestHandler.EXPECT().Post(
gomock.Any(),
iface.inputUrl,
nil,
@@ -372,7 +372,7 @@ func TestCheckDoppelGanger_Nominal(t *testing.T) {
}
validatorClient := beaconApiValidatorClient{
handler: handler,
jsonRestHandler: jsonRestHandler,
stateValidatorsProvider: stateValidatorsProvider,
}
@@ -722,12 +722,12 @@ func TestCheckDoppelGanger_Errors(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
if testCase.getSyncingOutput != nil {
syncingResponseJson := structs.SyncStatusResponse{}
handler.EXPECT().Get(
jsonRestHandler.EXPECT().Get(
gomock.Any(),
syncingEndpoint,
&syncingResponseJson,
@@ -742,7 +742,7 @@ func TestCheckDoppelGanger_Errors(t *testing.T) {
if testCase.getForkOutput != nil {
stateForkResponseJson := structs.GetStateForkResponse{}
handler.EXPECT().Get(
jsonRestHandler.EXPECT().Get(
gomock.Any(),
forkEndpoint,
&stateForkResponseJson,
@@ -757,7 +757,7 @@ func TestCheckDoppelGanger_Errors(t *testing.T) {
if testCase.getHeadersOutput != nil {
blockHeadersResponseJson := structs.GetBlockHeadersResponse{}
handler.EXPECT().Get(
jsonRestHandler.EXPECT().Get(
gomock.Any(),
headersEndpoint,
&blockHeadersResponseJson,
@@ -790,7 +790,7 @@ func TestCheckDoppelGanger_Errors(t *testing.T) {
marshalledIndexes, err := json.Marshal(iface.inputStringIndexes)
require.NoError(t, err)
handler.EXPECT().Post(
jsonRestHandler.EXPECT().Post(
gomock.Any(),
iface.inputUrl,
nil,
@@ -806,7 +806,7 @@ func TestCheckDoppelGanger_Errors(t *testing.T) {
}
validatorClient := beaconApiValidatorClient{
handler: handler,
jsonRestHandler: jsonRestHandler,
stateValidatorsProvider: stateValidatorsProvider,
}

View File

@@ -28,7 +28,7 @@ type dutiesProvider interface {
}
type beaconApiDutiesProvider struct {
handler rest.Handler
jsonRestHandler rest.RestHandler
}
type attesterDuty struct {
@@ -279,7 +279,7 @@ func (c beaconApiDutiesProvider) Committees(ctx context.Context, epoch primitive
committeesRequest := apiutil.BuildURL("/eth/v1/beacon/states/head/committees", committeeParams)
var stateCommittees structs.GetCommitteesResponse
if err := c.handler.Get(ctx, committeesRequest, &stateCommittees); err != nil {
if err := c.jsonRestHandler.Get(ctx, committeesRequest, &stateCommittees); err != nil {
return nil, err
}
@@ -309,7 +309,7 @@ func (c beaconApiDutiesProvider) AttesterDuties(ctx context.Context, epoch primi
}
attesterDuties := &structs.GetAttesterDutiesResponse{}
if err = c.handler.Post(
if err = c.jsonRestHandler.Post(
ctx,
fmt.Sprintf("/eth/v1/validator/duties/attester/%d", epoch),
nil,
@@ -331,7 +331,7 @@ func (c beaconApiDutiesProvider) AttesterDuties(ctx context.Context, epoch primi
// ProposerDuties retrieves the proposer duties for the given epoch
func (c beaconApiDutiesProvider) ProposerDuties(ctx context.Context, epoch primitives.Epoch) (*structs.GetProposerDutiesResponse, error) {
proposerDuties := &structs.GetProposerDutiesResponse{}
if err := c.handler.Get(ctx, fmt.Sprintf("/eth/v1/validator/duties/proposer/%d", epoch), proposerDuties); err != nil {
if err := c.jsonRestHandler.Get(ctx, fmt.Sprintf("/eth/v1/validator/duties/proposer/%d", epoch), proposerDuties); err != nil {
return nil, err
}
@@ -361,7 +361,7 @@ func (c beaconApiDutiesProvider) SyncDuties(ctx context.Context, epoch primitive
}
syncDuties := structs.GetSyncCommitteeDutiesResponse{}
if err = c.handler.Post(
if err = c.jsonRestHandler.Post(
ctx,
fmt.Sprintf("/eth/v1/validator/duties/sync/%d", epoch),
nil,

View File

@@ -60,8 +60,8 @@ func TestGetAttesterDuties_Valid(t *testing.T) {
ctx := t.Context()
validatorIndices := []primitives.ValidatorIndex{2, 9}
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Post(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post(
gomock.Any(),
fmt.Sprintf("%s/%d", getAttesterDutiesTestEndpoint, epoch),
nil,
@@ -74,7 +74,7 @@ func TestGetAttesterDuties_Valid(t *testing.T) {
expectedAttesterDuties,
).Times(1)
dutiesProvider := &beaconApiDutiesProvider{handler: handler}
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler}
attesterDuties, err := dutiesProvider.AttesterDuties(ctx, epoch, validatorIndices)
require.NoError(t, err)
assert.DeepEqual(t, expectedAttesterDuties.Data, attesterDuties.Data)
@@ -88,8 +88,8 @@ func TestGetAttesterDuties_HttpError(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Post(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post(
gomock.Any(),
fmt.Sprintf("%s/%d", getAttesterDutiesTestEndpoint, epoch),
gomock.Any(),
@@ -99,7 +99,7 @@ func TestGetAttesterDuties_HttpError(t *testing.T) {
errors.New("foo error"),
).Times(1)
dutiesProvider := &beaconApiDutiesProvider{handler: handler}
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler}
_, err := dutiesProvider.AttesterDuties(ctx, epoch, nil)
assert.ErrorContains(t, "foo error", err)
}
@@ -112,8 +112,8 @@ func TestGetAttesterDuties_NilAttesterDuty(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Post(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post(
gomock.Any(),
fmt.Sprintf("%s/%d", getAttesterDutiesTestEndpoint, epoch),
gomock.Any(),
@@ -128,7 +128,7 @@ func TestGetAttesterDuties_NilAttesterDuty(t *testing.T) {
},
).Times(1)
dutiesProvider := &beaconApiDutiesProvider{handler: handler}
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler}
_, err := dutiesProvider.AttesterDuties(ctx, epoch, nil)
assert.ErrorContains(t, "attester duty at index `0` is nil", err)
}
@@ -156,8 +156,8 @@ func TestGetProposerDuties_Valid(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Get(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get(
gomock.Any(),
fmt.Sprintf("%s/%d", getProposerDutiesTestEndpoint, epoch),
&structs.GetProposerDutiesResponse{},
@@ -168,7 +168,7 @@ func TestGetProposerDuties_Valid(t *testing.T) {
expectedProposerDuties,
).Times(1)
dutiesProvider := &beaconApiDutiesProvider{handler: handler}
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler}
proposerDuties, err := dutiesProvider.ProposerDuties(ctx, epoch)
require.NoError(t, err)
assert.DeepEqual(t, expectedProposerDuties.Data, proposerDuties.Data)
@@ -182,8 +182,8 @@ func TestGetProposerDuties_HttpError(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Get(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get(
gomock.Any(),
fmt.Sprintf("%s/%d", getProposerDutiesTestEndpoint, epoch),
gomock.Any(),
@@ -191,7 +191,7 @@ func TestGetProposerDuties_HttpError(t *testing.T) {
errors.New("foo error"),
).Times(1)
dutiesProvider := &beaconApiDutiesProvider{handler: handler}
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler}
_, err := dutiesProvider.ProposerDuties(ctx, epoch)
assert.ErrorContains(t, "foo error", err)
}
@@ -204,8 +204,8 @@ func TestGetProposerDuties_NilData(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Get(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get(
gomock.Any(),
fmt.Sprintf("%s/%d", getProposerDutiesTestEndpoint, epoch),
gomock.Any(),
@@ -218,7 +218,7 @@ func TestGetProposerDuties_NilData(t *testing.T) {
},
).Times(1)
dutiesProvider := &beaconApiDutiesProvider{handler: handler}
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler}
_, err := dutiesProvider.ProposerDuties(ctx, epoch)
assert.ErrorContains(t, "proposer duties data is nil", err)
}
@@ -231,8 +231,8 @@ func TestGetProposerDuties_NilProposerDuty(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Get(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get(
gomock.Any(),
fmt.Sprintf("%s/%d", getProposerDutiesTestEndpoint, epoch),
gomock.Any(),
@@ -245,7 +245,7 @@ func TestGetProposerDuties_NilProposerDuty(t *testing.T) {
},
).Times(1)
dutiesProvider := &beaconApiDutiesProvider{handler: handler}
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler}
_, err := dutiesProvider.ProposerDuties(ctx, epoch)
assert.ErrorContains(t, "proposer duty at index `0` is nil", err)
}
@@ -284,8 +284,8 @@ func TestGetSyncDuties_Valid(t *testing.T) {
ctx := t.Context()
validatorIndices := []primitives.ValidatorIndex{2, 6}
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Post(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post(
gomock.Any(),
fmt.Sprintf("%s/%d", getSyncDutiesTestEndpoint, epoch),
nil,
@@ -298,7 +298,7 @@ func TestGetSyncDuties_Valid(t *testing.T) {
expectedSyncDuties,
).Times(1)
dutiesProvider := &beaconApiDutiesProvider{handler: handler}
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler}
syncDuties, err := dutiesProvider.SyncDuties(ctx, epoch, validatorIndices)
require.NoError(t, err)
assert.DeepEqual(t, expectedSyncDuties.Data, syncDuties)
@@ -312,8 +312,8 @@ func TestGetSyncDuties_HttpError(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Post(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post(
gomock.Any(),
fmt.Sprintf("%s/%d", getSyncDutiesTestEndpoint, epoch),
gomock.Any(),
@@ -323,7 +323,7 @@ func TestGetSyncDuties_HttpError(t *testing.T) {
errors.New("foo error"),
).Times(1)
dutiesProvider := &beaconApiDutiesProvider{handler: handler}
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler}
_, err := dutiesProvider.SyncDuties(ctx, epoch, nil)
assert.ErrorContains(t, "foo error", err)
}
@@ -336,8 +336,8 @@ func TestGetSyncDuties_NilData(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Post(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post(
gomock.Any(),
fmt.Sprintf("%s/%d", getSyncDutiesTestEndpoint, epoch),
gomock.Any(),
@@ -352,7 +352,7 @@ func TestGetSyncDuties_NilData(t *testing.T) {
},
).Times(1)
dutiesProvider := &beaconApiDutiesProvider{handler: handler}
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler}
_, err := dutiesProvider.SyncDuties(ctx, epoch, nil)
assert.ErrorContains(t, "sync duties data is nil", err)
}
@@ -365,8 +365,8 @@ func TestGetSyncDuties_NilSyncDuty(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Post(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post(
gomock.Any(),
fmt.Sprintf("%s/%d", getSyncDutiesTestEndpoint, epoch),
gomock.Any(),
@@ -381,7 +381,7 @@ func TestGetSyncDuties_NilSyncDuty(t *testing.T) {
},
).Times(1)
dutiesProvider := &beaconApiDutiesProvider{handler: handler}
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler}
_, err := dutiesProvider.SyncDuties(ctx, epoch, nil)
assert.ErrorContains(t, "sync duty at index `0` is nil", err)
}
@@ -415,8 +415,8 @@ func TestGetCommittees_Valid(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Get(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get(
gomock.Any(),
fmt.Sprintf("%s?epoch=%d", getCommitteesTestEndpoint, epoch),
&structs.GetCommitteesResponse{},
@@ -427,7 +427,7 @@ func TestGetCommittees_Valid(t *testing.T) {
expectedCommittees,
).Times(1)
dutiesProvider := &beaconApiDutiesProvider{handler: handler}
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler}
committees, err := dutiesProvider.Committees(ctx, epoch)
require.NoError(t, err)
assert.DeepEqual(t, expectedCommittees.Data, committees)
@@ -441,8 +441,8 @@ func TestGetCommittees_HttpError(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Get(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get(
gomock.Any(),
fmt.Sprintf("%s?epoch=%d", getCommitteesTestEndpoint, epoch),
gomock.Any(),
@@ -450,7 +450,7 @@ func TestGetCommittees_HttpError(t *testing.T) {
errors.New("foo error"),
).Times(1)
dutiesProvider := &beaconApiDutiesProvider{handler: handler}
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler}
_, err := dutiesProvider.Committees(ctx, epoch)
assert.ErrorContains(t, "foo error", err)
}
@@ -463,8 +463,8 @@ func TestGetCommittees_NilData(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Get(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get(
gomock.Any(),
fmt.Sprintf("%s?epoch=%d", getCommitteesTestEndpoint, epoch),
gomock.Any(),
@@ -477,7 +477,7 @@ func TestGetCommittees_NilData(t *testing.T) {
},
).Times(1)
dutiesProvider := &beaconApiDutiesProvider{handler: handler}
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler}
_, err := dutiesProvider.Committees(ctx, epoch)
assert.ErrorContains(t, "state committees data is nil", err)
}
@@ -490,8 +490,8 @@ func TestGetCommittees_NilCommittee(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Get(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get(
gomock.Any(),
fmt.Sprintf("%s?epoch=%d", getCommitteesTestEndpoint, epoch),
gomock.Any(),
@@ -504,7 +504,7 @@ func TestGetCommittees_NilCommittee(t *testing.T) {
},
).Times(1)
dutiesProvider := &beaconApiDutiesProvider{handler: handler}
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler}
_, err := dutiesProvider.Committees(ctx, epoch)
assert.ErrorContains(t, "committee at index `0` is nil", err)
}

View File

@@ -21,9 +21,9 @@ type GenesisProvider interface {
}
type beaconApiGenesisProvider struct {
handler rest.Handler
genesis *structs.Genesis
once sync.Once
jsonRestHandler rest.RestHandler
genesis *structs.Genesis
once sync.Once
}
func (c *beaconApiValidatorClient) waitForChainStart(ctx context.Context) (*ethpb.ChainStartResponse, error) {
@@ -69,7 +69,7 @@ func (c *beaconApiGenesisProvider) Genesis(ctx context.Context) (*structs.Genesi
genesisJson := &structs.GetGenesisResponse{}
var doErr error
c.once.Do(func() {
if err := c.handler.Get(ctx, "/eth/v1/beacon/genesis", genesisJson); err != nil {
if err := c.jsonRestHandler.Get(ctx, "/eth/v1/beacon/genesis", genesisJson); err != nil {
doErr = err
return
}

View File

@@ -18,8 +18,8 @@ func TestGetGenesis_ValidGenesis(t *testing.T) {
ctx := t.Context()
genesisResponseJson := structs.GetGenesisResponse{}
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Get(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get(
gomock.Any(),
"/eth/v1/beacon/genesis",
&genesisResponseJson,
@@ -35,7 +35,7 @@ func TestGetGenesis_ValidGenesis(t *testing.T) {
},
).Times(1)
genesisProvider := &beaconApiGenesisProvider{handler: handler}
genesisProvider := &beaconApiGenesisProvider{jsonRestHandler: jsonRestHandler}
resp, err := genesisProvider.Genesis(ctx)
assert.NoError(t, err)
require.NotNil(t, resp)
@@ -50,8 +50,8 @@ func TestGetGenesis_NilData(t *testing.T) {
ctx := t.Context()
genesisResponseJson := structs.GetGenesisResponse{}
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Get(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get(
gomock.Any(),
"/eth/v1/beacon/genesis",
&genesisResponseJson,
@@ -62,7 +62,7 @@ func TestGetGenesis_NilData(t *testing.T) {
structs.GetGenesisResponse{Data: nil},
).Times(1)
genesisProvider := &beaconApiGenesisProvider{handler: handler}
genesisProvider := &beaconApiGenesisProvider{jsonRestHandler: jsonRestHandler}
_, err := genesisProvider.Genesis(ctx)
assert.ErrorContains(t, "genesis data is nil", err)
}
@@ -74,8 +74,8 @@ func TestGetGenesis_EndpointCalledOnlyOnce(t *testing.T) {
ctx := t.Context()
genesisResponseJson := structs.GetGenesisResponse{}
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Get(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get(
gomock.Any(),
"/eth/v1/beacon/genesis",
&genesisResponseJson,
@@ -91,7 +91,7 @@ func TestGetGenesis_EndpointCalledOnlyOnce(t *testing.T) {
},
).Times(1)
genesisProvider := &beaconApiGenesisProvider{handler: handler}
genesisProvider := &beaconApiGenesisProvider{jsonRestHandler: jsonRestHandler}
_, err := genesisProvider.Genesis(ctx)
assert.NoError(t, err)
resp, err := genesisProvider.Genesis(ctx)
@@ -108,15 +108,15 @@ func TestGetGenesis_EndpointCanBeCalledAgainAfterError(t *testing.T) {
ctx := t.Context()
genesisResponseJson := structs.GetGenesisResponse{}
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Get(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get(
gomock.Any(),
"/eth/v1/beacon/genesis",
&genesisResponseJson,
).Return(
errors.New("foo"),
).Times(1)
handler.EXPECT().Get(
jsonRestHandler.EXPECT().Get(
gomock.Any(),
"/eth/v1/beacon/genesis",
&genesisResponseJson,
@@ -132,7 +132,7 @@ func TestGetGenesis_EndpointCanBeCalledAgainAfterError(t *testing.T) {
},
).Times(1)
genesisProvider := &beaconApiGenesisProvider{handler: handler}
genesisProvider := &beaconApiGenesisProvider{jsonRestHandler: jsonRestHandler}
_, err := genesisProvider.Genesis(ctx)
require.ErrorContains(t, "foo", err)
resp, err := genesisProvider.Genesis(ctx)

View File

@@ -26,7 +26,7 @@ func (c *beaconApiValidatorClient) beaconBlock(ctx context.Context, slot primiti
queryParams.Add("graffiti", hexutil.Encode(graffiti))
}
queryUrl := apiutil.BuildURL(fmt.Sprintf("/eth/v3/validator/blocks/%d", slot), queryParams)
data, header, err := c.handler.GetSSZ(ctx, queryUrl)
data, header, err := c.jsonRestHandler.GetSSZ(ctx, queryUrl)
if err != nil {
return nil, err
}

View File

@@ -25,8 +25,8 @@ func TestGetBeaconBlock_RequestFailed(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
gomock.Any(),
).Return(
@@ -35,7 +35,7 @@ func TestGetBeaconBlock_RequestFailed(t *testing.T) {
errors.New("foo error"),
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
_, err := validatorClient.beaconBlock(ctx, 1, []byte{1}, []byte{2})
assert.ErrorContains(t, "foo error", err)
}
@@ -149,8 +149,8 @@ func TestGetBeaconBlock_Error(t *testing.T) {
b, err := json.Marshal(resp)
require.NoError(t, err)
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
gomock.Any(),
).Return(
@@ -159,7 +159,7 @@ func TestGetBeaconBlock_Error(t *testing.T) {
nil,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
_, err = validatorClient.beaconBlock(ctx, 1, []byte{1}, []byte{2})
assert.ErrorContains(t, testCase.expectedErrorMessage, err)
})
@@ -185,8 +185,8 @@ func TestGetBeaconBlock_Phase0Valid(t *testing.T) {
Data: bytes,
})
require.NoError(t, err)
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return(
@@ -195,7 +195,7 @@ func TestGetBeaconBlock_Phase0Valid(t *testing.T) {
nil,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err)
@@ -224,8 +224,8 @@ func TestGetBeaconBlock_SSZ_BellatrixValid(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return(
@@ -238,7 +238,7 @@ func TestGetBeaconBlock_SSZ_BellatrixValid(t *testing.T) {
nil,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err)
@@ -266,8 +266,8 @@ func TestGetBeaconBlock_SSZ_BlindedBellatrixValid(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return(
@@ -280,7 +280,7 @@ func TestGetBeaconBlock_SSZ_BlindedBellatrixValid(t *testing.T) {
nil,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err)
@@ -308,8 +308,8 @@ func TestGetBeaconBlock_SSZ_CapellaValid(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return(
@@ -322,7 +322,7 @@ func TestGetBeaconBlock_SSZ_CapellaValid(t *testing.T) {
nil,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err)
@@ -350,8 +350,8 @@ func TestGetBeaconBlock_SSZ_BlindedCapellaValid(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return(
@@ -364,7 +364,7 @@ func TestGetBeaconBlock_SSZ_BlindedCapellaValid(t *testing.T) {
nil,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err)
@@ -392,8 +392,8 @@ func TestGetBeaconBlock_SSZ_DenebValid(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return(
@@ -406,7 +406,7 @@ func TestGetBeaconBlock_SSZ_DenebValid(t *testing.T) {
nil,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err)
@@ -434,8 +434,8 @@ func TestGetBeaconBlock_SSZ_BlindedDenebValid(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return(
@@ -448,7 +448,7 @@ func TestGetBeaconBlock_SSZ_BlindedDenebValid(t *testing.T) {
nil,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err)
@@ -476,8 +476,8 @@ func TestGetBeaconBlock_SSZ_ElectraValid(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return(
@@ -490,7 +490,7 @@ func TestGetBeaconBlock_SSZ_ElectraValid(t *testing.T) {
nil,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err)
@@ -518,8 +518,8 @@ func TestGetBeaconBlock_SSZ_BlindedElectraValid(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return(
@@ -532,7 +532,7 @@ func TestGetBeaconBlock_SSZ_BlindedElectraValid(t *testing.T) {
nil,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err)
@@ -556,8 +556,8 @@ func TestGetBeaconBlock_SSZ_UnsupportedVersion(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return(
@@ -570,7 +570,7 @@ func TestGetBeaconBlock_SSZ_UnsupportedVersion(t *testing.T) {
nil,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
_, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
assert.ErrorContains(t, "version name doesn't map to a known value in the enum", err)
}
@@ -589,8 +589,8 @@ func TestGetBeaconBlock_SSZ_InvalidBlindedHeader(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return(
@@ -603,7 +603,7 @@ func TestGetBeaconBlock_SSZ_InvalidBlindedHeader(t *testing.T) {
nil,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
_, err = validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
assert.ErrorContains(t, "strconv.ParseBool: parsing \"invalid\": invalid syntax", err)
}
@@ -622,8 +622,8 @@ func TestGetBeaconBlock_SSZ_InvalidVersionHeader(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return(
@@ -636,7 +636,7 @@ func TestGetBeaconBlock_SSZ_InvalidVersionHeader(t *testing.T) {
nil,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
_, err = validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
assert.ErrorContains(t, "unsupported header version invalid", err)
}
@@ -651,8 +651,8 @@ func TestGetBeaconBlock_SSZ_GetSSZError(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return(
@@ -661,7 +661,7 @@ func TestGetBeaconBlock_SSZ_GetSSZError(t *testing.T) {
errors.New("get ssz error"),
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
_, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
assert.ErrorContains(t, "get ssz error", err)
}
@@ -680,8 +680,8 @@ func TestGetBeaconBlock_SSZ_Phase0Valid(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return(
@@ -694,7 +694,7 @@ func TestGetBeaconBlock_SSZ_Phase0Valid(t *testing.T) {
nil,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err)
@@ -722,8 +722,8 @@ func TestGetBeaconBlock_SSZ_AltairValid(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return(
@@ -736,7 +736,7 @@ func TestGetBeaconBlock_SSZ_AltairValid(t *testing.T) {
nil,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err)
@@ -770,8 +770,8 @@ func TestGetBeaconBlock_AltairValid(t *testing.T) {
Data: bytes,
})
require.NoError(t, err)
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return(
@@ -780,7 +780,7 @@ func TestGetBeaconBlock_AltairValid(t *testing.T) {
nil,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err)
@@ -814,8 +814,8 @@ func TestGetBeaconBlock_BellatrixValid(t *testing.T) {
Data: bytes,
})
require.NoError(t, err)
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return(
@@ -824,7 +824,7 @@ func TestGetBeaconBlock_BellatrixValid(t *testing.T) {
nil,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err)
@@ -859,8 +859,8 @@ func TestGetBeaconBlock_BlindedBellatrixValid(t *testing.T) {
Data: bytes,
})
require.NoError(t, err)
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return(
@@ -869,7 +869,7 @@ func TestGetBeaconBlock_BlindedBellatrixValid(t *testing.T) {
nil,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err)
@@ -904,8 +904,8 @@ func TestGetBeaconBlock_CapellaValid(t *testing.T) {
Data: bytes,
})
require.NoError(t, err)
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return(
@@ -914,7 +914,7 @@ func TestGetBeaconBlock_CapellaValid(t *testing.T) {
nil,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err)
@@ -949,8 +949,8 @@ func TestGetBeaconBlock_BlindedCapellaValid(t *testing.T) {
Data: bytes,
})
require.NoError(t, err)
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return(
@@ -959,7 +959,7 @@ func TestGetBeaconBlock_BlindedCapellaValid(t *testing.T) {
nil,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err)
@@ -994,8 +994,8 @@ func TestGetBeaconBlock_DenebValid(t *testing.T) {
Data: bytes,
})
require.NoError(t, err)
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return(
@@ -1004,7 +1004,7 @@ func TestGetBeaconBlock_DenebValid(t *testing.T) {
nil,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err)
@@ -1039,8 +1039,8 @@ func TestGetBeaconBlock_BlindedDenebValid(t *testing.T) {
Data: bytes,
})
require.NoError(t, err)
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return(
@@ -1049,7 +1049,7 @@ func TestGetBeaconBlock_BlindedDenebValid(t *testing.T) {
nil,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err)
@@ -1084,8 +1084,8 @@ func TestGetBeaconBlock_ElectraValid(t *testing.T) {
Data: bytes,
})
require.NoError(t, err)
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return(
@@ -1094,7 +1094,7 @@ func TestGetBeaconBlock_ElectraValid(t *testing.T) {
nil,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err)
@@ -1129,8 +1129,8 @@ func TestGetBeaconBlock_BlindedElectraValid(t *testing.T) {
Data: bytes,
})
require.NoError(t, err)
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().GetSSZ(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ(
gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return(
@@ -1139,7 +1139,7 @@ func TestGetBeaconBlock_BlindedElectraValid(t *testing.T) {
nil,
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err)

View File

@@ -41,9 +41,9 @@ func TestIndex_Nominal(t *testing.T) {
ctx := t.Context()
stateValidatorsResponseJson := structs.GetValidatorsResponse{}
handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Post(
jsonRestHandler.EXPECT().Post(
gomock.Any(),
"/eth/v1/beacon/states/head/validators",
nil,
@@ -68,7 +68,7 @@ func TestIndex_Nominal(t *testing.T) {
validatorClient := beaconApiValidatorClient{
stateValidatorsProvider: beaconApiStateValidatorsProvider{
handler: handler,
jsonRestHandler: jsonRestHandler,
},
}
@@ -91,9 +91,9 @@ func TestIndex_UnexistingValidator(t *testing.T) {
ctx := t.Context()
stateValidatorsResponseJson := structs.GetValidatorsResponse{}
handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Post(
jsonRestHandler.EXPECT().Post(
gomock.Any(),
"/eth/v1/beacon/states/head/validators",
nil,
@@ -110,7 +110,7 @@ func TestIndex_UnexistingValidator(t *testing.T) {
validatorClient := beaconApiValidatorClient{
stateValidatorsProvider: beaconApiStateValidatorsProvider{
handler: handler,
jsonRestHandler: jsonRestHandler,
},
}
@@ -133,9 +133,9 @@ func TestIndex_BadIndexError(t *testing.T) {
ctx := t.Context()
stateValidatorsResponseJson := structs.GetValidatorsResponse{}
handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Post(
jsonRestHandler.EXPECT().Post(
gomock.Any(),
"/eth/v1/beacon/states/head/validators",
nil,
@@ -160,7 +160,7 @@ func TestIndex_BadIndexError(t *testing.T) {
validatorClient := beaconApiValidatorClient{
stateValidatorsProvider: beaconApiStateValidatorsProvider{
handler: handler,
jsonRestHandler: jsonRestHandler,
},
}
@@ -182,9 +182,9 @@ func TestIndex_JsonResponseError(t *testing.T) {
ctx := t.Context()
stateValidatorsResponseJson := structs.GetValidatorsResponse{}
handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Post(
jsonRestHandler.EXPECT().Post(
gomock.Any(),
"/eth/v1/beacon/states/head/validators",
nil,
@@ -207,7 +207,7 @@ func TestIndex_JsonResponseError(t *testing.T) {
queryParams.Add("status", st)
}
handler.EXPECT().Get(
jsonRestHandler.EXPECT().Get(
gomock.Any(),
apiutil.BuildURL("/eth/v1/beacon/states/head/validators", queryParams),
&stateValidatorsResponseJson,
@@ -217,7 +217,7 @@ func TestIndex_JsonResponseError(t *testing.T) {
validatorClient := beaconApiValidatorClient{
stateValidatorsProvider: beaconApiStateValidatorsProvider{
handler: handler,
jsonRestHandler: jsonRestHandler,
},
}

View File

@@ -1,9 +1,9 @@
// Code generated by MockGen. DO NOT EDIT.
// Source: api/rest/rest_handler.go
// Source: validator/client/beacon-api/rest_handler_client.go
//
// Generated by this command:
//
// mockgen -package=mock -source=api/rest/rest_handler.go -destination=validator/client/beacon-api/mock/json_rest_handler_mock.go Handler
// mockgen -package=mock -source=validator/client/beacon-api/rest_handler_client.go -destination=validator/client/beacon-api/mock/json_rest_handler_mock.go RestHandler
//
// Package mock is a generated GoMock package.
@@ -19,39 +19,36 @@ import (
)
// Backward compatibility aliases for the renamed mock type.
type MockJsonRestHandler = MockHandler
type MockJsonRestHandlerMockRecorder = MockHandlerMockRecorder
type MockRestHandler = MockHandler
type MockRestHandlerMockRecorder = MockHandlerMockRecorder
type MockJsonRestHandler = MockRestHandler
type MockJsonRestHandlerMockRecorder = MockRestHandlerMockRecorder
var NewMockJsonRestHandler = NewMockHandler
var NewMockRestHandler = NewMockHandler
var NewMockJsonRestHandler = NewMockRestHandler
// MockHandler is a mock of Handler interface.
type MockHandler struct {
// MockRestHandler is a mock of RestHandler interface.
type MockRestHandler struct {
ctrl *gomock.Controller
recorder *MockHandlerMockRecorder
recorder *MockRestHandlerMockRecorder
}
// MockHandlerMockRecorder is the mock recorder for MockHandler.
type MockHandlerMockRecorder struct {
mock *MockHandler
// MockRestHandlerMockRecorder is the mock recorder for MockRestHandler.
type MockRestHandlerMockRecorder struct {
mock *MockRestHandler
}
// NewMockHandler creates a new mock instance.
func NewMockHandler(ctrl *gomock.Controller) *MockHandler {
mock := &MockHandler{ctrl: ctrl}
mock.recorder = &MockHandlerMockRecorder{mock}
// NewMockRestHandler creates a new mock instance.
func NewMockRestHandler(ctrl *gomock.Controller) *MockRestHandler {
mock := &MockRestHandler{ctrl: ctrl}
mock.recorder = &MockRestHandlerMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockHandler) EXPECT() *MockHandlerMockRecorder {
func (m *MockRestHandler) EXPECT() *MockRestHandlerMockRecorder {
return m.recorder
}
// Get mocks base method.
func (m *MockHandler) Get(ctx context.Context, endpoint string, resp any) error {
func (m *MockRestHandler) Get(ctx context.Context, endpoint string, resp any) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Get", ctx, endpoint, resp)
ret0, _ := ret[0].(error)
@@ -59,13 +56,13 @@ func (m *MockHandler) Get(ctx context.Context, endpoint string, resp any) error
}
// Get indicates an expected call of Get.
func (mr *MockHandlerMockRecorder) Get(ctx, endpoint, resp any) *gomock.Call {
func (mr *MockRestHandlerMockRecorder) Get(ctx, endpoint, resp any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockHandler)(nil).Get), ctx, endpoint, resp)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockRestHandler)(nil).Get), ctx, endpoint, resp)
}
// GetSSZ mocks base method.
func (m *MockHandler) GetSSZ(ctx context.Context, endpoint string) ([]byte, http.Header, error) {
func (m *MockRestHandler) GetSSZ(ctx context.Context, endpoint string) ([]byte, http.Header, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetSSZ", ctx, endpoint)
ret0, _ := ret[0].([]byte)
@@ -75,13 +72,13 @@ func (m *MockHandler) GetSSZ(ctx context.Context, endpoint string) ([]byte, http
}
// GetSSZ indicates an expected call of GetSSZ.
func (mr *MockHandlerMockRecorder) GetSSZ(ctx, endpoint any) *gomock.Call {
func (mr *MockRestHandlerMockRecorder) GetSSZ(ctx, endpoint any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSSZ", reflect.TypeOf((*MockHandler)(nil).GetSSZ), ctx, endpoint)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSSZ", reflect.TypeOf((*MockRestHandler)(nil).GetSSZ), ctx, endpoint)
}
// GetStatusCode mocks base method.
func (m *MockHandler) GetStatusCode(ctx context.Context, endpoint string) (int, error) {
func (m *MockRestHandler) GetStatusCode(ctx context.Context, endpoint string) (int, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetStatusCode", ctx, endpoint)
ret0, _ := ret[0].(int)
@@ -90,13 +87,13 @@ func (m *MockHandler) GetStatusCode(ctx context.Context, endpoint string) (int,
}
// GetStatusCode indicates an expected call of GetStatusCode.
func (mr *MockHandlerMockRecorder) GetStatusCode(ctx, endpoint any) *gomock.Call {
func (mr *MockRestHandlerMockRecorder) GetStatusCode(ctx, endpoint any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetStatusCode", reflect.TypeOf((*MockHandler)(nil).GetStatusCode), ctx, endpoint)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetStatusCode", reflect.TypeOf((*MockRestHandler)(nil).GetStatusCode), ctx, endpoint)
}
// Host mocks base method.
func (m *MockHandler) Host() string {
func (m *MockRestHandler) Host() string {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Host")
ret0, _ := ret[0].(string)
@@ -104,13 +101,27 @@ func (m *MockHandler) Host() string {
}
// Host indicates an expected call of Host.
func (mr *MockHandlerMockRecorder) Host() *gomock.Call {
func (mr *MockRestHandlerMockRecorder) Host() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Host", reflect.TypeOf((*MockHandler)(nil).Host))
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Host", reflect.TypeOf((*MockRestHandler)(nil).Host))
}
// HttpClient mocks base method.
func (m *MockRestHandler) HttpClient() *http.Client {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "HttpClient")
ret0, _ := ret[0].(*http.Client)
return ret0
}
// HttpClient indicates an expected call of HttpClient.
func (mr *MockRestHandlerMockRecorder) HttpClient() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HttpClient", reflect.TypeOf((*MockRestHandler)(nil).HttpClient))
}
// Post mocks base method.
func (m *MockHandler) Post(ctx context.Context, endpoint string, headers map[string]string, data *bytes.Buffer, resp any) error {
func (m *MockRestHandler) Post(ctx context.Context, endpoint string, headers map[string]string, data *bytes.Buffer, resp any) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Post", ctx, endpoint, headers, data, resp)
ret0, _ := ret[0].(error)
@@ -118,13 +129,13 @@ func (m *MockHandler) Post(ctx context.Context, endpoint string, headers map[str
}
// Post indicates an expected call of Post.
func (mr *MockHandlerMockRecorder) Post(ctx, endpoint, headers, data, resp any) *gomock.Call {
func (mr *MockRestHandlerMockRecorder) Post(ctx, endpoint, headers, data, resp any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Post", reflect.TypeOf((*MockHandler)(nil).Post), ctx, endpoint, headers, data, resp)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Post", reflect.TypeOf((*MockRestHandler)(nil).Post), ctx, endpoint, headers, data, resp)
}
// PostSSZ mocks base method.
func (m *MockHandler) PostSSZ(ctx context.Context, endpoint string, headers map[string]string, data *bytes.Buffer) ([]byte, http.Header, error) {
func (m *MockRestHandler) PostSSZ(ctx context.Context, endpoint string, headers map[string]string, data *bytes.Buffer) ([]byte, http.Header, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "PostSSZ", ctx, endpoint, headers, data)
ret0, _ := ret[0].([]byte)
@@ -134,7 +145,19 @@ func (m *MockHandler) PostSSZ(ctx context.Context, endpoint string, headers map[
}
// PostSSZ indicates an expected call of PostSSZ.
func (mr *MockHandlerMockRecorder) PostSSZ(ctx, endpoint, headers, data any) *gomock.Call {
func (mr *MockRestHandlerMockRecorder) PostSSZ(ctx, endpoint, headers, data any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PostSSZ", reflect.TypeOf((*MockHandler)(nil).PostSSZ), ctx, endpoint, headers, data)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PostSSZ", reflect.TypeOf((*MockRestHandler)(nil).PostSSZ), ctx, endpoint, headers, data)
}
// SwitchHost mocks base method.
func (m *MockRestHandler) SwitchHost(host string) {
m.ctrl.T.Helper()
m.ctrl.Call(m, "SwitchHost", host)
}
// SwitchHost indicates an expected call of SwitchHost.
func (mr *MockRestHandlerMockRecorder) SwitchHost(host any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SwitchHost", reflect.TypeOf((*MockRestHandler)(nil).SwitchHost), host)
}

View File

@@ -26,5 +26,5 @@ func (c *beaconApiValidatorClient) prepareBeaconProposer(ctx context.Context, re
return errors.Wrap(err, "failed to marshal recipients")
}
return c.handler.Post(ctx, "/eth/v1/validator/prepare_beacon_proposer", nil, bytes.NewBuffer(marshalledJsonRecipients), nil)
return c.jsonRestHandler.Post(ctx, "/eth/v1/validator/prepare_beacon_proposer", nil, bytes.NewBuffer(marshalledJsonRecipients), nil)
}

View File

@@ -45,8 +45,8 @@ func TestPrepareBeaconProposer_Valid(t *testing.T) {
marshalledJsonRecipients, err := json.Marshal(jsonRecipients)
require.NoError(t, err)
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Post(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post(
gomock.Any(),
prepareBeaconProposerTestEndpoint,
nil,
@@ -78,7 +78,7 @@ func TestPrepareBeaconProposer_Valid(t *testing.T) {
},
}
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
err = validatorClient.prepareBeaconProposer(ctx, protoRecipients)
require.NoError(t, err)
}
@@ -89,8 +89,8 @@ func TestPrepareBeaconProposer_BadRequest(t *testing.T) {
ctx := t.Context()
handler := mock.NewMockJsonRestHandler(ctrl)
handler.EXPECT().Post(
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post(
gomock.Any(),
prepareBeaconProposerTestEndpoint,
nil,
@@ -100,7 +100,7 @@ func TestPrepareBeaconProposer_BadRequest(t *testing.T) {
errors.New("foo error"),
).Times(1)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
err := validatorClient.prepareBeaconProposer(ctx, nil)
assert.ErrorContains(t, "foo error", err)
}

View File

@@ -22,7 +22,7 @@ func (c *beaconApiValidatorClient) proposeAttestation(ctx context.Context, attes
}
headers := map[string]string{"Eth-Consensus-Version": version.String(attestation.Version())}
err = c.handler.Post(
err = c.jsonRestHandler.Post(
ctx,
"/eth/v2/beacon/pool/attestations",
headers,
@@ -51,7 +51,7 @@ func (c *beaconApiValidatorClient) proposeAttestationElectra(ctx context.Context
}
consensusVersion := version.String(slots.ToForkVersion(attestation.Data.Slot))
headers := map[string]string{"Eth-Consensus-Version": consensusVersion}
if err = c.handler.Post(
if err = c.jsonRestHandler.Post(
ctx,
"/eth/v2/beacon/pool/attestations",
headers,

View File

@@ -107,7 +107,7 @@ func TestProposeAttestation(t *testing.T) {
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
ctrl := gomock.NewController(t)
handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
var marshalledAttestations []byte
if helpers.ValidateNilAttestation(test.attestation) == nil {
@@ -119,7 +119,7 @@ func TestProposeAttestation(t *testing.T) {
ctx := t.Context()
headers := map[string]string{"Eth-Consensus-Version": version.String(test.attestation.Version())}
handler.EXPECT().Post(
jsonRestHandler.EXPECT().Post(
gomock.Any(),
"/eth/v2/beacon/pool/attestations",
headers,
@@ -129,7 +129,7 @@ func TestProposeAttestation(t *testing.T) {
test.endpointError,
).Times(test.endpointCall)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
proposeResponse, err := validatorClient.proposeAttestation(ctx, test.attestation)
if test.expectedErrorMessage != "" {
require.ErrorContains(t, test.expectedErrorMessage, err)
@@ -254,7 +254,7 @@ func TestProposeAttestationElectra(t *testing.T) {
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
ctrl := gomock.NewController(t)
handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl)
var marshalledAttestations []byte
if helpers.ValidateNilAttestation(test.attestation) == nil {
@@ -268,7 +268,7 @@ func TestProposeAttestationElectra(t *testing.T) {
if test.expectedConsensusVersion != "" {
headerMatcher = gomock.Eq(map[string]string{"Eth-Consensus-Version": test.expectedConsensusVersion})
}
handler.EXPECT().Post(
jsonRestHandler.EXPECT().Post(
gomock.Any(),
"/eth/v2/beacon/pool/attestations",
headerMatcher,
@@ -278,7 +278,7 @@ func TestProposeAttestationElectra(t *testing.T) {
test.endpointError,
).Times(test.endpointCall)
validatorClient := &beaconApiValidatorClient{handler: handler}
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler}
proposeResponse, err := validatorClient.proposeAttestationElectra(ctx, test.attestation)
if test.expectedErrorMessage != "" {
require.ErrorContains(t, test.expectedErrorMessage, err)

View File

@@ -67,7 +67,7 @@ func (c *beaconApiValidatorClient) proposeBeaconBlock(ctx context.Context, in *e
// Try PostSSZ first with SSZ data
if res.marshalledSSZ != nil {
_, _, err = c.handler.PostSSZ(ctx, endpoint, headers, bytes.NewBuffer(res.marshalledSSZ))
_, _, err = c.jsonRestHandler.PostSSZ(ctx, endpoint, headers, bytes.NewBuffer(res.marshalledSSZ))
if err != nil {
errJson := &httputil.DefaultJsonError{}
// If PostSSZ fails with 406 (Not Acceptable), fall back to JSON
@@ -81,7 +81,7 @@ func (c *beaconApiValidatorClient) proposeBeaconBlock(ctx context.Context, in *e
return nil, errors.Wrap(jsonErr, "failed to marshal JSON")
}
// Reset headers for JSON
err = c.handler.Post(ctx, endpoint, headers, bytes.NewBuffer(jsonData), nil)
err = c.jsonRestHandler.Post(ctx, endpoint, headers, bytes.NewBuffer(jsonData), nil)
// If JSON also fails, return that error
if err != nil {
return nil, errors.Wrap(err, "failed to submit block via JSON fallback")
@@ -100,7 +100,7 @@ func (c *beaconApiValidatorClient) proposeBeaconBlock(ctx context.Context, in *e
return nil, errors.Wrap(jsonErr, "failed to marshal JSON")
}
// Reset headers for JSON
err = c.handler.Post(ctx, endpoint, headers, bytes.NewBuffer(jsonData), nil)
err = c.jsonRestHandler.Post(ctx, endpoint, headers, bytes.NewBuffer(jsonData), nil)
errJson := &httputil.DefaultJsonError{}
if err != nil {
if !errors.As(err, &errJson) {

Some files were not shown because too many files have changed in this diff Show More