在这里,我要Diss一下这篇文章,误导的我好苦。
这篇文章里把 Flyclient 列为一种跨链技术来进行介绍,但事实上,Flyclient 和跨链其实没什么关系。Flyclient 是一项轻节点技术,但它的目的是要让节点更加轻量化,以在移动设备上运行。但 Flyclient 并没有考虑在链上构建轻节点的诸多限制因素,它并不适用于跨链。
Flyclient 作为 2019 年提出的一项针对 PoW 链的轻节点构建技术,Flyclient 可以做到将轻节点压缩到只有一个区块头的大小,轻到飘起来。Flyclient 可以做到只存储最新的区块头即可。是的,你没听错,只需要最新的一个区块头,一,即所有!
这是通过一个被称为 MMR 的创新数据结构 和 一套抽查算法实现的。
MMR 是一种特殊的Merkle 树,由高度降序的若干个二叉子树组成。例如,具有 1,000,000 个叶子的 MMR 树将由 8 个高度完美的子树组成:19、18、17、16、14、9 和 6。MMR数据结构的一个关键特点是可重用性,随着第更多新区块的增加,尽管子树的结构会发生变化,但每个新区块里的MMR根值,可以基于之前的计算结果进行叠加计算。 当新叶子插入时,如果没有相同高度的子树,则只需要将新叶子(或新子树)的根和之前的MMR叠加计算即可,当新叶子插入,有相同高度的子树,则先合并相同高度的子树,再基于合并后的MMR根值序列计算新的MMR根值。
随着链高度增长,MMR根值的推演过程可以参考这篇文章。
好吧,如果你对MMR结构还是云里雾里,那么请记住一点就可以:最新区块头里如果有MMR值,那么该值可以验证所有的历史区块头。还是那句话:一,即所有。一个MMR根值包含了对所有历史区块头的承诺。
只要你有最新区块的MMR根,当你需要验证某笔交易是否存在于链上时,可以先向全节点请求该交易所在区块的区块头,然后用MMR根验证该区块头,区块头被验证后,便可用于对交易执行SPV验证。
Flyclient 不存储历史区块头,带来一个难题,那就是对最新的区块头的最终性验证变的复杂了。BTC链是设计非常精巧的区块链,每个区块头都包含了前一个区块头的哈希值,同时每一个区块的难度值和计算时间决定了下一个区块的难度值(Bits字段),整条链的所有历史区块是环环相扣、高度耦合在一起的。
对于存储完整区块头历史的 SPV 轻节点,可以靠等待更多有效区块的追加来确认当前区块的最终性。但对于 Flyclient 轻节点,则没有办法这么判断。因为缺乏前一个区块的计算时间和难度值,我们没法判断新区块的难度值是否合法。如果仅仅靠最长链原则来判断,恶意的全节点完全有可能在 Flyclient 轻节点看不见的腰部虚构几个无效的区块,使得它的尾巴看起来更长,以此来欺骗 Flyclient 轻节点。
或者我们也可以换个方式理解,BTC的最长链原则其实是表象,其本质是“最重链”原则,BTC遵循的其实是包含了最多 PoW 计算的链,只是由于难度值无法作假,多数时候最长链即最重链。如果只是给你一个6个合法区块的尾巴,或许他们看起来最长,但你无法判断它们是否在最重链上。
Flyclient 为了应对这个问题,提出了一套抽查算法,轻节点需要在收到新区块之后,对提供新区块的全节点进行“质询”,要求提供更多的特定区块,并进行有效性验证。Flyclient论证了:在Flyclient轻节点至少连接了1个诚实的全节点的情况下,在有限轮次的抽查后,可以让无效区块被发现的概率接近无穷大。
抽查算法的细节可以查看原论文,;论文啃不动的话,也可以阅读这篇文章。这篇文章对抽查算法阐述的非常清楚。
Flyclient 当中,MMR结构为轻节点的构建提供了巨大的便利,Flyclient轻节点可以只保留的包含MMR根的最新区块头即可,在此之前的区块头历史可以随时修剪掉,保持轻节点只有一个区块头的大小。不过在实践中,Flyclient轻节点会选择保留若干个关键历史区块头(一般会保留log(n)个区块头),提高抽查算法的效率。
作为一种高效的承诺机制,MMR结构给公链带来深远影响。不少公链将MMR根值采纳为区块头中的固定字段,以此来支持轻节点随时删除历史区块头,保持轻量化。
抽查算法则实现了在不了解区块头历史的条件下,任意给定一个区块头,验证其最终性的方法。
尽管 Flyclient 将轻节点的体积压缩到只有一个区块头的大小,但对于跨链桥当中的轻客户端构建,却并不适用。
其一,抽查算法的复杂性,对于本地CPU而言没有问题,但对于计算资源更加稀缺的链上,则会带来巨大的成本。
第二,链上的轻客户端更关心的是,如何同步更少的区块头(最好可以跳跃式同步区块头,甚至是按需同步区块头)以及降低链上验证区块头的成本。修剪旧的区块头虽然可以让轻客户端保持轻盈,节约存储空间,但不断同步和验证最新区块头才是 Gas 开销的大头。
因此我们看到的链上 PoW 轻客户端(BTC、以太坊为主),依旧是逐个同步所有历史区块头的 SPV 轻节点,没有看到 Flyclient 在跨链桥中的应用。