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 }