点击查看第二章
IPFS原理与实践
董天一 戴嘉乐 黄禹铭 著
第1章
认识IPFS
欢迎大家来到第1章。在这一章里,我们首先将从宏观上介绍IPFS。在了解技术细节之前,我们先来回答如下问题:什么是IPFS?为什么我们需要IPFS?它与常规的区块链系统相比有什么异同?IPFS和Filecoin会给现在的区块链技术带来什么样的改变?相信读者读完这一章后,会对上述几个问题有自己的理解。
1.1 IPFS概述
早在2017年上半年,国内大部分投资人或开发者就已经接触到了IPFS和Filecoin项目。那么IPFS和Filecoin究竟是什么?IPFS与区块链到底是什么关系?其有什么优势,竟然会得到如此广泛的关注?其未来的应用前景到底如何?本节我们就来解答这几个问题。
1.1.1 IPFS的概念和定义
IPFS(InterPlanetary File System)是一个基于内容寻址的、分布式的、新型超媒体传输协议。IPFS支持创建完全分布式的应用。它旨在使网络更快、更安全、更开放。IPFS是一个分布式文件系统,它的目标是将所有计算设备连接到同一个文件系统,从而成为一个全球统一的存储系统。某种意义上讲,这与Web最初的目标非常相似,但是它是利用BitTorrent协议进行Git数据对象的交换来达到这一个目的的。IPFS正在成为现在互联网的一个子系统。IPFS有一个更加宏伟而疯狂的目标:补充和完善现有的互联网,甚至最终取代它,从而成为新一代的互联网。这听起来有些不可思议,甚至有些疯狂,但的确是IPFS正在做的事情。图1-1所示为IPFS的官方介绍。
IPFS项目通过整合已有的技术(BitTorrent、DHT、Git和SFS),创建一种点对点超媒体协议,试图打造一个更加快速、安全、开放的下一代互联网,实现互联网中永久可用、数据可以永久保存的全球文件存储系统。同时,该协议有内容寻址、版本化特性,尝试补充甚至最终取代伴随了我们20多年的超文本传输协议(即HTTP协议)。IPFS是一个协议,也是一个P2P网络,它类似于现在的BT网络,只是拥有更强大的功能,使得IPFS拥有可以取代HTTP的潜力。
Filecoin是运行在IPFS上的一个激励层,是一个基于区块链的分布式存储网络,它把云存储变为一个算法市场,代币(FIL)在这里起到了很重要的作用。代币是沟通资源(存储和检索)使用者(IPFS用户)和资源的提供者(Filecoin矿工)之间的中介桥梁,Filecoin协议拥有两个交易市场—数据检索和数据存储,交易双方在市场里面提交自己的需求,达成交易。
IPFS和Filecoin相互促进,共同成长,解决了互联网的数据存储和数据分发的问题,特别是对于无数的区块链项目,IPFS和Filecoin将作为一个基础设施存在。这就是为什么我们看到越来越多的区块链项目采取了IPFS作为存储解决方案,因为它提供了更加便宜、安全、可快速集成的存储解决方案。
1.1.2 IPFS的起源
全球化分布式存储网络并不是最近几年的新鲜品,其中最有名的3个就是BitTorrent、Kazaa、和Napster, 至今这些系统在全世界依旧拥有上亿活跃用户。尤其是BitTorrent客户端,现在BitTorrent网络每天依然有超过1000万个节点在上传数据。(不少刚从高校毕业的朋友应该还记得在校内网IPv6上分享电影和游戏资源的情景)但令人遗憾的是,这些应用最初就是根据特定的需求来设计的,在这三者基础上灵活搭建更多的功能显然很难实现。虽然在此之前学术界和工业界做过一些尝试,但自始至终没有出现一个能实现全球范围内低延时并且完全去中心化的通用分布式文件系统。
之所以普及进展十分缓慢,一个原因可能是目前广泛使用的HTTP协议已经足够好用。截至目前,HTTP是已经部署的分布式文件系统中最成功的案例。它和浏览器的组合是互联网数据传输和展示的最佳搭档。然而,互联网技术的进步从未停止,甚至一直在加速。随着互联网的规模越来越庞大,现有技术也越来越暴露出了诸多弊端,庞大的基础设施投资也让新技术的普及异常困难。
但我们说,技术都有其适用的范围,HTTP也是如此。四大问题使得HTTP面临越来越艰巨的困难:
1)极易受到攻击,防范攻击成本高。随着Web服务变得越来越中心化,用户非常依赖于少数服务供应商。HTTP是一个脆弱的、高度中心化的、低效的、过度依赖于骨干网的协议,中心化的服务器极易成为攻击的目标。当前,为了维护服务器正常运转,服务商不得不使用各类昂贵的安防方案,防范攻击成本越来越高。这已经成为HTTP几乎无法克服的问题。
2)数据存储成本高。经过十多年互联网的飞速发展,互联网数据存储量每年呈现指数级增长。2011年全球数据总量已经达到0.7ZB(1ZB等于1万亿GB);2015年,全球的数据总量为8.6ZB;2016年,这个数字是16.1ZB。到2025年,全球数据预计将增长至惊人的163ZB,相当于2016年所产生16.1ZB数据的10倍。如果我们预计存储4000GB(4TB)的数据,AWS简单存储服务(S3)的报价是对于第1个TB每GB收取0.03美金,对于接下来的49TB每GB收取0.0295美金的费用,那么每个月将花费118.5美金用于磁盘空间。数据量高速增长,但存储的价格依旧高昂,这就导致服务器-客户端架构在今后的成本将会面临严峻的挑战。
3)数据的中心化带来泄露风险。服务提供商们在为用户提供各类方便服务的同时,也存储了大量的用户隐私数据。这也意味着一旦数据中心产生大规模数据泄露,这将是一场数字核爆。对于个人而言,用户信息泄露,则用户账号面临被盗风险,个人隐私及财产安全难以保障;对于企业而言,信息泄露事件会导致其在公众中的威望和信任度下降,会直接使客户改变原有的选择倾向,可能会使企业失去一大批已有的或者潜在的客户。这并不是危言耸听,几乎每一年都会发生重大数据库泄露事件。2018年5月,推特被曝出现安全漏洞,泄露3.3亿用户密码;2017年11月,美国五角大楼意外泄露自2009年起收录的18亿条用户信息;2016年,LinkedIn 超1.67亿个账户在黑市被公开销售;2015年,机锋网被曝泄露2300万用户信息。有兴趣的读者可以尝试在公开密码泄露数据库中查询,是否自己的常用信息或常用密码被泄露,但自己却毫不知情。
4)大规模数据存储、传输和维护难。现在逐步进入大数据时代,目前HTTP协议已无法满足新技术的发展要求。如何存储和分发PB级别的大数据、如何处理高清晰度的媒体流数据、如何对大规模数据进行修改和版本迭代、如何避免重要的文件被意外丢失等问题都是阻碍HTTP继续发展的大山。
IPFS就是为解决上述问题而诞生的。它的优势如下:
1)下载速度快。如图1-2所示,HTTP上的网站大多经历了中心化至分布式架构的变迁。与HTTP相比,IPFS将中心化的传输方式变为分布式的多点传输。IPFS使用了BitTorrent协议作为数据传输的方式,使得IPFS系统在数据传输速度上大幅度提高,并且能够节省约60%的网络带宽。
2)优化全球存储。IPFS采用为数据块内容建立哈希去重的方式存储数据,数据的存储成本将会显著下降。
3)更加安全。与现有的中心化的云存储或者个人搭建存储服务相比,IPFS、Filecoin的分布式特性与加密算法使得数据存储更加安全,甚至可以抵挡黑客攻击。
4)数据的可持续保存。当前的Web页面平均生命周期只有100天,每天会有大量的互联网数据被删除。互联网上的数据是人类文明的记录和展示,IPFS提供了一种使互联网数据可以被可持续保存的存储方式,并且提供数据历史版本(Git)的回溯功能。
上文我们提到IPFS技术积累已经有很多年了,它至少参考了4种技术的优点,并将它们整合在一起。这4种技术分别是分布式哈希表DHT、Kademlia、Git和自验证文件系统(Self-Certifying File System)。
第一种对IPFS有借鉴意义的技术是DHT,全称为分布式哈希表(Distributed Hash Table),是一种分布式存储方法。DHT的原理是:在不需要服务器的情况下,每一个客户端存储一小部分数据,并负责一定区域的检索,进而实现整个DHT网络的寻址和检索。新版BitComet允许同时连接DHT网络和Tracker,可以在无Tracker的情况下进行下载。
IPFS借鉴的第二种技术是Kademlia。在Kademlia网络中,所有信息均以哈希表条目的形式加以存储,这些信息被分散地存储在各个节点上,从而以全网构成一张巨大的分布式哈希表。可以形象地把这张哈希大表看成一本字典:只要知道了信息索引的key,便可以通过Kademlia协议来查询与其对应的value信息,而不管这个value信息究竟是存储在哪一个节点之上。正是这一特性确保了IPFS成为没有中心调度节点的分布式系统。IPFS还借鉴了BitTorrent网络。首先是消极上传者的惩罚措施,在BitTorrent的客户端上传数据会奖励积分,而长期不上传的消极节点会被扣分,如果分数低于一定限度,那么网络会拒绝再为他们提供服务;其次是文件可用性检查,BitTorrent优先把稀缺的文件分享出去,各个客户端之间相互补充,这样种子不容易失效,传输效率也提高了。针对BitTorrent我们不再详细展开,有感兴趣的读者可以查阅BitTorrent相关文档。
第三种对IPFS有重大影响的项目是Git。我们在进行大文件传输或修改的时候总会遇到存储或传输压力大的问题,而Git在版本迭代方面非常出色。Git存储时会把文件拆成若干个部分,并计算各个部分的哈希值,利用这些构建起与文件对应的有向无环图(DAG),DAG的根节点也就是该文件的哈希值。这样的好处十分明显:如果需要修改文件,那么只需要修改少数图中节点即可;需要分享文件,等价于分享这个图;需要传输全部的文件,按照图中的哈希值下载合并即可。
最后一种是具有自验证功能的分布式文件系统(Self-certifying File System,SFS),它将所有的文件保存在同一个目录下,所有的文件都可以在相对路径中找到,其SFS路径名是其原路径与公钥的哈希。聪明的读者会发现,这样的设计包含身份的隐式验证功能,这就是为什么SFS被称为自验证文件系统了。
1.2 IPFS与区块链的关系
现在提到IPFS就一定会提到区块链。那么区块链和IPFS之间到底有什么关系呢?在介绍二者关系之前,我们需要先来了解一下区块链。
1.2.1 区块链基础
那么区块链又是什么呢?在最早期,区块链仅仅被认为是比特币的底层技术之一,是一种不可篡改的链式数据结构。经过几年的发展,区块链被越来越多的人熟知,它也从单纯的数据结构变成分布式账本的一系列技术的总称。它整合了加密、共识机制、点对点网络等技术。近些年,区块链的非账本类应用开始逐渐兴起,大家开始将区块链描述为分布式的数据库,认为它是价值传递网络,它逐渐被赋予了更多的内涵。
从技术方面来讲,区块链是一种分布式数据库,旨在维护各个互相不信任的节点中数据库的一致性,并且不可篡改。信用和记录会被保存到区块链上,每一个新的区块中存有上一个区块的数字指纹、该区块的信用和记录,以及生成新区块的时间戳。这样一来,区块链会持续增长,并且很难被篡改,一旦修改区块链上任意一个区块的信息,那么后续区块的数字指纹也就全部失效了。
链式数据结构使得区块链历史很难被篡改,而在各个互不信任的节点之间保持数据的一致性,则需要共识机制完成。共识机制是网络预先设定的规则,以此判断每一笔记录及每一个区块的真实性,只有那些判断为真的区块会被记录到区块链中;相反,不能通过共识机制的新区块会被网络抛弃,区块里记录的信息也就不再被网络认可。目前常见的共识机制包括PoW(工作量证明)、PoS(权益证明)、PBFT(实用拜占庭容错)等。
比特币、以太币、比特币现金及大部分加密数字货币使用的是PoW工作量证明。维护比特币账本的节点被称为矿工,矿工每次在记录一个新区块的时候,会得到一定的比特币作为奖励。因此,矿工们会为自己的利益尽可能多地去争夺新的区块记账权力,并获得全网的认可。工作量证明要求新的区块哈希值必须拥有一定数量的前导0。矿工们把交易信息不断地与一个新的随机数进行哈希运算,计算得到区块的哈希值。一旦这个哈希值拥有要求数目的前导0,这个区块就是合法的,矿工会把它向全网广播确认。而其他的矿工收到这一新的区块,会检查这一区块的合法性,如果合法,新的区块会写入该矿工自己的账本中。这一结构如图1-3所示。
与要求证明人执行一定量的计算工作不同,PoS权益证明要求证明人提供一定数量加密货币的所有权即可。权益证明机制的运作方式是,当创造一个新区块时,矿工需要创建一个“币权”交易,交易会按照预先设定的比例把一些币发送给矿工。权益证明机制根据每个节点拥有代币的比例和时间,依据算法等比例降低节点的挖矿难度。这种共识机制可以加快共识,也因矿工不再继续竞争算力,网络能耗会大大降低。但也有专家指出,PoS权益证明牺牲部分网络去中心化的程度。
目前,PoW和PoS是加密数字货币的主流算法,其他几个常见的共识机制有DPoS和PBFT,限于篇幅,这里不再进一步展开了。
1.2.2 区块链发展
1976年是奠定区块链的密码学基础的一年,这一年Whitfield Diffie与Martin Hellman(见图1-4)首次提出Diffie-Hellman算法,并且证明了非对称加密是可行的。与对称算法不同,非对称算法会拥有两个密钥—公开密钥和私有密钥。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。这是后来比特币加密算法的核心之一,我们使用比特币钱包生成私钥和地址时,通过椭圆曲线加密算法,生成一对公钥和私钥。有了私钥我们可以对一笔转账签名,而公钥则可以验证这一笔交易是由这个比特币钱包的所有者签名过的,是合法的。将公钥通过哈希运算,可以计算出我们的钱包地址。
1980年,Martin Hellman的学生Merkle Ralf提出了Merkle Tree(默克尔树)数据结构和生成算法。默克尔树最早是要建立数字签名证书的公共目录,能够确保在点对点网络中传输的数据块是完整的,并且是没有被篡改的。我们前面提到,在比特币网络中,每一个区块都包含了交易信息的哈希值。这一哈希值并不是直接将交易顺序连接,然后计算它们的哈希,而是通过默克尔树生成的。默克尔树如图1-5所示。默克尔树生成算法会将每笔交易做一次哈希计算,然后两两将计算后的哈希值再做哈希,直到计算到默克尔根。而这个默克尔根就包含了全部的交易信息。这样,能大大节省钱包的空间占用。例如,在轻钱包中,我们只需下载与自己钱包对应的交易信息,需要验证的时候,只需找到一条从交易信息的叶节点到根节点的哈希路径即可,而不需要下载区块链的全部数据。在IPFS项目里,也借鉴了默克尔树的思想。数据分块存放在有向无环图中,如果数据被修改了,只需要修改对应默克尔有向无环图中的节点数据,而不需要向网络重新更新整个文件。值得一提的是,Merkle在提出默克尔树时,分布式技术尚未成型,更别提数字货币了,而他在当时就能察觉并提出这样的方法,实在是令人赞叹。
非对称加密算法和默克尔树数字结构是后续数字货币和区块链的理论基础。而真正将密码学用于数字货币的尝试,则晚了许多。数字货币兴起于1990年的数字朋克(CyberPunk)运动,它是由一批热爱网络的极客们推动的。数字朋克们大多是密码学的专家,对于个人隐私十分向往,希望建立一套独立于现实中的国家、等级制度以外的空间。其中最典型的代表是David Chaum,他最早提出了盲签名技术,并将其应用到了Digit Cash项目(又名Ecash)中。盲签名是一种保护隐私的签名方式,它的签名者对其签署的消息不可见。比如,用户需要签署一个转账信息,而这一信息需要银行签名,用户为了保护隐私,不希望银行看到其具体的转账对象,就可以使用盲签名。David在他的论文中提出了用盲签名实现匿名货币的想法,具体方式是用户在本地计算机的Ecash程序中以数字格式存储现金,再交给银行进行盲签名。这套系统已经与当时的银行系统非常接近了,差一点获得了成功。但是Digit Cash始终需要中心化的银行服务器支持。在后续,没有一家银行愿意再支持他的项目,最终项目失败了。数字朋克运动中诞生的系统及关键人物如表1-1所示。
在Digit Cash失败后的几年里,人们几乎放弃了数字现金的构想。仅有少数数字朋克继续着研究。一个名为Hashcash的想法是在1997年由当时同为数字朋克的博士后研究员Adam Back独立发明的。Hashcash的想法很简单:它没有后门,也不需要中心第三方,它只使用哈希函数而不是数字签名。Hashcash基于一个简单的原理:哈希函数在某些实际用途中表现为随机函数,这意味着找到哈希到特定输出的输入的唯一方法是尝试各种输入,直到产生期望的输出为止。而且,为了找到这样一个符合条件的输入,唯一方法是再次逐个尝试对不同的输入进行哈希。所以,如果让你尝试找到一个输入,使得哈希值前10位是0,你将不得不尝试大量的输入,你每次尝试成功的机会是(1/2)10。这就是工作量证明的早期来源,也是矿工们每天在重复做的事情。他甚至在技术设计上做了一些修改,使其看起来更像一种货币。但显然,他的方案不能检验节点是否作弊,不能作为真正的数字现金。
还有两位有杰出贡献的数字朋克—Hal Finney和Nick Szabo,他们经过重新考虑将技术整合了起来。Nick Szabo不仅是一位计算机科学家,同时精通法律。Szabo受到David Chaum的启发后,希望利用密码协议和安全机制,提出了数字合约的构想。数字合约能在网络上不依靠第三方协助而是利用程序来验证并执行合同,它与传统合同相比更安全,并且减少了烦琐沟通的成本。这对后续的加密数字货币设计有着极大的影响。比特币网络可以提供非图灵完备的脚本语言实现部分智能合约功能;以太坊则进一步在EVM上运行Solidity语言,提供了图灵完备的智能合约环境,这也为后续分布式应用开发奠定了基础。
Nick做出的贡献还不只是发明了智能合约,在2008年,他发起了Bit Gold项目。在项目计划书中,Nick阐述的Bit Gold架构与现在的比特币完全相同,同样是工作量证明机制,同样是链式网络结构,同样的新区块包含旧区块的数字指纹,包含时间戳等诸多特性。然而,最终Bit Gold项目还是没有顺利完成。目前,Bit Gold可查寻的源头只有在Bitcoin Talk论坛中的帖子,后续的可查证资料就很少了。有一些比特币爱好者们一度认为Szabo就是中本聪本人,不仅因为Bit Gold与Bitcoin的也相似之处令大家充满想象,甚至是在词法和句法上,中本聪的比特币论文与Bit Gold论文也有相似之处。而且Nick家不远的地方,有一位叫中本聪的日本人,大家猜测这是Nick为了掩人耳目而故意隐藏自己的身份。Nick本人对此表示否认,并觉得这是个很搞笑的八卦。当然这也成为数字货币里最大谜团,究竟中本聪是谁呢?
再之后,到了2009年,中本聪发表了比特币论文。他提出了一整套加密协议,而不仅仅是加密货币。比特币使用计算机程序控制货币的发行,发行总量2100万枚。比特币的账本记录在成千上万台计算机上,黑客无法入侵;每个账户都是加密地址,你不知道谁在花钱,但是每个比特币的流通都被记录,你知道它的来源和去向的地址。比特币是第一个达到上述全部思想的项目,整合了之前30多年的技术积累。
比特币在设计之时,考虑到网络的稳定性和抵御恶意攻击,它使用的是非图灵完备的脚本语言(主要不能使用循环语句)。2013年,Vitalik Buterin 认为,比特币需要一种图灵完备的脚本语言来支持多样的应用开发。这个思路没有被比特币社区支持,于是 Buterin考虑用更通用的脚本语言开发一个新的平台,这就是后来的以太坊。以太坊在大致思路上与比特币相似,在账户状态、UTXO、地址形式上进行了一些优化。其最大的亮点在于,开发了Solidity智能合约编程语言和以太坊虚拟机(EVM)这一以太坊智能合约的运行环境,用于按照预期运行相同的代码。正因为EVM和Solidity,区块链的平台应用(DAPP)迅速兴起了。以太坊平台提出了许多新用途,包括那些不可能或不可行的用途,例如金融、物联网服务、供应链服务、电力采购和定价及博彩等。时至今日,基于DAPP的各类应用还在迅速发展,新的市场和需求在进一步被发现。后续区块链会如何发展,我们拭目以待。
1.2.3 IPFS为区块链带来了什么改变
区块链的诞生本是为了做到去中心化,在没有中心机构的情况下达成共识,共同维护一个账本。它的设计动机并不是为了高效、低能耗,抑或是拥有可扩展性(如果追求高效、低能耗和扩展性,中心化程序可能是更好的选择)。IPFS与区块链协同工作,能够补充区块链的两大缺陷:
- 区块链存储效率低,成本高。
- 跨链需要各个链之间协同配合,难以协调。
针对第1个问题,区块链网络要求全部的矿工维护同一个账本,需要每一个矿工留有一个账本的备份在本地。那么在区块链中存放的信息,为了保证其不可篡改,也需要在各个矿工手中留有一份备份,这样是非常不经济的。设想,现在全网有1万个矿工,即便我们希望在网络保存1MB信息,全网消耗的存储资源将是10GB。目前,也有折中的方案来缓解这一问题。在搭建去中心化应用DAPP时,大家广泛采取的方式是,仅在区块链中存放哈希值,将需要存储的信息存放在中心化数据库中。而这样,存储又成为去中心化应用中的一个短板,是网络中脆弱的一环。IPFS则提出了另一个解决方法:可以使用IPFS存储文件数据,并将唯一永久可用的IPFS地址放置到区块链事务中,而不必将数据本身放在区块链中。针对第2个问题,IPFS能协助各个不同的区块链网络传递信息和文件。比特币和以太坊区块结构不同,通过IPLD可以定义不同的分布式数据结构。这一功能目前还在开发中,目前的IPLD组件,已经实现了将以太坊智能合约代码通过IPFS存储,在以太坊交易中只需存储这个链接。
1.2.4 Filecoin:基于IPFS技术的区块链项目
在1.1节中我们介绍了IPFS的结构。Filecoin是IPFS的激励层。我们知道,IPFS网络要想稳定运行需要用户贡献他们的存储空间、网络带宽,如果没有恰当的奖励机制,那么巨大的资源开销很难维持网络持久运转。受到比特币网络的启发,将Filecoin作为IPFS的激励层就是一种解决方案了。对于用户,Filecoin能提高存取速度和效率,能带来去中心化等应用;对于矿工,贡献网络资源可以获得一笔不错的收益;而对于业务伙伴,例如数据中心,也能贡献他们的空闲计算资源用于获得一定的报酬。Filecoin会用于支付存储、检索和网络中的交易。与比特币类似,它的代币总量为2亿枚,其中70%会通过网络挖矿奖励贡献给矿工,15%为开发团队持有,10%给投资人,剩下5%为Filecoin基金会持有。投资人和矿工获得的代币按照区块发放,而基金会和开发团队的代币按照6年时间线性发放。由此可见,Filecoin与比特币挖矿机制完全不同。我们前面提到,为了避免攻击,比特币通过PoW工作量证明机制,要求矿工挖出下一个满足哈希值包含多个前导0的新区块。这个过程会需要大量的哈希运算。Filecoin使用的是复制证明(Proof of Replication,RoRep)。复制证明是矿工算力证明形成的主要方式,证明矿工在自己的物理存储设备上实际存储了数据,可以防止恶意矿工的各种攻击,网络中的验证节点会随机检查矿工是否在作弊。如果矿工不能提供正确的复制证明,那么它将被扣除一定的Filecoin作为惩罚。相比于PoW机制带来的算力竞争,PoRep显得环保的多。
1.3 IPFS的优势与价值
前文描述了IPFS大概的基础知识和与区块链的关系,这节我们详细介绍一下IPFS的优势和价值来源。
1.3.1 IPFS的优势
IPFS的优势在于其强大的技术积淀、精巧的架构设计及强大的开发者生态。
1.技术优势
IPFS技术可以分为多层子协议栈,从上至下为身份层、网络层、路由层、交换层、对象层、文件层、命名层,每个协议栈各司其职,又互相协同。图1-6所示为IPFS协议栈的构成。接下来我们逐一进行解释。
(1)身份层和路由层
对等节点身份信息的生成以及路由规则是通过Kademlia协议生成制定的,该协议实质上是构建了一个分布式哈希表,简称DHT。每个加入这个DSHT网络的节点都要生成自己的身份信息,然后才能通过这个身份信息去负责存储这个网络里的资源信息和其他成员的联系信息。
(2)网络层
比较核心,所使用的Libp2p可以支持主流传输层协议。NAT技术能让内网中的设备共用同一个外网IP,我们都体验过的家庭路由器就是这个原理。
(3)交换层
IPFS吸取了BitTorrent的技术,并在其之上进行了再创新,自研了BitSwap模块。使用BitSwap进行数据的分发和交换,用户上传分享数据会增加信用分,分享得越多信用分越高;用户下载数据会降低信用分,当信用分低于一定值时,将会被其他节点忽略。简单来讲就是,你乐于分享数据,其他节点也乐于发送数据给你,如果你不愿意分享,那么其他节点也不愿意给你数据。
(4)对象层和文件层
这两层适合结合起来看,它们管理了IPFS上80%的数据结构,大部分数据对象都是以Merkle-DAG的结构存在,这为内容寻址和去重提供了便利。文件层具有blob、tree、list、commit等多种结构体,并采用与Git类似的方式来支持版本控制。
(5)命名层
具有自我验证的特性(当其他用户获取该对象时,将交换节点公钥进行验签,即验证公钥信息是否与NodeID匹配,从而来验证用户发布对象的真实性),并且加入了IPNS这个巧妙的设计使得哈希过后的内容路径名称可定义,增强可阅读性。
新旧技术的更替无非两点:其一,能够提高系统效率;其二,能够降低系统成本。IPFS把这两点都做到了。
图1-7是一个IPFS技术模块的和功能间的映射关系图,同时也是一个纵向数据流图。前文所描述的多层协议,每一层的实现都绑定在对应的模块下,非常直观。
协议实验室在开发IPFS时,采用了高度模块集成化的方式,像搭积木一样去开发整个项目。截至2017年,协议实验室主要精力集中在设计并实现 IPLD、LibP2P、Multiformats 等基础模块,这些模块服务于IPFS协议的底层。
Multiformats是一系列散列函数和自描述方式(从值上就可以知道值是如何生成的)的集合,目前拥有多种主流的散列处理方式,用以加密和描述NodeID以及内容ID的生成。基于Multiformats用户可以很便捷地添加新的哈希算法,或者在不同的哈希算法之间迁移。
LibP2P是IPFS模块体系内核心中的核心,用以适配各式各样的传输层协议以及连接众多复杂的网络设备,它可以帮助开发者迅速建立一个高效可用的P2P网络层,非常利于区块链的网络层搭建。这也是IPFS技术被众多区块链项目青睐的缘由。
IPLD是一个转换中间件,将现有的异构数据结构统一成一种格式,方便不同系统之间的数据交换和互操作。当前,IPLD已经支持了比特币、以太坊的区块数据。这也是IPFS受到区块链系统欢迎的另一个原因,IPLD中间件可以把不同的区块结构统一成一个标准进行传输,为开发者提供了简单、易用、健壮的基础组件。
IPFS将这几个模块集成为一种系统级的文件服务,以命令行(CLI)和Web服务的形式供大家使用。
最后是Filecoin,该项目最早于2014年提出,2017年7月正式融资对外宣传。Filecoin把这些应用的数据价值化,通过类似比特币的激励政策和经济模型,让更多的人去创建节点,去让更多的人使用IPFS。
本节只对IPFS的技术特性进行了概要介绍,每个子模块的细节将在原理篇中做深度详解。
2.社区优势
协议实验室由Juan Benet在2014年5月创立。Juan Benet毕业于斯坦福大学,在创建IPFS项目之前,他创办的第一家公司被雅虎收购。2015年,他发起的IPFS项目在YCombinator孵化竞赛中拿到了巨额投资,并于2017年8月底,完成了Filecoin项目的全球众筹,在Coinlist(协议实验室独立开发、严格遵从SAFT协议的融资平台)上共募集了2.57亿美金。如图1-8所示,协议实验室具有强大的投资者和开发者社区。
IPFS的社区由协议实验室团队维护,到目前为止,开发者社区已经拥有上百位代码贡献者和数十位核心开发人员,如图1-9所示。IPFS目前已经发布了30余个版本迭代,开发进度一直保持良好。
同时,协议实验室官方也授权了部分社区(IPFS Community)中的Co-Organizer牵头全球性的推广交流活动。目前,已在美国芝加哥、美国华盛顿、英国伦敦、印度德里、哥斯达黎加圣何塞、巴西圣保罗、西班牙巴塞罗那、加拿大蒙特利尔、德国柏林以及中国的北京、深圳、福州等数十个城市开展了社区自治的Meetup线下活动,拥有来自世界各地广泛的支持者。
1.3.2 Filecoin与其他区块链存储技术的对比
当前,全球去中心存储区块链项目出现了包括Filecoin、Sia、StorJ、Burst、Bluzelle等一批优质的区块链项目,欲抢占存储市场制高点,如图1-10所示。它们都能够提供类似的去中心化存储功能,但在具体技术手段和应用场景上则略有差异。下面将重点阐述IPFS和Filecoin所构建的区块链存储体系与其他区块链项目的对比。
1.Burst
Burst作为第一个使用容量证明(Proof-of-capacity)的项目,还是具有很大的进步意义的。该项目是2014年8月10日在Bitcointalk上发起的,发起人的账号是 “Burstcoin”。一年后,创始人“Burstcoin”跟中本聪一样消失了。由于项目是开源的,2016年1月11日,一些社区成员将这个开源项目重新激活,独立运营开发,并且在Bitcointalk上新开了一个专区板块来维护。
相较Filecoin所采用的复制证明和时空证明,Burst使用的是一种叫作容量证明(Proof-of-capacity)的机制,即:挖矿的时候,利用矿机未使用的硬盘驱动器空间,而不是处理器和显卡。矿工可以提前生成的大量数据,这里数据被称为plot,然后保存到硬盘。plot的生成只需要计算一次,能耗方面表现得更加友好,且实现起来更为简单。
2. Sia
Sia是一个2015年7月发布的去中心化的存储项目,通过运用加密技术、加密合约和冗余备份,Sia能够使一群互不了解和互不信任的计算机节点联合起来,成为一种有统一运行逻辑和程序的云存储平台。其倾向于在P2P和企业级领域与现有存储解决方案进行竞争。Sia不是从集中供应商处租用存储,而是从彼此个体节点租用存储。
Sia采用的是PoW(Proof Of Work)和PoS(Proof Of Storage)的组合证明计模式,要使用Sia,在数据存储空间的提供者和租用者必须签订协议。租用者需要提前购置一笔代币,用以抵押至链上,如果满足了协议条款,那些代币就会支付给提供者。如果协议没有按照预期的那样完成,代币就会返给租用者。对于存储使用者而言,需要为文件的上传、下载和存储付费。
3. StorJ
StorJ是一个去中心化的、伪区块链的分布式云存储系统,主要功能与中心化的Dropbox、Onedrive类似。StorJ激励用户分享自己的剩余空间和流量,以获得奖励。因为其充分利用用户资源,所以成本极低,并且数据采用端对端加密的冗余存储,更加安全可靠。StorJ已经与开源FTP文件传输项目FileZilla达成合作。
相较于Filecoin,StorJ代币为基于ERC2.0的以太坊众筹币种,没有区块链架构,采用按月支付结算的方式,在这种方式里租用者频繁地给托管主机付款,如果用户不见了或不在线,托管主机将得不到报酬。StorJ更像一个被项目方撮合的共享存储经济体,不存在矿工挖矿产生区块的概念。
4. Bluzelle
Bluzelle是一款快速的、低成本的、可扩展的、使用于全球DApp的去中心化数据库服务,填补了去中心化基础架构的一个关键空白。
软件通常处理两种类型的数据:文件和数据字段。以IPFS和Filecoin为基础的项目侧重于对大文件提供分布式的存储和分发解决方案,而Bluzelle想要打造的是将那些通常很小且大小固定,按照数组、集合等结构的数据字段进行结构化存储,以便于快速存储和检索。数据字段存储在数据库中可以实现最佳的安全性、性能和可扩展性,并提供创建、读取、更新和删除(CRUD)等基本功能,区别于类似IPFS和Filecoin这样的分布式文件存储服务。
综上对比,以IPFS和Filecoin所构建的区块链存储体系,同时从基础层和应用层对传统云存储模式进行了颠覆,因此决定了其应用的范围更加广阔,其对应的加密数字货币增长空间也更大。
1.4 IPFS的应用领域
IPFS的应用领域如图1-11所示。
1.建立长久信息档案
IPFS提供了一个弱冗余的、高性能的集群化存储方案。仅仅通过现有的互联网模式来组织这个世界的信息是远远不够的,我们需要建立一个可以被世界长久记住、随着人类历史发展而一直存在的信息档案。
2.降低存储、带宽成本
IPFS提供了一个安全的点对点内容分发网络,如果你的公司业务需要分发大量的数据给用户,IPFS可以帮你节约大量的带宽成本。在云计算时代,我们大部分的网络带宽和网络存储服务都由第三方服务平台来支持,例如YouTube这样的大型视频平台,需要支付高额的流量费用给ISP(互联网服务提供商),而YouTube也将通过各种商业广告及收费会员的商业形式把这部分的成本转嫁到广大用户身上,整个流程体系的总成本是相当庞大的。为了激励人们参与IPFS协议,协议实验室团队借鉴了比特币的经济模型,设计了基于IPFS的区块链项目Filecoin。Filecoin将IPFS网络参与者分为两类:Storage Miner(为网络提供空闲的存储空间)和Retriver(为网络中的节点提供带宽,帮助其他用户传输文件),通过这种共享模型充分利用闲置资源,降低了系统总成本,并为用户降低了使用成本。目前,将这个应用方向做得比较成功的项目叫Dtube,它是一个搭建在Steemit上的去中心化视频播放平台,其用户上传的视频文件都经过IPFS协议进行存储,具有唯一标识。相较于传统视频网站,它降低了同资源冗余程度。
3.与区块链完美结合
IPFS和区块链是完美的搭配,我们可以使用IPFS处理大量数据,并将不变的、永久的IPFS链接放置到区块链事务中,而不必将数据本身放在区块链中。毕竟,区块链的本质是分布式账本,本身的瓶颈之一就是账本的存储能力,目前大部分公链的最大问题是没法存储大量的数据在自己的链上。比特币至今全部的区块数据也才数百GB,以太坊这样可编程的区块链项目也只能执行和存储小段合约代码,DApp的发展受到了很大的制约。运用IPFS技术解决存储瓶颈是可行方案之一。
4.为内容创作带来自由
IPFS为网络内容创作带来了自由和独立的精神,可以帮助用户以一种去中介化的方式交付内容。Akasha是一个典型的应用,它是一个基于以太坊和IPFS的社交博客创作平台,用户创作的博客内容通过一个IPFS网络进行发布,而非中心服务器。同时,将用户与以太坊钱包账户绑定,用户可以对优质内容进行ETH打赏,内容创作者能以此赚取ETH。它没有太多审查的限制,也没有中间商分利,内容收益直接归创作者所有。
1.5 本章小结
本章主要为读者构建IPFS大致的概念和框架,只涉及很少量的技术描述。我们知道了,IPFS是一种基于内容检索、去中心化、点对点的分布式文件系统 。IPFS项目通过整合已有的分布式存储方式和密码学的成果,力图实现互联网中高可用、数据可持续保存的全球存储系统。它整合了分布式哈希表、BitTorrent、Git和自验证文件系统4种技术的优点。使用DHT实现内容检索;借鉴BitTorrent,实行分块存储、分块传输和奖励机制;Git中应用的默克尔DAG使得大文件分享、修改变得简单高效;而自验证文件系统确保了数据发布的真实性。我们还回顾了区块链的基本知识和重要研究历史,了解了区块链从加密算法到比特币和以太坊的历史进程。同时,我们指出了当前区块链和互联网难以解决的问题,以及IPFS在这二者中有可能会带来哪些改变。Filecoin是IPFS的激励层,可激励矿工贡献出更多的网络资源和存储资源,矿工越多,IPFS 和 Filecoin 的网络越健壮、高速。我们还提到了IPFS的多层协议栈,从上至下为身份、网络、路由、交换、对象、文件、命名这几层协议,以及IPLD、LibP2P、Multiformats三个组件。同时介绍了Filecoin与Burst、Storj和Sia等区块链存储项目的区别。第4节里,主要介绍了应用领域的几个典型的例子,包括分布式社交创作平台Akasha,基于Steemit的去中心化视频平台Dtube,以及目前区块链与IPFS结合使用的方式。下一章我们将开始介绍IPFS的底层原理。