// calculateEpochRootHash calculates the root hash of the epoch
func (p *Parlia) calculateEpochRootHash(chain consensus.ChainHeaderReader, epoch uint64, epochLength uint64) (common.Hash, error) {
startBlock := epoch * epochLength
endBlock := (epoch+1)*epochLength - 1
log.Info("Starting epoch root hash calculation", "epoch", epoch, "startBlock", startBlock, "endBlock", endBlock, "epochLength", epochLength)
var hashes []common.Hash
for blockNum := startBlock; blockNum <= endBlock; blockNum++ {
header := chain.GetHeaderByNumber(blockNum)
if header == nil {
log.Warn("Unable to get block header", "blockNumber", blockNum)
continue
}
// Use block header hash as block hash
hashes = append(hashes, header.Hash())
}
// Use DeriveSha function to calculate Merkle tree root hash (reuse block hash calculation method)
blockHashes := BlockHashes(hashes)
rootHash := types.DeriveSha(blockHashes, trie.NewStackTrie(nil))
return rootHash, nil
}