作为本文的读者,可能大部分都进行过eos代币的转账操作。我们平时的交易过程中,能体验到【立马到账】的感觉,这也是eos被越来越多的人认可的重要原因。然而在区块链系统中一笔交易是否完成,有一个很重要的因素就是该笔交易在链上是否是可逆的。今天我们就来谈谈一笔交易在什么情况下才是不可逆的。
在行文之前首先感谢大佬Raymond及荆凯给予的帮助,同时建议了解下交易的基础知识,荆凯大佬曾经写了一篇文:
【一五一十】EOS转账背后,发生了什么: EOS交易的状态 https://bihu.com/article/1331591
在文中提到有个pending的倒计时,同时币乎的作者阿华区块链写过的几篇文章,特别分析了一下当前区块高度与不可逆区块高度之间的关系,得到的结论是,大约不可逆区块与当前区块高度相差在334个区块左右,换算成时间的话,大致是2.7分钟左右。那么这个pending倒计时是什么,和区块的不可逆之间有什么关系呢。
我们都知道在eosio中使用了DPoS共识机制而非类比特币的Pow共识机制。DPoS机制的基本逻辑是一笔交易打包在区块之后,需要21个超级节点中的2/3以上的节点进行签名确认,才认为是不可逆的。而节点生产区块的
速度为0.5秒一个区块,每个节点轮流出块的过程中在6秒的时间内生产12个区块。为什么设置6秒生产12个区块,BM在一些回答中提到:
6 seconds was chosen based upon the "maximum downtime" if a producer goes off line. This matches Steem & BitShares where a single missed block creates 6 seconds without any confirmation. 简单的翻译下:之所以选择6秒钟是和节点离线的最大时长有关的。
那么我们来设想一笔交易执行节点A将交易信息打包至区块中,此时节点A已经确认,在执行完成之后还需要至少2/3以上的节点去确认。在eosio设计之初,节点确认只需要进行一轮即可,但在eos主网上线之前V神提出了不同的意见并给出了相关的建议,针对原有设计的安全性进行举例分析,感兴趣的同学可以关注下这个issue:
https://github.com/EOSIO/eos/issues/2718
V神的质疑:
BM的回答:
注:本来标题想搞笑一点这样写的:震惊!V神和BM竟如此互怼。
最终,在eosio中,DPoS的节点确认修改为两轮,而V神提到的这篇论文,笔者还在研读,如有感兴趣的也可以一起交流。
我们接着来看。当一笔交易完成打包之后,意味着当前节点以确认,还需要至少21个超级节点中的2/3以上确认,而加上需要两轮确认,因此我们可以做出如下计算:
此处也基本可验证上面荆凯和阿华提到的当前区块高度和不可逆区块高度之间的差值,最大为336。我们在查询主网的信息也可以看到类似的情况,两者之间的差值为335:
而根据一个区块生产的时间为0.5秒计算,从交易执行结束到变为不可逆状态所需要的时间应为168s。当然由于网络的原因,这个不可逆状态或多或少的会产生一些时间上的差异,那么我们是否可以从代码中找到蛛丝马迹来判断何时是不可逆的么。
在前面的文章我们分析出块流程的时候有这个步骤:当前区块高度小于最后一个不可逆区块高度的时候,这个交易便是不可逆的了,来看:
代码语言:javascript复制const auto& gpo = db.get<global_property_object>();
if( gpo.proposed_schedule_block_num.valid() && // if there is a proposed schedule that was proposed in a block ...
( *gpo.proposed_schedule_block_num <= pending->_pending_block_state->dpos_irreversible_blocknum ) && // ... that has now become irreversible ...
pending->_pending_block_state->pending_schedule.producers.size() == 0 && // ... and there is room for a new pending schedule ...
!was_pending_promoted // ... and not just because it was promoted to active at the start of this block, then:
)
代码中也对区块的几种状态给出了解释即:当前节点生产区块的高度小于最后一个不可逆区块的高度时便为不可逆的。
本文从各位大佬已经积累的经验出发,从代码及平时测试的经验来分析DPoS机制中一笔交易最后是如何实现不可逆的过程。当然理解可能 也有偏差,还请各位多多指教。