为什么mrand.Float64()可以用在链fork choice中?不同geth客户端可能产生不同的合法链吗?
发布于 1 个月前 作者 manxiaqu 130 次浏览 来自 以太坊

在geth收到任何一个块后,都会尝试将其他插入到本地,成为fork block或者是new block,从其reorg的代码来看,当收到一个新块并插入后,与原链相比,如果总难度一致,并且高度一致,会使用mrand.Float64()<0.5代码位置来决定是否进行reorg操作(切换链),那么不同的客户端在不同的时间启动、不同顺序收到块的情况下,如何保证该伪随机函数执行的结果是一致的,从而保证所有节点的唯一合法链是一致的?

if !reorg && externTd.Cmp(localTd) == 0 {
		// Split same-difficulty blocks by number, then at random
		reorg = block.NumberU64() < currentBlock.NumberU64() || (block.NumberU64() == currentBlock.NumberU64() && mrand.Float64() < 0.5)
}
回到顶部