在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:Kevin-miu/IPFSNotebook开源软件地址:https://github.com/Kevin-miu/IPFSNotebook开源编程语言:开源软件介绍:IPFS学习笔记版本:
参考:
PPT: PPT IPFS简介Protocol Labs协议实验室成立于2014年5月,由IPFS和Filecoin的发明者Juan Benet创立。在2014年夏天,加入了美国顶级孵化器Y-Combinator。协议实验室于2015年1月向世界发布了IPFS,从此,IPFS在各行业的组织中获得了巨大的发展。在2016年,IPFS一度成为区块链行业中最受青睐的技术之一,数千名开发人员称之为“WEB的未来”。同年,协议实验室还创建了libp2p、IPLD、multiformats、Orbit以及其他项目。而我们最期待的项目是Filecoin,目前正在开发中,预计在今年的晚些时候上线。 IPFSIPFS的中文名是星际文件系统(InterPlanetary File System),它本质上是一种内容可寻址、版本化、点对点超媒体的分布式存储、传输协议 ,目标是补充甚至取代过去20年里使用的超文本媒体传输协议(HTTP) ,希望构建更快、更安全、更自由的互联网时代.
HTTP协议已经用了20年的历史,从HTTP 1.0 到现在的HTTP 5,网页的展示越来越美观丰富,但它背后的Browser/Server 模式是从来没变的。 对比HTTP,IPFS具有这样的一些特性:
IPFS协议栈IPFS至少有七层协议栈,从下至上分别为身份、网络、路由、交换、对象、文件、命名、应用(有些认为八层协议栈的存在应用层),每层协议栈各司其职,写成独立于上层,但上层依赖于下层。 各层解释:
新的技术取代老的技术,无非就两点:第一,能提高系统效率;第二,能够降低系统成本。IPFS把这两点都做到了。 技术拆解本章将会将IPFS技术拆解,主要分成以下几部分进行解释:
1. Kademlia和DHTDHT DHT全称叫分布式哈希表(Distributed Hash Table),是一种分布式存储方法,一类可由键值来唯一标示的信息按照某种约定/协议被分散地存储在多个节点上,这样也可以有效地避免“中央集权式”的服务器的单一故障而带来的整个网络瘫痪。实现DHT的技术/算法有很多种,常用的有:Chord, Pastry, Kademlia等。我们这里要研究的是Kademlia算法。
Kademlia 各种DHT的实现算法,不论是Chord, Pastry,还是Kademlia,其最直接的目标就是以最快的速度来定位到期望的节点,在P2P文件分享应用中则是以最快的速度来查找到正在分享某一文件/种子的peers列表信息。因为每个节点都是分布式存在于地球的任何角落,如果用地理距离来衡量两节点间的距离则可能给计算带来极大复杂性甚至不可能进行衡量,因此基本所有的DHT算法都是采用某种逻辑上的距离,在Kademlia则采用简单的异或计算 来衡量两节点间的距离,它和地理上的距离没有任何关系,但却具备几何公式的绝大特征:
Kademlia中规定所有的节点都具有一个节点ID,该节点ID的产生方法和种子文件中的info hash采用相同算法:即sha-1(安全hash算法)。因此每个节点的id,以及每个共享文件/种子的info-hash都是唯一的,并且都是20个字符160bits位组成。两个节点间的距离就是两个节点id的异或结果,节点离键值(种子)的距离为该节点的id和该种子文件的info-hash的异或结果。 Kademlia在异或距离度量的基础上又把整个DHT网络拓扑组织成一个二叉前缀树,所有的节点(所有的正在运行的,并且开取了DHT功能)作为该二叉前缀树的叶子节点,可以想象这棵二叉树可以容纳多达2128个叶子(节点),这足以组织任何规模的网络了。对于每个节点来说按照离自己的远近区域又可以把这棵树划分为160棵子树,每一个子树和该节点都有一个共同的前缀,共同前缀越少离得越远(异或结果亦是如此)。 例如:以下5个节点将会根据其ID组织成二叉树(模拟) 为了快速到达这160棵子树,处于DHT网络的每一个节点都记录了每棵子树上的K个节点的信息(ip,port,id),在BT中K固定为8。这份记录信息称为K桶,也叫路由表。这个路由表与通常IP路由的概念不一样,它代表了到达处于自己某个距离范围[2i—2i+1)的节点,可以通过该范围所选取的K个节点来定位。下图是路由表的结构: 实际上,路由表可能没有160份,因为路由表是对半拆分的,最初只有一份,在插入过程中,该路由表的节点大于k(8)时,则拆分成两半,一半包含自身节点,一半不包含自身节点,循环往复。(?路由表的节点大于k(8)?怎么拆分?) 每一个新加入DHT网络的节点,其路由表是空的,通过以下方式逐步形成自己的路由表:
实际上,DHT是把Tracker集中维护的所有种子的peers-list信息利用DHT的方法散列并保存到所有的DHT网络中的节点上去,然后在此基础上提供查找的方法。在DHT中实现了两种类型的查找,一种是查找node(find_node),另一种是查找peers(get_peers)。 查找node过程如下:
查找peers过程如下:而x查找peers-list的方法则和上面查找节点的方法类似,不同的是它是以info-hash作为参数进行查找,并且如果在查找过程中有任何一个节点返回了(info-hash, peers-list)对则提前结束查找。 当一个节点通过上面方法得到了peers-list后,则会试图对每个peers主动发起TCP的连接继续后面真实的下载过程,同时会把自己的peer信息发送给先前的告诉者和自己K桶中的k个最近的节点存储该peer-list信息。该信息在该k个节点上可以保存24个小时,24小时后如果没有收到x发送的更新消息则失效。因此,一个活动节点是存储了两部分信息:一份是本地的路由表,另一份是<info-hash,peer-list>列表信息(有多个)。 2.Merkle Tree和Merkle DAGMerkle Tree Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树。Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值。非叶节点是其对应子节点串联字符串的hash。
在稳定服务器的场景中,从服务器下载数据后,采用单一的哈希进行检验。如果哈希结果不正确,说明数据在传输过程中发生错误。此时,需要重新下载整份数据,这是方法的效率是很低的。 在在点对点网络的场景中,由于节点机器被认为是不稳定或不可信的,为了校验数据的完整性,更好的办法就是将大份数据分割成许多小的数据块来保存和传输。这样做的好处就是,当数据出错时,只需要对错误的数据进行重传。 第一种方法就是Hash List: 点对点下载的时候,在真正地下载数据之前,会先下载一个Hash列表,该Hash列表就是各个数据块的Hash值。然后从可信的服务器获取根hash(就是图中的top hash),用根hash来校验hash列表。校验过程是:将Hash列表的所有hash按顺序结成字符串,再做一次Hash运算,结果与根Hash对比。 第二种方法就是Merkle Tree, 跟Hash List一样,Merkle Tree先计算小数据块的hash值,然后按顺序将相邻的hash合并成字符串,再计算该字符串的hash,逐级计算,最终得出树根Merkle Root。 点对点下载的时候,从可信源获取Merkle Root,从不可信源获取Merkle Tree,这样就这一检验数据是否有错误。与Hash List不同的是,Merkle Tree可以直接下载并立即检验树的一个分支:如果数据块错误,需要下载完整的Hash List来验证,而Merkle tree只需要下载一个分支并立即验证,不同在下载另一个分支,以此类推。 Merkle Tree的特点:
详细的Merkle Tree算法解析请点击 Merkle DAG Merkle DAG的全称是 Merkle directed acyclic graph(默克有向无环图),它是在Merkle tree基础上构建的。Merkle DAG跟Merkle tree很相似,区别在于:Merkle DAG不需要进行树的平衡操作,非叶子节点允许包含数据等。 IPFS的Merkle DAG是由Git改造而来的,定义了一组对象:
Merkle DAG拥有如下的功能:
详细的Git命令解释请点击 3.Bittorrent和BitSwap点对点的数据传输
Bittorrent 特点:
存在问题:
BitSwap IPFS在BitTorrent的基础上实现了p2p数据交换协议:BitSwap协议。 IPFS每一个节点都维护了两个列表:
当两个节点建立连接后,他们会根据hava_list和want_list互通有无。跟BitTorrent不一样的是:BitSwap获取数据块的时候不限于从同一个torrent里面。也就是说BitSwap可以从不属于本文件的其他文件获取数据块(只要数据块的哈希值一样,数据内容必然是一样的,同样的数据块只会保留一份)。从全局考虑,这使得BitSwap的效率相比于BitTorrent更高。 对于p2p网络,有一个很重要的问题是:如何激励大家分享自己的数据?IPFS实现了自己的特殊的数据分享策略。IPFS的策略体系由信用、策略、账单组成。 后期将会使用filecoin来实现激励策略。 信用体系:BitSwap协议必须能够激励节点去乐于分享数据,即使这个节点暂时没有数据需求。IPFS根据节点的之间的数据收发建立了一个信用体系:发送给其他节点数据可以增加信用值;从其他节点接受数据降低信用值。如果一个节点只接收数据而不分享数据,信用值就会降得很低而被其他节点忽略掉。 简单来讲就是:你乐于分享数据,其它节点也乐于发送数据给你,如果你不愿意分享,那么其它节点也不愿意给你数据。 账单:BitSwap节点会记录下来和其他节点通信的账单(数据收发),可以保持节点间数据交换的历史和防止篡改。当两个节点之间建立连接的时候,BitSwap会相互交换账单信息,如果账单不匹配,则清除重新记账。恶意节点可能会故意“丢失”账单,以希望清除掉自己的债务。其它交互节点会把这些都记下来,如果总是发生故意“丢失”账单的情况,该节点就会被拒绝。 实现策略:根据上面的信用体系,BitSwap可以采取不同的策略来实现,每一种策略都会对系统的整体性能产生不同的影响。策略的目标是:
IPFS提供一个可参考的策略机制(实际的实现可以有所变化) 4.IPNS到目前为止,IPFS堆栈形成了构建内容寻址对象 DAG 的P2P交换。它可以用于发布和检索不可变的对象,甚至可以跟踪这些对象的版本历史。但是,仍缺少一个关键组件:可变命名。没有它,用户就得在IPFS系统外获取到新的内容地址了。 自验证命名 1.将节点公钥的哈希结果定义节点的NodeId; 2.通过 /ipns/NodeId的方式可以访问该节点下的内容; 3.当其他节点从该节点获取文件时,可以先验证其公钥和NodeId是否匹配,以到达文件对象的真实性。 通过自验证命名,我们可以实现这样的访问效果/ipns//docs/test.md而不必用/ipfs/<test.md’s Hash>这样的方式、 场景模拟
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论