直接读取当前轮的Round信息中该CDC的公钥对应的expected_mining_time字段即可。
expectedMiningTime = currentRound.GetExpectedMiningTime(publicKey); nextBlockMiningLeftMilliseconds = (int) (expectedMiningTime - currentBlockTime).Milliseconds();
GetConsensusCommand - NextRound
AElfConsensusBehaviour.NextRound会根据本轮各个CDC公布的信息,按照顺序计算规则,生成下一轮各个CDC的顺序和对应时间槽,将RoundNumber往后推进一个数字。
对于本轮指定为额外区块生产者的CDC,直接读取本轮的额外区块生成时间槽即可。
否则,为了防止指定的额外区块生产者掉线或者在另外一个分叉上出块(在网络不稳定的情况下会出现分叉),其他所有的CDC也会得到一个互不相同额外区块生产的时间槽,这些CDC在同步到任何一个CDC生产的额外区块后,会立刻重置自己的调度器,所以不必担心产生冲突。
对于第一届第一轮的特殊处理同AElfConsensusBehaviour.UpdateValueWithoutPreviousInValue。
... var minerInRound = currentRound.RealTimeMinersInformation[publicKey]; if (currentRound.RoundNumber == 1) { nextBlockMiningLeftMilliseconds = minerInRound.Order.Add(currentRound.RealTimeMinersInformation.Count).Sub(1) .Mul(currentRound.GetMiningInterval()); expectedMiningTime = Context.CurrentBlockTime.AddMilliseconds(nextBlockMiningLeftMilliseconds); } else { expectedMiningTime = current