「区块链」为什么我们需要「解耦状态」?

原创 浮世清欢  |  文章来源:币圈达人发布时间:2020-05-24 02:17  阅读 130 次 评论 0 条
众人帮 趣闲赚 牛帮
摘要:

在上一篇「三分钟入门Neo3」中,我们针对Neo2中的一个问题——缺乏全局状态以及它对轻客户端的一些影响,提出了「在区块头中包含状态根」的解决方案。尤其是对于轻量级客户端(例如用户钱包)和跨链交易而言,「在区块头中包含状态根」可以为数据存储

在上一篇「三分钟入门Neo3」中,我们针对Neo2中的一个问题——缺乏全局状态以及它对轻客户端的一些影响,提出了「在区块头中包含状态根」的解决方案。

尤其是对于轻量级客户端(例如用户钱包)和跨链交易而言,「在区块头中包含状态根」可以为数据存储提供有价值的信任保证。但是,这种方案将捆绑起区块持久性和状态持久性,这一特征可能会导致性能严重损失。

本篇所介绍的初步解决方案是希望能够改善这一缺陷,并将介绍Neo的bug修复功能。

状态根可能带来的隐患

核心开发者Igor Coelho认为,将最新状态根添加到区块头中的前提,是必须在提议该区块之前由共识节点充当发言人来计算当前状态。

在花费时间排序并验证事务以构造一个块之后,共识节点需要处理那些事务中包含的所有状态更改,才能确定最终状态。只有在计算完状态根后才能将其包含在区块头中,因此所有计算都必须在区块创建到向其他节点提议之间进行。

在某些情况下,这可能会耗尽规定范围里共识轮次中的所有可用时间,导致其他共识节点确认更改的时间变少,并影响下一个区块的确认时间。延迟会降低网络的总体吞吐量,因为对于每个失败的共识轮次,阻塞时间都会增加一倍。

核心开发者Shargon提出了一个可行的解决方案,他指出新块头可以包含以前的状态。这可以消除潜在的性能缺陷,因为在达成共识时,节点无需花费资源来计算状态。此过程可以随后完成,新块状态将保留到下一个区块头中。

尽管这种方法可以更好地利用节点资源,并有助于确保区块的优先生成,但也会削弱Neo的独有优势——在不影响区块链的不可篡改特性前提下修复协议bug。

解耦状态

Neo2的一个典型特征是,可以在不影响区块历史的情况下修复代码中的bug。Neo创始人张铮文首先提到了这点,并由Igor Coelho总结道:

“Neo有一个特点,可以不断修补程序中的bug,而状态与协议规范本身(而不是代码)相关联。因此,如果代码存在bug,并且我们将“状态”锁定在块上,那么我们将永远无法解决问题。”

张铮文提供了这种bug修复功能的示例,他演示了NeoVM若产生出错误的合约结果,可能导致对合约存储的bug修改。诸如资产丢失或由于此类漏洞而引起的黑客入侵等事件,可以在大多数经过分叉程序的PoW / PoS区块链上解决,但是分叉本质上是两极分化的事件,可能涉及“回滚”区块。

这威胁了网络交易的最终确定性,质疑了账本的不可篡改性,并可能导致破坏或分裂生态系统,就像过去比特币和以太坊所发生的那样。

如果Neo2发生类似问题,可以通过更新修复NeoVM代码中的bug并将其推广到网络上的节点。每个更新的节点像以前一样重新同步相同的区块链,以保留交易的不可篡改,但是错误的合约执行将不再发生。这将更改状态根,但不会影响网络,因为当前尚未保留全局状态。

从本质上讲,在不影响网络的前提下将状态与协议规范关联,为Neo提供了独特的bug修复能力,既保持了区块链的不可篡改性,也不会在常规分叉过程中造成大量的开销。但是,当前它是以没有达成一致的全球状态为前提的。除了性能优势外,独特的bug修复能力也是解耦状态下的另一个优势。

- 解耦状态 -

解耦旨在让数据模型、业务逻辑、视图显示三层之间彼此降低耦合,把关联度降到最低,不至于牵一发而动全身。

这种考虑是反对将状态根写入区块头的主要论点。一旦状态在一个区块中完成,它将始终是该区块的一部分。如果协议的更新修复了过去发生的bug,则更新和重播的链节点将可能不匹配过去区块头中记录的状态。

对单一全球状态的共识是Neo保持可靠性和适用性两种特性的重要一步。

历史上的今天:

本文地址:https://www.u5881.com/9283.html
版权声明:本站推荐的部分活动具有时效性,老淘本人并不能保证当您看到本文时,该项活动是否仍在继续。

发表评论


表情