diff --git a/CHANGELOG.md b/CHANGELOG.md index 79ddbe0d2a61..ab426582c936 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -59,6 +59,7 @@ The format is based on Keep a Changelog, and this project adheres to Semantic Ve - Moved `ConvertKzgCommitmentToVersionedHash` to the `primitives` package. - reversed the boolean return on `BatchVerifyDepositsSignatures`, from need verification, to all keys successfully verified - Fix `engine_exchangeCapabilities` implementation. +- Consolidate `ApplyDeposit` for Altair and Electra. ### Deprecated - `--disable-grpc-gateway` flag is deprecated due to grpc gateway removal. diff --git a/beacon-chain/core/altair/BUILD.bazel b/beacon-chain/core/altair/BUILD.bazel index e73e251e33d4..e1e0338629f5 100644 --- a/beacon-chain/core/altair/BUILD.bazel +++ b/beacon-chain/core/altair/BUILD.bazel @@ -61,6 +61,7 @@ go_test( ], embed = [":go_default_library"], deps = [ + "//beacon-chain/core/blocks:go_default_library", "//beacon-chain/core/epoch:go_default_library", "//beacon-chain/core/epoch/precompute:go_default_library", "//beacon-chain/core/helpers:go_default_library", diff --git a/beacon-chain/core/altair/deposit.go b/beacon-chain/core/altair/deposit.go index 084643324e40..4067c2f84b36 100644 --- a/beacon-chain/core/altair/deposit.go +++ b/beacon-chain/core/altair/deposit.go @@ -5,12 +5,8 @@ import ( "github.com/pkg/errors" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/blocks" - "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/v5/beacon-chain/state" - "github.com/prysmaticlabs/prysm/v5/config/params" - "github.com/prysmaticlabs/prysm/v5/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" - "github.com/prysmaticlabs/prysm/v5/runtime/version" ) // ProcessPreGenesisDeposits processes a deposit for the beacon state before chainstart. @@ -20,7 +16,7 @@ func ProcessPreGenesisDeposits( deposits []*ethpb.Deposit, ) (state.BeaconState, error) { var err error - beaconState, err = ProcessDeposits(ctx, beaconState, deposits) + beaconState, err = blocks.ProcessDeposits(ctx, beaconState, deposits) if err != nil { return nil, errors.Wrap(err, "could not process deposit") } @@ -30,182 +26,3 @@ func ProcessPreGenesisDeposits( } return beaconState, nil } - -// ProcessDeposits processes validator deposits for beacon state Altair. -func ProcessDeposits( - ctx context.Context, - beaconState state.BeaconState, - deposits []*ethpb.Deposit, -) (state.BeaconState, error) { - allSignaturesVerified, err := blocks.BatchVerifyDepositsSignatures(ctx, deposits) - if err != nil { - return nil, err - } - - for _, deposit := range deposits { - if deposit == nil || deposit.Data == nil { - return nil, errors.New("got a nil deposit in block") - } - beaconState, err = ProcessDeposit(beaconState, deposit, allSignaturesVerified) - if err != nil { - return nil, errors.Wrapf(err, "could not process deposit from %#x", bytesutil.Trunc(deposit.Data.PublicKey)) - } - } - return beaconState, nil -} - -// ProcessDeposit takes in a deposit object and inserts it -// into the registry as a new validator or balance change. -// Returns the resulting state, a boolean to indicate whether or not the deposit -// resulted in a new validator entry into the beacon state, and any error. -// -// Spec pseudocode definition: -// def process_deposit(state: BeaconState, deposit: Deposit) -> None: -// -// # Verify the Merkle branch -// assert is_valid_merkle_branch( -// leaf=hash_tree_root(deposit.data), -// branch=deposit.proof, -// depth=DEPOSIT_CONTRACT_TREE_DEPTH + 1, # Add 1 for the List length mix-in -// index=state.eth1_deposit_index, -// root=state.eth1_data.deposit_root, -// ) -// -// # Deposits must be processed in order -// state.eth1_deposit_index += 1 -// -// apply_deposit( -// state=state, -// pubkey=deposit.data.pubkey, -// withdrawal_credentials=deposit.data.withdrawal_credentials, -// amount=deposit.data.amount, -// signature=deposit.data.signature, -// ) -func ProcessDeposit(beaconState state.BeaconState, deposit *ethpb.Deposit, allSignaturesVerified bool) (state.BeaconState, error) { - if err := blocks.VerifyDeposit(beaconState, deposit); err != nil { - if deposit == nil || deposit.Data == nil { - return nil, err - } - return nil, errors.Wrapf(err, "could not verify deposit from %#x", bytesutil.Trunc(deposit.Data.PublicKey)) - } - if err := beaconState.SetEth1DepositIndex(beaconState.Eth1DepositIndex() + 1); err != nil { - return nil, err - } - - return ApplyDeposit(beaconState, deposit.Data, allSignaturesVerified) -} - -// ApplyDeposit -// Spec pseudocode definition: -// def apply_deposit(state: BeaconState, pubkey: BLSPubkey, withdrawal_credentials: Bytes32, amount: uint64, signature: BLSSignature) -> None: -// -// validator_pubkeys = [v.pubkey for v in state.validators] -// if pubkey not in validator_pubkeys: -// # Verify the deposit signature (proof of possession) which is not checked by the deposit contract -// deposit_message = DepositMessage( -// pubkey=pubkey, -// withdrawal_credentials=withdrawal_credentials, -// amount=amount, -// ) -// domain = compute_domain(DOMAIN_DEPOSIT) # Fork-agnostic domain since deposits are valid across forks -// signing_root = compute_signing_root(deposit_message, domain) -// if bls.Verify(pubkey, signing_root, signature): -// add_validator_to_registry(state, pubkey, withdrawal_credentials, amount) -// else: -// # Increase balance by deposit amount -// index = ValidatorIndex(validator_pubkeys.index(pubkey)) -// increase_balance(state, index, amount) -func ApplyDeposit(beaconState state.BeaconState, data *ethpb.Deposit_Data, allSignaturesVerified bool) (state.BeaconState, error) { - pubKey := data.PublicKey - amount := data.Amount - withdrawalCredentials := data.WithdrawalCredentials - index, ok := beaconState.ValidatorIndexByPubkey(bytesutil.ToBytes48(pubKey)) - if !ok { - if !allSignaturesVerified { - valid, err := blocks.IsValidDepositSignature(data) - if err != nil { - return nil, err - } - if !valid { - return beaconState, nil - } - } - if err := AddValidatorToRegistry(beaconState, pubKey, withdrawalCredentials, amount); err != nil { - return nil, err - } - } else { - if err := helpers.IncreaseBalance(beaconState, index, amount); err != nil { - return nil, err - } - } - return beaconState, nil -} - -// AddValidatorToRegistry updates the beacon state with validator information -// def add_validator_to_registry(state: BeaconState, -// -// pubkey: BLSPubkey, -// withdrawal_credentials: Bytes32, -// amount: uint64) -> None: -// index = get_index_for_new_validator(state) -// validator = get_validator_from_deposit(pubkey, withdrawal_credentials) -// set_or_append_list(state.validators, index, validator) -// set_or_append_list(state.balances, index, 0) -// set_or_append_list(state.previous_epoch_participation, index, ParticipationFlags(0b0000_0000)) // New in Altair -// set_or_append_list(state.current_epoch_participation, index, ParticipationFlags(0b0000_0000)) // New in Altair -// set_or_append_list(state.inactivity_scores, index, uint64(0)) // New in Altair -func AddValidatorToRegistry(beaconState state.BeaconState, pubKey []byte, withdrawalCredentials []byte, amount uint64) error { - val := GetValidatorFromDeposit(pubKey, withdrawalCredentials, amount) - if err := beaconState.AppendValidator(val); err != nil { - return err - } - if err := beaconState.AppendBalance(amount); err != nil { - return err - } - - // only active in altair and only when it's a new validator (after append balance) - if beaconState.Version() >= version.Altair { - if err := beaconState.AppendInactivityScore(0); err != nil { - return err - } - if err := beaconState.AppendPreviousParticipationBits(0); err != nil { - return err - } - if err := beaconState.AppendCurrentParticipationBits(0); err != nil { - return err - } - } - return nil -} - -// GetValidatorFromDeposit gets a new validator object with provided parameters -// -// def get_validator_from_deposit(pubkey: BLSPubkey, withdrawal_credentials: Bytes32, amount: uint64) -> Validator: -// -// effective_balance = min(amount - amount % EFFECTIVE_BALANCE_INCREMENT, MAX_EFFECTIVE_BALANCE) -// -// return Validator( -// pubkey=pubkey, -// withdrawal_credentials=withdrawal_credentials, -// activation_eligibility_epoch=FAR_FUTURE_EPOCH, -// activation_epoch=FAR_FUTURE_EPOCH, -// exit_epoch=FAR_FUTURE_EPOCH, -// withdrawable_epoch=FAR_FUTURE_EPOCH, -// effective_balance=effective_balance, -// ) -func GetValidatorFromDeposit(pubKey []byte, withdrawalCredentials []byte, amount uint64) *ethpb.Validator { - effectiveBalance := amount - (amount % params.BeaconConfig().EffectiveBalanceIncrement) - if params.BeaconConfig().MaxEffectiveBalance < effectiveBalance { - effectiveBalance = params.BeaconConfig().MaxEffectiveBalance - } - - return ðpb.Validator{ - PublicKey: pubKey, - WithdrawalCredentials: withdrawalCredentials, - ActivationEligibilityEpoch: params.BeaconConfig().FarFutureEpoch, - ActivationEpoch: params.BeaconConfig().FarFutureEpoch, - ExitEpoch: params.BeaconConfig().FarFutureEpoch, - WithdrawableEpoch: params.BeaconConfig().FarFutureEpoch, - EffectiveBalance: effectiveBalance, - } -} diff --git a/beacon-chain/core/altair/deposit_fuzz_test.go b/beacon-chain/core/altair/deposit_fuzz_test.go index 2db12b58ec4a..3e2fd9dd3373 100644 --- a/beacon-chain/core/altair/deposit_fuzz_test.go +++ b/beacon-chain/core/altair/deposit_fuzz_test.go @@ -6,6 +6,7 @@ import ( fuzz "github.com/google/gofuzz" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/altair" + "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/blocks" state_native "github.com/prysmaticlabs/prysm/v5/beacon-chain/state/state-native" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/v5/testing/require" @@ -23,7 +24,7 @@ func TestFuzzProcessDeposits_10000(t *testing.T) { } s, err := state_native.InitializeFromProtoUnsafeAltair(state) require.NoError(t, err) - r, err := altair.ProcessDeposits(ctx, s, deposits) + r, err := blocks.ProcessDeposits(ctx, s, deposits) if err != nil && r != nil { t.Fatalf("return value should be nil on err. found: %v on error: %v for state: %v and block: %v", r, err, state, deposits) } @@ -76,7 +77,7 @@ func TestFuzzProcessDeposit_Phase0_10000(t *testing.T) { fuzzer.Fuzz(deposit) s, err := state_native.InitializeFromProtoUnsafePhase0(state) require.NoError(t, err) - r, err := altair.ProcessDeposit(s, deposit, true) + r, err := blocks.ProcessDeposit(s, deposit, true) if err != nil && r != nil { t.Fatalf("return value should be nil on err. found: %v on error: %v for state: %v and block: %v", r, err, state, deposit) } @@ -93,7 +94,7 @@ func TestFuzzProcessDeposit_10000(t *testing.T) { fuzzer.Fuzz(deposit) s, err := state_native.InitializeFromProtoUnsafeAltair(state) require.NoError(t, err) - r, err := altair.ProcessDeposit(s, deposit, true) + r, err := blocks.ProcessDeposit(s, deposit, true) if err != nil && r != nil { t.Fatalf("return value should be nil on err. found: %v on error: %v for state: %v and block: %v", r, err, state, deposit) } diff --git a/beacon-chain/core/altair/deposit_test.go b/beacon-chain/core/altair/deposit_test.go index 34dda460890f..307dc4ecd005 100644 --- a/beacon-chain/core/altair/deposit_test.go +++ b/beacon-chain/core/altair/deposit_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/altair" + "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/signing" state_native "github.com/prysmaticlabs/prysm/v5/beacon-chain/state/state-native" fieldparams "github.com/prysmaticlabs/prysm/v5/config/fieldparams" @@ -42,7 +43,7 @@ func TestProcessDeposits_SameValidatorMultipleDepositsSameBlock(t *testing.T) { }, }) require.NoError(t, err) - newState, err := altair.ProcessDeposits(context.Background(), beaconState, []*ethpb.Deposit{dep[0], dep[1], dep[2]}) + newState, err := blocks.ProcessDeposits(context.Background(), beaconState, []*ethpb.Deposit{dep[0], dep[1], dep[2]}) require.NoError(t, err, "Expected block deposits to process correctly") require.Equal(t, 2, len(newState.Validators()), "Incorrect validator count") } @@ -70,7 +71,7 @@ func TestProcessDeposits_AddsNewValidatorDeposit(t *testing.T) { }, }) require.NoError(t, err) - newState, err := altair.ProcessDeposits(context.Background(), beaconState, []*ethpb.Deposit{dep[0]}) + newState, err := blocks.ProcessDeposits(context.Background(), beaconState, []*ethpb.Deposit{dep[0]}) require.NoError(t, err, "Expected block deposits to process correctly") if newState.Balances()[1] != dep[0].Data.Amount { t.Errorf( @@ -127,7 +128,7 @@ func TestProcessDeposits_RepeatedDeposit_IncreasesValidatorBalance(t *testing.T) }, }) require.NoError(t, err) - newState, err := altair.ProcessDeposits(context.Background(), beaconState, []*ethpb.Deposit{deposit}) + newState, err := blocks.ProcessDeposits(context.Background(), beaconState, []*ethpb.Deposit{deposit}) require.NoError(t, err, "Process deposit failed") require.Equal(t, uint64(1000+50), newState.Balances()[1], "Expected balance at index 1 to be 1050") } @@ -156,7 +157,7 @@ func TestProcessDeposit_AddsNewValidatorDeposit(t *testing.T) { }, }) require.NoError(t, err) - newState, err := altair.ProcessDeposit(beaconState, dep[0], true) + newState, err := blocks.ProcessDeposit(beaconState, dep[0], true) require.NoError(t, err, "Process deposit failed") require.Equal(t, 2, len(newState.Validators()), "Expected validator list to have length 2") require.Equal(t, 2, len(newState.Balances()), "Expected validator balances list to have length 2") @@ -199,7 +200,7 @@ func TestProcessDeposit_SkipsInvalidDeposit(t *testing.T) { }, }) require.NoError(t, err) - newState, err := altair.ProcessDeposit(beaconState, dep[0], false) + newState, err := blocks.ProcessDeposit(beaconState, dep[0], false) require.NoError(t, err, "Expected invalid block deposit to be ignored without error") if newState.Eth1DepositIndex() != 1 { @@ -333,7 +334,7 @@ func TestProcessDeposit_RepeatedDeposit_IncreasesValidatorBalance(t *testing.T) }, }) require.NoError(t, err) - newState, err := altair.ProcessDeposit(beaconState, deposit, true /*verifySignature*/) + newState, err := blocks.ProcessDeposit(beaconState, deposit, true /*verifySignature*/) require.NoError(t, err, "Process deposit failed") require.Equal(t, uint64(1000+50), newState.Balances()[1], "Expected balance at index 1 to be 1050") } @@ -370,6 +371,6 @@ func TestProcessDeposits_MerkleBranchFailsVerification(t *testing.T) { }) require.NoError(t, err) want := "deposit root did not verify" - _, err = altair.ProcessDeposits(context.Background(), beaconState, b.Block.Body.Deposits) + _, err = blocks.ProcessDeposits(context.Background(), beaconState, b.Block.Body.Deposits) assert.ErrorContains(t, want, err) } diff --git a/beacon-chain/core/blocks/deposit.go b/beacon-chain/core/blocks/deposit.go index af7a45b67b84..6a75ced8dab3 100644 --- a/beacon-chain/core/blocks/deposit.go +++ b/beacon-chain/core/blocks/deposit.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/pkg/errors" + "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/signing" "github.com/prysmaticlabs/prysm/v5/beacon-chain/state" "github.com/prysmaticlabs/prysm/v5/config/params" @@ -14,8 +15,208 @@ import ( "github.com/prysmaticlabs/prysm/v5/encoding/bytesutil" "github.com/prysmaticlabs/prysm/v5/math" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/v5/runtime/version" ) +// ProcessDeposits processes validator deposits for beacon state. +func ProcessDeposits( + ctx context.Context, + beaconState state.BeaconState, + deposits []*ethpb.Deposit, +) (state.BeaconState, error) { + allSignaturesVerified, err := BatchVerifyDepositsSignatures(ctx, deposits) + if err != nil { + return nil, err + } + + for _, deposit := range deposits { + if deposit == nil || deposit.Data == nil { + return nil, errors.New("got a nil deposit in block") + } + beaconState, err = ProcessDeposit(beaconState, deposit, allSignaturesVerified) + if err != nil { + return nil, errors.Wrapf(err, "could not process deposit from %#x", bytesutil.Trunc(deposit.Data.PublicKey)) + } + } + return beaconState, nil +} + +// ProcessDeposit takes in a deposit object and inserts it +// into the registry as a new validator or balance change. +// Returns the resulting state, a boolean to indicate whether or not the deposit +// resulted in a new validator entry into the beacon state, and any error. +// +// Spec pseudocode definition: +// def process_deposit(state: BeaconState, deposit: Deposit) -> None: +// +// # Verify the Merkle branch +// assert is_valid_merkle_branch( +// leaf=hash_tree_root(deposit.data), +// branch=deposit.proof, +// depth=DEPOSIT_CONTRACT_TREE_DEPTH + 1, # Add 1 for the List length mix-in +// index=state.eth1_deposit_index, +// root=state.eth1_data.deposit_root, +// ) +// +// # Deposits must be processed in order +// state.eth1_deposit_index += 1 +// +// apply_deposit( +// state=state, +// pubkey=deposit.data.pubkey, +// withdrawal_credentials=deposit.data.withdrawal_credentials, +// amount=deposit.data.amount, +// signature=deposit.data.signature, +// ) +func ProcessDeposit(beaconState state.BeaconState, deposit *ethpb.Deposit, allSignaturesVerified bool) (state.BeaconState, error) { + if err := VerifyDeposit(beaconState, deposit); err != nil { + if deposit == nil || deposit.Data == nil { + return nil, err + } + return nil, errors.Wrapf(err, "could not verify deposit from %#x", bytesutil.Trunc(deposit.Data.PublicKey)) + } + if err := beaconState.SetEth1DepositIndex(beaconState.Eth1DepositIndex() + 1); err != nil { + return nil, err + } + + return ApplyDeposit(beaconState, deposit.Data, allSignaturesVerified) +} + +// ApplyDeposit applies a deposit to the beacon state. +// +// Altair spec pseudocode definition: +// def apply_deposit(state: BeaconState, pubkey: BLSPubkey, withdrawal_credentials: Bytes32, amount: uint64, signature: BLSSignature) -> None: +// +// validator_pubkeys = [v.pubkey for v in state.validators] +// if pubkey not in validator_pubkeys: +// # Verify the deposit signature (proof of possession) which is not checked by the deposit contract +// deposit_message = DepositMessage( +// pubkey=pubkey, +// withdrawal_credentials=withdrawal_credentials, +// amount=amount, +// ) +// domain = compute_domain(DOMAIN_DEPOSIT) # Fork-agnostic domain since deposits are valid across forks +// signing_root = compute_signing_root(deposit_message, domain) +// if bls.Verify(pubkey, signing_root, signature): +// add_validator_to_registry(state, pubkey, withdrawal_credentials, amount) +// else: +// # Increase balance by deposit amount +// index = ValidatorIndex(validator_pubkeys.index(pubkey)) +// increase_balance(state, index, amount) +// +// Electra spec pseudocode definition: +// def apply_deposit(state: BeaconState, +// +// pubkey: BLSPubkey, +// withdrawal_credentials: Bytes32, +// amount: uint64, +// signature: BLSSignature) -> None: +// validator_pubkeys = [v.pubkey for v in state.validators] +// if pubkey not in validator_pubkeys: +// # Verify the deposit signature (proof of possession) which is not checked by the deposit contract +// if is_valid_deposit_signature(pubkey, withdrawal_credentials, amount, signature): +// add_validator_to_registry(state, pubkey, withdrawal_credentials, Gwei(0)) # [Modified in Electra:EIP7251] +// # [New in Electra:EIP7251] +// state.pending_deposits.append(PendingDeposit( +// pubkey=pubkey, +// withdrawal_credentials=withdrawal_credentials, +// amount=amount, +// signature=signature, +// slot=GENESIS_SLOT, # Use GENESIS_SLOT to distinguish from a pending deposit request +// )) +// else: +// # Increase balance by deposit amount +// # [Modified in Electra:EIP7251] +// state.pending_deposits.append(PendingDeposit( +// pubkey=pubkey, +// withdrawal_credentials=withdrawal_credentials, +// amount=amount, +// signature=signature, +// slot=GENESIS_SLOT # Use GENESIS_SLOT to distinguish from a pending deposit request +// )) +func ApplyDeposit(beaconState state.BeaconState, data *ethpb.Deposit_Data, allSignaturesVerified bool) (state.BeaconState, error) { + pubKey := data.PublicKey + amount := data.Amount + withdrawalCredentials := data.WithdrawalCredentials + + // Check if validator exists + if index, ok := beaconState.ValidatorIndexByPubkey(bytesutil.ToBytes48(pubKey)); ok { + // Validator exists and balance can be increased if version is before Electra + if beaconState.Version() < version.Electra { + return beaconState, helpers.IncreaseBalance(beaconState, index, amount) + } + } else { + // Validator doesn't exist, check if signature is valid if not all signatures verified + if !allSignaturesVerified { + valid, err := IsValidDepositSignature(data) + if err != nil || !valid { + return beaconState, err + } + } + + // If Electra version, amount is reset to zero + if beaconState.Version() >= version.Electra { + amount = 0 + } + + // Add new validator + if err := AddValidatorToRegistry(beaconState, pubKey, withdrawalCredentials, amount); err != nil { + return nil, err + } + } + + // Handle deposits in Electra version or beyond + if beaconState.Version() >= version.Electra { + pendingDeposit := ðpb.PendingDeposit{ + PublicKey: pubKey, + WithdrawalCredentials: withdrawalCredentials, + Amount: data.Amount, + Signature: data.Signature, + Slot: params.BeaconConfig().GenesisSlot, + } + return beaconState, beaconState.AppendPendingDeposit(pendingDeposit) + } + + return beaconState, nil +} + +// AddValidatorToRegistry updates the beacon state with validator information +// def add_validator_to_registry(state: BeaconState, +// +// pubkey: BLSPubkey, +// withdrawal_credentials: Bytes32, +// amount: uint64) -> None: +// index = get_index_for_new_validator(state) +// validator = get_validator_from_deposit(pubkey, withdrawal_credentials) +// set_or_append_list(state.validators, index, validator) +// set_or_append_list(state.balances, index, 0) +// set_or_append_list(state.previous_epoch_participation, index, ParticipationFlags(0b0000_0000)) // New in Altair +// set_or_append_list(state.current_epoch_participation, index, ParticipationFlags(0b0000_0000)) // New in Altair +// set_or_append_list(state.inactivity_scores, index, uint64(0)) // New in Altair +func AddValidatorToRegistry(beaconState state.BeaconState, pubKey []byte, withdrawalCredentials []byte, amount uint64) error { + val := GetValidatorFromDeposit(pubKey, withdrawalCredentials, amount) + if err := beaconState.AppendValidator(val); err != nil { + return err + } + if err := beaconState.AppendBalance(amount); err != nil { + return err + } + + // only active in altair and only when it's a new validator (after append balance) + if beaconState.Version() >= version.Altair { + if err := beaconState.AppendInactivityScore(0); err != nil { + return err + } + if err := beaconState.AppendPreviousParticipationBits(0); err != nil { + return err + } + if err := beaconState.AppendCurrentParticipationBits(0); err != nil { + return err + } + } + return nil +} + // ActivateValidatorWithEffectiveBalance updates validator's effective balance, and if it's above MaxEffectiveBalance, validator becomes active in genesis. func ActivateValidatorWithEffectiveBalance(beaconState state.BeaconState, deposits []*ethpb.Deposit) (state.BeaconState, error) { for _, d := range deposits { @@ -129,6 +330,38 @@ func VerifyDeposit(beaconState state.ReadOnlyBeaconState, deposit *ethpb.Deposit return nil } +// GetValidatorFromDeposit gets a new validator object with provided parameters +// +// def get_validator_from_deposit(pubkey: BLSPubkey, withdrawal_credentials: Bytes32, amount: uint64) -> Validator: +// +// effective_balance = min(amount - amount % EFFECTIVE_BALANCE_INCREMENT, MAX_EFFECTIVE_BALANCE) +// +// return Validator( +// pubkey=pubkey, +// withdrawal_credentials=withdrawal_credentials, +// activation_eligibility_epoch=FAR_FUTURE_EPOCH, +// activation_epoch=FAR_FUTURE_EPOCH, +// exit_epoch=FAR_FUTURE_EPOCH, +// withdrawable_epoch=FAR_FUTURE_EPOCH, +// effective_balance=effective_balance, +// ) +func GetValidatorFromDeposit(pubKey []byte, withdrawalCredentials []byte, amount uint64) *ethpb.Validator { + effectiveBalance := amount - (amount % params.BeaconConfig().EffectiveBalanceIncrement) + if params.BeaconConfig().MaxEffectiveBalance < effectiveBalance { + effectiveBalance = params.BeaconConfig().MaxEffectiveBalance + } + + return ðpb.Validator{ + PublicKey: pubKey, + WithdrawalCredentials: withdrawalCredentials, + ActivationEligibilityEpoch: params.BeaconConfig().FarFutureEpoch, + ActivationEpoch: params.BeaconConfig().FarFutureEpoch, + ExitEpoch: params.BeaconConfig().FarFutureEpoch, + WithdrawableEpoch: params.BeaconConfig().FarFutureEpoch, + EffectiveBalance: effectiveBalance, + } +} + func verifyDepositDataSigningRoot(obj *ethpb.Deposit_Data, domain []byte) error { return deposit.VerifyDepositSignature(obj, domain) } diff --git a/beacon-chain/core/electra/BUILD.bazel b/beacon-chain/core/electra/BUILD.bazel index 35ef921f3ef0..bd4c0d5fc26c 100644 --- a/beacon-chain/core/electra/BUILD.bazel +++ b/beacon-chain/core/electra/BUILD.bazel @@ -63,6 +63,7 @@ go_test( ], embed = [":go_default_library"], deps = [ + "//beacon-chain/core/blocks:go_default_library", "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/core/signing:go_default_library", "//beacon-chain/core/time:go_default_library", diff --git a/beacon-chain/core/electra/deposit_fuzz_test.go b/beacon-chain/core/electra/deposit_fuzz_test.go index adf0d04dcd82..0c0e7964049a 100644 --- a/beacon-chain/core/electra/deposit_fuzz_test.go +++ b/beacon-chain/core/electra/deposit_fuzz_test.go @@ -5,7 +5,7 @@ import ( "testing" fuzz "github.com/google/gofuzz" - "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/electra" + "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/blocks" state_native "github.com/prysmaticlabs/prysm/v5/beacon-chain/state/state-native" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/v5/testing/require" @@ -23,7 +23,7 @@ func TestFuzzProcessDeposits_10000(t *testing.T) { } s, err := state_native.InitializeFromProtoUnsafeElectra(state) require.NoError(t, err) - r, err := electra.ProcessDeposits(ctx, s, deposits) + r, err := blocks.ProcessDeposits(ctx, s, deposits) if err != nil && r != nil { t.Fatalf("return value should be nil on err. found: %v on error: %v for state: %v and block: %v", r, err, state, deposits) } @@ -40,7 +40,7 @@ func TestFuzzProcessDeposit_10000(t *testing.T) { fuzzer.Fuzz(deposit) s, err := state_native.InitializeFromProtoUnsafeElectra(state) require.NoError(t, err) - r, err := electra.ProcessDeposit(s, deposit, true) + r, err := blocks.ProcessDeposit(s, deposit, true) if err != nil && r != nil { t.Fatalf("return value should be nil on err. found: %v on error: %v for state: %v and block: %v", r, err, state, deposit) } diff --git a/beacon-chain/core/electra/deposits.go b/beacon-chain/core/electra/deposits.go index 431ab79fe60b..e04266408310 100644 --- a/beacon-chain/core/electra/deposits.go +++ b/beacon-chain/core/electra/deposits.go @@ -21,146 +21,6 @@ import ( log "github.com/sirupsen/logrus" ) -// ProcessDeposits is one of the operations performed on each processed -// beacon block to verify queued validators from the Ethereum 1.0 Deposit Contract -// into the beacon chain. -// -// Spec pseudocode definition: -// -// For each deposit in block.body.deposits: -// process_deposit(state, deposit) -func ProcessDeposits( - ctx context.Context, - beaconState state.BeaconState, - deposits []*ethpb.Deposit, -) (state.BeaconState, error) { - ctx, span := trace.StartSpan(ctx, "electra.ProcessDeposits") - defer span.End() - // Attempt to verify all deposit signatures at once, if this fails then fall back to processing - // individual deposits with signature verification enabled. - allSignaturesVerified, err := blocks.BatchVerifyDepositsSignatures(ctx, deposits) - if err != nil { - return nil, errors.Wrap(err, "could not verify deposit signatures in batch") - } - - for _, d := range deposits { - if d == nil || d.Data == nil { - return nil, errors.New("got a nil deposit in block") - } - beaconState, err = ProcessDeposit(beaconState, d, allSignaturesVerified) - if err != nil { - return nil, errors.Wrapf(err, "could not process deposit from %#x", bytesutil.Trunc(d.Data.PublicKey)) - } - } - return beaconState, nil -} - -// ProcessDeposit takes in a deposit object and inserts it -// into the registry as a new validator or balance change. -// Returns the resulting state, a boolean to indicate whether or not the deposit -// resulted in a new validator entry into the beacon state, and any error. -// -// Spec pseudocode definition: -// def process_deposit(state: BeaconState, deposit: Deposit) -> None: -// -// # Verify the Merkle branch -// assert is_valid_merkle_branch( -// leaf=hash_tree_root(deposit.data), -// branch=deposit.proof, -// depth=DEPOSIT_CONTRACT_TREE_DEPTH + 1, # Add 1 for the List length mix-in -// index=state.eth1_deposit_index, -// root=state.eth1_data.deposit_root, -// ) -// -// # Deposits must be processed in order -// state.eth1_deposit_index += 1 -// -// apply_deposit( -// state=state, -// pubkey=deposit.data.pubkey, -// withdrawal_credentials=deposit.data.withdrawal_credentials, -// amount=deposit.data.amount, -// signature=deposit.data.signature, -// ) -func ProcessDeposit(beaconState state.BeaconState, deposit *ethpb.Deposit, allSignaturesVerified bool) (state.BeaconState, error) { - if err := blocks.VerifyDeposit(beaconState, deposit); err != nil { - if deposit == nil || deposit.Data == nil { - return nil, err - } - return nil, errors.Wrapf(err, "could not verify deposit from %#x", bytesutil.Trunc(deposit.Data.PublicKey)) - } - if err := beaconState.SetEth1DepositIndex(beaconState.Eth1DepositIndex() + 1); err != nil { - return nil, err - } - return ApplyDeposit(beaconState, deposit.Data, allSignaturesVerified) -} - -// ApplyDeposit adds the incoming deposit as a pending deposit on the state -// -// Spec pseudocode definition: -// def apply_deposit(state: BeaconState, -// -// pubkey: BLSPubkey, -// withdrawal_credentials: Bytes32, -// amount: uint64, -// signature: BLSSignature) -> None: -// validator_pubkeys = [v.pubkey for v in state.validators] -// if pubkey not in validator_pubkeys: -// # Verify the deposit signature (proof of possession) which is not checked by the deposit contract -// if is_valid_deposit_signature(pubkey, withdrawal_credentials, amount, signature): -// add_validator_to_registry(state, pubkey, withdrawal_credentials, Gwei(0)) # [Modified in Electra:EIP7251] -// # [New in Electra:EIP7251] -// state.pending_deposits.append(PendingDeposit( -// pubkey=pubkey, -// withdrawal_credentials=withdrawal_credentials, -// amount=amount, -// signature=signature, -// slot=GENESIS_SLOT, # Use GENESIS_SLOT to distinguish from a pending deposit request -// )) -// else: -// # Increase balance by deposit amount -// # [Modified in Electra:EIP7251] -// state.pending_deposits.append(PendingDeposit( -// pubkey=pubkey, -// withdrawal_credentials=withdrawal_credentials, -// amount=amount, -// signature=signature, -// slot=GENESIS_SLOT # Use GENESIS_SLOT to distinguish from a pending deposit request -// )) -func ApplyDeposit(beaconState state.BeaconState, data *ethpb.Deposit_Data, allSignaturesVerified bool) (state.BeaconState, error) { - pubKey := data.PublicKey - amount := data.Amount - withdrawalCredentials := data.WithdrawalCredentials - signature := data.Signature - _, ok := beaconState.ValidatorIndexByPubkey(bytesutil.ToBytes48(pubKey)) - if !ok { - if !allSignaturesVerified { - valid, err := IsValidDepositSignature(data) - if err != nil { - return nil, errors.Wrap(err, "could not verify deposit signature") - } - if !valid { - return beaconState, nil - } - } - - if err := AddValidatorToRegistry(beaconState, pubKey, withdrawalCredentials, 0); err != nil { // # [Modified in Electra:EIP7251] - return nil, errors.Wrap(err, "could not add validator to registry") - } - } - // no validation on top-ups (phase0 feature). no validation before state change - if err := beaconState.AppendPendingDeposit(ðpb.PendingDeposit{ - PublicKey: pubKey, - WithdrawalCredentials: withdrawalCredentials, - Amount: amount, - Signature: signature, - Slot: params.BeaconConfig().GenesisSlot, - }); err != nil { - return nil, err - } - return beaconState, nil -} - // IsValidDepositSignature returns whether deposit_data is valid // def is_valid_deposit_signature(pubkey: BLSPubkey, withdrawal_credentials: Bytes32, amount: uint64, signature: BLSSignature) -> bool: // diff --git a/beacon-chain/core/electra/deposits_test.go b/beacon-chain/core/electra/deposits_test.go index d94500278e13..ca1c3b66f680 100644 --- a/beacon-chain/core/electra/deposits_test.go +++ b/beacon-chain/core/electra/deposits_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/electra" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/signing" @@ -371,7 +372,7 @@ func TestProcessDeposit_Electra_Simple(t *testing.T) { }, }) require.NoError(t, err) - pdSt, err := electra.ProcessDeposits(context.Background(), st, deps) + pdSt, err := blocks.ProcessDeposits(context.Background(), st, deps) require.NoError(t, err) pbd, err := pdSt.PendingDeposits() require.NoError(t, err) @@ -409,7 +410,7 @@ func TestProcessDeposit_SkipsInvalidDeposit(t *testing.T) { }, }) require.NoError(t, err) - newState, err := electra.ProcessDeposit(beaconState, dep[0], false) + newState, err := blocks.ProcessDeposit(beaconState, dep[0], false) require.NoError(t, err, "Expected invalid block deposit to be ignored without error") if newState.Eth1DepositIndex() != 1 { @@ -446,7 +447,7 @@ func TestApplyDeposit_TopUps_WithBadSignature(t *testing.T) { vals[0].PublicKey = sk.PublicKey().Marshal() vals[0].WithdrawalCredentials[0] = params.BeaconConfig().ETH1AddressWithdrawalPrefixByte require.NoError(t, st.SetValidators(vals)) - adSt, err := electra.ApplyDeposit(st, depositData, false) + adSt, err := blocks.ApplyDeposit(st, depositData, false) require.NoError(t, err) pbd, err := adSt.PendingDeposits() require.NoError(t, err) diff --git a/beacon-chain/core/electra/transition_no_verify_sig.go b/beacon-chain/core/electra/transition_no_verify_sig.go index c7b478b09857..9a3084ccf25b 100644 --- a/beacon-chain/core/electra/transition_no_verify_sig.go +++ b/beacon-chain/core/electra/transition_no_verify_sig.go @@ -66,7 +66,7 @@ func ProcessOperations( if err != nil { return nil, errors.Wrap(err, "could not process altair attestation") } - if _, err := ProcessDeposits(ctx, st, bb.Deposits()); err != nil { // new in electra + if _, err := blocks.ProcessDeposits(ctx, st, bb.Deposits()); err != nil { // new in electra return nil, errors.Wrap(err, "could not process altair deposit") } st, err = ProcessVoluntaryExits(ctx, st, bb.VoluntaryExits()) diff --git a/beacon-chain/core/helpers/BUILD.bazel b/beacon-chain/core/helpers/BUILD.bazel index b0cbd9c16061..090a57458a6d 100644 --- a/beacon-chain/core/helpers/BUILD.bazel +++ b/beacon-chain/core/helpers/BUILD.bazel @@ -63,6 +63,7 @@ go_test( "validators_test.go", "weak_subjectivity_test.go", ], + data = glob(["testdata/**"]), embed = [":go_default_library"], shard_count = 2, tags = ["CI_race_detection"], diff --git a/beacon-chain/core/transition/transition_no_verify_sig.go b/beacon-chain/core/transition/transition_no_verify_sig.go index 402d607837b3..f99a4bc7c3bf 100644 --- a/beacon-chain/core/transition/transition_no_verify_sig.go +++ b/beacon-chain/core/transition/transition_no_verify_sig.go @@ -391,7 +391,7 @@ func altairOperations( if err != nil { return nil, errors.Wrap(err, "could not process altair attestation") } - if _, err := altair.ProcessDeposits(ctx, st, beaconBlock.Body().Deposits()); err != nil { + if _, err := b.ProcessDeposits(ctx, st, beaconBlock.Body().Deposits()); err != nil { return nil, errors.Wrap(err, "could not process altair deposit") } st, err = b.ProcessVoluntaryExits(ctx, st, beaconBlock.Body().VoluntaryExits()) @@ -418,7 +418,7 @@ func phase0Operations( if err != nil { return nil, errors.Wrap(err, "could not process block attestations") } - if _, err := altair.ProcessDeposits(ctx, st, beaconBlock.Body().Deposits()); err != nil { + if _, err := b.ProcessDeposits(ctx, st, beaconBlock.Body().Deposits()); err != nil { return nil, errors.Wrap(err, "could not process deposits") } return b.ProcessVoluntaryExits(ctx, st, beaconBlock.Body().VoluntaryExits()) diff --git a/testing/spectest/shared/altair/operations/BUILD.bazel b/testing/spectest/shared/altair/operations/BUILD.bazel index 05aeecc89e81..552bf3b1c54d 100644 --- a/testing/spectest/shared/altair/operations/BUILD.bazel +++ b/testing/spectest/shared/altair/operations/BUILD.bazel @@ -17,6 +17,7 @@ go_library( visibility = ["//testing/spectest:__subpackages__"], deps = [ "//beacon-chain/core/altair:go_default_library", + "//beacon-chain/core/blocks:go_default_library", "//beacon-chain/state:go_default_library", "//beacon-chain/state/state-native:go_default_library", "//consensus-types/blocks:go_default_library", diff --git a/testing/spectest/shared/altair/operations/deposit.go b/testing/spectest/shared/altair/operations/deposit.go index fa9e101291d9..cf706064115d 100644 --- a/testing/spectest/shared/altair/operations/deposit.go +++ b/testing/spectest/shared/altair/operations/deposit.go @@ -3,7 +3,7 @@ package operations import ( "testing" - "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/altair" + blks "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/v5/consensus-types/blocks" "github.com/prysmaticlabs/prysm/v5/consensus-types/interfaces" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" @@ -23,5 +23,5 @@ func blockWithDeposit(ssz []byte) (interfaces.SignedBeaconBlock, error) { } func RunDepositTest(t *testing.T, config string) { - common.RunDepositTest(t, config, version.String(version.Altair), blockWithDeposit, altair.ProcessDeposits, sszToState) + common.RunDepositTest(t, config, version.String(version.Altair), blockWithDeposit, blks.ProcessDeposits, sszToState) } diff --git a/testing/spectest/shared/bellatrix/operations/BUILD.bazel b/testing/spectest/shared/bellatrix/operations/BUILD.bazel index 8ab888a3ddd3..c3742e82003d 100644 --- a/testing/spectest/shared/bellatrix/operations/BUILD.bazel +++ b/testing/spectest/shared/bellatrix/operations/BUILD.bazel @@ -18,6 +18,7 @@ go_library( visibility = ["//testing/spectest:__subpackages__"], deps = [ "//beacon-chain/core/altair:go_default_library", + "//beacon-chain/core/blocks:go_default_library", "//beacon-chain/state:go_default_library", "//beacon-chain/state/state-native:go_default_library", "//consensus-types/blocks:go_default_library", diff --git a/testing/spectest/shared/bellatrix/operations/deposit.go b/testing/spectest/shared/bellatrix/operations/deposit.go index 55ef0c904918..416838f3d4e7 100644 --- a/testing/spectest/shared/bellatrix/operations/deposit.go +++ b/testing/spectest/shared/bellatrix/operations/deposit.go @@ -3,7 +3,7 @@ package operations import ( "testing" - "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/altair" + blks "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/v5/consensus-types/blocks" "github.com/prysmaticlabs/prysm/v5/consensus-types/interfaces" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" @@ -23,5 +23,5 @@ func blockWithDeposit(ssz []byte) (interfaces.SignedBeaconBlock, error) { } func RunDepositTest(t *testing.T, config string) { - common.RunDepositTest(t, config, version.String(version.Bellatrix), blockWithDeposit, altair.ProcessDeposits, sszToState) + common.RunDepositTest(t, config, version.String(version.Bellatrix), blockWithDeposit, blks.ProcessDeposits, sszToState) } diff --git a/testing/spectest/shared/capella/operations/BUILD.bazel b/testing/spectest/shared/capella/operations/BUILD.bazel index 95c7369130f0..611adc500a09 100644 --- a/testing/spectest/shared/capella/operations/BUILD.bazel +++ b/testing/spectest/shared/capella/operations/BUILD.bazel @@ -20,6 +20,7 @@ go_library( visibility = ["//testing/spectest:__subpackages__"], deps = [ "//beacon-chain/core/altair:go_default_library", + "//beacon-chain/core/blocks:go_default_library", "//beacon-chain/state:go_default_library", "//beacon-chain/state/state-native:go_default_library", "//consensus-types/blocks:go_default_library", diff --git a/testing/spectest/shared/capella/operations/deposit.go b/testing/spectest/shared/capella/operations/deposit.go index 09320013b58e..290df44f0b0f 100644 --- a/testing/spectest/shared/capella/operations/deposit.go +++ b/testing/spectest/shared/capella/operations/deposit.go @@ -3,7 +3,7 @@ package operations import ( "testing" - "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/altair" + blks "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/v5/consensus-types/blocks" "github.com/prysmaticlabs/prysm/v5/consensus-types/interfaces" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" @@ -23,5 +23,5 @@ func blockWithDeposit(ssz []byte) (interfaces.SignedBeaconBlock, error) { } func RunDepositTest(t *testing.T, config string) { - common.RunDepositTest(t, config, version.String(version.Capella), blockWithDeposit, altair.ProcessDeposits, sszToState) + common.RunDepositTest(t, config, version.String(version.Capella), blockWithDeposit, blks.ProcessDeposits, sszToState) } diff --git a/testing/spectest/shared/deneb/operations/BUILD.bazel b/testing/spectest/shared/deneb/operations/BUILD.bazel index 43971362c5c1..5eafbc06528c 100644 --- a/testing/spectest/shared/deneb/operations/BUILD.bazel +++ b/testing/spectest/shared/deneb/operations/BUILD.bazel @@ -20,6 +20,7 @@ go_library( visibility = ["//testing/spectest:__subpackages__"], deps = [ "//beacon-chain/core/altair:go_default_library", + "//beacon-chain/core/blocks:go_default_library", "//beacon-chain/state:go_default_library", "//beacon-chain/state/state-native:go_default_library", "//consensus-types/blocks:go_default_library", diff --git a/testing/spectest/shared/deneb/operations/deposit.go b/testing/spectest/shared/deneb/operations/deposit.go index 97a06fc16085..f7f8bf60db5f 100644 --- a/testing/spectest/shared/deneb/operations/deposit.go +++ b/testing/spectest/shared/deneb/operations/deposit.go @@ -3,7 +3,7 @@ package operations import ( "testing" - "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/altair" + blks "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/v5/consensus-types/blocks" "github.com/prysmaticlabs/prysm/v5/consensus-types/interfaces" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" @@ -23,5 +23,5 @@ func blockWithDeposit(ssz []byte) (interfaces.SignedBeaconBlock, error) { } func RunDepositTest(t *testing.T, config string) { - common.RunDepositTest(t, config, version.String(version.Deneb), blockWithDeposit, altair.ProcessDeposits, sszToState) + common.RunDepositTest(t, config, version.String(version.Deneb), blockWithDeposit, blks.ProcessDeposits, sszToState) } diff --git a/testing/spectest/shared/electra/operations/BUILD.bazel b/testing/spectest/shared/electra/operations/BUILD.bazel index d5d42aab6391..aaeed65393f4 100644 --- a/testing/spectest/shared/electra/operations/BUILD.bazel +++ b/testing/spectest/shared/electra/operations/BUILD.bazel @@ -22,6 +22,7 @@ go_library( importpath = "github.com/prysmaticlabs/prysm/v5/testing/spectest/shared/electra/operations", visibility = ["//visibility:public"], deps = [ + "//beacon-chain/core/blocks:go_default_library", "//beacon-chain/core/electra:go_default_library", "//beacon-chain/state:go_default_library", "//beacon-chain/state/state-native:go_default_library", diff --git a/testing/spectest/shared/electra/operations/deposit.go b/testing/spectest/shared/electra/operations/deposit.go index 405671ea2fa9..9aa159218b45 100644 --- a/testing/spectest/shared/electra/operations/deposit.go +++ b/testing/spectest/shared/electra/operations/deposit.go @@ -3,7 +3,7 @@ package operations import ( "testing" - "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/electra" + coreBlocks "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/v5/consensus-types/blocks" "github.com/prysmaticlabs/prysm/v5/consensus-types/interfaces" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" @@ -23,5 +23,5 @@ func blockWithDeposit(ssz []byte) (interfaces.SignedBeaconBlock, error) { } func RunDepositTest(t *testing.T, config string) { - common.RunDepositTest(t, config, version.String(version.Electra), blockWithDeposit, electra.ProcessDeposits, sszToState) + common.RunDepositTest(t, config, version.String(version.Electra), blockWithDeposit, coreBlocks.ProcessDeposits, sszToState) } diff --git a/testing/spectest/shared/phase0/operations/BUILD.bazel b/testing/spectest/shared/phase0/operations/BUILD.bazel index 8f69fb427e01..3a60fa52cedd 100644 --- a/testing/spectest/shared/phase0/operations/BUILD.bazel +++ b/testing/spectest/shared/phase0/operations/BUILD.bazel @@ -15,7 +15,6 @@ go_library( importpath = "github.com/prysmaticlabs/prysm/v5/testing/spectest/shared/phase0/operations", visibility = ["//testing/spectest:__subpackages__"], deps = [ - "//beacon-chain/core/altair:go_default_library", "//beacon-chain/core/blocks:go_default_library", "//beacon-chain/state:go_default_library", "//beacon-chain/state/state-native:go_default_library", diff --git a/testing/spectest/shared/phase0/operations/deposit.go b/testing/spectest/shared/phase0/operations/deposit.go index f137c2a8067a..8676f203a0e3 100644 --- a/testing/spectest/shared/phase0/operations/deposit.go +++ b/testing/spectest/shared/phase0/operations/deposit.go @@ -3,7 +3,7 @@ package operations import ( "testing" - "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/altair" + blks "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/v5/consensus-types/blocks" "github.com/prysmaticlabs/prysm/v5/consensus-types/interfaces" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" @@ -23,5 +23,5 @@ func blockWithDeposit(ssz []byte) (interfaces.SignedBeaconBlock, error) { } func RunDepositTest(t *testing.T, config string) { - common.RunDepositTest(t, config, version.String(version.Phase0), blockWithDeposit, altair.ProcessDeposits, sszToState) + common.RunDepositTest(t, config, version.String(version.Phase0), blockWithDeposit, blks.ProcessDeposits, sszToState) } diff --git a/testing/util/BUILD.bazel b/testing/util/BUILD.bazel index fb194bfc1093..0f418b8492eb 100644 --- a/testing/util/BUILD.bazel +++ b/testing/util/BUILD.bazel @@ -30,7 +30,6 @@ go_library( importpath = "github.com/prysmaticlabs/prysm/v5/testing/util", visibility = ["//visibility:public"], deps = [ - "//beacon-chain/core/altair:go_default_library", "//beacon-chain/core/blocks:go_default_library", "//beacon-chain/core/helpers:go_default_library", "//beacon-chain/core/signing:go_default_library", diff --git a/testing/util/altair.go b/testing/util/altair.go index 902c039337d6..2fbf2415de5b 100644 --- a/testing/util/altair.go +++ b/testing/util/altair.go @@ -7,7 +7,6 @@ import ( "github.com/pkg/errors" "github.com/prysmaticlabs/go-bitfield" - "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/altair" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/helpers" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/signing" @@ -71,7 +70,7 @@ func processPreGenesisDeposits( deposits []*ethpb.Deposit, ) (state.BeaconState, error) { var err error - beaconState, err = altair.ProcessDeposits(ctx, beaconState, deposits) + beaconState, err = blocks.ProcessDeposits(ctx, beaconState, deposits) if err != nil { return nil, errors.Wrap(err, "could not process deposit") } diff --git a/testing/util/electra_state.go b/testing/util/electra_state.go index 551af5536508..6df50e8ca832 100644 --- a/testing/util/electra_state.go +++ b/testing/util/electra_state.go @@ -52,7 +52,7 @@ func setKeysToActive(beaconState state.BeaconState) error { // genesisBeaconStateElectra returns the genesis beacon state. func genesisBeaconStateElectra(ctx context.Context, deposits []*ethpb.Deposit, genesisTime uint64, eth1Data *ethpb.Eth1Data) (state.BeaconState, error) { - st, err := emptyGenesisStateElectra() + st, err := emptyGenesisStateDeneb() if err != nil { return nil, err } @@ -71,40 +71,6 @@ func genesisBeaconStateElectra(ctx context.Context, deposits []*ethpb.Deposit, g return buildGenesisBeaconStateElectra(genesisTime, st, st.Eth1Data()) } -// emptyGenesisStateDeneb returns an empty genesis state in Electra format. -func emptyGenesisStateElectra() (state.BeaconState, error) { - st := ðpb.BeaconStateElectra{ - // Misc fields. - Slot: 0, - Fork: ðpb.Fork{ - PreviousVersion: params.BeaconConfig().BellatrixForkVersion, - CurrentVersion: params.BeaconConfig().DenebForkVersion, - Epoch: 0, - }, - // Validator registry fields. - Validators: []*ethpb.Validator{}, - Balances: []uint64{}, - InactivityScores: []uint64{}, - - JustificationBits: []byte{0}, - HistoricalRoots: [][]byte{}, - CurrentEpochParticipation: []byte{}, - PreviousEpochParticipation: []byte{}, - - // Eth1 data. - Eth1Data: ðpb.Eth1Data{}, - Eth1DataVotes: []*ethpb.Eth1Data{}, - Eth1DepositIndex: 0, - - LatestExecutionPayloadHeader: &enginev1.ExecutionPayloadHeaderElectra{}, - - DepositBalanceToConsume: primitives.Gwei(0), - ExitBalanceToConsume: primitives.Gwei(0), - ConsolidationBalanceToConsume: primitives.Gwei(0), - } - return state_native.InitializeFromProtoElectra(st) -} - func buildGenesisBeaconStateElectra(genesisTime uint64, preState state.BeaconState, eth1Data *ethpb.Eth1Data) (state.BeaconState, error) { if eth1Data == nil { return nil, errors.New("no eth1data provided for genesis state")