github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/core/helpers/genesis.go (about)

     1  package helpers
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/pkg/errors"
     7  	iface "github.com/prysmaticlabs/prysm/beacon-chain/state/interface"
     8  	ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
     9  	"github.com/prysmaticlabs/prysm/shared/params"
    10  	"github.com/prysmaticlabs/prysm/shared/trieutil"
    11  )
    12  
    13  // UpdateGenesisEth1Data updates eth1 data for genesis state.
    14  func UpdateGenesisEth1Data(state iface.BeaconState, deposits []*ethpb.Deposit, eth1Data *ethpb.Eth1Data) (iface.BeaconState, error) {
    15  	if eth1Data == nil {
    16  		return nil, errors.New("no eth1data provided for genesis state")
    17  	}
    18  
    19  	var leaves [][]byte
    20  	for _, deposit := range deposits {
    21  		if deposit == nil || deposit.Data == nil {
    22  			return nil, fmt.Errorf("nil deposit or deposit with nil data cannot be processed: %v", deposit)
    23  		}
    24  		hash, err := deposit.Data.HashTreeRoot()
    25  		if err != nil {
    26  			return nil, err
    27  		}
    28  		leaves = append(leaves, hash[:])
    29  	}
    30  	var trie *trieutil.SparseMerkleTrie
    31  	var err error
    32  	if len(leaves) > 0 {
    33  		trie, err = trieutil.GenerateTrieFromItems(leaves, params.BeaconConfig().DepositContractTreeDepth)
    34  		if err != nil {
    35  			return nil, err
    36  		}
    37  	} else {
    38  		trie, err = trieutil.NewTrie(params.BeaconConfig().DepositContractTreeDepth)
    39  		if err != nil {
    40  			return nil, err
    41  		}
    42  	}
    43  
    44  	depositRoot := trie.Root()
    45  	eth1Data.DepositRoot = depositRoot[:]
    46  	err = state.SetEth1Data(eth1Data)
    47  	if err != nil {
    48  		return nil, err
    49  	}
    50  	return state, nil
    51  }