Dusk Network Daybreak上线前关键漏洞分析

1. 引言

Dusk系列博客有:

因发现一个state关键漏洞,会对共识机制造成延迟,从而影响网络稳定性,Dusk Network在1月31日宣布,推迟其原计划于2月1日的名为Daybreak的public testnet 的上线。

具体问题为:
尽管每个节点在同一区块高度,包含的是相同的交易。但是事实上,它们会指向不同的区块状态hash。使得每个节点本质上为其自身版本的区块链,并未达成共识。因此该问题必须在Daybreak之前解决。

2. 漏洞描述

The state of the blockchain is identified by a hash of all the data stored upon transaction execution since the genesis of the blockchain. In particular, the genesis block is created by including the bytecode of the compiled core contracts, such as the stake and the transfer contract. However, when using a compiler, some references to the environment where such a compilation happens, are retained in the resulting binary artifact.

最常见的reference为编译发生的路径。每个节点的路径各不相同,意味着当在不同机器上编译时,即使区块数据是绝对完全相同的,the identifier(即the hash of the data and the bytecode of the genesis contracts)会不同。

举例来说,若Alice编译并启动其自己的节点,发送3 DUSK给Bob,则state hash为 transaction hash + compiled artifact hash(包含了Alice的home path,如/home/alice/rusk)。而Bob的节点编译路径不同(如/home/bob/rusk),则尽管交易完全相同,二者的state hash也会不同。

在这种状态持续期间发生的另一个问题加剧了这种差异。当每个区块都被接受时,Rusk虚拟机会运行所有交易以更新global state。以上面例子为例,执行Alice的交易会更新global state,使得Alice无法双花其发给Bob的3 DUSK,而Bob拥有了这3 DUSK。当这种改变发生时,Rusk虚拟机的2个核心要素将被激活:

  • 1)Canonical:会encode the spendable DUSK in the Merkle Tree(名为note tree)。
  • 2)Microkelvin:负责维护notes信息。

问题在于,Canonical中会使用recursive算法来在内存中存储notes以供Microkelvin访问。虽然合约状态识别出了note在树中的正确位置和数量,但它随后无法检索实际数据,这再次导致状态的正确计算出现问题。

3. 解决漏洞的办法

解决该漏洞有2种方案在并行进行:

  • 1)给Canonical打补丁。但是Dusk network官方以已deprecated Canonical,而倾向于使用rkyv。讽刺的是,之所以本次测试网上线计划使用Canonical是因为其使用的时间较长。【这是一个短期方案,未来主网上线时仍计划使用rkyv。】
    Canonical:为a serialization库,使得Dusk智能合约开发者可access native operations on the node seamlessly。该库目前已在Dusk Network测试网中实现,完成相应补丁后可解决上述漏洞。
  • 2)升级迁移至rkyv。相比于Canonical,rkyv大幅提升了性能,具有更便宜的gas费,更低的复杂度,以及更简单的智能合约layout。但是该方案包含了一些相对新的技术元素,在每两周的发布周期中,我们需要对不可预见的副作用保持警惕。【长期解决方案。】
    rkyv:为a zero-copy deserialization框架,完全基于RUST语言构建,计划在经过充分测试后用于替换Canonical。使用rkyv不仅可解决如上问题,还可加快整个网络并提升gas效率。

相关讨论见:

参考资料

[1] 2022年2月14日Testnet, Canonical Patch & PlonKup - Dusk Development Update #39
[2] 2022年2月1日 State of Testnet: Critical Bug Report
[3] 2022年1月31日 State of Testnet: Critical Bug Postpones Daybreak

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值