mirror of
https://github.com/OffchainLabs/prysm.git
synced 2026-01-08 21:08:10 -05:00
* generate SyncCommittee SSZ * refactor error handling * rewards: use http2.HandleError * add light client protobuf files * add light client helpers
631 lines
22 KiB
Go
631 lines
22 KiB
Go
package beacon
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/pkg/errors"
|
|
"github.com/prysmaticlabs/prysm/v4/api"
|
|
rpchelpers "github.com/prysmaticlabs/prysm/v4/beacon-chain/rpc/eth/helpers"
|
|
consensus_types "github.com/prysmaticlabs/prysm/v4/consensus-types"
|
|
"github.com/prysmaticlabs/prysm/v4/consensus-types/interfaces"
|
|
ethpbv1 "github.com/prysmaticlabs/prysm/v4/proto/eth/v1"
|
|
ethpbv2 "github.com/prysmaticlabs/prysm/v4/proto/eth/v2"
|
|
"github.com/prysmaticlabs/prysm/v4/proto/migration"
|
|
"github.com/prysmaticlabs/prysm/v4/runtime/version"
|
|
"go.opencensus.io/trace"
|
|
"google.golang.org/grpc"
|
|
"google.golang.org/grpc/codes"
|
|
"google.golang.org/grpc/metadata"
|
|
"google.golang.org/grpc/status"
|
|
)
|
|
|
|
// GetBlindedBlock retrieves blinded block for given block id.
|
|
func (bs *Server) GetBlindedBlock(ctx context.Context, req *ethpbv1.BlockRequest) (*ethpbv2.BlindedBlockResponse, error) {
|
|
ctx, span := trace.StartSpan(ctx, "beacon.GetBlindedBlock")
|
|
defer span.End()
|
|
|
|
blk, err := bs.Blocker.Block(ctx, req.BlockId)
|
|
err = rpchelpers.HandleGetBlockError(blk, err)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
blkRoot, err := blk.Block().HashTreeRoot()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get block root")
|
|
}
|
|
if err := grpc.SetHeader(ctx, metadata.Pairs(api.VersionHeader, version.String(blk.Version()))); err != nil {
|
|
return nil, status.Errorf(codes.Internal, "Could not set "+api.VersionHeader+" header: %v", err)
|
|
}
|
|
result, err := getBlindedBlockPhase0(blk)
|
|
if result != nil {
|
|
result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot)
|
|
return result, nil
|
|
}
|
|
// 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)
|
|
if result != nil {
|
|
result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot)
|
|
return result, nil
|
|
}
|
|
// 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)
|
|
if result != nil {
|
|
result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot)
|
|
return result, nil
|
|
}
|
|
// 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)
|
|
if result != nil {
|
|
result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot)
|
|
return result, nil
|
|
}
|
|
// 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.getBlindedBlockDeneb(ctx, blk)
|
|
if result != nil {
|
|
result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot)
|
|
return result, nil
|
|
}
|
|
// 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)
|
|
}
|
|
|
|
return nil, status.Errorf(codes.Internal, "Unknown block type %T", blk)
|
|
}
|
|
|
|
// GetBlindedBlockSSZ returns the SSZ-serialized version of the blinded beacon block for given block id.
|
|
func (bs *Server) GetBlindedBlockSSZ(ctx context.Context, req *ethpbv1.BlockRequest) (*ethpbv2.SSZContainer, error) {
|
|
ctx, span := trace.StartSpan(ctx, "beacon.GetBlindedBlockSSZ")
|
|
defer span.End()
|
|
|
|
blk, err := bs.Blocker.Block(ctx, req.BlockId)
|
|
err = rpchelpers.HandleGetBlockError(blk, err)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
blkRoot, err := blk.Block().HashTreeRoot()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get block root")
|
|
}
|
|
|
|
result, err := getSSZBlockPhase0(blk)
|
|
if result != nil {
|
|
result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot)
|
|
return result, nil
|
|
}
|
|
// 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)
|
|
if result != nil {
|
|
result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot)
|
|
return result, nil
|
|
}
|
|
// 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)
|
|
if result != nil {
|
|
result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot)
|
|
return result, nil
|
|
}
|
|
// 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)
|
|
if result != nil {
|
|
result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot)
|
|
return result, nil
|
|
}
|
|
// 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.getBlindedSSZBlockDeneb(ctx, blk)
|
|
if result != nil {
|
|
result.Finalized = bs.FinalizationFetcher.IsFinalized(ctx, blkRoot)
|
|
return result, nil
|
|
}
|
|
// 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)
|
|
}
|
|
|
|
func getBlindedBlockPhase0(blk interfaces.ReadOnlySignedBeaconBlock) (*ethpbv2.BlindedBlockResponse, error) {
|
|
phase0Blk, err := blk.PbPhase0Block()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if phase0Blk == nil {
|
|
return nil, errNilBlock
|
|
}
|
|
v1Blk, err := migration.SignedBeaconBlock(blk)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get signed beacon block")
|
|
}
|
|
return ðpbv2.BlindedBlockResponse{
|
|
Version: ethpbv2.Version_PHASE0,
|
|
Data: ðpbv2.SignedBlindedBeaconBlockContainer{
|
|
Message: ðpbv2.SignedBlindedBeaconBlockContainer_Phase0Block{Phase0Block: v1Blk.Block},
|
|
Signature: v1Blk.Signature,
|
|
},
|
|
ExecutionOptimistic: false,
|
|
}, nil
|
|
}
|
|
|
|
func getBlindedBlockAltair(blk interfaces.ReadOnlySignedBeaconBlock) (*ethpbv2.BlindedBlockResponse, error) {
|
|
altairBlk, err := blk.PbAltairBlock()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if altairBlk == nil {
|
|
return nil, errNilBlock
|
|
}
|
|
v2Blk, err := migration.V1Alpha1BeaconBlockAltairToV2(altairBlk.Block)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get signed beacon block")
|
|
}
|
|
sig := blk.Signature()
|
|
return ðpbv2.BlindedBlockResponse{
|
|
Version: ethpbv2.Version_ALTAIR,
|
|
Data: ðpbv2.SignedBlindedBeaconBlockContainer{
|
|
Message: ðpbv2.SignedBlindedBeaconBlockContainer_AltairBlock{AltairBlock: v2Blk},
|
|
Signature: sig[:],
|
|
},
|
|
ExecutionOptimistic: false,
|
|
}, nil
|
|
}
|
|
|
|
func (bs *Server) getBlindedBlockBellatrix(ctx context.Context, blk interfaces.ReadOnlySignedBeaconBlock) (*ethpbv2.BlindedBlockResponse, error) {
|
|
bellatrixBlk, err := blk.PbBellatrixBlock()
|
|
if err != nil {
|
|
// 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
|
|
}
|
|
v2Blk, err := migration.V1Alpha1BeaconBlockBlindedBellatrixToV2Blinded(blindedBellatrixBlk.Block)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not convert beacon block")
|
|
}
|
|
root, err := blk.Block().HashTreeRoot()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get block root")
|
|
}
|
|
isOptimistic, err := bs.OptimisticModeFetcher.IsOptimisticForRoot(ctx, root)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not check if block is optimistic")
|
|
}
|
|
sig := blk.Signature()
|
|
return ðpbv2.BlindedBlockResponse{
|
|
Version: ethpbv2.Version_BELLATRIX,
|
|
Data: ðpbv2.SignedBlindedBeaconBlockContainer{
|
|
Message: ðpbv2.SignedBlindedBeaconBlockContainer_BellatrixBlock{BellatrixBlock: v2Blk},
|
|
Signature: sig[:],
|
|
},
|
|
ExecutionOptimistic: isOptimistic,
|
|
}, nil
|
|
}
|
|
return nil, err
|
|
}
|
|
return nil, err
|
|
}
|
|
|
|
if bellatrixBlk == nil {
|
|
return nil, errNilBlock
|
|
}
|
|
blindedBlkInterface, err := blk.ToBlinded()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not convert block to blinded block")
|
|
}
|
|
blindedBellatrixBlock, err := blindedBlkInterface.PbBlindedBellatrixBlock()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get signed beacon block")
|
|
}
|
|
v2Blk, err := migration.V1Alpha1BeaconBlockBlindedBellatrixToV2Blinded(blindedBellatrixBlock.Block)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not convert beacon block")
|
|
}
|
|
root, err := blk.Block().HashTreeRoot()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get block root")
|
|
}
|
|
isOptimistic, err := bs.OptimisticModeFetcher.IsOptimisticForRoot(ctx, root)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not check if block is optimistic")
|
|
}
|
|
sig := blk.Signature()
|
|
return ðpbv2.BlindedBlockResponse{
|
|
Version: ethpbv2.Version_BELLATRIX,
|
|
Data: ðpbv2.SignedBlindedBeaconBlockContainer{
|
|
Message: ðpbv2.SignedBlindedBeaconBlockContainer_BellatrixBlock{BellatrixBlock: v2Blk},
|
|
Signature: sig[:],
|
|
},
|
|
ExecutionOptimistic: isOptimistic,
|
|
}, nil
|
|
}
|
|
|
|
func (bs *Server) getBlindedBlockCapella(ctx context.Context, blk interfaces.ReadOnlySignedBeaconBlock) (*ethpbv2.BlindedBlockResponse, error) {
|
|
capellaBlk, err := blk.PbCapellaBlock()
|
|
if err != nil {
|
|
// 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
|
|
}
|
|
v2Blk, err := migration.V1Alpha1BeaconBlockBlindedCapellaToV2Blinded(blindedCapellaBlk.Block)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "Could not convert beacon block")
|
|
}
|
|
root, err := blk.Block().HashTreeRoot()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get block root")
|
|
}
|
|
isOptimistic, err := bs.OptimisticModeFetcher.IsOptimisticForRoot(ctx, root)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not check if block is optimistic")
|
|
}
|
|
sig := blk.Signature()
|
|
return ðpbv2.BlindedBlockResponse{
|
|
Version: ethpbv2.Version_CAPELLA,
|
|
Data: ðpbv2.SignedBlindedBeaconBlockContainer{
|
|
Message: ðpbv2.SignedBlindedBeaconBlockContainer_CapellaBlock{CapellaBlock: v2Blk},
|
|
Signature: sig[:],
|
|
},
|
|
ExecutionOptimistic: isOptimistic,
|
|
}, nil
|
|
}
|
|
return nil, err
|
|
}
|
|
return nil, err
|
|
}
|
|
|
|
if capellaBlk == nil {
|
|
return nil, errNilBlock
|
|
}
|
|
blindedBlkInterface, err := blk.ToBlinded()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not convert block to blinded block")
|
|
}
|
|
blindedCapellaBlock, err := blindedBlkInterface.PbBlindedCapellaBlock()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get signed beacon block")
|
|
}
|
|
v2Blk, err := migration.V1Alpha1BeaconBlockBlindedCapellaToV2Blinded(blindedCapellaBlock.Block)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not convert beacon block")
|
|
}
|
|
root, err := blk.Block().HashTreeRoot()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get block root")
|
|
}
|
|
isOptimistic, err := bs.OptimisticModeFetcher.IsOptimisticForRoot(ctx, root)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not check if block is optimistic")
|
|
}
|
|
sig := blk.Signature()
|
|
return ðpbv2.BlindedBlockResponse{
|
|
Version: ethpbv2.Version_CAPELLA,
|
|
Data: ðpbv2.SignedBlindedBeaconBlockContainer{
|
|
Message: ðpbv2.SignedBlindedBeaconBlockContainer_CapellaBlock{CapellaBlock: v2Blk},
|
|
Signature: sig[:],
|
|
},
|
|
ExecutionOptimistic: isOptimistic,
|
|
}, nil
|
|
}
|
|
|
|
func (bs *Server) getBlindedBlockDeneb(ctx context.Context, blk interfaces.ReadOnlySignedBeaconBlock) (*ethpbv2.BlindedBlockResponse, error) {
|
|
denebBlk, err := blk.PbDenebBlock()
|
|
if err != nil {
|
|
// ErrUnsupportedGetter means that we have another block type
|
|
if errors.Is(err, consensus_types.ErrUnsupportedField) {
|
|
if blindedDenebBlk, err := blk.PbBlindedDenebBlock(); err == nil {
|
|
if blindedDenebBlk == nil {
|
|
return nil, errNilBlock
|
|
}
|
|
v2Blk, err := migration.V1Alpha1BeaconBlockBlindedDenebToV2Blinded(blindedDenebBlk.Message)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "Could not convert beacon block")
|
|
}
|
|
root, err := blk.Block().HashTreeRoot()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get block root")
|
|
}
|
|
isOptimistic, err := bs.OptimisticModeFetcher.IsOptimisticForRoot(ctx, root)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not check if block is optimistic")
|
|
}
|
|
sig := blk.Signature()
|
|
return ðpbv2.BlindedBlockResponse{
|
|
Version: ethpbv2.Version_DENEB,
|
|
Data: ðpbv2.SignedBlindedBeaconBlockContainer{
|
|
Message: ðpbv2.SignedBlindedBeaconBlockContainer_DenebBlock{DenebBlock: v2Blk},
|
|
Signature: sig[:],
|
|
},
|
|
ExecutionOptimistic: isOptimistic,
|
|
}, nil
|
|
}
|
|
return nil, err
|
|
}
|
|
return nil, err
|
|
}
|
|
|
|
if denebBlk == nil {
|
|
return nil, errNilBlock
|
|
}
|
|
blindedBlkInterface, err := blk.ToBlinded()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not convert block to blinded block")
|
|
}
|
|
blindedDenebBlock, err := blindedBlkInterface.PbBlindedDenebBlock()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get signed beacon block")
|
|
}
|
|
v2Blk, err := migration.V1Alpha1BeaconBlockBlindedDenebToV2Blinded(blindedDenebBlock.Message)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not convert beacon block")
|
|
}
|
|
root, err := blk.Block().HashTreeRoot()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get block root")
|
|
}
|
|
isOptimistic, err := bs.OptimisticModeFetcher.IsOptimisticForRoot(ctx, root)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not check if block is optimistic")
|
|
}
|
|
sig := blk.Signature()
|
|
return ðpbv2.BlindedBlockResponse{
|
|
Version: ethpbv2.Version_CAPELLA,
|
|
Data: ðpbv2.SignedBlindedBeaconBlockContainer{
|
|
Message: ðpbv2.SignedBlindedBeaconBlockContainer_DenebBlock{DenebBlock: v2Blk},
|
|
Signature: sig[:],
|
|
},
|
|
ExecutionOptimistic: isOptimistic,
|
|
}, nil
|
|
}
|
|
|
|
func (bs *Server) getBlindedSSZBlockBellatrix(ctx context.Context, blk interfaces.ReadOnlySignedBeaconBlock) (*ethpbv2.SSZContainer, error) {
|
|
bellatrixBlk, err := blk.PbBellatrixBlock()
|
|
if err != nil {
|
|
// 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
|
|
}
|
|
v2Blk, err := migration.V1Alpha1BeaconBlockBlindedBellatrixToV2Blinded(blindedBellatrixBlk.Block)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get signed beacon block")
|
|
}
|
|
root, err := blk.Block().HashTreeRoot()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get block root")
|
|
}
|
|
isOptimistic, err := bs.OptimisticModeFetcher.IsOptimisticForRoot(ctx, root)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not check if block is optimistic")
|
|
}
|
|
sig := blk.Signature()
|
|
data := ðpbv2.SignedBlindedBeaconBlockBellatrix{
|
|
Message: v2Blk,
|
|
Signature: sig[:],
|
|
}
|
|
sszData, err := data.MarshalSSZ()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not marshal block into SSZ")
|
|
}
|
|
return ðpbv2.SSZContainer{
|
|
Version: ethpbv2.Version_BELLATRIX,
|
|
ExecutionOptimistic: isOptimistic,
|
|
Data: sszData,
|
|
}, nil
|
|
}
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
if bellatrixBlk == nil {
|
|
return nil, errNilBlock
|
|
}
|
|
blindedBlkInterface, err := blk.ToBlinded()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not convert block to blinded block")
|
|
}
|
|
blindedBellatrixBlock, err := blindedBlkInterface.PbBlindedBellatrixBlock()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get signed beacon block")
|
|
}
|
|
v2Blk, err := migration.V1Alpha1BeaconBlockBlindedBellatrixToV2Blinded(blindedBellatrixBlock.Block)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get signed beacon block")
|
|
}
|
|
root, err := blk.Block().HashTreeRoot()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get block root")
|
|
}
|
|
isOptimistic, err := bs.OptimisticModeFetcher.IsOptimisticForRoot(ctx, root)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not check if block is optimistic")
|
|
}
|
|
sig := blk.Signature()
|
|
data := ðpbv2.SignedBlindedBeaconBlockBellatrix{
|
|
Message: v2Blk,
|
|
Signature: sig[:],
|
|
}
|
|
sszData, err := data.MarshalSSZ()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not marshal block into SSZ")
|
|
}
|
|
return ðpbv2.SSZContainer{Version: ethpbv2.Version_BELLATRIX, ExecutionOptimistic: isOptimistic, Data: sszData}, nil
|
|
}
|
|
|
|
func (bs *Server) getBlindedSSZBlockCapella(ctx context.Context, blk interfaces.ReadOnlySignedBeaconBlock) (*ethpbv2.SSZContainer, error) {
|
|
capellaBlk, err := blk.PbCapellaBlock()
|
|
if err != nil {
|
|
// 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
|
|
}
|
|
v2Blk, err := migration.V1Alpha1BeaconBlockBlindedCapellaToV2Blinded(blindedCapellaBlk.Block)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get signed beacon block")
|
|
}
|
|
root, err := blk.Block().HashTreeRoot()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get block root")
|
|
}
|
|
isOptimistic, err := bs.OptimisticModeFetcher.IsOptimisticForRoot(ctx, root)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not check if block is optimistic")
|
|
}
|
|
sig := blk.Signature()
|
|
data := ðpbv2.SignedBlindedBeaconBlockCapella{
|
|
Message: v2Blk,
|
|
Signature: sig[:],
|
|
}
|
|
sszData, err := data.MarshalSSZ()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not marshal block into SSZ")
|
|
}
|
|
return ðpbv2.SSZContainer{
|
|
Version: ethpbv2.Version_CAPELLA,
|
|
ExecutionOptimistic: isOptimistic,
|
|
Data: sszData,
|
|
}, nil
|
|
}
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
if capellaBlk == nil {
|
|
return nil, errNilBlock
|
|
}
|
|
blindedBlkInterface, err := blk.ToBlinded()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not convert block to blinded block")
|
|
}
|
|
blindedCapellaBlock, err := blindedBlkInterface.PbBlindedCapellaBlock()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get signed beacon block")
|
|
}
|
|
v2Blk, err := migration.V1Alpha1BeaconBlockBlindedCapellaToV2Blinded(blindedCapellaBlock.Block)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get signed beacon block")
|
|
}
|
|
root, err := blk.Block().HashTreeRoot()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get block root")
|
|
}
|
|
isOptimistic, err := bs.OptimisticModeFetcher.IsOptimisticForRoot(ctx, root)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not check if block is optimistic")
|
|
}
|
|
sig := blk.Signature()
|
|
data := ðpbv2.SignedBlindedBeaconBlockCapella{
|
|
Message: v2Blk,
|
|
Signature: sig[:],
|
|
}
|
|
sszData, err := data.MarshalSSZ()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not marshal block into SSZ")
|
|
}
|
|
return ðpbv2.SSZContainer{Version: ethpbv2.Version_CAPELLA, ExecutionOptimistic: isOptimistic, Data: sszData}, nil
|
|
}
|
|
|
|
func (bs *Server) getBlindedSSZBlockDeneb(ctx context.Context, blk interfaces.ReadOnlySignedBeaconBlock) (*ethpbv2.SSZContainer, error) {
|
|
denebBlk, err := blk.PbDenebBlock()
|
|
if err != nil {
|
|
// ErrUnsupportedGetter means that we have another block type
|
|
if errors.Is(err, consensus_types.ErrUnsupportedField) {
|
|
if blindedDenebBlk, err := blk.PbBlindedDenebBlock(); err == nil {
|
|
if blindedDenebBlk == nil {
|
|
return nil, errNilBlock
|
|
}
|
|
v2Blk, err := migration.V1Alpha1BeaconBlockBlindedDenebToV2Blinded(blindedDenebBlk.Message)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get signed beacon block")
|
|
}
|
|
root, err := blk.Block().HashTreeRoot()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get block root")
|
|
}
|
|
isOptimistic, err := bs.OptimisticModeFetcher.IsOptimisticForRoot(ctx, root)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not check if block is optimistic")
|
|
}
|
|
sig := blk.Signature()
|
|
data := ðpbv2.SignedBlindedBeaconBlockDeneb{
|
|
Message: v2Blk,
|
|
Signature: sig[:],
|
|
}
|
|
sszData, err := data.MarshalSSZ()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not marshal block into SSZ")
|
|
}
|
|
return ðpbv2.SSZContainer{
|
|
Version: ethpbv2.Version_DENEB,
|
|
ExecutionOptimistic: isOptimistic,
|
|
Data: sszData,
|
|
}, nil
|
|
}
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
if denebBlk == nil {
|
|
return nil, errNilBlock
|
|
}
|
|
blindedBlkInterface, err := blk.ToBlinded()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not convert block to blinded block")
|
|
}
|
|
blindedDenebBlock, err := blindedBlkInterface.PbBlindedDenebBlock()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get signed beacon block")
|
|
}
|
|
v2Blk, err := migration.V1Alpha1BeaconBlockBlindedDenebToV2Blinded(blindedDenebBlock.Message)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get signed beacon block")
|
|
}
|
|
root, err := blk.Block().HashTreeRoot()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not get block root")
|
|
}
|
|
isOptimistic, err := bs.OptimisticModeFetcher.IsOptimisticForRoot(ctx, root)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not check if block is optimistic")
|
|
}
|
|
sig := blk.Signature()
|
|
data := ðpbv2.SignedBlindedBeaconBlockDeneb{
|
|
Message: v2Blk,
|
|
Signature: sig[:],
|
|
}
|
|
sszData, err := data.MarshalSSZ()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "could not marshal block into SSZ")
|
|
}
|
|
return ðpbv2.SSZContainer{Version: ethpbv2.Version_DENEB, ExecutionOptimistic: isOptimistic, Data: sszData}, nil
|
|
}
|