mirror of
https://github.com/OffchainLabs/prysm.git
synced 2026-02-15 15:35:28 -05:00
This PR moves kzg commitments to bid. The rationale behind is captured in this [issue](https://github.com/ethereum/consensus-specs/issues/4870) * Moves blob KZG commitments to the earlier point where builder intent is known * Removes duplicated commitments from data column sidecars which saves descent b/w per slot * Enables nodes to start fetching blobs via getBlobs as soon as the bid is received * Slightly increases bid size and may add minor bidding channel latency but the tradeoff favors lower network load and simpler DA handling
1659 lines
56 KiB
Go
1659 lines
56 KiB
Go
package util
|
|
|
|
import (
|
|
"context"
|
|
rd "crypto/rand"
|
|
"fmt"
|
|
"math/big"
|
|
|
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/core/helpers"
|
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/core/signing"
|
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/core/time"
|
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/db/iface"
|
|
"github.com/OffchainLabs/prysm/v7/beacon-chain/state"
|
|
fieldparams "github.com/OffchainLabs/prysm/v7/config/fieldparams"
|
|
"github.com/OffchainLabs/prysm/v7/config/params"
|
|
"github.com/OffchainLabs/prysm/v7/consensus-types/blocks"
|
|
"github.com/OffchainLabs/prysm/v7/consensus-types/interfaces"
|
|
"github.com/OffchainLabs/prysm/v7/consensus-types/primitives"
|
|
"github.com/OffchainLabs/prysm/v7/crypto/bls"
|
|
"github.com/OffchainLabs/prysm/v7/crypto/rand"
|
|
"github.com/OffchainLabs/prysm/v7/encoding/bytesutil"
|
|
enginev1 "github.com/OffchainLabs/prysm/v7/proto/engine/v1"
|
|
v1 "github.com/OffchainLabs/prysm/v7/proto/eth/v1"
|
|
ethpb "github.com/OffchainLabs/prysm/v7/proto/prysm/v1alpha1"
|
|
"github.com/OffchainLabs/prysm/v7/runtime/version"
|
|
"github.com/OffchainLabs/prysm/v7/testing/assertions"
|
|
"github.com/OffchainLabs/prysm/v7/testing/require"
|
|
"github.com/ethereum/go-ethereum/common"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
// BlockGenConfig is used to define the requested conditions
|
|
// for block generation.
|
|
type BlockGenConfig struct {
|
|
NumProposerSlashings uint64
|
|
NumAttesterSlashings uint64
|
|
NumAttestations uint64
|
|
NumDeposits uint64
|
|
NumVoluntaryExits uint64
|
|
NumTransactions uint64 // Only for post Bellatrix blocks
|
|
FullSyncAggregate bool
|
|
NumBLSChanges uint64 // Only for post Capella blocks
|
|
NumWithdrawals uint64
|
|
NumDepositRequests uint64 // Only for post Electra blocks
|
|
NumWithdrawalRequests uint64 // Only for post Electra blocks
|
|
NumConsolidationRequests uint64 // Only for post Electra blocks
|
|
NumBlobKzgCommitments uint64 // Only for post Deneb blocks
|
|
}
|
|
|
|
// DefaultBlockGenConfig returns the block config that utilizes the
|
|
// current params in the beacon config.
|
|
func DefaultBlockGenConfig() *BlockGenConfig {
|
|
return &BlockGenConfig{
|
|
NumProposerSlashings: 0,
|
|
NumAttesterSlashings: 0,
|
|
NumAttestations: 1,
|
|
NumDeposits: 0,
|
|
NumVoluntaryExits: 0,
|
|
NumTransactions: 0,
|
|
NumBLSChanges: 0,
|
|
NumWithdrawals: 0,
|
|
NumConsolidationRequests: 0,
|
|
NumWithdrawalRequests: 0,
|
|
NumDepositRequests: 0,
|
|
NumBlobKzgCommitments: 0,
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Phase 0
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// NewBeaconBlock creates a beacon block with minimum marshalable fields.
|
|
func NewBeaconBlock() *ethpb.SignedBeaconBlock {
|
|
return ðpb.SignedBeaconBlock{
|
|
Block: ðpb.BeaconBlock{
|
|
ParentRoot: make([]byte, fieldparams.RootLength),
|
|
StateRoot: make([]byte, fieldparams.RootLength),
|
|
Body: ðpb.BeaconBlockBody{
|
|
RandaoReveal: make([]byte, fieldparams.BLSSignatureLength),
|
|
Eth1Data: ðpb.Eth1Data{
|
|
DepositRoot: make([]byte, fieldparams.RootLength),
|
|
BlockHash: make([]byte, fieldparams.RootLength),
|
|
},
|
|
Graffiti: make([]byte, fieldparams.RootLength),
|
|
Attestations: []*ethpb.Attestation{},
|
|
AttesterSlashings: []*ethpb.AttesterSlashing{},
|
|
Deposits: []*ethpb.Deposit{},
|
|
ProposerSlashings: []*ethpb.ProposerSlashing{},
|
|
VoluntaryExits: []*ethpb.SignedVoluntaryExit{},
|
|
},
|
|
},
|
|
Signature: make([]byte, fieldparams.BLSSignatureLength),
|
|
}
|
|
}
|
|
|
|
// GenerateFullBlock generates a fully valid block with the requested parameters.
|
|
// Use BlockGenConfig to declare the conditions you would like the block generated under.
|
|
func GenerateFullBlock(
|
|
bState state.BeaconState,
|
|
privs []bls.SecretKey,
|
|
conf *BlockGenConfig,
|
|
slot primitives.Slot,
|
|
) (*ethpb.SignedBeaconBlock, error) {
|
|
ctx := context.Background()
|
|
currentSlot := bState.Slot()
|
|
if currentSlot > slot {
|
|
return nil, fmt.Errorf("current slot in state is larger than given slot. %d > %d", currentSlot, slot)
|
|
}
|
|
bState = bState.Copy()
|
|
|
|
if conf == nil {
|
|
conf = &BlockGenConfig{}
|
|
}
|
|
|
|
var err error
|
|
var pSlashings []*ethpb.ProposerSlashing
|
|
numToGen := conf.NumProposerSlashings
|
|
if numToGen > 0 {
|
|
pSlashings, err = generateProposerSlashings(bState, privs, numToGen)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "failed generating %d proposer slashings:", numToGen)
|
|
}
|
|
}
|
|
|
|
numToGen = conf.NumAttesterSlashings
|
|
var aSlashings []*ethpb.AttesterSlashing
|
|
if numToGen > 0 {
|
|
generated, err := generateAttesterSlashings(bState, privs, numToGen)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "failed generating %d attester slashings:", numToGen)
|
|
}
|
|
aSlashings = make([]*ethpb.AttesterSlashing, len(generated))
|
|
var ok bool
|
|
for i, s := range generated {
|
|
aSlashings[i], ok = s.(*ethpb.AttesterSlashing)
|
|
if !ok {
|
|
return nil, fmt.Errorf("attester slashing has the wrong type (expected %T, got %T)", ðpb.AttesterSlashing{}, s)
|
|
}
|
|
}
|
|
}
|
|
|
|
numToGen = conf.NumAttestations
|
|
var atts []*ethpb.Attestation
|
|
if numToGen > 0 {
|
|
generatedAtts, err := GenerateAttestations(bState, privs, numToGen, slot, false)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "failed generating %d attestations:", numToGen)
|
|
}
|
|
atts = make([]*ethpb.Attestation, len(generatedAtts))
|
|
var ok bool
|
|
for i, a := range generatedAtts {
|
|
atts[i], ok = a.(*ethpb.Attestation)
|
|
if !ok {
|
|
return nil, fmt.Errorf("attestation has the wrong type (expected %T, got %T)", ðpb.Attestation{}, a)
|
|
}
|
|
}
|
|
}
|
|
|
|
numToGen = conf.NumDeposits
|
|
var newDeposits []*ethpb.Deposit
|
|
eth1Data := bState.Eth1Data()
|
|
if numToGen > 0 {
|
|
newDeposits, eth1Data, err = generateDepositsAndEth1Data(bState, numToGen)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "failed generating %d deposits:", numToGen)
|
|
}
|
|
}
|
|
|
|
numToGen = conf.NumVoluntaryExits
|
|
var exits []*ethpb.SignedVoluntaryExit
|
|
if numToGen > 0 {
|
|
exits, err = generateVoluntaryExits(bState, privs, numToGen)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "failed generating %d voluntary exits:", numToGen)
|
|
}
|
|
}
|
|
|
|
newHeader := bState.LatestBlockHeader()
|
|
prevStateRoot, err := bState.HashTreeRoot(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
newHeader.StateRoot = prevStateRoot[:]
|
|
parentRoot, err := newHeader.HashTreeRoot()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if slot == currentSlot {
|
|
slot = currentSlot + 1
|
|
}
|
|
|
|
// Temporarily incrementing the beacon state slot here since BeaconProposerIndex is a
|
|
// function deterministic on beacon state slot.
|
|
if err := bState.SetSlot(slot); err != nil {
|
|
return nil, err
|
|
}
|
|
reveal, err := RandaoReveal(bState, time.CurrentEpoch(bState), privs)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
idx, err := helpers.BeaconProposerIndex(ctx, bState)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
block := ðpb.BeaconBlock{
|
|
Slot: slot,
|
|
ParentRoot: parentRoot[:],
|
|
ProposerIndex: idx,
|
|
Body: ðpb.BeaconBlockBody{
|
|
Eth1Data: eth1Data,
|
|
RandaoReveal: reveal,
|
|
ProposerSlashings: pSlashings,
|
|
AttesterSlashings: aSlashings,
|
|
Attestations: atts,
|
|
VoluntaryExits: exits,
|
|
Deposits: newDeposits,
|
|
Graffiti: make([]byte, fieldparams.RootLength),
|
|
},
|
|
}
|
|
if err := bState.SetSlot(currentSlot); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
signature, err := BlockSignature(bState, block, privs)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return ðpb.SignedBeaconBlock{Block: block, Signature: signature.Marshal()}, nil
|
|
}
|
|
|
|
// GenerateProposerSlashingForValidator for a specific validator index.
|
|
func GenerateProposerSlashingForValidator(
|
|
bState state.BeaconState,
|
|
priv bls.SecretKey,
|
|
idx primitives.ValidatorIndex,
|
|
) (*ethpb.ProposerSlashing, error) {
|
|
header1 := HydrateSignedBeaconHeader(ðpb.SignedBeaconBlockHeader{
|
|
Header: ðpb.BeaconBlockHeader{
|
|
ProposerIndex: idx,
|
|
Slot: bState.Slot(),
|
|
BodyRoot: bytesutil.PadTo([]byte{0, 1, 0}, fieldparams.RootLength),
|
|
},
|
|
})
|
|
currentEpoch := time.CurrentEpoch(bState)
|
|
var err error
|
|
header1.Signature, err = signing.ComputeDomainAndSign(bState, currentEpoch, header1.Header, params.BeaconConfig().DomainBeaconProposer, priv)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
header2 := ðpb.SignedBeaconBlockHeader{
|
|
Header: ðpb.BeaconBlockHeader{
|
|
ProposerIndex: idx,
|
|
Slot: bState.Slot(),
|
|
BodyRoot: bytesutil.PadTo([]byte{0, 2, 0}, fieldparams.RootLength),
|
|
StateRoot: make([]byte, fieldparams.RootLength),
|
|
ParentRoot: make([]byte, fieldparams.RootLength),
|
|
},
|
|
}
|
|
header2.Signature, err = signing.ComputeDomainAndSign(bState, currentEpoch, header2.Header, params.BeaconConfig().DomainBeaconProposer, priv)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return ðpb.ProposerSlashing{
|
|
Header_1: header1,
|
|
Header_2: header2,
|
|
}, nil
|
|
}
|
|
|
|
func generateProposerSlashings(
|
|
bState state.BeaconState,
|
|
privs []bls.SecretKey,
|
|
numSlashings uint64,
|
|
) ([]*ethpb.ProposerSlashing, error) {
|
|
proposerSlashings := make([]*ethpb.ProposerSlashing, numSlashings)
|
|
for i := range numSlashings {
|
|
proposerIndex, err := randValIndex(bState)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
slashing, err := GenerateProposerSlashingForValidator(bState, privs[proposerIndex], proposerIndex)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
proposerSlashings[i] = slashing
|
|
}
|
|
return proposerSlashings, nil
|
|
}
|
|
|
|
// GenerateAttesterSlashingForValidator for a specific validator index.
|
|
func GenerateAttesterSlashingForValidator(
|
|
bState state.BeaconState,
|
|
priv bls.SecretKey,
|
|
idx primitives.ValidatorIndex,
|
|
) (ethpb.AttSlashing, error) {
|
|
currentEpoch := time.CurrentEpoch(bState)
|
|
|
|
if bState.Version() >= version.Electra {
|
|
att1 := ðpb.IndexedAttestationElectra{
|
|
Data: ðpb.AttestationData{
|
|
Slot: bState.Slot(),
|
|
CommitteeIndex: 0,
|
|
BeaconBlockRoot: make([]byte, fieldparams.RootLength),
|
|
Target: ðpb.Checkpoint{
|
|
Epoch: currentEpoch,
|
|
Root: params.BeaconConfig().ZeroHash[:],
|
|
},
|
|
Source: ðpb.Checkpoint{
|
|
Epoch: currentEpoch + 1,
|
|
Root: params.BeaconConfig().ZeroHash[:],
|
|
},
|
|
},
|
|
AttestingIndices: []uint64{uint64(idx)},
|
|
}
|
|
var err error
|
|
att1.Signature, err = signing.ComputeDomainAndSign(bState, currentEpoch, att1.Data, params.BeaconConfig().DomainBeaconAttester, priv)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
att2 := ðpb.IndexedAttestationElectra{
|
|
Data: ðpb.AttestationData{
|
|
Slot: bState.Slot(),
|
|
CommitteeIndex: 0,
|
|
BeaconBlockRoot: make([]byte, fieldparams.RootLength),
|
|
Target: ðpb.Checkpoint{
|
|
Epoch: currentEpoch,
|
|
Root: params.BeaconConfig().ZeroHash[:],
|
|
},
|
|
Source: ðpb.Checkpoint{
|
|
Epoch: currentEpoch,
|
|
Root: params.BeaconConfig().ZeroHash[:],
|
|
},
|
|
},
|
|
AttestingIndices: []uint64{uint64(idx)},
|
|
}
|
|
att2.Signature, err = signing.ComputeDomainAndSign(bState, currentEpoch, att2.Data, params.BeaconConfig().DomainBeaconAttester, priv)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return ðpb.AttesterSlashingElectra{
|
|
Attestation_1: att1,
|
|
Attestation_2: att2,
|
|
}, nil
|
|
}
|
|
|
|
att1 := ðpb.IndexedAttestation{
|
|
Data: ðpb.AttestationData{
|
|
Slot: bState.Slot(),
|
|
CommitteeIndex: 0,
|
|
BeaconBlockRoot: make([]byte, fieldparams.RootLength),
|
|
Target: ðpb.Checkpoint{
|
|
Epoch: currentEpoch,
|
|
Root: params.BeaconConfig().ZeroHash[:],
|
|
},
|
|
Source: ðpb.Checkpoint{
|
|
Epoch: currentEpoch + 1,
|
|
Root: params.BeaconConfig().ZeroHash[:],
|
|
},
|
|
},
|
|
AttestingIndices: []uint64{uint64(idx)},
|
|
}
|
|
var err error
|
|
att1.Signature, err = signing.ComputeDomainAndSign(bState, currentEpoch, att1.Data, params.BeaconConfig().DomainBeaconAttester, priv)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
att2 := ðpb.IndexedAttestation{
|
|
Data: ðpb.AttestationData{
|
|
Slot: bState.Slot(),
|
|
CommitteeIndex: 0,
|
|
BeaconBlockRoot: make([]byte, fieldparams.RootLength),
|
|
Target: ðpb.Checkpoint{
|
|
Epoch: currentEpoch,
|
|
Root: params.BeaconConfig().ZeroHash[:],
|
|
},
|
|
Source: ðpb.Checkpoint{
|
|
Epoch: currentEpoch,
|
|
Root: params.BeaconConfig().ZeroHash[:],
|
|
},
|
|
},
|
|
AttestingIndices: []uint64{uint64(idx)},
|
|
}
|
|
att2.Signature, err = signing.ComputeDomainAndSign(bState, currentEpoch, att2.Data, params.BeaconConfig().DomainBeaconAttester, priv)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return ðpb.AttesterSlashing{
|
|
Attestation_1: att1,
|
|
Attestation_2: att2,
|
|
}, nil
|
|
}
|
|
|
|
func generateAttesterSlashings(
|
|
bState state.BeaconState,
|
|
privs []bls.SecretKey,
|
|
numSlashings uint64,
|
|
) ([]ethpb.AttSlashing, error) {
|
|
attesterSlashings := make([]ethpb.AttSlashing, numSlashings)
|
|
randGen := rand.NewDeterministicGenerator()
|
|
for i := range numSlashings {
|
|
committeeIndex := randGen.Uint64() % helpers.SlotCommitteeCount(uint64(bState.NumValidators()))
|
|
committee, err := helpers.BeaconCommitteeFromState(context.Background(), bState, bState.Slot(), primitives.CommitteeIndex(committeeIndex))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
randIndex := randGen.Uint64() % uint64(len(committee))
|
|
valIndex := committee[randIndex]
|
|
slashing, err := GenerateAttesterSlashingForValidator(bState, privs[valIndex], valIndex)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
attesterSlashings[i] = slashing
|
|
}
|
|
return attesterSlashings, nil
|
|
}
|
|
|
|
func generateDepositsAndEth1Data(
|
|
bState state.BeaconState,
|
|
numDeposits uint64,
|
|
) (
|
|
[]*ethpb.Deposit,
|
|
*ethpb.Eth1Data,
|
|
error,
|
|
) {
|
|
previousDepsLen := bState.Eth1DepositIndex()
|
|
currentDeposits, _, err := DeterministicDepositsAndKeys(previousDepsLen + numDeposits)
|
|
if err != nil {
|
|
return nil, nil, errors.Wrap(err, "could not get deposits")
|
|
}
|
|
eth1Data, err := DeterministicEth1Data(len(currentDeposits))
|
|
if err != nil {
|
|
return nil, nil, errors.Wrap(err, "could not get eth1data")
|
|
}
|
|
return currentDeposits[previousDepsLen:], eth1Data, nil
|
|
}
|
|
|
|
func GenerateVoluntaryExits(bState state.BeaconState, k bls.SecretKey, idx primitives.ValidatorIndex) (*ethpb.SignedVoluntaryExit, error) {
|
|
currentEpoch := time.CurrentEpoch(bState)
|
|
exit := ðpb.SignedVoluntaryExit{
|
|
Exit: ðpb.VoluntaryExit{
|
|
Epoch: time.PrevEpoch(bState),
|
|
ValidatorIndex: idx,
|
|
},
|
|
}
|
|
var err error
|
|
exit.Signature, err = signing.ComputeDomainAndSign(bState, currentEpoch, exit.Exit, params.BeaconConfig().DomainVoluntaryExit, k)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return exit, nil
|
|
}
|
|
|
|
func generateVoluntaryExits(
|
|
bState state.BeaconState,
|
|
privs []bls.SecretKey,
|
|
numExits uint64,
|
|
) ([]*ethpb.SignedVoluntaryExit, error) {
|
|
currentEpoch := time.CurrentEpoch(bState)
|
|
|
|
voluntaryExits := make([]*ethpb.SignedVoluntaryExit, numExits)
|
|
valMap := map[primitives.ValidatorIndex]bool{}
|
|
for i := 0; i < len(voluntaryExits); i++ {
|
|
valIndex, err := randValIndex(bState)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
// Retry if validator exit already exists.
|
|
if valMap[valIndex] {
|
|
i--
|
|
continue
|
|
}
|
|
exit := ðpb.SignedVoluntaryExit{
|
|
Exit: ðpb.VoluntaryExit{
|
|
Epoch: time.PrevEpoch(bState),
|
|
ValidatorIndex: valIndex,
|
|
},
|
|
}
|
|
exit.Signature, err = signing.ComputeDomainAndSign(bState, currentEpoch, exit.Exit, params.BeaconConfig().DomainVoluntaryExit, privs[valIndex])
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
voluntaryExits[i] = exit
|
|
valMap[valIndex] = true
|
|
}
|
|
return voluntaryExits, nil
|
|
}
|
|
|
|
func randValIndex(bState state.BeaconState) (primitives.ValidatorIndex, error) {
|
|
activeCount, err := helpers.ActiveValidatorCount(context.Background(), bState, time.CurrentEpoch(bState))
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return primitives.ValidatorIndex(rand.NewGenerator().Uint64() % activeCount), nil
|
|
}
|
|
|
|
// HydrateSignedBeaconHeader hydrates a signed beacon block header with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateSignedBeaconHeader(h *ethpb.SignedBeaconBlockHeader) *ethpb.SignedBeaconBlockHeader {
|
|
if h.Signature == nil {
|
|
h.Signature = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
h.Header = HydrateBeaconHeader(h.Header)
|
|
return h
|
|
}
|
|
|
|
// HydrateBeaconHeader hydrates a beacon block header with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBeaconHeader(h *ethpb.BeaconBlockHeader) *ethpb.BeaconBlockHeader {
|
|
if h == nil {
|
|
h = ðpb.BeaconBlockHeader{}
|
|
}
|
|
if h.BodyRoot == nil {
|
|
h.BodyRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if h.StateRoot == nil {
|
|
h.StateRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if h.ParentRoot == nil {
|
|
h.ParentRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
return h
|
|
}
|
|
|
|
// HydrateSignedBeaconBlock hydrates a signed beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateSignedBeaconBlock(b *ethpb.SignedBeaconBlock) *ethpb.SignedBeaconBlock {
|
|
if b.Signature == nil {
|
|
b.Signature = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
b.Block = HydrateBeaconBlock(b.Block)
|
|
return b
|
|
}
|
|
|
|
// HydrateBeaconBlock hydrates a beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBeaconBlock(b *ethpb.BeaconBlock) *ethpb.BeaconBlock {
|
|
if b == nil {
|
|
b = ðpb.BeaconBlock{}
|
|
}
|
|
if b.ParentRoot == nil {
|
|
b.ParentRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.StateRoot == nil {
|
|
b.StateRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
b.Body = HydrateBeaconBlockBody(b.Body)
|
|
return b
|
|
}
|
|
|
|
// HydrateBeaconBlockBody hydrates a beacon block body with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBeaconBlockBody(b *ethpb.BeaconBlockBody) *ethpb.BeaconBlockBody {
|
|
if b == nil {
|
|
b = ðpb.BeaconBlockBody{}
|
|
}
|
|
if b.RandaoReveal == nil {
|
|
b.RandaoReveal = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
if b.Graffiti == nil {
|
|
b.Graffiti = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.Eth1Data == nil {
|
|
b.Eth1Data = ðpb.Eth1Data{
|
|
DepositRoot: make([]byte, fieldparams.RootLength),
|
|
BlockHash: make([]byte, fieldparams.RootLength),
|
|
}
|
|
}
|
|
return b
|
|
}
|
|
|
|
// HydrateV1SignedBeaconBlock hydrates a signed beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateV1SignedBeaconBlock(b *v1.SignedBeaconBlock) *v1.SignedBeaconBlock {
|
|
if b.Signature == nil {
|
|
b.Signature = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
b.Block = HydrateV1BeaconBlock(b.Block)
|
|
return b
|
|
}
|
|
|
|
// HydrateV1BeaconBlock hydrates a beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateV1BeaconBlock(b *v1.BeaconBlock) *v1.BeaconBlock {
|
|
if b == nil {
|
|
b = &v1.BeaconBlock{}
|
|
}
|
|
if b.ParentRoot == nil {
|
|
b.ParentRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.StateRoot == nil {
|
|
b.StateRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
b.Body = HydrateV1BeaconBlockBody(b.Body)
|
|
return b
|
|
}
|
|
|
|
// HydrateV1BeaconBlockBody hydrates a beacon block body with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateV1BeaconBlockBody(b *v1.BeaconBlockBody) *v1.BeaconBlockBody {
|
|
if b == nil {
|
|
b = &v1.BeaconBlockBody{}
|
|
}
|
|
if b.RandaoReveal == nil {
|
|
b.RandaoReveal = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
if b.Graffiti == nil {
|
|
b.Graffiti = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.Eth1Data == nil {
|
|
b.Eth1Data = &v1.Eth1Data{
|
|
DepositRoot: make([]byte, fieldparams.RootLength),
|
|
BlockHash: make([]byte, fieldparams.RootLength),
|
|
}
|
|
}
|
|
return b
|
|
}
|
|
|
|
func SaveBlock(tb assertions.AssertionTestingTB, ctx context.Context, db iface.NoHeadAccessDatabase, b any) interfaces.SignedBeaconBlock {
|
|
wsb, err := blocks.NewSignedBeaconBlock(b)
|
|
require.NoError(tb, err)
|
|
require.NoError(tb, db.SaveBlock(ctx, wsb))
|
|
return wsb
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Altair
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// HydrateSignedBeaconBlockAltair hydrates a signed beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateSignedBeaconBlockAltair(b *ethpb.SignedBeaconBlockAltair) *ethpb.SignedBeaconBlockAltair {
|
|
if b.Signature == nil {
|
|
b.Signature = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
b.Block = HydrateBeaconBlockAltair(b.Block)
|
|
return b
|
|
}
|
|
|
|
// HydrateBeaconBlockAltair hydrates a beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBeaconBlockAltair(b *ethpb.BeaconBlockAltair) *ethpb.BeaconBlockAltair {
|
|
if b == nil {
|
|
b = ðpb.BeaconBlockAltair{}
|
|
}
|
|
if b.ParentRoot == nil {
|
|
b.ParentRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.StateRoot == nil {
|
|
b.StateRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
b.Body = HydrateBeaconBlockBodyAltair(b.Body)
|
|
return b
|
|
}
|
|
|
|
// HydrateBeaconBlockBodyAltair hydrates a beacon block body with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBeaconBlockBodyAltair(b *ethpb.BeaconBlockBodyAltair) *ethpb.BeaconBlockBodyAltair {
|
|
if b == nil {
|
|
b = ðpb.BeaconBlockBodyAltair{}
|
|
}
|
|
if b.RandaoReveal == nil {
|
|
b.RandaoReveal = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
if b.Graffiti == nil {
|
|
b.Graffiti = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.Eth1Data == nil {
|
|
b.Eth1Data = ðpb.Eth1Data{
|
|
DepositRoot: make([]byte, fieldparams.RootLength),
|
|
BlockHash: make([]byte, fieldparams.RootLength),
|
|
}
|
|
}
|
|
if b.SyncAggregate == nil {
|
|
b.SyncAggregate = ðpb.SyncAggregate{
|
|
SyncCommitteeBits: make([]byte, 64),
|
|
SyncCommitteeSignature: make([]byte, fieldparams.BLSSignatureLength),
|
|
}
|
|
}
|
|
return b
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Bellatrix
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// HydrateSignedBeaconBlockBellatrix hydrates a signed beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateSignedBeaconBlockBellatrix(b *ethpb.SignedBeaconBlockBellatrix) *ethpb.SignedBeaconBlockBellatrix {
|
|
if b.Signature == nil {
|
|
b.Signature = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
b.Block = HydrateBeaconBlockBellatrix(b.Block)
|
|
return b
|
|
}
|
|
|
|
// HydrateBeaconBlockBellatrix hydrates a beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBeaconBlockBellatrix(b *ethpb.BeaconBlockBellatrix) *ethpb.BeaconBlockBellatrix {
|
|
if b == nil {
|
|
b = ðpb.BeaconBlockBellatrix{}
|
|
}
|
|
if b.ParentRoot == nil {
|
|
b.ParentRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.StateRoot == nil {
|
|
b.StateRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
b.Body = HydrateBeaconBlockBodyBellatrix(b.Body)
|
|
return b
|
|
}
|
|
|
|
// HydrateBeaconBlockBodyBellatrix hydrates a beacon block body with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBeaconBlockBodyBellatrix(b *ethpb.BeaconBlockBodyBellatrix) *ethpb.BeaconBlockBodyBellatrix {
|
|
if b == nil {
|
|
b = ðpb.BeaconBlockBodyBellatrix{}
|
|
}
|
|
if b.RandaoReveal == nil {
|
|
b.RandaoReveal = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
if b.Graffiti == nil {
|
|
b.Graffiti = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.Eth1Data == nil {
|
|
b.Eth1Data = ðpb.Eth1Data{
|
|
DepositRoot: make([]byte, fieldparams.RootLength),
|
|
BlockHash: make([]byte, fieldparams.RootLength),
|
|
}
|
|
}
|
|
if b.SyncAggregate == nil {
|
|
b.SyncAggregate = ðpb.SyncAggregate{
|
|
SyncCommitteeBits: make([]byte, fieldparams.SyncAggregateSyncCommitteeBytesLength),
|
|
SyncCommitteeSignature: make([]byte, fieldparams.BLSSignatureLength),
|
|
}
|
|
}
|
|
if b.ExecutionPayload == nil {
|
|
b.ExecutionPayload = &enginev1.ExecutionPayload{
|
|
ParentHash: make([]byte, fieldparams.RootLength),
|
|
FeeRecipient: make([]byte, 20),
|
|
StateRoot: make([]byte, fieldparams.RootLength),
|
|
ReceiptsRoot: make([]byte, fieldparams.RootLength),
|
|
LogsBloom: make([]byte, 256),
|
|
PrevRandao: make([]byte, fieldparams.RootLength),
|
|
ExtraData: make([]byte, 0),
|
|
BaseFeePerGas: make([]byte, fieldparams.RootLength),
|
|
BlockHash: make([]byte, fieldparams.RootLength),
|
|
Transactions: make([][]byte, 0),
|
|
}
|
|
}
|
|
return b
|
|
}
|
|
|
|
// HydrateSignedBlindedBeaconBlockBellatrix hydrates a signed blinded beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateSignedBlindedBeaconBlockBellatrix(b *ethpb.SignedBlindedBeaconBlockBellatrix) *ethpb.SignedBlindedBeaconBlockBellatrix {
|
|
if b.Signature == nil {
|
|
b.Signature = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
b.Block = HydrateBlindedBeaconBlockBellatrix(b.Block)
|
|
return b
|
|
}
|
|
|
|
// HydrateBlindedBeaconBlockBellatrix hydrates a blinded beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBlindedBeaconBlockBellatrix(b *ethpb.BlindedBeaconBlockBellatrix) *ethpb.BlindedBeaconBlockBellatrix {
|
|
if b == nil {
|
|
b = ðpb.BlindedBeaconBlockBellatrix{}
|
|
}
|
|
if b.ParentRoot == nil {
|
|
b.ParentRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.StateRoot == nil {
|
|
b.StateRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
b.Body = HydrateBlindedBeaconBlockBodyBellatrix(b.Body)
|
|
return b
|
|
}
|
|
|
|
// HydrateBlindedBeaconBlockBodyBellatrix hydrates a blinded beacon block body with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBlindedBeaconBlockBodyBellatrix(b *ethpb.BlindedBeaconBlockBodyBellatrix) *ethpb.BlindedBeaconBlockBodyBellatrix {
|
|
if b == nil {
|
|
b = ðpb.BlindedBeaconBlockBodyBellatrix{}
|
|
}
|
|
if b.RandaoReveal == nil {
|
|
b.RandaoReveal = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
if b.Graffiti == nil {
|
|
b.Graffiti = make([]byte, 32)
|
|
}
|
|
if b.Eth1Data == nil {
|
|
b.Eth1Data = ðpb.Eth1Data{
|
|
DepositRoot: make([]byte, fieldparams.RootLength),
|
|
BlockHash: make([]byte, 32),
|
|
}
|
|
}
|
|
if b.SyncAggregate == nil {
|
|
b.SyncAggregate = ðpb.SyncAggregate{
|
|
SyncCommitteeBits: make([]byte, fieldparams.SyncAggregateSyncCommitteeBytesLength),
|
|
SyncCommitteeSignature: make([]byte, fieldparams.BLSSignatureLength),
|
|
}
|
|
}
|
|
if b.ExecutionPayloadHeader == nil {
|
|
b.ExecutionPayloadHeader = &enginev1.ExecutionPayloadHeader{
|
|
ParentHash: make([]byte, 32),
|
|
FeeRecipient: make([]byte, 20),
|
|
StateRoot: make([]byte, fieldparams.RootLength),
|
|
ReceiptsRoot: make([]byte, fieldparams.RootLength),
|
|
LogsBloom: make([]byte, 256),
|
|
PrevRandao: make([]byte, 32),
|
|
ExtraData: make([]byte, 0),
|
|
BaseFeePerGas: make([]byte, 32),
|
|
BlockHash: make([]byte, 32),
|
|
TransactionsRoot: make([]byte, fieldparams.RootLength),
|
|
}
|
|
}
|
|
return b
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Capella
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// HydrateSignedBeaconBlockCapella hydrates a signed beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateSignedBeaconBlockCapella(b *ethpb.SignedBeaconBlockCapella) *ethpb.SignedBeaconBlockCapella {
|
|
if b.Signature == nil {
|
|
b.Signature = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
b.Block = HydrateBeaconBlockCapella(b.Block)
|
|
return b
|
|
}
|
|
|
|
// HydrateBeaconBlockCapella hydrates a beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBeaconBlockCapella(b *ethpb.BeaconBlockCapella) *ethpb.BeaconBlockCapella {
|
|
if b == nil {
|
|
b = ðpb.BeaconBlockCapella{}
|
|
}
|
|
if b.ParentRoot == nil {
|
|
b.ParentRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.StateRoot == nil {
|
|
b.StateRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
b.Body = HydrateBeaconBlockBodyCapella(b.Body)
|
|
return b
|
|
}
|
|
|
|
// HydrateBeaconBlockBodyCapella hydrates a beacon block body with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBeaconBlockBodyCapella(b *ethpb.BeaconBlockBodyCapella) *ethpb.BeaconBlockBodyCapella {
|
|
if b == nil {
|
|
b = ðpb.BeaconBlockBodyCapella{}
|
|
}
|
|
if b.RandaoReveal == nil {
|
|
b.RandaoReveal = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
if b.Graffiti == nil {
|
|
b.Graffiti = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.Eth1Data == nil {
|
|
b.Eth1Data = ðpb.Eth1Data{
|
|
DepositRoot: make([]byte, fieldparams.RootLength),
|
|
BlockHash: make([]byte, fieldparams.RootLength),
|
|
}
|
|
}
|
|
if b.SyncAggregate == nil {
|
|
b.SyncAggregate = ðpb.SyncAggregate{
|
|
SyncCommitteeBits: make([]byte, fieldparams.SyncAggregateSyncCommitteeBytesLength),
|
|
SyncCommitteeSignature: make([]byte, fieldparams.BLSSignatureLength),
|
|
}
|
|
}
|
|
if b.ExecutionPayload == nil {
|
|
b.ExecutionPayload = &enginev1.ExecutionPayloadCapella{
|
|
ParentHash: make([]byte, fieldparams.RootLength),
|
|
FeeRecipient: make([]byte, 20),
|
|
StateRoot: make([]byte, fieldparams.RootLength),
|
|
ReceiptsRoot: make([]byte, fieldparams.RootLength),
|
|
LogsBloom: make([]byte, 256),
|
|
PrevRandao: make([]byte, fieldparams.RootLength),
|
|
ExtraData: make([]byte, 0),
|
|
BaseFeePerGas: make([]byte, fieldparams.RootLength),
|
|
BlockHash: make([]byte, fieldparams.RootLength),
|
|
Transactions: make([][]byte, 0),
|
|
Withdrawals: make([]*enginev1.Withdrawal, 0),
|
|
}
|
|
}
|
|
return b
|
|
}
|
|
|
|
// HydrateSignedBlindedBeaconBlockCapella hydrates a signed blinded beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateSignedBlindedBeaconBlockCapella(b *ethpb.SignedBlindedBeaconBlockCapella) *ethpb.SignedBlindedBeaconBlockCapella {
|
|
if b.Signature == nil {
|
|
b.Signature = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
b.Block = HydrateBlindedBeaconBlockCapella(b.Block)
|
|
return b
|
|
}
|
|
|
|
// HydrateBlindedBeaconBlockCapella hydrates a blinded beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBlindedBeaconBlockCapella(b *ethpb.BlindedBeaconBlockCapella) *ethpb.BlindedBeaconBlockCapella {
|
|
if b == nil {
|
|
b = ðpb.BlindedBeaconBlockCapella{}
|
|
}
|
|
if b.ParentRoot == nil {
|
|
b.ParentRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.StateRoot == nil {
|
|
b.StateRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
b.Body = HydrateBlindedBeaconBlockBodyCapella(b.Body)
|
|
return b
|
|
}
|
|
|
|
// HydrateBlindedBeaconBlockBodyCapella hydrates a blinded beacon block body with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBlindedBeaconBlockBodyCapella(b *ethpb.BlindedBeaconBlockBodyCapella) *ethpb.BlindedBeaconBlockBodyCapella {
|
|
if b == nil {
|
|
b = ðpb.BlindedBeaconBlockBodyCapella{}
|
|
}
|
|
if b.RandaoReveal == nil {
|
|
b.RandaoReveal = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
if b.Graffiti == nil {
|
|
b.Graffiti = make([]byte, 32)
|
|
}
|
|
if b.Eth1Data == nil {
|
|
b.Eth1Data = ðpb.Eth1Data{
|
|
DepositRoot: make([]byte, fieldparams.RootLength),
|
|
BlockHash: make([]byte, 32),
|
|
}
|
|
}
|
|
if b.SyncAggregate == nil {
|
|
b.SyncAggregate = ðpb.SyncAggregate{
|
|
SyncCommitteeBits: make([]byte, fieldparams.SyncAggregateSyncCommitteeBytesLength),
|
|
SyncCommitteeSignature: make([]byte, fieldparams.BLSSignatureLength),
|
|
}
|
|
}
|
|
if b.ExecutionPayloadHeader == nil {
|
|
b.ExecutionPayloadHeader = &enginev1.ExecutionPayloadHeaderCapella{
|
|
ParentHash: make([]byte, 32),
|
|
FeeRecipient: make([]byte, 20),
|
|
StateRoot: make([]byte, fieldparams.RootLength),
|
|
ReceiptsRoot: make([]byte, fieldparams.RootLength),
|
|
LogsBloom: make([]byte, 256),
|
|
PrevRandao: make([]byte, 32),
|
|
ExtraData: make([]byte, 0),
|
|
BaseFeePerGas: make([]byte, 32),
|
|
BlockHash: make([]byte, 32),
|
|
TransactionsRoot: make([]byte, fieldparams.RootLength),
|
|
WithdrawalsRoot: make([]byte, fieldparams.RootLength),
|
|
}
|
|
}
|
|
return b
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Deneb
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// HydrateSignedBeaconBlockDeneb hydrates a signed beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateSignedBeaconBlockDeneb(b *ethpb.SignedBeaconBlockDeneb) *ethpb.SignedBeaconBlockDeneb {
|
|
if b == nil {
|
|
b = ðpb.SignedBeaconBlockDeneb{}
|
|
}
|
|
if b.Signature == nil {
|
|
b.Signature = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
b.Block = HydrateBeaconBlockDeneb(b.Block)
|
|
return b
|
|
}
|
|
|
|
// HydrateSignedBeaconBlockContentsDeneb hydrates a signed beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateSignedBeaconBlockContentsDeneb(b *ethpb.SignedBeaconBlockContentsDeneb) *ethpb.SignedBeaconBlockContentsDeneb {
|
|
b.Block = HydrateSignedBeaconBlockDeneb(b.Block)
|
|
return b
|
|
}
|
|
|
|
// HydrateBeaconBlockDeneb hydrates a beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBeaconBlockDeneb(b *ethpb.BeaconBlockDeneb) *ethpb.BeaconBlockDeneb {
|
|
if b == nil {
|
|
b = ðpb.BeaconBlockDeneb{}
|
|
}
|
|
if b.ParentRoot == nil {
|
|
b.ParentRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.StateRoot == nil {
|
|
b.StateRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
b.Body = HydrateBeaconBlockBodyDeneb(b.Body)
|
|
return b
|
|
}
|
|
|
|
// HydrateBeaconBlockBodyDeneb hydrates a beacon block body with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBeaconBlockBodyDeneb(b *ethpb.BeaconBlockBodyDeneb) *ethpb.BeaconBlockBodyDeneb {
|
|
if b == nil {
|
|
b = ðpb.BeaconBlockBodyDeneb{}
|
|
}
|
|
if b.RandaoReveal == nil {
|
|
b.RandaoReveal = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
if b.Graffiti == nil {
|
|
b.Graffiti = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.Eth1Data == nil {
|
|
b.Eth1Data = ðpb.Eth1Data{
|
|
DepositRoot: make([]byte, fieldparams.RootLength),
|
|
BlockHash: make([]byte, fieldparams.RootLength),
|
|
}
|
|
}
|
|
if b.SyncAggregate == nil {
|
|
b.SyncAggregate = ðpb.SyncAggregate{
|
|
SyncCommitteeBits: make([]byte, fieldparams.SyncAggregateSyncCommitteeBytesLength),
|
|
SyncCommitteeSignature: make([]byte, fieldparams.BLSSignatureLength),
|
|
}
|
|
}
|
|
if b.ExecutionPayload == nil {
|
|
b.ExecutionPayload = &enginev1.ExecutionPayloadDeneb{
|
|
ParentHash: make([]byte, fieldparams.RootLength),
|
|
FeeRecipient: make([]byte, 20),
|
|
StateRoot: make([]byte, fieldparams.RootLength),
|
|
ReceiptsRoot: make([]byte, fieldparams.RootLength),
|
|
LogsBloom: make([]byte, 256),
|
|
PrevRandao: make([]byte, fieldparams.RootLength),
|
|
ExtraData: make([]byte, 0),
|
|
BaseFeePerGas: make([]byte, fieldparams.RootLength),
|
|
BlockHash: make([]byte, fieldparams.RootLength),
|
|
Transactions: make([][]byte, 0),
|
|
Withdrawals: make([]*enginev1.Withdrawal, 0),
|
|
}
|
|
}
|
|
return b
|
|
}
|
|
|
|
// HydrateSignedBlindedBeaconBlockDeneb hydrates a signed blinded beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateSignedBlindedBeaconBlockDeneb(b *ethpb.SignedBlindedBeaconBlockDeneb) *ethpb.SignedBlindedBeaconBlockDeneb {
|
|
if b.Signature == nil {
|
|
b.Signature = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
b.Message = HydrateBlindedBeaconBlockDeneb(b.Message)
|
|
return b
|
|
}
|
|
|
|
// HydrateBlindedBeaconBlockBodyDeneb hydrates a blinded beacon block body with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBlindedBeaconBlockBodyDeneb(b *ethpb.BlindedBeaconBlockBodyDeneb) *ethpb.BlindedBeaconBlockBodyDeneb {
|
|
if b == nil {
|
|
b = ðpb.BlindedBeaconBlockBodyDeneb{}
|
|
}
|
|
if b.RandaoReveal == nil {
|
|
b.RandaoReveal = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
if b.Graffiti == nil {
|
|
b.Graffiti = make([]byte, 32)
|
|
}
|
|
if b.Eth1Data == nil {
|
|
b.Eth1Data = ðpb.Eth1Data{
|
|
DepositRoot: make([]byte, fieldparams.RootLength),
|
|
BlockHash: make([]byte, 32),
|
|
}
|
|
}
|
|
if b.SyncAggregate == nil {
|
|
b.SyncAggregate = ðpb.SyncAggregate{
|
|
SyncCommitteeBits: make([]byte, fieldparams.SyncAggregateSyncCommitteeBytesLength),
|
|
SyncCommitteeSignature: make([]byte, fieldparams.BLSSignatureLength),
|
|
}
|
|
}
|
|
if b.ExecutionPayloadHeader == nil {
|
|
b.ExecutionPayloadHeader = &enginev1.ExecutionPayloadHeaderDeneb{
|
|
ParentHash: make([]byte, 32),
|
|
FeeRecipient: make([]byte, 20),
|
|
StateRoot: make([]byte, fieldparams.RootLength),
|
|
ReceiptsRoot: make([]byte, fieldparams.RootLength),
|
|
LogsBloom: make([]byte, 256),
|
|
PrevRandao: make([]byte, 32),
|
|
ExtraData: make([]byte, 0),
|
|
BaseFeePerGas: make([]byte, 32),
|
|
BlockHash: make([]byte, 32),
|
|
TransactionsRoot: make([]byte, fieldparams.RootLength),
|
|
WithdrawalsRoot: make([]byte, fieldparams.RootLength),
|
|
}
|
|
}
|
|
return b
|
|
}
|
|
|
|
// HydrateBlindedBeaconBlockDeneb hydrates a blinded beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBlindedBeaconBlockDeneb(b *ethpb.BlindedBeaconBlockDeneb) *ethpb.BlindedBeaconBlockDeneb {
|
|
if b == nil {
|
|
b = ðpb.BlindedBeaconBlockDeneb{}
|
|
}
|
|
if b.ParentRoot == nil {
|
|
b.ParentRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.StateRoot == nil {
|
|
b.StateRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
b.Body = HydrateBlindedBeaconBlockBodyDeneb(b.Body)
|
|
return b
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Electra
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// HydrateSignedBeaconBlockElectra hydrates a signed beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateSignedBeaconBlockElectra(b *ethpb.SignedBeaconBlockElectra) *ethpb.SignedBeaconBlockElectra {
|
|
if b == nil {
|
|
b = ðpb.SignedBeaconBlockElectra{}
|
|
}
|
|
if b.Signature == nil {
|
|
b.Signature = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
b.Block = HydrateBeaconBlockElectra(b.Block)
|
|
return b
|
|
}
|
|
|
|
// HydrateSignedBeaconBlockContentsElectra hydrates a signed beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateSignedBeaconBlockContentsElectra(b *ethpb.SignedBeaconBlockContentsElectra) *ethpb.SignedBeaconBlockContentsElectra {
|
|
b.Block = HydrateSignedBeaconBlockElectra(b.Block)
|
|
return b
|
|
}
|
|
|
|
// HydrateBeaconBlockElectra hydrates a beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBeaconBlockElectra(b *ethpb.BeaconBlockElectra) *ethpb.BeaconBlockElectra {
|
|
if b == nil {
|
|
b = ðpb.BeaconBlockElectra{}
|
|
}
|
|
if b.ParentRoot == nil {
|
|
b.ParentRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.StateRoot == nil {
|
|
b.StateRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
b.Body = HydrateBeaconBlockBodyElectra(b.Body)
|
|
return b
|
|
}
|
|
|
|
// HydrateBeaconBlockBodyElectra hydrates a beacon block body with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBeaconBlockBodyElectra(b *ethpb.BeaconBlockBodyElectra) *ethpb.BeaconBlockBodyElectra {
|
|
if b == nil {
|
|
b = ðpb.BeaconBlockBodyElectra{}
|
|
}
|
|
if b.RandaoReveal == nil {
|
|
b.RandaoReveal = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
if b.Graffiti == nil {
|
|
b.Graffiti = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.Eth1Data == nil {
|
|
b.Eth1Data = ðpb.Eth1Data{
|
|
DepositRoot: make([]byte, fieldparams.RootLength),
|
|
BlockHash: make([]byte, fieldparams.RootLength),
|
|
}
|
|
}
|
|
if b.SyncAggregate == nil {
|
|
b.SyncAggregate = ðpb.SyncAggregate{
|
|
SyncCommitteeBits: make([]byte, fieldparams.SyncAggregateSyncCommitteeBytesLength),
|
|
SyncCommitteeSignature: make([]byte, fieldparams.BLSSignatureLength),
|
|
}
|
|
}
|
|
if b.ExecutionPayload == nil {
|
|
b.ExecutionPayload = &enginev1.ExecutionPayloadDeneb{
|
|
ParentHash: make([]byte, fieldparams.RootLength),
|
|
FeeRecipient: make([]byte, 20),
|
|
StateRoot: make([]byte, fieldparams.RootLength),
|
|
ReceiptsRoot: make([]byte, fieldparams.RootLength),
|
|
LogsBloom: make([]byte, 256),
|
|
PrevRandao: make([]byte, fieldparams.RootLength),
|
|
ExtraData: make([]byte, 0),
|
|
BaseFeePerGas: make([]byte, fieldparams.RootLength),
|
|
BlockHash: make([]byte, fieldparams.RootLength),
|
|
Transactions: make([][]byte, 0),
|
|
Withdrawals: make([]*enginev1.Withdrawal, 0),
|
|
}
|
|
}
|
|
b.ExecutionRequests = HydrateExecutionRequests(b.ExecutionRequests)
|
|
return b
|
|
}
|
|
|
|
// HydrateExecutionRequests fills the execution requests with the correct field
|
|
// lengths
|
|
func HydrateExecutionRequests(e *enginev1.ExecutionRequests) *enginev1.ExecutionRequests {
|
|
if e == nil {
|
|
e = &enginev1.ExecutionRequests{}
|
|
}
|
|
if e.Deposits == nil {
|
|
e.Deposits = make([]*enginev1.DepositRequest, 0)
|
|
}
|
|
if e.Withdrawals == nil {
|
|
e.Withdrawals = make([]*enginev1.WithdrawalRequest, 0)
|
|
}
|
|
if e.Consolidations == nil {
|
|
e.Consolidations = make([]*enginev1.ConsolidationRequest, 0)
|
|
}
|
|
return e
|
|
}
|
|
|
|
// HydrateSignedBlindedBeaconBlockElectra hydrates a signed blinded beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateSignedBlindedBeaconBlockElectra(b *ethpb.SignedBlindedBeaconBlockElectra) *ethpb.SignedBlindedBeaconBlockElectra {
|
|
if b.Signature == nil {
|
|
b.Signature = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
b.Message = HydrateBlindedBeaconBlockElectra(b.Message)
|
|
return b
|
|
}
|
|
|
|
// HydrateBlindedBeaconBlockElectra hydrates a blinded beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBlindedBeaconBlockElectra(b *ethpb.BlindedBeaconBlockElectra) *ethpb.BlindedBeaconBlockElectra {
|
|
if b == nil {
|
|
b = ðpb.BlindedBeaconBlockElectra{}
|
|
}
|
|
if b.ParentRoot == nil {
|
|
b.ParentRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.StateRoot == nil {
|
|
b.StateRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
b.Body = HydrateBlindedBeaconBlockBodyElectra(b.Body)
|
|
return b
|
|
}
|
|
|
|
// HydrateBlindedBeaconBlockBodyElectra hydrates a blinded beacon block body with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBlindedBeaconBlockBodyElectra(b *ethpb.BlindedBeaconBlockBodyElectra) *ethpb.BlindedBeaconBlockBodyElectra {
|
|
if b == nil {
|
|
b = ðpb.BlindedBeaconBlockBodyElectra{}
|
|
}
|
|
if b.RandaoReveal == nil {
|
|
b.RandaoReveal = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
if b.Graffiti == nil {
|
|
b.Graffiti = make([]byte, 32)
|
|
}
|
|
if b.Eth1Data == nil {
|
|
b.Eth1Data = ðpb.Eth1Data{
|
|
DepositRoot: make([]byte, fieldparams.RootLength),
|
|
BlockHash: make([]byte, 32),
|
|
}
|
|
}
|
|
if b.SyncAggregate == nil {
|
|
b.SyncAggregate = ðpb.SyncAggregate{
|
|
SyncCommitteeBits: make([]byte, fieldparams.SyncAggregateSyncCommitteeBytesLength),
|
|
SyncCommitteeSignature: make([]byte, fieldparams.BLSSignatureLength),
|
|
}
|
|
}
|
|
if b.ExecutionPayloadHeader == nil {
|
|
b.ExecutionPayloadHeader = &enginev1.ExecutionPayloadHeaderDeneb{
|
|
ParentHash: make([]byte, 32),
|
|
FeeRecipient: make([]byte, 20),
|
|
StateRoot: make([]byte, fieldparams.RootLength),
|
|
ReceiptsRoot: make([]byte, fieldparams.RootLength),
|
|
LogsBloom: make([]byte, 256),
|
|
PrevRandao: make([]byte, 32),
|
|
ExtraData: make([]byte, 0),
|
|
BaseFeePerGas: make([]byte, 32),
|
|
BlockHash: make([]byte, 32),
|
|
TransactionsRoot: make([]byte, fieldparams.RootLength),
|
|
WithdrawalsRoot: make([]byte, fieldparams.RootLength),
|
|
}
|
|
}
|
|
b.ExecutionRequests = HydrateExecutionRequests(b.ExecutionRequests)
|
|
return b
|
|
}
|
|
|
|
func generateWithdrawals(
|
|
bState state.BeaconState,
|
|
privs []bls.SecretKey,
|
|
numWithdrawals uint64,
|
|
) ([]*enginev1.Withdrawal, error) {
|
|
withdrawalRequests := make([]*enginev1.Withdrawal, numWithdrawals)
|
|
for i := range numWithdrawals {
|
|
valIndex, err := randValIndex(bState)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
amount := uint64(10000)
|
|
bal, err := bState.BalanceAtIndex(valIndex)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
amounts := []uint64{
|
|
amount, // some smaller amount
|
|
bal, // the entire balance
|
|
}
|
|
// Get a random index
|
|
nBig, err := rd.Int(rd.Reader, big.NewInt(int64(len(amounts))))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
randomIndex := nBig.Uint64()
|
|
withdrawalRequests[i] = &enginev1.Withdrawal{
|
|
ValidatorIndex: valIndex,
|
|
Address: make([]byte, common.AddressLength),
|
|
Amount: amounts[randomIndex],
|
|
}
|
|
}
|
|
return withdrawalRequests, nil
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Fulu
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// HydrateSignedBeaconBlockFulu hydrates a signed beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateSignedBeaconBlockFulu(b *ethpb.SignedBeaconBlockFulu) *ethpb.SignedBeaconBlockFulu {
|
|
if b == nil {
|
|
b = ðpb.SignedBeaconBlockFulu{}
|
|
}
|
|
if b.Signature == nil {
|
|
b.Signature = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
b.Block = HydrateBeaconBlockFulu(b.Block)
|
|
return b
|
|
}
|
|
|
|
// HydrateSignedBeaconBlockContentsFulu hydrates a signed beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateSignedBeaconBlockContentsFulu(b *ethpb.SignedBeaconBlockContentsFulu) *ethpb.SignedBeaconBlockContentsFulu {
|
|
b.Block = HydrateSignedBeaconBlockFulu(b.Block)
|
|
return b
|
|
}
|
|
|
|
// HydrateBeaconBlockFulu hydrates a beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBeaconBlockFulu(b *ethpb.BeaconBlockElectra) *ethpb.BeaconBlockElectra {
|
|
if b == nil {
|
|
b = ðpb.BeaconBlockElectra{}
|
|
}
|
|
if b.ParentRoot == nil {
|
|
b.ParentRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.StateRoot == nil {
|
|
b.StateRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
b.Body = HydrateBeaconBlockBodyFulu(b.Body)
|
|
return b
|
|
}
|
|
|
|
// HydrateBeaconBlockBodyFulu hydrates a beacon block body with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBeaconBlockBodyFulu(b *ethpb.BeaconBlockBodyElectra) *ethpb.BeaconBlockBodyElectra {
|
|
if b == nil {
|
|
b = ðpb.BeaconBlockBodyElectra{}
|
|
}
|
|
if b.RandaoReveal == nil {
|
|
b.RandaoReveal = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
if b.Graffiti == nil {
|
|
b.Graffiti = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.Eth1Data == nil {
|
|
b.Eth1Data = ðpb.Eth1Data{
|
|
DepositRoot: make([]byte, fieldparams.RootLength),
|
|
BlockHash: make([]byte, fieldparams.RootLength),
|
|
}
|
|
}
|
|
if b.SyncAggregate == nil {
|
|
b.SyncAggregate = ðpb.SyncAggregate{
|
|
SyncCommitteeBits: make([]byte, fieldparams.SyncAggregateSyncCommitteeBytesLength),
|
|
SyncCommitteeSignature: make([]byte, fieldparams.BLSSignatureLength),
|
|
}
|
|
}
|
|
if b.ExecutionPayload == nil {
|
|
b.ExecutionPayload = &enginev1.ExecutionPayloadDeneb{
|
|
ParentHash: make([]byte, fieldparams.RootLength),
|
|
FeeRecipient: make([]byte, 20),
|
|
StateRoot: make([]byte, fieldparams.RootLength),
|
|
ReceiptsRoot: make([]byte, fieldparams.RootLength),
|
|
LogsBloom: make([]byte, 256),
|
|
PrevRandao: make([]byte, fieldparams.RootLength),
|
|
ExtraData: make([]byte, 0),
|
|
BaseFeePerGas: make([]byte, fieldparams.RootLength),
|
|
BlockHash: make([]byte, fieldparams.RootLength),
|
|
Transactions: make([][]byte, 0),
|
|
Withdrawals: make([]*enginev1.Withdrawal, 0),
|
|
}
|
|
}
|
|
b.ExecutionRequests = HydrateExecutionRequests(b.ExecutionRequests)
|
|
return b
|
|
}
|
|
|
|
// HydrateSignedBlindedBeaconBlockFulu hydrates a signed blinded beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateSignedBlindedBeaconBlockFulu(b *ethpb.SignedBlindedBeaconBlockFulu) *ethpb.SignedBlindedBeaconBlockFulu {
|
|
if b.Signature == nil {
|
|
b.Signature = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
b.Message = HydrateBlindedBeaconBlockFulu(b.Message)
|
|
return b
|
|
}
|
|
|
|
// HydrateBlindedBeaconBlockFulu hydrates a blinded beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBlindedBeaconBlockFulu(b *ethpb.BlindedBeaconBlockFulu) *ethpb.BlindedBeaconBlockFulu {
|
|
if b == nil {
|
|
b = ðpb.BlindedBeaconBlockFulu{}
|
|
}
|
|
if b.ParentRoot == nil {
|
|
b.ParentRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.StateRoot == nil {
|
|
b.StateRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
b.Body = HydrateBlindedBeaconBlockBodyFulu(b.Body)
|
|
return b
|
|
}
|
|
|
|
// HydrateBlindedBeaconBlockBodyFulu hydrates a blinded beacon block body with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBlindedBeaconBlockBodyFulu(b *ethpb.BlindedBeaconBlockBodyElectra) *ethpb.BlindedBeaconBlockBodyElectra {
|
|
if b == nil {
|
|
b = ðpb.BlindedBeaconBlockBodyElectra{}
|
|
}
|
|
if b.RandaoReveal == nil {
|
|
b.RandaoReveal = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
if b.Graffiti == nil {
|
|
b.Graffiti = make([]byte, 32)
|
|
}
|
|
if b.Eth1Data == nil {
|
|
b.Eth1Data = ðpb.Eth1Data{
|
|
DepositRoot: make([]byte, fieldparams.RootLength),
|
|
BlockHash: make([]byte, 32),
|
|
}
|
|
}
|
|
if b.SyncAggregate == nil {
|
|
b.SyncAggregate = ðpb.SyncAggregate{
|
|
SyncCommitteeBits: make([]byte, fieldparams.SyncAggregateSyncCommitteeBytesLength),
|
|
SyncCommitteeSignature: make([]byte, fieldparams.BLSSignatureLength),
|
|
}
|
|
}
|
|
if b.ExecutionPayloadHeader == nil {
|
|
b.ExecutionPayloadHeader = &enginev1.ExecutionPayloadHeaderDeneb{
|
|
ParentHash: make([]byte, 32),
|
|
FeeRecipient: make([]byte, 20),
|
|
StateRoot: make([]byte, fieldparams.RootLength),
|
|
ReceiptsRoot: make([]byte, fieldparams.RootLength),
|
|
LogsBloom: make([]byte, 256),
|
|
PrevRandao: make([]byte, 32),
|
|
ExtraData: make([]byte, 0),
|
|
BaseFeePerGas: make([]byte, 32),
|
|
BlockHash: make([]byte, 32),
|
|
TransactionsRoot: make([]byte, fieldparams.RootLength),
|
|
WithdrawalsRoot: make([]byte, fieldparams.RootLength),
|
|
}
|
|
}
|
|
b.ExecutionRequests = HydrateExecutionRequests(b.ExecutionRequests)
|
|
return b
|
|
}
|
|
|
|
// HydrateSignedBeaconBlockGloas hydrates a signed beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateSignedBeaconBlockGloas(b *ethpb.SignedBeaconBlockGloas) *ethpb.SignedBeaconBlockGloas {
|
|
if b == nil {
|
|
b = ðpb.SignedBeaconBlockGloas{}
|
|
}
|
|
if b.Signature == nil {
|
|
b.Signature = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
b.Block = HydrateBeaconBlockGloas(b.Block)
|
|
return b
|
|
}
|
|
|
|
// HydrateBeaconBlockGloas hydrates a beacon block with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBeaconBlockGloas(b *ethpb.BeaconBlockGloas) *ethpb.BeaconBlockGloas {
|
|
if b == nil {
|
|
b = ðpb.BeaconBlockGloas{}
|
|
}
|
|
if b.ParentRoot == nil {
|
|
b.ParentRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.StateRoot == nil {
|
|
b.StateRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
b.Body = HydrateBeaconBlockBodyGloas(b.Body)
|
|
return b
|
|
}
|
|
|
|
// HydrateBeaconBlockBodyGloas hydrates a beacon block body with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateBeaconBlockBodyGloas(b *ethpb.BeaconBlockBodyGloas) *ethpb.BeaconBlockBodyGloas {
|
|
if b == nil {
|
|
b = ðpb.BeaconBlockBodyGloas{}
|
|
}
|
|
if b.RandaoReveal == nil {
|
|
b.RandaoReveal = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
if b.Graffiti == nil {
|
|
b.Graffiti = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.Eth1Data == nil {
|
|
b.Eth1Data = ðpb.Eth1Data{
|
|
DepositRoot: make([]byte, fieldparams.RootLength),
|
|
BlockHash: make([]byte, fieldparams.RootLength),
|
|
}
|
|
}
|
|
if b.SyncAggregate == nil {
|
|
b.SyncAggregate = ðpb.SyncAggregate{
|
|
SyncCommitteeBits: make([]byte, fieldparams.SyncAggregateSyncCommitteeBytesLength),
|
|
SyncCommitteeSignature: make([]byte, fieldparams.BLSSignatureLength),
|
|
}
|
|
}
|
|
b.SignedExecutionPayloadBid = HydrateSignedExecutionPayloadBid(b.SignedExecutionPayloadBid)
|
|
if b.PayloadAttestations == nil {
|
|
b.PayloadAttestations = make([]*ethpb.PayloadAttestation, 0)
|
|
}
|
|
return b
|
|
}
|
|
|
|
// HydrateSignedExecutionPayloadBid hydrates a signed execution payload bid with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateSignedExecutionPayloadBid(b *ethpb.SignedExecutionPayloadBid) *ethpb.SignedExecutionPayloadBid {
|
|
if b == nil {
|
|
b = ðpb.SignedExecutionPayloadBid{}
|
|
}
|
|
if b.Signature == nil {
|
|
b.Signature = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
b.Message = HydrateExecutionPayloadBid(b.Message)
|
|
return b
|
|
}
|
|
|
|
// HydrateExecutionPayloadBid hydrates an execution payload bid with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydrateExecutionPayloadBid(b *ethpb.ExecutionPayloadBid) *ethpb.ExecutionPayloadBid {
|
|
if b == nil {
|
|
b = ðpb.ExecutionPayloadBid{}
|
|
}
|
|
if b.ParentBlockHash == nil {
|
|
b.ParentBlockHash = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.ParentBlockRoot == nil {
|
|
b.ParentBlockRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.BlockHash == nil {
|
|
b.BlockHash = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.PrevRandao == nil {
|
|
b.PrevRandao = make([]byte, fieldparams.RootLength)
|
|
}
|
|
if b.FeeRecipient == nil {
|
|
b.FeeRecipient = make([]byte, fieldparams.FeeRecipientLength)
|
|
}
|
|
if b.BlobKzgCommitments == nil {
|
|
b.BlobKzgCommitments = make([][]byte, 0)
|
|
}
|
|
return b
|
|
}
|
|
|
|
// HydratePayloadAttestation hydrates a payload attestation with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydratePayloadAttestation(p *ethpb.PayloadAttestation) *ethpb.PayloadAttestation {
|
|
if p == nil {
|
|
p = ðpb.PayloadAttestation{}
|
|
}
|
|
if p.AggregationBits == nil {
|
|
p.AggregationBits = make([]byte, 64)
|
|
}
|
|
if p.Signature == nil {
|
|
p.Signature = make([]byte, fieldparams.BLSSignatureLength)
|
|
}
|
|
p.Data = HydratePayloadAttestationData(p.Data)
|
|
return p
|
|
}
|
|
|
|
// HydratePayloadAttestationData hydrates a payload attestation data with correct field length sizes
|
|
// to comply with fssz marshalling and unmarshalling rules.
|
|
func HydratePayloadAttestationData(d *ethpb.PayloadAttestationData) *ethpb.PayloadAttestationData {
|
|
if d == nil {
|
|
d = ðpb.PayloadAttestationData{}
|
|
}
|
|
if d.BeaconBlockRoot == nil {
|
|
d.BeaconBlockRoot = make([]byte, fieldparams.RootLength)
|
|
}
|
|
return d
|
|
}
|
|
|
|
// GenerateTestPayloadAttestations generates a slice of payload attestations with non-zero test values.
|
|
// This is useful for testing Gloas-specific fields.
|
|
func GenerateTestPayloadAttestations(count int, slot primitives.Slot) []*ethpb.PayloadAttestation {
|
|
attestations := make([]*ethpb.PayloadAttestation, count)
|
|
for i := range count {
|
|
aggregationBits := make([]byte, 64)
|
|
aggregationBits[0] = 0x01 // Set at least one bit
|
|
signature := make([]byte, fieldparams.BLSSignatureLength)
|
|
signature[0] = byte(i + 1) // Make each signature unique
|
|
beaconBlockRoot := make([]byte, fieldparams.RootLength)
|
|
beaconBlockRoot[0] = byte(i + 1) // Make each root unique
|
|
|
|
attestations[i] = ðpb.PayloadAttestation{
|
|
AggregationBits: aggregationBits,
|
|
Signature: signature,
|
|
Data: ðpb.PayloadAttestationData{
|
|
BeaconBlockRoot: beaconBlockRoot,
|
|
Slot: slot,
|
|
PayloadPresent: true,
|
|
BlobDataAvailable: true,
|
|
},
|
|
}
|
|
}
|
|
return attestations
|
|
}
|
|
|
|
// GenerateTestSignedExecutionPayloadBid generates a signed execution payload bid with non-zero test values.
|
|
// This is useful for testing Gloas-specific fields.
|
|
func GenerateTestSignedExecutionPayloadBid(slot primitives.Slot) *ethpb.SignedExecutionPayloadBid {
|
|
parentBlockHash := bytesutil.PadTo([]byte{0x01}, fieldparams.RootLength)
|
|
parentBlockRoot := bytesutil.PadTo([]byte{0x02}, fieldparams.RootLength)
|
|
blockHash := bytesutil.PadTo([]byte{0x03}, fieldparams.RootLength)
|
|
prevRandao := bytesutil.PadTo([]byte{0x04}, fieldparams.RootLength)
|
|
feeRecipient := bytesutil.PadTo([]byte{0x05}, fieldparams.FeeRecipientLength)
|
|
blobKzgCommitment := bytesutil.PadTo([]byte{0x06}, fieldparams.BLSPubkeyLength)
|
|
signature := bytesutil.PadTo([]byte{0x07}, fieldparams.BLSSignatureLength)
|
|
|
|
return ðpb.SignedExecutionPayloadBid{
|
|
Message: ðpb.ExecutionPayloadBid{
|
|
Slot: slot,
|
|
BuilderIndex: 1,
|
|
ParentBlockHash: parentBlockHash,
|
|
ParentBlockRoot: parentBlockRoot,
|
|
BlockHash: blockHash,
|
|
GasLimit: 30000000,
|
|
PrevRandao: prevRandao,
|
|
FeeRecipient: feeRecipient,
|
|
Value: 1000000,
|
|
ExecutionPayment: 2000000,
|
|
BlobKzgCommitments: [][]byte{blobKzgCommitment},
|
|
},
|
|
Signature: signature,
|
|
}
|
|
}
|