From 14ce051668a116f16ed803a3965284302b4b8b2d Mon Sep 17 00:00:00 2001 From: james-prysm <90280386+james-prysm@users.noreply.github.com> Date: Mon, 18 Sep 2023 15:34:28 -0500 Subject: [PATCH] Deneb builder fix (#12921) * fixing conversion for deneb * updating unit test to catch this in the future * gaz --- api/client/builder/BUILD.bazel | 3 +++ api/client/builder/client.go | 7 ++++-- api/client/builder/client_test.go | 24 +++++++++++++++---- .../eth/shared/structs_blocks_conversions.go | 14 +++++------ 4 files changed, 34 insertions(+), 14 deletions(-) diff --git a/api/client/builder/BUILD.bazel b/api/client/builder/BUILD.bazel index d02c82bac3..cb27f6c6a3 100644 --- a/api/client/builder/BUILD.bazel +++ b/api/client/builder/BUILD.bazel @@ -11,6 +11,7 @@ go_library( importpath = "github.com/prysmaticlabs/prysm/v4/api/client/builder", visibility = ["//visibility:public"], deps = [ + "//beacon-chain/rpc/eth/shared:go_default_library", "//config/fieldparams:go_default_library", "//consensus-types:go_default_library", "//consensus-types/blocks:go_default_library", @@ -41,6 +42,7 @@ go_test( data = glob(["testdata/**"]), embed = [":go_default_library"], deps = [ + "//beacon-chain/rpc/eth/shared:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", "//consensus-types/blocks:go_default_library", @@ -54,5 +56,6 @@ go_test( "@com_github_ethereum_go_ethereum//common/hexutil:go_default_library", "@com_github_golang_protobuf//proto:go_default_library", "@com_github_prysmaticlabs_go_bitfield//:go_default_library", + "@com_github_sirupsen_logrus//:go_default_library", ], ) diff --git a/api/client/builder/client.go b/api/client/builder/client.go index 1f6c3c40f6..ea09123216 100644 --- a/api/client/builder/client.go +++ b/api/client/builder/client.go @@ -13,6 +13,7 @@ import ( "text/template" "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/v4/beacon-chain/rpc/eth/shared" "github.com/prysmaticlabs/prysm/v4/consensus-types/blocks" "github.com/prysmaticlabs/prysm/v4/consensus-types/interfaces" "github.com/prysmaticlabs/prysm/v4/consensus-types/primitives" @@ -365,8 +366,10 @@ func (c *Client) SubmitBlindedBlock(ctx context.Context, sb interfaces.ReadOnlyS if err != nil { return nil, nil, errors.Wrapf(err, "could not get protobuf block") } - - b := ðpb.SignedBlindedBeaconBlockAndBlobsDeneb{SignedBlindedBlock: psb, SignedBlindedBlobSidecars: blobs} + b, err := shared.SignedBlindedBeaconBlockContentsDenebFromConsensus(ðpb.SignedBlindedBeaconBlockAndBlobsDeneb{SignedBlindedBlock: psb, SignedBlindedBlobSidecars: blobs}) + if err != nil { + return nil, nil, errors.Wrapf(err, "could not convert SignedBlindedBeaconBlockContentsDeneb to json marshalable type") + } body, err := json.Marshal(b) if err != nil { return nil, nil, errors.Wrap(err, "error encoding the SignedBlindedBeaconBlockDeneb value body in SubmitBlindedBlockDeneb") diff --git a/api/client/builder/client_test.go b/api/client/builder/client_test.go index 5292e5f4e7..fd4b898f98 100644 --- a/api/client/builder/client_test.go +++ b/api/client/builder/client_test.go @@ -14,6 +14,7 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/prysmaticlabs/go-bitfield" + "github.com/prysmaticlabs/prysm/v4/beacon-chain/rpc/eth/shared" fieldparams "github.com/prysmaticlabs/prysm/v4/config/fieldparams" "github.com/prysmaticlabs/prysm/v4/config/params" "github.com/prysmaticlabs/prysm/v4/consensus-types/blocks" @@ -23,6 +24,7 @@ import ( eth "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/v4/testing/assert" "github.com/prysmaticlabs/prysm/v4/testing/require" + log "github.com/sirupsen/logrus" ) type roundtrip func(*http.Request) (*http.Response, error) @@ -397,10 +399,18 @@ func TestSubmitBlindedBlock(t *testing.T) { assert.Equal(t, uint64(1), withdrawals[0].Amount) }) t.Run("deneb", func(t *testing.T) { + + test := testSignedBlindedBeaconBlockAndBlobsDeneb(t) hc := &http.Client{ Transport: roundtrip(func(r *http.Request) (*http.Response, error) { require.Equal(t, postBlindedBeaconBlockPath, r.URL.Path) require.Equal(t, "deneb", r.Header.Get("Eth-Consensus-Version")) + var req shared.SignedBlindedBeaconBlockContentsDeneb + err := json.NewDecoder(r.Body).Decode(&req) + require.NoError(t, err) + block, err := req.SignedBlindedBlock.ToConsensus() + require.NoError(t, err) + require.DeepEqual(t, block, test.SignedBlindedBlock) return &http.Response{ StatusCode: http.StatusOK, Body: io.NopCloser(bytes.NewBufferString(testExampleExecutionPayloadDeneb)), @@ -412,7 +422,7 @@ func TestSubmitBlindedBlock(t *testing.T) { hc: hc, baseURL: &url.URL{Host: "localhost:3500", Scheme: "http"}, } - test := testSignedBlindedBeaconBlockAndBlobsDeneb(t) + sbb, err := blocks.NewSignedBeaconBlock(test.SignedBlindedBlock) require.NoError(t, err) @@ -744,6 +754,10 @@ func testSignedBlindedBeaconBlockCapella(t *testing.T) *eth.SignedBlindedBeaconB } func testSignedBlindedBeaconBlockAndBlobsDeneb(t *testing.T) *eth.SignedBlindedBeaconBlockAndBlobsDeneb { + basebytes, err := shared.Uint256ToSSZBytes("14074904626401341155369551180448584754667373453244490859944217516317499064576") + if err != nil { + log.Error(err) + } return ð.SignedBlindedBeaconBlockAndBlobsDeneb{ SignedBlindedBlock: ð.SignedBlindedBeaconBlockDeneb{ Message: ð.BlindedBeaconBlockDeneb{ @@ -758,7 +772,7 @@ func testSignedBlindedBeaconBlockAndBlobsDeneb(t *testing.T) *eth.SignedBlindedB DepositCount: 1, BlockHash: ezDecode(t, "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2"), }, - Graffiti: ezDecode(t, "0xdeadbeefc0ffee"), + Graffiti: ezDecode(t, "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2"), ProposerSlashings: []*eth.ProposerSlashing{ { Header_1: ð.SignedBeaconBlockHeader{ @@ -861,8 +875,8 @@ func testSignedBlindedBeaconBlockAndBlobsDeneb(t *testing.T) *eth.SignedBlindedB }, }, SyncAggregate: ð.SyncAggregate{ - SyncCommitteeSignature: make([]byte, 48), - SyncCommitteeBits: bitfield.Bitvector512{0x01}, + SyncCommitteeSignature: make([]byte, 96), + SyncCommitteeBits: bitfield.Bitvector512(ezDecode(t, "0x6451e9f951ebf05edc01de67e593484b672877054f055903ff0df1a1a945cf30ca26bb4d4b154f94a1bc776bcf5d0efb3603e1f9b8ee2499ccdcfe2a18cef458")), }, ExecutionPayloadHeader: &v1.ExecutionPayloadHeaderDeneb{ ParentHash: ezDecode(t, "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2"), @@ -876,7 +890,7 @@ func testSignedBlindedBeaconBlockAndBlobsDeneb(t *testing.T) *eth.SignedBlindedB GasUsed: 1, Timestamp: 1, ExtraData: ezDecode(t, "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2"), - BaseFeePerGas: []byte(strconv.FormatUint(1, 10)), + BaseFeePerGas: basebytes, BlockHash: ezDecode(t, "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2"), TransactionsRoot: ezDecode(t, "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2"), WithdrawalsRoot: ezDecode(t, "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2"), diff --git a/beacon-chain/rpc/eth/shared/structs_blocks_conversions.go b/beacon-chain/rpc/eth/shared/structs_blocks_conversions.go index 2b38ae7bd8..1ac90aa995 100644 --- a/beacon-chain/rpc/eth/shared/structs_blocks_conversions.go +++ b/beacon-chain/rpc/eth/shared/structs_blocks_conversions.go @@ -423,7 +423,7 @@ func (b *BeaconBlockBellatrix) ToConsensus() (*eth.BeaconBlockBellatrix, error) if err != nil { return nil, NewDecodeError(err, "Body.ExecutionPayload.ExtraData") } - payloadBaseFeePerGas, err := uint256ToSSZBytes(b.Body.ExecutionPayload.BaseFeePerGas) + payloadBaseFeePerGas, err := Uint256ToSSZBytes(b.Body.ExecutionPayload.BaseFeePerGas) if err != nil { return nil, NewDecodeError(err, "Body.ExecutionPayload.BaseFeePerGas") } @@ -638,7 +638,7 @@ func (b *BlindedBeaconBlockBellatrix) ToConsensus() (*eth.BlindedBeaconBlockBell if err != nil { return nil, NewDecodeError(err, "Body.ExecutionPayloadHeader.ExtraData") } - payloadBaseFeePerGas, err := uint256ToSSZBytes(b.Body.ExecutionPayloadHeader.BaseFeePerGas) + payloadBaseFeePerGas, err := Uint256ToSSZBytes(b.Body.ExecutionPayloadHeader.BaseFeePerGas) if err != nil { return nil, NewDecodeError(err, "Body.ExecutionPayloadHeader.BaseFeePerGas") } @@ -845,7 +845,7 @@ func (b *BeaconBlockCapella) ToConsensus() (*eth.BeaconBlockCapella, error) { if err != nil { return nil, NewDecodeError(err, "Body.ExecutionPayload.ExtraData") } - payloadBaseFeePerGas, err := uint256ToSSZBytes(b.Body.ExecutionPayload.BaseFeePerGas) + payloadBaseFeePerGas, err := Uint256ToSSZBytes(b.Body.ExecutionPayload.BaseFeePerGas) if err != nil { return nil, NewDecodeError(err, "Body.ExecutionPayload.BaseFeePerGas") } @@ -1095,7 +1095,7 @@ func (b *BlindedBeaconBlockCapella) ToConsensus() (*eth.BlindedBeaconBlockCapell if err != nil { return nil, NewDecodeError(err, "Body.ExecutionPayloadHeader.ExtraData") } - payloadBaseFeePerGas, err := uint256ToSSZBytes(b.Body.ExecutionPayloadHeader.BaseFeePerGas) + payloadBaseFeePerGas, err := Uint256ToSSZBytes(b.Body.ExecutionPayloadHeader.BaseFeePerGas) if err != nil { return nil, NewDecodeError(err, "Body.ExecutionPayloadHeader.BaseFeePerGas") } @@ -1444,7 +1444,7 @@ func (b *BeaconBlockDeneb) ToConsensus() (*eth.BeaconBlockDeneb, error) { if err != nil { return nil, NewDecodeError(err, "Body.ExecutionPayload.ExtraData") } - payloadBaseFeePerGas, err := uint256ToSSZBytes(b.Body.ExecutionPayload.BaseFeePerGas) + payloadBaseFeePerGas, err := Uint256ToSSZBytes(b.Body.ExecutionPayload.BaseFeePerGas) if err != nil { return nil, NewDecodeError(err, "Body.ExecutionPayload.BaseFeePerGas") } @@ -1836,7 +1836,7 @@ func (b *BlindedBeaconBlockDeneb) ToConsensus() (*eth.BlindedBeaconBlockDeneb, e if err != nil { return nil, NewDecodeError(err, "Body.ExecutionPayloadHeader.ExtraData") } - payloadBaseFeePerGas, err := uint256ToSSZBytes(b.Body.ExecutionPayloadHeader.BaseFeePerGas) + payloadBaseFeePerGas, err := Uint256ToSSZBytes(b.Body.ExecutionPayloadHeader.BaseFeePerGas) if err != nil { return nil, NewDecodeError(err, "Body.ExecutionPayloadHeader.BaseFeePerGas") } @@ -3178,7 +3178,7 @@ func BlsChangesFromConsensus(src []*eth.SignedBLSToExecutionChange) ([]*SignedBl return changes, nil } -func uint256ToSSZBytes(num string) ([]byte, error) { +func Uint256ToSSZBytes(num string) ([]byte, error) { uint256, ok := new(big.Int).SetString(num, 10) if !ok { return nil, errors.New("could not parse Uint256")