From 6a191d193b23bd82d0f89571432424ccb001c432 Mon Sep 17 00:00:00 2001 From: aBear Date: Wed, 30 Oct 2024 17:02:50 +0100 Subject: [PATCH] validate deposits against deposit store ones --- beacond/cmd/defaults.go | 4 +- mod/beacon/validator/block_builder.go | 3 +- .../pkg/components/state_processor.go | 9 +++- .../pkg/core/state_processor.go | 3 ++ .../pkg/core/state_processor_genesis_test.go | 1 + .../pkg/core/state_processor_staking.go | 41 ++++++++++++------- mod/state-transition/pkg/core/types.go | 9 ++++ 7 files changed, 51 insertions(+), 19 deletions(-) diff --git a/beacond/cmd/defaults.go b/beacond/cmd/defaults.go index e4ede16b88..3cc2294f4e 100644 --- a/beacond/cmd/defaults.go +++ b/beacond/cmd/defaults.go @@ -119,8 +119,8 @@ func DefaultComponents() []any { ], components.ProvideStateProcessor[ *BeaconBlock, *BeaconBlockBody, *BeaconBlockHeader, - *BeaconState, *BeaconStateMarshallable, *Deposit, *ExecutionPayload, - *ExecutionPayloadHeader, *KVStore, + *BeaconState, *BeaconStateMarshallable, *Deposit, *DepositStore, + *ExecutionPayload, *ExecutionPayloadHeader, *KVStore, ], components.ProvideKVStore[*BeaconBlockHeader, *ExecutionPayloadHeader], components.ProvideStorageBackend[ diff --git a/mod/beacon/validator/block_builder.go b/mod/beacon/validator/block_builder.go index 7e82b18f8d..dbe23a28d3 100644 --- a/mod/beacon/validator/block_builder.go +++ b/mod/beacon/validator/block_builder.go @@ -87,7 +87,8 @@ func (s *Service[ envelope, err := s.retrieveExecutionPayload(ctx, st, blk) if err != nil { return blk, sidecars, err - } else if envelope == nil { + } + if envelope == nil { return blk, sidecars, ErrNilPayload } diff --git a/mod/node-core/pkg/components/state_processor.go b/mod/node-core/pkg/components/state_processor.go index 269154b8e5..0035efecc8 100644 --- a/mod/node-core/pkg/components/state_processor.go +++ b/mod/node-core/pkg/components/state_processor.go @@ -36,6 +36,7 @@ type StateProcessorInput[ ExecutionPayloadT, ExecutionPayloadHeaderT, WithdrawalsT, ], ExecutionPayloadHeaderT ExecutionPayloadHeader[ExecutionPayloadHeaderT], + DepositT Deposit[DepositT, *ForkData, WithdrawalCredentials], WithdrawalT Withdrawal[WithdrawalT], WithdrawalsT Withdrawals[WithdrawalT], ] struct { @@ -47,7 +48,8 @@ type StateProcessorInput[ PayloadID, WithdrawalsT, ] - Signer crypto.BLSSigner + DepositStore DepositStore[DepositT] + Signer crypto.BLSSigner } // ProvideStateProcessor provides the state processor to the depinject @@ -66,6 +68,7 @@ func ProvideStateProcessor[ ], BeaconStateMarshallableT any, DepositT Deposit[DepositT, *ForkData, WithdrawalCredentials], + DepositStoreT DepositStore[DepositT], ExecutionPayloadT ExecutionPayload[ ExecutionPayloadT, ExecutionPayloadHeaderT, WithdrawalsT, ], @@ -78,7 +81,8 @@ func ProvideStateProcessor[ WithdrawalT Withdrawal[WithdrawalT], ]( in StateProcessorInput[ - ExecutionPayloadT, ExecutionPayloadHeaderT, WithdrawalT, WithdrawalsT, + ExecutionPayloadT, ExecutionPayloadHeaderT, + DepositT, WithdrawalT, WithdrawalsT, ], ) *core.StateProcessor[ BeaconBlockT, BeaconBlockBodyT, BeaconBlockHeaderT, @@ -107,6 +111,7 @@ func ProvideStateProcessor[ ]( in.ChainSpec, in.ExecutionEngine, + in.DepositStore, in.Signer, ) } diff --git a/mod/state-transition/pkg/core/state_processor.go b/mod/state-transition/pkg/core/state_processor.go index 439cf3895f..6edbba6059 100644 --- a/mod/state-transition/pkg/core/state_processor.go +++ b/mod/state-transition/pkg/core/state_processor.go @@ -85,6 +85,7 @@ type StateProcessor[ executionEngine ExecutionEngine[ ExecutionPayloadT, ExecutionPayloadHeaderT, WithdrawalsT, ] + ds DepositStore[DepositT] } // NewStateProcessor creates a new state processor. @@ -136,6 +137,7 @@ func NewStateProcessor[ executionEngine ExecutionEngine[ ExecutionPayloadT, ExecutionPayloadHeaderT, WithdrawalsT, ], + ds DepositStore[DepositT], signer crypto.BLSSigner, ) *StateProcessor[ BeaconBlockT, BeaconBlockBodyT, BeaconBlockHeaderT, @@ -152,6 +154,7 @@ func NewStateProcessor[ cs: cs, executionEngine: executionEngine, signer: signer, + ds: ds, } } diff --git a/mod/state-transition/pkg/core/state_processor_genesis_test.go b/mod/state-transition/pkg/core/state_processor_genesis_test.go index 20996901ea..2f853a9229 100644 --- a/mod/state-transition/pkg/core/state_processor_genesis_test.go +++ b/mod/state-transition/pkg/core/state_processor_genesis_test.go @@ -108,6 +108,7 @@ func TestInitialize(t *testing.T) { ]( cs, execEngine, + nil, // TODO: add deposit store mocksSigner, ) diff --git a/mod/state-transition/pkg/core/state_processor_staking.go b/mod/state-transition/pkg/core/state_processor_staking.go index fc336908da..565f779cbd 100644 --- a/mod/state-transition/pkg/core/state_processor_staking.go +++ b/mod/state-transition/pkg/core/state_processor_staking.go @@ -21,6 +21,9 @@ package core import ( + "fmt" + "reflect" + "github.com/berachain/beacon-kit/mod/errors" "github.com/berachain/beacon-kit/mod/primitives/pkg/common" "github.com/berachain/beacon-kit/mod/primitives/pkg/math" @@ -36,26 +39,36 @@ func (sp *StateProcessor[ st BeaconStateT, blk BeaconBlockT, ) error { - // Verify that outstanding deposits are processed up to the maximum number - // of deposits. - deposits := blk.GetBody().GetDeposits() - index, err := st.GetEth1DepositIndex() + // Verify that outstanding deposits matches those listed by contract + depositIndex, err := st.GetEth1DepositIndex() if err != nil { return err } - eth1Data, err := st.GetEth1Data() + + stateDeposits, err := sp.ds.GetDepositsByIndex( + depositIndex, + sp.cs.MaxDepositsPerBlock(), + ) if err != nil { return err } - depositCount := min( - sp.cs.MaxDepositsPerBlock(), - eth1Data.GetDepositCount().Unwrap()-index, - ) - _ = depositCount - // TODO: Update eth1data count and check this. - // if uint64(len(deposits)) != depositCount { - // return errors.New("deposit count mismatch") - // } + + deposits := blk.GetBody().GetDeposits() + if len(stateDeposits) != len(deposits) { + return fmt.Errorf("deposits mismatched lengths, state: %d, payload: %d", + len(stateDeposits), + len(deposits), + ) + } + + for i, sd := range stateDeposits { + if !reflect.DeepEqual(sd, deposits[i]) { + return fmt.Errorf("deposits mismatched, idx %d state: %v, payload: %v", + i, sd, deposits[i], + ) + } + } + return sp.processDeposits(st, deposits) } diff --git a/mod/state-transition/pkg/core/types.go b/mod/state-transition/pkg/core/types.go index 26ef877923..f01ac60f97 100644 --- a/mod/state-transition/pkg/core/types.go +++ b/mod/state-transition/pkg/core/types.go @@ -142,6 +142,15 @@ type Deposit[ ) error } +// DepositStore defines the interface for deposit storage. +type DepositStore[DepositT any] interface { + // GetDepositsByIndex returns `numView` expected deposits. + GetDepositsByIndex( + startIndex uint64, + numView uint64, + ) ([]DepositT, error) +} + type ExecutionPayload[ ExecutionPayloadT, ExecutionPayloadHeaderT, WithdrawalsT any, ] interface {