如何为分布式应用提供真正的分布式存储

Genaro的设计目的是为了让数据拥有一个分布式存储的媒介,该媒介能为链上DApp提供数据存储,同时令每一个用户拥有对自身数据的所有权。

通过这篇文章我们可以认识Genaro,也能了解数据的分布式存储这一概念,以及它的实现原理和实现过程。

受访者:吴为龙,Genaro联合创始人

采访&撰文:李画

区块链上的分布式应用保持了真正彻底的分布式吗?还是仅仅是分布式的账本加上各种中心化的解决方案?

目前的状况是后者,尤其在至关重要的数据存储方面。

包括Ethereum和EOS在内,因为受限于链上数据大小,大部分公链能够承载的只是一个分布式账本,DApp运行所需要的大量数据不得不存储在中心化的服务器上。

这让DApp在很大程度上丧失了分布式和分布式能够带来的优势,同时面临着包括DDoS攻击在内的各种威胁。

该如何解决这一问题?该如何设计和实现区块链数据的分布式存储?

我们采访了吴为龙,一个典型的crypto guy。他讲述了自己对这一问题的理解以及Genaro对此的解决方案。

1

数据存储:

基于Kademlia的分布式存储网络

首先我们要解决的是加密数据的分布式存储问题。

为了保证用户对数据的所有权和隐私权,也就是说数据对于非授权用户是不可见、不可用的,在存储数据前,先要对数据进行加密。

Genaro采用了两步走的加密方法:先用对称加密的方法使用密钥对明文数据加密,再用非对称加密的方法加密密钥。这种组合的加密方法可以在实现加密的基础上有效地提高加密效率。

在完成数据加密后,紧接着是做数据切片,也就是把一份文件数据切割成一个个小的数据片段。

这些数据片段将会被存储到分布式系统中不同的存储空间中去。数据的分布式存储的存储颗粒度不是文件,是小的数据片段。

有了需要被存储的数据片段,如何实现这些数据片段的分布式存储?Genaro采用的是实行Kademlia协议的分布式哈希表网络(DHT,Distributed Hash Table)。

哈希表是一种数据结构,存储KV对(Key/Value Pairs,键值对)。它使用hash()函数把key值映射到index上,即hash(KEY) = index,然后把与这个key值对应的value存储到index所标记的存储空间中。当要查找Key值对应的value值时,只需要做一次hash()运算即可。

哈希表的存储空间在同一台机器上,分布式哈希表则把Key值的集合分散到分布式系统中的节点,并且可以有效地将消息转送到拥有所查询Key值的节点,实现数据的分布式存储。

Kademlia是实现分布式哈希表的诸多技术中的一种。

在Kademlia算法里, 每一台加入Kademlia网络的机器都拥有一个160位的NodeID,而每个数据片段的Key值也是一个160位的标识符,每组数据(以KV对的存储形式)都存储在160位键值空间中与自身Key值对应的机器节点上。

在获取数据,也就是从机器节点取回数据时,Kademlia使用了“距离”这一概念来寻址,通过对两个160位标识符的“异或(XOR)”,获得系统二叉树中两者之间的距离。

异或算法建立了一种全新的分布式哈希表拓扑结构,相比其他算法提高了路由查询速度,能够快速从分布式的机器节点中找到需要的数据。

通过上述技术,Genaro实现了加密数据的分布式存储。用户的数据文件被加密、切片、分散存储到不同的机器节点上,并可通过Kademlia被检索、重新组装和使用。

2

网络集成:

以SPoR+PoS为共识的Genaro公链

如何用上述分布式存储网络来存储区块链的DApp数据,并保证数据的一致性和完整性?Genaro采用的方法是使用双层架构,将区块链与分布式存储网络集成。

Genaro I/O流协议(GSIOP)在分布式存储网络和区块链间创建了一个数据通道,数据通过该协议传输,以同构的方式实现同步,从而保证数据在存储网络和区块链上的一致性。

用户在Genaro公链上完成数据初始化,文件数据存储在分布式网络中,区块链上则存储相应的存储记录。

初始化会同时完成数据使用特性,比如对数据调用角色进行划分,有数据的拥有者,也有数据的使用者,数据的每一次改动都能看到拥有者的commit。

假如用户A、B、C和D与数据有关,他们会分别拿到不同权限的密钥对,只有拥有数据更改权限密钥的人,才能在与链上交互,获得确认后再更改数据;而其他使用者虽然可以使用数据,但无法更改数据。在这种限定下,就不会出现多个用户在链下随意更改,导致数据的不可用、不一致。

在使用分布式网络存储数据时,另一个需要解决的问题是数据的完整性。Genaro需要保证当把数据存储到网络中后,被存储的数据是可以被验证存储完整性的,也就是说文件数据是可用的,而不是存储后无法找回的。

为了解决这一问题,Genaro选择了SPoR算法,它基于Kevin D.Bowers和Ari Juels的论文《Proof of Retrievability》,PoR(Proof of Retrievability,可检索证明)是证明目标文件存在且未被损坏的一种方式。

SPoR对PoR进行了改进,通过设立特定的文件指纹(sentinels)来侦测被存储文件数据的可验证性。

在建立阶段,验证节点对文件加密,并把文件指纹植入文件的随机位置;在验证阶段,为了验证存储节点保有文件,验证节点指定文件中含有部分指纹的位置,并要求存储节点返回相应的指纹值;因为存储节点无法区分开指纹和原文件,因此如果它修改了文件的一部分,有很大的概率也会修改掉相应部分的指纹。

在这种情况下,当验证节点验证了足够多的指纹后,就可以确定存储节点是否修改了文件,从而可以保证文件的安全性和完整性。

在Genaro公链,SPoR承担的功能不仅是验证存储的完整性,它也被用作共识的达成,与PoS一起组成Genaro的混合共识机制。

PoS共识有两大问题:无利害关系(Nothing at Stack)和长程攻击(Long-Rang Attack),Genaro混合共识依靠由SPoR提供的辅助信息解决这两个问题。

Genaro公链将指纹校验记录引入区块链共识操作中,校验次数在链上同步,所以在多个分支上,只有主链才会同步到相对值较大的检验记录总数,依靠这部分信息,就可以对错误分支押注的攻击者进行惩罚,解决无利害关系问题。

而同样因为引入指纹校验记录,在相对久的区块分支,即便一开始分支可以演进,当到达验证点之后,就会因为指纹总数少于主链而停止,从而解决长程攻击问题。

在工程实现中,Genaro使用了许多经典的技术和算法——比如PoR,它是整个云存储的开端——再把区块链思维加入其中,一步步迭代出崭新的东西,最终带来结合分布式存储网络的区块链公链,实现了DApp数据的分布式存储。

3

Genaro生态系统

如果说共识机制是操作系统,存储网络就是硬盘,Genaro创建了一个功能齐全的整体,而这个整体是以分布式的形式存在的。

所有的原始数据都是安全加密、分布式存储的,只能通过区块链的数据“岛”到达,而区块链本身只能通过私钥访问,分布式账本与分布式存储结合,实现了真正的分布式DApp。

在Genaro生态系统中,DApp开发者可以基于Genaro公链一站式开发出实现数据分布式存储的DApp。

Genaro也为其他公链提供数据分布式存储这一基础设施的服务。

公链是一条高速公路,Genaro则可以为公路铺设“数据存储”那一层路基。公链项目可以专注于自我优势领域的开发,而通过与Genaro的合作实现DApp数据的分布式存储。

Genaro生态系统还包括数据的拥有者(存储者),他们不仅可以安全、私密、永久地存储自己的数据,而且还拥有对自己数据的所有权,这一点在“数据就是价值”的未来会变得至关重要。

同时,基于Genaro可搜索加密和半同态加密,用户可以在保护数据隐私的情况下分享数据、交易数据,从而实现数据价值,并可利用数据获得收益。

为分布式存储网络贡献硬盘空间的参与者也是Genaro生态的一员,Genaro在对存储付费的同时,通过共识机制的设计给予参与者更多的激励,鼓励他们分享存储空间,促进整个生态系统的发展。

结束语

吴为龙说,所有的区块链技术都不是“火箭技术”,是需要脚踏实地,一步步优化、一步步推进的技术。

这大概也是团队的共识,因为以工程化的逻辑去设计、去实现,保证可用的最大化,正是Genaro的节奏。

在区块链领域有着众多的方向,Genaro所做的,是为DApp提供分布式的数据存储媒介,为区块链的数据生态奠定基础。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190107G1DFBQ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券