diff --git a/beacon-chain/blockchain/log.go b/beacon-chain/blockchain/log.go index f10ebed3e5..9de497fc5f 100644 --- a/beacon-chain/blockchain/log.go +++ b/beacon-chain/blockchain/log.go @@ -53,7 +53,7 @@ func logStateTransitionData(b interfaces.ReadOnlyBeaconBlock) error { log = log.WithField("payloadHash", fmt.Sprintf("%#x", bytesutil.Trunc(p.BlockHash()))) txs, err := p.Transactions() switch { - case errors.Is(err, consensus_types.ErrUnsupportedGetter): + case errors.Is(err, consensus_types.ErrUnsupportedField): case err != nil: return err default: diff --git a/beacon-chain/core/blocks/payload.go b/beacon-chain/core/blocks/payload.go index 4672245727..4567e09a4c 100644 --- a/beacon-chain/core/blocks/payload.go +++ b/beacon-chain/core/blocks/payload.go @@ -61,7 +61,7 @@ func IsExecutionBlock(body interfaces.ReadOnlyBeaconBlockBody) (bool, error) { } payload, err := body.Execution() switch { - case errors.Is(err, consensus_types.ErrUnsupportedGetter): + case errors.Is(err, consensus_types.ErrUnsupportedField): return false, nil case err != nil: return false, err diff --git a/beacon-chain/rpc/eth/beacon/blinded_blocks.go b/beacon-chain/rpc/eth/beacon/blinded_blocks.go index f7cd4f3173..81e4af40ae 100644 --- a/beacon-chain/rpc/eth/beacon/blinded_blocks.go +++ b/beacon-chain/rpc/eth/beacon/blinded_blocks.go @@ -44,8 +44,8 @@ func (bs *Server) GetBlindedBlock(ctx context.Context, req *ethpbv1.BlockRequest result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot) return result, nil } - // ErrUnsupportedGetter means that we have another block type - if !errors.Is(err, consensus_types.ErrUnsupportedGetter) { + // ErrUnsupportedField means that we have another block type + if !errors.Is(err, consensus_types.ErrUnsupportedField) { return nil, status.Errorf(codes.Internal, "Could not get blinded block: %v", err) } result, err = getBlindedBlockAltair(blk) @@ -53,8 +53,8 @@ func (bs *Server) GetBlindedBlock(ctx context.Context, req *ethpbv1.BlockRequest result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot) return result, nil } - // ErrUnsupportedGetter means that we have another block type - if !errors.Is(err, consensus_types.ErrUnsupportedGetter) { + // ErrUnsupportedField means that we have another block type + if !errors.Is(err, consensus_types.ErrUnsupportedField) { return nil, status.Errorf(codes.Internal, "Could not get blinded block: %v", err) } result, err = bs.getBlindedBlockBellatrix(ctx, blk) @@ -62,8 +62,8 @@ func (bs *Server) GetBlindedBlock(ctx context.Context, req *ethpbv1.BlockRequest result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot) return result, nil } - // ErrUnsupportedGetter means that we have another block type - if !errors.Is(err, consensus_types.ErrUnsupportedGetter) { + // ErrUnsupportedField means that we have another block type + if !errors.Is(err, consensus_types.ErrUnsupportedField) { return nil, status.Errorf(codes.Internal, "Could not get blinded block: %v", err) } result, err = bs.getBlindedBlockCapella(ctx, blk) @@ -71,8 +71,8 @@ func (bs *Server) GetBlindedBlock(ctx context.Context, req *ethpbv1.BlockRequest result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot) return result, nil } - // ErrUnsupportedGetter means that we have another block type - if !errors.Is(err, consensus_types.ErrUnsupportedGetter) { + // ErrUnsupportedField means that we have another block type + if !errors.Is(err, consensus_types.ErrUnsupportedField) { return nil, status.Errorf(codes.Internal, "Could not get blinded block: %v", err) } @@ -99,8 +99,8 @@ func (bs *Server) GetBlindedBlockSSZ(ctx context.Context, req *ethpbv1.BlockRequ result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot) return result, nil } - // ErrUnsupportedGetter means that we have another block type - if !errors.Is(err, consensus_types.ErrUnsupportedGetter) { + // ErrUnsupportedField means that we have another block type + if !errors.Is(err, consensus_types.ErrUnsupportedField) { return nil, status.Errorf(codes.Internal, "Could not get signed beacon block: %v", err) } result, err = getSSZBlockAltair(blk) @@ -108,8 +108,8 @@ func (bs *Server) GetBlindedBlockSSZ(ctx context.Context, req *ethpbv1.BlockRequ result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot) return result, nil } - // ErrUnsupportedGetter means that we have another block type - if !errors.Is(err, consensus_types.ErrUnsupportedGetter) { + // ErrUnsupportedField means that we have another block type + if !errors.Is(err, consensus_types.ErrUnsupportedField) { return nil, status.Errorf(codes.Internal, "Could not get signed beacon block: %v", err) } result, err = bs.getBlindedSSZBlockBellatrix(ctx, blk) @@ -117,8 +117,8 @@ func (bs *Server) GetBlindedBlockSSZ(ctx context.Context, req *ethpbv1.BlockRequ result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot) return result, nil } - // ErrUnsupportedGetter means that we have another block type - if !errors.Is(err, consensus_types.ErrUnsupportedGetter) { + // ErrUnsupportedField means that we have another block type + if !errors.Is(err, consensus_types.ErrUnsupportedField) { return nil, status.Errorf(codes.Internal, "Could not get signed beacon block: %v", err) } result, err = bs.getBlindedSSZBlockCapella(ctx, blk) @@ -126,8 +126,8 @@ func (bs *Server) GetBlindedBlockSSZ(ctx context.Context, req *ethpbv1.BlockRequ result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot) return result, nil } - // ErrUnsupportedGetter means that we have another block type - if !errors.Is(err, consensus_types.ErrUnsupportedGetter) { + // ErrUnsupportedField means that we have another block type + if !errors.Is(err, consensus_types.ErrUnsupportedField) { return nil, status.Errorf(codes.Internal, "Could not get signed beacon block: %v", err) } @@ -344,8 +344,8 @@ func getBlindedBlockAltair(blk interfaces.ReadOnlySignedBeaconBlock) (*ethpbv2.B func (bs *Server) getBlindedBlockBellatrix(ctx context.Context, blk interfaces.ReadOnlySignedBeaconBlock) (*ethpbv2.BlindedBlockResponse, error) { bellatrixBlk, err := blk.PbBellatrixBlock() if err != nil { - // ErrUnsupportedGetter means that we have another block type - if errors.Is(err, consensus_types.ErrUnsupportedGetter) { + // ErrUnsupportedField means that we have another block type + if errors.Is(err, consensus_types.ErrUnsupportedField) { if blindedBellatrixBlk, err := blk.PbBlindedBellatrixBlock(); err == nil { if blindedBellatrixBlk == nil { return nil, errNilBlock @@ -414,8 +414,8 @@ func (bs *Server) getBlindedBlockBellatrix(ctx context.Context, blk interfaces.R func (bs *Server) getBlindedBlockCapella(ctx context.Context, blk interfaces.ReadOnlySignedBeaconBlock) (*ethpbv2.BlindedBlockResponse, error) { capellaBlk, err := blk.PbCapellaBlock() if err != nil { - // ErrUnsupportedGetter means that we have another block type - if errors.Is(err, consensus_types.ErrUnsupportedGetter) { + // ErrUnsupportedField means that we have another block type + if errors.Is(err, consensus_types.ErrUnsupportedField) { if blindedCapellaBlk, err := blk.PbBlindedCapellaBlock(); err == nil { if blindedCapellaBlk == nil { return nil, errNilBlock @@ -484,8 +484,8 @@ func (bs *Server) getBlindedBlockCapella(ctx context.Context, blk interfaces.Rea func (bs *Server) getBlindedSSZBlockBellatrix(ctx context.Context, blk interfaces.ReadOnlySignedBeaconBlock) (*ethpbv2.SSZContainer, error) { bellatrixBlk, err := blk.PbBellatrixBlock() if err != nil { - // ErrUnsupportedGetter means that we have another block type - if errors.Is(err, consensus_types.ErrUnsupportedGetter) { + // ErrUnsupportedField means that we have another block type + if errors.Is(err, consensus_types.ErrUnsupportedField) { if blindedBellatrixBlk, err := blk.PbBlindedBellatrixBlock(); err == nil { if blindedBellatrixBlk == nil { return nil, errNilBlock @@ -559,8 +559,8 @@ func (bs *Server) getBlindedSSZBlockBellatrix(ctx context.Context, blk interface func (bs *Server) getBlindedSSZBlockCapella(ctx context.Context, blk interfaces.ReadOnlySignedBeaconBlock) (*ethpbv2.SSZContainer, error) { capellaBlk, err := blk.PbCapellaBlock() if err != nil { - // ErrUnsupportedGetter means that we have another block type - if errors.Is(err, consensus_types.ErrUnsupportedGetter) { + // ErrUnsupportedField means that we have another block type + if errors.Is(err, consensus_types.ErrUnsupportedField) { if blindedCapellaBlk, err := blk.PbBlindedCapellaBlock(); err == nil { if blindedCapellaBlk == nil { return nil, errNilBlock diff --git a/beacon-chain/rpc/eth/beacon/blocks.go b/beacon-chain/rpc/eth/beacon/blocks.go index 42b663c26e..7a599c20c2 100644 --- a/beacon-chain/rpc/eth/beacon/blocks.go +++ b/beacon-chain/rpc/eth/beacon/blocks.go @@ -420,8 +420,8 @@ func (bs *Server) GetBlockV2(ctx context.Context, req *ethpbv2.BlockRequestV2) ( result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot) return result, nil } - // ErrUnsupportedGetter means that we have another block type - if !errors.Is(err, consensus_types.ErrUnsupportedGetter) { + // ErrUnsupportedField means that we have another block type + if !errors.Is(err, consensus_types.ErrUnsupportedField) { return nil, status.Errorf(codes.Internal, "Could not get signed beacon block: %v", err) } result, err = getBlockAltair(blk) @@ -429,8 +429,8 @@ func (bs *Server) GetBlockV2(ctx context.Context, req *ethpbv2.BlockRequestV2) ( result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot) return result, nil } - // ErrUnsupportedGetter means that we have another block type - if !errors.Is(err, consensus_types.ErrUnsupportedGetter) { + // ErrUnsupportedField means that we have another block type + if !errors.Is(err, consensus_types.ErrUnsupportedField) { return nil, status.Errorf(codes.Internal, "Could not get signed beacon block: %v", err) } result, err = bs.getBlockBellatrix(ctx, blk) @@ -438,8 +438,8 @@ func (bs *Server) GetBlockV2(ctx context.Context, req *ethpbv2.BlockRequestV2) ( result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot) return result, nil } - // ErrUnsupportedGetter means that we have another block type - if !errors.Is(err, consensus_types.ErrUnsupportedGetter) { + // ErrUnsupportedField means that we have another block type + if !errors.Is(err, consensus_types.ErrUnsupportedField) { return nil, status.Errorf(codes.Internal, "Could not get signed beacon block: %v", err) } result, err = bs.getBlockCapella(ctx, blk) @@ -447,8 +447,8 @@ func (bs *Server) GetBlockV2(ctx context.Context, req *ethpbv2.BlockRequestV2) ( result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot) return result, nil } - // ErrUnsupportedGetter means that we have another block type - if !errors.Is(err, consensus_types.ErrUnsupportedGetter) { + // ErrUnsupportedField means that we have another block type + if !errors.Is(err, consensus_types.ErrUnsupportedField) { return nil, status.Errorf(codes.Internal, "Could not get signed beacon block: %v", err) } return nil, status.Errorf(codes.Internal, "Unknown block type %T", blk) @@ -474,8 +474,8 @@ func (bs *Server) GetBlockSSZV2(ctx context.Context, req *ethpbv2.BlockRequestV2 result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot) return result, nil } - // ErrUnsupportedGetter means that we have another block type - if !errors.Is(err, consensus_types.ErrUnsupportedGetter) { + // ErrUnsupportedField means that we have another block type + if !errors.Is(err, consensus_types.ErrUnsupportedField) { return nil, status.Errorf(codes.Internal, "Could not get signed beacon block: %v", err) } result, err = getSSZBlockAltair(blk) @@ -483,8 +483,8 @@ func (bs *Server) GetBlockSSZV2(ctx context.Context, req *ethpbv2.BlockRequestV2 result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot) return result, nil } - // ErrUnsupportedGetter means that we have another block type - if !errors.Is(err, consensus_types.ErrUnsupportedGetter) { + // ErrUnsupportedField means that we have another block type + if !errors.Is(err, consensus_types.ErrUnsupportedField) { return nil, status.Errorf(codes.Internal, "Could not get signed beacon block: %v", err) } result, err = bs.getSSZBlockBellatrix(ctx, blk) @@ -492,8 +492,8 @@ func (bs *Server) GetBlockSSZV2(ctx context.Context, req *ethpbv2.BlockRequestV2 result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot) return result, nil } - // ErrUnsupportedGetter means that we have another block type - if !errors.Is(err, consensus_types.ErrUnsupportedGetter) { + // ErrUnsupportedField means that we have another block type + if !errors.Is(err, consensus_types.ErrUnsupportedField) { return nil, status.Errorf(codes.Internal, "Could not get signed beacon block: %v", err) } result, err = bs.getSSZBlockCapella(ctx, blk) @@ -501,8 +501,8 @@ func (bs *Server) GetBlockSSZV2(ctx context.Context, req *ethpbv2.BlockRequestV2 result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot) return result, nil } - // ErrUnsupportedGetter means that we have another block type - if !errors.Is(err, consensus_types.ErrUnsupportedGetter) { + // ErrUnsupportedField means that we have another block type + if !errors.Is(err, consensus_types.ErrUnsupportedField) { return nil, status.Errorf(codes.Internal, "Could not get signed beacon block: %v", err) } @@ -689,8 +689,8 @@ func getBlockAltair(blk interfaces.ReadOnlySignedBeaconBlock) (*ethpbv2.BlockRes func (bs *Server) getBlockBellatrix(ctx context.Context, blk interfaces.ReadOnlySignedBeaconBlock) (*ethpbv2.BlockResponseV2, error) { bellatrixBlk, err := blk.PbBellatrixBlock() if err != nil { - // ErrUnsupportedGetter means that we have another block type - if errors.Is(err, consensus_types.ErrUnsupportedGetter) { + // ErrUnsupportedField means that we have another block type + if errors.Is(err, consensus_types.ErrUnsupportedField) { if blindedBellatrixBlk, err := blk.PbBlindedBellatrixBlock(); err == nil { if blindedBellatrixBlk == nil { return nil, errNilBlock @@ -759,8 +759,8 @@ func (bs *Server) getBlockBellatrix(ctx context.Context, blk interfaces.ReadOnly func (bs *Server) getBlockCapella(ctx context.Context, blk interfaces.ReadOnlySignedBeaconBlock) (*ethpbv2.BlockResponseV2, error) { capellaBlk, err := blk.PbCapellaBlock() if err != nil { - // ErrUnsupportedGetter means that we have another block type - if errors.Is(err, consensus_types.ErrUnsupportedGetter) { + // ErrUnsupportedField means that we have another block type + if errors.Is(err, consensus_types.ErrUnsupportedField) { if blindedCapellaBlk, err := blk.PbBlindedCapellaBlock(); err == nil { if blindedCapellaBlk == nil { return nil, errNilBlock @@ -872,8 +872,8 @@ func getSSZBlockAltair(blk interfaces.ReadOnlySignedBeaconBlock) (*ethpbv2.SSZCo func (bs *Server) getSSZBlockBellatrix(ctx context.Context, blk interfaces.ReadOnlySignedBeaconBlock) (*ethpbv2.SSZContainer, error) { bellatrixBlk, err := blk.PbBellatrixBlock() if err != nil { - // ErrUnsupportedGetter means that we have another block type - if errors.Is(err, consensus_types.ErrUnsupportedGetter) { + // ErrUnsupportedField means that we have another block type + if errors.Is(err, consensus_types.ErrUnsupportedField) { if blindedBellatrixBlk, err := blk.PbBlindedBellatrixBlock(); err == nil { if blindedBellatrixBlk == nil { return nil, errNilBlock @@ -948,8 +948,8 @@ func (bs *Server) getSSZBlockBellatrix(ctx context.Context, blk interfaces.ReadO func (bs *Server) getSSZBlockCapella(ctx context.Context, blk interfaces.ReadOnlySignedBeaconBlock) (*ethpbv2.SSZContainer, error) { capellaBlk, err := blk.PbCapellaBlock() if err != nil { - // ErrUnsupportedGetter means that we have another block type - if errors.Is(err, consensus_types.ErrUnsupportedGetter) { + // ErrUnsupportedField means that we have another block type + if errors.Is(err, consensus_types.ErrUnsupportedField) { if blindedCapellaBlk, err := blk.PbBlindedCapellaBlock(); err == nil { if blindedCapellaBlk == nil { return nil, errNilBlock diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/BUILD.bazel b/beacon-chain/rpc/prysm/v1alpha1/validator/BUILD.bazel index 1fcce9eb48..c8cb9e9eef 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/BUILD.bazel +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/BUILD.bazel @@ -25,6 +25,7 @@ go_library( "server.go", "status.go", "sync_committee.go", + "unblinder.go", ], importpath = "github.com/prysmaticlabs/prysm/v4/beacon-chain/rpc/prysm/v1alpha1/validator", visibility = ["//beacon-chain:__subpackages__"], @@ -55,13 +56,14 @@ go_library( "//beacon-chain/operations/synccommittee:go_default_library", "//beacon-chain/operations/voluntaryexits:go_default_library", "//beacon-chain/p2p:go_default_library", - "//beacon-chain/startup:go_default_library", + "//beacon-chain/startup:go_default_library", "//beacon-chain/state:go_default_library", "//beacon-chain/state/stategen:go_default_library", "//beacon-chain/sync:go_default_library", "//config/features:go_default_library", "//config/fieldparams:go_default_library", "//config/params:go_default_library", + "//consensus-types:go_default_library", "//consensus-types/blocks:go_default_library", "//consensus-types/interfaces:go_default_library", "//consensus-types/payload-attribute:go_default_library", @@ -96,6 +98,7 @@ go_library( "@io_opencensus_go//trace:go_default_library", "@org_golang_google_grpc//codes:go_default_library", "@org_golang_google_grpc//status:go_default_library", + "@org_golang_google_protobuf//proto:go_default_library", "@org_golang_google_protobuf//types/known/emptypb:go_default_library", "@org_golang_x_sync//errgroup:go_default_library", ], @@ -181,7 +184,6 @@ go_test( "proposer_attestations_test.go", "proposer_bellatrix_test.go", "proposer_builder_test.go", - "proposer_capella_test.go", "proposer_deposits_test.go", "proposer_empty_block_test.go", "proposer_execution_payload_test.go", @@ -194,6 +196,7 @@ go_test( "status_mainnet_test.go", "status_test.go", "sync_committee_test.go", + "unblinder_test.go", "validator_test.go", ], embed = [":go_default_library"], diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer.go b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer.go index 6651fe925b..f3557dceb8 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer.go @@ -309,7 +309,7 @@ func (vs *Server) GetFeeRecipientByPubKey(ctx context.Context, request *ethpb.Fe }, nil } -func (vs *Server) proposeGenericBeaconBlock(ctx context.Context, blk interfaces.ReadOnlySignedBeaconBlock) (*ethpb.ProposeResponse, error) { +func (vs *Server) proposeGenericBeaconBlock(ctx context.Context, blk interfaces.SignedBeaconBlock) (*ethpb.ProposeResponse, error) { ctx, span := trace.StartSpan(ctx, "ProposerServer.proposeGenericBeaconBlock") defer span.End() root, err := blk.Block().HashTreeRoot() @@ -317,16 +317,13 @@ func (vs *Server) proposeGenericBeaconBlock(ctx context.Context, blk interfaces. return nil, fmt.Errorf("could not tree hash block: %v", err) } - if slots.ToEpoch(blk.Block().Slot()) >= params.BeaconConfig().CapellaForkEpoch { - blk, err = vs.unblindBuilderBlockCapella(ctx, blk) - if err != nil { - return nil, err - } - } else { - blk, err = vs.unblindBuilderBlock(ctx, blk) - if err != nil { - return nil, err - } + unblinder, err := newUnblinder(blk, vs.BlockBuilder) + if err != nil { + return nil, errors.Wrap(err, "could not create unblinder") + } + blk, err = unblinder.unblindBuilderBlock(ctx) + if err != nil { + return nil, errors.Wrap(err, "could not unblind builder block") } // Do not block proposal critical path with debug logging or block feed updates. diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_bellatrix.go b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_bellatrix.go index 8614e8553d..7c6f137bc7 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_bellatrix.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_bellatrix.go @@ -15,15 +15,12 @@ import ( "github.com/prysmaticlabs/prysm/v4/beacon-chain/state" fieldparams "github.com/prysmaticlabs/prysm/v4/config/fieldparams" "github.com/prysmaticlabs/prysm/v4/config/params" - consensusblocks "github.com/prysmaticlabs/prysm/v4/consensus-types/blocks" "github.com/prysmaticlabs/prysm/v4/consensus-types/interfaces" "github.com/prysmaticlabs/prysm/v4/consensus-types/primitives" "github.com/prysmaticlabs/prysm/v4/encoding/bytesutil" "github.com/prysmaticlabs/prysm/v4/encoding/ssz" "github.com/prysmaticlabs/prysm/v4/monitoring/tracing" "github.com/prysmaticlabs/prysm/v4/network/forks" - 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" "github.com/prysmaticlabs/prysm/v4/time/slots" "github.com/sirupsen/logrus" @@ -236,129 +233,6 @@ func (vs *Server) getPayloadHeaderFromBuilder(ctx context.Context, slot primitiv return header, nil } -// This function retrieves the full payload block using the input blind block. This input must be versioned as -// bellatrix blind block. The output block will contain the full payload. The original header block -// will be returned the block builder is not configured. -func (vs *Server) unblindBuilderBlock(ctx context.Context, b interfaces.ReadOnlySignedBeaconBlock) (interfaces.ReadOnlySignedBeaconBlock, error) { - if err := consensusblocks.BeaconBlockIsNil(b); err != nil { - return nil, err - } - - // No-op if the input block is not version blind and bellatrix. - if b.Version() != version.Bellatrix || !b.IsBlinded() { - return b, nil - } - // No-op nothing if the builder has not been configured. - if !vs.BlockBuilder.Configured() { - return b, nil - } - - agg, err := b.Block().Body().SyncAggregate() - if err != nil { - return nil, err - } - h, err := b.Block().Body().Execution() - if err != nil { - return nil, err - } - header, ok := h.Proto().(*enginev1.ExecutionPayloadHeader) - if !ok { - return nil, errors.New("execution data must be execution payload header") - } - parentRoot := b.Block().ParentRoot() - stateRoot := b.Block().StateRoot() - randaoReveal := b.Block().Body().RandaoReveal() - graffiti := b.Block().Body().Graffiti() - sig := b.Signature() - psb := ðpb.SignedBlindedBeaconBlockBellatrix{ - Block: ðpb.BlindedBeaconBlockBellatrix{ - Slot: b.Block().Slot(), - ProposerIndex: b.Block().ProposerIndex(), - ParentRoot: parentRoot[:], - StateRoot: stateRoot[:], - Body: ðpb.BlindedBeaconBlockBodyBellatrix{ - RandaoReveal: randaoReveal[:], - Eth1Data: b.Block().Body().Eth1Data(), - Graffiti: graffiti[:], - ProposerSlashings: b.Block().Body().ProposerSlashings(), - AttesterSlashings: b.Block().Body().AttesterSlashings(), - Attestations: b.Block().Body().Attestations(), - Deposits: b.Block().Body().Deposits(), - VoluntaryExits: b.Block().Body().VoluntaryExits(), - SyncAggregate: agg, - ExecutionPayloadHeader: header, - }, - }, - Signature: sig[:], - } - - sb, err := consensusblocks.NewSignedBeaconBlock(psb) - if err != nil { - return nil, errors.Wrap(err, "could not create signed block") - } - payload, err := vs.BlockBuilder.SubmitBlindedBlock(ctx, sb) - if err != nil { - return nil, err - } - headerRoot, err := header.HashTreeRoot() - if err != nil { - return nil, err - } - - payloadRoot, err := payload.HashTreeRoot() - if err != nil { - return nil, err - } - if headerRoot != payloadRoot { - return nil, fmt.Errorf("header and payload root do not match, consider disconnect from relay to avoid further issues, "+ - "%#x != %#x", headerRoot, payloadRoot) - } - - pbPayload, err := payload.PbBellatrix() - if err != nil { - return nil, errors.Wrap(err, "could not get payload") - } - bb := ðpb.SignedBeaconBlockBellatrix{ - Block: ðpb.BeaconBlockBellatrix{ - Slot: psb.Block.Slot, - ProposerIndex: psb.Block.ProposerIndex, - ParentRoot: psb.Block.ParentRoot, - StateRoot: psb.Block.StateRoot, - Body: ðpb.BeaconBlockBodyBellatrix{ - RandaoReveal: psb.Block.Body.RandaoReveal, - Eth1Data: psb.Block.Body.Eth1Data, - Graffiti: psb.Block.Body.Graffiti, - ProposerSlashings: psb.Block.Body.ProposerSlashings, - AttesterSlashings: psb.Block.Body.AttesterSlashings, - Attestations: psb.Block.Body.Attestations, - Deposits: psb.Block.Body.Deposits, - VoluntaryExits: psb.Block.Body.VoluntaryExits, - SyncAggregate: agg, - ExecutionPayload: pbPayload, - }, - }, - Signature: psb.Signature, - } - wb, err := consensusblocks.NewSignedBeaconBlock(bb) - if err != nil { - return nil, err - } - - txs, err := payload.Transactions() - if err != nil { - return nil, errors.Wrap(err, "could not get transactions from payload") - } - log.WithFields(logrus.Fields{ - "blockHash": fmt.Sprintf("%#x", h.BlockHash()), - "feeRecipient": fmt.Sprintf("%#x", h.FeeRecipient()), - "gasUsed": h.GasUsed, - "slot": b.Block().Slot(), - "txs": len(txs), - }).Info("Retrieved full payload from builder") - - return wb, nil -} - // Validates builder signature and returns an error if the signature is invalid. func validateBuilderSignature(signedBid builder.SignedBid) error { d, err := signing.ComputeDomain(params.BeaconConfig().DomainApplicationBuilder, 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 1f01951f86..d40724fea2 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_bellatrix_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_bellatrix_test.go @@ -465,146 +465,6 @@ func TestServer_getPayloadHeader(t *testing.T) { } } -func TestServer_getBuilderBlock(t *testing.T) { - p := emptyPayload() - p.GasLimit = 123 - - tests := []struct { - name string - blk interfaces.ReadOnlySignedBeaconBlock - mock *builderTest.MockBuilderService - err string - returnedBlk interfaces.ReadOnlySignedBeaconBlock - }{ - { - name: "nil block", - blk: nil, - err: "signed beacon block can't be nil", - }, - { - name: "old block version", - blk: func() interfaces.ReadOnlySignedBeaconBlock { - wb, err := blocks.NewSignedBeaconBlock(util.NewBeaconBlock()) - require.NoError(t, err) - return wb - }(), - returnedBlk: func() interfaces.ReadOnlySignedBeaconBlock { - wb, err := blocks.NewSignedBeaconBlock(util.NewBeaconBlock()) - require.NoError(t, err) - return wb - }(), - }, - { - name: "not configured", - blk: func() interfaces.ReadOnlySignedBeaconBlock { - wb, err := blocks.NewSignedBeaconBlock(util.NewBlindedBeaconBlockBellatrix()) - require.NoError(t, err) - return wb - }(), - mock: &builderTest.MockBuilderService{ - HasConfigured: false, - }, - returnedBlk: func() interfaces.ReadOnlySignedBeaconBlock { - wb, err := blocks.NewSignedBeaconBlock(util.NewBlindedBeaconBlockBellatrix()) - require.NoError(t, err) - return wb - }(), - }, - { - name: "submit blind block error", - blk: func() interfaces.ReadOnlySignedBeaconBlock { - b := util.NewBlindedBeaconBlockBellatrix() - b.Block.Slot = 1 - b.Block.ProposerIndex = 2 - wb, err := blocks.NewSignedBeaconBlock(b) - require.NoError(t, err) - return wb - }(), - mock: &builderTest.MockBuilderService{ - Payload: &v1.ExecutionPayload{}, - HasConfigured: true, - ErrSubmitBlindedBlock: errors.New("can't submit"), - }, - err: "can't submit", - }, - { - name: "head and payload root mismatch", - blk: func() interfaces.ReadOnlySignedBeaconBlock { - b := util.NewBlindedBeaconBlockBellatrix() - b.Block.Slot = 1 - b.Block.ProposerIndex = 2 - wb, err := blocks.NewSignedBeaconBlock(b) - require.NoError(t, err) - return wb - }(), - mock: &builderTest.MockBuilderService{ - HasConfigured: true, - Payload: p, - }, - returnedBlk: func() interfaces.ReadOnlySignedBeaconBlock { - b := util.NewBeaconBlockBellatrix() - b.Block.Slot = 1 - b.Block.ProposerIndex = 2 - b.Block.Body.ExecutionPayload = p - wb, err := blocks.NewSignedBeaconBlock(b) - require.NoError(t, err) - return wb - }(), - err: "header and payload root do not match", - }, - { - name: "can get payload", - blk: func() interfaces.ReadOnlySignedBeaconBlock { - b := util.NewBlindedBeaconBlockBellatrix() - b.Block.Slot = 1 - b.Block.ProposerIndex = 2 - txRoot, err := ssz.TransactionsRoot([][]byte{}) - require.NoError(t, err) - b.Block.Body.ExecutionPayloadHeader = &v1.ExecutionPayloadHeader{ - ParentHash: make([]byte, fieldparams.RootLength), - FeeRecipient: make([]byte, fieldparams.FeeRecipientLength), - StateRoot: make([]byte, fieldparams.RootLength), - ReceiptsRoot: make([]byte, fieldparams.RootLength), - LogsBloom: make([]byte, fieldparams.LogsBloomLength), - PrevRandao: make([]byte, fieldparams.RootLength), - BaseFeePerGas: make([]byte, fieldparams.RootLength), - BlockHash: make([]byte, fieldparams.RootLength), - TransactionsRoot: txRoot[:], - GasLimit: 123, - } - wb, err := blocks.NewSignedBeaconBlock(b) - require.NoError(t, err) - return wb - }(), - mock: &builderTest.MockBuilderService{ - HasConfigured: true, - Payload: p, - }, - returnedBlk: func() interfaces.ReadOnlySignedBeaconBlock { - b := util.NewBeaconBlockBellatrix() - b.Block.Slot = 1 - b.Block.ProposerIndex = 2 - b.Block.Body.ExecutionPayload = p - wb, err := blocks.NewSignedBeaconBlock(b) - require.NoError(t, err) - return wb - }(), - }, - } - for _, tc := range tests { - t.Run(tc.name, func(t *testing.T) { - vs := &Server{BlockBuilder: tc.mock} - gotBlk, err := vs.unblindBuilderBlock(context.Background(), tc.blk) - if tc.err != "" { - require.ErrorContains(t, tc.err, err) - } else { - require.NoError(t, err) - require.DeepEqual(t, tc.returnedBlk, gotBlk) - } - }) - } -} - func TestServer_validateBuilderSignature(t *testing.T) { sk, err := bls.RandKey() require.NoError(t, err) diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_capella.go b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_capella.go index cd20aeecf7..8bedc12631 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_capella.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_capella.go @@ -1,17 +1,10 @@ package validator import ( - "context" - "fmt" - - "github.com/pkg/errors" "github.com/prysmaticlabs/prysm/v4/beacon-chain/state" - consensusblocks "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" ethpb "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/v4/runtime/version" - "github.com/sirupsen/logrus" ) // Sets the bls to exec data for a block. @@ -34,130 +27,3 @@ func (vs *Server) setBlsToExecData(blk interfaces.SignedBeaconBlock, headState s } } } - -func (vs *Server) unblindBuilderBlockCapella(ctx context.Context, b interfaces.ReadOnlySignedBeaconBlock) (interfaces.ReadOnlySignedBeaconBlock, error) { - if err := consensusblocks.BeaconBlockIsNil(b); err != nil { - return nil, errors.Wrap(err, "block is nil") - } - - // No-op if the input block is not version blind and capella. - if b.Version() != version.Capella || !b.IsBlinded() { - return b, nil - } - // No-op nothing if the builder has not been configured. - if !vs.BlockBuilder.Configured() { - return b, nil - } - - agg, err := b.Block().Body().SyncAggregate() - if err != nil { - return nil, errors.Wrap(err, "could not get sync aggregate") - } - h, err := b.Block().Body().Execution() - if err != nil { - return nil, errors.Wrap(err, "could not get execution header") - } - header, ok := h.Proto().(*enginev1.ExecutionPayloadHeaderCapella) - if !ok { - return nil, errors.New("execution data must be execution payload header capella") - } - parentRoot := b.Block().ParentRoot() - stateRoot := b.Block().StateRoot() - randaoReveal := b.Block().Body().RandaoReveal() - graffiti := b.Block().Body().Graffiti() - sig := b.Signature() - blsToExecChange, err := b.Block().Body().BLSToExecutionChanges() - if err != nil { - return nil, errors.Wrap(err, "could not get bls to execution changes") - } - sb := ðpb.SignedBlindedBeaconBlockCapella{ - Block: ðpb.BlindedBeaconBlockCapella{ - Slot: b.Block().Slot(), - ProposerIndex: b.Block().ProposerIndex(), - ParentRoot: parentRoot[:], - StateRoot: stateRoot[:], - Body: ðpb.BlindedBeaconBlockBodyCapella{ - RandaoReveal: randaoReveal[:], - Eth1Data: b.Block().Body().Eth1Data(), - Graffiti: graffiti[:], - ProposerSlashings: b.Block().Body().ProposerSlashings(), - AttesterSlashings: b.Block().Body().AttesterSlashings(), - Attestations: b.Block().Body().Attestations(), - Deposits: b.Block().Body().Deposits(), - VoluntaryExits: b.Block().Body().VoluntaryExits(), - SyncAggregate: agg, - ExecutionPayloadHeader: header, - BlsToExecutionChanges: blsToExecChange, - }, - }, - Signature: sig[:], - } - - wrappedSb, err := consensusblocks.NewSignedBeaconBlock(sb) - if err != nil { - return nil, errors.Wrap(err, "could not create signed block") - } - - payload, err := vs.BlockBuilder.SubmitBlindedBlock(ctx, wrappedSb) - if err != nil { - return nil, errors.Wrap(err, "could not submit blinded block") - } - - payloadHtr, err := payload.HashTreeRoot() - if err != nil { - return nil, errors.Wrap(err, "could not get payload hash tree root") - } - headerHtr, err := header.HashTreeRoot() - if err != nil { - return nil, errors.Wrap(err, "could not get header hash tree root") - } - if payloadHtr != headerHtr { - return nil, fmt.Errorf("payload hash tree root %x does not match header hash tree root %x", payloadHtr, headerHtr) - } - - capellaPayload, err := payload.PbCapella() - if err != nil { - return nil, errors.Wrap(err, "could not get payload") - } - - bb := ðpb.SignedBeaconBlockCapella{ - Block: ðpb.BeaconBlockCapella{ - Slot: sb.Block.Slot, - ProposerIndex: sb.Block.ProposerIndex, - ParentRoot: sb.Block.ParentRoot, - StateRoot: sb.Block.StateRoot, - Body: ðpb.BeaconBlockBodyCapella{ - RandaoReveal: sb.Block.Body.RandaoReveal, - Eth1Data: sb.Block.Body.Eth1Data, - Graffiti: sb.Block.Body.Graffiti, - ProposerSlashings: sb.Block.Body.ProposerSlashings, - AttesterSlashings: sb.Block.Body.AttesterSlashings, - Attestations: sb.Block.Body.Attestations, - Deposits: sb.Block.Body.Deposits, - VoluntaryExits: sb.Block.Body.VoluntaryExits, - SyncAggregate: agg, - ExecutionPayload: capellaPayload, - BlsToExecutionChanges: blsToExecChange, - }, - }, - Signature: sb.Signature, - } - wb, err := consensusblocks.NewSignedBeaconBlock(bb) - if err != nil { - return nil, errors.Wrap(err, "could not create signed block") - } - - txs, err := payload.Transactions() - if err != nil { - return nil, errors.Wrap(err, "could not get transactions from payload") - } - log.WithFields(logrus.Fields{ - "blockHash": fmt.Sprintf("%#x", h.BlockHash()), - "feeRecipient": fmt.Sprintf("%#x", h.FeeRecipient()), - "gasUsed": h.GasUsed, - "slot": b.Block().Slot(), - "txs": len(txs), - }).Info("Retrieved full capella payload from builder") - - return wb, nil -} diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_capella_test.go b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_capella_test.go deleted file mode 100644 index d70b167b5f..0000000000 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_capella_test.go +++ /dev/null @@ -1,147 +0,0 @@ -package validator - -import ( - "context" - "testing" - - "github.com/pkg/errors" - builderTest "github.com/prysmaticlabs/prysm/v4/beacon-chain/builder/testing" - fieldparams "github.com/prysmaticlabs/prysm/v4/config/fieldparams" - "github.com/prysmaticlabs/prysm/v4/consensus-types/blocks" - "github.com/prysmaticlabs/prysm/v4/consensus-types/interfaces" - "github.com/prysmaticlabs/prysm/v4/encoding/ssz" - v1 "github.com/prysmaticlabs/prysm/v4/proto/engine/v1" - eth "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1" - "github.com/prysmaticlabs/prysm/v4/testing/require" - "github.com/prysmaticlabs/prysm/v4/testing/util" -) - -func TestServer_unblindBuilderCapellaBlock(t *testing.T) { - p := emptyPayloadCapella() - p.GasLimit = 123 - - tests := []struct { - name string - blk interfaces.ReadOnlySignedBeaconBlock - mock *builderTest.MockBuilderService - err string - returnedBlk interfaces.ReadOnlySignedBeaconBlock - }{ - { - name: "nil block", - blk: nil, - err: "signed beacon block can't be nil", - }, - { - name: "old block version", - blk: func() interfaces.ReadOnlySignedBeaconBlock { - wb, err := blocks.NewSignedBeaconBlock(util.NewBeaconBlock()) - require.NoError(t, err) - return wb - }(), - returnedBlk: func() interfaces.ReadOnlySignedBeaconBlock { - wb, err := blocks.NewSignedBeaconBlock(util.NewBeaconBlock()) - require.NoError(t, err) - return wb - }(), - }, - { - name: "not configured", - blk: func() interfaces.ReadOnlySignedBeaconBlock { - wb, err := blocks.NewSignedBeaconBlock(util.NewBlindedBeaconBlockBellatrix()) - require.NoError(t, err) - return wb - }(), - mock: &builderTest.MockBuilderService{ - HasConfigured: false, - }, - returnedBlk: func() interfaces.ReadOnlySignedBeaconBlock { - wb, err := blocks.NewSignedBeaconBlock(util.NewBlindedBeaconBlockBellatrix()) - require.NoError(t, err) - return wb - }(), - }, - { - name: "submit blind block error", - blk: func() interfaces.ReadOnlySignedBeaconBlock { - b := util.NewBlindedBeaconBlockCapella() - b.Block.Slot = 1 - b.Block.ProposerIndex = 2 - wb, err := blocks.NewSignedBeaconBlock(b) - require.NoError(t, err) - return wb - }(), - mock: &builderTest.MockBuilderService{ - PayloadCapella: &v1.ExecutionPayloadCapella{}, - HasConfigured: true, - ErrSubmitBlindedBlock: errors.New("can't submit"), - }, - err: "can't submit", - }, - { - name: "can get payload", - blk: func() interfaces.ReadOnlySignedBeaconBlock { - b := util.NewBlindedBeaconBlockCapella() - b.Block.Slot = 1 - b.Block.ProposerIndex = 2 - txRoot, err := ssz.TransactionsRoot(make([][]byte, 0)) - require.NoError(t, err) - wdRoot, err := ssz.WithdrawalSliceRoot([]*v1.Withdrawal{}, fieldparams.MaxWithdrawalsPerPayload) - require.NoError(t, err) - b.Block.Body.ExecutionPayloadHeader = &v1.ExecutionPayloadHeaderCapella{ - ParentHash: make([]byte, fieldparams.RootLength), - FeeRecipient: make([]byte, fieldparams.FeeRecipientLength), - StateRoot: make([]byte, fieldparams.RootLength), - ReceiptsRoot: make([]byte, fieldparams.RootLength), - LogsBloom: make([]byte, fieldparams.LogsBloomLength), - PrevRandao: make([]byte, fieldparams.RootLength), - BaseFeePerGas: make([]byte, fieldparams.RootLength), - BlockHash: make([]byte, fieldparams.RootLength), - TransactionsRoot: txRoot[:], - GasLimit: 123, - WithdrawalsRoot: wdRoot[:], - } - b.Block.Body.BlsToExecutionChanges = []*eth.SignedBLSToExecutionChange{ - {Message: ð.BLSToExecutionChange{ValidatorIndex: 1, FromBlsPubkey: []byte{'a'}}}, - {Message: ð.BLSToExecutionChange{ValidatorIndex: 2, FromBlsPubkey: []byte{'b'}}}, - {Message: ð.BLSToExecutionChange{ValidatorIndex: 3, FromBlsPubkey: []byte{'c'}}}, - {Message: ð.BLSToExecutionChange{ValidatorIndex: 4, FromBlsPubkey: []byte{'d'}}}, - } - wb, err := blocks.NewSignedBeaconBlock(b) - require.NoError(t, err) - return wb - }(), - mock: &builderTest.MockBuilderService{ - HasConfigured: true, - PayloadCapella: p, - }, - returnedBlk: func() interfaces.ReadOnlySignedBeaconBlock { - b := util.NewBeaconBlockCapella() - b.Block.Slot = 1 - b.Block.ProposerIndex = 2 - b.Block.Body.ExecutionPayload = p - b.Block.Body.BlsToExecutionChanges = []*eth.SignedBLSToExecutionChange{ - {Message: ð.BLSToExecutionChange{ValidatorIndex: 1, FromBlsPubkey: []byte{'a'}}}, - {Message: ð.BLSToExecutionChange{ValidatorIndex: 2, FromBlsPubkey: []byte{'b'}}}, - {Message: ð.BLSToExecutionChange{ValidatorIndex: 3, FromBlsPubkey: []byte{'c'}}}, - {Message: ð.BLSToExecutionChange{ValidatorIndex: 4, FromBlsPubkey: []byte{'d'}}}, - } - wb, err := blocks.NewSignedBeaconBlock(b) - require.NoError(t, err) - return wb - }(), - }, - } - for _, tc := range tests { - t.Run(tc.name, func(t *testing.T) { - vs := &Server{BlockBuilder: tc.mock} - gotBlk, err := vs.unblindBuilderBlockCapella(context.Background(), tc.blk) - if tc.err != "" { - require.ErrorContains(t, tc.err, err) - } else { - require.NoError(t, err) - require.DeepEqual(t, tc.returnedBlk, gotBlk) - } - }) - } -} diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_test.go b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_test.go index eb5bbc7ad2..803978c3b4 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_test.go @@ -42,6 +42,7 @@ import ( "github.com/prysmaticlabs/prysm/v4/container/trie" "github.com/prysmaticlabs/prysm/v4/crypto/bls" "github.com/prysmaticlabs/prysm/v4/encoding/bytesutil" + "github.com/prysmaticlabs/prysm/v4/encoding/ssz" enginev1 "github.com/prysmaticlabs/prysm/v4/proto/engine/v1" ethpb "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1/attestation" @@ -547,6 +548,12 @@ func TestProposer_ProposeBlock_OK(t *testing.T) { blockToPropose := util.NewBlindedBeaconBlockCapella() blockToPropose.Block.Slot = 5 blockToPropose.Block.ParentRoot = parent[:] + txRoot, err := ssz.TransactionsRoot([][]byte{}) + require.NoError(t, err) + withdrawalsRoot, err := ssz.WithdrawalSliceRoot([]*enginev1.Withdrawal{}, fieldparams.MaxWithdrawalsPerPayload) + require.NoError(t, err) + blockToPropose.Block.Body.ExecutionPayloadHeader.TransactionsRoot = txRoot[:] + blockToPropose.Block.Body.ExecutionPayloadHeader.WithdrawalsRoot = withdrawalsRoot[:] blk := ðpb.GenericSignedBeaconBlock_BlindedCapella{BlindedCapella: blockToPropose} return ðpb.GenericSignedBeaconBlock{Block: blk} }, @@ -555,30 +562,19 @@ func TestProposer_ProposeBlock_OK(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - db := dbutil.SetupDB(t) ctx := context.Background() - genesis := util.NewBeaconBlock() - util.SaveBlock(t, ctx, db, genesis) - numDeposits := uint64(64) beaconState, _ := util.DeterministicGenesisState(t, numDeposits) bsRoot, err := beaconState.HashTreeRoot(ctx) require.NoError(t, err) - genesisRoot, err := genesis.Block.HashTreeRoot() - require.NoError(t, err) - require.NoError(t, db.SaveState(ctx, beaconState, genesisRoot), "Could not save genesis state") c := &mock.ChainService{Root: bsRoot[:], State: beaconState} proposerServer := &Server{ - ChainStartFetcher: &mockExecution.Chain{}, - Eth1InfoFetcher: &mockExecution.Chain{}, - Eth1BlockFetcher: &mockExecution.Chain{}, - BlockReceiver: c, - HeadFetcher: c, - BlockNotifier: c.BlockNotifier(), - P2P: mockp2p.NewTestP2P(t), - BlockBuilder: &builderTest.MockBuilderService{HasConfigured: true, PayloadCapella: emptyPayloadCapella()}, + BlockReceiver: c, + BlockNotifier: c.BlockNotifier(), + P2P: mockp2p.NewTestP2P(t), + BlockBuilder: &builderTest.MockBuilderService{HasConfigured: true, PayloadCapella: emptyPayloadCapella()}, } blockToPropose := tt.block(bsRoot) res, err := proposerServer.ProposeBeaconBlock(context.Background(), blockToPropose) diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/unblinder.go b/beacon-chain/rpc/prysm/v1alpha1/validator/unblinder.go new file mode 100644 index 0000000000..fa1a356d02 --- /dev/null +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/unblinder.go @@ -0,0 +1,184 @@ +package validator + +import ( + "context" + "fmt" + + "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/v4/beacon-chain/builder" + consensus_types "github.com/prysmaticlabs/prysm/v4/consensus-types" + consensusblocks "github.com/prysmaticlabs/prysm/v4/consensus-types/blocks" + "github.com/prysmaticlabs/prysm/v4/consensus-types/interfaces" + ethpb "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/v4/runtime/version" + "github.com/sirupsen/logrus" + "google.golang.org/protobuf/proto" +) + +type unblinder struct { + b interfaces.SignedBeaconBlock + builder builder.BlockBuilder +} + +func newUnblinder(b interfaces.SignedBeaconBlock, builder builder.BlockBuilder) (*unblinder, error) { + if err := consensusblocks.BeaconBlockIsNil(b); err != nil { + return nil, err + } + if builder == nil { + return nil, errors.New("nil builder provided") + } + return &unblinder{ + b: b, + builder: builder, + }, nil +} + +func (u *unblinder) unblindBuilderBlock(ctx context.Context) (interfaces.SignedBeaconBlock, error) { + if !u.b.IsBlinded() || u.b.Version() < version.Bellatrix { + return u.b, nil + } + if u.b.IsBlinded() && !u.builder.Configured() { + return nil, errors.New("builder not configured") + } + + psb, err := u.blindedProtoBlock() + if err != nil { + return nil, errors.Wrap(err, "could not get blinded proto block") + } + sb, err := consensusblocks.NewSignedBeaconBlock(psb) + if err != nil { + return nil, errors.Wrap(err, "could not create signed block") + } + if err = copyBlockData(u.b, sb); err != nil { + return nil, errors.Wrap(err, "could not copy block data") + } + h, err := u.b.Block().Body().Execution() + if err != nil { + return nil, errors.Wrap(err, "could not get execution") + } + if err = sb.SetExecution(h); err != nil { + return nil, errors.Wrap(err, "could not set execution") + } + + payload, err := u.builder.SubmitBlindedBlock(ctx, sb) + if err != nil { + return nil, errors.Wrap(err, "could not submit blinded block") + } + headerRoot, err := h.HashTreeRoot() + if err != nil { + return nil, errors.Wrap(err, "could not get header root") + } + payloadRoot, err := payload.HashTreeRoot() + if err != nil { + return nil, errors.Wrap(err, "could not get payload root") + } + if headerRoot != payloadRoot { + return nil, fmt.Errorf("header and payload root do not match, consider disconnect from relay to avoid further issues, "+ + "%#x != %#x", headerRoot, payloadRoot) + } + + bb, err := u.protoBlock() + if err != nil { + return nil, errors.Wrap(err, "could not get proto block") + } + wb, err := consensusblocks.NewSignedBeaconBlock(bb) + if err != nil { + return nil, errors.Wrap(err, "could not create signed block") + } + if err = copyBlockData(sb, wb); err != nil { + return nil, errors.Wrap(err, "could not copy block data") + } + if err = wb.SetExecution(payload); err != nil { + return nil, errors.Wrap(err, "could not set execution") + } + + txs, err := payload.Transactions() + if err != nil { + return nil, errors.Wrap(err, "could not get transactions from payload") + } + log.WithFields(logrus.Fields{ + "blockHash": fmt.Sprintf("%#x", h.BlockHash()), + "feeRecipient": fmt.Sprintf("%#x", h.FeeRecipient()), + "gasUsed": h.GasUsed(), + "slot": u.b.Block().Slot(), + "txs": len(txs), + }).Info("Retrieved full payload from builder") + + return wb, nil +} + +func copyBlockData(src interfaces.SignedBeaconBlock, dst interfaces.SignedBeaconBlock) error { + agg, err := src.Block().Body().SyncAggregate() + if err != nil { + return errors.Wrap(err, "could not get sync aggregate") + } + parentRoot := src.Block().ParentRoot() + stateRoot := src.Block().StateRoot() + randaoReveal := src.Block().Body().RandaoReveal() + graffiti := src.Block().Body().Graffiti() + sig := src.Signature() + blsToExecChanges, err := src.Block().Body().BLSToExecutionChanges() + if err != nil && !errors.Is(err, consensus_types.ErrUnsupportedField) { + return errors.Wrap(err, "could not get bls to execution changes") + } + + dst.SetSlot(src.Block().Slot()) + dst.SetProposerIndex(src.Block().ProposerIndex()) + dst.SetParentRoot(parentRoot[:]) + dst.SetStateRoot(stateRoot[:]) + dst.SetRandaoReveal(randaoReveal[:]) + dst.SetEth1Data(src.Block().Body().Eth1Data()) + dst.SetGraffiti(graffiti[:]) + dst.SetProposerSlashings(src.Block().Body().ProposerSlashings()) + dst.SetAttesterSlashings(src.Block().Body().AttesterSlashings()) + dst.SetAttestations(src.Block().Body().Attestations()) + dst.SetDeposits(src.Block().Body().Deposits()) + dst.SetVoluntaryExits(src.Block().Body().VoluntaryExits()) + if err = dst.SetSyncAggregate(agg); err != nil { + return errors.Wrap(err, "could not set sync aggregate") + } + dst.SetSignature(sig[:]) + if err = dst.SetBLSToExecutionChanges(blsToExecChanges); err != nil && !errors.Is(err, consensus_types.ErrUnsupportedField) { + return errors.Wrap(err, "could not set bls to execution changes") + } + + return nil +} + +func (u *unblinder) blindedProtoBlock() (proto.Message, error) { + switch u.b.Version() { + case version.Bellatrix: + return ðpb.SignedBlindedBeaconBlockBellatrix{ + Block: ðpb.BlindedBeaconBlockBellatrix{ + Body: ðpb.BlindedBeaconBlockBodyBellatrix{}, + }, + }, nil + case version.Capella: + return ðpb.SignedBlindedBeaconBlockCapella{ + Block: ðpb.BlindedBeaconBlockCapella{ + Body: ðpb.BlindedBeaconBlockBodyCapella{}, + }, + }, nil + default: + return nil, fmt.Errorf("invalid version %s", version.String(u.b.Version())) + } +} + +func (u *unblinder) protoBlock() (proto.Message, error) { + switch u.b.Version() { + case version.Bellatrix: + return ðpb.SignedBeaconBlockBellatrix{ + Block: ðpb.BeaconBlockBellatrix{ + Body: ðpb.BeaconBlockBodyBellatrix{}, + }, + }, nil + case version.Capella: + return ðpb.SignedBeaconBlockCapella{ + Block: ðpb.BeaconBlockCapella{ + Body: ðpb.BeaconBlockBodyCapella{}, + }, + }, nil + default: + return nil, fmt.Errorf("invalid version %s", version.String(u.b.Version())) + } +} diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/unblinder_test.go b/beacon-chain/rpc/prysm/v1alpha1/validator/unblinder_test.go new file mode 100644 index 0000000000..2a34a1ba3b --- /dev/null +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/unblinder_test.go @@ -0,0 +1,264 @@ +package validator + +import ( + "context" + "testing" + + "github.com/pkg/errors" + builderTest "github.com/prysmaticlabs/prysm/v4/beacon-chain/builder/testing" + fieldparams "github.com/prysmaticlabs/prysm/v4/config/fieldparams" + "github.com/prysmaticlabs/prysm/v4/consensus-types/blocks" + "github.com/prysmaticlabs/prysm/v4/consensus-types/interfaces" + "github.com/prysmaticlabs/prysm/v4/encoding/ssz" + v1 "github.com/prysmaticlabs/prysm/v4/proto/engine/v1" + eth "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/v4/testing/require" + "github.com/prysmaticlabs/prysm/v4/testing/util" +) + +func Test_unblindBuilderBlock(t *testing.T) { + p := emptyPayload() + p.GasLimit = 123 + pCapella := emptyPayloadCapella() + pCapella.GasLimit = 123 + + tests := []struct { + name string + blk interfaces.SignedBeaconBlock + mock *builderTest.MockBuilderService + err string + returnedBlk interfaces.SignedBeaconBlock + }{ + { + name: "old block version", + blk: func() interfaces.SignedBeaconBlock { + wb, err := blocks.NewSignedBeaconBlock(util.NewBeaconBlock()) + require.NoError(t, err) + return wb + }(), + returnedBlk: func() interfaces.SignedBeaconBlock { + wb, err := blocks.NewSignedBeaconBlock(util.NewBeaconBlock()) + require.NoError(t, err) + return wb + }(), + }, + { + name: "blinded without configured builder", + blk: func() interfaces.SignedBeaconBlock { + wb, err := blocks.NewSignedBeaconBlock(util.NewBlindedBeaconBlockBellatrix()) + require.NoError(t, err) + return wb + }(), + mock: &builderTest.MockBuilderService{ + HasConfigured: false, + }, + err: "builder not configured", + }, + { + name: "non-blinded without configured builder", + blk: func() interfaces.SignedBeaconBlock { + b := util.NewBeaconBlockBellatrix() + b.Block.Slot = 1 + b.Block.ProposerIndex = 2 + b.Block.Body.ExecutionPayload = &v1.ExecutionPayload{ + ParentHash: make([]byte, fieldparams.RootLength), + FeeRecipient: make([]byte, fieldparams.FeeRecipientLength), + StateRoot: make([]byte, fieldparams.RootLength), + ReceiptsRoot: make([]byte, fieldparams.RootLength), + LogsBloom: make([]byte, fieldparams.LogsBloomLength), + PrevRandao: make([]byte, fieldparams.RootLength), + BaseFeePerGas: make([]byte, fieldparams.RootLength), + BlockHash: make([]byte, fieldparams.RootLength), + Transactions: make([][]byte, 0), + GasLimit: 123, + } + wb, err := blocks.NewSignedBeaconBlock(b) + require.NoError(t, err) + return wb + }(), + mock: &builderTest.MockBuilderService{ + HasConfigured: false, + Payload: p, + }, + returnedBlk: func() interfaces.SignedBeaconBlock { + b := util.NewBeaconBlockBellatrix() + b.Block.Slot = 1 + b.Block.ProposerIndex = 2 + b.Block.Body.ExecutionPayload = p + wb, err := blocks.NewSignedBeaconBlock(b) + require.NoError(t, err) + return wb + }(), + }, + { + name: "submit blind block error", + blk: func() interfaces.SignedBeaconBlock { + b := util.NewBlindedBeaconBlockBellatrix() + b.Block.Slot = 1 + b.Block.ProposerIndex = 2 + wb, err := blocks.NewSignedBeaconBlock(b) + require.NoError(t, err) + return wb + }(), + mock: &builderTest.MockBuilderService{ + Payload: &v1.ExecutionPayload{}, + HasConfigured: true, + ErrSubmitBlindedBlock: errors.New("can't submit"), + }, + err: "can't submit", + }, + { + name: "head and payload root mismatch", + blk: func() interfaces.SignedBeaconBlock { + b := util.NewBlindedBeaconBlockBellatrix() + b.Block.Slot = 1 + b.Block.ProposerIndex = 2 + wb, err := blocks.NewSignedBeaconBlock(b) + require.NoError(t, err) + return wb + }(), + mock: &builderTest.MockBuilderService{ + HasConfigured: true, + Payload: p, + }, + returnedBlk: func() interfaces.SignedBeaconBlock { + b := util.NewBeaconBlockBellatrix() + b.Block.Slot = 1 + b.Block.ProposerIndex = 2 + b.Block.Body.ExecutionPayload = p + wb, err := blocks.NewSignedBeaconBlock(b) + require.NoError(t, err) + return wb + }(), + err: "header and payload root do not match", + }, + { + name: "can get payload Bellatrix", + blk: func() interfaces.SignedBeaconBlock { + b := util.NewBlindedBeaconBlockBellatrix() + b.Block.Slot = 1 + b.Block.ProposerIndex = 2 + txRoot, err := ssz.TransactionsRoot([][]byte{}) + require.NoError(t, err) + b.Block.Body.ExecutionPayloadHeader = &v1.ExecutionPayloadHeader{ + ParentHash: make([]byte, fieldparams.RootLength), + FeeRecipient: make([]byte, fieldparams.FeeRecipientLength), + StateRoot: make([]byte, fieldparams.RootLength), + ReceiptsRoot: make([]byte, fieldparams.RootLength), + LogsBloom: make([]byte, fieldparams.LogsBloomLength), + PrevRandao: make([]byte, fieldparams.RootLength), + BaseFeePerGas: make([]byte, fieldparams.RootLength), + BlockHash: make([]byte, fieldparams.RootLength), + TransactionsRoot: txRoot[:], + GasLimit: 123, + } + wb, err := blocks.NewSignedBeaconBlock(b) + require.NoError(t, err) + return wb + }(), + mock: &builderTest.MockBuilderService{ + HasConfigured: true, + Payload: p, + }, + returnedBlk: func() interfaces.SignedBeaconBlock { + b := util.NewBeaconBlockBellatrix() + b.Block.Slot = 1 + b.Block.ProposerIndex = 2 + b.Block.Body.ExecutionPayload = p + wb, err := blocks.NewSignedBeaconBlock(b) + require.NoError(t, err) + return wb + }(), + }, + { + name: "can get payload Capella", + blk: func() interfaces.SignedBeaconBlock { + b := util.NewBlindedBeaconBlockCapella() + b.Block.Slot = 1 + b.Block.ProposerIndex = 2 + b.Block.Body.BlsToExecutionChanges = []*eth.SignedBLSToExecutionChange{ + { + Message: ð.BLSToExecutionChange{ + ValidatorIndex: 123, + FromBlsPubkey: []byte{'a'}, + ToExecutionAddress: []byte{'a'}, + }, + Signature: []byte("sig123"), + }, + { + Message: ð.BLSToExecutionChange{ + ValidatorIndex: 456, + FromBlsPubkey: []byte{'b'}, + ToExecutionAddress: []byte{'b'}, + }, + Signature: []byte("sig456"), + }, + } + txRoot, err := ssz.TransactionsRoot([][]byte{}) + require.NoError(t, err) + withdrawalsRoot, err := ssz.WithdrawalSliceRoot([]*v1.Withdrawal{}, fieldparams.MaxWithdrawalsPerPayload) + require.NoError(t, err) + b.Block.Body.ExecutionPayloadHeader = &v1.ExecutionPayloadHeaderCapella{ + ParentHash: make([]byte, fieldparams.RootLength), + FeeRecipient: make([]byte, fieldparams.FeeRecipientLength), + StateRoot: make([]byte, fieldparams.RootLength), + ReceiptsRoot: make([]byte, fieldparams.RootLength), + LogsBloom: make([]byte, fieldparams.LogsBloomLength), + PrevRandao: make([]byte, fieldparams.RootLength), + BaseFeePerGas: make([]byte, fieldparams.RootLength), + BlockHash: make([]byte, fieldparams.RootLength), + TransactionsRoot: txRoot[:], + WithdrawalsRoot: withdrawalsRoot[:], + GasLimit: 123, + } + wb, err := blocks.NewSignedBeaconBlock(b) + require.NoError(t, err) + return wb + }(), + mock: &builderTest.MockBuilderService{ + HasConfigured: true, + PayloadCapella: pCapella, + }, + returnedBlk: func() interfaces.SignedBeaconBlock { + b := util.NewBeaconBlockCapella() + b.Block.Slot = 1 + b.Block.ProposerIndex = 2 + b.Block.Body.BlsToExecutionChanges = []*eth.SignedBLSToExecutionChange{ + { + Message: ð.BLSToExecutionChange{ + ValidatorIndex: 123, + FromBlsPubkey: []byte{'a'}, + ToExecutionAddress: []byte{'a'}, + }, + Signature: []byte("sig123"), + }, + { + Message: ð.BLSToExecutionChange{ + ValidatorIndex: 456, + FromBlsPubkey: []byte{'b'}, + ToExecutionAddress: []byte{'b'}, + }, + Signature: []byte("sig456"), + }, + } + b.Block.Body.ExecutionPayload = pCapella + wb, err := blocks.NewSignedBeaconBlock(b) + require.NoError(t, err) + return wb + }(), + }, + } + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + unblinder, err := newUnblinder(tc.blk, tc.mock) + require.NoError(t, err) + gotBlk, err := unblinder.unblindBuilderBlock(context.Background()) + if tc.err != "" { + require.ErrorContains(t, tc.err, err) + } else { + require.NoError(t, err) + require.DeepEqual(t, tc.returnedBlk, gotBlk) + } + }) + } +} diff --git a/cmd/prysmctl/p2p/request_blocks.go b/cmd/prysmctl/p2p/request_blocks.go index 92fd4d8bed..1bf0f0d322 100644 --- a/cmd/prysmctl/p2p/request_blocks.go +++ b/cmd/prysmctl/p2p/request_blocks.go @@ -190,7 +190,7 @@ func cliActionRequestBlocks(cliCtx *cli.Context) error { for _, blk := range blocks { exec, err := blk.Block().Body().Execution() switch { - case errors.Is(err, consensus_types.ErrUnsupportedGetter): + case errors.Is(err, consensus_types.ErrUnsupportedField): continue case err != nil: log.WithError(err).Error("Could not read execution data from block body") @@ -199,7 +199,7 @@ func cliActionRequestBlocks(cliCtx *cli.Context) error { } _, err = exec.Transactions() switch { - case errors.Is(err, consensus_types.ErrUnsupportedGetter): + case errors.Is(err, consensus_types.ErrUnsupportedField): continue case err != nil: log.WithError(err).Error("Could not read transactions block execution payload") diff --git a/consensus-types/blocks/execution.go b/consensus-types/blocks/execution.go index 6e4a2ad80d..a4b4011bb6 100644 --- a/consensus-types/blocks/execution.go +++ b/consensus-types/blocks/execution.go @@ -36,7 +36,7 @@ func (e executionPayload) IsNil() bool { } // IsBlinded returns true if the underlying data is blinded. -func (e executionPayload) IsBlinded() bool { +func (executionPayload) IsBlinded() bool { return false } @@ -146,18 +146,18 @@ func (e executionPayload) Transactions() ([][]byte, error) { } // TransactionsRoot -- -func (e executionPayload) TransactionsRoot() ([]byte, error) { - return nil, consensus_types.ErrUnsupportedGetter +func (executionPayload) TransactionsRoot() ([]byte, error) { + return nil, consensus_types.ErrUnsupportedField } // Withdrawals -- -func (e executionPayload) Withdrawals() ([]*enginev1.Withdrawal, error) { - return nil, consensus_types.ErrUnsupportedGetter +func (executionPayload) Withdrawals() ([]*enginev1.Withdrawal, error) { + return nil, consensus_types.ErrUnsupportedField } // WithdrawalsRoot -- -func (e executionPayload) WithdrawalsRoot() ([]byte, error) { - return nil, consensus_types.ErrUnsupportedGetter +func (executionPayload) WithdrawalsRoot() ([]byte, error) { + return nil, consensus_types.ErrUnsupportedField } // PbBellatrix -- @@ -167,12 +167,12 @@ func (e executionPayload) PbBellatrix() (*enginev1.ExecutionPayload, error) { // PbCapella -- func (executionPayload) PbCapella() (*enginev1.ExecutionPayloadCapella, error) { - return nil, consensus_types.ErrUnsupportedGetter + return nil, consensus_types.ErrUnsupportedField } // ValueInGwei -- func (executionPayload) ValueInGwei() (uint64, error) { - return 0, consensus_types.ErrUnsupportedGetter + return 0, consensus_types.ErrUnsupportedField } // executionPayloadHeader is a convenience wrapper around a blinded beacon block body's execution header data structure @@ -197,7 +197,7 @@ func (e executionPayloadHeader) IsNil() bool { } // IsBlinded returns true if the underlying data is a header. -func (e executionPayloadHeader) IsBlinded() bool { +func (executionPayloadHeader) IsBlinded() bool { return true } @@ -303,7 +303,7 @@ func (e executionPayloadHeader) BlockHash() []byte { // Transactions -- func (executionPayloadHeader) Transactions() ([][]byte, error) { - return nil, consensus_types.ErrUnsupportedGetter + return nil, consensus_types.ErrUnsupportedField } // TransactionsRoot -- @@ -312,28 +312,28 @@ func (e executionPayloadHeader) TransactionsRoot() ([]byte, error) { } // Withdrawals -- -func (e executionPayloadHeader) Withdrawals() ([]*enginev1.Withdrawal, error) { - return nil, consensus_types.ErrUnsupportedGetter +func (executionPayloadHeader) Withdrawals() ([]*enginev1.Withdrawal, error) { + return nil, consensus_types.ErrUnsupportedField } // WithdrawalsRoot -- -func (e executionPayloadHeader) WithdrawalsRoot() ([]byte, error) { - return nil, consensus_types.ErrUnsupportedGetter +func (executionPayloadHeader) WithdrawalsRoot() ([]byte, error) { + return nil, consensus_types.ErrUnsupportedField } // PbCapella -- func (executionPayloadHeader) PbCapella() (*enginev1.ExecutionPayloadCapella, error) { - return nil, consensus_types.ErrUnsupportedGetter + return nil, consensus_types.ErrUnsupportedField } // PbBellatrix -- func (executionPayloadHeader) PbBellatrix() (*enginev1.ExecutionPayload, error) { - return nil, consensus_types.ErrUnsupportedGetter + return nil, consensus_types.ErrUnsupportedField } // ValueInGwei -- func (executionPayloadHeader) ValueInGwei() (uint64, error) { - return 0, consensus_types.ErrUnsupportedGetter + return 0, consensus_types.ErrUnsupportedField } // PayloadToHeader converts `payload` into execution payload header format. @@ -387,7 +387,7 @@ func (e executionPayloadCapella) IsNil() bool { } // IsBlinded returns true if the underlying data is blinded. -func (e executionPayloadCapella) IsBlinded() bool { +func (executionPayloadCapella) IsBlinded() bool { return false } @@ -497,8 +497,8 @@ func (e executionPayloadCapella) Transactions() ([][]byte, error) { } // TransactionsRoot -- -func (e executionPayloadCapella) TransactionsRoot() ([]byte, error) { - return nil, consensus_types.ErrUnsupportedGetter +func (executionPayloadCapella) TransactionsRoot() ([]byte, error) { + return nil, consensus_types.ErrUnsupportedField } // Withdrawals -- @@ -507,8 +507,8 @@ func (e executionPayloadCapella) Withdrawals() ([]*enginev1.Withdrawal, error) { } // WithdrawalsRoot -- -func (e executionPayloadCapella) WithdrawalsRoot() ([]byte, error) { - return nil, consensus_types.ErrUnsupportedGetter +func (executionPayloadCapella) WithdrawalsRoot() ([]byte, error) { + return nil, consensus_types.ErrUnsupportedField } // PbCapella -- @@ -518,7 +518,7 @@ func (e executionPayloadCapella) PbCapella() (*enginev1.ExecutionPayloadCapella, // PbBellatrix -- func (executionPayloadCapella) PbBellatrix() (*enginev1.ExecutionPayload, error) { - return nil, consensus_types.ErrUnsupportedGetter + return nil, consensus_types.ErrUnsupportedField } // ValueInGwei -- @@ -549,7 +549,7 @@ func (e executionPayloadHeaderCapella) IsNil() bool { } // IsBlinded returns true if the underlying data is blinded. -func (e executionPayloadHeaderCapella) IsBlinded() bool { +func (executionPayloadHeaderCapella) IsBlinded() bool { return true } @@ -655,7 +655,7 @@ func (e executionPayloadHeaderCapella) BlockHash() []byte { // Transactions -- func (executionPayloadHeaderCapella) Transactions() ([][]byte, error) { - return nil, consensus_types.ErrUnsupportedGetter + return nil, consensus_types.ErrUnsupportedField } // TransactionsRoot -- @@ -664,8 +664,8 @@ func (e executionPayloadHeaderCapella) TransactionsRoot() ([]byte, error) { } // Withdrawals -- -func (e executionPayloadHeaderCapella) Withdrawals() ([]*enginev1.Withdrawal, error) { - return nil, consensus_types.ErrUnsupportedGetter +func (executionPayloadHeaderCapella) Withdrawals() ([]*enginev1.Withdrawal, error) { + return nil, consensus_types.ErrUnsupportedField } // WithdrawalsRoot -- @@ -675,12 +675,12 @@ func (e executionPayloadHeaderCapella) WithdrawalsRoot() ([]byte, error) { // PbCapella -- func (executionPayloadHeaderCapella) PbCapella() (*enginev1.ExecutionPayloadCapella, error) { - return nil, consensus_types.ErrUnsupportedGetter + return nil, consensus_types.ErrUnsupportedField } // PbBellatrix -- func (executionPayloadHeaderCapella) PbBellatrix() (*enginev1.ExecutionPayload, error) { - return nil, consensus_types.ErrUnsupportedGetter + return nil, consensus_types.ErrUnsupportedField } // ValueInGwei -- @@ -756,7 +756,7 @@ func IsEmptyExecutionData(data interfaces.ExecutionData) (bool, error) { txs, err := data.Transactions() switch { - case errors.Is(err, consensus_types.ErrUnsupportedGetter): + case errors.Is(err, consensus_types.ErrUnsupportedField): case err != nil: return false, err default: diff --git a/consensus-types/blocks/execution_test.go b/consensus-types/blocks/execution_test.go index 68b32d0abd..61b90743d7 100644 --- a/consensus-types/blocks/execution_test.go +++ b/consensus-types/blocks/execution_test.go @@ -211,16 +211,16 @@ func Test_executionPayload_Pb(t *testing.T) { assert.DeepEqual(t, payload.Proto(), pb) _, err = payload.PbCapella() - require.ErrorIs(t, err, consensus_types.ErrUnsupportedGetter) + require.ErrorIs(t, err, consensus_types.ErrUnsupportedField) } func Test_executionPayloadHeader_Pb(t *testing.T) { payload := createWrappedPayloadHeader(t) _, err := payload.PbBellatrix() - require.ErrorIs(t, err, consensus_types.ErrUnsupportedGetter) + require.ErrorIs(t, err, consensus_types.ErrUnsupportedField) _, err = payload.PbCapella() - require.ErrorIs(t, err, consensus_types.ErrUnsupportedGetter) + require.ErrorIs(t, err, consensus_types.ErrUnsupportedField) } func Test_executionPayloadCapella_Pb(t *testing.T) { @@ -230,16 +230,16 @@ func Test_executionPayloadCapella_Pb(t *testing.T) { assert.DeepEqual(t, payload.Proto(), pb) _, err = payload.PbBellatrix() - require.ErrorIs(t, err, consensus_types.ErrUnsupportedGetter) + require.ErrorIs(t, err, consensus_types.ErrUnsupportedField) } func Test_executionPayloadHeaderCapella_Pb(t *testing.T) { payload := createWrappedPayloadHeaderCapella(t) _, err := payload.PbBellatrix() - require.ErrorIs(t, err, consensus_types.ErrUnsupportedGetter) + require.ErrorIs(t, err, consensus_types.ErrUnsupportedField) _, err = payload.PbCapella() - require.ErrorIs(t, err, consensus_types.ErrUnsupportedGetter) + require.ErrorIs(t, err, consensus_types.ErrUnsupportedField) } func createWrappedPayload(t testing.TB) interfaces.ExecutionData { diff --git a/consensus-types/types.go b/consensus-types/types.go index 3c1220a6a7..1d00b356a9 100644 --- a/consensus-types/types.go +++ b/consensus-types/types.go @@ -11,10 +11,11 @@ import ( var ( // ErrNilObjectWrapped is returned in a constructor when the underlying object is nil. ErrNilObjectWrapped = errors.New("attempted to wrap nil object") - // ErrUnsupportedGetter is returned when a getter access is not supported for a specific beacon block version. - ErrUnsupportedGetter = errors.New("unsupported getter") + // ErrUnsupportedField is returned when a getter/setter access is not supported. + ErrUnsupportedField = errors.New("unsupported getter") ) +// ErrNotSupported constructs a message informing about an unsupported field access. func ErrNotSupported(funcName string, ver int) error { - return errors2.Wrap(ErrUnsupportedGetter, fmt.Sprintf("%s is not supported for %s", funcName, version.String(ver))) + return errors2.Wrap(ErrUnsupportedField, fmt.Sprintf("%s is not supported for %s", funcName, version.String(ver))) }