区块链论文9 FlyClient-加密货币的超轻客户端

本文首发于本人的知乎专栏《区块链技术最前沿》 https://zhuanlan.zhihu.com/p/95927454

本文的主要内容来自斯坦福的论文《FlyClient: Super-Light Clients for Cryptocurrencies》2019 10.

论文所解决的问题

这篇论文主要针对本人所讲到的上一篇论文的改进,链接在下面,两篇论文所要解决的问题基本是一致的,都是想让加密货币的客户端更加轻。所以,具体的问题描述就不累赘了。

SweetCandy:区块链论文8,NIPoPoWs,非交互工作量证明之证明​zhuanlan.zhihu.com

在上一篇论文中提到NIPooPoWs有下面几个缺点:

  1. 只适用挖矿的困难度不能改变的区块链。
  2. 最长链的所有矿工都需是诚信的或者贿赂攻击。如果有某一些恶意的矿工他们虽然不私底下在分叉链中挖矿,但是他们把所挖到的v很大的区块扔掉,只广播v很小的区块。这样就会导致最长链区块的v值偏小。这样的话在上面所述计算Bs长度的时候,诚信区块链就没有优势。导致虽然诚信链的区块个数最多,但是Bs长度却不是最长的。致使攻击成立。

本文所提出的方法除了解决上面两个问题之外,还进一步减少了证明者和验证者之间的通信开销。

知识准备

这篇论文用到了下面两个知识,预先了解一下有利于理解这篇论文,这里给出链接,都是本人写的文章。

这个链接中的文章所讲到的方法,本论文用来将证明过程变成非交互式的。

SweetCandy:Fiat–Shamir启发式 非交互式零知识证明​zhuanlan.zhihu.com

使用下面的方法将整个区块链归纳成一棵可以追加和朔源的merkle树。

SweetCandy:Merkle山脉(Merkle Mountain Range)详解​zhuanlan.zhihu.com

NIPooPoWs希望客户端通过判断哪个完整节点的区块链是最长的来验证哪个完整节点是诚信的。而本论文flyclient的思路是通过随机抽样区块头的方式,通过找到无效的区块头,来判断哪个完整节点是恶意的。虽然两篇论文最终索要解决的问题都是让客户端更轻,但是使用到的技术是不一样的,个人觉得,flyclient比NIPooPoWs更优秀。

如何朔源?

所谓的朔源,就是区块链中的任何一个节点都能够通过链式的方式追朔到genesis block。这是一个区块是否有效的最基本要求。flyclient使用Merkle Mountain Range (MMR)来达到快速朔源。比如,区块链有了MMR的构造之后,如下图所示,通过向客户端发送少量的证明数据,客户端自己就能够验证block3和block0是否在同一个区块链中,这里block0是genesis block。

另一个问题是如何让客户端验证出无效的区块?

如果客户端能够从一个完整节点所发来的区块头中发现无效的区块头,那么客户端就能够断定这个完整节点是恶意的。现在假设有两个完整节点,至少一个是诚信的。一个客户端都收到了这两个完整节点发来的证明信息。在比特币的区块链中,虽然在某一刻可能有多个分叉链,但是最长的那个才是大家公认有效的。因为恶意节点的挖矿算力少于其他所有诚信节点的算力之和,所以恶意节点的分叉链肯定比有效链短。但是,为了不让客户端发现这一点,于是恶意节点就往自己的链里面加入无效的区块,使得长度和有效链长度一样,甚至更长。现在客户端无法直接通过区块链的长度来判别哪一个是有效的,于是,他采取抽样区块头的方式,通过验证所抽样的区块头的无效性来判定恶意完整节点。怎么抽样呢?

[block0] <- [block1] <- [block2] <- [block3] <- [block4] <- [block5] <- [block6]

比如上面所示的区块链,左边block0是genesis block。(1)从整个区块链中抽取k个区块头。(2)从1/2区块链的右边部分抽取k个区块头。(3)从区块链右边的1/4的部分中抽取k个区块头。(4)一直重复,直到剩下的链的长度是min(L, k)。其中L是链的分叉部分的长度。抽样结果如下图所示,其中k=5。

按照这样的抽样方式的话,能够发现一个无效区块的概率密度函数为下图的s(x)部分所示。其中x坐标表示距离genesis block的相对距离;y坐标轴表示发现无效区块的概率。这个图呈现指数递增分布,因为从上面的抽样方法中知道,抽样的密度越来越大。

现在我们是通过log(n)次抽样,每次抽取k个,得到的结果,那么我们是否能够计算出一个概率密度函数,且该函数满足上图s(x)的分布。根据这个函数,我们通过多次样本抽取,也能达到前面抽样方法的效果。论文还找到了最优的抽样分布,让发现无效区块头的概率不会受到交叉区块距离genesis block的位置的影响。

不同的挖矿难度

为了让flyclient适用挖矿难度变化的区块链,论文在MMR的节点中保存了额外的信息,比如下图所示的当前区块的挖矿难度值。父节点的值是左右子节点值的和。现在假设要查找0.4位置的区块,那么该区块为下图红色长方形圈住的节点。具体算法为70*0.4=28,然后从所有叶子的左边第一个开始相加,第一个大于28的叶子节点便是目标区块,即13 + 13 + 5 > 28。论文中除了保存挖矿苦难值之外,还保存了其他值。这里不具体将了。

以上便是这篇论文的主要内容。

欢迎大家指出文章中的问题,谢谢!

还可以参考

https://www.youtube.com/watch?v=vuzYwutBqjY​www.youtube.com

 
发布了188 篇原创文章 · 获赞 390 · 访问量 74万+

猜你喜欢

转载自blog.csdn.net/liangyihuai/article/details/103441125