为什么我们需要「解耦状态」? | 三分钟入门Neo3
摘要: 为什么我们需要「解耦状态」? | 三分钟入门Neo3
在上一篇「三分钟入门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保持可靠性和适用性两种特性的重要一步。
在下一篇文章中,我们将介绍一种针对状态持久性的初步解决方案,该解决方案既可以满足对全局状态的需求,又可以在不干扰Neo本身的情况下保持修复协议bug的能力。
(1、 内容来自链得得内容开放平台“得得号”,稿件内容仅代表作者观点,不代表链得得官方立场。2、 凡“得得号”文章,原创性和内容的真实性由投稿人保证,如果稿件因抄袭、作假等行为导致的法律后果,由投稿人本人负责。3、 得得号平台发布文章,如有侵权、违规及其他不当言论内容,请广大读者监督,一经证实,平台会立即下线。如遇文章内容问题,请发送至邮箱:chengyiniu@chaindd.com)
评论(0)
Oh! no
您是否确认要删除该条评论吗?