diff --git a/beacon-chain/blockchain/BUILD.bazel b/beacon-chain/blockchain/BUILD.bazel index 119058394c..6b52bbc88f 100644 --- a/beacon-chain/blockchain/BUILD.bazel +++ b/beacon-chain/blockchain/BUILD.bazel @@ -64,6 +64,7 @@ go_library( "//config/features:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", + "//consensus-types/forks/bellatrix:go_default_library", "//consensus-types/interfaces:go_default_library", "//consensus-types/primitives:go_default_library", "//consensus-types/wrapper:go_default_library", diff --git a/beacon-chain/blockchain/process_block.go b/beacon-chain/blockchain/process_block.go index 1bdd6a9f02..582c84c568 100644 --- a/beacon-chain/blockchain/process_block.go +++ b/beacon-chain/blockchain/process_block.go @@ -16,6 +16,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/state" "github.com/prysmaticlabs/prysm/config/features" "github.com/prysmaticlabs/prysm/config/params" + "github.com/prysmaticlabs/prysm/consensus-types/forks/bellatrix" "github.com/prysmaticlabs/prysm/consensus-types/interfaces" types "github.com/prysmaticlabs/prysm/consensus-types/primitives" "github.com/prysmaticlabs/prysm/consensus-types/wrapper" @@ -688,7 +689,7 @@ func (s *Service) validateMergeTransitionBlock(ctx context.Context, stateVersion if err != nil { return invalidBlock{err} } - if blocks.IsEmptyPayload(payload) { + if bellatrix.IsEmptyPayload(payload) { return nil } diff --git a/beacon-chain/core/blocks/BUILD.bazel b/beacon-chain/core/blocks/BUILD.bazel index 097a93ca4a..18fadb5140 100644 --- a/beacon-chain/core/blocks/BUILD.bazel +++ b/beacon-chain/core/blocks/BUILD.bazel @@ -31,6 +31,7 @@ go_library( "//beacon-chain/state:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", + "//consensus-types/forks/bellatrix:go_default_library", "//consensus-types/interfaces:go_default_library", "//consensus-types/primitives:go_default_library", "//consensus-types/wrapper:go_default_library", @@ -40,7 +41,6 @@ go_library( "//crypto/bls:go_default_library", "//crypto/hash:go_default_library", "//encoding/bytesutil:go_default_library", - "//encoding/ssz:go_default_library", "//math:go_default_library", "//network/forks:go_default_library", "//proto/engine/v1:go_default_library", @@ -89,6 +89,7 @@ go_test( "//beacon-chain/state/v1:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", + "//consensus-types/forks/bellatrix:go_default_library", "//consensus-types/primitives:go_default_library", "//consensus-types/wrapper:go_default_library", "//container/trie:go_default_library", diff --git a/beacon-chain/core/blocks/payload.go b/beacon-chain/core/blocks/payload.go index 4a7912f362..f1cfb570b2 100644 --- a/beacon-chain/core/blocks/payload.go +++ b/beacon-chain/core/blocks/payload.go @@ -7,11 +7,9 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/beacon-chain/core/time" "github.com/prysmaticlabs/prysm/beacon-chain/state" - fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/consensus-types/forks/bellatrix" "github.com/prysmaticlabs/prysm/consensus-types/interfaces" "github.com/prysmaticlabs/prysm/consensus-types/wrapper" - "github.com/prysmaticlabs/prysm/encoding/bytesutil" - "github.com/prysmaticlabs/prysm/encoding/ssz" enginev1 "github.com/prysmaticlabs/prysm/proto/engine/v1" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/runtime/version" @@ -41,7 +39,7 @@ func IsMergeTransitionComplete(st state.BeaconState) (bool, error) { if err != nil { return false, err } - return !isEmptyHeader(h), nil + return !bellatrix.IsEmptyHeader(h), nil } // IsMergeTransitionBlockUsingPreStatePayloadHeader returns true if the input block is the terminal merge block. @@ -51,7 +49,7 @@ func IsMergeTransitionBlockUsingPreStatePayloadHeader(h *ethpb.ExecutionPayloadH if h == nil || body == nil { return false, errors.New("nil header or block body") } - if !isEmptyHeader(h) { + if !bellatrix.IsEmptyHeader(h) { return false, nil } return IsExecutionBlock(body) @@ -74,7 +72,7 @@ func IsExecutionBlock(body interfaces.BeaconBlockBody) (bool, error) { return false, err default: } - return !IsEmptyPayload(payload), nil + return !bellatrix.IsEmptyPayload(payload), nil } // IsExecutionEnabled returns true if the beacon chain can begin executing. @@ -100,7 +98,7 @@ func IsExecutionEnabled(st state.BeaconState, body interfaces.BeaconBlockBody) ( // IsExecutionEnabledUsingHeader returns true if the execution is enabled using post processed payload header and block body. // This is an optimized version of IsExecutionEnabled where beacon state is not required as an argument. func IsExecutionEnabledUsingHeader(header *ethpb.ExecutionPayloadHeader, body interfaces.BeaconBlockBody) (bool, error) { - if !isEmptyHeader(header) { + if !bellatrix.IsEmptyHeader(header) { return true, nil } return IsExecutionBlock(body) @@ -205,7 +203,7 @@ func ProcessPayload(st state.BeaconState, payload *enginev1.ExecutionPayload) (s return nil, err } - header, err := PayloadToHeader(payload) + header, err := bellatrix.PayloadToHeader(payload) if err != nil { return nil, err } @@ -215,126 +213,6 @@ func ProcessPayload(st state.BeaconState, payload *enginev1.ExecutionPayload) (s return st, nil } -// PayloadToHeader converts `payload` into execution payload header format. -func PayloadToHeader(payload *enginev1.ExecutionPayload) (*ethpb.ExecutionPayloadHeader, error) { - txRoot, err := ssz.TransactionsRoot(payload.Transactions) - if err != nil { - return nil, err - } - - return ðpb.ExecutionPayloadHeader{ - ParentHash: bytesutil.SafeCopyBytes(payload.ParentHash), - FeeRecipient: bytesutil.SafeCopyBytes(payload.FeeRecipient), - StateRoot: bytesutil.SafeCopyBytes(payload.StateRoot), - ReceiptsRoot: bytesutil.SafeCopyBytes(payload.ReceiptsRoot), - LogsBloom: bytesutil.SafeCopyBytes(payload.LogsBloom), - PrevRandao: bytesutil.SafeCopyBytes(payload.PrevRandao), - BlockNumber: payload.BlockNumber, - GasLimit: payload.GasLimit, - GasUsed: payload.GasUsed, - Timestamp: payload.Timestamp, - ExtraData: bytesutil.SafeCopyBytes(payload.ExtraData), - BaseFeePerGas: bytesutil.SafeCopyBytes(payload.BaseFeePerGas), - BlockHash: bytesutil.SafeCopyBytes(payload.BlockHash), - TransactionsRoot: txRoot[:], - }, nil -} - -func IsEmptyPayload(p *enginev1.ExecutionPayload) bool { - if p == nil { - return true - } - if !bytes.Equal(p.ParentHash, make([]byte, fieldparams.RootLength)) { - return false - } - if !bytes.Equal(p.FeeRecipient, make([]byte, fieldparams.FeeRecipientLength)) { - return false - } - if !bytes.Equal(p.StateRoot, make([]byte, fieldparams.RootLength)) { - return false - } - if !bytes.Equal(p.ReceiptsRoot, make([]byte, fieldparams.RootLength)) { - return false - } - if !bytes.Equal(p.LogsBloom, make([]byte, fieldparams.LogsBloomLength)) { - return false - } - if !bytes.Equal(p.PrevRandao, make([]byte, fieldparams.RootLength)) { - return false - } - if !bytes.Equal(p.BaseFeePerGas, make([]byte, fieldparams.RootLength)) { - return false - } - if !bytes.Equal(p.BlockHash, make([]byte, fieldparams.RootLength)) { - return false - } - if len(p.Transactions) != 0 { - return false - } - if len(p.ExtraData) != 0 { - return false - } - if p.BlockNumber != 0 { - return false - } - if p.GasLimit != 0 { - return false - } - if p.GasUsed != 0 { - return false - } - if p.Timestamp != 0 { - return false - } - return true -} - -func isEmptyHeader(h *ethpb.ExecutionPayloadHeader) bool { - if !bytes.Equal(h.ParentHash, make([]byte, fieldparams.RootLength)) { - return false - } - if !bytes.Equal(h.FeeRecipient, make([]byte, fieldparams.FeeRecipientLength)) { - return false - } - if !bytes.Equal(h.StateRoot, make([]byte, fieldparams.RootLength)) { - return false - } - if !bytes.Equal(h.ReceiptsRoot, make([]byte, fieldparams.RootLength)) { - return false - } - if !bytes.Equal(h.LogsBloom, make([]byte, fieldparams.LogsBloomLength)) { - return false - } - if !bytes.Equal(h.PrevRandao, make([]byte, fieldparams.RootLength)) { - return false - } - if !bytes.Equal(h.BaseFeePerGas, make([]byte, fieldparams.RootLength)) { - return false - } - if !bytes.Equal(h.BlockHash, make([]byte, fieldparams.RootLength)) { - return false - } - if !bytes.Equal(h.TransactionsRoot, make([]byte, fieldparams.RootLength)) { - return false - } - if len(h.ExtraData) != 0 { - return false - } - if h.BlockNumber != 0 { - return false - } - if h.GasLimit != 0 { - return false - } - if h.GasUsed != 0 { - return false - } - if h.Timestamp != 0 { - return false - } - return true -} - // ValidatePayloadHeaderWhenMergeCompletes validates the payload header when the merge completes. func ValidatePayloadHeaderWhenMergeCompletes(st state.BeaconState, header *ethpb.ExecutionPayloadHeader) error { // Skip validation if the state is not merge compatible. diff --git a/beacon-chain/core/blocks/payload_test.go b/beacon-chain/core/blocks/payload_test.go index ff56441e24..6ebb87504f 100644 --- a/beacon-chain/core/blocks/payload_test.go +++ b/beacon-chain/core/blocks/payload_test.go @@ -9,6 +9,7 @@ import ( "github.com/prysmaticlabs/prysm/beacon-chain/core/time" "github.com/prysmaticlabs/prysm/beacon-chain/state" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/consensus-types/forks/bellatrix" "github.com/prysmaticlabs/prysm/consensus-types/wrapper" "github.com/prysmaticlabs/prysm/encoding/bytesutil" "github.com/prysmaticlabs/prysm/encoding/ssz" @@ -669,7 +670,7 @@ func Test_ProcessPayload(t *testing.T) { require.Equal(t, tt.err.Error(), err.Error()) } else { require.Equal(t, tt.err, err) - want, err := blocks.PayloadToHeader(tt.payload) + want, err := bellatrix.PayloadToHeader(tt.payload) require.Equal(t, tt.err, err) got, err := st.LatestExecutionPayloadHeader() require.NoError(t, err) @@ -824,7 +825,7 @@ func Test_ValidatePayloadHeaderWhenMergeCompletes(t *testing.T) { func Test_PayloadToHeader(t *testing.T) { p := emptyPayload() - h, err := blocks.PayloadToHeader(p) + h, err := bellatrix.PayloadToHeader(p) require.NoError(t, err) txRoot, err := ssz.TransactionsRoot(p.Transactions) require.NoError(t, err) diff --git a/consensus-types/forks/bellatrix/BUILD.bazel b/consensus-types/forks/bellatrix/BUILD.bazel new file mode 100644 index 0000000000..ce66d62bda --- /dev/null +++ b/consensus-types/forks/bellatrix/BUILD.bazel @@ -0,0 +1,15 @@ +load("@prysm//tools/go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["execution_payload.go"], + importpath = "github.com/prysmaticlabs/prysm/consensus-types/forks/bellatrix", + visibility = ["//visibility:public"], + deps = [ + "//config/fieldparams:go_default_library", + "//encoding/bytesutil:go_default_library", + "//encoding/ssz:go_default_library", + "//proto/engine/v1:go_default_library", + "//proto/prysm/v1alpha1:go_default_library", + ], +) diff --git a/consensus-types/forks/bellatrix/execution_payload.go b/consensus-types/forks/bellatrix/execution_payload.go new file mode 100644 index 0000000000..74cad65c76 --- /dev/null +++ b/consensus-types/forks/bellatrix/execution_payload.go @@ -0,0 +1,131 @@ +package bellatrix + +import ( + "bytes" + + "github.com/prysmaticlabs/prysm/config/fieldparams" + "github.com/prysmaticlabs/prysm/encoding/bytesutil" + "github.com/prysmaticlabs/prysm/encoding/ssz" + "github.com/prysmaticlabs/prysm/proto/engine/v1" + "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" +) + +// PayloadToHeader converts `payload` into execution payload header format. +func PayloadToHeader(payload *enginev1.ExecutionPayload) (*eth.ExecutionPayloadHeader, error) { + txRoot, err := ssz.TransactionsRoot(payload.Transactions) + if err != nil { + return nil, err + } + + return ð.ExecutionPayloadHeader{ + ParentHash: bytesutil.SafeCopyBytes(payload.ParentHash), + FeeRecipient: bytesutil.SafeCopyBytes(payload.FeeRecipient), + StateRoot: bytesutil.SafeCopyBytes(payload.StateRoot), + ReceiptsRoot: bytesutil.SafeCopyBytes(payload.ReceiptsRoot), + LogsBloom: bytesutil.SafeCopyBytes(payload.LogsBloom), + PrevRandao: bytesutil.SafeCopyBytes(payload.PrevRandao), + BlockNumber: payload.BlockNumber, + GasLimit: payload.GasLimit, + GasUsed: payload.GasUsed, + Timestamp: payload.Timestamp, + ExtraData: bytesutil.SafeCopyBytes(payload.ExtraData), + BaseFeePerGas: bytesutil.SafeCopyBytes(payload.BaseFeePerGas), + BlockHash: bytesutil.SafeCopyBytes(payload.BlockHash), + TransactionsRoot: txRoot[:], + }, nil +} + +func IsEmptyPayload(p *enginev1.ExecutionPayload) bool { + if p == nil { + return true + } + if !bytes.Equal(p.ParentHash, make([]byte, field_params.RootLength)) { + return false + } + if !bytes.Equal(p.FeeRecipient, make([]byte, field_params.FeeRecipientLength)) { + return false + } + if !bytes.Equal(p.StateRoot, make([]byte, field_params.RootLength)) { + return false + } + if !bytes.Equal(p.ReceiptsRoot, make([]byte, field_params.RootLength)) { + return false + } + if !bytes.Equal(p.LogsBloom, make([]byte, field_params.LogsBloomLength)) { + return false + } + if !bytes.Equal(p.PrevRandao, make([]byte, field_params.RootLength)) { + return false + } + if !bytes.Equal(p.BaseFeePerGas, make([]byte, field_params.RootLength)) { + return false + } + if !bytes.Equal(p.BlockHash, make([]byte, field_params.RootLength)) { + return false + } + if len(p.Transactions) != 0 { + return false + } + if len(p.ExtraData) != 0 { + return false + } + if p.BlockNumber != 0 { + return false + } + if p.GasLimit != 0 { + return false + } + if p.GasUsed != 0 { + return false + } + if p.Timestamp != 0 { + return false + } + return true +} + +func IsEmptyHeader(h *eth.ExecutionPayloadHeader) bool { + if !bytes.Equal(h.ParentHash, make([]byte, field_params.RootLength)) { + return false + } + if !bytes.Equal(h.FeeRecipient, make([]byte, field_params.FeeRecipientLength)) { + return false + } + if !bytes.Equal(h.StateRoot, make([]byte, field_params.RootLength)) { + return false + } + if !bytes.Equal(h.ReceiptsRoot, make([]byte, field_params.RootLength)) { + return false + } + if !bytes.Equal(h.LogsBloom, make([]byte, field_params.LogsBloomLength)) { + return false + } + if !bytes.Equal(h.PrevRandao, make([]byte, field_params.RootLength)) { + return false + } + if !bytes.Equal(h.BaseFeePerGas, make([]byte, field_params.RootLength)) { + return false + } + if !bytes.Equal(h.BlockHash, make([]byte, field_params.RootLength)) { + return false + } + if !bytes.Equal(h.TransactionsRoot, make([]byte, field_params.RootLength)) { + return false + } + if len(h.ExtraData) != 0 { + return false + } + if h.BlockNumber != 0 { + return false + } + if h.GasLimit != 0 { + return false + } + if h.GasUsed != 0 { + return false + } + if h.Timestamp != 0 { + return false + } + return true +}