From 1c6c058bba13920598c69bf5346aa4e957bd0147 Mon Sep 17 00:00:00 2001 From: terence tsao Date: Sat, 3 Apr 2021 14:19:48 -0700 Subject: [PATCH] Genesis beacon state: refactor update eth1 data (#8704) --- beacon-chain/core/state/state.go | 71 ++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 30 deletions(-) diff --git a/beacon-chain/core/state/state.go b/beacon-chain/core/state/state.go index e86926498f3b..69bb518681dd 100644 --- a/beacon-chain/core/state/state.go +++ b/beacon-chain/core/state/state.go @@ -56,41 +56,13 @@ import ( // return state // This method differs from the spec so as to process deposits beforehand instead of the end of the function. func GenesisBeaconState(deposits []*ethpb.Deposit, genesisTime uint64, eth1Data *ethpb.Eth1Data) (iface.BeaconState, error) { - if eth1Data == nil { - return nil, errors.New("no eth1data provided for genesis state") - } state, err := EmptyGenesisState() if err != nil { return nil, err } - // Process initial deposits. - var leaves [][]byte - for _, deposit := range deposits { - if deposit == nil || deposit.Data == nil { - return nil, fmt.Errorf("nil deposit or deposit with nil data cannot be processed: %v", deposit) - } - hash, err := deposit.Data.HashTreeRoot() - if err != nil { - return nil, err - } - leaves = append(leaves, hash[:]) - } - var trie *trieutil.SparseMerkleTrie - if len(leaves) > 0 { - trie, err = trieutil.GenerateTrieFromItems(leaves, params.BeaconConfig().DepositContractTreeDepth) - if err != nil { - return nil, err - } - } else { - trie, err = trieutil.NewTrie(params.BeaconConfig().DepositContractTreeDepth) - if err != nil { - return nil, err - } - } - depositRoot := trie.Root() - eth1Data.DepositRoot = depositRoot[:] - err = state.SetEth1Data(eth1Data) + // Process initial deposits. + state, err = updateGenesisEth1Data(state, deposits, eth1Data) if err != nil { return nil, err } @@ -258,3 +230,42 @@ func IsValidGenesisState(chainStartDepositCount, currentTime uint64) bool { } return true } + +func updateGenesisEth1Data(state iface.BeaconState, deposits []*ethpb.Deposit, eth1Data *ethpb.Eth1Data) (iface.BeaconState, error) { + if eth1Data == nil { + return nil, errors.New("no eth1data provided for genesis state") + } + + var leaves [][]byte + for _, deposit := range deposits { + if deposit == nil || deposit.Data == nil { + return nil, fmt.Errorf("nil deposit or deposit with nil data cannot be processed: %v", deposit) + } + hash, err := deposit.Data.HashTreeRoot() + if err != nil { + return nil, err + } + leaves = append(leaves, hash[:]) + } + var trie *trieutil.SparseMerkleTrie + var err error + if len(leaves) > 0 { + trie, err = trieutil.GenerateTrieFromItems(leaves, params.BeaconConfig().DepositContractTreeDepth) + if err != nil { + return nil, err + } + } else { + trie, err = trieutil.NewTrie(params.BeaconConfig().DepositContractTreeDepth) + if err != nil { + return nil, err + } + } + + depositRoot := trie.Root() + eth1Data.DepositRoot = depositRoot[:] + err = state.SetEth1Data(eth1Data) + if err != nil { + return nil, err + } + return state, nil +}