1. 首页
  2. 技术分享

轻松入门IPFS,这一篇就够了!|点滴资讯

看了那么多文章,还是对IPFS一知半解,怎么办呢?没关系,我们团队特意做了这个IPFS100问,让我们快速揭开IPFS高大上的外衣。顺便介绍了本公司与IPFS的故事,让我们开始吧!

三、关于IPFS基本技术

轻松入门IPFS,这一篇就够了!|点滴资讯
问题1:IPFS的基本架构是?

基于P2P和哈希加密的的分布式结构。

问题2:IPFS的基本工作原理?

点对点进行文件传输,然后能点对点构建一个连接网络,将文件分散式存储到各个节点上,然后文件映射到一个hash空间地址上。

问题3:IPFS包括哪些技术的组合?

Libp2p、IPLD、Git、DHT、IPNS、Multiformats、BitTorrent等。

问题4:域名寻址和内容寻址是什么?

每一个接入网络的节点都有一个独特的身份地址,根据这个地址,能在DHT中找到并与之进行通信,根据内容的hash地址可以在网络中找到内容存放的位置。

问题5:IPFS有哪些基础的模块?

节点寻找的DHT,内容传输的BitTorrent,内容版本控制的Git,自验证文件系统SFS,帮助记忆的IPNS。

问题6:libp2p是什么样的一个项目?

Libp2p是一个底层的传输协议,帮助节点创建独特的地址,可以根据libp2p非常方便进行文件查找和节点查找。Libp2p是一个比较完善的项目,可以用在非常多的公链开发中,作为底层p2p来使用。

问题7:IPLD指的是什么?

很多使用Merkle Tree的数据结构,例如IPLD定义了如下概念:

– merkle-links:merkle-graph的关键单位

– merkle-DAG:任何边为merkle-links的图

– merkle-paths:unix风格的路径便于遍历merkle-dag

– IPLD DATA Model:一种灵活的,基于JSON的数据模型,用于表示merkle-dags

– IPLD Serialized Formats序列化模型:一系列IPLD对象可以使用的格式,例如JSON,XML等

– IPLD权威格式:一种笃定的对序列格式的描述,它可以保证对于数据都使用同样的解释逻辑,这一点对于merkle-linking和其他的加密应用都至关重要。

问题8:Multiformats指的是什么?

Mutiformats是一系列hash加密算法和自描述方式(从值上就可以知道值是如何生成)的集合,它具有SHA1SHA256 SHA512Blake3B等6种主流的加密方式,用以加密和描述nodeID以及指纹数据的生成。

Multiformats协议里面包含以下协议:

◆ multihash – 自描述哈希

◆ multiaddr – 自描述网络地址

◆ multibase – 自描述基编码

◆ multicodec – 自描述序列化

◆ multistream – 自描述流网络协议

◆ multigram (WIP) – 自描述分组网络协议

 

四、IPFS层级

轻松入门IPFS,这一篇就够了!|点滴资讯
问题1:IPFS协议栈有哪些子协议构成?

由七层负责不同功能的子协议构成:

身份层:管理节点身份生成和验证。

网络层:管理与其他对等体的连接,使用各种底层网络协议。

路由层:维护信息以定位特定的对等体和对象。响应本地和远程查询。默认为DHT,但可更换。

交换层:一种支持有效块分配的新型块交换协议(BitSwap),模拟可信市场,弱化数据复制,防作弊。

对象层:具有链接的内容寻址不可更改对象的Merkle DAG,用于表示任意数据结构,例如文件层次和通信系统。

文件层:由Git启发的版本化文件系统层次结构。

命名层:自我认证的可变名称系统。

问题2:IPFS的身分层包含哪些内容?

身份系统的主要作用是标识IPFS网络中的每一个节点,有点像用户信息的生成。在节点建立首次连接时,对等节点将交换公钥,并检查hash(other.PublicKey)是否等于other.NodeId,相当于校验用户信息,如果校验结果不相等,则用户信息不匹配,节点连接立即终止。

所有节点在IPFS网络中都要一个唯一的NodeId进行标识,其实就是一个公钥的哈希,然而为了增加攻击者的成本,IPFS使用了S/Kademlia中提到的算法增加创建新身份的成本。

问题3:IPFS的网络层包含哪些内容?

IPFS可以使用任意的网络进行通信,并没有完全依赖于IP层,IPFS是通过multiaddr的格式来表示目标地址和使用的协议,以此来兼容和扩展未来可能出现的其他网络协议。

IPFS节点与其他节点连接通信的时候,会跨越广域网,IPFS网络堆栈的特点如下:

(1)传输:IPFS兼容现有的主流传输协议,其中最适合浏览器端使用的WebRTC Data Channels,低延时uTP(LEDBAT)传输协议等。

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

(3)可连接性:使用ICE等NAT穿越技术来实现广域网的可连接性。

(4)完整性:使用哈希校验检查数据完整性,IPFS中所有数据块都有唯一的Hash。

(5)可验证性:使用数据发送者的公钥以及HMAC消息认证码来检查消息的真实性。

问题4:IPFS的路由层包含哪些内容?

IPFS节点需要一个路由系统,可用于查找:

l 同伴节点的网络地址。

l 服务特定对象的对等节点。

IPFS的路由层需要实现三种基本的功能:内容路由,节点路由和数据存储。

集成这些功能的接口降低了系统的耦合度,可以让开发者根据业务需求进行底层自定义的同时也不会影响系统其它部分的正常工作。

IPFS路由层数据结构使用的是S/Kademlia和Coral技术的分布式松散哈希表(DSHT),IPFS的DSHT结构会根据所存数据的大小值进行区分:小的值(等于或小于1KB)直接存储在DHT上,更大的值,DHT只存储值索引,这个索引就是一个对等节点的NodeId,该对等节点可以提供对该类型值的具体服务,DSHT的接口位于libP2P模块中。

轻松入门IPFS,这一篇就够了!|点滴资讯
问题5:IPFS的交换层包含哪些内容?

交换层模拟了P2P网络,并创建中心服务器,当服务器登记用户请求资源时,让请求同样资源的用户形成一个小集群Swarm,在这里分享数据。

问题6:IPFS的对象层包含哪些内容?

大部分数据对象都是以MerkleDag默克有向无环图的结构存在,这为内容寻址和去重提供了便利。

(1)路径

可以使用API遍历IPFS对象,路径与传统UNIX文件系统中的路径一样,Merkle DAG链接使遍历变得简单。

(2)本地对象

IPFS客户端需要一个本地存储器,一个外部系统可以为IPFS管理的对象存储以及检索本地原始数据。存储器的类型根据节点使用案例而已,在大多数情况下,这个存储器只是硬盘空间的一部分(不是被本地的leveldb来管理,就是直接被IPFS客户端管理),在其他的情况下,例如非持久性缓存,存储器就是RAM的一部分。

(3)对象锁定

希望对某个对象数据进行长期存储的节点可以执行锁定操作。以此保证此对象被保存在了该节点的本地存储器上,同时也可以递归地锁定所有相关的派生对象,这对长期存储完整的对象文件特别有用。

(4)发布对象

IPFS是全球分布的文件系统,DHT使用内容哈希寻址技术,使发布对象是公平的,安全的,完全分布式的。任何人都可以发布对象,只需要将对象的Key加入到DHT中,并且对象是通过P2P传输的方式加入进去,然后把访问路径给其他的用户。

(5)对象级别的加密

IPFS具备可以处理数据对象加密的操作。加密操作改变了对象的哈希值,定义了一个不同新的对象结构,IPFS自动的验证签名机制,用户自定义的私钥加解密数据都为对象数据提供了安全保证。同时,加密数据的链式关系也同样被保护着,因为没有解密密钥就无法遍历整个链式对象结构。

问题7:IPFS的文件层包含哪些内容?

IPFS定义了一组对象,用于在Merkle DAG之上对版本化文件系统进行建模。

这个对象模型类似于著名版本控制软件Git的数据结构:

l 块(block):一个可变大小的数据块。

l 列表(list):一个块或其他列表的集合。

l 树(tree):块,列表或其他树的集合。

l 提交(commit):树的版本历史记录中的快照。

(1)文件对象:BLOB

blob对象包含一个可寻址的数据单元,表示一个文件,当文件比较小,不需要切片时,就以Blob对象的形式存储在IPFS网络之中。

(2)文件对象:LIST

list对象由多个连接在一起的Blob组成,通常存储的是一个大文件。从某种意义上说,list的功能更适合数据互相连接的文件系统。由于list可以包含其他list,所以可能形成包括链接列表和平衡树在内的拓扑结构。

(3)文件对象:TREE

在IPFS中,Tree对象与Git的tree类似,代表一个目录,或者一个名字到哈希值的映射表,哈希值表示blob,list,其他的tree,或commit。
文件对象:COMMIT

IPFS中,commit对象代表任何对象在版本历史记录中的一个快照,它与Git的commit也非常类似,但它可以指向任何类型的对象。

(4)版本控制

commit对象代表着一个对象在历史版本中的一个特定快照。两个不同的commit之间相互比较对象数据,可以揭露出两个不同版本文件系统的区别。IPFS可以实现Git版本控制工具的所有功能,同时也可以兼容Git。

(5)文件系统路径

Merkle DAG可以看到,可以使用字符串路径API遍历IPFS对象在系统上的文件路径地址。

(6)将文件分割成LIST和BLOB

版本控制和分发大文件最主要的挑战:找到一个正确的方法来将它们分隔成独立的块。与其认为IPFS可以为每个不同类型的文件提供正确的分隔方法,不如说IPFS提供了以下的几个可选选择:

使用Rabin Fingerprints指纹算法来定义比较合适的块边界。

使用rsync和rolling-checksum算法,来检测块在版本之间的改变。

允许用户设定文件大小而调整数据块的分割策略。

(7)路径查找性能

基于路径的访问需要遍历整个对象图,检索每个对象需要在DHT中查找它的Key值,连接到对等点并检索对应的数据块。这是一笔相当大的性能开销,特别是在查找的路径具有多个路径时。IPFS充分考虑了这一点,并设计了如下的方式来缓解:

l 树缓存(tree cache):由于所有的对象都是哈希寻址的,可以被无限的缓存,另外,tree一般比较小,所以比起blob,IPFS会优先缓存tree。

l 扁平树(flattened trees):对于任何给定的tree,一个特殊的扁平树可以构建一个链表,所有对象都可以从这个tree中访问得到。在扁平树中name就是一个从原始tree分离的路径,用斜线分隔。

问题8:IPFS的命名层包含哪些内容?

IPFS形成了一个内容可寻址的DAG对象,可以在IPFS网络中发布不可更改的数据,甚至可以追踪这些对象的版本历史记录。但这样会存在一个严重的问题,当数据对象的内容更新后,发生改变的还有内容地址的命名。我们需要一种能在易变环境中保持固定命名的方案,为此,IPFS的IPNS星际文件命名系统模块就闪亮登场了。

(1)人类友好名称

IPNS是重新命名地址名称的好方式,但对人类来说,却不是十分友好和记忆,因此,IPFS使用下面的技术来增加IPNS的用户良好度。

(2)自验证命名

使用自验证的命名方案给了我们一种在加密环境下,在全局命名空间中,构架可自行认证名称的方式。

l 对等节点链接

遵循自验证文件系统(SFS)的设计理念,用户可以将其他用户节点的对象直接链接到自己的命名空间下,这有利于创建一个更信任的网络:

l DNS TXT IPNS记录

在现有的DNS系统中添加TXT记录,这样能够通过域名访问IPFS网络中的文件对象:

除此之外,IPFS还提供短地址的命名服务,类似我们现在看到的DNS和WebURL链接。

未完待续哦!!!

原创文章,作者:jiang,如若转载,请注明出处:https://ipfsdrop.com/tech/qingsongrumenipfszheyipianjiugoulediandizixun/

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

(+86)18301922335

在线咨询:点击这里给我发消息

邮件:haskell@freechains.cn

工作时间:7×24小时

QR code