首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >eos源码赏析(二十二):EOS交易状态何时才是不可逆的

eos源码赏析(二十二):EOS交易状态何时才是不可逆的

作者头像
用户2569546
发布2021-11-23 10:37:42
3680
发布2021-11-23 10:37:42
举报
文章被收录于专栏:eosfanseosfans

作为本文的读者,可能大部分都进行过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。当然由于网络的原因,这个不可逆状态或多或少的会产生一些时间上的差异,那么我们是否可以从代码中找到蛛丝马迹来判断何时是不可逆的么。

在前面的文章我们分析出块流程的时候有这个步骤:当前区块高度小于最后一个不可逆区块高度的时候,这个交易便是不可逆的了,来看:

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机制中一笔交易最后是如何实现不可逆的过程。当然理解可能 也有偏差,还请各位多多指教。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-09-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 eosfans 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
区块链
云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档