mirror of
https://github.com/OffchainLabs/prysm.git
synced 2026-01-09 13:28:01 -05:00
moving cloners to beacon_block.go and adding fuzzing (#14255)
* moving beacon block fields from cloners to individual files and adding fuzzing tests * adding missed tests * fixing tests: * removing deep not equals for now * adding clarifying comment
This commit is contained in:
@@ -58,10 +58,9 @@ func AreEth1DataEqual(a, b *ethpb.Eth1Data) bool {
|
|||||||
// votes to see if they match the eth1data.
|
// votes to see if they match the eth1data.
|
||||||
func Eth1DataHasEnoughSupport(beaconState state.ReadOnlyBeaconState, data *ethpb.Eth1Data) (bool, error) {
|
func Eth1DataHasEnoughSupport(beaconState state.ReadOnlyBeaconState, data *ethpb.Eth1Data) (bool, error) {
|
||||||
voteCount := uint64(0)
|
voteCount := uint64(0)
|
||||||
data = ethpb.CopyETH1Data(data)
|
|
||||||
|
|
||||||
for _, vote := range beaconState.Eth1DataVotes() {
|
for _, vote := range beaconState.Eth1DataVotes() {
|
||||||
if AreEth1DataEqual(vote, data) {
|
if AreEth1DataEqual(vote, data.Copy()) {
|
||||||
voteCount++
|
voteCount++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -186,7 +186,7 @@ func TestProcessEth1Data_SetsCorrectly(t *testing.T) {
|
|||||||
if len(newETH1DataVotes) <= 1 {
|
if len(newETH1DataVotes) <= 1 {
|
||||||
t.Error("Expected new ETH1 data votes to have length > 1")
|
t.Error("Expected new ETH1 data votes to have length > 1")
|
||||||
}
|
}
|
||||||
if !proto.Equal(beaconState.Eth1Data(), ethpb.CopyETH1Data(b.Block.Body.Eth1Data)) {
|
if !proto.Equal(beaconState.Eth1Data(), b.Block.Body.Eth1Data.Copy()) {
|
||||||
t.Errorf(
|
t.Errorf(
|
||||||
"Expected latest eth1 data to have been set to %v, received %v",
|
"Expected latest eth1 data to have been set to %v, received %v",
|
||||||
b.Block.Body.Eth1Data,
|
b.Block.Body.Eth1Data,
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ func TestExecuteAltairStateTransitionNoVerify_FullProcess(t *testing.T) {
|
|||||||
}
|
}
|
||||||
indices, err := altair.NextSyncCommitteeIndices(context.Background(), beaconState)
|
indices, err := altair.NextSyncCommitteeIndices(context.Background(), beaconState)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
h := ethpb.CopyBeaconBlockHeader(beaconState.LatestBlockHeader())
|
h := beaconState.LatestBlockHeader().Copy()
|
||||||
prevStateRoot, err := beaconState.HashTreeRoot(context.Background())
|
prevStateRoot, err := beaconState.HashTreeRoot(context.Background())
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
h.StateRoot = prevStateRoot[:]
|
h.StateRoot = prevStateRoot[:]
|
||||||
@@ -157,7 +157,7 @@ func TestExecuteAltairStateTransitionNoVerifySignature_CouldNotVerifyStateRoot(t
|
|||||||
}
|
}
|
||||||
indices, err := altair.NextSyncCommitteeIndices(context.Background(), beaconState)
|
indices, err := altair.NextSyncCommitteeIndices(context.Background(), beaconState)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
h := ethpb.CopyBeaconBlockHeader(beaconState.LatestBlockHeader())
|
h := beaconState.LatestBlockHeader().Copy()
|
||||||
prevStateRoot, err := beaconState.HashTreeRoot(context.Background())
|
prevStateRoot, err := beaconState.HashTreeRoot(context.Background())
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
h.StateRoot = prevStateRoot[:]
|
h.StateRoot = prevStateRoot[:]
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ func TestExecuteBellatrixStateTransitionNoVerify_FullProcess(t *testing.T) {
|
|||||||
}
|
}
|
||||||
indices, err := altair.NextSyncCommitteeIndices(context.Background(), beaconState)
|
indices, err := altair.NextSyncCommitteeIndices(context.Background(), beaconState)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
h := ethpb.CopyBeaconBlockHeader(beaconState.LatestBlockHeader())
|
h := beaconState.LatestBlockHeader().Copy()
|
||||||
prevStateRoot, err := beaconState.HashTreeRoot(context.Background())
|
prevStateRoot, err := beaconState.HashTreeRoot(context.Background())
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
h.StateRoot = prevStateRoot[:]
|
h.StateRoot = prevStateRoot[:]
|
||||||
@@ -159,7 +159,7 @@ func TestExecuteBellatrixStateTransitionNoVerifySignature_CouldNotVerifyStateRoo
|
|||||||
}
|
}
|
||||||
indices, err := altair.NextSyncCommitteeIndices(context.Background(), beaconState)
|
indices, err := altair.NextSyncCommitteeIndices(context.Background(), beaconState)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
h := ethpb.CopyBeaconBlockHeader(beaconState.LatestBlockHeader())
|
h := beaconState.LatestBlockHeader().Copy()
|
||||||
prevStateRoot, err := beaconState.HashTreeRoot(context.Background())
|
prevStateRoot, err := beaconState.HashTreeRoot(context.Background())
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
h.StateRoot = prevStateRoot[:]
|
h.StateRoot = prevStateRoot[:]
|
||||||
|
|||||||
@@ -35,5 +35,5 @@ func (b *BeaconState) pendingBalanceDepositsVal() []*ethpb.PendingBalanceDeposit
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return ethpb.CopyPendingBalanceDeposits(b.pendingBalanceDeposits)
|
return ethpb.CopySlice(b.pendingBalanceDeposits)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,5 +59,5 @@ func (b *BeaconState) pendingConsolidationsVal() []*ethpb.PendingConsolidation {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return ethpb.CopyPendingConsolidations(b.pendingConsolidations)
|
return ethpb.CopySlice(b.pendingConsolidations)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ func (b *BeaconState) eth1DataVal() *ethpb.Eth1Data {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return ethpb.CopyETH1Data(b.eth1Data)
|
return b.eth1Data.Copy()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Eth1DataVotes corresponds to votes from Ethereum on the canonical proof-of-work chain
|
// Eth1DataVotes corresponds to votes from Ethereum on the canonical proof-of-work chain
|
||||||
@@ -49,7 +49,7 @@ func (b *BeaconState) eth1DataVotesVal() []*ethpb.Eth1Data {
|
|||||||
|
|
||||||
res := make([]*ethpb.Eth1Data, len(b.eth1DataVotes))
|
res := make([]*ethpb.Eth1Data, len(b.eth1DataVotes))
|
||||||
for i := 0; i < len(res); i++ {
|
for i := 0; i < len(res); i++ {
|
||||||
res[i] = ethpb.CopyETH1Data(b.eth1DataVotes[i])
|
res[i] = b.eth1DataVotes[i].Copy()
|
||||||
}
|
}
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -103,5 +103,5 @@ func (b *BeaconState) HistoricalSummaries() ([]*ethpb.HistoricalSummary, error)
|
|||||||
// historicalSummariesVal of the beacon state.
|
// historicalSummariesVal of the beacon state.
|
||||||
// This assumes that a lock is already held on BeaconState.
|
// This assumes that a lock is already held on BeaconState.
|
||||||
func (b *BeaconState) historicalSummariesVal() []*ethpb.HistoricalSummary {
|
func (b *BeaconState) historicalSummariesVal() []*ethpb.HistoricalSummary {
|
||||||
return ethpb.CopyHistoricalSummaries(b.historicalSummaries)
|
return ethpb.CopySlice(b.historicalSummaries)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -184,7 +184,7 @@ func (b *BeaconState) ExpectedWithdrawals() ([]*enginev1.Withdrawal, uint64, err
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (b *BeaconState) pendingPartialWithdrawalsVal() []*ethpb.PendingPartialWithdrawal {
|
func (b *BeaconState) pendingPartialWithdrawalsVal() []*ethpb.PendingPartialWithdrawal {
|
||||||
return ethpb.CopyPendingPartialWithdrawals(b.pendingPartialWithdrawals)
|
return ethpb.CopySlice(b.pendingPartialWithdrawals)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *BeaconState) NumPendingPartialWithdrawals() (uint64, error) {
|
func (b *BeaconState) NumPendingPartialWithdrawals() (uint64, error) {
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ func (b *BeaconState) SetLatestBlockHeader(val *ethpb.BeaconBlockHeader) error {
|
|||||||
b.lock.Lock()
|
b.lock.Lock()
|
||||||
defer b.lock.Unlock()
|
defer b.lock.Unlock()
|
||||||
|
|
||||||
b.latestBlockHeader = ethpb.CopyBeaconBlockHeader(val)
|
b.latestBlockHeader = val.Copy()
|
||||||
b.markFieldAsDirty(types.LatestBlockHeader)
|
b.markFieldAsDirty(types.LatestBlockHeader)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ func WithdrawalCredentialsHash(withdrawalKey bls.SecretKey) []byte {
|
|||||||
|
|
||||||
// VerifyDepositSignature verifies the correctness of Eth1 deposit BLS signature
|
// VerifyDepositSignature verifies the correctness of Eth1 deposit BLS signature
|
||||||
func VerifyDepositSignature(dd *ethpb.Deposit_Data, domain []byte) error {
|
func VerifyDepositSignature(dd *ethpb.Deposit_Data, domain []byte) error {
|
||||||
ddCopy := ethpb.CopyDepositData(dd)
|
ddCopy := dd.Copy()
|
||||||
publicKey, err := bls.PublicKeyFromBytes(ddCopy.PublicKey)
|
publicKey, err := bls.PublicKeyFromBytes(ddCopy.PublicKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "could not convert bytes to public key")
|
return errors.Wrap(err, "could not convert bytes to public key")
|
||||||
|
|||||||
@@ -308,7 +308,9 @@ go_library(
|
|||||||
name = "go_default_library",
|
name = "go_default_library",
|
||||||
srcs = [
|
srcs = [
|
||||||
"attestation.go",
|
"attestation.go",
|
||||||
|
"beacon_block.go",
|
||||||
"cloners.go",
|
"cloners.go",
|
||||||
|
"eip_7521.go",
|
||||||
"sync_committee_mainnet.go",
|
"sync_committee_mainnet.go",
|
||||||
"sync_committee_minimal.go", # keep
|
"sync_committee_minimal.go", # keep
|
||||||
":ssz_generated_non_core", # keep
|
":ssz_generated_non_core", # keep
|
||||||
@@ -372,8 +374,11 @@ go_test(
|
|||||||
name = "go_default_test",
|
name = "go_default_test",
|
||||||
srcs = [
|
srcs = [
|
||||||
"attestation_fuzz_test.go",
|
"attestation_fuzz_test.go",
|
||||||
|
"beacon_block_fuzz_test.go",
|
||||||
"cloners_test.go",
|
"cloners_test.go",
|
||||||
|
"eip_7521_fuzz_test.go",
|
||||||
"export_test.go",
|
"export_test.go",
|
||||||
|
"fuzz_test.go",
|
||||||
],
|
],
|
||||||
embed = [":go_default_library"],
|
embed = [":go_default_library"],
|
||||||
deps = [
|
deps = [
|
||||||
|
|||||||
@@ -1,15 +1,12 @@
|
|||||||
package eth_test
|
package eth_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
eth "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1"
|
eth "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1"
|
||||||
"github.com/prysmaticlabs/prysm/v5/testing/require"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCopyExecutionPayloadHeader_Fuzz(t *testing.T) {
|
func TestCopyAttestation_Fuzz(t *testing.T) {
|
||||||
fuzzCopies(t, ð.Checkpoint{})
|
fuzzCopies(t, ð.Checkpoint{})
|
||||||
fuzzCopies(t, ð.AttestationData{})
|
fuzzCopies(t, ð.AttestationData{})
|
||||||
fuzzCopies(t, ð.Attestation{})
|
fuzzCopies(t, ð.Attestation{})
|
||||||
@@ -20,19 +17,3 @@ func TestCopyExecutionPayloadHeader_Fuzz(t *testing.T) {
|
|||||||
fuzzCopies(t, ð.AttesterSlashing{})
|
fuzzCopies(t, ð.AttesterSlashing{})
|
||||||
fuzzCopies(t, ð.AttesterSlashingElectra{})
|
fuzzCopies(t, ð.AttesterSlashingElectra{})
|
||||||
}
|
}
|
||||||
|
|
||||||
func fuzzCopies[T any, C eth.Copier[T]](t *testing.T, obj C) {
|
|
||||||
fuzzer := fuzz.NewWithSeed(0)
|
|
||||||
amount := 1000
|
|
||||||
t.Run(fmt.Sprintf("%T", obj), func(t *testing.T) {
|
|
||||||
for i := 0; i < amount; i++ {
|
|
||||||
fuzzer.Fuzz(obj) // Populate thing with random values
|
|
||||||
got := obj.Copy()
|
|
||||||
require.DeepEqual(t, obj, got)
|
|
||||||
// check shallow copy working
|
|
||||||
fuzzer.Fuzz(got)
|
|
||||||
require.DeepNotEqual(t, obj, got)
|
|
||||||
// TODO: think of deeper not equal fuzzing
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|||||||
156
proto/prysm/v1alpha1/beacon_block.go
Normal file
156
proto/prysm/v1alpha1/beacon_block.go
Normal file
@@ -0,0 +1,156 @@
|
|||||||
|
package eth
|
||||||
|
|
||||||
|
import "github.com/prysmaticlabs/prysm/v5/encoding/bytesutil"
|
||||||
|
|
||||||
|
// Copy --
|
||||||
|
func (data *Eth1Data) Copy() *Eth1Data {
|
||||||
|
if data == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return &Eth1Data{
|
||||||
|
DepositRoot: bytesutil.SafeCopyBytes(data.DepositRoot),
|
||||||
|
DepositCount: data.DepositCount,
|
||||||
|
BlockHash: bytesutil.SafeCopyBytes(data.BlockHash),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy --
|
||||||
|
func (slashing *ProposerSlashing) Copy() *ProposerSlashing {
|
||||||
|
if slashing == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return &ProposerSlashing{
|
||||||
|
Header_1: slashing.Header_1.Copy(),
|
||||||
|
Header_2: slashing.Header_2.Copy(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy --
|
||||||
|
func (header *SignedBeaconBlockHeader) Copy() *SignedBeaconBlockHeader {
|
||||||
|
if header == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return &SignedBeaconBlockHeader{
|
||||||
|
Header: header.Header.Copy(),
|
||||||
|
Signature: bytesutil.SafeCopyBytes(header.Signature),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy --
|
||||||
|
func (header *BeaconBlockHeader) Copy() *BeaconBlockHeader {
|
||||||
|
if header == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
parentRoot := bytesutil.SafeCopyBytes(header.ParentRoot)
|
||||||
|
stateRoot := bytesutil.SafeCopyBytes(header.StateRoot)
|
||||||
|
bodyRoot := bytesutil.SafeCopyBytes(header.BodyRoot)
|
||||||
|
return &BeaconBlockHeader{
|
||||||
|
Slot: header.Slot,
|
||||||
|
ProposerIndex: header.ProposerIndex,
|
||||||
|
ParentRoot: parentRoot,
|
||||||
|
StateRoot: stateRoot,
|
||||||
|
BodyRoot: bodyRoot,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy --
|
||||||
|
func (deposit *Deposit) Copy() *Deposit {
|
||||||
|
if deposit == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return &Deposit{
|
||||||
|
Proof: bytesutil.SafeCopy2dBytes(deposit.Proof),
|
||||||
|
Data: deposit.Data.Copy(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy --
|
||||||
|
func (depData *Deposit_Data) Copy() *Deposit_Data {
|
||||||
|
if depData == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return &Deposit_Data{
|
||||||
|
PublicKey: bytesutil.SafeCopyBytes(depData.PublicKey),
|
||||||
|
WithdrawalCredentials: bytesutil.SafeCopyBytes(depData.WithdrawalCredentials),
|
||||||
|
Amount: depData.Amount,
|
||||||
|
Signature: bytesutil.SafeCopyBytes(depData.Signature),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy --
|
||||||
|
func (exit *SignedVoluntaryExit) Copy() *SignedVoluntaryExit {
|
||||||
|
if exit == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return &SignedVoluntaryExit{
|
||||||
|
Exit: exit.Exit.Copy(),
|
||||||
|
Signature: bytesutil.SafeCopyBytes(exit.Signature),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy --
|
||||||
|
func (exit *VoluntaryExit) Copy() *VoluntaryExit {
|
||||||
|
if exit == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return &VoluntaryExit{
|
||||||
|
Epoch: exit.Epoch,
|
||||||
|
ValidatorIndex: exit.ValidatorIndex,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy --
|
||||||
|
func (a *SyncAggregate) Copy() *SyncAggregate {
|
||||||
|
if a == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return &SyncAggregate{
|
||||||
|
SyncCommitteeBits: bytesutil.SafeCopyBytes(a.SyncCommitteeBits),
|
||||||
|
SyncCommitteeSignature: bytesutil.SafeCopyBytes(a.SyncCommitteeSignature),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy --
|
||||||
|
func (change *SignedBLSToExecutionChange) Copy() *SignedBLSToExecutionChange {
|
||||||
|
if change == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return &SignedBLSToExecutionChange{
|
||||||
|
Message: change.Message.Copy(),
|
||||||
|
Signature: bytesutil.SafeCopyBytes(change.Signature),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy --
|
||||||
|
func (change *BLSToExecutionChange) Copy() *BLSToExecutionChange {
|
||||||
|
if change == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return &BLSToExecutionChange{
|
||||||
|
ValidatorIndex: change.ValidatorIndex,
|
||||||
|
FromBlsPubkey: bytesutil.SafeCopyBytes(change.FromBlsPubkey),
|
||||||
|
ToExecutionAddress: bytesutil.SafeCopyBytes(change.ToExecutionAddress),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy --
|
||||||
|
func (summary *HistoricalSummary) Copy() *HistoricalSummary {
|
||||||
|
if summary == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return &HistoricalSummary{
|
||||||
|
BlockSummaryRoot: bytesutil.SafeCopyBytes(summary.BlockSummaryRoot),
|
||||||
|
StateSummaryRoot: bytesutil.SafeCopyBytes(summary.StateSummaryRoot),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy --
|
||||||
|
func (pbd *PendingBalanceDeposit) Copy() *PendingBalanceDeposit {
|
||||||
|
if pbd == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return &PendingBalanceDeposit{
|
||||||
|
Index: pbd.Index,
|
||||||
|
Amount: pbd.Amount,
|
||||||
|
}
|
||||||
|
}
|
||||||
23
proto/prysm/v1alpha1/beacon_block_fuzz_test.go
Normal file
23
proto/prysm/v1alpha1/beacon_block_fuzz_test.go
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
package eth_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
eth "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestCopyBeaconBlockFields_Fuzz(t *testing.T) {
|
||||||
|
fuzzCopies(t, ð.Eth1Data{})
|
||||||
|
fuzzCopies(t, ð.ProposerSlashing{})
|
||||||
|
fuzzCopies(t, ð.SignedBeaconBlockHeader{})
|
||||||
|
fuzzCopies(t, ð.BeaconBlockHeader{})
|
||||||
|
fuzzCopies(t, ð.Deposit{})
|
||||||
|
fuzzCopies(t, ð.Deposit_Data{})
|
||||||
|
fuzzCopies(t, ð.SignedVoluntaryExit{})
|
||||||
|
fuzzCopies(t, ð.VoluntaryExit{})
|
||||||
|
fuzzCopies(t, ð.SyncAggregate{})
|
||||||
|
fuzzCopies(t, ð.SignedBLSToExecutionChange{})
|
||||||
|
fuzzCopies(t, ð.BLSToExecutionChange{})
|
||||||
|
fuzzCopies(t, ð.HistoricalSummary{})
|
||||||
|
fuzzCopies(t, ð.PendingBalanceDeposit{})
|
||||||
|
}
|
||||||
@@ -8,7 +8,7 @@ type copier[T any] interface {
|
|||||||
Copy() T
|
Copy() T
|
||||||
}
|
}
|
||||||
|
|
||||||
func copySlice[T any, C copier[T]](original []C) []T {
|
func CopySlice[T any, C copier[T]](original []C) []T {
|
||||||
// Create a new slice with the same length as the original
|
// Create a new slice with the same length as the original
|
||||||
newSlice := make([]T, len(original))
|
newSlice := make([]T, len(original))
|
||||||
for i := 0; i < len(newSlice); i++ {
|
for i := 0; i < len(newSlice); i++ {
|
||||||
@@ -17,18 +17,6 @@ func copySlice[T any, C copier[T]](original []C) []T {
|
|||||||
return newSlice
|
return newSlice
|
||||||
}
|
}
|
||||||
|
|
||||||
// CopyETH1Data copies the provided eth1data object.
|
|
||||||
func CopyETH1Data(data *Eth1Data) *Eth1Data {
|
|
||||||
if data == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return &Eth1Data{
|
|
||||||
DepositRoot: bytesutil.SafeCopyBytes(data.DepositRoot),
|
|
||||||
DepositCount: data.DepositCount,
|
|
||||||
BlockHash: bytesutil.SafeCopyBytes(data.BlockHash),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// CopySignedBeaconBlock copies the provided SignedBeaconBlock.
|
// CopySignedBeaconBlock copies the provided SignedBeaconBlock.
|
||||||
func CopySignedBeaconBlock(sigBlock *SignedBeaconBlock) *SignedBeaconBlock {
|
func CopySignedBeaconBlock(sigBlock *SignedBeaconBlock) *SignedBeaconBlock {
|
||||||
if sigBlock == nil {
|
if sigBlock == nil {
|
||||||
@@ -61,13 +49,13 @@ func CopyBeaconBlockBody(body *BeaconBlockBody) *BeaconBlockBody {
|
|||||||
}
|
}
|
||||||
return &BeaconBlockBody{
|
return &BeaconBlockBody{
|
||||||
RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal),
|
RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal),
|
||||||
Eth1Data: CopyETH1Data(body.Eth1Data),
|
Eth1Data: body.Eth1Data.Copy(),
|
||||||
Graffiti: bytesutil.SafeCopyBytes(body.Graffiti),
|
Graffiti: bytesutil.SafeCopyBytes(body.Graffiti),
|
||||||
ProposerSlashings: CopyProposerSlashings(body.ProposerSlashings),
|
ProposerSlashings: CopySlice(body.ProposerSlashings),
|
||||||
AttesterSlashings: copySlice(body.AttesterSlashings),
|
AttesterSlashings: CopySlice(body.AttesterSlashings),
|
||||||
Attestations: copySlice(body.Attestations),
|
Attestations: CopySlice(body.Attestations),
|
||||||
Deposits: CopyDeposits(body.Deposits),
|
Deposits: CopySlice(body.Deposits),
|
||||||
VoluntaryExits: CopySignedVoluntaryExits(body.VoluntaryExits),
|
VoluntaryExits: CopySlice(body.VoluntaryExits),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -103,127 +91,14 @@ func CopyBeaconBlockBodyAltair(body *BeaconBlockBodyAltair) *BeaconBlockBodyAlta
|
|||||||
}
|
}
|
||||||
return &BeaconBlockBodyAltair{
|
return &BeaconBlockBodyAltair{
|
||||||
RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal),
|
RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal),
|
||||||
Eth1Data: CopyETH1Data(body.Eth1Data),
|
Eth1Data: body.Eth1Data.Copy(),
|
||||||
Graffiti: bytesutil.SafeCopyBytes(body.Graffiti),
|
Graffiti: bytesutil.SafeCopyBytes(body.Graffiti),
|
||||||
ProposerSlashings: CopyProposerSlashings(body.ProposerSlashings),
|
ProposerSlashings: CopySlice(body.ProposerSlashings),
|
||||||
AttesterSlashings: copySlice(body.AttesterSlashings),
|
AttesterSlashings: CopySlice(body.AttesterSlashings),
|
||||||
Attestations: copySlice(body.Attestations),
|
Attestations: CopySlice(body.Attestations),
|
||||||
Deposits: CopyDeposits(body.Deposits),
|
Deposits: CopySlice(body.Deposits),
|
||||||
VoluntaryExits: CopySignedVoluntaryExits(body.VoluntaryExits),
|
VoluntaryExits: CopySlice(body.VoluntaryExits),
|
||||||
SyncAggregate: CopySyncAggregate(body.SyncAggregate),
|
SyncAggregate: body.SyncAggregate.Copy(),
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// CopyProposerSlashings copies the provided ProposerSlashing array.
|
|
||||||
func CopyProposerSlashings(slashings []*ProposerSlashing) []*ProposerSlashing {
|
|
||||||
if slashings == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
newSlashings := make([]*ProposerSlashing, len(slashings))
|
|
||||||
for i, att := range slashings {
|
|
||||||
newSlashings[i] = CopyProposerSlashing(att)
|
|
||||||
}
|
|
||||||
return newSlashings
|
|
||||||
}
|
|
||||||
|
|
||||||
// CopyProposerSlashing copies the provided ProposerSlashing.
|
|
||||||
func CopyProposerSlashing(slashing *ProposerSlashing) *ProposerSlashing {
|
|
||||||
if slashing == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return &ProposerSlashing{
|
|
||||||
Header_1: CopySignedBeaconBlockHeader(slashing.Header_1),
|
|
||||||
Header_2: CopySignedBeaconBlockHeader(slashing.Header_2),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// CopySignedBeaconBlockHeader copies the provided SignedBeaconBlockHeader.
|
|
||||||
func CopySignedBeaconBlockHeader(header *SignedBeaconBlockHeader) *SignedBeaconBlockHeader {
|
|
||||||
if header == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return &SignedBeaconBlockHeader{
|
|
||||||
Header: CopyBeaconBlockHeader(header.Header),
|
|
||||||
Signature: bytesutil.SafeCopyBytes(header.Signature),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// CopyBeaconBlockHeader copies the provided BeaconBlockHeader.
|
|
||||||
func CopyBeaconBlockHeader(header *BeaconBlockHeader) *BeaconBlockHeader {
|
|
||||||
if header == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
parentRoot := bytesutil.SafeCopyBytes(header.ParentRoot)
|
|
||||||
stateRoot := bytesutil.SafeCopyBytes(header.StateRoot)
|
|
||||||
bodyRoot := bytesutil.SafeCopyBytes(header.BodyRoot)
|
|
||||||
return &BeaconBlockHeader{
|
|
||||||
Slot: header.Slot,
|
|
||||||
ProposerIndex: header.ProposerIndex,
|
|
||||||
ParentRoot: parentRoot,
|
|
||||||
StateRoot: stateRoot,
|
|
||||||
BodyRoot: bodyRoot,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// CopyDeposits copies the provided deposit array.
|
|
||||||
func CopyDeposits(deposits []*Deposit) []*Deposit {
|
|
||||||
if deposits == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
newDeposits := make([]*Deposit, len(deposits))
|
|
||||||
for i, dep := range deposits {
|
|
||||||
newDeposits[i] = CopyDeposit(dep)
|
|
||||||
}
|
|
||||||
return newDeposits
|
|
||||||
}
|
|
||||||
|
|
||||||
// CopyDeposit copies the provided deposit.
|
|
||||||
func CopyDeposit(deposit *Deposit) *Deposit {
|
|
||||||
if deposit == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return &Deposit{
|
|
||||||
Proof: bytesutil.SafeCopy2dBytes(deposit.Proof),
|
|
||||||
Data: CopyDepositData(deposit.Data),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// CopyDepositData copies the provided deposit data.
|
|
||||||
func CopyDepositData(depData *Deposit_Data) *Deposit_Data {
|
|
||||||
if depData == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return &Deposit_Data{
|
|
||||||
PublicKey: bytesutil.SafeCopyBytes(depData.PublicKey),
|
|
||||||
WithdrawalCredentials: bytesutil.SafeCopyBytes(depData.WithdrawalCredentials),
|
|
||||||
Amount: depData.Amount,
|
|
||||||
Signature: bytesutil.SafeCopyBytes(depData.Signature),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// CopySignedVoluntaryExits copies the provided SignedVoluntaryExits array.
|
|
||||||
func CopySignedVoluntaryExits(exits []*SignedVoluntaryExit) []*SignedVoluntaryExit {
|
|
||||||
if exits == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
newExits := make([]*SignedVoluntaryExit, len(exits))
|
|
||||||
for i, exit := range exits {
|
|
||||||
newExits[i] = CopySignedVoluntaryExit(exit)
|
|
||||||
}
|
|
||||||
return newExits
|
|
||||||
}
|
|
||||||
|
|
||||||
// CopySignedVoluntaryExit copies the provided SignedVoluntaryExit.
|
|
||||||
func CopySignedVoluntaryExit(exit *SignedVoluntaryExit) *SignedVoluntaryExit {
|
|
||||||
if exit == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return &SignedVoluntaryExit{
|
|
||||||
Exit: &VoluntaryExit{
|
|
||||||
Epoch: exit.Exit.Epoch,
|
|
||||||
ValidatorIndex: exit.Exit.ValidatorIndex,
|
|
||||||
},
|
|
||||||
Signature: bytesutil.SafeCopyBytes(exit.Signature),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -272,17 +147,6 @@ func CopySyncCommitteeContribution(c *SyncCommitteeContribution) *SyncCommitteeC
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// CopySyncAggregate copies the provided sync aggregate object.
|
|
||||||
func CopySyncAggregate(a *SyncAggregate) *SyncAggregate {
|
|
||||||
if a == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return &SyncAggregate{
|
|
||||||
SyncCommitteeBits: bytesutil.SafeCopyBytes(a.SyncCommitteeBits),
|
|
||||||
SyncCommitteeSignature: bytesutil.SafeCopyBytes(a.SyncCommitteeSignature),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// CopySignedBeaconBlockBellatrix copies the provided SignedBeaconBlockBellatrix.
|
// CopySignedBeaconBlockBellatrix copies the provided SignedBeaconBlockBellatrix.
|
||||||
func CopySignedBeaconBlockBellatrix(sigBlock *SignedBeaconBlockBellatrix) *SignedBeaconBlockBellatrix {
|
func CopySignedBeaconBlockBellatrix(sigBlock *SignedBeaconBlockBellatrix) *SignedBeaconBlockBellatrix {
|
||||||
if sigBlock == nil {
|
if sigBlock == nil {
|
||||||
@@ -315,14 +179,14 @@ func CopyBeaconBlockBodyBellatrix(body *BeaconBlockBodyBellatrix) *BeaconBlockBo
|
|||||||
}
|
}
|
||||||
return &BeaconBlockBodyBellatrix{
|
return &BeaconBlockBodyBellatrix{
|
||||||
RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal),
|
RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal),
|
||||||
Eth1Data: CopyETH1Data(body.Eth1Data),
|
Eth1Data: body.Eth1Data.Copy(),
|
||||||
Graffiti: bytesutil.SafeCopyBytes(body.Graffiti),
|
Graffiti: bytesutil.SafeCopyBytes(body.Graffiti),
|
||||||
ProposerSlashings: CopyProposerSlashings(body.ProposerSlashings),
|
ProposerSlashings: CopySlice(body.ProposerSlashings),
|
||||||
AttesterSlashings: copySlice(body.AttesterSlashings),
|
AttesterSlashings: CopySlice(body.AttesterSlashings),
|
||||||
Attestations: copySlice(body.Attestations),
|
Attestations: CopySlice(body.Attestations),
|
||||||
Deposits: CopyDeposits(body.Deposits),
|
Deposits: CopySlice(body.Deposits),
|
||||||
VoluntaryExits: CopySignedVoluntaryExits(body.VoluntaryExits),
|
VoluntaryExits: CopySlice(body.VoluntaryExits),
|
||||||
SyncAggregate: CopySyncAggregate(body.SyncAggregate),
|
SyncAggregate: body.SyncAggregate.Copy(),
|
||||||
ExecutionPayload: body.ExecutionPayload.Copy(),
|
ExecutionPayload: body.ExecutionPayload.Copy(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -359,16 +223,16 @@ func CopyBeaconBlockBodyCapella(body *BeaconBlockBodyCapella) *BeaconBlockBodyCa
|
|||||||
}
|
}
|
||||||
return &BeaconBlockBodyCapella{
|
return &BeaconBlockBodyCapella{
|
||||||
RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal),
|
RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal),
|
||||||
Eth1Data: CopyETH1Data(body.Eth1Data),
|
Eth1Data: body.Eth1Data.Copy(),
|
||||||
Graffiti: bytesutil.SafeCopyBytes(body.Graffiti),
|
Graffiti: bytesutil.SafeCopyBytes(body.Graffiti),
|
||||||
ProposerSlashings: CopyProposerSlashings(body.ProposerSlashings),
|
ProposerSlashings: CopySlice(body.ProposerSlashings),
|
||||||
AttesterSlashings: copySlice(body.AttesterSlashings),
|
AttesterSlashings: CopySlice(body.AttesterSlashings),
|
||||||
Attestations: copySlice(body.Attestations),
|
Attestations: CopySlice(body.Attestations),
|
||||||
Deposits: CopyDeposits(body.Deposits),
|
Deposits: CopySlice(body.Deposits),
|
||||||
VoluntaryExits: CopySignedVoluntaryExits(body.VoluntaryExits),
|
VoluntaryExits: CopySlice(body.VoluntaryExits),
|
||||||
SyncAggregate: CopySyncAggregate(body.SyncAggregate),
|
SyncAggregate: body.SyncAggregate.Copy(),
|
||||||
ExecutionPayload: body.ExecutionPayload.Copy(),
|
ExecutionPayload: body.ExecutionPayload.Copy(),
|
||||||
BlsToExecutionChanges: CopyBLSToExecutionChanges(body.BlsToExecutionChanges),
|
BlsToExecutionChanges: CopySlice(body.BlsToExecutionChanges),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -404,16 +268,16 @@ func CopyBlindedBeaconBlockBodyCapella(body *BlindedBeaconBlockBodyCapella) *Bli
|
|||||||
}
|
}
|
||||||
return &BlindedBeaconBlockBodyCapella{
|
return &BlindedBeaconBlockBodyCapella{
|
||||||
RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal),
|
RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal),
|
||||||
Eth1Data: CopyETH1Data(body.Eth1Data),
|
Eth1Data: body.Eth1Data.Copy(),
|
||||||
Graffiti: bytesutil.SafeCopyBytes(body.Graffiti),
|
Graffiti: bytesutil.SafeCopyBytes(body.Graffiti),
|
||||||
ProposerSlashings: CopyProposerSlashings(body.ProposerSlashings),
|
ProposerSlashings: CopySlice(body.ProposerSlashings),
|
||||||
AttesterSlashings: copySlice(body.AttesterSlashings),
|
AttesterSlashings: CopySlice(body.AttesterSlashings),
|
||||||
Attestations: copySlice(body.Attestations),
|
Attestations: CopySlice(body.Attestations),
|
||||||
Deposits: CopyDeposits(body.Deposits),
|
Deposits: CopySlice(body.Deposits),
|
||||||
VoluntaryExits: CopySignedVoluntaryExits(body.VoluntaryExits),
|
VoluntaryExits: CopySlice(body.VoluntaryExits),
|
||||||
SyncAggregate: CopySyncAggregate(body.SyncAggregate),
|
SyncAggregate: body.SyncAggregate.Copy(),
|
||||||
ExecutionPayloadHeader: body.ExecutionPayloadHeader.Copy(),
|
ExecutionPayloadHeader: body.ExecutionPayloadHeader.Copy(),
|
||||||
BlsToExecutionChanges: CopyBLSToExecutionChanges(body.BlsToExecutionChanges),
|
BlsToExecutionChanges: CopySlice(body.BlsToExecutionChanges),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -449,16 +313,16 @@ func CopyBlindedBeaconBlockBodyDeneb(body *BlindedBeaconBlockBodyDeneb) *Blinded
|
|||||||
}
|
}
|
||||||
return &BlindedBeaconBlockBodyDeneb{
|
return &BlindedBeaconBlockBodyDeneb{
|
||||||
RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal),
|
RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal),
|
||||||
Eth1Data: CopyETH1Data(body.Eth1Data),
|
Eth1Data: body.Eth1Data.Copy(),
|
||||||
Graffiti: bytesutil.SafeCopyBytes(body.Graffiti),
|
Graffiti: bytesutil.SafeCopyBytes(body.Graffiti),
|
||||||
ProposerSlashings: CopyProposerSlashings(body.ProposerSlashings),
|
ProposerSlashings: CopySlice(body.ProposerSlashings),
|
||||||
AttesterSlashings: copySlice(body.AttesterSlashings),
|
AttesterSlashings: CopySlice(body.AttesterSlashings),
|
||||||
Attestations: copySlice(body.Attestations),
|
Attestations: CopySlice(body.Attestations),
|
||||||
Deposits: CopyDeposits(body.Deposits),
|
Deposits: CopySlice(body.Deposits),
|
||||||
VoluntaryExits: CopySignedVoluntaryExits(body.VoluntaryExits),
|
VoluntaryExits: CopySlice(body.VoluntaryExits),
|
||||||
SyncAggregate: CopySyncAggregate(body.SyncAggregate),
|
SyncAggregate: body.SyncAggregate.Copy(),
|
||||||
ExecutionPayloadHeader: body.ExecutionPayloadHeader.Copy(),
|
ExecutionPayloadHeader: body.ExecutionPayloadHeader.Copy(),
|
||||||
BlsToExecutionChanges: CopyBLSToExecutionChanges(body.BlsToExecutionChanges),
|
BlsToExecutionChanges: CopySlice(body.BlsToExecutionChanges),
|
||||||
BlobKzgCommitments: CopyBlobKZGs(body.BlobKzgCommitments),
|
BlobKzgCommitments: CopyBlobKZGs(body.BlobKzgCommitments),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -495,16 +359,16 @@ func CopyBlindedBeaconBlockBodyElectra(body *BlindedBeaconBlockBodyElectra) *Bli
|
|||||||
}
|
}
|
||||||
return &BlindedBeaconBlockBodyElectra{
|
return &BlindedBeaconBlockBodyElectra{
|
||||||
RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal),
|
RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal),
|
||||||
Eth1Data: CopyETH1Data(body.Eth1Data),
|
Eth1Data: body.Eth1Data.Copy(),
|
||||||
Graffiti: bytesutil.SafeCopyBytes(body.Graffiti),
|
Graffiti: bytesutil.SafeCopyBytes(body.Graffiti),
|
||||||
ProposerSlashings: CopyProposerSlashings(body.ProposerSlashings),
|
ProposerSlashings: CopySlice(body.ProposerSlashings),
|
||||||
AttesterSlashings: copySlice(body.AttesterSlashings),
|
AttesterSlashings: CopySlice(body.AttesterSlashings),
|
||||||
Attestations: copySlice(body.Attestations),
|
Attestations: CopySlice(body.Attestations),
|
||||||
Deposits: CopyDeposits(body.Deposits),
|
Deposits: CopySlice(body.Deposits),
|
||||||
VoluntaryExits: CopySignedVoluntaryExits(body.VoluntaryExits),
|
VoluntaryExits: CopySlice(body.VoluntaryExits),
|
||||||
SyncAggregate: CopySyncAggregate(body.SyncAggregate),
|
SyncAggregate: body.SyncAggregate.Copy(),
|
||||||
ExecutionPayloadHeader: body.ExecutionPayloadHeader.Copy(),
|
ExecutionPayloadHeader: body.ExecutionPayloadHeader.Copy(),
|
||||||
BlsToExecutionChanges: CopyBLSToExecutionChanges(body.BlsToExecutionChanges),
|
BlsToExecutionChanges: CopySlice(body.BlsToExecutionChanges),
|
||||||
BlobKzgCommitments: CopyBlobKZGs(body.BlobKzgCommitments),
|
BlobKzgCommitments: CopyBlobKZGs(body.BlobKzgCommitments),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -541,38 +405,18 @@ func CopyBlindedBeaconBlockBodyBellatrix(body *BlindedBeaconBlockBodyBellatrix)
|
|||||||
}
|
}
|
||||||
return &BlindedBeaconBlockBodyBellatrix{
|
return &BlindedBeaconBlockBodyBellatrix{
|
||||||
RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal),
|
RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal),
|
||||||
Eth1Data: CopyETH1Data(body.Eth1Data),
|
Eth1Data: body.Eth1Data.Copy(),
|
||||||
Graffiti: bytesutil.SafeCopyBytes(body.Graffiti),
|
Graffiti: bytesutil.SafeCopyBytes(body.Graffiti),
|
||||||
ProposerSlashings: CopyProposerSlashings(body.ProposerSlashings),
|
ProposerSlashings: CopySlice(body.ProposerSlashings),
|
||||||
AttesterSlashings: copySlice(body.AttesterSlashings),
|
AttesterSlashings: CopySlice(body.AttesterSlashings),
|
||||||
Attestations: copySlice(body.Attestations),
|
Attestations: CopySlice(body.Attestations),
|
||||||
Deposits: CopyDeposits(body.Deposits),
|
Deposits: CopySlice(body.Deposits),
|
||||||
VoluntaryExits: CopySignedVoluntaryExits(body.VoluntaryExits),
|
VoluntaryExits: CopySlice(body.VoluntaryExits),
|
||||||
SyncAggregate: CopySyncAggregate(body.SyncAggregate),
|
SyncAggregate: body.SyncAggregate.Copy(),
|
||||||
ExecutionPayloadHeader: body.ExecutionPayloadHeader.Copy(),
|
ExecutionPayloadHeader: body.ExecutionPayloadHeader.Copy(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func CopyBLSToExecutionChanges(changes []*SignedBLSToExecutionChange) []*SignedBLSToExecutionChange {
|
|
||||||
if changes == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
res := make([]*SignedBLSToExecutionChange, len(changes))
|
|
||||||
for i := 0; i < len(changes); i++ {
|
|
||||||
res[i] = &SignedBLSToExecutionChange{
|
|
||||||
Message: &BLSToExecutionChange{
|
|
||||||
ValidatorIndex: changes[i].Message.ValidatorIndex,
|
|
||||||
FromBlsPubkey: bytesutil.SafeCopyBytes(changes[i].Message.FromBlsPubkey),
|
|
||||||
ToExecutionAddress: bytesutil.SafeCopyBytes(changes[i].Message.ToExecutionAddress),
|
|
||||||
},
|
|
||||||
Signature: bytesutil.SafeCopyBytes(changes[i].Signature),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
// CopyBlobKZGs copies the provided blob kzgs object.
|
// CopyBlobKZGs copies the provided blob kzgs object.
|
||||||
func CopyBlobKZGs(b [][]byte) [][]byte {
|
func CopyBlobKZGs(b [][]byte) [][]byte {
|
||||||
return bytesutil.SafeCopy2dBytes(b)
|
return bytesutil.SafeCopy2dBytes(b)
|
||||||
@@ -610,16 +454,16 @@ func CopyBeaconBlockBodyDeneb(body *BeaconBlockBodyDeneb) *BeaconBlockBodyDeneb
|
|||||||
}
|
}
|
||||||
return &BeaconBlockBodyDeneb{
|
return &BeaconBlockBodyDeneb{
|
||||||
RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal),
|
RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal),
|
||||||
Eth1Data: CopyETH1Data(body.Eth1Data),
|
Eth1Data: body.Eth1Data.Copy(),
|
||||||
Graffiti: bytesutil.SafeCopyBytes(body.Graffiti),
|
Graffiti: bytesutil.SafeCopyBytes(body.Graffiti),
|
||||||
ProposerSlashings: CopyProposerSlashings(body.ProposerSlashings),
|
ProposerSlashings: CopySlice(body.ProposerSlashings),
|
||||||
AttesterSlashings: copySlice(body.AttesterSlashings),
|
AttesterSlashings: CopySlice(body.AttesterSlashings),
|
||||||
Attestations: copySlice(body.Attestations),
|
Attestations: CopySlice(body.Attestations),
|
||||||
Deposits: CopyDeposits(body.Deposits),
|
Deposits: CopySlice(body.Deposits),
|
||||||
VoluntaryExits: CopySignedVoluntaryExits(body.VoluntaryExits),
|
VoluntaryExits: CopySlice(body.VoluntaryExits),
|
||||||
SyncAggregate: CopySyncAggregate(body.SyncAggregate),
|
SyncAggregate: body.SyncAggregate.Copy(),
|
||||||
ExecutionPayload: body.ExecutionPayload.Copy(),
|
ExecutionPayload: body.ExecutionPayload.Copy(),
|
||||||
BlsToExecutionChanges: CopyBLSToExecutionChanges(body.BlsToExecutionChanges),
|
BlsToExecutionChanges: CopySlice(body.BlsToExecutionChanges),
|
||||||
BlobKzgCommitments: CopyBlobKZGs(body.BlobKzgCommitments),
|
BlobKzgCommitments: CopyBlobKZGs(body.BlobKzgCommitments),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -656,75 +500,16 @@ func CopyBeaconBlockBodyElectra(body *BeaconBlockBodyElectra) *BeaconBlockBodyEl
|
|||||||
}
|
}
|
||||||
return &BeaconBlockBodyElectra{
|
return &BeaconBlockBodyElectra{
|
||||||
RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal),
|
RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal),
|
||||||
Eth1Data: CopyETH1Data(body.Eth1Data),
|
Eth1Data: body.Eth1Data.Copy(),
|
||||||
Graffiti: bytesutil.SafeCopyBytes(body.Graffiti),
|
Graffiti: bytesutil.SafeCopyBytes(body.Graffiti),
|
||||||
ProposerSlashings: CopyProposerSlashings(body.ProposerSlashings),
|
ProposerSlashings: CopySlice(body.ProposerSlashings),
|
||||||
AttesterSlashings: copySlice(body.AttesterSlashings),
|
AttesterSlashings: CopySlice(body.AttesterSlashings),
|
||||||
Attestations: copySlice(body.Attestations),
|
Attestations: CopySlice(body.Attestations),
|
||||||
Deposits: CopyDeposits(body.Deposits),
|
Deposits: CopySlice(body.Deposits),
|
||||||
VoluntaryExits: CopySignedVoluntaryExits(body.VoluntaryExits),
|
VoluntaryExits: CopySlice(body.VoluntaryExits),
|
||||||
SyncAggregate: CopySyncAggregate(body.SyncAggregate),
|
SyncAggregate: body.SyncAggregate.Copy(),
|
||||||
ExecutionPayload: body.ExecutionPayload.Copy(),
|
ExecutionPayload: body.ExecutionPayload.Copy(),
|
||||||
BlsToExecutionChanges: CopyBLSToExecutionChanges(body.BlsToExecutionChanges),
|
BlsToExecutionChanges: CopySlice(body.BlsToExecutionChanges),
|
||||||
BlobKzgCommitments: CopyBlobKZGs(body.BlobKzgCommitments),
|
BlobKzgCommitments: CopyBlobKZGs(body.BlobKzgCommitments),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// CopyHistoricalSummaries copies the historical summaries.
|
|
||||||
func CopyHistoricalSummaries(summaries []*HistoricalSummary) []*HistoricalSummary {
|
|
||||||
if summaries == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
newSummaries := make([]*HistoricalSummary, len(summaries))
|
|
||||||
for i, s := range summaries {
|
|
||||||
newSummaries[i] = &HistoricalSummary{
|
|
||||||
BlockSummaryRoot: bytesutil.SafeCopyBytes(s.BlockSummaryRoot),
|
|
||||||
StateSummaryRoot: bytesutil.SafeCopyBytes(s.StateSummaryRoot),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return newSummaries
|
|
||||||
}
|
|
||||||
|
|
||||||
// CopyPartialWithdrawals copies the provided partial withdrawals.
|
|
||||||
func CopyPendingPartialWithdrawals(pws []*PendingPartialWithdrawal) []*PendingPartialWithdrawal {
|
|
||||||
if pws == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
newPws := make([]*PendingPartialWithdrawal, len(pws))
|
|
||||||
for i, pw := range pws {
|
|
||||||
newPws[i] = &PendingPartialWithdrawal{
|
|
||||||
Index: pw.Index,
|
|
||||||
Amount: pw.Amount,
|
|
||||||
WithdrawableEpoch: pw.WithdrawableEpoch,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return newPws
|
|
||||||
}
|
|
||||||
|
|
||||||
func CopyPendingConsolidations(pcs []*PendingConsolidation) []*PendingConsolidation {
|
|
||||||
if pcs == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
newPcs := make([]*PendingConsolidation, len(pcs))
|
|
||||||
for i, pc := range pcs {
|
|
||||||
newPcs[i] = &PendingConsolidation{
|
|
||||||
SourceIndex: pc.SourceIndex,
|
|
||||||
TargetIndex: pc.TargetIndex,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return newPcs
|
|
||||||
}
|
|
||||||
|
|
||||||
func CopyPendingBalanceDeposits(pbd []*PendingBalanceDeposit) []*PendingBalanceDeposit {
|
|
||||||
if pbd == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
newPbd := make([]*PendingBalanceDeposit, len(pbd))
|
|
||||||
for i, pb := range pbd {
|
|
||||||
newPbd[i] = &PendingBalanceDeposit{
|
|
||||||
Index: pb.Index,
|
|
||||||
Amount: pb.Amount,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return newPbd
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -10,16 +10,6 @@ import (
|
|||||||
"github.com/prysmaticlabs/prysm/v5/testing/assert"
|
"github.com/prysmaticlabs/prysm/v5/testing/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCopyETH1Data(t *testing.T) {
|
|
||||||
data := genEth1Data()
|
|
||||||
|
|
||||||
got := v1alpha1.CopyETH1Data(data)
|
|
||||||
if !reflect.DeepEqual(got, data) {
|
|
||||||
t.Errorf("CopyETH1Data() = %v, want %v", got, data)
|
|
||||||
}
|
|
||||||
assert.NotEmpty(t, got, "Copied eth1data has empty fields")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCopySignedBeaconBlock(t *testing.T) {
|
func TestCopySignedBeaconBlock(t *testing.T) {
|
||||||
blk := genSignedBeaconBlock()
|
blk := genSignedBeaconBlock()
|
||||||
|
|
||||||
@@ -80,96 +70,6 @@ func TestCopyBeaconBlockBodyAltair(t *testing.T) {
|
|||||||
assert.NotEmpty(t, bb, "Copied beacon block body altair has empty fields")
|
assert.NotEmpty(t, bb, "Copied beacon block body altair has empty fields")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCopyProposerSlashings(t *testing.T) {
|
|
||||||
ps := genProposerSlashings(10)
|
|
||||||
|
|
||||||
got := v1alpha1.CopyProposerSlashings(ps)
|
|
||||||
if !reflect.DeepEqual(got, ps) {
|
|
||||||
t.Errorf("CopyProposerSlashings() = %v, want %v", got, ps)
|
|
||||||
}
|
|
||||||
assert.NotEmpty(t, got, "Copied proposer slashings have empty fields")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCopyProposerSlashing(t *testing.T) {
|
|
||||||
ps := genProposerSlashing()
|
|
||||||
|
|
||||||
got := v1alpha1.CopyProposerSlashing(ps)
|
|
||||||
if !reflect.DeepEqual(got, ps) {
|
|
||||||
t.Errorf("CopyProposerSlashing() = %v, want %v", got, ps)
|
|
||||||
}
|
|
||||||
assert.NotEmpty(t, got, "Copied proposer slashing has empty fields")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCopySignedBeaconBlockHeader(t *testing.T) {
|
|
||||||
sbh := genSignedBeaconBlockHeader()
|
|
||||||
|
|
||||||
got := v1alpha1.CopySignedBeaconBlockHeader(sbh)
|
|
||||||
if !reflect.DeepEqual(got, sbh) {
|
|
||||||
t.Errorf("CopySignedBeaconBlockHeader() = %v, want %v", got, sbh)
|
|
||||||
}
|
|
||||||
assert.NotEmpty(t, got, "Copied signed beacon block header has empty fields")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCopyBeaconBlockHeader(t *testing.T) {
|
|
||||||
bh := genBeaconBlockHeader()
|
|
||||||
|
|
||||||
got := v1alpha1.CopyBeaconBlockHeader(bh)
|
|
||||||
if !reflect.DeepEqual(got, bh) {
|
|
||||||
t.Errorf("CopyBeaconBlockHeader() = %v, want %v", got, bh)
|
|
||||||
}
|
|
||||||
assert.NotEmpty(t, got, "Copied beacon block header has empty fields")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCopyDeposits(t *testing.T) {
|
|
||||||
d := genDeposits(10)
|
|
||||||
|
|
||||||
got := v1alpha1.CopyDeposits(d)
|
|
||||||
if !reflect.DeepEqual(got, d) {
|
|
||||||
t.Errorf("CopyDeposits() = %v, want %v", got, d)
|
|
||||||
}
|
|
||||||
assert.NotEmpty(t, got, "Copied deposits have empty fields")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCopyDeposit(t *testing.T) {
|
|
||||||
d := genDeposit()
|
|
||||||
|
|
||||||
got := v1alpha1.CopyDeposit(d)
|
|
||||||
if !reflect.DeepEqual(got, d) {
|
|
||||||
t.Errorf("CopyDeposit() = %v, want %v", got, d)
|
|
||||||
}
|
|
||||||
assert.NotEmpty(t, got, "Copied deposit has empty fields")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCopyDepositData(t *testing.T) {
|
|
||||||
dd := genDepositData()
|
|
||||||
|
|
||||||
got := v1alpha1.CopyDepositData(dd)
|
|
||||||
if !reflect.DeepEqual(got, dd) {
|
|
||||||
t.Errorf("CopyDepositData() = %v, want %v", got, dd)
|
|
||||||
}
|
|
||||||
assert.NotEmpty(t, got, "Copied deposit data has empty fields")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCopySignedVoluntaryExits(t *testing.T) {
|
|
||||||
sv := genSignedVoluntaryExits(10)
|
|
||||||
|
|
||||||
got := v1alpha1.CopySignedVoluntaryExits(sv)
|
|
||||||
if !reflect.DeepEqual(got, sv) {
|
|
||||||
t.Errorf("CopySignedVoluntaryExits() = %v, want %v", got, sv)
|
|
||||||
}
|
|
||||||
assert.NotEmpty(t, got, "Copied signed voluntary exits have empty fields")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCopySignedVoluntaryExit(t *testing.T) {
|
|
||||||
sv := genSignedVoluntaryExit()
|
|
||||||
|
|
||||||
got := v1alpha1.CopySignedVoluntaryExit(sv)
|
|
||||||
if !reflect.DeepEqual(got, sv) {
|
|
||||||
t.Errorf("CopySignedVoluntaryExit() = %v, want %v", got, sv)
|
|
||||||
}
|
|
||||||
assert.NotEmpty(t, got, "Copied signed voluntary exit has empty fields")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCopyValidator(t *testing.T) {
|
func TestCopyValidator(t *testing.T) {
|
||||||
v := genValidator()
|
v := genValidator()
|
||||||
|
|
||||||
@@ -200,16 +100,6 @@ func TestCopySyncCommitteeContribution(t *testing.T) {
|
|||||||
assert.NotEmpty(t, got, "Copied sync committee contribution has empty fields")
|
assert.NotEmpty(t, got, "Copied sync committee contribution has empty fields")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCopySyncAggregate(t *testing.T) {
|
|
||||||
sa := genSyncAggregate()
|
|
||||||
|
|
||||||
got := v1alpha1.CopySyncAggregate(sa)
|
|
||||||
if !reflect.DeepEqual(got, sa) {
|
|
||||||
t.Errorf("CopySyncAggregate() = %v, want %v", got, sa)
|
|
||||||
}
|
|
||||||
assert.NotEmpty(t, got, "Copied sync aggregate has empty fields")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCopyPendingAttestationSlice(t *testing.T) {
|
func TestCopyPendingAttestationSlice(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
@@ -428,27 +318,6 @@ func bytes(length int) []byte {
|
|||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCopyBLSToExecutionChanges(t *testing.T) {
|
|
||||||
changes := genBLSToExecutionChanges(10)
|
|
||||||
|
|
||||||
got := v1alpha1.CopyBLSToExecutionChanges(changes)
|
|
||||||
if !reflect.DeepEqual(got, changes) {
|
|
||||||
t.Errorf("TestCopyBLSToExecutionChanges() = %v, want %v", got, changes)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCopyHistoricalSummaries(t *testing.T) {
|
|
||||||
summaries := []*v1alpha1.HistoricalSummary{
|
|
||||||
{BlockSummaryRoot: []byte("block summary root 0"), StateSummaryRoot: []byte("state summary root 0")},
|
|
||||||
{BlockSummaryRoot: []byte("block summary root 1"), StateSummaryRoot: []byte("state summary root 1")},
|
|
||||||
}
|
|
||||||
|
|
||||||
got := v1alpha1.CopyHistoricalSummaries(summaries)
|
|
||||||
if !reflect.DeepEqual(got, summaries) {
|
|
||||||
t.Errorf("TestCopyHistoricalSummariesing() = %v, want %v", got, summaries)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCopySignedBlindedBeaconBlockElectra(t *testing.T) {
|
func TestCopySignedBlindedBeaconBlockElectra(t *testing.T) {
|
||||||
sbb := genSignedBlindedBeaconBlockElectra()
|
sbb := genSignedBlindedBeaconBlockElectra()
|
||||||
|
|
||||||
@@ -503,33 +372,6 @@ func TestCopyBeaconBlockBodyElectra(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCopyPendingPartialWithdrawals(t *testing.T) {
|
|
||||||
ppws := genPendingPartialWithdrawals(10)
|
|
||||||
|
|
||||||
got := v1alpha1.CopyPendingPartialWithdrawals(ppws)
|
|
||||||
if !reflect.DeepEqual(got, ppws) {
|
|
||||||
t.Errorf("TestCopyPendingPartialWithdrawals() = %v, want %v", got, ppws)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCopyPendingConsolidations(t *testing.T) {
|
|
||||||
pcs := genPendingConsolidations(10)
|
|
||||||
|
|
||||||
got := v1alpha1.CopyPendingConsolidations(pcs)
|
|
||||||
if !reflect.DeepEqual(got, pcs) {
|
|
||||||
t.Errorf("TestCopyPendingConsolidations() = %v, want %v", got, pcs)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCopyPendingBalanceDeposits(t *testing.T) {
|
|
||||||
pbds := genPendingBalanceDeposits(10)
|
|
||||||
|
|
||||||
got := v1alpha1.CopyPendingBalanceDeposits(pbds)
|
|
||||||
if !reflect.DeepEqual(got, pbds) {
|
|
||||||
t.Errorf("TestCopyPendingBalanceDeposits() = %v, want %v", got, pbds)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func genAttestation() *v1alpha1.Attestation {
|
func genAttestation() *v1alpha1.Attestation {
|
||||||
return &v1alpha1.Attestation{
|
return &v1alpha1.Attestation{
|
||||||
AggregationBits: bytes(32),
|
AggregationBits: bytes(32),
|
||||||
|
|||||||
24
proto/prysm/v1alpha1/eip_7521.go
Normal file
24
proto/prysm/v1alpha1/eip_7521.go
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
package eth
|
||||||
|
|
||||||
|
// Copy --
|
||||||
|
func (pw *PendingPartialWithdrawal) Copy() *PendingPartialWithdrawal {
|
||||||
|
if pw == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return &PendingPartialWithdrawal{
|
||||||
|
Index: pw.Index,
|
||||||
|
Amount: pw.Amount,
|
||||||
|
WithdrawableEpoch: pw.WithdrawableEpoch,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy --
|
||||||
|
func (pc *PendingConsolidation) Copy() *PendingConsolidation {
|
||||||
|
if pc == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return &PendingConsolidation{
|
||||||
|
SourceIndex: pc.SourceIndex,
|
||||||
|
TargetIndex: pc.TargetIndex,
|
||||||
|
}
|
||||||
|
}
|
||||||
12
proto/prysm/v1alpha1/eip_7521_fuzz_test.go
Normal file
12
proto/prysm/v1alpha1/eip_7521_fuzz_test.go
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package eth_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
eth "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestCopyEip7521Types_Fuzz(t *testing.T) {
|
||||||
|
fuzzCopies(t, ð.PendingPartialWithdrawal{})
|
||||||
|
fuzzCopies(t, ð.PendingConsolidation{})
|
||||||
|
}
|
||||||
25
proto/prysm/v1alpha1/fuzz_test.go
Normal file
25
proto/prysm/v1alpha1/fuzz_test.go
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
package eth_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
fuzz "github.com/google/gofuzz"
|
||||||
|
eth "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1"
|
||||||
|
"github.com/prysmaticlabs/prysm/v5/testing/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func fuzzCopies[T any, C eth.Copier[T]](t *testing.T, obj C) {
|
||||||
|
fuzzer := fuzz.NewWithSeed(0)
|
||||||
|
amount := 1000
|
||||||
|
t.Run(fmt.Sprintf("%T", obj), func(t *testing.T) {
|
||||||
|
for i := 0; i < amount; i++ {
|
||||||
|
fuzzer.Fuzz(obj) // Populate thing with random values
|
||||||
|
|
||||||
|
got := obj.Copy()
|
||||||
|
require.DeepEqual(t, obj, got)
|
||||||
|
// TODO: add deep fuzzing and checks for deep not equals
|
||||||
|
// we should test that modifying the copy doesn't modify the original object
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user