区块链论文8,NIPoPoWs,非交互工作量证明之证明

本文首发于 https://zhuanlan.zhihu.com/p/93463586

本文主要内容来自论文《Non-Interactive Proofs of Proof-of-Work》

本文章不是论文的 直接翻译。本人通过阅读和理解上面论文原文,结合参考其它资料,提取出论文的主体内容,用自己的语言,希望以通俗易懂的方式跟读者分享和交流区块链技术。
了解更多区块链前沿技术,请关注本知乎专栏。

读懂这篇42页论文有一点难度,论文给出了很多符号化的定义和算法,还有证明,如果不能潜下心来慢慢看的话,估计是很难看懂的。但是,这篇博文不是生搬硬照这些公式和算法,本人希望站在更高一层,以问题为导向,侧重于直观上的理解和分析。跟大家分析。

本文将通过下面几点为大家讲解NIPoPoWs。

  • NIPoPoWs是什么?它跟PoW的关系是什么?
  • 有什么用?可以解决哪些问题?
  • 具体构造过程和算法是什么?

工作量证明PoW和NIPoPoWs

目前最大的区块链应用比特币使用工作证明来作为其共识算法。每一个矿工都需要不断地改变一个随机值来计算hash值H,如果H小于某一个目标值target,这个矿工就算是挖矿成功。但是,有时候矿工计算出来的H值可能小于目标值两倍(target/2)、四倍(target/4)、八倍(target/8),甚至更多。现在的区块链没有使用到这个信息,所有区块的H值统一对待。而NIPoPoWs便是利用了这个信息来构建工作量证明之证明。从概率上讲,在整个基于PoW算法的区块链中的区块个数如果是n,那么有n/2个区块的满足 H<(target/2),有n/4个区块满足H<(target/4),依此类推。所以就会出现类似下面两个图所示的区块链。这两个图虽然不是完全对应相同的,但是它们表达的是相同的意思。第二个图是为了方便表示,把 [公式] 中的0, [公式] 中的1, [公式] 中的2表示出来了,而且画成了跳表的形式,这个只是为了方便表示,其实第二个图还是一个单链,它的真正的数据结构是下面第一张图所示的样子,这个需要注意。 如果一个区块的哈希值[公式] ,那么我们说该区块在第v层。第一层v=0,第二层v=1,第三层v=2 ...,v值越大,说明哈希值越小于挖矿目标值,区块链中这样的区块就越少,从概率上讲。利用这个信息,我们就可以建立形如下面二个图中的跳表了。这里,我们就把这篇论文的数据结构讲完了。下面讲论文所解决的问题和方案。

来自论文Proofs of Proofs of Work with Sublinear Complexity

这篇论文所要解决的问题是什么呢?我们先从区块两的证明和验证模型讲起。

构造interlink

上图所示的数据结构在论文中交interlink,以第一张图来讲,除了第一个block,所有的block都有一个长度为V(大写)的数组,V的大小是从genesis block到当前block最大层数v+1(小写)。V中存储的内容是其指向前面的某一些block的地址。所有的块都需要指向genesis block。V中存储的是哪些区块的地址呢?这里举例子说明,在图片中,第二个区块只指向第一个区块,此时v=0,V=[1], 直到第3个区块都是如此,因为它们的v值都是0。第四个区块的v值为1,区块5的v=0,但是区块5前面的区块4的v=1,所以需要指向区块1和区块4,此时最大的v=1,所以V的长度为2,V=[1, 4],依此类推,到第8个区块,因为它前面的区块7的v=2,所以V的长度为3,V=[1, 7, 7],为什么有两个7呢?可以理解为如果你是站在区块8的位置,有一个人他高度v=2站在你前面区块7的位置,因为那个人比较高,他把他前面的所有比他矮的人都遮挡了,所以,在你眼中,你只看到7这个人。到了区块10,因为区块9高度v=1,但是比区块7的高度v=2矮,所以,对于区块10而言,区块9值能遮挡住前面部分的区块,不能遮挡住区块7,所以在区块10中,V=[1, 9, 7]。这里是形象的理解,具体的定义和构造算法可以看论文。

从interlink的构造过程,我们看得出哪些信息呢?

一个block指向了所有比他高的block和genesis block。如果把一个block看作是一个面向genesis block的人,那么他能够看到所有没被遮挡的block,所谓的“看到”,即有指向该区块的链接。

问题描述

  • 证明人和验证人模型

为了响应客户端的查询,区块链中的完整节点构造证明信息,客户端作为验证人连接多个完整节点,一一验证完整节点的证明信息,只要有一个完整节点是诚信的,客户端就能够得到自己所查找的信息。客户端一般的查询谓语为:交易t是否已经提交到区块链中了?

  • SPV

在比特币的白皮书中提出了比特币的客户端的简单交易验证,解决的问题是轻客户端无法下载所有的区块链数据,需要依赖完整节点完成交易查询和验证的问题。

在SPV中,轻客户端需要下载所有的区块链的header,以及相应交易的merkle树的节点数据,比如如果要证明交易Tx3已经提交到区块链中,完整节点除了要向客户端发送所有的header之外,还要发送Hash01,Hash2和Tx3,目的是让轻客户端自己也能够验证Tx3确实属于该区块链。

SPV存在什么问题呢?

客户端需要下载所有的headers。而以太坊所有header的大小是三四个GB,这会给用户带来一定的存储负担和网络负担。所以,我们的想法是,是否可以不用下载所有的区块头文件就能让轻客户端验证这些数据都是有效的(来自于当前区块链最长链,后面统一用“有效的”来表示该意思)?那么如何只通过部分区块头数据就能够让客户端证明它们都是来自当前区块链最长的链呢?

问题解决:如何只通过部分区块头数据就能够让客户端证明这些区块头都是来自当前区块链最长的链呢?

思路1。从上面的interlink中最右边即最新的区块开始,以跳表的形式选择尽可能少的区块头,直到genesis block。将这些区块头文件发给客户端。客户端可以自己确认这些区块头是不是链接在一起,并且最后一个区块头是genesis block。

这样的作法能够说明这些区块头都是有效的吗?不能!因为如果一个恶意的矿工从区块链的某一个区块开始挖矿,独自生成一个无效的区块链分叉,这个分叉也同样能够连在一起,最终到达genesis block。如下图所示,红色的区块是恶意矿工私自挖出来的无效分叉,因为他的算力少于所有诚信矿工的算力之和,所以,他的分叉链的长度肯定比上面的诚信的链短。在比特币的区块链中,在某一时刻可能存在多个分叉,但是被大众接收的只有最长的那个,交易在最长链中才是有效的。根据上面所述的证明人验证人模型,我们的假设是只要多个证明人中有一个是诚信的,那么验证人就能够判别出哪一个是诚信的,并能够成功验证。现在作为验证人的轻客户端接收到了多个证明人都发来的部分区块头数据和其它一些证明信息,需要客户端判别出哪个才是诚信的,也即是哪一个证明人的区块链是最长链?

客户端收到多个完整节点根据interlink跳表规则选择的数据之后(这里假设只有两个完整节点,一个诚信一个恶意),首先客户端分别查看每一个完整节点的数据是否能够链接在一起并且最后一个是genesis block。然后,两两对比查找这些链的最低公共祖先b,如上图所示。那么从genesis block到b的区块链都是有效的,而且是相同的(这一点不难理解)。接下来只要比较从b到最新的区块链的节点(这期间的区块记为Bs)的长度即可。但是,客户端并没有拿到Bs的所有区块头,只拿到了Bs中的一部分。所以,我们不能直接以区块个数作为长度来比较。而且,这里可能存在的一个攻击是,Bs是恶意矿工私底下挖出来的,虽然Bs的长度没有有效链的对应部分长,但是,里面的每一个区块的v值可能都比较大。针对这个长度比较的问题,论文的做法是什么?完整节点需要怎么样子构造证明或者说需要发给客户端哪些信息才能让客户端判别出哪个链是最长的呢?

这便是完整节点构造证明的过程。下面图片把算法也一起给出了,估计你们也不看算法这部分,也没关系,就看下图的上面部分来理解吧。假设下图的区块链的所有区块头,genesis block在左边,设置超参数m为3,(1) 先从上面最上层开始(v=2),找到这一层最右边的3个区块(最上面红线),放到数组Arr中。(2)然后往下移一层(v=1),找到这一层最右边的三个区块,放到数组Arr中。前面一步已经选择的区块不重复选择。(3)依此类推。如果某一层的区块的个数不够m个,那么就跳过这一层。这样的话,就得到了下图算法中的 [公式] 了,然后,再复制区块链最新的k个区块跟[公式]拼接在一起,构成 [公式] (在比特币中k=6)。这便是完整节点的证明了。客户端拿到这个证明之后,就可以自个验证该链是不是最长链了。

客户端拿到每一个完整节点的[公式]之后,怎么自个验证哪个是最长的呢?(1)查看每一个[公式]是否都能链在一起并且到达genesis block。(2)查看 [公式] 的长度是否为k(3)找到最低公共祖先区块b,得到所有 [公式] 中Bs的区块(4)对Bs中的所有区块分别计算出权重,权重计算公式为 [公式] ,其中 [公式] 就是本文中的层数v了。对权重求和,就得到了该Bs的长度值了。比较不同完整节点的Bs长度,取最长那个作为有效的。本人第4步的算法跟论文有一点出入,不过本质相同。

到目前为止,解决了哪条链最长的判断问题。而我们的最终的目的是能够让客户端验证某一个交易是否已经在有效的区块链中了。所以,完整节点还需要发送给客户端关于某一个交易的数据,同时能够让客户端自个验证这个交易确实属于该区块链。怎么做呢?

假设上图右边的4这个区块已经包含在[公式]中,我们只需要额外创建一个链表,让链表最终包含交易数据所在的区块(目标区块),然后再把这个链表和目标区块的merkle 树的证明发给客户端。客户端就能够验证这个交易确实是属于该区块链的。

这便是算法的直观理解。

存在的问题

  1. 只适用挖矿的困难度不能改变的区块链。
  2. 最长链的所有矿工都需是诚信的。如果有某一些恶意的矿工他们虽然不私底下在分叉链中挖矿,但是他们把所挖到的v很大的区块扔掉,只广播v很小的区块。这样就会导致最长链区块的v值偏小。这样的话在上面所述计算Bs长度的时候,诚信区块链就没有优势。导致虽然诚信链的区块个数最多,但是Bs长度却不是最长的。致使攻击成立。
  3. 针对上面第2点,跟贿赂攻击基本是同一个意思。意思是某个很有钱的恶人贿赂很多矿工,说不广播v值很大的新区块,并得到双倍base coin的报酬。这样子的话就导致第2点的问题了。

其它相关的论文

斯坦福的Flyclient, 下面这几天跟大家分享,请关注一些本专栏。

这个链接包含了很多关于NiPoPoWs的资料,包含一些帮忙理解本论文的视频,可以学习一些,不确定是否需要梯-子。自备一下吧。

Non-Interactive Proofs of Proof-of-Work​nipopows.com

都看到这里了,点个赞呗

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

猜你喜欢

转载自blog.csdn.net/liangyihuai/article/details/103428662
今日推荐