在解决数据可用性挑战上,V神做了什么

原创
2202 天前
1726

V神在「V神做客王峰十问」讲述从以太坊未来的 Casper和 Sharding技术,讲到行业落地场景,再到编程语言演进,整个采访的信息密度极大,贡献了很多精彩内容。而对于整个区块链行业面临的共性问题,给出了初步探索性的答案。

其中,我们比较感兴趣的一段内容,是V神对于区块链数据可用性挑战的看法和答案,其原文如下:


Fred

We are familiar with the early POW andPOS mechanisms; but could you please kindly explain the working principle of the Casper mechanism in a simple way once again?


Vitalik

The challenge is, that it is not enough to just verify that the blockchain is valid, one must also verify that all of the data in the blockchain is available in the p2p network, and anyone can download any piece of the data if they want to. Otherwise, even if the blockchain is valid, publishing blocks that are unavailable can still be used as an attack that prevents other users from taking money out of their accounts, by denying them the ability to update their cryptographic witnesses.

We have solutions, though they are somewhat complex; they essentially involve encoding the data redundantly and allowing users to randomly sample to check that most of it is online; if you can verify that most of it is online, you can use the redundancy to recover the rest of the data.

Randomly distributed throughout the p2p network. The basic idea behind the current Casper implementation is that users can send 32 ETH into a smart contract, and then once they are included in the blockchain they are added to the current validator set. Every block is created by a random member of the current validator set, and every 100 blocks the entire validator set needs to send a message "finalizing?imageView2/3/w/750/h/1/q/100|imageslim">

In Ethereum's case, there is this requirement that the blockchain must ensure that absolutely 100% of the data is valid and available; in Filecoin's case it's ok if one or two files drop off.


而对应的翻译大概是这个意思:


V神

现在的挑战是,仅仅验证区块链是否有效是不够的,还必须验证在P2P网络中,所有区块链中的数据是否可用,并且要让所有人都可以可以下载任何数据片段(如果他们想要的话) 。否则,即使区块链有效,发布一些不可用的区块,仍然被用于攻击,阻止其他用户从他们的账户中取钱,因为他们有拒绝更新加密见证人的能力。

我们有解决方案,虽然它们有些复杂,这些方案主要涉及编码冗余数据和允许用户随机抽样以检查大部分数据是否在线, 如果可以验证大部分是联机的,你可以使用冗余来恢复其余的数据。

在整个P2P网络内,余编码数据都是随机分布的。当前Casper实现背后的基本思想是,用户可以将32个ETH发送到智能合约中,一旦它们包含在区块链中,就会被添加到当前的验证器聚集合中。每个区块都由当前验证器集合的随机成员创建,并且验证器每设置100个区块,就需要发送一条信息,这样才能确保一些检查点「完成」工作。 

在以太坊的情况下,区块链必须确保数据是100%有效且可用的;而在Filecoin的情况下,如果有一个或两个文件丢失是可以的。


能够感觉到,有不少看完整个访谈的人对于以上这段话具体描述的场景上下文并不是很清楚,读起来晕晕的。为什么王峰让V神介绍Casper,V神会主要讲数据可用性挑战和解决方案呢?这中间的逻辑关联到底是什么?要想明白这一点,还要从比特币的账本结构说起。

我们说区块链技术的本质,就是通过分布式节点的验证和共识机制,来解决去中心化系统节点间信任建立的问题,实现了去中心化、分布式的信任建立机制。这个验证和共识的过程,对于目前来说,主要是针对两个方面,分别是计算和存储。当然,我们看到的是对于存储数据进行计算之后的结果,但是从逻辑上来说,存储和计算两个事情是可以分开进行验证和共识的。

比特币的账本结构如上图所示,大家都知道的一个基础知识是,对于比特币的一个全节点来说,必然保存有全部的区块记录。对于任意一个节点来说,都可以通过验证自己下载的区块的Merkle Tree来确认自己是否得到了正确的记录。这个过程,可以简单的理解为是两个文件的Merkle Tree进行对比的过程:


所以说,在区块链这种非常特殊的每个全节点数据都完全一样的数据存储方式下,我们只需要简单的验证Merkle Tree,就可以同时得到数据的有效性和数据的一致性,因为所有节点的数据都是一样的,因此少数节点不在线,并不会导致数据的不可用问题。

 

但是我们也知道,因为这种设计思路,导致区块链也有很大的局限性,因此一个新的技术方案Sharding被提了出来,所谓的Sharding,就是分片技术,这是常规的数据库领域的一个技术,如今被用到了区块链领域。

 

我们今天暂且不讲Sharding技术的优劣,只讲一个特殊的问题,就是在Sharding以后,会引入的一个新的问题,就是数据的可用性问题。因为在Sharding的场景下,并不是像以前一样,所以的节点都有一样的数据,而是不同的数据,按照分片规则去存储数据,同一个分片内数据是一样的,但是不同分片之间,数据是不同的。所以,我们今天看到,如果要实现Sharding,那么,智能合约很大意义上和Sharding是不兼容的。因为智能合约要求看到一样的数据。

 

我们可以想一下,在一个P2P网络中,以前的区块链网络连接到身边的节点,总是可以用Merkle Tree去进行数据有效性的验证。 但是现在,在Sharding的情况下,我们连接到的拥有正确数据的Node可能正好因为某些原因离线了,而我们自己这里又没有正确的数据,那就会导致比较大的问题。这也是开头的时候V神将到数据可恢复性证明的原因,有必要的同学可以重新看一下V神的描述。

 

那么,其实从比特币网络全节点账本到Sharding,有点类似于存储领域,从Sia发展到IPFS的过程,这里技术演进的路线是挺类似的。Sia是早期的一个存储项目,提供了一个类似于电子网盘的服务,Sia的货币叫做SC。这个项目和多数人想的不同,本身其实是一个类似比特币的项目,采用POW的挖矿机制,就是计算哈希。Sia的哈希算法叫做Blake2b,稍微不同于比特币。所以,那些所谓的硬盘IPFS矿机是挖不了Sia的。



Sia其实本质上就是一个比特币 Like,只是用到了一个比特币的特殊参数,叫做 Timelock,也就是说,将一个事实到账的交易进行了延迟,在延迟时间内,设置了一个条件参数,并且用脚本完成了一个所谓的文件合约,这个合约其实是文件的存储端要定期向客户端提交某个 Merkle Tree的特定片段的数值,双方通过验证 Merkle Tree来进行存储数据的持有性证明。


而 Storj项目的实现,以及存储证明本质上和 Sia是类似的。都是依赖于 Client自己进行数据的持有性验证。对于这两个项目,我个人觉得,Sia是一个「灵光一闪」的发现,而 Storj则是一个「工程化」的跟随。Sia团队当时这种实现存在很多的问题,但他们想办法美化了一些概念,并依然实现了这个项目。Sia存在的问题包括机密性、完整性、可用性、隐私性四个方面。

 

虽然Sia声称实现了公开验证,但是由于链上只存有 Merkle Tree的 Root Hash,这基本上是一个掩耳盗铃的方式。Merkle Tree的 Root Hash只能保证数据的不被篡改,不能保证数据的持有和可用。完整性验证的算法实现依赖于服务端和客户端进行块数据和 Merkle Tree叶子节点的通讯校验,验证的通讯代价比较高。Sia的挖矿工作是 POW的,也就是说矿工只是简单的计算哈希值,从业务逻辑上来说,POW计算哈希值和存储是没有任何关系的,存储节点进行存储是没有出块奖励的,矿工浪费大量算力计算哈希值对于提高存储的安全性没有任何帮助。Sia的可用性需要客户自己对文件进行冗余编码处理。Sia对于隐私性和机密性完全没有处理。

 

Sia是把分布式验证及共识和存储系统进行结合的第一个项目,这就是 Sia的全部意义。Sia明白无误的告诉我们,分布式存储是可以实现的,虽然有很多问题需要进一步解决。

那么后面时间发展到 IPFS和 Filecoin,IPFS是一个很不错的项目,IPFS可以简单概括为使用 DHT寻址利用BT传输 DAG Object(Blob、List、Tree、Commit)。IPFS是把已有技术的一个比较好的融合,但 IPFS并没有解决数据完整性的问题,数据完整性逻辑上应该是 Filecoin来解决的,但 Filecoin则存在比较大的问题。很多人误以为说,IPFS对数据进行哈希之后,是可以保证数据的不可篡改的,这是一个错误的认识。没有数字货币激励的单纯存储系统,是不可能解决数据的持有性问题的(非学术意义上)。但从另外一个角度看,Filecoin论文中声称的实现数据的持有性证明的过程从逻辑上是讲不通的。这不是一个技术问题,这是一个逻辑问题。

从逻辑上来讲,数据的持有性证明是一种由两个角色和四个步骤完成的游戏。第一个角色是Challenger,第二个角色是完成Proof的人,Challenger的第一步把文件和一些谜题生成之后,放到 Server上;第二步生成某个 Challenger的信息,需要的某些数据;第三步存储节点完成了某个Proof,发回给 Challenger;第四步就是 Challenger用自己原来遗留的一些信息,生成一个 Verify,用Verify跟 Proof去验证这东西是不是对的;这就是用两个角色、四个步骤完成验证。



Filecoin很奇怪的把四个步骤变成了三个,省去了生成 Chal的步骤。因为Filecoin白皮书的作者清楚的知道他的系统中没有任何角色可以在逻辑上担任生成Chal的任务。所以从一开始,Filecoin以及他的POST就是一个不可能的任务。Filecoin系统中,Chal的角色不可能是 Client,同时又不可能是Chain Node,因为当时只有POW一种共识算法,Chain Node的所有计算能力只能用来计算哈希值。 

回想一下,比特币是两个对等账本,比特币的场景是任意两个机器的比特币账本一定是一样的,他们只需要简单的去构造一个Merkle Tree,就可以实现两个节点的验证。其实像 Sia和 Storj也是一样的,网盘本机有文件,云端也有文件,在双方都有原文件的情况下,我们可以比较容易的构建出一个证明。但如果是 IPFS、Lambda以及V神讲的Sharding,一方有数据、一方没有数据怎么样去完成这个证明?这是更加普遍的问题,我们在没有原文件的情况下,怎么样在非可信存储上面完成数据的完整性证明,这其实是计算机的学术问题,正好我们也知道这个领域在学术上是有解的。

从2007年以来,有两个算法被提出来,一个叫做数据的持久性证明(POR,Proofs of Retrievability),一个叫数据的完整性证明(PDP,Provable Data Possession)。V神讲的数据可恢复性证明其实就是学术界所说的POR。原理很简单,就是先对数据做一个(t,n)门限的秘密共享的切分,所谓的tn门限就是你把秘密分享给n个人,只需要有t个人还持有这个数据,数据就可以恢复回来,这就是tn门限的秘密共享,我们通过秘密共享就可以实现数据的恢复。因为tn门限的秘密共享是一种加密机制,所以在这个秘密里插入一些暗哨,通过Challenger请求暗哨的信息,就能知道这个数据还在不在。所以它一方面实现了可恢复性,另外一方面是实现持有性的检验,这是POR。

PDP不需要去实现可恢复性,它需要做的事情很简单,只要能看数据还在就可以。这个方案是通过标签的方式,对文件切分之后,每一块有一个标签,把这个标签放到服务端,标签和标签之间可以进行数学运算,在 Challenger上请求数据的时候,去请求标签的一些运算,服务端对标签和原文做运算之后,把数学结果反馈给返回给 Challenger做一个核对就可以了。

而最大的问题在哪里?谁来做 Challenger是 IPFS没有想清楚的问题,因为在这个场景下,Client没法做 Challenger,因为它不持有数据,所以当时Blockchain的 Node也没法做 Challenger,因为Note本身是一个低速的链,唯一的共识算法是POW。所以 IPFS就陷入了一个困境。「自己证明自己,自己做验证」,它本身是很难形成共识的过程。 

我相信,随着Blockchain不断的发展,PDP、POR都发展成所谓的第三方可信的验证者角色。既然第三方可信的验证在学术上是可以的,我们就能通过链的共识,代替一个所谓的可信第三方,通过链的共识、半可信节点的共识去代替第三方去验证,并且把结果上链,而且解决所谓原来可信第三方没法解决数据不会篡改的问题,这个机制大概就是这样的。


写在后面


其实,IPFS面临的挑战是,当其作为一个 Storage的时候,它是类似于 AWS 的 S3,此时 Client上不可能持有原始数据进行验证,因此,Filecoin不能使用和 Sia以及 Storj一样的数据完整性验证方式。Filecoin最大的问题是 POST的这个证明是无法实现的。其实本质上等价于 Sharding情况下对于数据的可用性的证明。 

在本次谈话中,V神其实讲了他对于这个问题的大致思路,其本质和 Lambda的思路是类似的,只是V神要解决的是账本数据的可恢复性问题,我们是要解决数据的可恢复性加持有性问题。也就是说,V神的这个方案其实类似于计算机科学领域的 POR,但是值得一提的是,V神并没有提及数据的完整性证明(PDP),从这个角度上看,Lambda更领先一步。

其实V神的 POR算法,并不是V神自己想出来的,而是这个领域本来就有研究进展,只是当今的研究进展刚好适合于用区块链的技术来实现,就是 Casper共识算法的由来。而 Lambda的思路是,在非Blockchain情况下,在另外一种和POR不一样验证算法中,可以构造一个 PDP算法,假设一个可信第三方,通过一定的概率,对于数据的持有性进行验证,并且把验证结果以显式不可篡改的方式来存储。那么这个可信的第三方的审计,也就是所谓的 TPA,一定可以把验证结果通过上链来实现不可篡改,并且一个单点可信的验证过程,也一定可以通过一组半可信 Validator节点共识来完成。

所以大家看V神的回答,有几个关键的名词,就是 Validator、Random、Sampling等等,而且通过这种方法,可以做到对于数据持有性和可恢复性的证明。只不过账本的要求是可恢复,文件不一定要求可恢复。总的来说,V神仅在POR层面进行了论述,而Lambda则是在POR和PDP两个维度都进行了深度的思考,不仅仅更全面,甚至在时间上比V神想的还要更早一些。