From 1bd5ee65934874bd3ee04b58b5f2bb37742f1dde Mon Sep 17 00:00:00 2001 From: rkapka Date: Mon, 15 Jan 2024 19:39:42 +0100 Subject: [PATCH] Add value in Wei to execution payload --- api/client/builder/bid.go | 4 +- api/client/builder/client.go | 5 +- beacon-chain/builder/testing/mock.go | 5 +- beacon-chain/core/blocks/payload_test.go | 5 +- beacon-chain/core/blocks/withdrawals_test.go | 8 +- beacon-chain/db/kv/state_test.go | 5 +- beacon-chain/execution/engine_client.go | 12 +-- beacon-chain/execution/engine_client_test.go | 26 +++--- beacon-chain/execution/testing/BUILD.bazel | 1 - .../execution/testing/mock_engine_client.go | 5 +- .../rpc/eth/shared/conversions_block.go | 4 +- .../rpc/eth/validator/handlers_block.go | 34 +++---- .../validator/construct_generic_block.go | 21 ++--- .../validator/proposer_bellatrix_test.go | 16 ++-- .../proposer_execution_payload_test.go | 3 +- .../state-native/getters_payload_header.go | 6 +- .../state/state-native/hasher_test.go | 3 +- consensus-types/blocks/execution.go | 88 ++++++++++++++----- consensus-types/blocks/execution_test.go | 53 ++++++----- consensus-types/blocks/factory.go | 5 +- consensus-types/blocks/factory_test.go | 3 +- consensus-types/blocks/getters.go | 49 ++++++----- consensus-types/blocks/getters_test.go | 13 +-- consensus-types/blocks/proto.go | 10 ++- consensus-types/blocks/proto_test.go | 9 +- consensus-types/interfaces/BUILD.bazel | 1 + consensus-types/interfaces/beacon_block.go | 3 + consensus-types/mock/BUILD.bazel | 1 + consensus-types/mock/block.go | 5 ++ proto/prysm/v1alpha1/beacon_block.pb.go | 10 +-- proto/prysm/v1alpha1/beacon_block.proto | 2 +- runtime/interop/premine-state.go | 9 +- testing/middleware/builder/BUILD.bazel | 1 - testing/middleware/builder/builder.go | 5 +- .../capella/operations/execution_payload.go | 3 +- .../shared/capella/operations/withdrawals.go | 3 +- .../deneb/operations/execution_payload.go | 3 +- .../shared/deneb/operations/withdrawals.go | 3 +- 38 files changed, 265 insertions(+), 177 deletions(-) diff --git a/api/client/builder/bid.go b/api/client/builder/bid.go index 50e76036ff18..5f50ff2e5a31 100644 --- a/api/client/builder/bid.go +++ b/api/client/builder/bid.go @@ -165,7 +165,7 @@ func WrappedBuilderBidCapella(p *ethpb.BuilderBidCapella) (Bid, error) { // Header returns the execution data interface. func (b builderBidCapella) Header() (interfaces.ExecutionData, error) { // We have to convert big endian to little endian because the value is coming from the execution layer. - return blocks.WrappedExecutionPayloadHeaderCapella(b.p.Header, blocks.PayloadValueToGwei(b.p.Value)) + return blocks.WrappedExecutionPayloadHeaderCapella(b.p.Header, blocks.PayloadValueToWei(b.p.Value)) } // BlobKzgCommitments -- @@ -249,7 +249,7 @@ func (b builderBidDeneb) HashTreeRootWith(hh *ssz.Hasher) error { // Header -- func (b builderBidDeneb) Header() (interfaces.ExecutionData, error) { // We have to convert big endian to little endian because the value is coming from the execution layer. - return blocks.WrappedExecutionPayloadHeaderDeneb(b.p.Header, blocks.PayloadValueToGwei(b.p.Value)) + return blocks.WrappedExecutionPayloadHeaderDeneb(b.p.Header, blocks.PayloadValueToWei(b.p.Value)) } // BlobKzgCommitments -- diff --git a/api/client/builder/client.go b/api/client/builder/client.go index 7fce59503230..8b0a490bab2f 100644 --- a/api/client/builder/client.go +++ b/api/client/builder/client.go @@ -6,6 +6,7 @@ import ( "encoding/json" "fmt" "io" + "math/big" "net" "net/http" "net/url" @@ -357,7 +358,7 @@ func (c *Client) SubmitBlindedBlock(ctx context.Context, sb interfaces.ReadOnlyS if err != nil { return nil, nil, errors.Wrapf(err, "could not extract proto message from payload") } - payload, err := blocks.WrappedExecutionPayloadCapella(p, 0) + payload, err := blocks.WrappedExecutionPayloadCapella(p, big.NewInt(0)) if err != nil { return nil, nil, errors.Wrapf(err, "could not wrap execution payload in interface") } @@ -394,7 +395,7 @@ func (c *Client) SubmitBlindedBlock(ctx context.Context, sb interfaces.ReadOnlyS if err != nil { return nil, nil, errors.Wrapf(err, "could not extract proto message from payload") } - payload, err := blocks.WrappedExecutionPayloadDeneb(p, 0) + payload, err := blocks.WrappedExecutionPayloadDeneb(p, big.NewInt(0)) if err != nil { return nil, nil, errors.Wrapf(err, "could not wrap execution payload in interface") } diff --git a/beacon-chain/builder/testing/mock.go b/beacon-chain/builder/testing/mock.go index c03e7a88ac00..2993d7fe7874 100644 --- a/beacon-chain/builder/testing/mock.go +++ b/beacon-chain/builder/testing/mock.go @@ -2,6 +2,7 @@ package testing import ( "context" + "math/big" "github.com/pkg/errors" "github.com/prysmaticlabs/prysm/v4/api/client/builder" @@ -54,13 +55,13 @@ func (s *MockBuilderService) SubmitBlindedBlock(_ context.Context, b interfaces. } return w, nil, s.ErrSubmitBlindedBlock case version.Capella: - w, err := blocks.WrappedExecutionPayloadCapella(s.PayloadCapella, 0) + w, err := blocks.WrappedExecutionPayloadCapella(s.PayloadCapella, big.NewInt(0)) if err != nil { return nil, nil, errors.Wrap(err, "could not wrap capella payload") } return w, nil, s.ErrSubmitBlindedBlock case version.Deneb: - w, err := blocks.WrappedExecutionPayloadDeneb(s.PayloadDeneb, 0) + w, err := blocks.WrappedExecutionPayloadDeneb(s.PayloadDeneb, big.NewInt(0)) if err != nil { return nil, nil, errors.Wrap(err, "could not wrap deneb payload") } diff --git a/beacon-chain/core/blocks/payload_test.go b/beacon-chain/core/blocks/payload_test.go index eab6487e7fd9..3ec226af523e 100644 --- a/beacon-chain/core/blocks/payload_test.go +++ b/beacon-chain/core/blocks/payload_test.go @@ -1,6 +1,7 @@ package blocks_test import ( + "math/big" "testing" "github.com/prysmaticlabs/prysm/v4/beacon-chain/core/blocks" @@ -609,7 +610,7 @@ func Test_ProcessPayloadCapella(t *testing.T) { random, err := helpers.RandaoMix(st, time.CurrentEpoch(st)) require.NoError(t, err) payload.PrevRandao = random - wrapped, err := consensusblocks.WrappedExecutionPayloadCapella(payload, 0) + wrapped, err := consensusblocks.WrappedExecutionPayloadCapella(payload, big.NewInt(0)) require.NoError(t, err) _, err = blocks.ProcessPayload(st, wrapped) require.NoError(t, err) @@ -873,7 +874,7 @@ func emptyPayloadHeaderCapella() (interfaces.ExecutionData, error) { BlockHash: make([]byte, fieldparams.RootLength), TransactionsRoot: make([]byte, fieldparams.RootLength), WithdrawalsRoot: make([]byte, fieldparams.RootLength), - }, 0) + }, big.NewInt(0)) } func emptyPayload() *enginev1.ExecutionPayload { diff --git a/beacon-chain/core/blocks/withdrawals_test.go b/beacon-chain/core/blocks/withdrawals_test.go index 9a2471bfad67..87c39e04b53e 100644 --- a/beacon-chain/core/blocks/withdrawals_test.go +++ b/beacon-chain/core/blocks/withdrawals_test.go @@ -1,6 +1,7 @@ package blocks_test import ( + "math/big" "math/rand" "testing" @@ -642,7 +643,10 @@ func TestProcessBlindWithdrawals(t *testing.T) { require.NoError(t, err) wdRoot, err := ssz.WithdrawalSliceRoot(test.Args.Withdrawals, fieldparams.MaxWithdrawalsPerPayload) require.NoError(t, err) - p, err := consensusblocks.WrappedExecutionPayloadHeaderCapella(&enginev1.ExecutionPayloadHeaderCapella{WithdrawalsRoot: wdRoot[:]}, 0) + p, err := consensusblocks.WrappedExecutionPayloadHeaderCapella( + &enginev1.ExecutionPayloadHeaderCapella{WithdrawalsRoot: wdRoot[:]}, + big.NewInt(0), + ) require.NoError(t, err) post, err := blocks.ProcessWithdrawals(st, p) if test.Control.ExpectedError { @@ -1060,7 +1064,7 @@ func TestProcessWithdrawals(t *testing.T) { } st, err := prepareValidators(spb, test.Args) require.NoError(t, err) - p, err := consensusblocks.WrappedExecutionPayloadCapella(&enginev1.ExecutionPayloadCapella{Withdrawals: test.Args.Withdrawals}, 0) + p, err := consensusblocks.WrappedExecutionPayloadCapella(&enginev1.ExecutionPayloadCapella{Withdrawals: test.Args.Withdrawals}, big.NewInt(0)) require.NoError(t, err) post, err := blocks.ProcessWithdrawals(st, p) if test.Control.ExpectedError { diff --git a/beacon-chain/db/kv/state_test.go b/beacon-chain/db/kv/state_test.go index f5b04c1a655f..cfb612757beb 100644 --- a/beacon-chain/db/kv/state_test.go +++ b/beacon-chain/db/kv/state_test.go @@ -3,6 +3,7 @@ package kv import ( "context" "encoding/binary" + "math/big" "math/rand" "strconv" "testing" @@ -99,7 +100,7 @@ func TestState_CanSaveRetrieve(t *testing.T) { BlockHash: make([]byte, 32), TransactionsRoot: make([]byte, 32), WithdrawalsRoot: make([]byte, 32), - }, 0) + }, big.NewInt(0)) require.NoError(t, err) require.NoError(t, st.SetLatestExecutionPayloadHeader(p)) return st @@ -124,7 +125,7 @@ func TestState_CanSaveRetrieve(t *testing.T) { BlockHash: make([]byte, 32), TransactionsRoot: make([]byte, 32), WithdrawalsRoot: make([]byte, 32), - }, 0) + }, big.NewInt(0)) require.NoError(t, err) require.NoError(t, st.SetLatestExecutionPayloadHeader(p)) return st diff --git a/beacon-chain/execution/engine_client.go b/beacon-chain/execution/engine_client.go index 4de713b03ee8..4cfcce8416ec 100644 --- a/beacon-chain/execution/engine_client.go +++ b/beacon-chain/execution/engine_client.go @@ -260,7 +260,7 @@ func (s *Service) GetPayload(ctx context.Context, payloadId [8]byte, slot primit if err != nil { return nil, nil, false, handleRPCError(err) } - ed, err := blocks.WrappedExecutionPayloadDeneb(result.Payload, blocks.PayloadValueToGwei(result.Value)) + ed, err := blocks.WrappedExecutionPayloadDeneb(result.Payload, blocks.PayloadValueToWei(result.Value)) if err != nil { return nil, nil, false, err } @@ -273,7 +273,7 @@ func (s *Service) GetPayload(ctx context.Context, payloadId [8]byte, slot primit if err != nil { return nil, nil, false, handleRPCError(err) } - ed, err := blocks.WrappedExecutionPayloadCapella(result.Payload, blocks.PayloadValueToGwei(result.Value)) + ed, err := blocks.WrappedExecutionPayloadCapella(result.Payload, blocks.PayloadValueToWei(result.Value)) if err != nil { return nil, nil, false, err } @@ -734,7 +734,7 @@ func fullPayloadFromExecutionBlock( BlockHash: blockHash[:], Transactions: txs, Withdrawals: block.Withdrawals, - }, 0) // We can't get the block value and don't care about the block value for this instance + }, big.NewInt(0)) // We can't get the block value and don't care about the block value for this instance case version.Deneb: ebg, err := header.ExcessBlobGas() if err != nil { @@ -763,7 +763,7 @@ func fullPayloadFromExecutionBlock( Withdrawals: block.Withdrawals, BlobGasUsed: bgu, ExcessBlobGas: ebg, - }, 0) // We can't get the block value and don't care about the block value for this instance + }, big.NewInt(0)) // We can't get the block value and don't care about the block value for this instance default: return nil, fmt.Errorf("unknown execution block version %d", block.Version) } @@ -811,7 +811,7 @@ func fullPayloadFromPayloadBody( BlockHash: header.BlockHash(), Transactions: body.Transactions, Withdrawals: body.Withdrawals, - }, 0) // We can't get the block value and don't care about the block value for this instance + }, big.NewInt(0)) // We can't get the block value and don't care about the block value for this instance case version.Deneb: ebg, err := header.ExcessBlobGas() if err != nil { @@ -840,7 +840,7 @@ func fullPayloadFromPayloadBody( Withdrawals: body.Withdrawals, ExcessBlobGas: ebg, BlobGasUsed: bgu, - }, 0) // We can't get the block value and don't care about the block value for this instance + }, big.NewInt(0)) // We can't get the block value and don't care about the block value for this instance default: return nil, fmt.Errorf("unknown execution block version for payload %d", bVersion) } diff --git a/beacon-chain/execution/engine_client_test.go b/beacon-chain/execution/engine_client_test.go index 0ba5ed5d4468..9a7002312edf 100644 --- a/beacon-chain/execution/engine_client_test.go +++ b/beacon-chain/execution/engine_client_test.go @@ -127,7 +127,7 @@ func TestClient_IPC(t *testing.T) { require.Equal(t, true, ok) req, ok := fix["ExecutionPayloadCapella"].(*pb.ExecutionPayloadCapella) require.Equal(t, true, ok) - wrappedPayload, err := blocks.WrappedExecutionPayloadCapella(req, 0) + wrappedPayload, err := blocks.WrappedExecutionPayloadCapella(req, big.NewInt(0)) require.NoError(t, err) latestValidHash, err := srv.NewPayload(ctx, wrappedPayload, []common.Hash{}, &common.Hash{}) require.NoError(t, err) @@ -476,7 +476,7 @@ func TestClient_HTTP(t *testing.T) { client := newPayloadV2Setup(t, want, execPayload) // We call the RPC method via HTTP and expect a proper result. - wrappedPayload, err := blocks.WrappedExecutionPayloadCapella(execPayload, 0) + wrappedPayload, err := blocks.WrappedExecutionPayloadCapella(execPayload, big.NewInt(0)) require.NoError(t, err) resp, err := client.NewPayload(ctx, wrappedPayload, []common.Hash{}, &common.Hash{}) require.NoError(t, err) @@ -490,7 +490,7 @@ func TestClient_HTTP(t *testing.T) { client := newPayloadV3Setup(t, want, execPayload) // We call the RPC method via HTTP and expect a proper result. - wrappedPayload, err := blocks.WrappedExecutionPayloadDeneb(execPayload, 0) + wrappedPayload, err := blocks.WrappedExecutionPayloadDeneb(execPayload, big.NewInt(0)) require.NoError(t, err) resp, err := client.NewPayload(ctx, wrappedPayload, []common.Hash{}, &common.Hash{'a'}) require.NoError(t, err) @@ -518,7 +518,7 @@ func TestClient_HTTP(t *testing.T) { client := newPayloadV2Setup(t, want, execPayload) // We call the RPC method via HTTP and expect a proper result. - wrappedPayload, err := blocks.WrappedExecutionPayloadCapella(execPayload, 0) + wrappedPayload, err := blocks.WrappedExecutionPayloadCapella(execPayload, big.NewInt(0)) require.NoError(t, err) resp, err := client.NewPayload(ctx, wrappedPayload, []common.Hash{}, &common.Hash{}) require.ErrorIs(t, ErrAcceptedSyncingPayloadStatus, err) @@ -532,7 +532,7 @@ func TestClient_HTTP(t *testing.T) { client := newPayloadV3Setup(t, want, execPayload) // We call the RPC method via HTTP and expect a proper result. - wrappedPayload, err := blocks.WrappedExecutionPayloadDeneb(execPayload, 0) + wrappedPayload, err := blocks.WrappedExecutionPayloadDeneb(execPayload, big.NewInt(0)) require.NoError(t, err) resp, err := client.NewPayload(ctx, wrappedPayload, []common.Hash{}, &common.Hash{'a'}) require.ErrorIs(t, ErrAcceptedSyncingPayloadStatus, err) @@ -560,7 +560,7 @@ func TestClient_HTTP(t *testing.T) { client := newPayloadV2Setup(t, want, execPayload) // We call the RPC method via HTTP and expect a proper result. - wrappedPayload, err := blocks.WrappedExecutionPayloadCapella(execPayload, 0) + wrappedPayload, err := blocks.WrappedExecutionPayloadCapella(execPayload, big.NewInt(0)) require.NoError(t, err) resp, err := client.NewPayload(ctx, wrappedPayload, []common.Hash{}, &common.Hash{}) require.ErrorIs(t, ErrInvalidBlockHashPayloadStatus, err) @@ -574,7 +574,7 @@ func TestClient_HTTP(t *testing.T) { client := newPayloadV3Setup(t, want, execPayload) // We call the RPC method via HTTP and expect a proper result. - wrappedPayload, err := blocks.WrappedExecutionPayloadDeneb(execPayload, 0) + wrappedPayload, err := blocks.WrappedExecutionPayloadDeneb(execPayload, big.NewInt(0)) require.NoError(t, err) resp, err := client.NewPayload(ctx, wrappedPayload, []common.Hash{}, &common.Hash{'a'}) require.ErrorIs(t, ErrInvalidBlockHashPayloadStatus, err) @@ -602,7 +602,7 @@ func TestClient_HTTP(t *testing.T) { client := newPayloadV2Setup(t, want, execPayload) // We call the RPC method via HTTP and expect a proper result. - wrappedPayload, err := blocks.WrappedExecutionPayloadCapella(execPayload, 0) + wrappedPayload, err := blocks.WrappedExecutionPayloadCapella(execPayload, big.NewInt(0)) require.NoError(t, err) resp, err := client.NewPayload(ctx, wrappedPayload, []common.Hash{}, &common.Hash{}) require.ErrorIs(t, ErrInvalidPayloadStatus, err) @@ -616,7 +616,7 @@ func TestClient_HTTP(t *testing.T) { client := newPayloadV3Setup(t, want, execPayload) // We call the RPC method via HTTP and expect a proper result. - wrappedPayload, err := blocks.WrappedExecutionPayloadDeneb(execPayload, 0) + wrappedPayload, err := blocks.WrappedExecutionPayloadDeneb(execPayload, big.NewInt(0)) require.NoError(t, err) resp, err := client.NewPayload(ctx, wrappedPayload, []common.Hash{}, &common.Hash{'a'}) require.ErrorIs(t, ErrInvalidPayloadStatus, err) @@ -1537,7 +1537,7 @@ func Test_fullPayloadFromExecutionBlockCapella(t *testing.T) { p, err := blocks.WrappedExecutionPayloadCapella(&pb.ExecutionPayloadCapella{ BlockHash: wantedHash[:], Transactions: [][]byte{}, - }, 0) + }, big.NewInt(0)) require.NoError(t, err) return p }, @@ -1545,7 +1545,7 @@ func Test_fullPayloadFromExecutionBlockCapella(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - wrapped, err := blocks.WrappedExecutionPayloadHeaderCapella(tt.args.header, 0) + wrapped, err := blocks.WrappedExecutionPayloadHeaderCapella(tt.args.header, big.NewInt(0)) require.NoError(t, err) got, err := fullPayloadFromExecutionBlock(tt.args.version, wrapped, tt.args.block) if err != nil { @@ -1598,7 +1598,7 @@ func Test_fullPayloadFromExecutionBlockDeneb(t *testing.T) { p, err := blocks.WrappedExecutionPayloadDeneb(&pb.ExecutionPayloadDeneb{ BlockHash: wantedHash[:], Transactions: [][]byte{}, - }, 0) + }, big.NewInt(0)) require.NoError(t, err) return p }, @@ -1606,7 +1606,7 @@ func Test_fullPayloadFromExecutionBlockDeneb(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - wrapped, err := blocks.WrappedExecutionPayloadHeaderDeneb(tt.args.header, 0) + wrapped, err := blocks.WrappedExecutionPayloadHeaderDeneb(tt.args.header, big.NewInt(0)) require.NoError(t, err) got, err := fullPayloadFromExecutionBlock(tt.args.version, wrapped, tt.args.block) if err != nil { diff --git a/beacon-chain/execution/testing/BUILD.bazel b/beacon-chain/execution/testing/BUILD.bazel index 44a9cc8fb20c..ca7c21152cf3 100644 --- a/beacon-chain/execution/testing/BUILD.bazel +++ b/beacon-chain/execution/testing/BUILD.bazel @@ -23,7 +23,6 @@ go_library( "//consensus-types/payload-attribute:go_default_library", "//consensus-types/primitives:go_default_library", "//encoding/bytesutil:go_default_library", - "//math:go_default_library", "//proto/engine/v1:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//time/slots:go_default_library", diff --git a/beacon-chain/execution/testing/mock_engine_client.go b/beacon-chain/execution/testing/mock_engine_client.go index 6216aade8926..47afb969bd74 100644 --- a/beacon-chain/execution/testing/mock_engine_client.go +++ b/beacon-chain/execution/testing/mock_engine_client.go @@ -14,7 +14,6 @@ import ( payloadattribute "github.com/prysmaticlabs/prysm/v4/consensus-types/payload-attribute" "github.com/prysmaticlabs/prysm/v4/consensus-types/primitives" "github.com/prysmaticlabs/prysm/v4/encoding/bytesutil" - "github.com/prysmaticlabs/prysm/v4/math" pb "github.com/prysmaticlabs/prysm/v4/proto/engine/v1" "github.com/prysmaticlabs/prysm/v4/time/slots" ) @@ -63,14 +62,14 @@ func (e *EngineClient) ForkchoiceUpdated( // GetPayload -- func (e *EngineClient) GetPayload(_ context.Context, _ [8]byte, s primitives.Slot) (interfaces.ExecutionData, *pb.BlobsBundle, bool, error) { if slots.ToEpoch(s) >= params.BeaconConfig().DenebForkEpoch { - ed, err := blocks.WrappedExecutionPayloadDeneb(e.ExecutionPayloadDeneb, math.Gwei(e.BlockValue)) + ed, err := blocks.WrappedExecutionPayloadDeneb(e.ExecutionPayloadDeneb, big.NewInt(int64(e.BlockValue))) if err != nil { return nil, nil, false, err } return ed, e.BlobsBundle, e.BuilderOverride, nil } if slots.ToEpoch(s) >= params.BeaconConfig().CapellaForkEpoch { - ed, err := blocks.WrappedExecutionPayloadCapella(e.ExecutionPayloadCapella, math.Gwei(e.BlockValue)) + ed, err := blocks.WrappedExecutionPayloadCapella(e.ExecutionPayloadCapella, big.NewInt(int64(e.BlockValue))) if err != nil { return nil, nil, false, err } diff --git a/beacon-chain/rpc/eth/shared/conversions_block.go b/beacon-chain/rpc/eth/shared/conversions_block.go index 2eae9907a2fd..d639ecce871f 100644 --- a/beacon-chain/rpc/eth/shared/conversions_block.go +++ b/beacon-chain/rpc/eth/shared/conversions_block.go @@ -567,7 +567,7 @@ func (b *BlindedBeaconBlockBellatrix) ToGeneric() (*eth.GenericBeaconBlock, erro if err != nil { return nil, err } - return ð.GenericBeaconBlock{Block: ð.GenericBeaconBlock_BlindedBellatrix{BlindedBellatrix: block}, IsBlinded: true, PayloadValue: 0 /* can't get payload value from blinded block */}, nil + return ð.GenericBeaconBlock{Block: ð.GenericBeaconBlock_BlindedBellatrix{BlindedBellatrix: block}, IsBlinded: true, PayloadValue: "0" /* can't get payload value from blinded block */}, nil } func (b *BlindedBeaconBlockBellatrix) ToConsensus() (*eth.BlindedBeaconBlockBellatrix, error) { @@ -1024,7 +1024,7 @@ func (b *BlindedBeaconBlockCapella) ToGeneric() (*eth.GenericBeaconBlock, error) if err != nil { return nil, err } - return ð.GenericBeaconBlock{Block: ð.GenericBeaconBlock_BlindedCapella{BlindedCapella: block}, IsBlinded: true, PayloadValue: 0 /* can't get payload value from blinded block */}, nil + return ð.GenericBeaconBlock{Block: ð.GenericBeaconBlock_BlindedCapella{BlindedCapella: block}, IsBlinded: true, PayloadValue: "0" /* can't get payload value from blinded block */}, nil } func (b *BlindedBeaconBlockCapella) ToConsensus() (*eth.BlindedBeaconBlockCapella, error) { diff --git a/beacon-chain/rpc/eth/validator/handlers_block.go b/beacon-chain/rpc/eth/validator/handlers_block.go index 0150836304cb..6f363afb3226 100644 --- a/beacon-chain/rpc/eth/validator/handlers_block.go +++ b/beacon-chain/rpc/eth/validator/handlers_block.go @@ -310,7 +310,7 @@ func handleProducePhase0V3( w http.ResponseWriter, isSSZ bool, blk *eth.GenericBeaconBlock_Phase0, - payloadValue uint64, + payloadValue string, ) { if isSSZ { sszResp, err := blk.Phase0.MarshalSSZ() @@ -329,8 +329,8 @@ func handleProducePhase0V3( httputil.WriteJson(w, &ProduceBlockV3Response{ Version: version.String(version.Phase0), ExecutionPayloadBlinded: false, - ExecutionPayloadValue: fmt.Sprintf("%d", payloadValue), // mev not available at this point - ConsensusBlockValue: "", // rewards not applicable before altair + ExecutionPayloadValue: payloadValue, // mev not available at this point + ConsensusBlockValue: "", // rewards not applicable before altair Data: jsonBytes, }) } @@ -339,7 +339,7 @@ func handleProduceAltairV3( w http.ResponseWriter, isSSZ bool, blk *eth.GenericBeaconBlock_Altair, - executionPayloadValue uint64, + executionPayloadValue string, consensusPayloadValue string, ) { if isSSZ { @@ -359,7 +359,7 @@ func handleProduceAltairV3( httputil.WriteJson(w, &ProduceBlockV3Response{ Version: version.String(version.Altair), ExecutionPayloadBlinded: false, - ExecutionPayloadValue: fmt.Sprintf("%d", executionPayloadValue), // mev not available at this point + ExecutionPayloadValue: executionPayloadValue, // mev not available at this point ConsensusBlockValue: consensusPayloadValue, Data: jsonBytes, }) @@ -369,7 +369,7 @@ func handleProduceBellatrixV3( w http.ResponseWriter, isSSZ bool, blk *eth.GenericBeaconBlock_Bellatrix, - executionPayloadValue uint64, + executionPayloadValue string, consensusPayloadValue string, ) { if isSSZ { @@ -394,7 +394,7 @@ func handleProduceBellatrixV3( httputil.WriteJson(w, &ProduceBlockV3Response{ Version: version.String(version.Bellatrix), ExecutionPayloadBlinded: false, - ExecutionPayloadValue: fmt.Sprintf("%d", executionPayloadValue), // mev not available at this point + ExecutionPayloadValue: executionPayloadValue, // mev not available at this point ConsensusBlockValue: consensusPayloadValue, Data: jsonBytes, }) @@ -404,7 +404,7 @@ func handleProduceBlindedBellatrixV3( w http.ResponseWriter, isSSZ bool, blk *eth.GenericBeaconBlock_BlindedBellatrix, - executionPayloadValue uint64, + executionPayloadValue string, consensusPayloadValue string, ) { if isSSZ { @@ -429,7 +429,7 @@ func handleProduceBlindedBellatrixV3( httputil.WriteJson(w, &ProduceBlockV3Response{ Version: version.String(version.Bellatrix), ExecutionPayloadBlinded: true, - ExecutionPayloadValue: fmt.Sprintf("%d", executionPayloadValue), + ExecutionPayloadValue: executionPayloadValue, ConsensusBlockValue: consensusPayloadValue, Data: jsonBytes, }) @@ -439,7 +439,7 @@ func handleProduceBlindedCapellaV3( w http.ResponseWriter, isSSZ bool, blk *eth.GenericBeaconBlock_BlindedCapella, - executionPayloadValue uint64, + executionPayloadValue string, consensusPayloadValue string, ) { if isSSZ { @@ -464,7 +464,7 @@ func handleProduceBlindedCapellaV3( httputil.WriteJson(w, &ProduceBlockV3Response{ Version: version.String(version.Capella), ExecutionPayloadBlinded: true, - ExecutionPayloadValue: fmt.Sprintf("%d", executionPayloadValue), + ExecutionPayloadValue: executionPayloadValue, ConsensusBlockValue: consensusPayloadValue, Data: jsonBytes, }) @@ -474,7 +474,7 @@ func handleProduceCapellaV3( w http.ResponseWriter, isSSZ bool, blk *eth.GenericBeaconBlock_Capella, - executionPayloadValue uint64, + executionPayloadValue string, consensusPayloadValue string, ) { if isSSZ { @@ -499,7 +499,7 @@ func handleProduceCapellaV3( httputil.WriteJson(w, &ProduceBlockV3Response{ Version: version.String(version.Capella), ExecutionPayloadBlinded: false, - ExecutionPayloadValue: fmt.Sprintf("%d", executionPayloadValue), // mev not available at this point + ExecutionPayloadValue: executionPayloadValue, // mev not available at this point ConsensusBlockValue: consensusPayloadValue, Data: jsonBytes, }) @@ -509,7 +509,7 @@ func handleProduceBlindedDenebV3( w http.ResponseWriter, isSSZ bool, blk *eth.GenericBeaconBlock_BlindedDeneb, - executionPayloadValue uint64, + executionPayloadValue string, consensusPayloadValue string, ) { if isSSZ { @@ -534,7 +534,7 @@ func handleProduceBlindedDenebV3( httputil.WriteJson(w, &ProduceBlockV3Response{ Version: version.String(version.Deneb), ExecutionPayloadBlinded: true, - ExecutionPayloadValue: fmt.Sprintf("%d", executionPayloadValue), + ExecutionPayloadValue: executionPayloadValue, ConsensusBlockValue: consensusPayloadValue, Data: jsonBytes, }) @@ -544,7 +544,7 @@ func handleProduceDenebV3( w http.ResponseWriter, isSSZ bool, blk *eth.GenericBeaconBlock_Deneb, - executionPayloadValue uint64, + executionPayloadValue string, consensusBlockValue string, ) { if isSSZ { @@ -570,7 +570,7 @@ func handleProduceDenebV3( httputil.WriteJson(w, &ProduceBlockV3Response{ Version: version.String(version.Deneb), ExecutionPayloadBlinded: false, - ExecutionPayloadValue: fmt.Sprintf("%d", executionPayloadValue), // mev not available at this point + ExecutionPayloadValue: executionPayloadValue, // mev not available at this point ConsensusBlockValue: consensusBlockValue, Data: jsonBytes, }) diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/construct_generic_block.go b/beacon-chain/rpc/prysm/v1alpha1/validator/construct_generic_block.go index 386a7ae867ad..54282d251c9e 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/construct_generic_block.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/construct_generic_block.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/prysmaticlabs/prysm/v4/consensus-types/interfaces" + "github.com/prysmaticlabs/prysm/v4/math" enginev1 "github.com/prysmaticlabs/prysm/v4/proto/engine/v1" ethpb "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/v4/runtime/version" @@ -22,7 +23,7 @@ func (vs *Server) constructGenericBeaconBlock(sBlk interfaces.SignedBeaconBlock, } isBlinded := sBlk.IsBlinded() - payloadValue := sBlk.ValueInGwei() + payloadValue := sBlk.ValueInWei() switch sBlk.Version() { case version.Deneb: @@ -41,30 +42,30 @@ func (vs *Server) constructGenericBeaconBlock(sBlk interfaces.SignedBeaconBlock, } // Helper functions for constructing blocks for each version -func (vs *Server) constructDenebBlock(blockProto proto.Message, isBlinded bool, payloadValue uint64, bundle *enginev1.BlobsBundle) *ethpb.GenericBeaconBlock { +func (vs *Server) constructDenebBlock(blockProto proto.Message, isBlinded bool, payloadValue math.Wei, bundle *enginev1.BlobsBundle) *ethpb.GenericBeaconBlock { if isBlinded { - return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_BlindedDeneb{BlindedDeneb: blockProto.(*ethpb.BlindedBeaconBlockDeneb)}, IsBlinded: true, PayloadValue: payloadValue} + return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_BlindedDeneb{BlindedDeneb: blockProto.(*ethpb.BlindedBeaconBlockDeneb)}, IsBlinded: true, PayloadValue: (*payloadValue).String()} } denebContents := ðpb.BeaconBlockContentsDeneb{Block: blockProto.(*ethpb.BeaconBlockDeneb)} if bundle != nil { denebContents.KzgProofs = bundle.Proofs denebContents.Blobs = bundle.Blobs } - return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_Deneb{Deneb: denebContents}, IsBlinded: false, PayloadValue: payloadValue} + return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_Deneb{Deneb: denebContents}, IsBlinded: false, PayloadValue: (*payloadValue).String()} } -func (vs *Server) constructCapellaBlock(pb proto.Message, isBlinded bool, payloadValue uint64) *ethpb.GenericBeaconBlock { +func (vs *Server) constructCapellaBlock(pb proto.Message, isBlinded bool, payloadValue math.Wei) *ethpb.GenericBeaconBlock { if isBlinded { - return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_BlindedCapella{BlindedCapella: pb.(*ethpb.BlindedBeaconBlockCapella)}, IsBlinded: true, PayloadValue: payloadValue} + return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_BlindedCapella{BlindedCapella: pb.(*ethpb.BlindedBeaconBlockCapella)}, IsBlinded: true, PayloadValue: (*payloadValue).String()} } - return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_Capella{Capella: pb.(*ethpb.BeaconBlockCapella)}, IsBlinded: false, PayloadValue: payloadValue} + return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_Capella{Capella: pb.(*ethpb.BeaconBlockCapella)}, IsBlinded: false, PayloadValue: (*payloadValue).String()} } -func (vs *Server) constructBellatrixBlock(pb proto.Message, isBlinded bool, payloadValue uint64) *ethpb.GenericBeaconBlock { +func (vs *Server) constructBellatrixBlock(pb proto.Message, isBlinded bool, payloadValue math.Wei) *ethpb.GenericBeaconBlock { if isBlinded { - return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_BlindedBellatrix{BlindedBellatrix: pb.(*ethpb.BlindedBeaconBlockBellatrix)}, IsBlinded: true, PayloadValue: payloadValue} + return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_BlindedBellatrix{BlindedBellatrix: pb.(*ethpb.BlindedBeaconBlockBellatrix)}, IsBlinded: true, PayloadValue: (*payloadValue).String()} } - return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_Bellatrix{Bellatrix: pb.(*ethpb.BeaconBlockBellatrix)}, IsBlinded: false, PayloadValue: payloadValue} + return ðpb.GenericBeaconBlock{Block: ðpb.GenericBeaconBlock_Bellatrix{Bellatrix: pb.(*ethpb.BeaconBlockBellatrix)}, IsBlinded: false, PayloadValue: (*payloadValue).String()} } func (vs *Server) constructAltairBlock(pb proto.Message) *ethpb.GenericBeaconBlock { diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_bellatrix_test.go b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_bellatrix_test.go index 04d28777805a..e8fb383bc12f 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_bellatrix_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_bellatrix_test.go @@ -46,7 +46,7 @@ func TestServer_setExecutionData(t *testing.T) { beaconDB := dbTest.SetupDB(t) capellaTransitionState, _ := util.DeterministicGenesisStateCapella(t, 1) - wrappedHeaderCapella, err := blocks.WrappedExecutionPayloadHeaderCapella(&v1.ExecutionPayloadHeaderCapella{BlockNumber: 1}, 0) + wrappedHeaderCapella, err := blocks.WrappedExecutionPayloadHeaderCapella(&v1.ExecutionPayloadHeaderCapella{BlockNumber: 1}, big.NewInt(0)) require.NoError(t, err) require.NoError(t, capellaTransitionState.SetLatestExecutionPayloadHeader(wrappedHeaderCapella)) b2pbCapella := util.NewBeaconBlockCapella() @@ -59,7 +59,7 @@ func TestServer_setExecutionData(t *testing.T) { require.NoError(t, beaconDB.SaveFeeRecipientsByValidatorIDs(context.Background(), []primitives.ValidatorIndex{0}, []common.Address{{}})) denebTransitionState, _ := util.DeterministicGenesisStateDeneb(t, 1) - wrappedHeaderDeneb, err := blocks.WrappedExecutionPayloadHeaderDeneb(&v1.ExecutionPayloadHeaderDeneb{BlockNumber: 2}, 0) + wrappedHeaderDeneb, err := blocks.WrappedExecutionPayloadHeaderDeneb(&v1.ExecutionPayloadHeaderDeneb{BlockNumber: 2}, big.NewInt(0)) require.NoError(t, err) require.NoError(t, denebTransitionState.SetLatestExecutionPayloadHeader(wrappedHeaderDeneb)) b2pbDeneb := util.NewBeaconBlockDeneb() @@ -748,7 +748,7 @@ func TestServer_getPayloadHeader(t *testing.T) { require.DeepEqual(t, want, h) } if tc.returnedHeaderCapella != nil { - want, err := blocks.WrappedExecutionPayloadHeaderCapella(tc.returnedHeaderCapella, 0) // value is a mock + want, err := blocks.WrappedExecutionPayloadHeaderCapella(tc.returnedHeaderCapella, big.NewInt(0)) // value is a mock require.NoError(t, err) require.DeepEqual(t, want, h) } @@ -805,7 +805,7 @@ func Test_matchingWithdrawalsRoot(t *testing.T) { }) t.Run("could not get builder withdrawals root", func(t *testing.T) { local := &v1.ExecutionPayloadCapella{} - p, err := blocks.WrappedExecutionPayloadCapella(local, 0) + p, err := blocks.WrappedExecutionPayloadCapella(local, big.NewInt(0)) require.NoError(t, err) header := &v1.ExecutionPayloadHeader{} h, err := blocks.WrappedExecutionPayloadHeader(header) @@ -815,10 +815,10 @@ func Test_matchingWithdrawalsRoot(t *testing.T) { }) t.Run("withdrawals mismatch", func(t *testing.T) { local := &v1.ExecutionPayloadCapella{} - p, err := blocks.WrappedExecutionPayloadCapella(local, 0) + p, err := blocks.WrappedExecutionPayloadCapella(local, big.NewInt(0)) require.NoError(t, err) header := &v1.ExecutionPayloadHeaderCapella{} - h, err := blocks.WrappedExecutionPayloadHeaderCapella(header, 0) + h, err := blocks.WrappedExecutionPayloadHeaderCapella(header, big.NewInt(0)) require.NoError(t, err) matched, err := matchingWithdrawalsRoot(p, h) require.NoError(t, err) @@ -832,13 +832,13 @@ func Test_matchingWithdrawalsRoot(t *testing.T) { Amount: 3, }} local := &v1.ExecutionPayloadCapella{Withdrawals: wds} - p, err := blocks.WrappedExecutionPayloadCapella(local, 0) + p, err := blocks.WrappedExecutionPayloadCapella(local, big.NewInt(0)) require.NoError(t, err) header := &v1.ExecutionPayloadHeaderCapella{} wr, err := ssz.WithdrawalSliceRoot(wds, fieldparams.MaxWithdrawalsPerPayload) require.NoError(t, err) header.WithdrawalsRoot = wr[:] - h, err := blocks.WrappedExecutionPayloadHeaderCapella(header, 0) + h, err := blocks.WrappedExecutionPayloadHeaderCapella(header, big.NewInt(0)) require.NoError(t, err) matched, err := matchingWithdrawalsRoot(p, h) require.NoError(t, err) diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_execution_payload_test.go b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_execution_payload_test.go index 7b157d961083..de8bbd9ef985 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_execution_payload_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_execution_payload_test.go @@ -3,6 +3,7 @@ package validator import ( "context" "errors" + "math/big" "testing" "github.com/ethereum/go-ethereum/common" @@ -60,7 +61,7 @@ func TestServer_getExecutionPayload(t *testing.T) { })) capellaTransitionState, _ := util.DeterministicGenesisStateCapella(t, 1) - wrappedHeaderCapella, err := blocks.WrappedExecutionPayloadHeaderCapella(&pb.ExecutionPayloadHeaderCapella{BlockNumber: 1}, 0) + wrappedHeaderCapella, err := blocks.WrappedExecutionPayloadHeaderCapella(&pb.ExecutionPayloadHeaderCapella{BlockNumber: 1}, big.NewInt(0)) require.NoError(t, err) require.NoError(t, capellaTransitionState.SetLatestExecutionPayloadHeader(wrappedHeaderCapella)) b2pbCapella := util.NewBeaconBlockCapella() diff --git a/beacon-chain/state/state-native/getters_payload_header.go b/beacon-chain/state/state-native/getters_payload_header.go index 214d815069e6..cfd8f8d0030f 100644 --- a/beacon-chain/state/state-native/getters_payload_header.go +++ b/beacon-chain/state/state-native/getters_payload_header.go @@ -1,6 +1,8 @@ package state_native import ( + "math/big" + "github.com/prysmaticlabs/prysm/v4/consensus-types/blocks" "github.com/prysmaticlabs/prysm/v4/consensus-types/interfaces" enginev1 "github.com/prysmaticlabs/prysm/v4/proto/engine/v1" @@ -22,10 +24,10 @@ func (b *BeaconState) LatestExecutionPayloadHeader() (interfaces.ExecutionData, } if b.version == version.Capella { - return blocks.WrappedExecutionPayloadHeaderCapella(b.latestExecutionPayloadHeaderCapellaVal(), 0) + return blocks.WrappedExecutionPayloadHeaderCapella(b.latestExecutionPayloadHeaderCapellaVal(), big.NewInt(0)) } - return blocks.WrappedExecutionPayloadHeaderDeneb(b.latestExecutionPayloadHeaderDenebVal(), 0) + return blocks.WrappedExecutionPayloadHeaderDeneb(b.latestExecutionPayloadHeaderDenebVal(), big.NewInt(0)) } // latestExecutionPayloadHeaderVal of the beacon state. diff --git a/beacon-chain/state/state-native/hasher_test.go b/beacon-chain/state/state-native/hasher_test.go index 38693bf94c1f..193615e6dfbb 100644 --- a/beacon-chain/state/state-native/hasher_test.go +++ b/beacon-chain/state/state-native/hasher_test.go @@ -2,6 +2,7 @@ package state_native_test import ( "context" + "math/big" "testing" "github.com/prysmaticlabs/go-bitfield" @@ -253,7 +254,7 @@ func TestComputeFieldRootsWithHasher_Capella(t *testing.T) { require.NoError(t, beaconState.SetInactivityScores([]uint64{1, 2, 3})) require.NoError(t, beaconState.SetCurrentSyncCommittee(syncCommittee("current"))) require.NoError(t, beaconState.SetNextSyncCommittee(syncCommittee("next"))) - wrappedHeader, err := blocks.WrappedExecutionPayloadHeaderCapella(executionPayloadHeaderCapella(), 0) + wrappedHeader, err := blocks.WrappedExecutionPayloadHeaderCapella(executionPayloadHeaderCapella(), big.NewInt(0)) require.NoError(t, err) require.NoError(t, beaconState.SetLatestExecutionPayloadHeader(wrappedHeader)) require.NoError(t, beaconState.SetNextWithdrawalIndex(123)) diff --git a/consensus-types/blocks/execution.go b/consensus-types/blocks/execution.go index 55460a164b3e..3bfadefd459e 100644 --- a/consensus-types/blocks/execution.go +++ b/consensus-types/blocks/execution.go @@ -187,6 +187,11 @@ func (executionPayload) PbDeneb() (*enginev1.ExecutionPayloadDeneb, error) { return nil, consensus_types.ErrUnsupportedField } +// ValueInWei -- +func (executionPayload) ValueInWei() (math.Wei, error) { + return nil, consensus_types.ErrUnsupportedField +} + // ValueInGwei -- func (executionPayload) ValueInGwei() (uint64, error) { return 0, consensus_types.ErrUnsupportedField @@ -363,6 +368,11 @@ func (executionPayloadHeader) PbBellatrix() (*enginev1.ExecutionPayload, error) return nil, consensus_types.ErrUnsupportedField } +// ValueInWei -- +func (executionPayloadHeader) ValueInWei() (math.Wei, error) { + return nil, consensus_types.ErrUnsupportedField +} + // ValueInGwei -- func (executionPayloadHeader) ValueInGwei() (uint64, error) { return 0, consensus_types.ErrUnsupportedField @@ -400,13 +410,14 @@ func PayloadToHeader(payload interfaces.ExecutionData) (*enginev1.ExecutionPaylo // This wrapper allows us to conform to a common interface so that beacon // blocks for future forks can also be applied across Prysm without issues. type executionPayloadCapella struct { - p *enginev1.ExecutionPayloadCapella - value uint64 + p *enginev1.ExecutionPayloadCapella + weiValue math.Wei + gweiValue uint64 } // WrappedExecutionPayloadCapella is a constructor which wraps a protobuf execution payload into an interface. -func WrappedExecutionPayloadCapella(p *enginev1.ExecutionPayloadCapella, value math.Gwei) (interfaces.ExecutionData, error) { - w := executionPayloadCapella{p: p, value: uint64(value)} +func WrappedExecutionPayloadCapella(p *enginev1.ExecutionPayloadCapella, value math.Wei) (interfaces.ExecutionData, error) { + w := executionPayloadCapella{p: p, weiValue: value, gweiValue: uint64(math.WeiToGwei(value))} if w.IsNil() { return nil, consensus_types.ErrNilObjectWrapped } @@ -568,22 +579,28 @@ func (executionPayloadCapella) PbBellatrix() (*enginev1.ExecutionPayload, error) return nil, consensus_types.ErrUnsupportedField } +// ValueInWei -- +func (e executionPayloadCapella) ValueInWei() (math.Wei, error) { + return e.weiValue, nil +} + // ValueInGwei -- func (e executionPayloadCapella) ValueInGwei() (uint64, error) { - return e.value, nil + return e.gweiValue, nil } // executionPayloadHeaderCapella is a convenience wrapper around a blinded beacon block body's execution header data structure // This wrapper allows us to conform to a common interface so that beacon // blocks for future forks can also be applied across Prysm without issues. type executionPayloadHeaderCapella struct { - p *enginev1.ExecutionPayloadHeaderCapella - value uint64 + p *enginev1.ExecutionPayloadHeaderCapella + weiValue math.Wei + gweiValue uint64 } // WrappedExecutionPayloadHeaderCapella is a constructor which wraps a protobuf execution header into an interface. -func WrappedExecutionPayloadHeaderCapella(p *enginev1.ExecutionPayloadHeaderCapella, value math.Gwei) (interfaces.ExecutionData, error) { - w := executionPayloadHeaderCapella{p: p, value: uint64(value)} +func WrappedExecutionPayloadHeaderCapella(p *enginev1.ExecutionPayloadHeaderCapella, value math.Wei) (interfaces.ExecutionData, error) { + w := executionPayloadHeaderCapella{p: p, weiValue: value, gweiValue: uint64(math.WeiToGwei(value))} if w.IsNil() { return nil, consensus_types.ErrNilObjectWrapped } @@ -745,9 +762,14 @@ func (executionPayloadHeaderCapella) PbBellatrix() (*enginev1.ExecutionPayload, return nil, consensus_types.ErrUnsupportedField } +// ValueInWei -- +func (e executionPayloadHeaderCapella) ValueInWei() (math.Wei, error) { + return e.weiValue, nil +} + // ValueInGwei -- func (e executionPayloadHeaderCapella) ValueInGwei() (uint64, error) { - return e.value, nil + return e.gweiValue, nil } // PayloadToHeaderCapella converts `payload` into execution payload header format. @@ -897,13 +919,14 @@ func IsEmptyExecutionData(data interfaces.ExecutionData) (bool, error) { // This wrapper allows us to conform to a common interface so that beacon // blocks for future forks can also be applied across Prysm without issues. type executionPayloadHeaderDeneb struct { - p *enginev1.ExecutionPayloadHeaderDeneb - value uint64 + p *enginev1.ExecutionPayloadHeaderDeneb + weiValue math.Wei + gweiValue uint64 } // WrappedExecutionPayloadHeaderDeneb is a constructor which wraps a protobuf execution header into an interface. -func WrappedExecutionPayloadHeaderDeneb(p *enginev1.ExecutionPayloadHeaderDeneb, value math.Gwei) (interfaces.ExecutionData, error) { - w := executionPayloadHeaderDeneb{p: p, value: uint64(value)} +func WrappedExecutionPayloadHeaderDeneb(p *enginev1.ExecutionPayloadHeaderDeneb, value math.Wei) (interfaces.ExecutionData, error) { + w := executionPayloadHeaderDeneb{p: p, weiValue: value, gweiValue: uint64(math.WeiToGwei(value))} if w.IsNil() { return nil, consensus_types.ErrNilObjectWrapped } @@ -1030,17 +1053,17 @@ func (e executionPayloadHeaderDeneb) Withdrawals() ([]*enginev1.Withdrawal, erro return nil, consensus_types.ErrUnsupportedField } -// WitdrawalsRoot -- +// WithdrawalsRoot -- func (e executionPayloadHeaderDeneb) WithdrawalsRoot() ([]byte, error) { return e.p.WithdrawalsRoot, nil } -// BlobGasUsed +// BlobGasUsed -- func (e executionPayloadHeaderDeneb) BlobGasUsed() (uint64, error) { return e.p.BlobGasUsed, nil } -// ExcessBlobGas +// ExcessBlobGas -- func (e executionPayloadHeaderDeneb) ExcessBlobGas() (uint64, error) { return e.p.ExcessBlobGas, nil } @@ -1060,8 +1083,14 @@ func (executionPayloadHeaderDeneb) PbCapella() (*enginev1.ExecutionPayloadCapell return nil, consensus_types.ErrUnsupportedField } +// ValueInWei -- +func (e executionPayloadHeaderDeneb) ValueInWei() (math.Wei, error) { + return e.weiValue, nil +} + +// ValueInGwei -- func (e executionPayloadHeaderDeneb) ValueInGwei() (uint64, error) { - return e.value, nil + return e.gweiValue, nil } // IsBlinded returns true if the underlying data is blinded. @@ -1073,13 +1102,14 @@ func (e executionPayloadHeaderDeneb) IsBlinded() bool { // This wrapper allows us to conform to a common interface so that beacon // blocks for future forks can also be applied across Prysm without issues. type executionPayloadDeneb struct { - p *enginev1.ExecutionPayloadDeneb - value uint64 + p *enginev1.ExecutionPayloadDeneb + weiValue math.Wei + gweiValue uint64 } // WrappedExecutionPayloadDeneb is a constructor which wraps a protobuf execution payload into an interface. -func WrappedExecutionPayloadDeneb(p *enginev1.ExecutionPayloadDeneb, value math.Gwei) (interfaces.ExecutionData, error) { - w := executionPayloadDeneb{p: p, value: uint64(value)} +func WrappedExecutionPayloadDeneb(p *enginev1.ExecutionPayloadDeneb, value math.Wei) (interfaces.ExecutionData, error) { + w := executionPayloadDeneb{p: p, weiValue: value, gweiValue: uint64(math.WeiToGwei(value))} if w.IsNil() { return nil, consensus_types.ErrNilObjectWrapped } @@ -1234,8 +1264,14 @@ func (e executionPayloadDeneb) PbDeneb() (*enginev1.ExecutionPayloadDeneb, error return e.p, nil } +// ValueInWei -- +func (e executionPayloadDeneb) ValueInWei() (math.Wei, error) { + return e.weiValue, nil +} + +// ValueInGwei -- func (e executionPayloadDeneb) ValueInGwei() (uint64, error) { - return e.value, nil + return e.gweiValue, nil } // IsBlinded returns true if the underlying data is blinded. @@ -1243,6 +1279,12 @@ func (e executionPayloadDeneb) IsBlinded() bool { return false } +// PayloadValueToWei returns a Wei value given the payload's value +func PayloadValueToWei(value []byte) math.Wei { + // We have to convert big endian to little endian because the value is coming from the execution layer. + return big.NewInt(0).SetBytes(bytesutil.ReverseByteOrder(value)) +} + // PayloadValueToGwei returns a Gwei value given the payload's value func PayloadValueToGwei(value []byte) math.Gwei { // We have to convert big endian to little endian because the value is coming from the execution layer. diff --git a/consensus-types/blocks/execution_test.go b/consensus-types/blocks/execution_test.go index 5f0788e5f3f7..22cdb46acd97 100644 --- a/consensus-types/blocks/execution_test.go +++ b/consensus-types/blocks/execution_test.go @@ -1,6 +1,7 @@ package blocks_test import ( + "math/big" "testing" fieldparams "github.com/prysmaticlabs/prysm/v4/config/fieldparams" @@ -105,11 +106,14 @@ func TestWrapExecutionPayloadCapella(t *testing.T) { Amount: 77, }}, } - payload, err := blocks.WrappedExecutionPayloadCapella(data, 10) + payload, err := blocks.WrappedExecutionPayloadCapella(data, big.NewInt(10*1e9)) require.NoError(t, err) - v, err := payload.ValueInGwei() + wei, err := payload.ValueInWei() require.NoError(t, err) - assert.Equal(t, uint64(10), v) + assert.Equal(t, 0, big.NewInt(10*1e9).Cmp(wei)) + gwei, err := payload.ValueInGwei() + require.NoError(t, err) + assert.Equal(t, uint64(10), gwei) assert.DeepEqual(t, data, payload.Proto()) } @@ -132,12 +136,15 @@ func TestWrapExecutionPayloadHeaderCapella(t *testing.T) { TransactionsRoot: []byte("transactionsroot"), WithdrawalsRoot: []byte("withdrawalsroot"), } - payload, err := blocks.WrappedExecutionPayloadHeaderCapella(data, 10) + payload, err := blocks.WrappedExecutionPayloadHeaderCapella(data, big.NewInt(10*1e9)) require.NoError(t, err) - v, err := payload.ValueInGwei() + wei, err := payload.ValueInWei() + require.NoError(t, err) + assert.Equal(t, 0, big.NewInt(10*1e9).Cmp(wei)) + gwei, err := payload.ValueInGwei() require.NoError(t, err) - assert.Equal(t, uint64(10), v) + assert.Equal(t, uint64(10), gwei) assert.DeepEqual(t, data, payload.Proto()) @@ -151,22 +158,22 @@ func TestWrapExecutionPayloadHeaderCapella(t *testing.T) { } func TestWrapExecutionPayloadCapella_IsNil(t *testing.T) { - _, err := blocks.WrappedExecutionPayloadCapella(nil, 0) + _, err := blocks.WrappedExecutionPayloadCapella(nil, big.NewInt(0)) require.Equal(t, consensus_types.ErrNilObjectWrapped, err) data := &enginev1.ExecutionPayloadCapella{GasUsed: 54} - payload, err := blocks.WrappedExecutionPayloadCapella(data, 0) + payload, err := blocks.WrappedExecutionPayloadCapella(data, big.NewInt(0)) require.NoError(t, err) assert.Equal(t, false, payload.IsNil()) } func TestWrapExecutionPayloadHeaderCapella_IsNil(t *testing.T) { - _, err := blocks.WrappedExecutionPayloadHeaderCapella(nil, 0) + _, err := blocks.WrappedExecutionPayloadHeaderCapella(nil, big.NewInt(0)) require.Equal(t, consensus_types.ErrNilObjectWrapped, err) data := &enginev1.ExecutionPayloadHeaderCapella{GasUsed: 54} - payload, err := blocks.WrappedExecutionPayloadHeaderCapella(data, 0) + payload, err := blocks.WrappedExecutionPayloadHeaderCapella(data, big.NewInt(0)) require.NoError(t, err) assert.Equal(t, false, payload.IsNil()) @@ -267,11 +274,14 @@ func TestWrapExecutionPayloadDeneb(t *testing.T) { BlobGasUsed: 88, ExcessBlobGas: 99, } - payload, err := blocks.WrappedExecutionPayloadDeneb(data, 420) + payload, err := blocks.WrappedExecutionPayloadDeneb(data, big.NewInt(420*1e9)) require.NoError(t, err) - v, err := payload.ValueInGwei() + wei, err := payload.ValueInWei() require.NoError(t, err) - assert.Equal(t, uint64(420), v) + assert.Equal(t, 0, big.NewInt(420*1e9).Cmp(wei)) + gwei, err := payload.ValueInGwei() + require.NoError(t, err) + assert.Equal(t, uint64(420), gwei) g, err := payload.BlobGasUsed() require.NoError(t, err) @@ -302,12 +312,15 @@ func TestWrapExecutionPayloadHeaderDeneb(t *testing.T) { BlobGasUsed: 88, ExcessBlobGas: 99, } - payload, err := blocks.WrappedExecutionPayloadHeaderDeneb(data, 10) + payload, err := blocks.WrappedExecutionPayloadHeaderDeneb(data, big.NewInt(10*1e9)) require.NoError(t, err) - v, err := payload.ValueInGwei() + wei, err := payload.ValueInWei() + require.NoError(t, err) + assert.Equal(t, 0, big.NewInt(10*1e9).Cmp(wei)) + gwei, err := payload.ValueInGwei() require.NoError(t, err) - assert.Equal(t, uint64(10), v) + assert.Equal(t, uint64(10), gwei) g, err := payload.BlobGasUsed() require.NoError(t, err) @@ -409,7 +422,7 @@ func createWrappedPayloadCapella(t testing.TB) interfaces.ExecutionData { BlockHash: make([]byte, fieldparams.RootLength), Transactions: make([][]byte, 0), Withdrawals: make([]*enginev1.Withdrawal, 0), - }, 0) + }, big.NewInt(0)) require.NoError(t, err) return payload } @@ -431,7 +444,7 @@ func createWrappedPayloadHeaderCapella(t testing.TB) interfaces.ExecutionData { BlockHash: make([]byte, fieldparams.RootLength), TransactionsRoot: make([]byte, fieldparams.RootLength), WithdrawalsRoot: make([]byte, fieldparams.RootLength), - }, 0) + }, big.NewInt(0)) require.NoError(t, err) return payload } @@ -455,7 +468,7 @@ func createWrappedPayloadDeneb(t testing.TB) interfaces.ExecutionData { Withdrawals: make([]*enginev1.Withdrawal, 0), BlobGasUsed: 0, ExcessBlobGas: 0, - }, 0) + }, big.NewInt(0)) require.NoError(t, err) return payload } @@ -479,7 +492,7 @@ func createWrappedPayloadHeaderDeneb(t testing.TB) interfaces.ExecutionData { WithdrawalsRoot: make([]byte, fieldparams.RootLength), BlobGasUsed: 0, ExcessBlobGas: 0, - }, 0) + }, big.NewInt(0)) require.NoError(t, err) return payload } diff --git a/consensus-types/blocks/factory.go b/consensus-types/blocks/factory.go index fd112538e1e7..d5841988d629 100644 --- a/consensus-types/blocks/factory.go +++ b/consensus-types/blocks/factory.go @@ -2,6 +2,7 @@ package blocks import ( "fmt" + "math/big" "github.com/pkg/errors" "github.com/prysmaticlabs/prysm/v4/consensus-types/interfaces" @@ -228,9 +229,9 @@ func BuildSignedBeaconBlockFromExecutionPayload( case *enginev1.ExecutionPayload: wrappedPayload, wrapErr = WrappedExecutionPayload(p) case *enginev1.ExecutionPayloadCapella: - wrappedPayload, wrapErr = WrappedExecutionPayloadCapella(p, 0) + wrappedPayload, wrapErr = WrappedExecutionPayloadCapella(p, big.NewInt(0)) case *enginev1.ExecutionPayloadDeneb: - wrappedPayload, wrapErr = WrappedExecutionPayloadDeneb(p, 0) + wrappedPayload, wrapErr = WrappedExecutionPayloadDeneb(p, big.NewInt(0)) default: return nil, fmt.Errorf("%T is not a type of execution payload", p) } diff --git a/consensus-types/blocks/factory_test.go b/consensus-types/blocks/factory_test.go index 3ce4d11bab31..4e65ea4f3c18 100644 --- a/consensus-types/blocks/factory_test.go +++ b/consensus-types/blocks/factory_test.go @@ -3,6 +3,7 @@ package blocks import ( "bytes" "errors" + "math/big" "testing" fieldparams "github.com/prysmaticlabs/prysm/v4/config/fieldparams" @@ -515,7 +516,7 @@ func TestBuildSignedBeaconBlockFromExecutionPayload(t *testing.T) { ExcessBlobGas: 123, BlobGasUsed: 321, } - wrapped, err := WrappedExecutionPayloadDeneb(payload, 123) + wrapped, err := WrappedExecutionPayloadDeneb(payload, big.NewInt(123)) require.NoError(t, err) header, err := PayloadToHeaderDeneb(wrapped) require.NoError(t, err) diff --git a/consensus-types/blocks/getters.go b/consensus-types/blocks/getters.go index 309b3498d35d..fbb2ae9e342e 100644 --- a/consensus-types/blocks/getters.go +++ b/consensus-types/blocks/getters.go @@ -2,6 +2,7 @@ package blocks import ( "fmt" + "math/big" "github.com/pkg/errors" ssz "github.com/prysmaticlabs/fastssz" @@ -9,6 +10,7 @@ import ( consensus_types "github.com/prysmaticlabs/prysm/v4/consensus-types" "github.com/prysmaticlabs/prysm/v4/consensus-types/interfaces" "github.com/prysmaticlabs/prysm/v4/consensus-types/primitives" + "github.com/prysmaticlabs/prysm/v4/math" enginev1 "github.com/prysmaticlabs/prysm/v4/proto/engine/v1" eth "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1" validatorpb "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1/validator-client" @@ -371,7 +373,26 @@ func (b *SignedBeaconBlock) IsBlinded() bool { return b.version >= version.Bellatrix && b.block.body.executionPayload == nil } -// ValueInGwei metadata on the payload value returned by the builder. Value is 0 by default if local. +// ValueInWei metadata on the payload value returned by the builder. +func (b *SignedBeaconBlock) ValueInWei() math.Wei { + exec, err := b.block.body.Execution() + if err != nil { + if !errors.Is(err, consensus_types.ErrUnsupportedField) { + log.WithError(err).Warn("failed to retrieve execution payload") + } + return big.NewInt(0) + } + val, err := exec.ValueInWei() + if err != nil { + if !errors.Is(err, consensus_types.ErrUnsupportedField) { + log.WithError(err).Warn("failed to retrieve execution payload") + } + return big.NewInt(0) + } + return val +} + +// ValueInGwei metadata on the payload value returned by the builder. func (b *SignedBeaconBlock) ValueInGwei() uint64 { exec, err := b.block.body.Execution() if err != nil { @@ -1068,7 +1089,7 @@ func (b *BeaconBlockBody) Execution() (interfaces.ExecutionData, error) { if !ok { return nil, errPayloadHeaderWrongType } - return WrappedExecutionPayloadHeaderCapella(ph, 0) + return WrappedExecutionPayloadHeaderCapella(ph, big.NewInt(0)) } } var p *enginev1.ExecutionPayloadCapella @@ -1079,30 +1100,12 @@ func (b *BeaconBlockBody) Execution() (interfaces.ExecutionData, error) { return nil, errPayloadWrongType } } - return WrappedExecutionPayloadCapella(p, 0) + return WrappedExecutionPayloadCapella(p, big.NewInt(0)) case version.Deneb: if b.IsBlinded() { - var ph *enginev1.ExecutionPayloadHeaderDeneb - var ok bool - if b.executionPayloadHeader != nil { - ph, ok = b.executionPayloadHeader.Proto().(*enginev1.ExecutionPayloadHeaderDeneb) - if !ok { - return nil, errPayloadHeaderWrongType - } - return WrappedExecutionPayloadHeaderDeneb(ph, 0) - } - } - var p *enginev1.ExecutionPayloadDeneb - var ok bool - if b.executionPayload != nil { - p, ok = b.executionPayload.Proto().(*enginev1.ExecutionPayloadDeneb) - if !ok { - return nil, errPayloadWrongType - } + return b.executionPayloadHeader, nil } - return WrappedExecutionPayloadDeneb(p, 0) - default: - return nil, errIncorrectBlockVersion + return b.executionPayload, nil } } diff --git a/consensus-types/blocks/getters_test.go b/consensus-types/blocks/getters_test.go index be3301ea2d56..a699906307d9 100644 --- a/consensus-types/blocks/getters_test.go +++ b/consensus-types/blocks/getters_test.go @@ -1,6 +1,7 @@ package blocks import ( + "math/big" "testing" ssz "github.com/prysmaticlabs/fastssz" @@ -214,9 +215,9 @@ func Test_BeaconBlock_Copy(t *testing.T) { payload := &pb.ExecutionPayloadDeneb{ExcessBlobGas: 123} header := &pb.ExecutionPayloadHeaderDeneb{ExcessBlobGas: 223} - payloadInterface, err := WrappedExecutionPayloadDeneb(payload, 123) + payloadInterface, err := WrappedExecutionPayloadDeneb(payload, big.NewInt(123)) require.NoError(t, err) - headerInterface, err := WrappedExecutionPayloadHeaderDeneb(header, 123) + headerInterface, err := WrappedExecutionPayloadHeaderDeneb(header, big.NewInt(123)) require.NoError(t, err) bb = &BeaconBlockBody{executionPayload: payloadInterface, executionPayloadHeader: headerInterface, randaoReveal: bytesutil.ToBytes96([]byte{246}), graffiti: bytesutil.ToBytes32([]byte("graffiti"))} b = &BeaconBlock{body: bb, slot: 123, proposerIndex: 456, parentRoot: bytesutil.ToBytes32([]byte("parentroot")), stateRoot: bytesutil.ToBytes32([]byte("stateroot"))} @@ -411,7 +412,7 @@ func Test_BeaconBlockBody_Execution(t *testing.T) { assert.DeepEqual(t, result, e) executionCapella := &pb.ExecutionPayloadCapella{BlockNumber: 1} - eCapella, err := WrappedExecutionPayloadCapella(executionCapella, 0) + eCapella, err := WrappedExecutionPayloadCapella(executionCapella, big.NewInt(0)) require.NoError(t, err) bb = &SignedBeaconBlock{version: version.Capella, block: &BeaconBlock{body: &BeaconBlockBody{version: version.Capella}}} require.NoError(t, bb.SetExecution(eCapella)) @@ -420,7 +421,7 @@ func Test_BeaconBlockBody_Execution(t *testing.T) { assert.DeepEqual(t, result, eCapella) executionCapellaHeader := &pb.ExecutionPayloadHeaderCapella{BlockNumber: 1} - eCapellaHeader, err := WrappedExecutionPayloadHeaderCapella(executionCapellaHeader, 0) + eCapellaHeader, err := WrappedExecutionPayloadHeaderCapella(executionCapellaHeader, big.NewInt(0)) require.NoError(t, err) bb = &SignedBeaconBlock{version: version.Capella, block: &BeaconBlock{version: version.Capella, body: &BeaconBlockBody{version: version.Capella}}} require.NoError(t, bb.SetExecution(eCapellaHeader)) @@ -429,7 +430,7 @@ func Test_BeaconBlockBody_Execution(t *testing.T) { assert.DeepEqual(t, result, eCapellaHeader) executionDeneb := &pb.ExecutionPayloadDeneb{BlockNumber: 1, ExcessBlobGas: 123} - eDeneb, err := WrappedExecutionPayloadDeneb(executionDeneb, 0) + eDeneb, err := WrappedExecutionPayloadDeneb(executionDeneb, big.NewInt(0)) require.NoError(t, err) bb = &SignedBeaconBlock{version: version.Deneb, block: &BeaconBlock{body: &BeaconBlockBody{version: version.Deneb}}} require.NoError(t, bb.SetExecution(eDeneb)) @@ -441,7 +442,7 @@ func Test_BeaconBlockBody_Execution(t *testing.T) { require.DeepEqual(t, gas, uint64(123)) executionDenebHeader := &pb.ExecutionPayloadHeaderDeneb{BlockNumber: 1, ExcessBlobGas: 223} - eDenebHeader, err := WrappedExecutionPayloadHeaderDeneb(executionDenebHeader, 0) + eDenebHeader, err := WrappedExecutionPayloadHeaderDeneb(executionDenebHeader, big.NewInt(0)) require.NoError(t, err) bb = &SignedBeaconBlock{version: version.Deneb, block: &BeaconBlock{version: version.Deneb, body: &BeaconBlockBody{version: version.Deneb}}} require.NoError(t, bb.SetExecution(eDenebHeader)) diff --git a/consensus-types/blocks/proto.go b/consensus-types/blocks/proto.go index 8fe2121f1443..0143c3e241e9 100644 --- a/consensus-types/blocks/proto.go +++ b/consensus-types/blocks/proto.go @@ -1,6 +1,8 @@ package blocks import ( + "math/big" + "github.com/pkg/errors" consensus_types "github.com/prysmaticlabs/prysm/v4/consensus-types" "github.com/prysmaticlabs/prysm/v4/encoding/bytesutil" @@ -844,7 +846,7 @@ func initBlockBodyFromProtoCapella(pb *eth.BeaconBlockBodyCapella) (*BeaconBlock return nil, errNilBlockBody } - p, err := WrappedExecutionPayloadCapella(pb.ExecutionPayload, 0) + p, err := WrappedExecutionPayloadCapella(pb.ExecutionPayload, big.NewInt(0)) // We allow the payload to be nil if err != nil && err != consensus_types.ErrNilObjectWrapped { return nil, err @@ -871,7 +873,7 @@ func initBlindedBlockBodyFromProtoCapella(pb *eth.BlindedBeaconBlockBodyCapella) return nil, errNilBlockBody } - ph, err := WrappedExecutionPayloadHeaderCapella(pb.ExecutionPayloadHeader, 0) + ph, err := WrappedExecutionPayloadHeaderCapella(pb.ExecutionPayloadHeader, big.NewInt(0)) // We allow the payload to be nil if err != nil && err != consensus_types.ErrNilObjectWrapped { return nil, err @@ -898,7 +900,7 @@ func initBlockBodyFromProtoDeneb(pb *eth.BeaconBlockBodyDeneb) (*BeaconBlockBody return nil, errNilBlockBody } - p, err := WrappedExecutionPayloadDeneb(pb.ExecutionPayload, 0) + p, err := WrappedExecutionPayloadDeneb(pb.ExecutionPayload, big.NewInt(0)) // We allow the payload to be nil if err != nil && err != consensus_types.ErrNilObjectWrapped { return nil, err @@ -926,7 +928,7 @@ func initBlindedBlockBodyFromProtoDeneb(pb *eth.BlindedBeaconBlockBodyDeneb) (*B return nil, errNilBlockBody } - ph, err := WrappedExecutionPayloadHeaderDeneb(pb.ExecutionPayloadHeader, 0) + ph, err := WrappedExecutionPayloadHeaderDeneb(pb.ExecutionPayloadHeader, big.NewInt(0)) // We allow the payload to be nil if err != nil && err != consensus_types.ErrNilObjectWrapped { return nil, err diff --git a/consensus-types/blocks/proto_test.go b/consensus-types/blocks/proto_test.go index a9d71f7289ae..d5101e1577db 100644 --- a/consensus-types/blocks/proto_test.go +++ b/consensus-types/blocks/proto_test.go @@ -1,6 +1,7 @@ package blocks import ( + "math/big" "testing" "github.com/prysmaticlabs/go-bitfield" @@ -1331,7 +1332,7 @@ func bodyBlindedBellatrix(t *testing.T) *BeaconBlockBody { func bodyCapella(t *testing.T) *BeaconBlockBody { f := getFields() - p, err := WrappedExecutionPayloadCapella(f.execPayloadCapella, 0) + p, err := WrappedExecutionPayloadCapella(f.execPayloadCapella, big.NewInt(0)) require.NoError(t, err) return &BeaconBlockBody{ version: version.Capella, @@ -1355,7 +1356,7 @@ func bodyCapella(t *testing.T) *BeaconBlockBody { func bodyBlindedCapella(t *testing.T) *BeaconBlockBody { f := getFields() - ph, err := WrappedExecutionPayloadHeaderCapella(f.execPayloadHeaderCapella, 0) + ph, err := WrappedExecutionPayloadHeaderCapella(f.execPayloadHeaderCapella, big.NewInt(0)) require.NoError(t, err) return &BeaconBlockBody{ version: version.Capella, @@ -1379,7 +1380,7 @@ func bodyBlindedCapella(t *testing.T) *BeaconBlockBody { func bodyDeneb(t *testing.T) *BeaconBlockBody { f := getFields() - p, err := WrappedExecutionPayloadDeneb(f.execPayloadDeneb, 0) + p, err := WrappedExecutionPayloadDeneb(f.execPayloadDeneb, big.NewInt(0)) require.NoError(t, err) return &BeaconBlockBody{ version: version.Deneb, @@ -1404,7 +1405,7 @@ func bodyDeneb(t *testing.T) *BeaconBlockBody { func bodyBlindedDeneb(t *testing.T) *BeaconBlockBody { f := getFields() - ph, err := WrappedExecutionPayloadHeaderDeneb(f.execPayloadHeaderDeneb, 0) + ph, err := WrappedExecutionPayloadHeaderDeneb(f.execPayloadHeaderDeneb, big.NewInt(0)) require.NoError(t, err) return &BeaconBlockBody{ version: version.Deneb, diff --git a/consensus-types/interfaces/BUILD.bazel b/consensus-types/interfaces/BUILD.bazel index 83a1bc4af6e5..9f849e35d3fd 100644 --- a/consensus-types/interfaces/BUILD.bazel +++ b/consensus-types/interfaces/BUILD.bazel @@ -11,6 +11,7 @@ go_library( deps = [ "//config/fieldparams:go_default_library", "//consensus-types/primitives:go_default_library", + "//math:go_default_library", "//proto/engine/v1:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//proto/prysm/v1alpha1/validator-client:go_default_library", diff --git a/consensus-types/interfaces/beacon_block.go b/consensus-types/interfaces/beacon_block.go index f046327d064e..b454a54b999c 100644 --- a/consensus-types/interfaces/beacon_block.go +++ b/consensus-types/interfaces/beacon_block.go @@ -4,6 +4,7 @@ import ( ssz "github.com/prysmaticlabs/fastssz" field_params "github.com/prysmaticlabs/prysm/v4/config/fieldparams" "github.com/prysmaticlabs/prysm/v4/consensus-types/primitives" + "github.com/prysmaticlabs/prysm/v4/math" enginev1 "github.com/prysmaticlabs/prysm/v4/proto/engine/v1" ethpb "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1" validatorpb "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1/validator-client" @@ -32,6 +33,7 @@ type ReadOnlySignedBeaconBlock interface { ssz.Unmarshaler Version() int IsBlinded() bool + ValueInWei() math.Wei ValueInGwei() uint64 Header() (*ethpb.SignedBeaconBlockHeader, error) } @@ -130,5 +132,6 @@ type ExecutionData interface { PbCapella() (*enginev1.ExecutionPayloadCapella, error) PbBellatrix() (*enginev1.ExecutionPayload, error) PbDeneb() (*enginev1.ExecutionPayloadDeneb, error) + ValueInWei() (math.Wei, error) ValueInGwei() (uint64, error) } diff --git a/consensus-types/mock/BUILD.bazel b/consensus-types/mock/BUILD.bazel index d202a720b177..b896504c388a 100644 --- a/consensus-types/mock/BUILD.bazel +++ b/consensus-types/mock/BUILD.bazel @@ -9,6 +9,7 @@ go_library( "//config/fieldparams:go_default_library", "//consensus-types/interfaces:go_default_library", "//consensus-types/primitives:go_default_library", + "//math:go_default_library", "//proto/prysm/v1alpha1:go_default_library", "//proto/prysm/v1alpha1/validator-client:go_default_library", "@com_github_prysmaticlabs_fastssz//:go_default_library", diff --git a/consensus-types/mock/block.go b/consensus-types/mock/block.go index b45f771633dc..07e7cd906f88 100644 --- a/consensus-types/mock/block.go +++ b/consensus-types/mock/block.go @@ -5,6 +5,7 @@ import ( field_params "github.com/prysmaticlabs/prysm/v4/config/fieldparams" "github.com/prysmaticlabs/prysm/v4/consensus-types/interfaces" "github.com/prysmaticlabs/prysm/v4/consensus-types/primitives" + "github.com/prysmaticlabs/prysm/v4/math" eth "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1" validatorpb "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1/validator-client" "google.golang.org/protobuf/proto" @@ -106,6 +107,10 @@ func (SignedBeaconBlock) Header() (*eth.SignedBeaconBlockHeader, error) { panic("implement me") } +func (SignedBeaconBlock) ValueInWei() math.Wei { + panic("implement me") +} + func (SignedBeaconBlock) ValueInGwei() uint64 { panic("implement me") } diff --git a/proto/prysm/v1alpha1/beacon_block.pb.go b/proto/prysm/v1alpha1/beacon_block.pb.go index 86026b0e15ca..bbbe6a89eefc 100755 --- a/proto/prysm/v1alpha1/beacon_block.pb.go +++ b/proto/prysm/v1alpha1/beacon_block.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.31.0 -// protoc v4.23.3 +// protoc v4.25.1 // source: proto/prysm/v1alpha1/beacon_block.proto package eth @@ -223,7 +223,7 @@ type GenericBeaconBlock struct { // *GenericBeaconBlock_BlindedDeneb Block isGenericBeaconBlock_Block `protobuf_oneof:"block"` IsBlinded bool `protobuf:"varint,100,opt,name=is_blinded,json=isBlinded,proto3" json:"is_blinded,omitempty"` - PayloadValue uint64 `protobuf:"varint,101,opt,name=payload_value,json=payloadValue,proto3" json:"payload_value,omitempty"` + PayloadValue string `protobuf:"bytes,101,opt,name=payload_value,json=payloadValue,proto3" json:"payload_value,omitempty"` } func (x *GenericBeaconBlock) Reset() { @@ -328,11 +328,11 @@ func (x *GenericBeaconBlock) GetIsBlinded() bool { return false } -func (x *GenericBeaconBlock) GetPayloadValue() uint64 { +func (x *GenericBeaconBlock) GetPayloadValue() string { if x != nil { return x.PayloadValue } - return 0 + return "" } type isGenericBeaconBlock_Block interface { @@ -4000,7 +4000,7 @@ var file_proto_prysm_v1alpha1_beacon_block_proto_rawDesc = []byte{ 0x65, 0x62, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x62, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x64, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x42, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x65, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x75, 0x65, 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0xec, 0x02, 0x0a, 0x0b, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x59, 0x0a, 0x04, 0x73, 0x6c, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x45, 0x82, diff --git a/proto/prysm/v1alpha1/beacon_block.proto b/proto/prysm/v1alpha1/beacon_block.proto index 377f7a1e471e..c2435debcafb 100644 --- a/proto/prysm/v1alpha1/beacon_block.proto +++ b/proto/prysm/v1alpha1/beacon_block.proto @@ -82,7 +82,7 @@ message GenericBeaconBlock { BlindedBeaconBlockDeneb blinded_deneb = 8; } bool is_blinded = 100; - uint64 payload_value = 101; + string payload_value = 101; } // The Ethereum consensus beacon block. The message does not contain a validator signature. diff --git a/runtime/interop/premine-state.go b/runtime/interop/premine-state.go index fa98a95cbb7c..065a8b26be4d 100644 --- a/runtime/interop/premine-state.go +++ b/runtime/interop/premine-state.go @@ -2,6 +2,7 @@ package interop import ( "context" + "math/big" "github.com/ethereum/go-ethereum/core/types" "github.com/pkg/errors" @@ -595,7 +596,7 @@ func (s *PremineGenesisConfig) setExecutionPayload(g state.BeaconState) error { Transactions: make([][]byte, 0), Withdrawals: make([]*enginev1.Withdrawal, 0), } - wep, err := blocks.WrappedExecutionPayloadCapella(payload, 0) + wep, err := blocks.WrappedExecutionPayloadCapella(payload, big.NewInt(0)) if err != nil { return err } @@ -603,7 +604,7 @@ func (s *PremineGenesisConfig) setExecutionPayload(g state.BeaconState) error { if err != nil { return err } - ed, err = blocks.WrappedExecutionPayloadHeaderCapella(eph, 0) + ed, err = blocks.WrappedExecutionPayloadHeaderCapella(eph, big.NewInt(0)) if err != nil { return err } @@ -627,7 +628,7 @@ func (s *PremineGenesisConfig) setExecutionPayload(g state.BeaconState) error { ExcessBlobGas: *gb.ExcessBlobGas(), BlobGasUsed: *gb.BlobGasUsed(), } - wep, err := blocks.WrappedExecutionPayloadDeneb(payload, 0) + wep, err := blocks.WrappedExecutionPayloadDeneb(payload, big.NewInt(0)) if err != nil { return err } @@ -635,7 +636,7 @@ func (s *PremineGenesisConfig) setExecutionPayload(g state.BeaconState) error { if err != nil { return err } - ed, err = blocks.WrappedExecutionPayloadHeaderDeneb(eph, 0) + ed, err = blocks.WrappedExecutionPayloadHeaderDeneb(eph, big.NewInt(0)) if err != nil { return err } diff --git a/testing/middleware/builder/BUILD.bazel b/testing/middleware/builder/BUILD.bazel index 5a584d9ac017..9d973321e6ab 100644 --- a/testing/middleware/builder/BUILD.bazel +++ b/testing/middleware/builder/BUILD.bazel @@ -18,7 +18,6 @@ go_library( "//consensus-types/primitives:go_default_library", "//crypto/bls:go_default_library", "//encoding/bytesutil:go_default_library", - "//math:go_default_library", "//network:go_default_library", "//network/authorization:go_default_library", "//proto/engine/v1:go_default_library", diff --git a/testing/middleware/builder/builder.go b/testing/middleware/builder/builder.go index 02d16db076b3..adfecf3e49d6 100644 --- a/testing/middleware/builder/builder.go +++ b/testing/middleware/builder/builder.go @@ -33,7 +33,6 @@ import ( "github.com/prysmaticlabs/prysm/v4/crypto/bls" "github.com/prysmaticlabs/prysm/v4/encoding/bytesutil" - "github.com/prysmaticlabs/prysm/v4/math" "github.com/prysmaticlabs/prysm/v4/network" "github.com/prysmaticlabs/prysm/v4/network/authorization" v1 "github.com/prysmaticlabs/prysm/v4/proto/engine/v1" @@ -429,7 +428,7 @@ func (p *Builder) handleHeaderRequestCapella(w http.ResponseWriter) { weiVal := big.NewInt(0).SetBytes(bytesutil.ReverseByteOrder(b.Value)) // we set the payload value as twice its actual one so that it always chooses builder payloads vs local payloads weiVal = weiVal.Mul(weiVal, big.NewInt(2)) - wObj, err := blocks.WrappedExecutionPayloadCapella(b.Payload, math.WeiToGwei(weiVal)) + wObj, err := blocks.WrappedExecutionPayloadCapella(b.Payload, weiVal) if err != nil { p.cfg.logger.WithError(err).Error("Could not wrap execution payload") http.Error(w, err.Error(), http.StatusInternalServerError) @@ -510,7 +509,7 @@ func (p *Builder) handleHeaderRequestDeneb(w http.ResponseWriter) { weiVal := big.NewInt(0).SetBytes(bytesutil.ReverseByteOrder(b.Value)) // we set the payload value as twice its actual one so that it always chooses builder payloads vs local payloads weiVal = weiVal.Mul(weiVal, big.NewInt(2)) - wObj, err := blocks.WrappedExecutionPayloadDeneb(b.Payload, math.WeiToGwei(weiVal)) + wObj, err := blocks.WrappedExecutionPayloadDeneb(b.Payload, weiVal) if err != nil { p.cfg.logger.WithError(err).Error("Could not wrap execution payload") http.Error(w, err.Error(), http.StatusInternalServerError) diff --git a/testing/spectest/shared/capella/operations/execution_payload.go b/testing/spectest/shared/capella/operations/execution_payload.go index 7b60348aeb5c..556e557848f9 100644 --- a/testing/spectest/shared/capella/operations/execution_payload.go +++ b/testing/spectest/shared/capella/operations/execution_payload.go @@ -1,6 +1,7 @@ package operations import ( + "math/big" "os" "path" "strings" @@ -53,7 +54,7 @@ func RunExecutionPayloadTest(t *testing.T, config string) { require.NoError(t, err) } - payload, err := blocks2.WrappedExecutionPayloadCapella(block.ExecutionPayload, 0) + payload, err := blocks2.WrappedExecutionPayloadCapella(block.ExecutionPayload, big.NewInt(0)) require.NoError(t, err) file, err := util.BazelFileBytes(testsFolderPath, folder.Name(), "execution.yaml") diff --git a/testing/spectest/shared/capella/operations/withdrawals.go b/testing/spectest/shared/capella/operations/withdrawals.go index 73a99328ab42..0c288fb615d9 100644 --- a/testing/spectest/shared/capella/operations/withdrawals.go +++ b/testing/spectest/shared/capella/operations/withdrawals.go @@ -2,6 +2,7 @@ package operations import ( "context" + "math/big" "path" "testing" @@ -43,7 +44,7 @@ func RunWithdrawalsTest(t *testing.T, config string) { if err != nil { return nil, err } - p, err := consensusblocks.WrappedExecutionPayloadCapella(&enginev1.ExecutionPayloadCapella{Withdrawals: withdrawals}, 0) + p, err := consensusblocks.WrappedExecutionPayloadCapella(&enginev1.ExecutionPayloadCapella{Withdrawals: withdrawals}, big.NewInt(0)) require.NoError(t, err) return blocks.ProcessWithdrawals(s, p) }) diff --git a/testing/spectest/shared/deneb/operations/execution_payload.go b/testing/spectest/shared/deneb/operations/execution_payload.go index 96787dbcc070..6d1970fa5d5f 100644 --- a/testing/spectest/shared/deneb/operations/execution_payload.go +++ b/testing/spectest/shared/deneb/operations/execution_payload.go @@ -1,6 +1,7 @@ package operations import ( + "math/big" "os" "path" "strings" @@ -56,7 +57,7 @@ func RunExecutionPayloadTest(t *testing.T, config string) { require.NoError(t, err) } - payload, err := blocks2.WrappedExecutionPayloadDeneb(body.ExecutionPayload, 0) + payload, err := blocks2.WrappedExecutionPayloadDeneb(body.ExecutionPayload, big.NewInt(0)) require.NoError(t, err) file, err := util.BazelFileBytes(testsFolderPath, folder.Name(), "execution.yaml") diff --git a/testing/spectest/shared/deneb/operations/withdrawals.go b/testing/spectest/shared/deneb/operations/withdrawals.go index 3b45d3d74280..d25f8c160672 100644 --- a/testing/spectest/shared/deneb/operations/withdrawals.go +++ b/testing/spectest/shared/deneb/operations/withdrawals.go @@ -2,6 +2,7 @@ package operations import ( "context" + "math/big" "path" "testing" @@ -40,7 +41,7 @@ func RunWithdrawalsTest(t *testing.T, config string) { if err != nil { return nil, err } - p, err := consensusblocks.WrappedExecutionPayloadDeneb(&enginev1.ExecutionPayloadDeneb{Withdrawals: withdrawals}, 0) + p, err := consensusblocks.WrappedExecutionPayloadDeneb(&enginev1.ExecutionPayloadDeneb{Withdrawals: withdrawals}, big.NewInt(0)) require.NoError(t, err) return blocks.ProcessWithdrawals(s, p) })