mirror of
https://github.com/OffchainLabs/prysm.git
synced 2026-01-10 07:58:22 -05:00
449 lines
11 KiB
Go
449 lines
11 KiB
Go
package blocks
|
|
|
|
import (
|
|
"github.com/pkg/errors"
|
|
eth "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1"
|
|
"github.com/prysmaticlabs/prysm/runtime/version"
|
|
"google.golang.org/protobuf/proto"
|
|
)
|
|
|
|
// Proto returns the underlying protobuf signed beacon block.
|
|
func (b *SignedBeaconBlock) Proto() (proto.Message, error) {
|
|
if b == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
blockMessage, err := b.block.Proto()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
switch b.version {
|
|
case version.Phase0:
|
|
var block *eth.BeaconBlock
|
|
if blockMessage != nil {
|
|
var ok bool
|
|
block, ok = blockMessage.(*eth.BeaconBlock)
|
|
if !ok {
|
|
return nil, errors.Wrap(err, incorrectBlockVersion)
|
|
}
|
|
}
|
|
return ð.SignedBeaconBlock{
|
|
Block: block,
|
|
Signature: b.signature,
|
|
}, nil
|
|
case version.Altair:
|
|
var block *eth.BeaconBlockAltair
|
|
if blockMessage != nil {
|
|
var ok bool
|
|
block, ok = blockMessage.(*eth.BeaconBlockAltair)
|
|
if !ok {
|
|
return nil, errors.Wrap(err, incorrectBlockVersion)
|
|
}
|
|
}
|
|
return ð.SignedBeaconBlockAltair{
|
|
Block: block,
|
|
Signature: b.signature,
|
|
}, nil
|
|
case version.Bellatrix:
|
|
var block *eth.BeaconBlockBellatrix
|
|
if blockMessage != nil {
|
|
var ok bool
|
|
block, ok = blockMessage.(*eth.BeaconBlockBellatrix)
|
|
if !ok {
|
|
return nil, errors.Wrap(err, incorrectBlockVersion)
|
|
}
|
|
}
|
|
return ð.SignedBeaconBlockBellatrix{
|
|
Block: block,
|
|
Signature: b.signature,
|
|
}, nil
|
|
case version.BellatrixBlind:
|
|
var block *eth.BlindedBeaconBlockBellatrix
|
|
if blockMessage != nil {
|
|
var ok bool
|
|
block, ok = blockMessage.(*eth.BlindedBeaconBlockBellatrix)
|
|
if !ok {
|
|
return nil, errors.Wrap(err, incorrectBlockVersion)
|
|
}
|
|
}
|
|
return ð.SignedBlindedBeaconBlockBellatrix{
|
|
Block: block,
|
|
Signature: b.signature,
|
|
}, nil
|
|
default:
|
|
return nil, errors.New("unsupported signed beacon block version")
|
|
}
|
|
}
|
|
|
|
// Proto returns the underlying protobuf beacon block.
|
|
func (b *BeaconBlock) Proto() (proto.Message, error) {
|
|
if b == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
bodyMessage, err := b.body.Proto()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
switch b.version {
|
|
case version.Phase0:
|
|
var body *eth.BeaconBlockBody
|
|
if bodyMessage != nil {
|
|
var ok bool
|
|
body, ok = bodyMessage.(*eth.BeaconBlockBody)
|
|
if !ok {
|
|
return nil, errors.Wrap(err, incorrectBodyVersion)
|
|
}
|
|
}
|
|
return ð.BeaconBlock{
|
|
Slot: b.slot,
|
|
ProposerIndex: b.proposerIndex,
|
|
ParentRoot: b.parentRoot,
|
|
StateRoot: b.stateRoot,
|
|
Body: body,
|
|
}, nil
|
|
case version.Altair:
|
|
var body *eth.BeaconBlockBodyAltair
|
|
if bodyMessage != nil {
|
|
var ok bool
|
|
body, ok = bodyMessage.(*eth.BeaconBlockBodyAltair)
|
|
if !ok {
|
|
return nil, errors.Wrap(err, incorrectBodyVersion)
|
|
}
|
|
}
|
|
return ð.BeaconBlockAltair{
|
|
Slot: b.slot,
|
|
ProposerIndex: b.proposerIndex,
|
|
ParentRoot: b.parentRoot,
|
|
StateRoot: b.stateRoot,
|
|
Body: body,
|
|
}, nil
|
|
case version.Bellatrix:
|
|
var body *eth.BeaconBlockBodyBellatrix
|
|
if bodyMessage != nil {
|
|
var ok bool
|
|
body, ok = bodyMessage.(*eth.BeaconBlockBodyBellatrix)
|
|
if !ok {
|
|
return nil, errors.Wrap(err, incorrectBodyVersion)
|
|
}
|
|
}
|
|
return ð.BeaconBlockBellatrix{
|
|
Slot: b.slot,
|
|
ProposerIndex: b.proposerIndex,
|
|
ParentRoot: b.parentRoot,
|
|
StateRoot: b.stateRoot,
|
|
Body: body,
|
|
}, nil
|
|
case version.BellatrixBlind:
|
|
var body *eth.BlindedBeaconBlockBodyBellatrix
|
|
if bodyMessage != nil {
|
|
var ok bool
|
|
body, ok = bodyMessage.(*eth.BlindedBeaconBlockBodyBellatrix)
|
|
if !ok {
|
|
return nil, errors.Wrap(err, incorrectBodyVersion)
|
|
}
|
|
}
|
|
return ð.BlindedBeaconBlockBellatrix{
|
|
Slot: b.slot,
|
|
ProposerIndex: b.proposerIndex,
|
|
ParentRoot: b.parentRoot,
|
|
StateRoot: b.stateRoot,
|
|
Body: body,
|
|
}, nil
|
|
default:
|
|
return nil, errors.New("unsupported beacon block version")
|
|
}
|
|
}
|
|
|
|
// Proto returns the underlying protobuf beacon block body.
|
|
func (b *BeaconBlockBody) Proto() (proto.Message, error) {
|
|
if b == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
switch b.version {
|
|
case version.Phase0:
|
|
return ð.BeaconBlockBody{
|
|
RandaoReveal: b.randaoReveal,
|
|
Eth1Data: b.eth1Data,
|
|
Graffiti: b.graffiti,
|
|
ProposerSlashings: b.proposerSlashings,
|
|
AttesterSlashings: b.attesterSlashings,
|
|
Attestations: b.attestations,
|
|
Deposits: b.deposits,
|
|
VoluntaryExits: b.voluntaryExits,
|
|
}, nil
|
|
case version.Altair:
|
|
return ð.BeaconBlockBodyAltair{
|
|
RandaoReveal: b.randaoReveal,
|
|
Eth1Data: b.eth1Data,
|
|
Graffiti: b.graffiti,
|
|
ProposerSlashings: b.proposerSlashings,
|
|
AttesterSlashings: b.attesterSlashings,
|
|
Attestations: b.attestations,
|
|
Deposits: b.deposits,
|
|
VoluntaryExits: b.voluntaryExits,
|
|
SyncAggregate: b.syncAggregate,
|
|
}, nil
|
|
case version.Bellatrix:
|
|
return ð.BeaconBlockBodyBellatrix{
|
|
RandaoReveal: b.randaoReveal,
|
|
Eth1Data: b.eth1Data,
|
|
Graffiti: b.graffiti,
|
|
ProposerSlashings: b.proposerSlashings,
|
|
AttesterSlashings: b.attesterSlashings,
|
|
Attestations: b.attestations,
|
|
Deposits: b.deposits,
|
|
VoluntaryExits: b.voluntaryExits,
|
|
SyncAggregate: b.syncAggregate,
|
|
ExecutionPayload: b.executionPayload,
|
|
}, nil
|
|
case version.BellatrixBlind:
|
|
return ð.BlindedBeaconBlockBodyBellatrix{
|
|
RandaoReveal: b.randaoReveal,
|
|
Eth1Data: b.eth1Data,
|
|
Graffiti: b.graffiti,
|
|
ProposerSlashings: b.proposerSlashings,
|
|
AttesterSlashings: b.attesterSlashings,
|
|
Attestations: b.attestations,
|
|
Deposits: b.deposits,
|
|
VoluntaryExits: b.voluntaryExits,
|
|
SyncAggregate: b.syncAggregate,
|
|
ExecutionPayloadHeader: b.executionPayloadHeader,
|
|
}, nil
|
|
default:
|
|
return nil, errors.New("unsupported beacon block body version")
|
|
}
|
|
}
|
|
|
|
func initSignedBlockFromProtoPhase0(pb *eth.SignedBeaconBlock) (*SignedBeaconBlock, error) {
|
|
if pb == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
block, err := initBlockFromProtoPhase0(pb.Block)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
b := &SignedBeaconBlock{
|
|
version: version.Phase0,
|
|
block: block,
|
|
signature: pb.Signature,
|
|
}
|
|
return b, nil
|
|
}
|
|
|
|
func initSignedBlockFromProtoAltair(pb *eth.SignedBeaconBlockAltair) (*SignedBeaconBlock, error) {
|
|
if pb == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
block, err := initBlockFromProtoAltair(pb.Block)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
b := &SignedBeaconBlock{
|
|
version: version.Altair,
|
|
block: block,
|
|
signature: pb.Signature,
|
|
}
|
|
return b, nil
|
|
}
|
|
|
|
func initSignedBlockFromProtoBellatrix(pb *eth.SignedBeaconBlockBellatrix) (*SignedBeaconBlock, error) {
|
|
if pb == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
block, err := initBlockFromProtoBellatrix(pb.Block)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
b := &SignedBeaconBlock{
|
|
version: version.Bellatrix,
|
|
block: block,
|
|
signature: pb.Signature,
|
|
}
|
|
return b, nil
|
|
}
|
|
|
|
func initBlindedSignedBlockFromProtoBellatrix(pb *eth.SignedBlindedBeaconBlockBellatrix) (*SignedBeaconBlock, error) {
|
|
if pb == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
block, err := initBlindedBlockFromProtoBellatrix(pb.Block)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
b := &SignedBeaconBlock{
|
|
version: version.BellatrixBlind,
|
|
block: block,
|
|
signature: pb.Signature,
|
|
}
|
|
return b, nil
|
|
}
|
|
|
|
func initBlockFromProtoPhase0(pb *eth.BeaconBlock) (*BeaconBlock, error) {
|
|
if pb == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
body, err := initBlockBodyFromProtoPhase0(pb.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
b := &BeaconBlock{
|
|
version: version.Phase0,
|
|
slot: pb.Slot,
|
|
proposerIndex: pb.ProposerIndex,
|
|
parentRoot: pb.ParentRoot,
|
|
stateRoot: pb.StateRoot,
|
|
body: body,
|
|
}
|
|
return b, nil
|
|
}
|
|
|
|
func initBlockFromProtoAltair(pb *eth.BeaconBlockAltair) (*BeaconBlock, error) {
|
|
if pb == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
body, err := initBlockBodyFromProtoAltair(pb.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
b := &BeaconBlock{
|
|
version: version.Altair,
|
|
slot: pb.Slot,
|
|
proposerIndex: pb.ProposerIndex,
|
|
parentRoot: pb.ParentRoot,
|
|
stateRoot: pb.StateRoot,
|
|
body: body,
|
|
}
|
|
return b, nil
|
|
}
|
|
|
|
func initBlockFromProtoBellatrix(pb *eth.BeaconBlockBellatrix) (*BeaconBlock, error) {
|
|
if pb == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
body, err := initBlockBodyFromProtoBellatrix(pb.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
b := &BeaconBlock{
|
|
version: version.Bellatrix,
|
|
slot: pb.Slot,
|
|
proposerIndex: pb.ProposerIndex,
|
|
parentRoot: pb.ParentRoot,
|
|
stateRoot: pb.StateRoot,
|
|
body: body,
|
|
}
|
|
return b, nil
|
|
}
|
|
|
|
func initBlindedBlockFromProtoBellatrix(pb *eth.BlindedBeaconBlockBellatrix) (*BeaconBlock, error) {
|
|
if pb == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
body, err := initBlindedBlockBodyFromProtoBellatrix(pb.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
b := &BeaconBlock{
|
|
version: version.BellatrixBlind,
|
|
slot: pb.Slot,
|
|
proposerIndex: pb.ProposerIndex,
|
|
parentRoot: pb.ParentRoot,
|
|
stateRoot: pb.StateRoot,
|
|
body: body,
|
|
}
|
|
return b, nil
|
|
}
|
|
|
|
func initBlockBodyFromProtoPhase0(pb *eth.BeaconBlockBody) (*BeaconBlockBody, error) {
|
|
if pb == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
b := &BeaconBlockBody{
|
|
version: version.Phase0,
|
|
randaoReveal: pb.RandaoReveal,
|
|
eth1Data: pb.Eth1Data,
|
|
graffiti: pb.Graffiti,
|
|
proposerSlashings: pb.ProposerSlashings,
|
|
attesterSlashings: pb.AttesterSlashings,
|
|
attestations: pb.Attestations,
|
|
deposits: pb.Deposits,
|
|
voluntaryExits: pb.VoluntaryExits,
|
|
}
|
|
return b, nil
|
|
}
|
|
|
|
func initBlockBodyFromProtoAltair(pb *eth.BeaconBlockBodyAltair) (*BeaconBlockBody, error) {
|
|
if pb == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
b := &BeaconBlockBody{
|
|
version: version.Altair,
|
|
randaoReveal: pb.RandaoReveal,
|
|
eth1Data: pb.Eth1Data,
|
|
graffiti: pb.Graffiti,
|
|
proposerSlashings: pb.ProposerSlashings,
|
|
attesterSlashings: pb.AttesterSlashings,
|
|
attestations: pb.Attestations,
|
|
deposits: pb.Deposits,
|
|
voluntaryExits: pb.VoluntaryExits,
|
|
syncAggregate: pb.SyncAggregate,
|
|
}
|
|
return b, nil
|
|
}
|
|
|
|
func initBlockBodyFromProtoBellatrix(pb *eth.BeaconBlockBodyBellatrix) (*BeaconBlockBody, error) {
|
|
if pb == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
b := &BeaconBlockBody{
|
|
version: version.Bellatrix,
|
|
randaoReveal: pb.RandaoReveal,
|
|
eth1Data: pb.Eth1Data,
|
|
graffiti: pb.Graffiti,
|
|
proposerSlashings: pb.ProposerSlashings,
|
|
attesterSlashings: pb.AttesterSlashings,
|
|
attestations: pb.Attestations,
|
|
deposits: pb.Deposits,
|
|
voluntaryExits: pb.VoluntaryExits,
|
|
syncAggregate: pb.SyncAggregate,
|
|
executionPayload: pb.ExecutionPayload,
|
|
}
|
|
return b, nil
|
|
}
|
|
|
|
func initBlindedBlockBodyFromProtoBellatrix(pb *eth.BlindedBeaconBlockBodyBellatrix) (*BeaconBlockBody, error) {
|
|
if pb == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
b := &BeaconBlockBody{
|
|
version: version.BellatrixBlind,
|
|
randaoReveal: pb.RandaoReveal,
|
|
eth1Data: pb.Eth1Data,
|
|
graffiti: pb.Graffiti,
|
|
proposerSlashings: pb.ProposerSlashings,
|
|
attesterSlashings: pb.AttesterSlashings,
|
|
attestations: pb.Attestations,
|
|
deposits: pb.Deposits,
|
|
voluntaryExits: pb.VoluntaryExits,
|
|
syncAggregate: pb.SyncAggregate,
|
|
executionPayloadHeader: pb.ExecutionPayloadHeader,
|
|
}
|
|
return b, nil
|
|
}
|