mirror of
https://github.com/OffchainLabs/prysm.git
synced 2026-01-06 20:13:59 -05:00
2888 lines
103 KiB
Go
2888 lines
103 KiB
Go
package structs
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
|
|
"github.com/OffchainLabs/prysm/v7/api/server"
|
|
fieldparams "github.com/OffchainLabs/prysm/v7/config/fieldparams"
|
|
"github.com/OffchainLabs/prysm/v7/consensus-types/interfaces"
|
|
"github.com/OffchainLabs/prysm/v7/consensus-types/primitives"
|
|
"github.com/OffchainLabs/prysm/v7/container/slice"
|
|
"github.com/OffchainLabs/prysm/v7/encoding/bytesutil"
|
|
enginev1 "github.com/OffchainLabs/prysm/v7/proto/engine/v1"
|
|
eth "github.com/OffchainLabs/prysm/v7/proto/prysm/v1alpha1"
|
|
"github.com/ethereum/go-ethereum/common"
|
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
var ErrUnsupportedConversion = errors.New("Could not determine api struct type to use for value")
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Phase 0
|
|
// ----------------------------------------------------------------------------
|
|
|
|
func (h *SignedBeaconBlockHeader) ToConsensus() (*eth.SignedBeaconBlockHeader, error) {
|
|
if h == nil {
|
|
return nil, errNilValue
|
|
}
|
|
msg, err := h.Message.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Message")
|
|
}
|
|
sig, err := bytesutil.DecodeHexWithLength(h.Signature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Signature")
|
|
}
|
|
|
|
return ð.SignedBeaconBlockHeader{
|
|
Header: msg,
|
|
Signature: sig,
|
|
}, nil
|
|
}
|
|
|
|
func (h *BeaconBlockHeader) ToConsensus() (*eth.BeaconBlockHeader, error) {
|
|
if h == nil {
|
|
return nil, errNilValue
|
|
}
|
|
s, err := strconv.ParseUint(h.Slot, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Slot")
|
|
}
|
|
pi, err := strconv.ParseUint(h.ProposerIndex, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "ProposerIndex")
|
|
}
|
|
pr, err := bytesutil.DecodeHexWithLength(h.ParentRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "ParentRoot")
|
|
}
|
|
sr, err := bytesutil.DecodeHexWithLength(h.StateRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "StateRoot")
|
|
}
|
|
br, err := bytesutil.DecodeHexWithLength(h.BodyRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "BodyRoot")
|
|
}
|
|
|
|
return ð.BeaconBlockHeader{
|
|
Slot: primitives.Slot(s),
|
|
ProposerIndex: primitives.ValidatorIndex(pi),
|
|
ParentRoot: pr,
|
|
StateRoot: sr,
|
|
BodyRoot: br,
|
|
}, nil
|
|
}
|
|
|
|
func SignedBeaconBlockHeaderFromConsensus(src *eth.SignedBeaconBlockHeader) *SignedBeaconBlockHeader {
|
|
return &SignedBeaconBlockHeader{
|
|
Message: &BeaconBlockHeader{
|
|
Slot: fmt.Sprintf("%d", src.Header.Slot),
|
|
ProposerIndex: fmt.Sprintf("%d", src.Header.ProposerIndex),
|
|
ParentRoot: hexutil.Encode(src.Header.ParentRoot),
|
|
StateRoot: hexutil.Encode(src.Header.StateRoot),
|
|
BodyRoot: hexutil.Encode(src.Header.BodyRoot),
|
|
},
|
|
Signature: hexutil.Encode(src.Signature),
|
|
}
|
|
}
|
|
|
|
func (b *SignedBeaconBlock) ToGeneric() (*eth.GenericSignedBeaconBlock, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
|
|
sig, err := bytesutil.DecodeHexWithLength(b.Signature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Signature")
|
|
}
|
|
|
|
bl, err := b.Message.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Message")
|
|
}
|
|
|
|
block := ð.SignedBeaconBlock{
|
|
Block: bl,
|
|
Signature: sig,
|
|
}
|
|
return ð.GenericSignedBeaconBlock{Block: ð.GenericSignedBeaconBlock_Phase0{Phase0: block}}, nil
|
|
}
|
|
|
|
func (b *BeaconBlock) ToGeneric() (*eth.GenericBeaconBlock, error) {
|
|
block, err := b.ToConsensus()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return ð.GenericBeaconBlock{Block: ð.GenericBeaconBlock_Phase0{Phase0: block}}, nil
|
|
}
|
|
|
|
func (b *BeaconBlock) ToConsensus() (*eth.BeaconBlock, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
if b.Body == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body")
|
|
}
|
|
if b.Body.Eth1Data == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.Eth1Data")
|
|
}
|
|
|
|
slot, err := strconv.ParseUint(b.Slot, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Slot")
|
|
}
|
|
proposerIndex, err := strconv.ParseUint(b.ProposerIndex, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "ProposerIndex")
|
|
}
|
|
parentRoot, err := bytesutil.DecodeHexWithLength(b.ParentRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "ParentRoot")
|
|
}
|
|
stateRoot, err := bytesutil.DecodeHexWithLength(b.StateRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "StateRoot")
|
|
}
|
|
randaoReveal, err := bytesutil.DecodeHexWithLength(b.Body.RandaoReveal, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.RandaoReveal")
|
|
}
|
|
depositRoot, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.DepositRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositRoot")
|
|
}
|
|
depositCount, err := strconv.ParseUint(b.Body.Eth1Data.DepositCount, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositCount")
|
|
}
|
|
blockHash, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.BlockHash, common.HashLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.BlockHash")
|
|
}
|
|
graffiti, err := bytesutil.DecodeHexWithLength(b.Body.Graffiti, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Graffiti")
|
|
}
|
|
proposerSlashings, err := ProposerSlashingsToConsensus(b.Body.ProposerSlashings)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ProposerSlashings")
|
|
}
|
|
attesterSlashings, err := AttesterSlashingsToConsensus(b.Body.AttesterSlashings)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.AttesterSlashings")
|
|
}
|
|
atts, err := AttsToConsensus(b.Body.Attestations)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Attestations")
|
|
}
|
|
deposits, err := DepositsToConsensus(b.Body.Deposits)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Deposits")
|
|
}
|
|
exits, err := SignedExitsToConsensus(b.Body.VoluntaryExits)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.VoluntaryExits")
|
|
}
|
|
|
|
return ð.BeaconBlock{
|
|
Slot: primitives.Slot(slot),
|
|
ProposerIndex: primitives.ValidatorIndex(proposerIndex),
|
|
ParentRoot: parentRoot,
|
|
StateRoot: stateRoot,
|
|
Body: ð.BeaconBlockBody{
|
|
RandaoReveal: randaoReveal,
|
|
Eth1Data: ð.Eth1Data{
|
|
DepositRoot: depositRoot,
|
|
DepositCount: depositCount,
|
|
BlockHash: blockHash,
|
|
},
|
|
Graffiti: graffiti,
|
|
ProposerSlashings: proposerSlashings,
|
|
AttesterSlashings: attesterSlashings,
|
|
Attestations: atts,
|
|
Deposits: deposits,
|
|
VoluntaryExits: exits,
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func BeaconBlockHeaderFromConsensus(h *eth.BeaconBlockHeader) *BeaconBlockHeader {
|
|
return &BeaconBlockHeader{
|
|
Slot: fmt.Sprintf("%d", h.Slot),
|
|
ProposerIndex: fmt.Sprintf("%d", h.ProposerIndex),
|
|
ParentRoot: hexutil.Encode(h.ParentRoot),
|
|
StateRoot: hexutil.Encode(h.StateRoot),
|
|
BodyRoot: hexutil.Encode(h.BodyRoot),
|
|
}
|
|
}
|
|
|
|
func BeaconBlockFromConsensus(b *eth.BeaconBlock) *BeaconBlock {
|
|
return &BeaconBlock{
|
|
Slot: fmt.Sprintf("%d", b.Slot),
|
|
ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex),
|
|
ParentRoot: hexutil.Encode(b.ParentRoot),
|
|
StateRoot: hexutil.Encode(b.StateRoot),
|
|
Body: &BeaconBlockBody{
|
|
RandaoReveal: hexutil.Encode(b.Body.RandaoReveal),
|
|
Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data),
|
|
Graffiti: hexutil.Encode(b.Body.Graffiti),
|
|
ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings),
|
|
AttesterSlashings: AttesterSlashingsFromConsensus(b.Body.AttesterSlashings),
|
|
Attestations: AttsFromConsensus(b.Body.Attestations),
|
|
Deposits: DepositsFromConsensus(b.Body.Deposits),
|
|
VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits),
|
|
},
|
|
}
|
|
}
|
|
|
|
func SignedBeaconBlockMessageJsoner(block interfaces.ReadOnlySignedBeaconBlock) (SignedMessageJsoner, error) {
|
|
pb, err := block.Proto()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
switch pbStruct := pb.(type) {
|
|
case *eth.SignedBeaconBlock:
|
|
return SignedBeaconBlockPhase0FromConsensus(pbStruct), nil
|
|
case *eth.SignedBeaconBlockAltair:
|
|
return SignedBeaconBlockAltairFromConsensus(pbStruct), nil
|
|
case *eth.SignedBlindedBeaconBlockBellatrix:
|
|
return SignedBlindedBeaconBlockBellatrixFromConsensus(pbStruct)
|
|
case *eth.SignedBeaconBlockBellatrix:
|
|
return SignedBeaconBlockBellatrixFromConsensus(pbStruct)
|
|
case *eth.SignedBlindedBeaconBlockCapella:
|
|
return SignedBlindedBeaconBlockCapellaFromConsensus(pbStruct)
|
|
case *eth.SignedBeaconBlockCapella:
|
|
return SignedBeaconBlockCapellaFromConsensus(pbStruct)
|
|
case *eth.SignedBlindedBeaconBlockDeneb:
|
|
return SignedBlindedBeaconBlockDenebFromConsensus(pbStruct)
|
|
case *eth.SignedBeaconBlockDeneb:
|
|
return SignedBeaconBlockDenebFromConsensus(pbStruct)
|
|
case *eth.SignedBlindedBeaconBlockElectra:
|
|
return SignedBlindedBeaconBlockElectraFromConsensus(pbStruct)
|
|
case *eth.SignedBeaconBlockElectra:
|
|
return SignedBeaconBlockElectraFromConsensus(pbStruct)
|
|
case *eth.SignedBlindedBeaconBlockFulu:
|
|
return SignedBlindedBeaconBlockFuluFromConsensus(pbStruct)
|
|
case *eth.SignedBeaconBlockFulu:
|
|
return SignedBeaconBlockFuluFromConsensus(pbStruct)
|
|
default:
|
|
return nil, ErrUnsupportedConversion
|
|
}
|
|
}
|
|
|
|
func SignedBeaconBlockPhase0FromConsensus(b *eth.SignedBeaconBlock) *SignedBeaconBlock {
|
|
return &SignedBeaconBlock{
|
|
Message: BeaconBlockFromConsensus(b.Block),
|
|
Signature: hexutil.Encode(b.Signature),
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Altair
|
|
// ----------------------------------------------------------------------------
|
|
|
|
func (b *SignedBeaconBlockAltair) ToGeneric() (*eth.GenericSignedBeaconBlock, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
|
|
sig, err := bytesutil.DecodeHexWithLength(b.Signature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Signature")
|
|
}
|
|
bl, err := b.Message.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Message")
|
|
}
|
|
block := ð.SignedBeaconBlockAltair{
|
|
Block: bl,
|
|
Signature: sig,
|
|
}
|
|
return ð.GenericSignedBeaconBlock{Block: ð.GenericSignedBeaconBlock_Altair{Altair: block}}, nil
|
|
}
|
|
|
|
func (b *BeaconBlockAltair) ToGeneric() (*eth.GenericBeaconBlock, error) {
|
|
block, err := b.ToConsensus()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return ð.GenericBeaconBlock{Block: ð.GenericBeaconBlock_Altair{Altair: block}}, nil
|
|
}
|
|
|
|
func (b *BeaconBlockAltair) ToConsensus() (*eth.BeaconBlockAltair, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
if b.Body == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body")
|
|
}
|
|
if b.Body.Eth1Data == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.Eth1Data")
|
|
}
|
|
if b.Body.SyncAggregate == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.SyncAggregate")
|
|
}
|
|
|
|
slot, err := strconv.ParseUint(b.Slot, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Slot")
|
|
}
|
|
proposerIndex, err := strconv.ParseUint(b.ProposerIndex, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "ProposerIndex")
|
|
}
|
|
parentRoot, err := bytesutil.DecodeHexWithLength(b.ParentRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "ParentRoot")
|
|
}
|
|
stateRoot, err := bytesutil.DecodeHexWithLength(b.StateRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "StateRoot")
|
|
}
|
|
randaoReveal, err := bytesutil.DecodeHexWithLength(b.Body.RandaoReveal, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.RandaoReveal")
|
|
}
|
|
depositRoot, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.DepositRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositRoot")
|
|
}
|
|
depositCount, err := strconv.ParseUint(b.Body.Eth1Data.DepositCount, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositCount")
|
|
}
|
|
blockHash, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.BlockHash, common.HashLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.BlockHash")
|
|
}
|
|
graffiti, err := bytesutil.DecodeHexWithLength(b.Body.Graffiti, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Graffiti")
|
|
}
|
|
proposerSlashings, err := ProposerSlashingsToConsensus(b.Body.ProposerSlashings)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ProposerSlashings")
|
|
}
|
|
attesterSlashings, err := AttesterSlashingsToConsensus(b.Body.AttesterSlashings)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.AttesterSlashings")
|
|
}
|
|
atts, err := AttsToConsensus(b.Body.Attestations)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Attestations")
|
|
}
|
|
deposits, err := DepositsToConsensus(b.Body.Deposits)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Deposits")
|
|
}
|
|
exits, err := SignedExitsToConsensus(b.Body.VoluntaryExits)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.VoluntaryExits")
|
|
}
|
|
syncCommitteeBits, err := bytesutil.DecodeHexWithLength(b.Body.SyncAggregate.SyncCommitteeBits, fieldparams.SyncAggregateSyncCommitteeBytesLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeBits")
|
|
}
|
|
syncCommitteeSig, err := bytesutil.DecodeHexWithLength(b.Body.SyncAggregate.SyncCommitteeSignature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeSignature")
|
|
}
|
|
return ð.BeaconBlockAltair{
|
|
Slot: primitives.Slot(slot),
|
|
ProposerIndex: primitives.ValidatorIndex(proposerIndex),
|
|
ParentRoot: parentRoot,
|
|
StateRoot: stateRoot,
|
|
Body: ð.BeaconBlockBodyAltair{
|
|
RandaoReveal: randaoReveal,
|
|
Eth1Data: ð.Eth1Data{
|
|
DepositRoot: depositRoot,
|
|
DepositCount: depositCount,
|
|
BlockHash: blockHash,
|
|
},
|
|
Graffiti: graffiti,
|
|
ProposerSlashings: proposerSlashings,
|
|
AttesterSlashings: attesterSlashings,
|
|
Attestations: atts,
|
|
Deposits: deposits,
|
|
VoluntaryExits: exits,
|
|
SyncAggregate: ð.SyncAggregate{
|
|
SyncCommitteeBits: syncCommitteeBits,
|
|
SyncCommitteeSignature: syncCommitteeSig,
|
|
},
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func BeaconBlockAltairFromConsensus(b *eth.BeaconBlockAltair) *BeaconBlockAltair {
|
|
return &BeaconBlockAltair{
|
|
Slot: fmt.Sprintf("%d", b.Slot),
|
|
ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex),
|
|
ParentRoot: hexutil.Encode(b.ParentRoot),
|
|
StateRoot: hexutil.Encode(b.StateRoot),
|
|
Body: &BeaconBlockBodyAltair{
|
|
RandaoReveal: hexutil.Encode(b.Body.RandaoReveal),
|
|
Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data),
|
|
Graffiti: hexutil.Encode(b.Body.Graffiti),
|
|
ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings),
|
|
AttesterSlashings: AttesterSlashingsFromConsensus(b.Body.AttesterSlashings),
|
|
Attestations: AttsFromConsensus(b.Body.Attestations),
|
|
Deposits: DepositsFromConsensus(b.Body.Deposits),
|
|
VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits),
|
|
SyncAggregate: &SyncAggregate{
|
|
SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits),
|
|
SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature),
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
func SignedBeaconBlockAltairFromConsensus(b *eth.SignedBeaconBlockAltair) *SignedBeaconBlockAltair {
|
|
return &SignedBeaconBlockAltair{
|
|
Message: BeaconBlockAltairFromConsensus(b.Block),
|
|
Signature: hexutil.Encode(b.Signature),
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Bellatrix
|
|
// ----------------------------------------------------------------------------
|
|
|
|
func (b *SignedBeaconBlockBellatrix) ToGeneric() (*eth.GenericSignedBeaconBlock, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
|
|
sig, err := bytesutil.DecodeHexWithLength(b.Signature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Signature")
|
|
}
|
|
bl, err := b.Message.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Message")
|
|
}
|
|
block := ð.SignedBeaconBlockBellatrix{
|
|
Block: bl,
|
|
Signature: sig,
|
|
}
|
|
return ð.GenericSignedBeaconBlock{Block: ð.GenericSignedBeaconBlock_Bellatrix{Bellatrix: block}}, nil
|
|
}
|
|
|
|
func (b *BeaconBlockBellatrix) ToGeneric() (*eth.GenericBeaconBlock, error) {
|
|
block, err := b.ToConsensus()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return ð.GenericBeaconBlock{Block: ð.GenericBeaconBlock_Bellatrix{Bellatrix: block}}, nil
|
|
}
|
|
|
|
func (b *BeaconBlockBellatrix) ToConsensus() (*eth.BeaconBlockBellatrix, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
if b.Body == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body")
|
|
}
|
|
if b.Body.Eth1Data == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.Eth1Data")
|
|
}
|
|
if b.Body.SyncAggregate == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.SyncAggregate")
|
|
}
|
|
if b.Body.ExecutionPayload == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.ExecutionPayload")
|
|
}
|
|
|
|
slot, err := strconv.ParseUint(b.Slot, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Slot")
|
|
}
|
|
proposerIndex, err := strconv.ParseUint(b.ProposerIndex, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "ProposerIndex")
|
|
}
|
|
parentRoot, err := bytesutil.DecodeHexWithLength(b.ParentRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "ParentRoot")
|
|
}
|
|
stateRoot, err := bytesutil.DecodeHexWithLength(b.StateRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "StateRoot")
|
|
}
|
|
randaoReveal, err := bytesutil.DecodeHexWithLength(b.Body.RandaoReveal, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.RandaoReveal")
|
|
}
|
|
depositRoot, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.DepositRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositRoot")
|
|
}
|
|
depositCount, err := strconv.ParseUint(b.Body.Eth1Data.DepositCount, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositCount")
|
|
}
|
|
blockHash, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.BlockHash, common.HashLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.BlockHash")
|
|
}
|
|
graffiti, err := bytesutil.DecodeHexWithLength(b.Body.Graffiti, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Graffiti")
|
|
}
|
|
proposerSlashings, err := ProposerSlashingsToConsensus(b.Body.ProposerSlashings)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ProposerSlashings")
|
|
}
|
|
attesterSlashings, err := AttesterSlashingsToConsensus(b.Body.AttesterSlashings)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.AttesterSlashings")
|
|
}
|
|
atts, err := AttsToConsensus(b.Body.Attestations)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Attestations")
|
|
}
|
|
deposits, err := DepositsToConsensus(b.Body.Deposits)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Deposits")
|
|
}
|
|
exits, err := SignedExitsToConsensus(b.Body.VoluntaryExits)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.VoluntaryExits")
|
|
}
|
|
syncCommitteeBits, err := bytesutil.DecodeHexWithLength(b.Body.SyncAggregate.SyncCommitteeBits, fieldparams.SyncAggregateSyncCommitteeBytesLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeBits")
|
|
}
|
|
syncCommitteeSig, err := bytesutil.DecodeHexWithLength(b.Body.SyncAggregate.SyncCommitteeSignature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeSignature")
|
|
}
|
|
payload, err := b.Body.ExecutionPayload.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayload")
|
|
}
|
|
|
|
return ð.BeaconBlockBellatrix{
|
|
Slot: primitives.Slot(slot),
|
|
ProposerIndex: primitives.ValidatorIndex(proposerIndex),
|
|
ParentRoot: parentRoot,
|
|
StateRoot: stateRoot,
|
|
Body: ð.BeaconBlockBodyBellatrix{
|
|
RandaoReveal: randaoReveal,
|
|
Eth1Data: ð.Eth1Data{
|
|
DepositRoot: depositRoot,
|
|
DepositCount: depositCount,
|
|
BlockHash: blockHash,
|
|
},
|
|
Graffiti: graffiti,
|
|
ProposerSlashings: proposerSlashings,
|
|
AttesterSlashings: attesterSlashings,
|
|
Attestations: atts,
|
|
Deposits: deposits,
|
|
VoluntaryExits: exits,
|
|
SyncAggregate: ð.SyncAggregate{
|
|
SyncCommitteeBits: syncCommitteeBits,
|
|
SyncCommitteeSignature: syncCommitteeSig,
|
|
},
|
|
ExecutionPayload: payload,
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func (b *SignedBlindedBeaconBlockBellatrix) ToGeneric() (*eth.GenericSignedBeaconBlock, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
|
|
sig, err := bytesutil.DecodeHexWithLength(b.Signature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Signature")
|
|
}
|
|
bl, err := b.Message.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Message")
|
|
}
|
|
block := ð.SignedBlindedBeaconBlockBellatrix{
|
|
Block: bl,
|
|
Signature: sig,
|
|
}
|
|
return ð.GenericSignedBeaconBlock{Block: ð.GenericSignedBeaconBlock_BlindedBellatrix{BlindedBellatrix: block}, IsBlinded: true}, nil
|
|
}
|
|
|
|
func (b *BlindedBeaconBlockBellatrix) ToGeneric() (*eth.GenericBeaconBlock, error) {
|
|
block, err := b.ToConsensus()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return ð.GenericBeaconBlock{Block: ð.GenericBeaconBlock_BlindedBellatrix{BlindedBellatrix: block}, IsBlinded: true}, nil
|
|
}
|
|
|
|
func (b *BlindedBeaconBlockBellatrix) ToConsensus() (*eth.BlindedBeaconBlockBellatrix, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
if b.Body == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body")
|
|
}
|
|
if b.Body.Eth1Data == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.Eth1Data")
|
|
}
|
|
if b.Body.SyncAggregate == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.SyncAggregate")
|
|
}
|
|
if b.Body.ExecutionPayloadHeader == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.ExecutionPayloadHeader")
|
|
}
|
|
|
|
slot, err := strconv.ParseUint(b.Slot, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Slot")
|
|
}
|
|
proposerIndex, err := strconv.ParseUint(b.ProposerIndex, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "ProposerIndex")
|
|
}
|
|
parentRoot, err := bytesutil.DecodeHexWithLength(b.ParentRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "ParentRoot")
|
|
}
|
|
stateRoot, err := bytesutil.DecodeHexWithLength(b.StateRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "StateRoot")
|
|
}
|
|
randaoReveal, err := bytesutil.DecodeHexWithLength(b.Body.RandaoReveal, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.RandaoReveal")
|
|
}
|
|
depositRoot, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.DepositRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositRoot")
|
|
}
|
|
depositCount, err := strconv.ParseUint(b.Body.Eth1Data.DepositCount, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositCount")
|
|
}
|
|
blockHash, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.BlockHash, common.HashLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.BlockHash")
|
|
}
|
|
graffiti, err := bytesutil.DecodeHexWithLength(b.Body.Graffiti, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Graffiti")
|
|
}
|
|
proposerSlashings, err := ProposerSlashingsToConsensus(b.Body.ProposerSlashings)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ProposerSlashings")
|
|
}
|
|
attesterSlashings, err := AttesterSlashingsToConsensus(b.Body.AttesterSlashings)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.AttesterSlashings")
|
|
}
|
|
atts, err := AttsToConsensus(b.Body.Attestations)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Attestations")
|
|
}
|
|
deposits, err := DepositsToConsensus(b.Body.Deposits)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Deposits")
|
|
}
|
|
exits, err := SignedExitsToConsensus(b.Body.VoluntaryExits)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.VoluntaryExits")
|
|
}
|
|
syncCommitteeBits, err := bytesutil.DecodeHexWithLength(b.Body.SyncAggregate.SyncCommitteeBits, fieldparams.SyncAggregateSyncCommitteeBytesLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeBits")
|
|
}
|
|
syncCommitteeSig, err := bytesutil.DecodeHexWithLength(b.Body.SyncAggregate.SyncCommitteeSignature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeSignature")
|
|
}
|
|
payload, err := b.Body.ExecutionPayloadHeader.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader")
|
|
}
|
|
return ð.BlindedBeaconBlockBellatrix{
|
|
Slot: primitives.Slot(slot),
|
|
ProposerIndex: primitives.ValidatorIndex(proposerIndex),
|
|
ParentRoot: parentRoot,
|
|
StateRoot: stateRoot,
|
|
Body: ð.BlindedBeaconBlockBodyBellatrix{
|
|
RandaoReveal: randaoReveal,
|
|
Eth1Data: ð.Eth1Data{
|
|
DepositRoot: depositRoot,
|
|
DepositCount: depositCount,
|
|
BlockHash: blockHash,
|
|
},
|
|
Graffiti: graffiti,
|
|
ProposerSlashings: proposerSlashings,
|
|
AttesterSlashings: attesterSlashings,
|
|
Attestations: atts,
|
|
Deposits: deposits,
|
|
VoluntaryExits: exits,
|
|
SyncAggregate: ð.SyncAggregate{
|
|
SyncCommitteeBits: syncCommitteeBits,
|
|
SyncCommitteeSignature: syncCommitteeSig,
|
|
},
|
|
ExecutionPayloadHeader: payload,
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func BlindedBeaconBlockBellatrixFromConsensus(b *eth.BlindedBeaconBlockBellatrix) (*BlindedBeaconBlockBellatrix, error) {
|
|
payload, err := ExecutionPayloadHeaderFromConsensus(b.Body.ExecutionPayloadHeader)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &BlindedBeaconBlockBellatrix{
|
|
Slot: fmt.Sprintf("%d", b.Slot),
|
|
ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex),
|
|
ParentRoot: hexutil.Encode(b.ParentRoot),
|
|
StateRoot: hexutil.Encode(b.StateRoot),
|
|
Body: &BlindedBeaconBlockBodyBellatrix{
|
|
RandaoReveal: hexutil.Encode(b.Body.RandaoReveal),
|
|
Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data),
|
|
Graffiti: hexutil.Encode(b.Body.Graffiti),
|
|
ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings),
|
|
AttesterSlashings: AttesterSlashingsFromConsensus(b.Body.AttesterSlashings),
|
|
Attestations: AttsFromConsensus(b.Body.Attestations),
|
|
Deposits: DepositsFromConsensus(b.Body.Deposits),
|
|
VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits),
|
|
SyncAggregate: &SyncAggregate{
|
|
SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits),
|
|
SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature),
|
|
},
|
|
ExecutionPayloadHeader: payload,
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func SignedBlindedBeaconBlockBellatrixFromConsensus(b *eth.SignedBlindedBeaconBlockBellatrix) (*SignedBlindedBeaconBlockBellatrix, error) {
|
|
blindedBlock, err := BlindedBeaconBlockBellatrixFromConsensus(b.Block)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &SignedBlindedBeaconBlockBellatrix{
|
|
Message: blindedBlock,
|
|
Signature: hexutil.Encode(b.Signature),
|
|
}, nil
|
|
}
|
|
|
|
func BeaconBlockBellatrixFromConsensus(b *eth.BeaconBlockBellatrix) (*BeaconBlockBellatrix, error) {
|
|
payload, err := ExecutionPayloadFromConsensus(b.Body.ExecutionPayload)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &BeaconBlockBellatrix{
|
|
Slot: fmt.Sprintf("%d", b.Slot),
|
|
ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex),
|
|
ParentRoot: hexutil.Encode(b.ParentRoot),
|
|
StateRoot: hexutil.Encode(b.StateRoot),
|
|
Body: &BeaconBlockBodyBellatrix{
|
|
RandaoReveal: hexutil.Encode(b.Body.RandaoReveal),
|
|
Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data),
|
|
Graffiti: hexutil.Encode(b.Body.Graffiti),
|
|
ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings),
|
|
AttesterSlashings: AttesterSlashingsFromConsensus(b.Body.AttesterSlashings),
|
|
Attestations: AttsFromConsensus(b.Body.Attestations),
|
|
Deposits: DepositsFromConsensus(b.Body.Deposits),
|
|
VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits),
|
|
SyncAggregate: &SyncAggregate{
|
|
SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits),
|
|
SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature),
|
|
},
|
|
ExecutionPayload: payload,
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func SignedBeaconBlockBellatrixFromConsensus(b *eth.SignedBeaconBlockBellatrix) (*SignedBeaconBlockBellatrix, error) {
|
|
block, err := BeaconBlockBellatrixFromConsensus(b.Block)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &SignedBeaconBlockBellatrix{
|
|
Message: block,
|
|
Signature: hexutil.Encode(b.Signature),
|
|
}, nil
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Capella
|
|
// ----------------------------------------------------------------------------
|
|
|
|
func (b *SignedBeaconBlockCapella) ToGeneric() (*eth.GenericSignedBeaconBlock, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
|
|
sig, err := bytesutil.DecodeHexWithLength(b.Signature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Signature")
|
|
}
|
|
bl, err := b.Message.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Message")
|
|
}
|
|
block := ð.SignedBeaconBlockCapella{
|
|
Block: bl,
|
|
Signature: sig,
|
|
}
|
|
return ð.GenericSignedBeaconBlock{Block: ð.GenericSignedBeaconBlock_Capella{Capella: block}}, nil
|
|
}
|
|
|
|
func (b *BeaconBlockCapella) ToGeneric() (*eth.GenericBeaconBlock, error) {
|
|
block, err := b.ToConsensus()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return ð.GenericBeaconBlock{Block: ð.GenericBeaconBlock_Capella{Capella: block}}, nil
|
|
}
|
|
|
|
func (b *BeaconBlockCapella) ToConsensus() (*eth.BeaconBlockCapella, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
if b.Body == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body")
|
|
}
|
|
if b.Body.Eth1Data == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.Eth1Data")
|
|
}
|
|
if b.Body.SyncAggregate == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.SyncAggregate")
|
|
}
|
|
if b.Body.ExecutionPayload == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.ExecutionPayload")
|
|
}
|
|
|
|
slot, err := strconv.ParseUint(b.Slot, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Slot")
|
|
}
|
|
proposerIndex, err := strconv.ParseUint(b.ProposerIndex, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "ProposerIndex")
|
|
}
|
|
parentRoot, err := bytesutil.DecodeHexWithLength(b.ParentRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "ParentRoot")
|
|
}
|
|
stateRoot, err := bytesutil.DecodeHexWithLength(b.StateRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "StateRoot")
|
|
}
|
|
randaoReveal, err := bytesutil.DecodeHexWithLength(b.Body.RandaoReveal, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.RandaoReveal")
|
|
}
|
|
depositRoot, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.DepositRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositRoot")
|
|
}
|
|
depositCount, err := strconv.ParseUint(b.Body.Eth1Data.DepositCount, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositCount")
|
|
}
|
|
blockHash, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.BlockHash, common.HashLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.BlockHash")
|
|
}
|
|
graffiti, err := bytesutil.DecodeHexWithLength(b.Body.Graffiti, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Graffiti")
|
|
}
|
|
proposerSlashings, err := ProposerSlashingsToConsensus(b.Body.ProposerSlashings)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ProposerSlashings")
|
|
}
|
|
attesterSlashings, err := AttesterSlashingsToConsensus(b.Body.AttesterSlashings)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.AttesterSlashings")
|
|
}
|
|
atts, err := AttsToConsensus(b.Body.Attestations)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Attestations")
|
|
}
|
|
deposits, err := DepositsToConsensus(b.Body.Deposits)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Deposits")
|
|
}
|
|
exits, err := SignedExitsToConsensus(b.Body.VoluntaryExits)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.VoluntaryExits")
|
|
}
|
|
syncCommitteeBits, err := bytesutil.DecodeHexWithLength(b.Body.SyncAggregate.SyncCommitteeBits, fieldparams.SyncAggregateSyncCommitteeBytesLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeBits")
|
|
}
|
|
syncCommitteeSig, err := bytesutil.DecodeHexWithLength(b.Body.SyncAggregate.SyncCommitteeSignature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeSignature")
|
|
}
|
|
|
|
payload, err := b.Body.ExecutionPayload.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayload")
|
|
}
|
|
|
|
blsChanges, err := SignedBLSChangesToConsensus(b.Body.BLSToExecutionChanges)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.BLSToExecutionChanges")
|
|
}
|
|
|
|
return ð.BeaconBlockCapella{
|
|
Slot: primitives.Slot(slot),
|
|
ProposerIndex: primitives.ValidatorIndex(proposerIndex),
|
|
ParentRoot: parentRoot,
|
|
StateRoot: stateRoot,
|
|
Body: ð.BeaconBlockBodyCapella{
|
|
RandaoReveal: randaoReveal,
|
|
Eth1Data: ð.Eth1Data{
|
|
DepositRoot: depositRoot,
|
|
DepositCount: depositCount,
|
|
BlockHash: blockHash,
|
|
},
|
|
Graffiti: graffiti,
|
|
ProposerSlashings: proposerSlashings,
|
|
AttesterSlashings: attesterSlashings,
|
|
Attestations: atts,
|
|
Deposits: deposits,
|
|
VoluntaryExits: exits,
|
|
SyncAggregate: ð.SyncAggregate{
|
|
SyncCommitteeBits: syncCommitteeBits,
|
|
SyncCommitteeSignature: syncCommitteeSig,
|
|
},
|
|
ExecutionPayload: payload,
|
|
BlsToExecutionChanges: blsChanges,
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func (b *SignedBlindedBeaconBlockCapella) ToGeneric() (*eth.GenericSignedBeaconBlock, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
|
|
sig, err := bytesutil.DecodeHexWithLength(b.Signature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Signature")
|
|
}
|
|
bl, err := b.Message.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Message")
|
|
}
|
|
block := ð.SignedBlindedBeaconBlockCapella{
|
|
Block: bl,
|
|
Signature: sig,
|
|
}
|
|
return ð.GenericSignedBeaconBlock{Block: ð.GenericSignedBeaconBlock_BlindedCapella{BlindedCapella: block}, IsBlinded: true}, nil
|
|
}
|
|
|
|
func (b *BlindedBeaconBlockCapella) ToGeneric() (*eth.GenericBeaconBlock, error) {
|
|
block, err := b.ToConsensus()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return ð.GenericBeaconBlock{Block: ð.GenericBeaconBlock_BlindedCapella{BlindedCapella: block}, IsBlinded: true}, nil
|
|
}
|
|
|
|
func (b *BlindedBeaconBlockCapella) ToConsensus() (*eth.BlindedBeaconBlockCapella, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
if b.Body == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body")
|
|
}
|
|
if b.Body.Eth1Data == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.Eth1Data")
|
|
}
|
|
if b.Body.SyncAggregate == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.SyncAggregate")
|
|
}
|
|
if b.Body.ExecutionPayloadHeader == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.ExecutionPayloadHeader")
|
|
}
|
|
|
|
slot, err := strconv.ParseUint(b.Slot, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Slot")
|
|
}
|
|
proposerIndex, err := strconv.ParseUint(b.ProposerIndex, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "ProposerIndex")
|
|
}
|
|
parentRoot, err := bytesutil.DecodeHexWithLength(b.ParentRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "ParentRoot")
|
|
}
|
|
stateRoot, err := bytesutil.DecodeHexWithLength(b.StateRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "StateRoot")
|
|
}
|
|
randaoReveal, err := bytesutil.DecodeHexWithLength(b.Body.RandaoReveal, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.RandaoReveal")
|
|
}
|
|
depositRoot, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.DepositRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositRoot")
|
|
}
|
|
depositCount, err := strconv.ParseUint(b.Body.Eth1Data.DepositCount, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositCount")
|
|
}
|
|
blockHash, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.BlockHash, common.HashLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.BlockHash")
|
|
}
|
|
graffiti, err := bytesutil.DecodeHexWithLength(b.Body.Graffiti, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Graffiti")
|
|
}
|
|
proposerSlashings, err := ProposerSlashingsToConsensus(b.Body.ProposerSlashings)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ProposerSlashings")
|
|
}
|
|
attesterSlashings, err := AttesterSlashingsToConsensus(b.Body.AttesterSlashings)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.AttesterSlashings")
|
|
}
|
|
atts, err := AttsToConsensus(b.Body.Attestations)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Attestations")
|
|
}
|
|
deposits, err := DepositsToConsensus(b.Body.Deposits)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Deposits")
|
|
}
|
|
exits, err := SignedExitsToConsensus(b.Body.VoluntaryExits)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.VoluntaryExits")
|
|
}
|
|
syncCommitteeBits, err := bytesutil.DecodeHexWithLength(b.Body.SyncAggregate.SyncCommitteeBits, fieldparams.SyncAggregateSyncCommitteeBytesLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeBits")
|
|
}
|
|
syncCommitteeSig, err := bytesutil.DecodeHexWithLength(b.Body.SyncAggregate.SyncCommitteeSignature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeSignature")
|
|
}
|
|
|
|
payload, err := b.Body.ExecutionPayloadHeader.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader")
|
|
}
|
|
|
|
blsChanges, err := SignedBLSChangesToConsensus(b.Body.BLSToExecutionChanges)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.BLSToExecutionChanges")
|
|
}
|
|
|
|
return ð.BlindedBeaconBlockCapella{
|
|
Slot: primitives.Slot(slot),
|
|
ProposerIndex: primitives.ValidatorIndex(proposerIndex),
|
|
ParentRoot: parentRoot,
|
|
StateRoot: stateRoot,
|
|
Body: ð.BlindedBeaconBlockBodyCapella{
|
|
RandaoReveal: randaoReveal,
|
|
Eth1Data: ð.Eth1Data{
|
|
DepositRoot: depositRoot,
|
|
DepositCount: depositCount,
|
|
BlockHash: blockHash,
|
|
},
|
|
Graffiti: graffiti,
|
|
ProposerSlashings: proposerSlashings,
|
|
AttesterSlashings: attesterSlashings,
|
|
Attestations: atts,
|
|
Deposits: deposits,
|
|
VoluntaryExits: exits,
|
|
SyncAggregate: ð.SyncAggregate{
|
|
SyncCommitteeBits: syncCommitteeBits,
|
|
SyncCommitteeSignature: syncCommitteeSig,
|
|
},
|
|
ExecutionPayloadHeader: payload,
|
|
BlsToExecutionChanges: blsChanges,
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func BlindedBeaconBlockCapellaFromConsensus(b *eth.BlindedBeaconBlockCapella) (*BlindedBeaconBlockCapella, error) {
|
|
payload, err := ExecutionPayloadHeaderCapellaFromConsensus(b.Body.ExecutionPayloadHeader)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &BlindedBeaconBlockCapella{
|
|
Slot: fmt.Sprintf("%d", b.Slot),
|
|
ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex),
|
|
ParentRoot: hexutil.Encode(b.ParentRoot),
|
|
StateRoot: hexutil.Encode(b.StateRoot),
|
|
Body: &BlindedBeaconBlockBodyCapella{
|
|
RandaoReveal: hexutil.Encode(b.Body.RandaoReveal),
|
|
Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data),
|
|
Graffiti: hexutil.Encode(b.Body.Graffiti),
|
|
ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings),
|
|
AttesterSlashings: AttesterSlashingsFromConsensus(b.Body.AttesterSlashings),
|
|
Attestations: AttsFromConsensus(b.Body.Attestations),
|
|
Deposits: DepositsFromConsensus(b.Body.Deposits),
|
|
VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits),
|
|
SyncAggregate: &SyncAggregate{
|
|
SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits),
|
|
SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature),
|
|
},
|
|
ExecutionPayloadHeader: payload,
|
|
BLSToExecutionChanges: SignedBLSChangesFromConsensus(b.Body.BlsToExecutionChanges),
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func SignedBlindedBeaconBlockCapellaFromConsensus(b *eth.SignedBlindedBeaconBlockCapella) (*SignedBlindedBeaconBlockCapella, error) {
|
|
blindedBlock, err := BlindedBeaconBlockCapellaFromConsensus(b.Block)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &SignedBlindedBeaconBlockCapella{
|
|
Message: blindedBlock,
|
|
Signature: hexutil.Encode(b.Signature),
|
|
}, nil
|
|
}
|
|
|
|
func BeaconBlockCapellaFromConsensus(b *eth.BeaconBlockCapella) (*BeaconBlockCapella, error) {
|
|
payload, err := ExecutionPayloadCapellaFromConsensus(b.Body.ExecutionPayload)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &BeaconBlockCapella{
|
|
Slot: fmt.Sprintf("%d", b.Slot),
|
|
ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex),
|
|
ParentRoot: hexutil.Encode(b.ParentRoot),
|
|
StateRoot: hexutil.Encode(b.StateRoot),
|
|
Body: &BeaconBlockBodyCapella{
|
|
RandaoReveal: hexutil.Encode(b.Body.RandaoReveal),
|
|
Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data),
|
|
Graffiti: hexutil.Encode(b.Body.Graffiti),
|
|
ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings),
|
|
AttesterSlashings: AttesterSlashingsFromConsensus(b.Body.AttesterSlashings),
|
|
Attestations: AttsFromConsensus(b.Body.Attestations),
|
|
Deposits: DepositsFromConsensus(b.Body.Deposits),
|
|
VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits),
|
|
SyncAggregate: &SyncAggregate{
|
|
SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits),
|
|
SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature),
|
|
},
|
|
ExecutionPayload: payload,
|
|
BLSToExecutionChanges: SignedBLSChangesFromConsensus(b.Body.BlsToExecutionChanges),
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func SignedBeaconBlockCapellaFromConsensus(b *eth.SignedBeaconBlockCapella) (*SignedBeaconBlockCapella, error) {
|
|
block, err := BeaconBlockCapellaFromConsensus(b.Block)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &SignedBeaconBlockCapella{
|
|
Message: block,
|
|
Signature: hexutil.Encode(b.Signature),
|
|
}, nil
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Deneb
|
|
// ----------------------------------------------------------------------------
|
|
|
|
func (b *SignedBeaconBlockContentsDeneb) ToGeneric() (*eth.GenericSignedBeaconBlock, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
|
|
signedDenebBlock, err := b.SignedBlock.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "SignedBlock")
|
|
}
|
|
proofs := make([][]byte, len(b.KzgProofs))
|
|
for i, proof := range b.KzgProofs {
|
|
proofs[i], err = bytesutil.DecodeHexWithLength(proof, fieldparams.BLSPubkeyLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, fmt.Sprintf("KzgProofs[%d]", i))
|
|
}
|
|
}
|
|
blbs := make([][]byte, len(b.Blobs))
|
|
for i, blob := range b.Blobs {
|
|
blbs[i], err = bytesutil.DecodeHexWithLength(blob, fieldparams.BlobLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, fmt.Sprintf("Blobs[%d]", i))
|
|
}
|
|
}
|
|
blk := ð.SignedBeaconBlockContentsDeneb{
|
|
Block: signedDenebBlock,
|
|
KzgProofs: proofs,
|
|
Blobs: blbs,
|
|
}
|
|
return ð.GenericSignedBeaconBlock{Block: ð.GenericSignedBeaconBlock_Deneb{Deneb: blk}}, nil
|
|
}
|
|
|
|
func (b *SignedBeaconBlockContentsDeneb) ToUnsigned() *BeaconBlockContentsDeneb {
|
|
return &BeaconBlockContentsDeneb{
|
|
Block: b.SignedBlock.Message,
|
|
KzgProofs: b.KzgProofs,
|
|
Blobs: b.Blobs,
|
|
}
|
|
}
|
|
|
|
func (b *BeaconBlockContentsDeneb) ToGeneric() (*eth.GenericBeaconBlock, error) {
|
|
block, err := b.ToConsensus()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return ð.GenericBeaconBlock{Block: ð.GenericBeaconBlock_Deneb{Deneb: block}}, nil
|
|
}
|
|
|
|
func (b *BeaconBlockContentsDeneb) ToConsensus() (*eth.BeaconBlockContentsDeneb, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
|
|
denebBlock, err := b.Block.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Block")
|
|
}
|
|
proofs := make([][]byte, len(b.KzgProofs))
|
|
for i, proof := range b.KzgProofs {
|
|
proofs[i], err = bytesutil.DecodeHexWithLength(proof, fieldparams.BLSPubkeyLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, fmt.Sprintf("KzgProofs[%d]", i))
|
|
}
|
|
}
|
|
blbs := make([][]byte, len(b.Blobs))
|
|
for i, blob := range b.Blobs {
|
|
blbs[i], err = bytesutil.DecodeHexWithLength(blob, fieldparams.BlobLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, fmt.Sprintf("Blobs[%d]", i))
|
|
}
|
|
}
|
|
return ð.BeaconBlockContentsDeneb{
|
|
Block: denebBlock,
|
|
KzgProofs: proofs,
|
|
Blobs: blbs,
|
|
}, nil
|
|
}
|
|
|
|
func (b *BeaconBlockDeneb) ToConsensus() (*eth.BeaconBlockDeneb, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
if b.Body == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body")
|
|
}
|
|
if b.Body.Eth1Data == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.Eth1Data")
|
|
}
|
|
if b.Body.SyncAggregate == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.SyncAggregate")
|
|
}
|
|
if b.Body.ExecutionPayload == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.ExecutionPayload")
|
|
}
|
|
|
|
slot, err := strconv.ParseUint(b.Slot, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Slot")
|
|
}
|
|
proposerIndex, err := strconv.ParseUint(b.ProposerIndex, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "ProposerIndex")
|
|
}
|
|
parentRoot, err := bytesutil.DecodeHexWithLength(b.ParentRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "ParentRoot")
|
|
}
|
|
stateRoot, err := bytesutil.DecodeHexWithLength(b.StateRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "StateRoot")
|
|
}
|
|
randaoReveal, err := bytesutil.DecodeHexWithLength(b.Body.RandaoReveal, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.RandaoReveal")
|
|
}
|
|
depositRoot, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.DepositRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositRoot")
|
|
}
|
|
depositCount, err := strconv.ParseUint(b.Body.Eth1Data.DepositCount, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositCount")
|
|
}
|
|
blockHash, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.BlockHash, common.HashLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.BlockHash")
|
|
}
|
|
graffiti, err := bytesutil.DecodeHexWithLength(b.Body.Graffiti, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Graffiti")
|
|
}
|
|
proposerSlashings, err := ProposerSlashingsToConsensus(b.Body.ProposerSlashings)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ProposerSlashings")
|
|
}
|
|
attesterSlashings, err := AttesterSlashingsToConsensus(b.Body.AttesterSlashings)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.AttesterSlashings")
|
|
}
|
|
atts, err := AttsToConsensus(b.Body.Attestations)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Attestations")
|
|
}
|
|
deposits, err := DepositsToConsensus(b.Body.Deposits)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Deposits")
|
|
}
|
|
exits, err := SignedExitsToConsensus(b.Body.VoluntaryExits)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.VoluntaryExits")
|
|
}
|
|
syncCommitteeBits, err := bytesutil.DecodeHexWithLength(b.Body.SyncAggregate.SyncCommitteeBits, fieldparams.SyncAggregateSyncCommitteeBytesLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeBits")
|
|
}
|
|
syncCommitteeSig, err := bytesutil.DecodeHexWithLength(b.Body.SyncAggregate.SyncCommitteeSignature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeSignature")
|
|
}
|
|
payload, err := b.Body.ExecutionPayload.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayload")
|
|
}
|
|
blsChanges, err := SignedBLSChangesToConsensus(b.Body.BLSToExecutionChanges)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.BLSToExecutionChanges")
|
|
}
|
|
err = slice.VerifyMaxLength(b.Body.BlobKzgCommitments, fieldparams.MaxBlobCommitmentsPerBlock)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.BlobKzgCommitments")
|
|
}
|
|
blobKzgCommitments := make([][]byte, len(b.Body.BlobKzgCommitments))
|
|
for i, b := range b.Body.BlobKzgCommitments {
|
|
kzg, err := bytesutil.DecodeHexWithLength(b, fieldparams.BLSPubkeyLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, fmt.Sprintf("Body.BlobKzgCommitments[%d]", i))
|
|
}
|
|
blobKzgCommitments[i] = kzg
|
|
}
|
|
return ð.BeaconBlockDeneb{
|
|
Slot: primitives.Slot(slot),
|
|
ProposerIndex: primitives.ValidatorIndex(proposerIndex),
|
|
ParentRoot: parentRoot,
|
|
StateRoot: stateRoot,
|
|
Body: ð.BeaconBlockBodyDeneb{
|
|
RandaoReveal: randaoReveal,
|
|
Eth1Data: ð.Eth1Data{
|
|
DepositRoot: depositRoot,
|
|
DepositCount: depositCount,
|
|
BlockHash: blockHash,
|
|
},
|
|
Graffiti: graffiti,
|
|
ProposerSlashings: proposerSlashings,
|
|
AttesterSlashings: attesterSlashings,
|
|
Attestations: atts,
|
|
Deposits: deposits,
|
|
VoluntaryExits: exits,
|
|
SyncAggregate: ð.SyncAggregate{
|
|
SyncCommitteeBits: syncCommitteeBits,
|
|
SyncCommitteeSignature: syncCommitteeSig,
|
|
},
|
|
ExecutionPayload: payload,
|
|
BlsToExecutionChanges: blsChanges,
|
|
BlobKzgCommitments: blobKzgCommitments,
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func (b *SignedBeaconBlockDeneb) ToConsensus() (*eth.SignedBeaconBlockDeneb, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
|
|
sig, err := bytesutil.DecodeHexWithLength(b.Signature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Signature")
|
|
}
|
|
block, err := b.Message.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Message")
|
|
}
|
|
return ð.SignedBeaconBlockDeneb{
|
|
Block: block,
|
|
Signature: sig,
|
|
}, nil
|
|
}
|
|
|
|
func (b *SignedBlindedBeaconBlockDeneb) ToConsensus() (*eth.SignedBlindedBeaconBlockDeneb, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
|
|
sig, err := bytesutil.DecodeHexWithLength(b.Signature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Signature")
|
|
}
|
|
blindedBlock, err := b.Message.ToConsensus()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return ð.SignedBlindedBeaconBlockDeneb{
|
|
Message: blindedBlock,
|
|
Signature: sig,
|
|
}, nil
|
|
}
|
|
|
|
func (b *SignedBlindedBeaconBlockDeneb) ToGeneric() (*eth.GenericSignedBeaconBlock, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
sig, err := bytesutil.DecodeHexWithLength(b.Signature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Signature")
|
|
}
|
|
blindedBlock, err := b.Message.ToConsensus()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return ð.GenericSignedBeaconBlock{Block: ð.GenericSignedBeaconBlock_BlindedDeneb{BlindedDeneb: ð.SignedBlindedBeaconBlockDeneb{
|
|
Message: blindedBlock,
|
|
Signature: sig,
|
|
}}, IsBlinded: true}, nil
|
|
}
|
|
|
|
func (b *BlindedBeaconBlockDeneb) ToConsensus() (*eth.BlindedBeaconBlockDeneb, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
if b.Body == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body")
|
|
}
|
|
if b.Body.Eth1Data == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.Eth1Data")
|
|
}
|
|
if b.Body.SyncAggregate == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.SyncAggregate")
|
|
}
|
|
if b.Body.ExecutionPayloadHeader == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.ExecutionPayloadHeader")
|
|
}
|
|
|
|
slot, err := strconv.ParseUint(b.Slot, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Slot")
|
|
}
|
|
proposerIndex, err := strconv.ParseUint(b.ProposerIndex, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "ProposerIndex")
|
|
}
|
|
parentRoot, err := bytesutil.DecodeHexWithLength(b.ParentRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "ParentRoot")
|
|
}
|
|
stateRoot, err := bytesutil.DecodeHexWithLength(b.StateRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "StateRoot")
|
|
}
|
|
randaoReveal, err := bytesutil.DecodeHexWithLength(b.Body.RandaoReveal, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.RandaoReveal")
|
|
}
|
|
depositRoot, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.DepositRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositRoot")
|
|
}
|
|
depositCount, err := strconv.ParseUint(b.Body.Eth1Data.DepositCount, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositCount")
|
|
}
|
|
blockHash, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.BlockHash, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.BlockHash")
|
|
}
|
|
graffiti, err := bytesutil.DecodeHexWithLength(b.Body.Graffiti, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Graffiti")
|
|
}
|
|
proposerSlashings, err := ProposerSlashingsToConsensus(b.Body.ProposerSlashings)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ProposerSlashings")
|
|
}
|
|
attesterSlashings, err := AttesterSlashingsToConsensus(b.Body.AttesterSlashings)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.AttesterSlashings")
|
|
}
|
|
atts, err := AttsToConsensus(b.Body.Attestations)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Attestations")
|
|
}
|
|
deposits, err := DepositsToConsensus(b.Body.Deposits)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Deposits")
|
|
}
|
|
exits, err := SignedExitsToConsensus(b.Body.VoluntaryExits)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.VoluntaryExits")
|
|
}
|
|
syncCommitteeBits, err := bytesutil.DecodeHexWithLength(b.Body.SyncAggregate.SyncCommitteeBits, fieldparams.SyncAggregateSyncCommitteeBytesLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeBits")
|
|
}
|
|
syncCommitteeSig, err := bytesutil.DecodeHexWithLength(b.Body.SyncAggregate.SyncCommitteeSignature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeSignature")
|
|
}
|
|
payload, err := b.Body.ExecutionPayloadHeader.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader")
|
|
}
|
|
blsChanges, err := SignedBLSChangesToConsensus(b.Body.BLSToExecutionChanges)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.BLSToExecutionChanges")
|
|
}
|
|
err = slice.VerifyMaxLength(b.Body.BlobKzgCommitments, fieldparams.MaxBlobCommitmentsPerBlock)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.BlobKzgCommitments")
|
|
}
|
|
blobKzgCommitments := make([][]byte, len(b.Body.BlobKzgCommitments))
|
|
for i, b := range b.Body.BlobKzgCommitments {
|
|
kzg, err := bytesutil.DecodeHexWithLength(b, fieldparams.BLSPubkeyLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, fmt.Sprintf("Body.BlobKzgCommitments[%d]", i))
|
|
}
|
|
blobKzgCommitments[i] = kzg
|
|
}
|
|
|
|
return ð.BlindedBeaconBlockDeneb{
|
|
Slot: primitives.Slot(slot),
|
|
ProposerIndex: primitives.ValidatorIndex(proposerIndex),
|
|
ParentRoot: parentRoot,
|
|
StateRoot: stateRoot,
|
|
Body: ð.BlindedBeaconBlockBodyDeneb{
|
|
RandaoReveal: randaoReveal,
|
|
Eth1Data: ð.Eth1Data{
|
|
DepositRoot: depositRoot,
|
|
DepositCount: depositCount,
|
|
BlockHash: blockHash,
|
|
},
|
|
Graffiti: graffiti,
|
|
ProposerSlashings: proposerSlashings,
|
|
AttesterSlashings: attesterSlashings,
|
|
Attestations: atts,
|
|
Deposits: deposits,
|
|
VoluntaryExits: exits,
|
|
SyncAggregate: ð.SyncAggregate{
|
|
SyncCommitteeBits: syncCommitteeBits,
|
|
SyncCommitteeSignature: syncCommitteeSig,
|
|
},
|
|
ExecutionPayloadHeader: payload,
|
|
BlsToExecutionChanges: blsChanges,
|
|
BlobKzgCommitments: blobKzgCommitments,
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func (b *BlindedBeaconBlockDeneb) ToGeneric() (*eth.GenericBeaconBlock, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
|
|
blindedBlock, err := b.ToConsensus()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return ð.GenericBeaconBlock{Block: ð.GenericBeaconBlock_BlindedDeneb{BlindedDeneb: blindedBlock}, IsBlinded: true}, nil
|
|
}
|
|
|
|
func BeaconBlockContentsDenebFromConsensus(b *eth.BeaconBlockContentsDeneb) (*BeaconBlockContentsDeneb, error) {
|
|
block, err := BeaconBlockDenebFromConsensus(b.Block)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
proofs := make([]string, len(b.KzgProofs))
|
|
for i, proof := range b.KzgProofs {
|
|
proofs[i] = hexutil.Encode(proof)
|
|
}
|
|
blbs := make([]string, len(b.Blobs))
|
|
for i, blob := range b.Blobs {
|
|
blbs[i] = hexutil.Encode(blob)
|
|
}
|
|
return &BeaconBlockContentsDeneb{
|
|
Block: block,
|
|
KzgProofs: proofs,
|
|
Blobs: blbs,
|
|
}, nil
|
|
}
|
|
|
|
func SignedBeaconBlockContentsDenebFromConsensus(b *eth.SignedBeaconBlockContentsDeneb) (*SignedBeaconBlockContentsDeneb, error) {
|
|
block, err := SignedBeaconBlockDenebFromConsensus(b.Block)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
proofs := make([]string, len(b.KzgProofs))
|
|
for i, proof := range b.KzgProofs {
|
|
proofs[i] = hexutil.Encode(proof)
|
|
}
|
|
|
|
blbs := make([]string, len(b.Blobs))
|
|
for i, blob := range b.Blobs {
|
|
blbs[i] = hexutil.Encode(blob)
|
|
}
|
|
|
|
return &SignedBeaconBlockContentsDeneb{
|
|
SignedBlock: block,
|
|
KzgProofs: proofs,
|
|
Blobs: blbs,
|
|
}, nil
|
|
}
|
|
|
|
func BlindedBeaconBlockDenebFromConsensus(b *eth.BlindedBeaconBlockDeneb) (*BlindedBeaconBlockDeneb, error) {
|
|
blobKzgCommitments := make([]string, len(b.Body.BlobKzgCommitments))
|
|
for i := range b.Body.BlobKzgCommitments {
|
|
blobKzgCommitments[i] = hexutil.Encode(b.Body.BlobKzgCommitments[i])
|
|
}
|
|
payload, err := ExecutionPayloadHeaderDenebFromConsensus(b.Body.ExecutionPayloadHeader)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &BlindedBeaconBlockDeneb{
|
|
Slot: fmt.Sprintf("%d", b.Slot),
|
|
ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex),
|
|
ParentRoot: hexutil.Encode(b.ParentRoot),
|
|
StateRoot: hexutil.Encode(b.StateRoot),
|
|
Body: &BlindedBeaconBlockBodyDeneb{
|
|
RandaoReveal: hexutil.Encode(b.Body.RandaoReveal),
|
|
Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data),
|
|
Graffiti: hexutil.Encode(b.Body.Graffiti),
|
|
ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings),
|
|
AttesterSlashings: AttesterSlashingsFromConsensus(b.Body.AttesterSlashings),
|
|
Attestations: AttsFromConsensus(b.Body.Attestations),
|
|
Deposits: DepositsFromConsensus(b.Body.Deposits),
|
|
VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits),
|
|
SyncAggregate: &SyncAggregate{
|
|
SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits),
|
|
SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature),
|
|
},
|
|
ExecutionPayloadHeader: payload,
|
|
BLSToExecutionChanges: SignedBLSChangesFromConsensus(b.Body.BlsToExecutionChanges),
|
|
BlobKzgCommitments: blobKzgCommitments,
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func SignedBlindedBeaconBlockDenebFromConsensus(b *eth.SignedBlindedBeaconBlockDeneb) (*SignedBlindedBeaconBlockDeneb, error) {
|
|
block, err := BlindedBeaconBlockDenebFromConsensus(b.Message)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &SignedBlindedBeaconBlockDeneb{
|
|
Message: block,
|
|
Signature: hexutil.Encode(b.Signature),
|
|
}, nil
|
|
}
|
|
|
|
func BeaconBlockDenebFromConsensus(b *eth.BeaconBlockDeneb) (*BeaconBlockDeneb, error) {
|
|
blobKzgCommitments := make([]string, len(b.Body.BlobKzgCommitments))
|
|
for i := range b.Body.BlobKzgCommitments {
|
|
blobKzgCommitments[i] = hexutil.Encode(b.Body.BlobKzgCommitments[i])
|
|
}
|
|
payload, err := ExecutionPayloadDenebFromConsensus(b.Body.ExecutionPayload)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &BeaconBlockDeneb{
|
|
Slot: fmt.Sprintf("%d", b.Slot),
|
|
ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex),
|
|
ParentRoot: hexutil.Encode(b.ParentRoot),
|
|
StateRoot: hexutil.Encode(b.StateRoot),
|
|
Body: &BeaconBlockBodyDeneb{
|
|
RandaoReveal: hexutil.Encode(b.Body.RandaoReveal),
|
|
Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data),
|
|
Graffiti: hexutil.Encode(b.Body.Graffiti),
|
|
ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings),
|
|
AttesterSlashings: AttesterSlashingsFromConsensus(b.Body.AttesterSlashings),
|
|
Attestations: AttsFromConsensus(b.Body.Attestations),
|
|
Deposits: DepositsFromConsensus(b.Body.Deposits),
|
|
VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits),
|
|
SyncAggregate: &SyncAggregate{
|
|
SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits),
|
|
SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature),
|
|
},
|
|
ExecutionPayload: payload,
|
|
BLSToExecutionChanges: SignedBLSChangesFromConsensus(b.Body.BlsToExecutionChanges),
|
|
BlobKzgCommitments: blobKzgCommitments,
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func SignedBeaconBlockDenebFromConsensus(b *eth.SignedBeaconBlockDeneb) (*SignedBeaconBlockDeneb, error) {
|
|
block, err := BeaconBlockDenebFromConsensus(b.Block)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &SignedBeaconBlockDeneb{
|
|
Message: block,
|
|
Signature: hexutil.Encode(b.Signature),
|
|
}, nil
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Electra
|
|
// ----------------------------------------------------------------------------
|
|
|
|
func (b *SignedBeaconBlockContentsElectra) ToGeneric() (*eth.GenericSignedBeaconBlock, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
|
|
signedElectraBlock, err := b.SignedBlock.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "SignedBlock")
|
|
}
|
|
proofs := make([][]byte, len(b.KzgProofs))
|
|
for i, proof := range b.KzgProofs {
|
|
proofs[i], err = bytesutil.DecodeHexWithLength(proof, fieldparams.BLSPubkeyLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, fmt.Sprintf("KzgProofs[%d]", i))
|
|
}
|
|
}
|
|
blbs := make([][]byte, len(b.Blobs))
|
|
for i, blob := range b.Blobs {
|
|
blbs[i], err = bytesutil.DecodeHexWithLength(blob, fieldparams.BlobLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, fmt.Sprintf("Blobs[%d]", i))
|
|
}
|
|
}
|
|
blk := ð.SignedBeaconBlockContentsElectra{
|
|
Block: signedElectraBlock,
|
|
KzgProofs: proofs,
|
|
Blobs: blbs,
|
|
}
|
|
return ð.GenericSignedBeaconBlock{Block: ð.GenericSignedBeaconBlock_Electra{Electra: blk}}, nil
|
|
}
|
|
|
|
func (b *SignedBeaconBlockContentsElectra) ToUnsigned() *BeaconBlockContentsElectra {
|
|
return &BeaconBlockContentsElectra{
|
|
Block: b.SignedBlock.Message,
|
|
KzgProofs: b.KzgProofs,
|
|
Blobs: b.Blobs,
|
|
}
|
|
}
|
|
|
|
func (b *BeaconBlockContentsElectra) ToGeneric() (*eth.GenericBeaconBlock, error) {
|
|
block, err := b.ToConsensus()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return ð.GenericBeaconBlock{Block: ð.GenericBeaconBlock_Electra{Electra: block}}, nil
|
|
}
|
|
|
|
func (b *BeaconBlockContentsElectra) ToConsensus() (*eth.BeaconBlockContentsElectra, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
|
|
electraBlock, err := b.Block.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Block")
|
|
}
|
|
proofs := make([][]byte, len(b.KzgProofs))
|
|
for i, proof := range b.KzgProofs {
|
|
proofs[i], err = bytesutil.DecodeHexWithLength(proof, fieldparams.BLSPubkeyLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, fmt.Sprintf("KzgProofs[%d]", i))
|
|
}
|
|
}
|
|
blbs := make([][]byte, len(b.Blobs))
|
|
for i, blob := range b.Blobs {
|
|
blbs[i], err = bytesutil.DecodeHexWithLength(blob, fieldparams.BlobLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, fmt.Sprintf("Blobs[%d]", i))
|
|
}
|
|
}
|
|
return ð.BeaconBlockContentsElectra{
|
|
Block: electraBlock,
|
|
KzgProofs: proofs,
|
|
Blobs: blbs,
|
|
}, nil
|
|
}
|
|
|
|
func (b *BeaconBlockElectra) ToConsensus() (*eth.BeaconBlockElectra, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
if b.Body == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body")
|
|
}
|
|
if b.Body.Eth1Data == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.Eth1Data")
|
|
}
|
|
if b.Body.SyncAggregate == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.SyncAggregate")
|
|
}
|
|
if b.Body.ExecutionPayload == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.ExecutionPayload")
|
|
}
|
|
if b.Body.ExecutionRequests == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.ExecutionRequests")
|
|
}
|
|
|
|
slot, err := strconv.ParseUint(b.Slot, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Slot")
|
|
}
|
|
proposerIndex, err := strconv.ParseUint(b.ProposerIndex, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "ProposerIndex")
|
|
}
|
|
parentRoot, err := bytesutil.DecodeHexWithLength(b.ParentRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "ParentRoot")
|
|
}
|
|
stateRoot, err := bytesutil.DecodeHexWithLength(b.StateRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "StateRoot")
|
|
}
|
|
randaoReveal, err := bytesutil.DecodeHexWithLength(b.Body.RandaoReveal, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.RandaoReveal")
|
|
}
|
|
depositRoot, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.DepositRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositRoot")
|
|
}
|
|
depositCount, err := strconv.ParseUint(b.Body.Eth1Data.DepositCount, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositCount")
|
|
}
|
|
blockHash, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.BlockHash, common.HashLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.BlockHash")
|
|
}
|
|
graffiti, err := bytesutil.DecodeHexWithLength(b.Body.Graffiti, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Graffiti")
|
|
}
|
|
proposerSlashings, err := ProposerSlashingsToConsensus(b.Body.ProposerSlashings)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ProposerSlashings")
|
|
}
|
|
attesterSlashings, err := AttesterSlashingsElectraToConsensus(b.Body.AttesterSlashings)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.AttesterSlashings")
|
|
}
|
|
atts, err := AttsElectraToConsensus(b.Body.Attestations)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Attestations")
|
|
}
|
|
deposits, err := DepositsToConsensus(b.Body.Deposits)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Deposits")
|
|
}
|
|
exits, err := SignedExitsToConsensus(b.Body.VoluntaryExits)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.VoluntaryExits")
|
|
}
|
|
syncCommitteeBits, err := bytesutil.DecodeHexWithLength(b.Body.SyncAggregate.SyncCommitteeBits, fieldparams.SyncAggregateSyncCommitteeBytesLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeBits")
|
|
}
|
|
syncCommitteeSig, err := bytesutil.DecodeHexWithLength(b.Body.SyncAggregate.SyncCommitteeSignature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeSignature")
|
|
}
|
|
|
|
payload, err := b.Body.ExecutionPayload.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayload")
|
|
}
|
|
|
|
blsChanges, err := SignedBLSChangesToConsensus(b.Body.BLSToExecutionChanges)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.BLSToExecutionChanges")
|
|
}
|
|
err = slice.VerifyMaxLength(b.Body.BlobKzgCommitments, fieldparams.MaxBlobCommitmentsPerBlock)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.BlobKzgCommitments")
|
|
}
|
|
blobKzgCommitments := make([][]byte, len(b.Body.BlobKzgCommitments))
|
|
for i, b := range b.Body.BlobKzgCommitments {
|
|
kzg, err := bytesutil.DecodeHexWithLength(b, fieldparams.BLSPubkeyLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, fmt.Sprintf("Body.BlobKzgCommitments[%d]", i))
|
|
}
|
|
blobKzgCommitments[i] = kzg
|
|
}
|
|
|
|
requests, err := b.Body.ExecutionRequests.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionRequests")
|
|
}
|
|
|
|
return ð.BeaconBlockElectra{
|
|
Slot: primitives.Slot(slot),
|
|
ProposerIndex: primitives.ValidatorIndex(proposerIndex),
|
|
ParentRoot: parentRoot,
|
|
StateRoot: stateRoot,
|
|
Body: ð.BeaconBlockBodyElectra{
|
|
RandaoReveal: randaoReveal,
|
|
Eth1Data: ð.Eth1Data{
|
|
DepositRoot: depositRoot,
|
|
DepositCount: depositCount,
|
|
BlockHash: blockHash,
|
|
},
|
|
Graffiti: graffiti,
|
|
ProposerSlashings: proposerSlashings,
|
|
AttesterSlashings: attesterSlashings,
|
|
Attestations: atts,
|
|
Deposits: deposits,
|
|
VoluntaryExits: exits,
|
|
SyncAggregate: ð.SyncAggregate{
|
|
SyncCommitteeBits: syncCommitteeBits,
|
|
SyncCommitteeSignature: syncCommitteeSig,
|
|
},
|
|
ExecutionPayload: payload,
|
|
BlsToExecutionChanges: blsChanges,
|
|
BlobKzgCommitments: blobKzgCommitments,
|
|
ExecutionRequests: requests,
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func (b *SignedBeaconBlockElectra) ToConsensus() (*eth.SignedBeaconBlockElectra, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
|
|
sig, err := bytesutil.DecodeHexWithLength(b.Signature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Signature")
|
|
}
|
|
block, err := b.Message.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Message")
|
|
}
|
|
return ð.SignedBeaconBlockElectra{
|
|
Block: block,
|
|
Signature: sig,
|
|
}, nil
|
|
}
|
|
|
|
func (b *SignedBlindedBeaconBlockElectra) ToConsensus() (*eth.SignedBlindedBeaconBlockElectra, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
|
|
sig, err := bytesutil.DecodeHexWithLength(b.Signature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Signature")
|
|
}
|
|
blindedBlock, err := b.Message.ToConsensus()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return ð.SignedBlindedBeaconBlockElectra{
|
|
Message: blindedBlock,
|
|
Signature: sig,
|
|
}, nil
|
|
}
|
|
|
|
func (b *SignedBlindedBeaconBlockElectra) ToGeneric() (*eth.GenericSignedBeaconBlock, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
sig, err := bytesutil.DecodeHexWithLength(b.Signature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Signature")
|
|
}
|
|
blindedBlock, err := b.Message.ToConsensus()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return ð.GenericSignedBeaconBlock{Block: ð.GenericSignedBeaconBlock_BlindedElectra{BlindedElectra: ð.SignedBlindedBeaconBlockElectra{
|
|
Message: blindedBlock,
|
|
Signature: sig,
|
|
}}, IsBlinded: true}, nil
|
|
}
|
|
|
|
func (b *BlindedBeaconBlockElectra) ToConsensus() (*eth.BlindedBeaconBlockElectra, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
if b.Body == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body")
|
|
}
|
|
if b.Body.Eth1Data == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.Eth1Data")
|
|
}
|
|
if b.Body.SyncAggregate == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.SyncAggregate")
|
|
}
|
|
if b.Body.ExecutionPayloadHeader == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.ExecutionPayloadHeader")
|
|
}
|
|
if b.Body.ExecutionRequests == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.ExecutionRequests")
|
|
}
|
|
|
|
slot, err := strconv.ParseUint(b.Slot, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Slot")
|
|
}
|
|
proposerIndex, err := strconv.ParseUint(b.ProposerIndex, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "ProposerIndex")
|
|
}
|
|
parentRoot, err := bytesutil.DecodeHexWithLength(b.ParentRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "ParentRoot")
|
|
}
|
|
stateRoot, err := bytesutil.DecodeHexWithLength(b.StateRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "StateRoot")
|
|
}
|
|
randaoReveal, err := bytesutil.DecodeHexWithLength(b.Body.RandaoReveal, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.RandaoReveal")
|
|
}
|
|
depositRoot, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.DepositRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositRoot")
|
|
}
|
|
depositCount, err := strconv.ParseUint(b.Body.Eth1Data.DepositCount, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositCount")
|
|
}
|
|
blockHash, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.BlockHash, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.BlockHash")
|
|
}
|
|
graffiti, err := bytesutil.DecodeHexWithLength(b.Body.Graffiti, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Graffiti")
|
|
}
|
|
proposerSlashings, err := ProposerSlashingsToConsensus(b.Body.ProposerSlashings)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ProposerSlashings")
|
|
}
|
|
attesterSlashings, err := AttesterSlashingsElectraToConsensus(b.Body.AttesterSlashings)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.AttesterSlashings")
|
|
}
|
|
atts, err := AttsElectraToConsensus(b.Body.Attestations)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Attestations")
|
|
}
|
|
deposits, err := DepositsToConsensus(b.Body.Deposits)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Deposits")
|
|
}
|
|
exits, err := SignedExitsToConsensus(b.Body.VoluntaryExits)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.VoluntaryExits")
|
|
}
|
|
syncCommitteeBits, err := bytesutil.DecodeHexWithLength(b.Body.SyncAggregate.SyncCommitteeBits, fieldparams.SyncAggregateSyncCommitteeBytesLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeBits")
|
|
}
|
|
syncCommitteeSig, err := bytesutil.DecodeHexWithLength(b.Body.SyncAggregate.SyncCommitteeSignature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeSignature")
|
|
}
|
|
payloadParentHash, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.ParentHash, common.HashLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.ParentHash")
|
|
}
|
|
payloadFeeRecipient, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.FeeRecipient, fieldparams.FeeRecipientLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.FeeRecipient")
|
|
}
|
|
payloadStateRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.StateRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.StateRoot")
|
|
}
|
|
payloadReceiptsRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.ReceiptsRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.ReceiptsRoot")
|
|
}
|
|
payloadLogsBloom, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.LogsBloom, fieldparams.LogsBloomLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.LogsBloom")
|
|
}
|
|
payloadPrevRandao, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.PrevRandao, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.PrevRandao")
|
|
}
|
|
payloadBlockNumber, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.BlockNumber, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.BlockNumber")
|
|
}
|
|
payloadGasLimit, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.GasLimit, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.GasLimit")
|
|
}
|
|
payloadGasUsed, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.GasUsed, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.GasUsed")
|
|
}
|
|
payloadTimestamp, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.Timestamp, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.Timestamp")
|
|
}
|
|
payloadExtraData, err := bytesutil.DecodeHexWithMaxLength(b.Body.ExecutionPayloadHeader.ExtraData, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.ExtraData")
|
|
}
|
|
payloadBaseFeePerGas, err := bytesutil.Uint256ToSSZBytes(b.Body.ExecutionPayloadHeader.BaseFeePerGas)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.BaseFeePerGas")
|
|
}
|
|
payloadBlockHash, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.BlockHash, common.HashLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.BlockHash")
|
|
}
|
|
payloadTxsRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.TransactionsRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.TransactionsRoot")
|
|
}
|
|
payloadWithdrawalsRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.WithdrawalsRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.WithdrawalsRoot")
|
|
}
|
|
payloadBlobGasUsed, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.BlobGasUsed, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayload.BlobGasUsed")
|
|
}
|
|
payloadExcessBlobGas, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.ExcessBlobGas, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayload.ExcessBlobGas")
|
|
}
|
|
|
|
blsChanges, err := SignedBLSChangesToConsensus(b.Body.BLSToExecutionChanges)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.BLSToExecutionChanges")
|
|
}
|
|
err = slice.VerifyMaxLength(b.Body.BlobKzgCommitments, fieldparams.MaxBlobCommitmentsPerBlock)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.BlobKzgCommitments")
|
|
}
|
|
blobKzgCommitments := make([][]byte, len(b.Body.BlobKzgCommitments))
|
|
for i, b := range b.Body.BlobKzgCommitments {
|
|
kzg, err := bytesutil.DecodeHexWithLength(b, fieldparams.BLSPubkeyLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, fmt.Sprintf("Body.BlobKzgCommitments[%d]", i))
|
|
}
|
|
blobKzgCommitments[i] = kzg
|
|
}
|
|
|
|
requests, err := b.Body.ExecutionRequests.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionRequests")
|
|
}
|
|
|
|
return ð.BlindedBeaconBlockElectra{
|
|
Slot: primitives.Slot(slot),
|
|
ProposerIndex: primitives.ValidatorIndex(proposerIndex),
|
|
ParentRoot: parentRoot,
|
|
StateRoot: stateRoot,
|
|
Body: ð.BlindedBeaconBlockBodyElectra{
|
|
RandaoReveal: randaoReveal,
|
|
Eth1Data: ð.Eth1Data{
|
|
DepositRoot: depositRoot,
|
|
DepositCount: depositCount,
|
|
BlockHash: blockHash,
|
|
},
|
|
Graffiti: graffiti,
|
|
ProposerSlashings: proposerSlashings,
|
|
AttesterSlashings: attesterSlashings,
|
|
Attestations: atts,
|
|
Deposits: deposits,
|
|
VoluntaryExits: exits,
|
|
SyncAggregate: ð.SyncAggregate{
|
|
SyncCommitteeBits: syncCommitteeBits,
|
|
SyncCommitteeSignature: syncCommitteeSig,
|
|
},
|
|
ExecutionPayloadHeader: &enginev1.ExecutionPayloadHeaderDeneb{
|
|
ParentHash: payloadParentHash,
|
|
FeeRecipient: payloadFeeRecipient,
|
|
StateRoot: payloadStateRoot,
|
|
ReceiptsRoot: payloadReceiptsRoot,
|
|
LogsBloom: payloadLogsBloom,
|
|
PrevRandao: payloadPrevRandao,
|
|
BlockNumber: payloadBlockNumber,
|
|
GasLimit: payloadGasLimit,
|
|
GasUsed: payloadGasUsed,
|
|
Timestamp: payloadTimestamp,
|
|
ExtraData: payloadExtraData,
|
|
BaseFeePerGas: payloadBaseFeePerGas,
|
|
BlockHash: payloadBlockHash,
|
|
TransactionsRoot: payloadTxsRoot,
|
|
WithdrawalsRoot: payloadWithdrawalsRoot,
|
|
BlobGasUsed: payloadBlobGasUsed,
|
|
ExcessBlobGas: payloadExcessBlobGas,
|
|
},
|
|
BlsToExecutionChanges: blsChanges,
|
|
BlobKzgCommitments: blobKzgCommitments,
|
|
ExecutionRequests: requests,
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func (b *BlindedBeaconBlockElectra) ToGeneric() (*eth.GenericBeaconBlock, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
|
|
blindedBlock, err := b.ToConsensus()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return ð.GenericBeaconBlock{Block: ð.GenericBeaconBlock_BlindedElectra{BlindedElectra: blindedBlock}, IsBlinded: true}, nil
|
|
}
|
|
|
|
func SignedBeaconBlockContentsElectraFromConsensus(b *eth.SignedBeaconBlockContentsElectra) (*SignedBeaconBlockContentsElectra, error) {
|
|
block, err := SignedBeaconBlockElectraFromConsensus(b.Block)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
proofs := make([]string, len(b.KzgProofs))
|
|
for i, proof := range b.KzgProofs {
|
|
proofs[i] = hexutil.Encode(proof)
|
|
}
|
|
|
|
blbs := make([]string, len(b.Blobs))
|
|
for i, blob := range b.Blobs {
|
|
blbs[i] = hexutil.Encode(blob)
|
|
}
|
|
|
|
return &SignedBeaconBlockContentsElectra{
|
|
SignedBlock: block,
|
|
KzgProofs: proofs,
|
|
Blobs: blbs,
|
|
}, nil
|
|
}
|
|
|
|
func BlindedBeaconBlockElectraFromConsensus(b *eth.BlindedBeaconBlockElectra) (*BlindedBeaconBlockElectra, error) {
|
|
blobKzgCommitments := make([]string, len(b.Body.BlobKzgCommitments))
|
|
for i := range b.Body.BlobKzgCommitments {
|
|
blobKzgCommitments[i] = hexutil.Encode(b.Body.BlobKzgCommitments[i])
|
|
}
|
|
payload, err := ExecutionPayloadHeaderElectraFromConsensus(b.Body.ExecutionPayloadHeader)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &BlindedBeaconBlockElectra{
|
|
Slot: fmt.Sprintf("%d", b.Slot),
|
|
ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex),
|
|
ParentRoot: hexutil.Encode(b.ParentRoot),
|
|
StateRoot: hexutil.Encode(b.StateRoot),
|
|
Body: &BlindedBeaconBlockBodyElectra{
|
|
RandaoReveal: hexutil.Encode(b.Body.RandaoReveal),
|
|
Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data),
|
|
Graffiti: hexutil.Encode(b.Body.Graffiti),
|
|
ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings),
|
|
AttesterSlashings: AttesterSlashingsElectraFromConsensus(b.Body.AttesterSlashings),
|
|
Attestations: AttsElectraFromConsensus(b.Body.Attestations),
|
|
Deposits: DepositsFromConsensus(b.Body.Deposits),
|
|
VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits),
|
|
SyncAggregate: &SyncAggregate{
|
|
SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits),
|
|
SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature),
|
|
},
|
|
ExecutionPayloadHeader: payload,
|
|
BLSToExecutionChanges: SignedBLSChangesFromConsensus(b.Body.BlsToExecutionChanges),
|
|
BlobKzgCommitments: blobKzgCommitments,
|
|
ExecutionRequests: ExecutionRequestsFromConsensus(b.Body.ExecutionRequests),
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func BeaconBlockContentsElectraFromConsensus(b *eth.BeaconBlockContentsElectra) (*BeaconBlockContentsElectra, error) {
|
|
block, err := BeaconBlockElectraFromConsensus(b.Block)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
proofs := make([]string, len(b.KzgProofs))
|
|
for i, proof := range b.KzgProofs {
|
|
proofs[i] = hexutil.Encode(proof)
|
|
}
|
|
blbs := make([]string, len(b.Blobs))
|
|
for i, blob := range b.Blobs {
|
|
blbs[i] = hexutil.Encode(blob)
|
|
}
|
|
return &BeaconBlockContentsElectra{
|
|
Block: block,
|
|
KzgProofs: proofs,
|
|
Blobs: blbs,
|
|
}, nil
|
|
}
|
|
|
|
func SignedBlindedBeaconBlockElectraFromConsensus(b *eth.SignedBlindedBeaconBlockElectra) (*SignedBlindedBeaconBlockElectra, error) {
|
|
block, err := BlindedBeaconBlockElectraFromConsensus(b.Message)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &SignedBlindedBeaconBlockElectra{
|
|
Message: block,
|
|
Signature: hexutil.Encode(b.Signature),
|
|
}, nil
|
|
}
|
|
|
|
func BeaconBlockElectraFromConsensus(b *eth.BeaconBlockElectra) (*BeaconBlockElectra, error) {
|
|
payload, err := ExecutionPayloadElectraFromConsensus(b.Body.ExecutionPayload)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
blobKzgCommitments := make([]string, len(b.Body.BlobKzgCommitments))
|
|
for i := range b.Body.BlobKzgCommitments {
|
|
blobKzgCommitments[i] = hexutil.Encode(b.Body.BlobKzgCommitments[i])
|
|
}
|
|
|
|
return &BeaconBlockElectra{
|
|
Slot: fmt.Sprintf("%d", b.Slot),
|
|
ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex),
|
|
ParentRoot: hexutil.Encode(b.ParentRoot),
|
|
StateRoot: hexutil.Encode(b.StateRoot),
|
|
Body: &BeaconBlockBodyElectra{
|
|
RandaoReveal: hexutil.Encode(b.Body.RandaoReveal),
|
|
Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data),
|
|
Graffiti: hexutil.Encode(b.Body.Graffiti),
|
|
ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings),
|
|
AttesterSlashings: AttesterSlashingsElectraFromConsensus(b.Body.AttesterSlashings),
|
|
Attestations: AttsElectraFromConsensus(b.Body.Attestations),
|
|
Deposits: DepositsFromConsensus(b.Body.Deposits),
|
|
VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits),
|
|
SyncAggregate: &SyncAggregate{
|
|
SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits),
|
|
SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature),
|
|
},
|
|
ExecutionPayload: payload,
|
|
BLSToExecutionChanges: SignedBLSChangesFromConsensus(b.Body.BlsToExecutionChanges),
|
|
BlobKzgCommitments: blobKzgCommitments,
|
|
ExecutionRequests: ExecutionRequestsFromConsensus(b.Body.ExecutionRequests),
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func SignedBeaconBlockElectraFromConsensus(b *eth.SignedBeaconBlockElectra) (*SignedBeaconBlockElectra, error) {
|
|
block, err := BeaconBlockElectraFromConsensus(b.Block)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &SignedBeaconBlockElectra{
|
|
Message: block,
|
|
Signature: hexutil.Encode(b.Signature),
|
|
}, nil
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Fulu
|
|
// ----------------------------------------------------------------------------
|
|
|
|
func (b *SignedBeaconBlockContentsFulu) ToGeneric() (*eth.GenericSignedBeaconBlock, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
|
|
signedFuluBlock, err := b.SignedBlock.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "SignedBlock")
|
|
}
|
|
proofs := make([][]byte, len(b.KzgProofs))
|
|
for i, proof := range b.KzgProofs {
|
|
proofs[i], err = bytesutil.DecodeHexWithLength(proof, fieldparams.BLSPubkeyLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, fmt.Sprintf("KzgProofs[%d]", i))
|
|
}
|
|
}
|
|
blbs := make([][]byte, len(b.Blobs))
|
|
for i, blob := range b.Blobs {
|
|
blbs[i], err = bytesutil.DecodeHexWithLength(blob, fieldparams.BlobLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, fmt.Sprintf("Blobs[%d]", i))
|
|
}
|
|
}
|
|
blk := ð.SignedBeaconBlockContentsFulu{
|
|
Block: signedFuluBlock,
|
|
KzgProofs: proofs,
|
|
Blobs: blbs,
|
|
}
|
|
return ð.GenericSignedBeaconBlock{Block: ð.GenericSignedBeaconBlock_Fulu{Fulu: blk}}, nil
|
|
}
|
|
|
|
func (b *SignedBeaconBlockContentsFulu) ToUnsigned() *BeaconBlockContentsFulu {
|
|
return &BeaconBlockContentsFulu{
|
|
Block: b.SignedBlock.Message,
|
|
KzgProofs: b.KzgProofs,
|
|
Blobs: b.Blobs,
|
|
}
|
|
}
|
|
|
|
func (b *BeaconBlockContentsFulu) ToGeneric() (*eth.GenericBeaconBlock, error) {
|
|
block, err := b.ToConsensus()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return ð.GenericBeaconBlock{Block: ð.GenericBeaconBlock_Fulu{Fulu: block}}, nil
|
|
}
|
|
|
|
func (b *BeaconBlockContentsFulu) ToConsensus() (*eth.BeaconBlockContentsFulu, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
|
|
fuluBlock, err := b.Block.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Block")
|
|
}
|
|
proofs := make([][]byte, len(b.KzgProofs))
|
|
for i, proof := range b.KzgProofs {
|
|
proofs[i], err = bytesutil.DecodeHexWithLength(proof, fieldparams.BLSPubkeyLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, fmt.Sprintf("KzgProofs[%d]", i))
|
|
}
|
|
}
|
|
blbs := make([][]byte, len(b.Blobs))
|
|
for i, blob := range b.Blobs {
|
|
blbs[i], err = bytesutil.DecodeHexWithLength(blob, fieldparams.BlobLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, fmt.Sprintf("Blobs[%d]", i))
|
|
}
|
|
}
|
|
return ð.BeaconBlockContentsFulu{
|
|
Block: fuluBlock,
|
|
KzgProofs: proofs,
|
|
Blobs: blbs,
|
|
}, nil
|
|
}
|
|
|
|
func (b *SignedBeaconBlockFulu) ToConsensus() (*eth.SignedBeaconBlockFulu, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
|
|
sig, err := bytesutil.DecodeHexWithLength(b.Signature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Signature")
|
|
}
|
|
block, err := b.Message.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Message")
|
|
}
|
|
return ð.SignedBeaconBlockFulu{
|
|
Block: block,
|
|
Signature: sig,
|
|
}, nil
|
|
}
|
|
|
|
func (b *SignedBlindedBeaconBlockFulu) ToConsensus() (*eth.SignedBlindedBeaconBlockFulu, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
|
|
sig, err := bytesutil.DecodeHexWithLength(b.Signature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Signature")
|
|
}
|
|
blindedBlock, err := b.Message.ToConsensus()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return ð.SignedBlindedBeaconBlockFulu{
|
|
Message: blindedBlock,
|
|
Signature: sig,
|
|
}, nil
|
|
}
|
|
|
|
func (b *SignedBlindedBeaconBlockFulu) ToGeneric() (*eth.GenericSignedBeaconBlock, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
sig, err := bytesutil.DecodeHexWithLength(b.Signature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Signature")
|
|
}
|
|
blindedBlock, err := b.Message.ToConsensus()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return ð.GenericSignedBeaconBlock{Block: ð.GenericSignedBeaconBlock_BlindedFulu{BlindedFulu: ð.SignedBlindedBeaconBlockFulu{
|
|
Message: blindedBlock,
|
|
Signature: sig,
|
|
}}, IsBlinded: true}, nil
|
|
}
|
|
|
|
func (b *BlindedBeaconBlockFulu) ToConsensus() (*eth.BlindedBeaconBlockFulu, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
if b.Body == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body")
|
|
}
|
|
if b.Body.Eth1Data == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.Eth1Data")
|
|
}
|
|
if b.Body.SyncAggregate == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.SyncAggregate")
|
|
}
|
|
if b.Body.ExecutionPayloadHeader == nil {
|
|
return nil, server.NewDecodeError(errNilValue, "Body.ExecutionPayloadHeader")
|
|
}
|
|
|
|
slot, err := strconv.ParseUint(b.Slot, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Slot")
|
|
}
|
|
proposerIndex, err := strconv.ParseUint(b.ProposerIndex, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "ProposerIndex")
|
|
}
|
|
parentRoot, err := bytesutil.DecodeHexWithLength(b.ParentRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "ParentRoot")
|
|
}
|
|
stateRoot, err := bytesutil.DecodeHexWithLength(b.StateRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "StateRoot")
|
|
}
|
|
randaoReveal, err := bytesutil.DecodeHexWithLength(b.Body.RandaoReveal, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.RandaoReveal")
|
|
}
|
|
depositRoot, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.DepositRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositRoot")
|
|
}
|
|
depositCount, err := strconv.ParseUint(b.Body.Eth1Data.DepositCount, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.DepositCount")
|
|
}
|
|
blockHash, err := bytesutil.DecodeHexWithLength(b.Body.Eth1Data.BlockHash, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Eth1Data.BlockHash")
|
|
}
|
|
graffiti, err := bytesutil.DecodeHexWithLength(b.Body.Graffiti, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Graffiti")
|
|
}
|
|
proposerSlashings, err := ProposerSlashingsToConsensus(b.Body.ProposerSlashings)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ProposerSlashings")
|
|
}
|
|
attesterSlashings, err := AttesterSlashingsElectraToConsensus(b.Body.AttesterSlashings)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.AttesterSlashings")
|
|
}
|
|
atts, err := AttsElectraToConsensus(b.Body.Attestations)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Attestations")
|
|
}
|
|
deposits, err := DepositsToConsensus(b.Body.Deposits)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.Deposits")
|
|
}
|
|
exits, err := SignedExitsToConsensus(b.Body.VoluntaryExits)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.VoluntaryExits")
|
|
}
|
|
syncCommitteeBits, err := bytesutil.DecodeHexWithLength(b.Body.SyncAggregate.SyncCommitteeBits, fieldparams.SyncAggregateSyncCommitteeBytesLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeBits")
|
|
}
|
|
syncCommitteeSig, err := bytesutil.DecodeHexWithLength(b.Body.SyncAggregate.SyncCommitteeSignature, fieldparams.BLSSignatureLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.SyncAggregate.SyncCommitteeSignature")
|
|
}
|
|
payloadParentHash, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.ParentHash, common.HashLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.ParentHash")
|
|
}
|
|
payloadFeeRecipient, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.FeeRecipient, fieldparams.FeeRecipientLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.FeeRecipient")
|
|
}
|
|
payloadStateRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.StateRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.StateRoot")
|
|
}
|
|
payloadReceiptsRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.ReceiptsRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.ReceiptsRoot")
|
|
}
|
|
payloadLogsBloom, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.LogsBloom, fieldparams.LogsBloomLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.LogsBloom")
|
|
}
|
|
payloadPrevRandao, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.PrevRandao, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.PrevRandao")
|
|
}
|
|
payloadBlockNumber, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.BlockNumber, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.BlockNumber")
|
|
}
|
|
payloadGasLimit, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.GasLimit, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.GasLimit")
|
|
}
|
|
payloadGasUsed, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.GasUsed, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.GasUsed")
|
|
}
|
|
payloadTimestamp, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.Timestamp, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.Timestamp")
|
|
}
|
|
payloadExtraData, err := bytesutil.DecodeHexWithMaxLength(b.Body.ExecutionPayloadHeader.ExtraData, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.ExtraData")
|
|
}
|
|
payloadBaseFeePerGas, err := bytesutil.Uint256ToSSZBytes(b.Body.ExecutionPayloadHeader.BaseFeePerGas)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.BaseFeePerGas")
|
|
}
|
|
payloadBlockHash, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.BlockHash, common.HashLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.BlockHash")
|
|
}
|
|
payloadTxsRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.TransactionsRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.TransactionsRoot")
|
|
}
|
|
payloadWithdrawalsRoot, err := bytesutil.DecodeHexWithLength(b.Body.ExecutionPayloadHeader.WithdrawalsRoot, fieldparams.RootLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayloadHeader.WithdrawalsRoot")
|
|
}
|
|
payloadBlobGasUsed, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.BlobGasUsed, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayload.BlobGasUsed")
|
|
}
|
|
payloadExcessBlobGas, err := strconv.ParseUint(b.Body.ExecutionPayloadHeader.ExcessBlobGas, 10, 64)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.ExecutionPayload.ExcessBlobGas")
|
|
}
|
|
if b.Body.ExecutionRequests == nil {
|
|
return nil, server.NewDecodeError(errors.New("nil execution requests"), "Body.ExecutionRequests")
|
|
}
|
|
depositRequests := make([]*enginev1.DepositRequest, len(b.Body.ExecutionRequests.Deposits))
|
|
for i, d := range b.Body.ExecutionRequests.Deposits {
|
|
depositRequests[i], err = d.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, fmt.Sprintf("Body.ExecutionRequests.Deposits[%d]", i))
|
|
}
|
|
}
|
|
|
|
withdrawalRequests := make([]*enginev1.WithdrawalRequest, len(b.Body.ExecutionRequests.Withdrawals))
|
|
for i, w := range b.Body.ExecutionRequests.Withdrawals {
|
|
withdrawalRequests[i], err = w.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, fmt.Sprintf("Body.ExecutionRequests.Withdrawals[%d]", i))
|
|
}
|
|
}
|
|
|
|
consolidationRequests := make([]*enginev1.ConsolidationRequest, len(b.Body.ExecutionRequests.Consolidations))
|
|
for i, c := range b.Body.ExecutionRequests.Consolidations {
|
|
consolidationRequests[i], err = c.ToConsensus()
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, fmt.Sprintf("Body.ExecutionRequests.Consolidations[%d]", i))
|
|
}
|
|
}
|
|
|
|
blsChanges, err := SignedBLSChangesToConsensus(b.Body.BLSToExecutionChanges)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.BLSToExecutionChanges")
|
|
}
|
|
err = slice.VerifyMaxLength(b.Body.BlobKzgCommitments, fieldparams.MaxBlobCommitmentsPerBlock)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, "Body.BlobKzgCommitments")
|
|
}
|
|
blobKzgCommitments := make([][]byte, len(b.Body.BlobKzgCommitments))
|
|
for i, b := range b.Body.BlobKzgCommitments {
|
|
kzg, err := bytesutil.DecodeHexWithLength(b, fieldparams.BLSPubkeyLength)
|
|
if err != nil {
|
|
return nil, server.NewDecodeError(err, fmt.Sprintf("Body.BlobKzgCommitments[%d]", i))
|
|
}
|
|
blobKzgCommitments[i] = kzg
|
|
}
|
|
|
|
return ð.BlindedBeaconBlockFulu{
|
|
Slot: primitives.Slot(slot),
|
|
ProposerIndex: primitives.ValidatorIndex(proposerIndex),
|
|
ParentRoot: parentRoot,
|
|
StateRoot: stateRoot,
|
|
Body: ð.BlindedBeaconBlockBodyElectra{
|
|
RandaoReveal: randaoReveal,
|
|
Eth1Data: ð.Eth1Data{
|
|
DepositRoot: depositRoot,
|
|
DepositCount: depositCount,
|
|
BlockHash: blockHash,
|
|
},
|
|
Graffiti: graffiti,
|
|
ProposerSlashings: proposerSlashings,
|
|
AttesterSlashings: attesterSlashings,
|
|
Attestations: atts,
|
|
Deposits: deposits,
|
|
VoluntaryExits: exits,
|
|
SyncAggregate: ð.SyncAggregate{
|
|
SyncCommitteeBits: syncCommitteeBits,
|
|
SyncCommitteeSignature: syncCommitteeSig,
|
|
},
|
|
ExecutionPayloadHeader: &enginev1.ExecutionPayloadHeaderDeneb{
|
|
ParentHash: payloadParentHash,
|
|
FeeRecipient: payloadFeeRecipient,
|
|
StateRoot: payloadStateRoot,
|
|
ReceiptsRoot: payloadReceiptsRoot,
|
|
LogsBloom: payloadLogsBloom,
|
|
PrevRandao: payloadPrevRandao,
|
|
BlockNumber: payloadBlockNumber,
|
|
GasLimit: payloadGasLimit,
|
|
GasUsed: payloadGasUsed,
|
|
Timestamp: payloadTimestamp,
|
|
ExtraData: payloadExtraData,
|
|
BaseFeePerGas: payloadBaseFeePerGas,
|
|
BlockHash: payloadBlockHash,
|
|
TransactionsRoot: payloadTxsRoot,
|
|
WithdrawalsRoot: payloadWithdrawalsRoot,
|
|
BlobGasUsed: payloadBlobGasUsed,
|
|
ExcessBlobGas: payloadExcessBlobGas,
|
|
},
|
|
BlsToExecutionChanges: blsChanges,
|
|
BlobKzgCommitments: blobKzgCommitments,
|
|
ExecutionRequests: &enginev1.ExecutionRequests{
|
|
Deposits: depositRequests,
|
|
Withdrawals: withdrawalRequests,
|
|
Consolidations: consolidationRequests,
|
|
},
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func (b *BlindedBeaconBlockFulu) ToGeneric() (*eth.GenericBeaconBlock, error) {
|
|
if b == nil {
|
|
return nil, errNilValue
|
|
}
|
|
|
|
blindedBlock, err := b.ToConsensus()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return ð.GenericBeaconBlock{Block: ð.GenericBeaconBlock_BlindedFulu{BlindedFulu: blindedBlock}, IsBlinded: true}, nil
|
|
}
|
|
|
|
func BeaconBlockContentsFuluFromConsensus(b *eth.BeaconBlockContentsFulu) (*BeaconBlockContentsFulu, error) {
|
|
block, err := BeaconBlockFuluFromConsensus(b.Block)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
proofs := make([]string, len(b.KzgProofs))
|
|
for i, proof := range b.KzgProofs {
|
|
proofs[i] = hexutil.Encode(proof)
|
|
}
|
|
blbs := make([]string, len(b.Blobs))
|
|
for i, blob := range b.Blobs {
|
|
blbs[i] = hexutil.Encode(blob)
|
|
}
|
|
return &BeaconBlockContentsFulu{
|
|
Block: block,
|
|
KzgProofs: proofs,
|
|
Blobs: blbs,
|
|
}, nil
|
|
}
|
|
|
|
func SignedBeaconBlockContentsFuluFromConsensus(b *eth.SignedBeaconBlockContentsFulu) (*SignedBeaconBlockContentsFulu, error) {
|
|
block, err := SignedBeaconBlockFuluFromConsensus(b.Block)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
proofs := make([]string, len(b.KzgProofs))
|
|
for i, proof := range b.KzgProofs {
|
|
proofs[i] = hexutil.Encode(proof)
|
|
}
|
|
|
|
blbs := make([]string, len(b.Blobs))
|
|
for i, blob := range b.Blobs {
|
|
blbs[i] = hexutil.Encode(blob)
|
|
}
|
|
|
|
return &SignedBeaconBlockContentsFulu{
|
|
SignedBlock: block,
|
|
KzgProofs: proofs,
|
|
Blobs: blbs,
|
|
}, nil
|
|
}
|
|
|
|
func BlindedBeaconBlockFuluFromConsensus(b *eth.BlindedBeaconBlockFulu) (*BlindedBeaconBlockFulu, error) {
|
|
blobKzgCommitments := make([]string, len(b.Body.BlobKzgCommitments))
|
|
for i := range b.Body.BlobKzgCommitments {
|
|
blobKzgCommitments[i] = hexutil.Encode(b.Body.BlobKzgCommitments[i])
|
|
}
|
|
payload, err := ExecutionPayloadHeaderFuluFromConsensus(b.Body.ExecutionPayloadHeader)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &BlindedBeaconBlockFulu{
|
|
Slot: fmt.Sprintf("%d", b.Slot),
|
|
ProposerIndex: fmt.Sprintf("%d", b.ProposerIndex),
|
|
ParentRoot: hexutil.Encode(b.ParentRoot),
|
|
StateRoot: hexutil.Encode(b.StateRoot),
|
|
Body: &BlindedBeaconBlockBodyElectra{
|
|
RandaoReveal: hexutil.Encode(b.Body.RandaoReveal),
|
|
Eth1Data: Eth1DataFromConsensus(b.Body.Eth1Data),
|
|
Graffiti: hexutil.Encode(b.Body.Graffiti),
|
|
ProposerSlashings: ProposerSlashingsFromConsensus(b.Body.ProposerSlashings),
|
|
AttesterSlashings: AttesterSlashingsElectraFromConsensus(b.Body.AttesterSlashings),
|
|
Attestations: AttsElectraFromConsensus(b.Body.Attestations),
|
|
Deposits: DepositsFromConsensus(b.Body.Deposits),
|
|
VoluntaryExits: SignedExitsFromConsensus(b.Body.VoluntaryExits),
|
|
SyncAggregate: &SyncAggregate{
|
|
SyncCommitteeBits: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeBits),
|
|
SyncCommitteeSignature: hexutil.Encode(b.Body.SyncAggregate.SyncCommitteeSignature),
|
|
},
|
|
ExecutionPayloadHeader: payload,
|
|
BLSToExecutionChanges: SignedBLSChangesFromConsensus(b.Body.BlsToExecutionChanges),
|
|
BlobKzgCommitments: blobKzgCommitments,
|
|
ExecutionRequests: ExecutionRequestsFromConsensus(b.Body.ExecutionRequests),
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func SignedBlindedBeaconBlockFuluFromConsensus(b *eth.SignedBlindedBeaconBlockFulu) (*SignedBlindedBeaconBlockFulu, error) {
|
|
block, err := BlindedBeaconBlockFuluFromConsensus(b.Message)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &SignedBlindedBeaconBlockFulu{
|
|
Message: block,
|
|
Signature: hexutil.Encode(b.Signature),
|
|
}, nil
|
|
}
|
|
|
|
func SignedBeaconBlockFuluFromConsensus(b *eth.SignedBeaconBlockFulu) (*SignedBeaconBlockFulu, error) {
|
|
block, err := BeaconBlockFuluFromConsensus(b.Block)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &SignedBeaconBlockFulu{
|
|
Message: block,
|
|
Signature: hexutil.Encode(b.Signature),
|
|
}, nil
|
|
}
|