作者:Shinobi

来源:https://bitcoinmagazine.com/technical/softchains-use-cases-and-security-costs

本文是研讨不同侧链设计的系列文章之一,这次我们要讲的是 softchains。这是 Ruben Somsen 提出了另一种侧链机制。Softchain 跟我之前介绍过的 spacechain 非常不同(中文译本)。要实现一条侧链,它需要对专门构造的 Bitcoin Core 协议专门做一次变更,这意味着它会给比特币全节点施加新的验证成本;它支持双向锚定机制,不需要依赖联盟来托管资金。

基石

Softchain 这个想法基于 Somsen 更早提出的一个叫做 “PoW 欺诈证明” 的提议,这个机制本意是为钱包提升简易支付验证(SPV)的安全性。关于区块链,一个简单的观察是,如果出现了一个无效的区块,该块有可能会成为一个分叉,因为诚实的矿工会拒绝在这个无效区块上挖矿,并最终挖出有效的区块。如果出现了无效的区块,诚实的矿工又没有挖出分叉,那就意味着网络的共识流程完全崩溃了,而这样的事情在概率上是极小的。 因此,分叉可以被认为是一种信号:“喂!这里有异常情况,你要多检查一遍。” 客户端可以将分叉当成一种警报,遇上了这种警报就要把区块下载下来,亲自验证到底发生了什么事。

但是,这里面有一个根本的问题 —— 为了验证一个区块,你必须拥有 UTXO 集合。为了拥有 UTXO 集合,你要验证产生这个集合的所有历史区块。这怎么能够用作一种 SPV 机制呢?答案是我们需要 UTXO 集合承诺。

每个区块都需要根据当时的 UTXO 集合来验证,UTXO 集合记录了所有还未花费的比特币;当前,UTXO 集合是一种本地数据库,每个节点都在从头扫描区块链的过程中建构出 UTXO 集合并记录下来。而(其中一种) UTXO 集合承诺是取整个集合为输入、建构出一棵默克尔树,并且理想情况下是在每个区块内承诺这棵默克尔树的根哈希值。这样你收到的区块就会带有一些额外的数据 —— 每笔交易的每个输入都会带有一个默克尔分支,证明这个输入属于最新的 UTXO 集合 —— 而且你可以拿这些数据来验证。如果一种系统从一开始就使用了这样的承诺方案,而且大量的完全验证区块链的用户都真实使用这样的承诺方案,则该方案就能提供几乎等价于全节点的安全保证。无论什么时候发生了链分裂,你都可以下载相关的区块,并确保自己跟随的链是有效的。如果分叉的两个竞争区块都是有效的,那么就看哪个会变成最长链。但是,一旦某一个是无效的,你立马就会检测出来。

双向锚定

作为 softchain 设计的一部分,主链节点必须下载和验证每一个 softchain 侧链的区块头,在出现了链分裂的时候,则需要下载区块并使用 UTXO 集合承诺来验证相关的区块。这就形成了双向锚定机制的基础。要把币移动到侧链上时, 用户要创建一笔主链交易,将币分配给某一条 softchain,然后在侧链上,通过引用被确认的主链交易来申领资金。保守一点来说,当决定从侧链撤出时,你需要做一遍相反的操作。这就是 PoW 欺诈证明的用场。整个思路是,在资金撤出侧链的时候,创建一笔主链交易、引用一笔侧链上的区块交易。这些币无法立即花用,必须等待一个很长的确认期(比如 1年) 之后才能动用;而且,如果侧链上的取款交易被重组或被发现是无效交易,币会一直 “锁在侧链” 上。后者会被检测出来,因为在链分叉事件中,主链节点会下载侧链分裂涉及的所有区块,并使用 UTXO 集承诺来验证它们。

撤出资金的确认期很长,长得即使只有一小部分诚实的矿工,也有充分的时间可以创建出一个有效的分叉区块,并触发基于 UTXO 集承诺的验证流程。这使得主链节点在取款被确认之前就可以捕捉到欺诈性的侧链取款,从而无需验证整条侧链 —— 如果需要,则等同于扩大区块 —— 而依然能作废无效的交易。

安全参数与风险

这个设计在基于特定变量的安全级别以及这样的侧链如何跟矿工交互上提出了一些问题。首先,任何 softchain 都要部署一个出块难度下限,即使挖矿算力太低,难度也不会调整到这个下限之下,只是侧链上的最低难度区块会以更长时间挖出 —— 也即出块间隔会变长。这是必要的,因为主链节点必须执行的 PoW 欺诈证明的验证机制是整个设计的一部分。如果 softchain 的难度太低,矿工将很容易以规律的速度恶意分叉 softchain,本质上就是通过增加主链节点必须验证的额外数据量、发动拒绝服务式攻击。

合并挖矿是这个问题的解决方案之一。如果所有的比特币矿工都挖掘侧链的区块,那么通过在 softchain 上制造链分裂来攻击主链节点的问题就基本上解决了。因为分叉侧链跟分叉主链所需的工作量是一样的。但是,在解决 DoS 攻击的同时它又创造了另一个问题:提高了矿工的验证成本。

如果矿工希望同时挖掘 softchain,他们必须运行 softchain 的节点来保证自己挖的区块是有效的。要是不运行节点,就要承担所挖区块因为无效而变成孤块、失去手续费收入的风险。要是激活了许多难以验证的 softchain,比如复制以太坊的链或者大区块的链,挖矿可能会由此变得更难参与、更中心化。矿工必须验证一条链,才知道自己不是在无效块上挖矿、不会因此徒劳无功,所以他们并没有选择。让验证变得更昂贵会推进挖矿去中心化的努力

最大的问题是,softchain 上的共识错误可能会导致主链自身的共识分裂。大规模的 softchain 链重组,可能会作废掉主链上已经几乎确认的有效侧链取款交易。记住,主链节点必须跟踪 softchain 的区块头。这可能会导致主链分裂,因为主链在验证那笔侧链取款交易时,网络的不同部分跟随了侧链的不同分叉。Softchain 上非确定性的共识分叉,也有可能导致主链分裂,即,某一些节点认为一笔取款交易是无效的,而另一些又认为它是有效的。

这种跟主链共识的深层关联,让 softchain 在某种程度上成了高风险甚至不应该实现的东西。最好每个分叉只激活一条 softchain,而不是部署一个让 softchian 可以任意出现的分叉。事实是,在这种机制中,侧链的分裂会导致主链节点验证更多数据,所以任意打开 softchain 的能力就成了对主链的攻击向量。

比起 spacechain,softchain 更深地参与到了主链的共识层,因此也带来了更多风险,但他们允许原生的双向锚定,因此可以给不同的应用场景带来更多可能性。下一篇文章,我会介绍 drivechain,最后给出一些我对侧链的整体想法。

(完)