federation
它只需要小部分节点验证主侧链间转账交易,其他的大部分节点不参与侧链相关的逻辑。从侧链向主链转账时,不用提供侧链交易的证明。是否解锁主链上的币的决定权在于这一小部分节点,只需要他们进行投票表决。这些节点被称为 federation,它们相当于主侧链之间转账的看门人,时刻监视着 2 条链上的交易,对主侧链之间的转账进行投票。
通过多重签名使得 federation 成员无法单独作恶,只有当大多数人签名同意,交易才能生效,从而尽量减少中心化程度。
这种方式实现逻辑较为简单,对主链也没有额外需要,只需要支持多重签名即可。只是因为交易包含很多签名,所以比普通交易更大,通过 schnorr signature 甚至可以让它和普通交易差不多。
不过只要一定数量的 federation 成员联合起来就可以为所欲为,不需要没有任何算力成本。成本主要是 federation 成员的”信誉“。如果法律健全的话,甚至要承担法律责任。所以这更多的是“人治”的办法。
当选择的参与方都是目前业界比较权威的公司、机构,且分散于全球各地,那么联合作恶造成的“信誉”损失会很大。只要作恶成本足够高,超过能从中赚取的利益,这个方案也可以很安全。
它对主链功能没有额外要求,这也是它在 Bitcoin 上被使用的重要原因。
spv proof
主链到侧链的转账相对容易:
因为侧链的节点相对较少,他们也都更有意愿运行主链节点。他们可以通过运行主链节点来验证主链到侧链的转账交易。
从侧链转账到主链则比较难:
货币的作用在转账,不能转账的货币是没有价值的。从主链转账到侧链之后,最大的作用也仍然是转账。这也意味着,从主链转到侧链之后,币的所有权基本上都会发生改变。
这些信息都存储在侧链上,大部分主链节点并不运行侧链,不知道侧链上的信息。那该如何向主链节点提供侧链上的信息,并能够得到验证呢?
用户先在侧链上发起向主链转账的交易 side-tx,将其在侧链上销毁。然后在主链上发起交易 main-tx 请求解锁主链上的币,并证明侧链交易 -tx 的发生。
如果侧链用的 PoW 出块算法,可以提供 SPV proof 向主链的节点证明侧链交易 side-tx 的发生,让主链节点可以验证这一点。它和向 SPV 轻节点证明一笔交易是同样的道理,它的内容包括:
- 侧链整条链的区块头,用于证明工作量;
- merkle proof 证明一笔交易的存在最长链的区块内。
由于侧链有可能会分叉,导致交易 side-tx 失效。所以设置一个 contest period,在这个期间,如果侧链交易 side-tx 因为分叉而导致失效。可以提供当前侧链最长链的 SPV proof,证明交易 side-tx 已经失效。
因为只有超过侧链上 51% 以上的算力才能创建一个工作量更大的 SPV proof,所以这个方案非常安全。
它的缺点:
- 它要求主链能够进行前述较为复杂的逻辑,对于 Bytom/Ethereum 这类图灵完备的主链而言没有问题,但对于 Bitcoin Script 而言则无法支持这个功能;
- 为了证明一笔交易,却需要提供整条链的证明,SPV proof 很大,很占用主链宝贵的空间。不过有办法对 SPV proof 进行压缩,compact SPV proof, NIPoPoW, Flyclient 等方法使得不用提供整条链的区块头。