eth 统计merkle 树根hash的简单实现

// 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
}

 

posted @ 2025-08-27 10:55  若-飞  阅读(9)  评论(0)    收藏  举报