4月14〜15日在上海举办的 Gopher China 2018 大会上,吸引了来自全国上千位 Gopher 的参与,来自 INBlockchain 的余长洪带来了《GO 构造的下一代互联网:IPFS全解析》,本文是他的演讲内容记录

     大家好,我是余长洪,来自INBlockchain。很高兴今天和大家分享下 IPFS。

     严格来讲 IPFS 不算是区块链项目,只是一个去中心化存储解决方案。其上开发的FileCoin才是真正的区块链项目。

    今天的主题定的比较大,请不要在意这些细节。我们一起来看看它怎么做的,是否真的能完美的替代HTTP的协议。640_wx_fmt_png这个是IPFS官网上贴的目标,就是为了替代HTTP协议,打造一个更好的互联网。

我们来看一下目前互联网存在的一些问题。

640_wx_fmt_png 1     首先现在的互联网有很多大量重复的内容。我们有一句俗话:“天下文章一大抄”。现在搞内容互联网的都会用到各种爬虫,结果就是网络上都是重复的内容。IPFS可以把大的文件都切成很小的Block,每一个Block有自己的唯一Hash,可以做到重复的部分只存一份,这就可以节省很大的存储成本。对于带宽来讲,P2P 网络可以从很多不同的节点拉取你所需要的 block。对于内容的服务商来讲,不需要很大的带宽,以为流量都被整个网络分摊了。现在如果对网络上的文件做了修改,之前的历史你可能就找不到了。但是在 IPFS 中文件有了 Version 的概念,每个版本都会存储到网络中,并且只存储修改的部分。谈到开放程度呢,现在互联网是被中心化管控的,我们用去中心化的网络可以更加开放。像朝鲜这样的国家都访问不了 Facebook等网站,我是接受不了的。

我们来看一下 IPFS 的技术架构。

640_wx_fmt_png 2

由下到上是网络、路由、数据交换、数据存储、naming服务、和应用。

IPFS 是很多现有技术的组合,右侧是 IPFS 采用的关键技术,底层网络在go网络库上基础上实现了一个 libp2p 库,包含了各种网络协议。

路由技术使用的 DHT 分布式哈希表,数据交换是从 BitTorrent 基础上演化的 BitSwap,数据存储借鉴了Git。还有 SFS,一种自签名的文件寻址系统。

节点ID

640_wx_fmt_png 3

    上面这个算法是怎么去算节点ID的。跟 Bitcoin 等有点类似,先生成公私钥,再根据公钥生成地址。有一点不同的地方是它在里面加入了一个轻量级的 PoW 算法。在生成节点ID的时候,经过一定运算生成合法的nodeID。这么做的好处就是可以提高攻击的成本。以女巫攻击为例,攻击者需要伪造很多恶意的节点来污染整个网络,如果采用这种生成 ID 的方式,可以提高攻击者的成本,从而避免一些攻击。

网络

640_wx_fmt_png 4

IPFS在网络方面做了以下工作

  • 传输层兼容现有的协议,对WEBRTC也有很好的支持。

  • 可靠性可以使用uTP和sctp来保障,这两种协议可以动态调整网络状态。

  • 连通性方面支持ice等 NAT 穿透技术。

  • 完整性通过文件hash校验的方式保障,IPFS中所有数据块都有唯一的hash。

  • 确定性通过验证发布者公钥的方式来保障。

640_wx_fmt_png 5

所以理论上IPFS可以使用任意网络。

这张图是IPFS对节点地址存储的方式multiaddr,将完整的访问路径都记录下来了,包括协议名。

路由

路由是P2P网络里比较重要的部分。

路由算法经历了以下演进过程:

第一代 Napster 采用中央数据库查询网络节点。

第二代 Gnutella 查询所有节点。

第三代 Kadmlia 使用 XOR 算法定位节点和文件。

640_wx_fmt_png 6

KAD网络通过节点ID的XOR操作来存储和查找节点信息。将两个节点ID按位进行XOR操作会得到0/1结果。相同为1,不同为0。然后按照XOR的结果存放在树状结构里。 从左到右的节点数越来越少是因为所有bit都相同的概率越来越少。 叶子结点是一个K桶,存储了符合XOR结果的所有节点列表。内容寻址类似,发布的时候按照XOR结果存储到指定节点。拉取的时候去指定节点获取。

这个图很好理解,比如说我叫余长洪,来了一人叫王小明,第一个字我姓余,他姓王,那你就在左边,又来了一个人叫余星星,第一个字相同就在中间,又来了一个人叫余长黑,前两个字都相同,认为这两个节点的“距离”是最近的,把你放在最右边。通过这种方式,如果我们找一个余长什么的,就可以在右边快速找到。

640_wx_fmt_png 7

IPFS 的路由的技术吸收了 Kademlia、Coral、S/Kademlia 等多种技术的优点。KAD网络寻址性能比较好,一般一千万节点最多20跳就可以查到。控制协议比较简单,只有四种控制协议,本身可以抵挡多种攻击。Coral DHT会把节点中数据的hash记录下来,直接就能知道内容和节点的关系,查找比较高效。Coral DHT还支持 Region,可以优先就近查找。S/Kademlia 可以在一半恶意节点网络中保证85%的正确率。

数据交换

640_wx_fmt_png 8

IPFS 节点都会维护 have_list 和 want_list,节点通信的时候会交换这两个列表,然后按照列表互换数据。IPFS 还有一个 Pin 的功能,可以指定某个文件永远存在我这儿,不会被 GC 掉。IPFS 还引入了债务的概念。从别的节点去拉取数据的时候,会产生债务,你发送数据给别的节点的时候可以偿还债务。通过这种形式,可以避免自私节点。节点之间还维护帐本,通过互换账本可以发现恶意节点,避免攻击。

640_wx_fmt_png 9

这个是负债率的计算公式。比如说A和B两个节点,现在A在往B发送数据,如果A往B发的越多,那对A来讲,B的负债率就会很高。下面这个公式是发送率的计算公式。可以看到就是如果 r 大于 2 时,发送率会变的很小,从而A就不会继续给B发送数据。如果B只收不发,权重就会迅速降低,就不会有人给他发送数据包了。这么做的好处是这样的网络更高效,大家都有收有发,不断做数据交换,是一个比较健康的状态。

文件系统

IPFS在做数据交换之后怎么存储这些数据呢?

640_wx_fmt_png 10

IPFS 的文件系统现在叫 IPLD,以前是 Merkle DAG。是 Merle Tree 的变种。这是 Bitcoin 和以太坊用的 Merkle Tree。只有叶子节点存储数据,其他节点将下面节点的 hash 进行计算存储。根节点等于是从这个树的所有节点计算出来的,可以方便验证数据是否正确。

640_wx_fmt_png 11Merkle Dag 在此基础上把文件数据也存在每一个节点上。可以根据根找到所有link的blocks。并且确保这些数据没被篡改过。而且可以看到最右侧,hello.txt 和 my_file.txt 由于内容一致。只会产生一个节点。达到了去重的目的。另外对于文件夹 my_dir 也是通过link指向下面的文件,然后文件在做 chunk。

640_wx_fmt_png 12

我们来看下IPFS一个block是什么样子。对于小于256K的数据直接放在一个block,记录了hash和data。大于256k的文件会被chunk为很多份小文件。原始block只包含hash和到这些block的引用。

640_wx_fmt_png 13

那我们再来看下怎么实现类似GIT的版本系统。

我们看在左边first commit 中的mydir 窒息那个的 my file 就是2 的内容有修改,到second commit my dir的hash产生了改变因为下面的文件内容变了。同时指向了相同的testing.txt 因为内容没有改变。 指向了新的 my_file 文件。

这个是一个类似于Git支持多版本的文件存储的方案,我们先看左边这个树 First Commit,我们先看"my_file.txt"这个block,他的内容是“Hello World”。现在我们对他进行修改,改成“Another World”。

这是会生成第二个版本 Second Commit,所有的内容都指向之前的原始Block,不过因为"my_file.txt"发生了改变,所以产生了一个新的block。640_wx_fmt_png 14

Naming640_wx_fmt_png 15我们给每一个Node分配一个Namespace,节点上传的数据都存储在这个Namespace里面。SFS加上 Namespace 再到后面文件名的hash 就确定这个路径的Hash。在获取文件的时候可以使用节点的公钥来验证这个路径是否真的是合法的。640_wx_fmt_png 16IPFS 还支持很多的Naming的方式,比如说域名访问,还有 Proquint、短地址等方法。

再多说几句。为什么在Go大会上讲IPFS呢?其实 IPFS 跟 go-ethereum 是 Go 语言在区块链世界里的两个标志性项目。我觉得Go语言比较简单,所谓大道至简,更适合做这种基础设施的领域。IPFS本身有JS 的实现,不过把这种重要的基础设施用JS 来实现让人心里有点怕怕的。

刚才听好多同学是做区块链开发的,现在大家对区块链有各种看法。有人觉得它扯淡,是一场骗局。有人觉得很有意义。我接触区块链也不算久,不过真真正正学到很多东西,从技术到哲学。PoW是不是公平的,PoS是不是公平,是不是反去中心化。不管现在区块链到底能不能解决什么实际问题,我都觉得这个技术值得大家去了解一下,没有什么坏处。

 以上就是我今天的分享谢谢。

   提问:我请教一个问题,区块链领域有老师分享Go是占了60%,好像是以太坊的项目,还有一个Rust占了20%的份额,这两个语言你们比较一下,Rust会侵占Go的多少?

   余长洪:我觉得Go和Rust都很好,都适合做这种基础设施。

   提问:其实在区块链的发展过程更类似于社会的发展情况,现在EOS可能有局部的去中心化,短期的区块链的发展会在哪里?

   余长洪:我个人的看法,三五年来讲,可能PoW 会逐渐没有什么市场。现在你可以看到基于PoS、DAG的共识协议越来越多,因为大家普遍认为 PoW 是负社会性的,我们浪费了很多计算力去计算无意义的数学问题。当然至于PoW、PoS谁好谁坏,现在没有定论,PoW算力至上、PoS有钱说了算,其实都还是代表少数利益团体。

   提问:我有一个问题想请教一下,刚才你讲到的IPFS里面每一个文件是分块以后,是相当于在整个系统当中只有一个备份,假如说我提供这个存储空间的人,我有一百多个节点都要掉了,我把这个文件删了,这个时候通过hash能访问到吗?

   余长洪:IPFS并不能保证你的文件一定是存在的,本身有GC的机制,对于冷门或者长尾的资源,没有办法保证一定在,你删了就丢了。FileCoin是为了想解决这种问题,为你自己的资源付费可以保证它一直存在于网络。

   提问:你是用POW挖矿工作量证明,这方面有没有性能的问题,这个问题讲了帐本的互换避免恶意的攻击,这点不是很理解。

   余长洪:PoW不会像 比特币、以太坊的PoW计算难度那么难。我刚才讲是一个轻量级的,会控制这个难度,不会让你生成NodeID的时候很慢。只是为了给攻击行为增加一点难度。

   提问:你讲到帐本互换的时候说可以预防恶意的攻击。

   余长洪:刚才讲到负债的问题,节点的负债情况是在帐本里面的。节点之间通过账本互换,可以找到那些节点只发不收。另外还可以避免节点欺骗拥有某些资源,因为从未出现在账本里。

   

   提问:现在在应用的层面,供应链先不说,你觉得哪些场景是适合做区块链落地先项目的。

   余长洪:银行间的结算和跨国外汇的结算比较适合,就是联盟链。另外就是物品溯源是比较好的落地的方向。

   

   提问:刚才讲到了DHT路由发现,怎么发现未知的节点,是不是有原始的节点?

   余长洪:新安装的节点在启动时候会有一个内置的节点地址。包括像以太坊、比特币的客户端都是这么做的。根据这个节点再请求其他的节点,把这个节点放到DHT里面去。同时官方会保证这个默认初始节点的可用性。