家人们
点击上方蓝字关注我
IPFS(InterPlanetary File System)是一个点对点的去中心化存储系统,旨在使互联网更加开放、安全、快速和持久。它通过创建一个全球性的分布式文件系统,允许用户存储、请求和传输数据,而无需依赖单一的服务器或存储位置。
IPFS是什么
IPFS(InterPlanetary File System)是一个分布式的文件存储与访问系统,旨在创建一个持久的、全球性的点对点文件共享网络。
它并不是我们通俗意义上理解的“超大匿名网盘”,而是一种去中心化网络协议,通过它,人们可以存储和共享数据文件,这些文件被分散存储在世界各地的多台计算机上。
与传统的基于服务器的网络架构不同,IPFS 采用了内容寻址的方式来存储数据,每个文件和所有文件块都有一个唯一的CID作为地址。这意味着,当我们访问一个文件时,实际上是通过它的CID来获取它,而不是通过存储它的服务器位置。
IPFS的一些关键特性:
-
去中心化:没有中心服务器,文件分布式存储在网络上的多个节点中,提高网络的鲁棒性
-
内容寻址:IPFS 使用文件的内容来生成一个唯一的CID;当请求文件时,网络通过CID来寻找存储该内容的节点
-
版本控制:IPFS 天然的支持版本控制,每次文件被修改,都会生成一个新的CID,从而保留了文件的历史版本
-
高效分发:IPFS 采用P2P传输技术,可以更高效地分发大型文件;一旦某个节点下载了文件的一部分,它就可以成为其他节点的数据源
-
持久性:由于文件被分散存储在全球范围内的节点上,即使某些节点离线,只要有足够的节点存活,文件就不会丢失
IPFS的设计目标是为了解决当前互联网结构的一些根本性问题,如集中化、数据孤岛、效率低下和数据持久性问题。通过提供一个去中心化的方式来存储和分享数据,IPFS旨在构建一个更加快速、开放和安全的新互联网(听起来好像有点耳熟哦)
内容标识符(Content Identifier CID)
首先要澄清一点,CID != 哈希值
CID 确实基于哈希算法生成的值,但 CID 不仅仅是文件内容通过哈希算法(如SHA-256)直接生成的哈希值。
CID实际上是一种结构化数据,旨在提供关于数据本身的更多元信息,而非单纯的文件哈希。CID可以包含以下信息:
-
版本号:目前是CIDv0或CIDv1,如果 CID 是以 “Qm” 开头的 46 个字符,则它是 CIDv0(2024年4月1日);
-
多哈希前缀:这部分包括用于生成哈希的算法标识和哈希值长度,CIDv0只支持SHA-256和base58编码;CIDv1更灵活,可以支持例如SHA-3、Blake2b等;
-
哈希值:通过选定的哈希算法计算得到的实际哈希值
因此简单来说,CID是一个封装了哈希值、哈希算法信息和其他元数据的复合结构,它为IPFS中的内容提供了一个全球唯一的标识符,而不仅仅是一个裸露的哈希值。这种设计使得CID不仅能指向数据内容,还能提供关于如何解释该内容的信息,从而增强了IPFS的灵活性和可扩展性
CID怎么算出来的?
IPFS采用了一个名为Merkle DAG(有向无环图)的结构,用于处理和存储数据。当一个文件被添加到IPFS时:
-
文件分块:首先,IPFS有默认的块大小限制(256KB),如果文件超过限制,就会被分块
-
计算哈希值:接下来,IPFS会对每个独立的文件块计算哈希值
-
创建Merkle DAG:每个文件块的哈希值会被用来构建一个Merkle DAG,其中包含了文件块之间的关系信息;对于大文件,这个DAG包含了指向各个分块的链接(哈希值),以及这些块如何组合成完整文件的信息
-
最终文件的CID:最后,IPFS会计算这个Merkle DAG的根节点的哈希值,并基于这个哈希值生成文件的CID
CID寻址过程概述
在IPFS的文件寻址中,小于256KB的文件和超过256KB的文件寻址方式略有差别,我大概讲一下吧:
-
直接哈希计算:整个文件作为单个数据块处理,IPFS会对整个文件内容计算哈希值。
-
生成CID:基于文件内容的哈希值,IPFS生成一个CID。这个CID代表了整个文件,因为文件没有被分块处理
-
寻址和检索:当请求这样的文件时,提供文件的CID即可直接定位和检索文件
对于大文件,处理过程包括分块和创建Merkle DAG结构,具体如下:
-
分块:首先,大文件会被分割成多个小于或等于256KB的块
-
哈希计算:IPFS对每个独立的文件块计算哈希值
-
构建Merkle DAG:接着,基于这些分块的哈希值,IPFS构建一个Merkle DAG。每个块成为DAG的一个节点,如果文件很大,则这些块节点通过额外的索引节点链接起来,最终形成一个包含所有文件块信息的树状结构。
-
生成根CID:对于大文件,IPFS计算Merkle DAG根节点的哈希值,并基于这个哈希值生成文件的CID
-
寻址和检索:从IPFS网络中请求一个大文件时,提供的是这个根CID。IPFS通过这个CID定位Merkle DAG的根节点,然后逐层向下查找,直到找到所有的文件块。文件的接收方需要按照Merkle DAG的结构从网络中检索所有块,并按正确顺序重组这些块以恢复原始文件。
总的来说,不论文件大小,IPFS中的每个文件或文件块都通过计算其内容的哈希值来生成唯一的CID。小文件直接生成一个CID,而大文件则通过Merkle DAG结构生成一个根CID,这个根CID通过Merkle DAG指向分块的CID,从而支持对整个文件的寻址和检索。
这不就是BT下载换了个名字嘛?!
还是差别挺大的,首先IPFS确实借鉴了早期P2P网络下载技术的一些基本原理,但它在技术实现、设计目标和应用范围上都有显著的扩展和改进。以下是一些关键区别:
P2P网络下载:BT 是基于位置的寻址,每个BT下载任务依赖于一个种子文件(.torrent),这个文件包含了文件的元数据和一个或多个跟踪器(Tracker)地址。跟踪器协助下载者(Leecher)找到分享者(Seeder)的位置,从而开始文件的下载。BT协议中也使用了一个哈希列表来验证文件块的完整性,但这个哈希列表包含在种子文件中,而不是用于直接的文件寻址
IPFS:通过文件的内容生成一个唯一的标识符(CID),IPFS使用DHT来实现节点的发现和内容的定位,当IPFS节点收到一个CID请求时,它使用DHT来找出存储该内容的节点,这个过程是动态的,全部基于网络中的节点共享的信息
我的理解:
寻址机制:IPFS的核心是“你请求的是什么”(基于内容),而BT关注的是“你从哪里得到它”(基于位置)。IPFS的寻址机制使得同一内容的任何副本都可以满足请求,而不依赖于特定的节点。
依赖结构:BT依赖于中心化的跟踪器(尽管存在DHT扩展)来连接分享者和下载者;而IPFS旨在创建一个完全去中心化的网络,其中文件的位置是动态发现的,而不依赖于中央协调者。
BT:在早期的P2P网络中,数据的可用性强依赖于种子和对等节点的在线状态。如果分享某个文件的节点全部离线,那么这个文件就无法下载。
IPFS:IPFS的目标是提高数据的持久性和可靠性。通过全球的节点分布式存储数据,即使某些节点离线,只要网络中还有其他节点存有该数据的副本,文件就仍然可被检索到。
BT:不直接支持文件的版本控制。任何文件更新都需要创建新的种子文件,并重新开始分发过程。
IPFS:IPFS通过Merkle DAG数据结构天然支持版本控制,每个文件或数据块的更改都会产生新的哈希值,这使得旧版本的内容和新版本可以并存。
BT:早期的P2P网络在分发大规模文件时非常有效,但在处理大量小文件或实时数据时可能不那么高效。
IPFS:IPFS旨在优化数据的检索速度和网络效率,无论是对大文件还是小文件。IPFS使用了内容分发网络(CDN)的概念,通过缓存和智能路由来加速数据的访问速度。
有人会有疑惑:
我输入CID之后,通过DHT查找到了相应的Merkle DAG和每一个文件区块的位置,但是这里文件区块的位置,是URL吗?还是IP地址?
实际上,当通过CID在IPFS网络上请求文件时,通过DHT(分布式哈希表)查找到相应的Merkle DAG和每个文件区块的过程,并不会直接给出一个类似于传统互联网上的URL或者明确的IP地址。相反,我会得到指向存储该文件区块的节点的信息,这里的“位置”指的是网络中的节点标识,而不是具体的网络地址:
在IPFS网络中,每个节点都有一个唯一的节点ID,这个ID是基于节点的公钥的哈希值生成的。当查找文件区块时,我实际上是在查找持有这个文件区块的节点的ID。
当DHT用于定位文件区块时,它实际上是在查找哪些节点宣称拥有该区块的数据。
这个查找过程返回的是持有该文件区块的节点的ID列表,而不是传统意义上的URL或IP地址。
一旦我知道了哪些节点拥有我需要的文件区块,我的IPFS客户端会尝试与这些节点建立连接。IPFS网络使用的是一个叫做libp2p的网络库,这个库可以处理多种传输协议和网络条件,从而找到和目标节点通信的最佳方式。
在成功建立连接后,我的节点会直接从其他节点下载文件区块。这个过程使用的是点对点通信,传输的是文件的数据,而不是通过HTTP这样的协议请求URL。
总结
当我在IPFS中请求文件时,整个查找和传输过程是基于节点ID和点对点网络的,与传统的基于URL或IP地址的网络通信模式或BT还是有很大区别的
使用IPFS Desktop是最简单的方式:
https://docs.ipfs.tech/install/ipfs-desktop/
那我是不是可以这样理解,假如我使用Windows电脑,我下载IPFS desktop并保持其运行,我就在这个P2P网络中发挥了相应的作用?
Yep!
当我在Windows电脑上下载并运行IPFS Desktop,我的设备会成为IPFS网络中的一个节点。只要IPFS Desktop在运行,我的电脑就会参与到这个点对点(P2P)网络中,发挥相应的作用,包括:
-
存储和分享文件:我可以通过IPFS Desktop上传文件到网络,并将文件分享给其他人。这些文件被存储在我的设备上,并可由网络中的其他节点检索。
-
检索文件:我也可以使用IPFS Desktop检索网络上的其他节点共享的文件。当我访问一个文件时,如果这个文件不在我的本地节点上,IPFS会从网络中找到拥有这个文件的节点,并将文件传输到我的设备上。
-
帮助网络运行:除了直接与我上传或下载的文件相关的活动外,我的节点还会参与网络的维护活动,如路由信息和帮助传输数据包给其他节点,即使这些数据包中的信息不是直接由我请求或提供的。
-
提高数据的可用性和冗余:通过将数据分布存储在全球各地的节点上,IPFS旨在提高数据的可用性和持久性(虽然我没有主动进行大量的文件共享)。
通过这样的方式,每个加入网络的节点都为IPFS的去中心化特性、数据的持久性、以及网络的整体性能做出了贡献。
点点赞 点点关注 点点文末广告 抱拳了家人们
创作不易
关注一下
帮忙点点文末广告
原文始发于微信公众号(imBobby的自留地):去中心化存储系统 IPFS 详解与示例