diff --git a/api/versionedsubmitblindedblockresponse.go b/api/versionedsubmitblindedblockresponse.go index 1cfc776..2e3ac03 100644 --- a/api/versionedsubmitblindedblockresponse.go +++ b/api/versionedsubmitblindedblockresponse.go @@ -219,8 +219,8 @@ func (v *VersionedSubmitBlindedBlockResponse) ExcessBlobGas() (uint64, error) { } } -// DepositReceipts returns the deposit receipts of the execution payload. -func (v *VersionedSubmitBlindedBlockResponse) DepositReceipts() ([]*consensuselectra.DepositReceipt, error) { +// DepositRequests returns the deposit receipts of the execution payload. +func (v *VersionedSubmitBlindedBlockResponse) DepositRequests() ([]*consensuselectra.DepositRequest, error) { if v == nil { return nil, errors.New("nil struct") } @@ -233,14 +233,14 @@ func (v *VersionedSubmitBlindedBlockResponse) DepositReceipts() ([]*consensusele return nil, errors.New("no data execution payload") } - return v.Electra.ExecutionPayload.DepositReceipts, nil + return v.Electra.ExecutionPayload.DepositRequests, nil default: return nil, errors.New("unsupported version") } } // WithdrawalRequests returns the execution layer withdrawal requests of the execution payload. -func (v *VersionedSubmitBlindedBlockResponse) WithdrawalRequests() ([]*consensuselectra.ExecutionLayerWithdrawalRequest, error) { +func (v *VersionedSubmitBlindedBlockResponse) WithdrawalRequests() ([]*consensuselectra.WithdrawalRequest, error) { if v == nil { return nil, errors.New("nil struct") } diff --git a/api/versionedsubmitblindedblockresponse_test.go b/api/versionedsubmitblindedblockresponse_test.go index a30303d..ff65a84 100644 --- a/api/versionedsubmitblindedblockresponse_test.go +++ b/api/versionedsubmitblindedblockresponse_test.go @@ -139,7 +139,7 @@ func TestVersionedSubmitBlindedBlockResponseBlockHash(t *testing.T) { name: "DenebNoExecutionPayload", payload: &api.VersionedSubmitBlindedBlockResponse{ Version: consensusspec.DataVersionDeneb, - Deneb: &denebapi.ExecutionPayloadAndBlobsBundle{}, + Deneb: &denebapi.ExecutionPayloadAndBlobsBundle{}, }, err: "no execution payload", }, @@ -248,11 +248,11 @@ func TestVersionedSubmitBlindedBlockResponseTransactions(t *testing.T) { }, err: "no data", }, - { + { name: "DenebNoExecutionPayload", bid: &api.VersionedSubmitBlindedBlockResponse{ Version: consensusspec.DataVersionDeneb, - Deneb: &denebapi.ExecutionPayloadAndBlobsBundle{}, + Deneb: &denebapi.ExecutionPayloadAndBlobsBundle{}, }, err: "no execution payload", }, diff --git a/go.mod b/go.mod index 82c7a79..3bcc6e1 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/attestantio/go-builder-client go 1.20 require ( - github.com/attestantio/go-eth2-client v0.21.4-0.20240508201227-6fd8b5ef4447 + github.com/attestantio/go-eth2-client v0.21.7-0.20240701211822-0a60485fce68 github.com/ferranbt/fastssz v0.1.3 // go-yaml after 1.9.2 has memory issues due to https://github.com/goccy/go-yaml/issues/325; avoid. github.com/goccy/go-yaml v1.9.2 diff --git a/go.sum b/go.sum index fd4da60..ac8a6de 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/attestantio/go-eth2-client v0.21.4-0.20240508201227-6fd8b5ef4447 h1:k0SJ1kAoijCKsRLG+D8kzicwAwpkCWsa/9KRQS5EjFg= -github.com/attestantio/go-eth2-client v0.21.4-0.20240508201227-6fd8b5ef4447/go.mod h1:yzMl6JKut8ngKCRyv+6H9j2nNjS/+SMm3N+duf8iix8= +github.com/attestantio/go-eth2-client v0.21.7-0.20240701211822-0a60485fce68 h1:+sc+OAeTcWjQ5BwK6aajh9xnu8KYtIJNVqwbWx+KvQ4= +github.com/attestantio/go-eth2-client v0.21.7-0.20240701211822-0a60485fce68/go.mod h1:vy5jU/uDZ2+RcVzq5BfnG+bQ3/6uu9DGwCrGsPtjJ1A= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= diff --git a/http/metrics.go b/http/metrics.go index e8a5684..b75bec0 100644 --- a/http/metrics.go +++ b/http/metrics.go @@ -68,7 +68,7 @@ func registerPrometheusMetrics(_ context.Context) error { return prometheus.Register(requestsTimer) } -func (s *Service) monitorGetComplete(_ context.Context, endpoint string, result string) { +func (s *Service) monitorGetComplete(_ context.Context, endpoint, result string) { if requestsCounter == nil { return } @@ -76,7 +76,7 @@ func (s *Service) monitorGetComplete(_ context.Context, endpoint string, result requestsCounter.WithLabelValues(s.address, "GET", reduceEndpoint(endpoint), result).Inc() } -func (s *Service) monitorPostComplete(_ context.Context, endpoint string, result string) { +func (s *Service) monitorPostComplete(_ context.Context, endpoint, result string) { if requestsCounter == nil { return } diff --git a/http/unblindproposal.go b/http/unblindproposal.go index a38dda5..51ddc99 100644 --- a/http/unblindproposal.go +++ b/http/unblindproposal.go @@ -31,6 +31,7 @@ import ( "github.com/attestantio/go-eth2-client/spec/bellatrix" "github.com/attestantio/go-eth2-client/spec/capella" "github.com/attestantio/go-eth2-client/spec/deneb" + "github.com/attestantio/go-eth2-client/spec/electra" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" @@ -349,24 +350,29 @@ func (s *Service) unblindDenebProposal(ctx context.Context, } func (s *Service) unblindElectraProposal(ctx context.Context, - started time.Time, - proposal *consensusapiv1electra.SignedBlindedBeaconBlock, + opts *api.UnblindProposalOpts, ) ( - *consensusapi.VersionedSignedProposal, + *api.Response[*consensusapi.VersionedSignedProposal], error, ) { + proposal := opts.Proposal.Electra + specJSON, err := json.Marshal(proposal) if err != nil { - monitorOperation(s.Address(), "unblind proposal", "failed", time.Since(started)) - - return nil, errors.Wrap(err, "failed to marshal JSON") + return nil, errors.Join(errors.New("failed to marshal JSON"), err) } - httpResponse, err := s.post(ctx, "/eth/v1/builder/blinded_blocks", "", bytes.NewBuffer(specJSON), ContentTypeJSON, map[string]string{}) + httpResponse, err := s.post(ctx, + "/eth/v1/builder/blinded_blocks", + "", + &opts.Common, + bytes.NewBuffer(specJSON), + ContentTypeJSON, + map[string]string{}, + false, + ) if err != nil { - monitorOperation(s.Address(), "unblind proposal", "failed", time.Since(started)) - - return nil, errors.Wrap(err, "failed to submit unblind proposal request") + return nil, errors.Join(errors.New("failed to submit unblind proposal request"), err) } // Reconstruct proposal. @@ -391,7 +397,6 @@ func (s *Service) unblindElectraProposal(ctx context.Context, SyncAggregate: proposal.Message.Body.SyncAggregate, BLSToExecutionChanges: proposal.Message.Body.BLSToExecutionChanges, BlobKZGCommitments: proposal.Message.Body.BlobKZGCommitments, - Consolidations: proposal.Message.Body.Consolidations, }, }, Signature: proposal.Signature, @@ -403,19 +408,21 @@ func (s *Service) unblindElectraProposal(ctx context.Context, case ContentTypeJSON: bundle, _, err := decodeJSONResponse(bytes.NewReader(httpResponse.body), &apielectra.ExecutionPayloadAndBlobsBundle{}) if err != nil { - return nil, errors.Wrap(err, "failed to parse electra response") + return nil, errors.Join(errors.New("failed to parse electra response"), err) } // Ensure that the data returned is what we expect. ourExecutionPayloadHash, err := proposal.Message.Body.ExecutionPayloadHeader.HashTreeRoot() if err != nil { - return nil, errors.Wrap(err, "failed to generate hash tree root for our execution payload header") + return nil, errors.Join(errors.New("failed to generate hash tree root for our execution payload header"), err) } receivedExecutionPayloadHash, err := bundle.ExecutionPayload.HashTreeRoot() if err != nil { - return nil, errors.Wrap(err, "failed to generate hash tree root for the received execution payload") + return nil, errors.Join(errors.New("failed to generate hash tree root for the received execution payload"), err) } if !bytes.Equal(ourExecutionPayloadHash[:], receivedExecutionPayloadHash[:]) { - return nil, fmt.Errorf("execution payload hash mismatch: %#x != %#x", receivedExecutionPayloadHash[:], ourExecutionPayloadHash[:]) + return nil, fmt.Errorf("execution payload hash mismatch: %#x != %#x", receivedExecutionPayloadHash[:], + ourExecutionPayloadHash[:], + ) } res.Electra.SignedBlock.Message.Body.ExecutionPayload = bundle.ExecutionPayload @@ -433,7 +440,9 @@ func (s *Service) unblindElectraProposal(ctx context.Context, default: return nil, fmt.Errorf("unsupported content type %v", httpResponse.contentType) } - monitorOperation(s.Address(), "unblind proposal", "succeeded", time.Since(started)) - return res, nil + return &api.Response[*consensusapi.VersionedSignedProposal]{ + Data: res, + Metadata: metadataFromHeaders(httpResponse.headers), + }, nil } diff --git a/spec/versionedsubmitblockrequest.go b/spec/versionedsubmitblockrequest.go index 5c4f54b..50690e4 100644 --- a/spec/versionedsubmitblockrequest.go +++ b/spec/versionedsubmitblockrequest.go @@ -21,8 +21,8 @@ import ( "github.com/attestantio/go-builder-client/api/bellatrix" "github.com/attestantio/go-builder-client/api/capella" "github.com/attestantio/go-builder-client/api/deneb" - apiv1 "github.com/attestantio/go-builder-client/api/v1" "github.com/attestantio/go-builder-client/api/electra" + apiv1 "github.com/attestantio/go-builder-client/api/v1" consensusspec "github.com/attestantio/go-eth2-client/spec" consensusbellatrix "github.com/attestantio/go-eth2-client/spec/bellatrix" consensuscapella "github.com/attestantio/go-eth2-client/spec/capella" @@ -969,8 +969,8 @@ func (v *VersionedSubmitBlockRequest) ExcessBlobGas() (uint64, error) { } } -// DepositReceipts returns the deposit receipts of the execution payload. -func (v *VersionedSubmitBlockRequest) DepositReceipts() ([]*consensuselectra.DepositReceipt, error) { +// DepositRequests returns the deposit receipts of the execution payload. +func (v *VersionedSubmitBlockRequest) DepositRequests() ([]*consensuselectra.DepositRequest, error) { if v == nil { return nil, errors.New("nil struct") } @@ -983,14 +983,14 @@ func (v *VersionedSubmitBlockRequest) DepositReceipts() ([]*consensuselectra.Dep return nil, errors.New("no data execution payload") } - return v.Electra.ExecutionPayload.DepositReceipts, nil + return v.Electra.ExecutionPayload.DepositRequests, nil default: return nil, errors.New("unsupported version") } } // WithdrawalRequests returns the execution layer withdrawal requests of the execution payload. -func (v *VersionedSubmitBlockRequest) WithdrawalRequests() ([]*consensuselectra.ExecutionLayerWithdrawalRequest, error) { +func (v *VersionedSubmitBlockRequest) WithdrawalRequests() ([]*consensuselectra.WithdrawalRequest, error) { if v == nil { return nil, errors.New("nil struct") } @@ -1009,6 +1009,26 @@ func (v *VersionedSubmitBlockRequest) WithdrawalRequests() ([]*consensuselectra. } } +// ConsolidationRequests returns the consolidation requests of the execution payload. +func (v *VersionedSubmitBlockRequest) ConsolidationRequests() ([]*consensuselectra.ConsolidationRequest, error) { + if v == nil { + return nil, errors.New("nil struct") + } + switch v.Version { + case consensusspec.DataVersionElectra: + if v.Electra == nil { + return nil, errors.New("no data") + } + if v.Electra.ExecutionPayload == nil { + return nil, errors.New("no data execution payload") + } + + return v.Electra.ExecutionPayload.ConsolidationRequests, nil + default: + return nil, errors.New("unsupported version") + } +} + // String returns a string version of the structure. func (v *VersionedSubmitBlockRequest) String() string { if v == nil {