diff --git a/beacon-chain/core/blocks/eth1_data.go b/beacon-chain/core/blocks/eth1_data.go index 11b06c903a..7d44edb8f8 100644 --- a/beacon-chain/core/blocks/eth1_data.go +++ b/beacon-chain/core/blocks/eth1_data.go @@ -58,10 +58,9 @@ func AreEth1DataEqual(a, b *ethpb.Eth1Data) bool { // votes to see if they match the eth1data. func Eth1DataHasEnoughSupport(beaconState state.ReadOnlyBeaconState, data *ethpb.Eth1Data) (bool, error) { voteCount := uint64(0) - data = ethpb.CopyETH1Data(data) for _, vote := range beaconState.Eth1DataVotes() { - if AreEth1DataEqual(vote, data) { + if AreEth1DataEqual(vote, data.Copy()) { voteCount++ } } diff --git a/beacon-chain/core/blocks/eth1_data_test.go b/beacon-chain/core/blocks/eth1_data_test.go index 31e7295ecd..aee84afb91 100644 --- a/beacon-chain/core/blocks/eth1_data_test.go +++ b/beacon-chain/core/blocks/eth1_data_test.go @@ -186,7 +186,7 @@ func TestProcessEth1Data_SetsCorrectly(t *testing.T) { if len(newETH1DataVotes) <= 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( "Expected latest eth1 data to have been set to %v, received %v", b.Block.Body.Eth1Data, diff --git a/beacon-chain/core/transition/altair_transition_no_verify_sig_test.go b/beacon-chain/core/transition/altair_transition_no_verify_sig_test.go index 783b37f9a9..d2ddb0b700 100644 --- a/beacon-chain/core/transition/altair_transition_no_verify_sig_test.go +++ b/beacon-chain/core/transition/altair_transition_no_verify_sig_test.go @@ -70,7 +70,7 @@ func TestExecuteAltairStateTransitionNoVerify_FullProcess(t *testing.T) { } indices, err := altair.NextSyncCommitteeIndices(context.Background(), beaconState) require.NoError(t, err) - h := ethpb.CopyBeaconBlockHeader(beaconState.LatestBlockHeader()) + h := beaconState.LatestBlockHeader().Copy() prevStateRoot, err := beaconState.HashTreeRoot(context.Background()) require.NoError(t, err) h.StateRoot = prevStateRoot[:] @@ -157,7 +157,7 @@ func TestExecuteAltairStateTransitionNoVerifySignature_CouldNotVerifyStateRoot(t } indices, err := altair.NextSyncCommitteeIndices(context.Background(), beaconState) require.NoError(t, err) - h := ethpb.CopyBeaconBlockHeader(beaconState.LatestBlockHeader()) + h := beaconState.LatestBlockHeader().Copy() prevStateRoot, err := beaconState.HashTreeRoot(context.Background()) require.NoError(t, err) h.StateRoot = prevStateRoot[:] diff --git a/beacon-chain/core/transition/bellatrix_transition_no_verify_sig_test.go b/beacon-chain/core/transition/bellatrix_transition_no_verify_sig_test.go index cb36c1b8b2..bef3baa8a5 100644 --- a/beacon-chain/core/transition/bellatrix_transition_no_verify_sig_test.go +++ b/beacon-chain/core/transition/bellatrix_transition_no_verify_sig_test.go @@ -72,7 +72,7 @@ func TestExecuteBellatrixStateTransitionNoVerify_FullProcess(t *testing.T) { } indices, err := altair.NextSyncCommitteeIndices(context.Background(), beaconState) require.NoError(t, err) - h := ethpb.CopyBeaconBlockHeader(beaconState.LatestBlockHeader()) + h := beaconState.LatestBlockHeader().Copy() prevStateRoot, err := beaconState.HashTreeRoot(context.Background()) require.NoError(t, err) h.StateRoot = prevStateRoot[:] @@ -159,7 +159,7 @@ func TestExecuteBellatrixStateTransitionNoVerifySignature_CouldNotVerifyStateRoo } indices, err := altair.NextSyncCommitteeIndices(context.Background(), beaconState) require.NoError(t, err) - h := ethpb.CopyBeaconBlockHeader(beaconState.LatestBlockHeader()) + h := beaconState.LatestBlockHeader().Copy() prevStateRoot, err := beaconState.HashTreeRoot(context.Background()) require.NoError(t, err) h.StateRoot = prevStateRoot[:] diff --git a/beacon-chain/state/state-native/getters_balance_deposits.go b/beacon-chain/state/state-native/getters_balance_deposits.go index e7257dd0c2..b31b872f08 100644 --- a/beacon-chain/state/state-native/getters_balance_deposits.go +++ b/beacon-chain/state/state-native/getters_balance_deposits.go @@ -35,5 +35,5 @@ func (b *BeaconState) pendingBalanceDepositsVal() []*ethpb.PendingBalanceDeposit return nil } - return ethpb.CopyPendingBalanceDeposits(b.pendingBalanceDeposits) + return ethpb.CopySlice(b.pendingBalanceDeposits) } diff --git a/beacon-chain/state/state-native/getters_consolidation.go b/beacon-chain/state/state-native/getters_consolidation.go index 0ec07328f5..b2b4abdd3f 100644 --- a/beacon-chain/state/state-native/getters_consolidation.go +++ b/beacon-chain/state/state-native/getters_consolidation.go @@ -59,5 +59,5 @@ func (b *BeaconState) pendingConsolidationsVal() []*ethpb.PendingConsolidation { return nil } - return ethpb.CopyPendingConsolidations(b.pendingConsolidations) + return ethpb.CopySlice(b.pendingConsolidations) } diff --git a/beacon-chain/state/state-native/getters_eth1.go b/beacon-chain/state/state-native/getters_eth1.go index f81697abb5..c0450c5437 100644 --- a/beacon-chain/state/state-native/getters_eth1.go +++ b/beacon-chain/state/state-native/getters_eth1.go @@ -23,7 +23,7 @@ func (b *BeaconState) eth1DataVal() *ethpb.Eth1Data { return nil } - return ethpb.CopyETH1Data(b.eth1Data) + return b.eth1Data.Copy() } // 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)) for i := 0; i < len(res); i++ { - res[i] = ethpb.CopyETH1Data(b.eth1DataVotes[i]) + res[i] = b.eth1DataVotes[i].Copy() } return res } diff --git a/beacon-chain/state/state-native/getters_misc.go b/beacon-chain/state/state-native/getters_misc.go index 21f3de0117..89f165614e 100644 --- a/beacon-chain/state/state-native/getters_misc.go +++ b/beacon-chain/state/state-native/getters_misc.go @@ -103,5 +103,5 @@ func (b *BeaconState) HistoricalSummaries() ([]*ethpb.HistoricalSummary, error) // historicalSummariesVal of the beacon state. // This assumes that a lock is already held on BeaconState. func (b *BeaconState) historicalSummariesVal() []*ethpb.HistoricalSummary { - return ethpb.CopyHistoricalSummaries(b.historicalSummaries) + return ethpb.CopySlice(b.historicalSummaries) } diff --git a/beacon-chain/state/state-native/getters_withdrawal.go b/beacon-chain/state/state-native/getters_withdrawal.go index 116363c772..e2a26d0296 100644 --- a/beacon-chain/state/state-native/getters_withdrawal.go +++ b/beacon-chain/state/state-native/getters_withdrawal.go @@ -184,7 +184,7 @@ func (b *BeaconState) ExpectedWithdrawals() ([]*enginev1.Withdrawal, uint64, err } func (b *BeaconState) pendingPartialWithdrawalsVal() []*ethpb.PendingPartialWithdrawal { - return ethpb.CopyPendingPartialWithdrawals(b.pendingPartialWithdrawals) + return ethpb.CopySlice(b.pendingPartialWithdrawals) } func (b *BeaconState) NumPendingPartialWithdrawals() (uint64, error) { diff --git a/beacon-chain/state/state-native/setters_block.go b/beacon-chain/state/state-native/setters_block.go index 95e8414964..977c434094 100644 --- a/beacon-chain/state/state-native/setters_block.go +++ b/beacon-chain/state/state-native/setters_block.go @@ -15,7 +15,7 @@ func (b *BeaconState) SetLatestBlockHeader(val *ethpb.BeaconBlockHeader) error { b.lock.Lock() defer b.lock.Unlock() - b.latestBlockHeader = ethpb.CopyBeaconBlockHeader(val) + b.latestBlockHeader = val.Copy() b.markFieldAsDirty(types.LatestBlockHeader) return nil } diff --git a/contracts/deposit/deposit.go b/contracts/deposit/deposit.go index cd399a65e0..ff07d5d96c 100644 --- a/contracts/deposit/deposit.go +++ b/contracts/deposit/deposit.go @@ -81,7 +81,7 @@ func WithdrawalCredentialsHash(withdrawalKey bls.SecretKey) []byte { // VerifyDepositSignature verifies the correctness of Eth1 deposit BLS signature func VerifyDepositSignature(dd *ethpb.Deposit_Data, domain []byte) error { - ddCopy := ethpb.CopyDepositData(dd) + ddCopy := dd.Copy() publicKey, err := bls.PublicKeyFromBytes(ddCopy.PublicKey) if err != nil { return errors.Wrap(err, "could not convert bytes to public key") diff --git a/proto/prysm/v1alpha1/BUILD.bazel b/proto/prysm/v1alpha1/BUILD.bazel index 2acb80cafe..0c6f88327c 100644 --- a/proto/prysm/v1alpha1/BUILD.bazel +++ b/proto/prysm/v1alpha1/BUILD.bazel @@ -308,7 +308,9 @@ go_library( name = "go_default_library", srcs = [ "attestation.go", + "beacon_block.go", "cloners.go", + "eip_7521.go", "sync_committee_mainnet.go", "sync_committee_minimal.go", # keep ":ssz_generated_non_core", # keep @@ -372,8 +374,11 @@ go_test( name = "go_default_test", srcs = [ "attestation_fuzz_test.go", + "beacon_block_fuzz_test.go", "cloners_test.go", + "eip_7521_fuzz_test.go", "export_test.go", + "fuzz_test.go", ], embed = [":go_default_library"], deps = [ diff --git a/proto/prysm/v1alpha1/attestation_fuzz_test.go b/proto/prysm/v1alpha1/attestation_fuzz_test.go index 1334d0b62f..174d509cdb 100644 --- a/proto/prysm/v1alpha1/attestation_fuzz_test.go +++ b/proto/prysm/v1alpha1/attestation_fuzz_test.go @@ -1,15 +1,12 @@ 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 TestCopyExecutionPayloadHeader_Fuzz(t *testing.T) { +func TestCopyAttestation_Fuzz(t *testing.T) { fuzzCopies(t, ð.Checkpoint{}) fuzzCopies(t, ð.AttestationData{}) fuzzCopies(t, ð.Attestation{}) @@ -20,19 +17,3 @@ func TestCopyExecutionPayloadHeader_Fuzz(t *testing.T) { fuzzCopies(t, ð.AttesterSlashing{}) 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 - } - }) -} diff --git a/proto/prysm/v1alpha1/beacon_block.go b/proto/prysm/v1alpha1/beacon_block.go new file mode 100644 index 0000000000..50171fa2dc --- /dev/null +++ b/proto/prysm/v1alpha1/beacon_block.go @@ -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, + } +} diff --git a/proto/prysm/v1alpha1/beacon_block_fuzz_test.go b/proto/prysm/v1alpha1/beacon_block_fuzz_test.go new file mode 100644 index 0000000000..71b81db9fe --- /dev/null +++ b/proto/prysm/v1alpha1/beacon_block_fuzz_test.go @@ -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{}) +} diff --git a/proto/prysm/v1alpha1/cloners.go b/proto/prysm/v1alpha1/cloners.go index b5a1517f78..2104a0863f 100644 --- a/proto/prysm/v1alpha1/cloners.go +++ b/proto/prysm/v1alpha1/cloners.go @@ -8,7 +8,7 @@ type copier[T any] interface { 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 newSlice := make([]T, len(original)) for i := 0; i < len(newSlice); i++ { @@ -17,18 +17,6 @@ func copySlice[T any, C copier[T]](original []C) []T { 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. func CopySignedBeaconBlock(sigBlock *SignedBeaconBlock) *SignedBeaconBlock { if sigBlock == nil { @@ -61,13 +49,13 @@ func CopyBeaconBlockBody(body *BeaconBlockBody) *BeaconBlockBody { } return &BeaconBlockBody{ RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal), - Eth1Data: CopyETH1Data(body.Eth1Data), + Eth1Data: body.Eth1Data.Copy(), Graffiti: bytesutil.SafeCopyBytes(body.Graffiti), - ProposerSlashings: CopyProposerSlashings(body.ProposerSlashings), - AttesterSlashings: copySlice(body.AttesterSlashings), - Attestations: copySlice(body.Attestations), - Deposits: CopyDeposits(body.Deposits), - VoluntaryExits: CopySignedVoluntaryExits(body.VoluntaryExits), + ProposerSlashings: CopySlice(body.ProposerSlashings), + AttesterSlashings: CopySlice(body.AttesterSlashings), + Attestations: CopySlice(body.Attestations), + Deposits: CopySlice(body.Deposits), + VoluntaryExits: CopySlice(body.VoluntaryExits), } } @@ -103,127 +91,14 @@ func CopyBeaconBlockBodyAltair(body *BeaconBlockBodyAltair) *BeaconBlockBodyAlta } return &BeaconBlockBodyAltair{ RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal), - Eth1Data: CopyETH1Data(body.Eth1Data), + Eth1Data: body.Eth1Data.Copy(), Graffiti: bytesutil.SafeCopyBytes(body.Graffiti), - ProposerSlashings: CopyProposerSlashings(body.ProposerSlashings), - AttesterSlashings: copySlice(body.AttesterSlashings), - Attestations: copySlice(body.Attestations), - Deposits: CopyDeposits(body.Deposits), - VoluntaryExits: CopySignedVoluntaryExits(body.VoluntaryExits), - SyncAggregate: CopySyncAggregate(body.SyncAggregate), - } -} - -// 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), + ProposerSlashings: CopySlice(body.ProposerSlashings), + AttesterSlashings: CopySlice(body.AttesterSlashings), + Attestations: CopySlice(body.Attestations), + Deposits: CopySlice(body.Deposits), + VoluntaryExits: CopySlice(body.VoluntaryExits), + SyncAggregate: body.SyncAggregate.Copy(), } } @@ -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. func CopySignedBeaconBlockBellatrix(sigBlock *SignedBeaconBlockBellatrix) *SignedBeaconBlockBellatrix { if sigBlock == nil { @@ -315,14 +179,14 @@ func CopyBeaconBlockBodyBellatrix(body *BeaconBlockBodyBellatrix) *BeaconBlockBo } return &BeaconBlockBodyBellatrix{ RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal), - Eth1Data: CopyETH1Data(body.Eth1Data), + Eth1Data: body.Eth1Data.Copy(), Graffiti: bytesutil.SafeCopyBytes(body.Graffiti), - ProposerSlashings: CopyProposerSlashings(body.ProposerSlashings), - AttesterSlashings: copySlice(body.AttesterSlashings), - Attestations: copySlice(body.Attestations), - Deposits: CopyDeposits(body.Deposits), - VoluntaryExits: CopySignedVoluntaryExits(body.VoluntaryExits), - SyncAggregate: CopySyncAggregate(body.SyncAggregate), + ProposerSlashings: CopySlice(body.ProposerSlashings), + AttesterSlashings: CopySlice(body.AttesterSlashings), + Attestations: CopySlice(body.Attestations), + Deposits: CopySlice(body.Deposits), + VoluntaryExits: CopySlice(body.VoluntaryExits), + SyncAggregate: body.SyncAggregate.Copy(), ExecutionPayload: body.ExecutionPayload.Copy(), } } @@ -359,16 +223,16 @@ func CopyBeaconBlockBodyCapella(body *BeaconBlockBodyCapella) *BeaconBlockBodyCa } return &BeaconBlockBodyCapella{ RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal), - Eth1Data: CopyETH1Data(body.Eth1Data), + Eth1Data: body.Eth1Data.Copy(), Graffiti: bytesutil.SafeCopyBytes(body.Graffiti), - ProposerSlashings: CopyProposerSlashings(body.ProposerSlashings), - AttesterSlashings: copySlice(body.AttesterSlashings), - Attestations: copySlice(body.Attestations), - Deposits: CopyDeposits(body.Deposits), - VoluntaryExits: CopySignedVoluntaryExits(body.VoluntaryExits), - SyncAggregate: CopySyncAggregate(body.SyncAggregate), + ProposerSlashings: CopySlice(body.ProposerSlashings), + AttesterSlashings: CopySlice(body.AttesterSlashings), + Attestations: CopySlice(body.Attestations), + Deposits: CopySlice(body.Deposits), + VoluntaryExits: CopySlice(body.VoluntaryExits), + SyncAggregate: body.SyncAggregate.Copy(), ExecutionPayload: body.ExecutionPayload.Copy(), - BlsToExecutionChanges: CopyBLSToExecutionChanges(body.BlsToExecutionChanges), + BlsToExecutionChanges: CopySlice(body.BlsToExecutionChanges), } } @@ -404,16 +268,16 @@ func CopyBlindedBeaconBlockBodyCapella(body *BlindedBeaconBlockBodyCapella) *Bli } return &BlindedBeaconBlockBodyCapella{ RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal), - Eth1Data: CopyETH1Data(body.Eth1Data), + Eth1Data: body.Eth1Data.Copy(), Graffiti: bytesutil.SafeCopyBytes(body.Graffiti), - ProposerSlashings: CopyProposerSlashings(body.ProposerSlashings), - AttesterSlashings: copySlice(body.AttesterSlashings), - Attestations: copySlice(body.Attestations), - Deposits: CopyDeposits(body.Deposits), - VoluntaryExits: CopySignedVoluntaryExits(body.VoluntaryExits), - SyncAggregate: CopySyncAggregate(body.SyncAggregate), + ProposerSlashings: CopySlice(body.ProposerSlashings), + AttesterSlashings: CopySlice(body.AttesterSlashings), + Attestations: CopySlice(body.Attestations), + Deposits: CopySlice(body.Deposits), + VoluntaryExits: CopySlice(body.VoluntaryExits), + SyncAggregate: body.SyncAggregate.Copy(), ExecutionPayloadHeader: body.ExecutionPayloadHeader.Copy(), - BlsToExecutionChanges: CopyBLSToExecutionChanges(body.BlsToExecutionChanges), + BlsToExecutionChanges: CopySlice(body.BlsToExecutionChanges), } } @@ -449,16 +313,16 @@ func CopyBlindedBeaconBlockBodyDeneb(body *BlindedBeaconBlockBodyDeneb) *Blinded } return &BlindedBeaconBlockBodyDeneb{ RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal), - Eth1Data: CopyETH1Data(body.Eth1Data), + Eth1Data: body.Eth1Data.Copy(), Graffiti: bytesutil.SafeCopyBytes(body.Graffiti), - ProposerSlashings: CopyProposerSlashings(body.ProposerSlashings), - AttesterSlashings: copySlice(body.AttesterSlashings), - Attestations: copySlice(body.Attestations), - Deposits: CopyDeposits(body.Deposits), - VoluntaryExits: CopySignedVoluntaryExits(body.VoluntaryExits), - SyncAggregate: CopySyncAggregate(body.SyncAggregate), + ProposerSlashings: CopySlice(body.ProposerSlashings), + AttesterSlashings: CopySlice(body.AttesterSlashings), + Attestations: CopySlice(body.Attestations), + Deposits: CopySlice(body.Deposits), + VoluntaryExits: CopySlice(body.VoluntaryExits), + SyncAggregate: body.SyncAggregate.Copy(), ExecutionPayloadHeader: body.ExecutionPayloadHeader.Copy(), - BlsToExecutionChanges: CopyBLSToExecutionChanges(body.BlsToExecutionChanges), + BlsToExecutionChanges: CopySlice(body.BlsToExecutionChanges), BlobKzgCommitments: CopyBlobKZGs(body.BlobKzgCommitments), } } @@ -495,16 +359,16 @@ func CopyBlindedBeaconBlockBodyElectra(body *BlindedBeaconBlockBodyElectra) *Bli } return &BlindedBeaconBlockBodyElectra{ RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal), - Eth1Data: CopyETH1Data(body.Eth1Data), + Eth1Data: body.Eth1Data.Copy(), Graffiti: bytesutil.SafeCopyBytes(body.Graffiti), - ProposerSlashings: CopyProposerSlashings(body.ProposerSlashings), - AttesterSlashings: copySlice(body.AttesterSlashings), - Attestations: copySlice(body.Attestations), - Deposits: CopyDeposits(body.Deposits), - VoluntaryExits: CopySignedVoluntaryExits(body.VoluntaryExits), - SyncAggregate: CopySyncAggregate(body.SyncAggregate), + ProposerSlashings: CopySlice(body.ProposerSlashings), + AttesterSlashings: CopySlice(body.AttesterSlashings), + Attestations: CopySlice(body.Attestations), + Deposits: CopySlice(body.Deposits), + VoluntaryExits: CopySlice(body.VoluntaryExits), + SyncAggregate: body.SyncAggregate.Copy(), ExecutionPayloadHeader: body.ExecutionPayloadHeader.Copy(), - BlsToExecutionChanges: CopyBLSToExecutionChanges(body.BlsToExecutionChanges), + BlsToExecutionChanges: CopySlice(body.BlsToExecutionChanges), BlobKzgCommitments: CopyBlobKZGs(body.BlobKzgCommitments), } } @@ -541,38 +405,18 @@ func CopyBlindedBeaconBlockBodyBellatrix(body *BlindedBeaconBlockBodyBellatrix) } return &BlindedBeaconBlockBodyBellatrix{ RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal), - Eth1Data: CopyETH1Data(body.Eth1Data), + Eth1Data: body.Eth1Data.Copy(), Graffiti: bytesutil.SafeCopyBytes(body.Graffiti), - ProposerSlashings: CopyProposerSlashings(body.ProposerSlashings), - AttesterSlashings: copySlice(body.AttesterSlashings), - Attestations: copySlice(body.Attestations), - Deposits: CopyDeposits(body.Deposits), - VoluntaryExits: CopySignedVoluntaryExits(body.VoluntaryExits), - SyncAggregate: CopySyncAggregate(body.SyncAggregate), + ProposerSlashings: CopySlice(body.ProposerSlashings), + AttesterSlashings: CopySlice(body.AttesterSlashings), + Attestations: CopySlice(body.Attestations), + Deposits: CopySlice(body.Deposits), + VoluntaryExits: CopySlice(body.VoluntaryExits), + SyncAggregate: body.SyncAggregate.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. func CopyBlobKZGs(b [][]byte) [][]byte { return bytesutil.SafeCopy2dBytes(b) @@ -610,16 +454,16 @@ func CopyBeaconBlockBodyDeneb(body *BeaconBlockBodyDeneb) *BeaconBlockBodyDeneb } return &BeaconBlockBodyDeneb{ RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal), - Eth1Data: CopyETH1Data(body.Eth1Data), + Eth1Data: body.Eth1Data.Copy(), Graffiti: bytesutil.SafeCopyBytes(body.Graffiti), - ProposerSlashings: CopyProposerSlashings(body.ProposerSlashings), - AttesterSlashings: copySlice(body.AttesterSlashings), - Attestations: copySlice(body.Attestations), - Deposits: CopyDeposits(body.Deposits), - VoluntaryExits: CopySignedVoluntaryExits(body.VoluntaryExits), - SyncAggregate: CopySyncAggregate(body.SyncAggregate), + ProposerSlashings: CopySlice(body.ProposerSlashings), + AttesterSlashings: CopySlice(body.AttesterSlashings), + Attestations: CopySlice(body.Attestations), + Deposits: CopySlice(body.Deposits), + VoluntaryExits: CopySlice(body.VoluntaryExits), + SyncAggregate: body.SyncAggregate.Copy(), ExecutionPayload: body.ExecutionPayload.Copy(), - BlsToExecutionChanges: CopyBLSToExecutionChanges(body.BlsToExecutionChanges), + BlsToExecutionChanges: CopySlice(body.BlsToExecutionChanges), BlobKzgCommitments: CopyBlobKZGs(body.BlobKzgCommitments), } } @@ -656,75 +500,16 @@ func CopyBeaconBlockBodyElectra(body *BeaconBlockBodyElectra) *BeaconBlockBodyEl } return &BeaconBlockBodyElectra{ RandaoReveal: bytesutil.SafeCopyBytes(body.RandaoReveal), - Eth1Data: CopyETH1Data(body.Eth1Data), + Eth1Data: body.Eth1Data.Copy(), Graffiti: bytesutil.SafeCopyBytes(body.Graffiti), - ProposerSlashings: CopyProposerSlashings(body.ProposerSlashings), - AttesterSlashings: copySlice(body.AttesterSlashings), - Attestations: copySlice(body.Attestations), - Deposits: CopyDeposits(body.Deposits), - VoluntaryExits: CopySignedVoluntaryExits(body.VoluntaryExits), - SyncAggregate: CopySyncAggregate(body.SyncAggregate), + ProposerSlashings: CopySlice(body.ProposerSlashings), + AttesterSlashings: CopySlice(body.AttesterSlashings), + Attestations: CopySlice(body.Attestations), + Deposits: CopySlice(body.Deposits), + VoluntaryExits: CopySlice(body.VoluntaryExits), + SyncAggregate: body.SyncAggregate.Copy(), ExecutionPayload: body.ExecutionPayload.Copy(), - BlsToExecutionChanges: CopyBLSToExecutionChanges(body.BlsToExecutionChanges), + BlsToExecutionChanges: CopySlice(body.BlsToExecutionChanges), 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 -} diff --git a/proto/prysm/v1alpha1/cloners_test.go b/proto/prysm/v1alpha1/cloners_test.go index 78baa17935..1cffb5d49e 100644 --- a/proto/prysm/v1alpha1/cloners_test.go +++ b/proto/prysm/v1alpha1/cloners_test.go @@ -10,16 +10,6 @@ import ( "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) { blk := genSignedBeaconBlock() @@ -80,96 +70,6 @@ func TestCopyBeaconBlockBodyAltair(t *testing.T) { 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) { v := genValidator() @@ -200,16 +100,6 @@ func TestCopySyncCommitteeContribution(t *testing.T) { 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) { tests := []struct { name string @@ -428,27 +318,6 @@ func bytes(length int) []byte { 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) { 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 { return &v1alpha1.Attestation{ AggregationBits: bytes(32), diff --git a/proto/prysm/v1alpha1/eip_7521.go b/proto/prysm/v1alpha1/eip_7521.go new file mode 100644 index 0000000000..473ab2de98 --- /dev/null +++ b/proto/prysm/v1alpha1/eip_7521.go @@ -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, + } +} diff --git a/proto/prysm/v1alpha1/eip_7521_fuzz_test.go b/proto/prysm/v1alpha1/eip_7521_fuzz_test.go new file mode 100644 index 0000000000..5123be544d --- /dev/null +++ b/proto/prysm/v1alpha1/eip_7521_fuzz_test.go @@ -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{}) +} diff --git a/proto/prysm/v1alpha1/fuzz_test.go b/proto/prysm/v1alpha1/fuzz_test.go new file mode 100644 index 0000000000..53b663cd29 --- /dev/null +++ b/proto/prysm/v1alpha1/fuzz_test.go @@ -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 + } + }) +}