[color=rgba(0, 0, 0, 0.88)]
[color=rgba(0, 0, 0, 0.88)]本文源于京东金融区块链实验室技术专家李冠男分享的《基于Fabric的存储扩展实践》的主题演讲,他表示传统的中心化“云存储”存在很多问题,运用“分布式存储网络IPFS+区块链” 或许可以解决区块链天然不易存储大文件的问题。在实践的过程中,他提出了三个设计方案,希望能给大家一点启发。
[color=rgba(0, 0, 0, 0.88)]以下是李冠男的分享,由巴比特整理。
[color=rgba(0, 0, 0, 0.88)]大家都知道,区块链的故事开始于2008年中本聪发表《一种点对点的电子现金系统》,之后比特币横空出世。后来又出现了以太坊,随着市场热度的高涨,人们发现了区块链技术本身的应用价值,各种项目层出不穷,但是这其中的很多场景需要区块链具备文件存储能力。 [color=rgba(0, 0, 0, 0.88)]一般来讲,大家的第一反应是,我能不能把数据都存储在链上?但是现有的主流区块链,比特币就不用说了,以太坊上面存数据是非常昂贵的,按照Gas数据是5Gwei计算,存储1MB数据需要花费3.76ETH。Hyperledger Fabric因为是联盟链,把数据硬要存在上面也是可以的,但现在有个写死的限制,默认数据小于99M,如果大于的话,需要重新编译它的代码。 [color=rgba(0, 0, 0, 0.88)]所以可以看到,数据全部上链并不明智,也没有必要像存储交易数据一样,让千百兆的数据文件存储在每一个节点上。所以通常的做法是: 将文件存储在链外,在链上存储文件的hash ,这样文件其实依然是中心化存储,比如传统的“云存储“。
当前多采用的中心化“云存储”[color=rgba(0, 0, 0, 0.88)]
[color=rgba(0, 0, 0, 0.88)]什么是“云存储”? [color=rgba(0, 0, 0, 0.88)]传统云存储是让用户上传自己的数据到云端,用户上传完毕后,由服务提供商将数据保存在他们的数据中心。这样用户无论何时何地想要访问这些信息的时候,只需要向数据中心发送一条请求,数据中心将数据发给用户。 [color=rgba(0, 0, 0, 0.88)]中心化的“云存储”存在以下问题: [color=rgba(0, 0, 0, 0.88)]典型的问题是数据中心都是大型服务器,它需要温控,并且严格维护,成本高昂,而且会有延迟,因为通常数据中心与用户不会距离很近。有人说,可以使用CDN,但问题是它的隐私策略是由服务提供商设计的,他们依然有办法访问和分享用户的个人数据,毕竟是不透明的。而且除了作恶的可能,只要有人工牵扯进去,就很可能会有意外的错误。比如员工误删数据库的事件并不罕见,GitLab事件让人记忆犹新... [color=rgba(0, 0, 0, 0.88)]采用“分布式存储网络”优点众多 [color=rgba(0, 0, 0, 0.88)]所以我们需要采用分布式存储网络。这个技术并不新鲜,它有很多优点,存储的文件大小不受限制,可以无限扩展存储容量,而且成本低,不受地域限制,还是去中心化的,如果应用特点的技术,也可以保证它的内容不被篡改。 [color=rgba(0, 0, 0, 0.88)]如果将“分布式存储网络”和“区块链”技术结合起来,是不是就可以解决区块链天然不易存储大文件的这种问题? [color=rgba(0, 0, 0, 0.88)]我选用的就是IPFS技术,中文叫做星际文件系统。
分布式存储IPFS——What?How?[color=rgba(0, 0, 0, 0.88)]
[color=rgba(0, 0, 0, 0.88)]IPFS是什么? [color=rgba(0, 0, 0, 0.88)] IPFS是分布式存储网络;  IPFS是一个点对点的超媒体协议,目的是让现有的网络更快、更安全、更开放;  IPFS有一个很疯狂的目标:致力于替代HTTP协议,为所有人建造一 个更好的网络 ; [color=rgba(0, 0, 0, 0.88)]那么它有什么特点呢? [color=rgba(0, 0, 0, 0.88)]首先,存储在IPFS上的文件,是被打散存储的。就是说每个文件以及所有的文件块都有独一无二的指纹,这个指纹就是一个加密哈希值。其次,IPFS网络可以自动去除重复文件,也可以跟踪每个文件的版本历史 。而且每个网络节点只需要存储自己感兴趣的内容以及一些索引信息,这些索引信息的作用就是用来找到谁存储了什么 。当查找文件的时候,你可以使用Hash询问IPFS网络哪些节点存储了什么内容。最后,每个文件可以通过去中心化的命名系统IPNS获得对人友好的名字 而不是一串看花眼的hash。 [color=rgba(0, 0, 0, 0.88)]IPFS技术栈分为这么几层: [color=rgba(0, 0, 0, 0.88)]最底层当然是网络、然后是路由、交换层、特定的结构层、Merkledag、命名系统,最上面是应用。IPFS和区块链一样,是技术集大成者,它借鉴了很多相关的技术。最下面三层的作用是转移数据,往上的两层是定义数据,最上面当然就是使用数据了。 [color=rgba(0, 0, 0, 0.88)]在介绍完基础工具后,正式讲解我的尝试。
基于Fabric的存储扩展实践[color=rgba(0, 0, 0, 0.88)]
[color=rgba(0, 0, 0, 0.88)]首先,我明确了三个目标: [color=rgba(0, 0, 0, 0.88)]1.我希望Fabric能够暴露出 一组接口,使得外部可以通过Fabric使用IPFS; [color=rgba(0, 0, 0, 0.88)]2.我希望接下来Chaincode可以在有需要时也可以直接使用IPFS这个功能; [color=rgba(0, 0, 0, 0.88)]3.我希望这个过程中尽量少的修改现有Fabric代码。换句话说,我希望这是一种系统的能力,而不是一种特定的应用层手段。 [color=rgba(0, 0, 0, 0.88)]目标摆在这儿了,最直接的方式是以现有的go-sdk作为粘合剂,将Fabric和IPFS联合起来。 [color=rgba(0, 0, 0, 0.88)]最开始的想法是:对go-sdk进行二次开发,把与IPFS交互的逻辑封装其中,实际上在使用过程中,由sdk先请求 IPFS得到返回,再将返回结果作为交易内容写入Fabric ,和大部分现在的用法是一样的。 [color=rgba(0, 0, 0, 0.88)]另外IPFS有的几个特点需要注意:一是它有自己的垃圾回收机制,当你写入某个节点的数据,只有经过称为“pin”的操作才能保证不被回收掉。二是不同节点之间不会自动备份同步数据,除非主动发起请求 。
|