了解IPFS,读这篇文章就够了
IPFS
ipf是一个协议也是一个网络,将很多种技术(P2P网络技术,bt传输技术,Git版本控制,自证明文件系统的数据传输协议等)加以结合,在这些技术上改进创新,集成了ipf网络。
IPFS本质上是一种内容可寻址、版本化、点对点超媒体的分布式存储、传输协议,目标是补充甚至取代过去使用的超文本媒体传输协议(HTTP)。
想象拥有ipf协议的互联网世界
ipf网络里的文件,会被赋予一个哈希值,是独一无二的,根据文件内容被计算出来的。这样做为了文件不会被重复存储,大大降低存储成本,减少存储资源浪费。
ipf网络可以防止自然灾害对文件的损坏,分布全球不同地方的备份,紧急恢复功能。ipf可以抵挡DDoS攻击,甚至能抵挡量子计算的攻击。
如果你存储的文件是不想别人看到的文件,在存入ipf之前对文件进行加密即可,这样即使别人拥有此文件的哈希值,还需要私钥才能查看数据。
ipf的加密性,永久性存储,会滋生一些灰色产业进来,例如发布各种无法管制的言论,盗版猖獗等问题。
ipf能做些什么
- 个人,公司文件可以存到上面。
- 数据存储。它能够极大的降低数据存储的成本,提升数据下载速度。
- 挂载个人同步的文件夹,可以自动进行版本管理,自动备份。 也就意味着未来我们将拥有无限空间的网盘,不用担心数据丢失,不用担心隐私泄露(非对称加密)。
- 带版本控制的软件包管理系统。
- 虚拟机的根文件系统。
- ipf作为虚拟机的引导文件系统:在线操作系统。
- 作为数据库:应用可以直接操作ipf的Merkle DAG数据结构,并且可以使用ipf的版本控制,缓存。 试想一下我们的数据库直接存在ipf的文件系统是什么体验吗? 自动备份,永不丢失,安全加密,无限空间,高速连接,想想就美好。
- 加密通讯平台,谁都别想窃听消息通信了。
- 作为加密CDN,作为web的CDN,CDN功能全包了。
- 永久网络,不存在不能访问的链接,跟404年说再见。
- ipf是开放的,它为所有的区块链准备好了数据存储结构,可以链接到不同的区块链项目,这就是为什么那么多的白皮书提到要和ipf链接,ipf将作为区块链的基础设施存在。
ipf在目前项目上的小试牛刀
- 又名沙:基于以太坊和ipf的社交网络
- 亚历山大:去中心化的内容发布平台
- Arbore:朋友之间的文件共享系统,相信很快就可以抛弃某度的云盘了
- dtube:利用ipf作为存储的视频分享网站
- git-ipfs-rehost:可以把github上的项目存储到ipf上
- 星际维基:建立在ipf上的wiki(土耳其封锁了维基,借助于ipf,现在已经恢复了访问)
- ipfs-search:基于ifp来说的搜索引擎
- ipfs-share:基于ifp来说的文件分享
- ipfs.pics:基于ifp来说的图片分享网站
- 轨道:基于ifp来说的分布式聊天工具
- Partyshare:一个简单的文件共享系统
- computes.io:基于ipf的分布式计算机(这个牛,把世界上的计算资源收集起来,构建一个巨大的分布式计算机)
- OpenBazaar:openbazaar是一个去中心化的淘宝,口号是“买卖自由/自由买卖”,问题是一旦用户停止运行软件,商店就下线了,借助于ipf,openbazaar2.0打造一个离线商店。
- Ubuntu:著名的linux发行版Ubuntu本正在计算把发行版本转移到ipf上来,目前正在讨论方案。
火狐浏览器:支持ipf在内的分布式协议
IPFS工作原理
- 每个文件及其其包含的所有数据块,都会转换为一个散列字符串,称为哈希指纹。
- 每个节点维护一张DHT(分布式哈希表),包含相应数据块与目标节点的对应映射关系。整个哈希表被组织成二叉树,平均查询联系节点的复杂度是O(log2N)。例如要查询10000万节点只需20跳。
- 基于内容寻址而非域名寻址。只需要通过文件或数据块的哈希值,IPFS便可自动在全网节点中找到拥有这些数据块的节点,并从节点上拉去数据。
- IPFS使用一个叫IPNS的分布式命名系统,将难于记忆的数据哈希值映射为易于记忆的字符串。这可以类比于域名与IP地址的映射关系。
IPFS技术细节
-
域名寻址和内容寻址
HTTP协议使用的域名寻址,最终会映射到最底层,找到某个域名所对应的IP地址下的某个主机,以及某个文件目录的某个文件。它不关心是否存在相同的文件,但内容寻址会通过唯一的标识去访问,并且提前检验这个标识是否已经被存储过。如果被存储过,直接从其它节点读取它,不需要重复存储,一定意义上节约了空间。
-
IPFS架构
IPFS至少有八层子协议栈,从上至下为身份、网络、路由、交换、对象、文件、命名、应用,每个协议栈各司其职,又互相搭配。
image
身份层和路由层可以一起解释。对等节点身份信息的生成以及路由规则是通过Kademlia协议生成制定,KAD协议实质是构建了一个分布式松散Hash表,简称DHT,每个加入这个DHT网络的人都要生成自己的身份信息,然后才能通过这个身份信息去负责存储这个网络里的资源信息和其他成员的联系信息。
网络层比较核心,使用的LibP2P可以支持任意传输层协议。NAT技术能让内网中的设备共用同一个外网IP,我们都体验过的家庭路由器就是这个原理。
交换层,是类似迅雷这样的BT工具。IPFS团队把BitTorrent进行了创新,叫作Bitswap,它增加了信用和帐单体系来激励节点去分享,猜测FileCoin有很大概率是基于Bitswap,用户在Bitswap里增加数据会增加信用分,分享得越多信用分越高。如果用户只去检索数据而不存数据,信用分会越来越低,其它节点会在嵌入连接时优先选择信用分高的。
对象层和文件层适合结合来谈,它们管理的是IPFS上80%的数据结构,大部分数据对象都是以MerkleDag的结构存在,这为内容寻址和去重提供了便利。文件层是一个新的数据结构,和DAG并列,采用Git一样的数据结构来支持版本快照。
命名层具有自我验证的特性(当其他用户获取该对象时,使用指纹公钥进行验签,即验证所用的公钥是否与NodeId匹配,这验证了用户发布对象的真实性,同时也获取到了可变状态),并且加入了IPNS这个巧妙的设计来使得加密后的DAG对象名可定义,增强可阅读性。
最后是应用层,IPFS核心价值就在于上面运行的应用程序,我们可以利用它类似CDN的功能,在成本很低的带宽下,去获得想要的数据,从而提升整个应用程序的效率。
-
IPFS的模块化设计
- IPFS
- Filecoin
- libp2p
- IPLD
- Multiformats
image
libp2p
在过去的相当长时间里,开发者构建一个p2p网络并不是一件容易的事情。复杂的网络环境、各种各样的通信协议和网络设备的存在使得创建大规模的点对点网络变得复杂并且困难。IPFS团队将点对点(peer-to-peer)网络的网络层从IPFS工程里面分离出来,形成一个独立的项目,这就是libp2p。该项目不仅可以供IPFS使用,也可以提供其它项目使用,作为一个p2p工程的底层协议存在。
image
libp2p的主要功能是
- 发现节点
- 连接节点
- 发现数据
- 传输数据
IPLD
IPLD定义了基于内容寻址的统一数据结构类型。它是一个转换器,可以把现有的异构的数据结构(基于内容寻址)统一成一种格式,方便不同系统之间的数据交换和互操作。
IPLD的组成:- CID(Self-describing content-addressed identifiers for distributed systems):基于内容寻址的自我描述标识
- IPLD tree:基于JSON、Protobuf和路径导航的跨协议的数据模型
- IPLD Resolvers:IPLD转换器,可以添加新的协议到IPLD里面
Multiformats
该项目的是一系列协议的集合,它在现有协议基础上对值(值:通常是具有某一项表达意义的)进行自我描述改造,即从值上就可以知道该值是如何产生的。
当前multiformats协议里面包含以下协议:- multihash - self-describing hashes
- multiaddr - self-describing network addresses
- multibase - self-describing base encodings
- multicodec - self-describing serialization
- multistream - self-describing stream network protocols
- multigram (WIP) - self-describing packet network protocols
IPFS设计
IPFS是一个分布式文件系统,它综合了以前的对等系统的成功想法,包括DHT,BitTorrent,Git和SFS。 IPFS的贡献是简化,发展和将成熟的技术连接成一个单一的内聚系统,大于其部分的总和。 IPFS提供了编写和部署应用程序的新平台,以及一个新的分发系统版本化大数据。 IPFS甚至可以演进网络本身。
IPFS是点对点的;没有节点是特权的。 IPFS节点将IPFS对象存储在本地存储中。节点彼此连接并传输对象。这些对象表示文件和其他数据结构。 IPFS协议分为一组负责不同功能的子协议:
- 1.身份 - 管理节点身份生成和验证
- 2.网络 - 管理与其他对等体的连接,使用各种底层网络协议。可配置的。
- 3.路由 - 维护信息以定位特定的对等体和对象。相应本地和远程查询。默认为DHT,但可更换。
- 4.交换 - 一种支持有效块分配的新型块交易协议(BitSwap)。模拟市场,弱化数据复制。贸易策略可替换。
- 5.对象 - 具有链接的内容寻址不可更改对象的Merkle DAG。用于表示任意数据结构,例如文件层次和通信系统。
- 6.文件 - 由git启发的版本化文件系统层次结构。
- 7.命名 - 自我认证的可变名称系统。
身份
节点由NodeId标识,这是使用S / Kademlia的静态加密难题[1]创建的公钥的密码散列。节点存储其公私钥(用密码加密)。用户可以在每次启动时自由地设置一个“新”节点身份,尽管这会损失积累的网络利益。激励节点保持不变。
首次连接时,对等体交换公钥,并检查:hash(other.PublicKey)等于other.NodeId。如果没有,则连接被终止
网络
IPFS节点与数百个其他节点进行定期通信网络中的节点,可能跨越广域网络。IPFS网络堆栈功能:
- 传输层: IPFS可以使用任何传输协议。
- 可靠性: 如果底层网络不提供可靠性,IPFS可使用uTP(LEDBAT)或SCTP来提供可靠性。
- 可连接性:IPFS还可以使用ICE NAT穿墙打洞技术。
- 完整性:可以使用哈希校验和来检查邮件的完整性。
- 可验证性:可以使用发送者的公钥使用HMAC来检查消息的真实性。
路由
IPFS节点需要一个路由系统, 这个路由系统可用于查找:
- 其他同伴的网络地址
- 专门用于服务特定对象的对等节点
IPFS使用基于S / Kademlia和Coral的DSHT。在对象大小和使用模式方面, IPFS 类似于Coral 和Mainline, 因此,IPFS DHT根据其大小对存储的值进行区分。小的值(等于或小于1KB)直接存储在DHT上。对于更大的值,DHT只存储值索引,这个索引就是一个对等节点的NodeId, 该对等节点可以提供對该类型的值的具体服务。
DSHT的接口如下:
type IPFSRouting interface {
FindPeer(node NodeId) // 获取特定NodeId的网络地址。
SetValue(key []bytes, value []bytes) // 往DHT存储一个小的元数据。
GetValue(key []bytes) // 从DHT获取元数据。
ProvideValue(key Multihash) // 声明这个节点可一个提供一个大的数据。
FindValuePeers(key Multihash, min int) // 获取服务于该大数据的节点。
}
块交换 - BitSwap协议
IPFS 中的BitSwap协议受到BitTorrent 的启发,通过对等节点间交换数据块来分发数据的。像BT一样, 每个对等节点在下载的同时不断向其他对等节点上传已下载的数据。和BT协议不同的是, BitSwap 不局限于一个torrent文件中的数据块。BitSwap 协议中存在一个永久的市场。 这个市场包括各个节点想要获取的所有块数据。而不管这些块是哪些如.torrent文件中的一部分。这些快数据可能来自文件系统中完全不相关的文件。 这个市场是由所有的节点组成的。虽然易货系统的概念意味着可以创建虚拟货币,但这将需要一个全局分类账本来跟踪货币的所有权和转移。这可以实施为BitSwap策略。
在基本情况下,BitSwap节点必须以块的形式彼此提供直接的值。只有当跨节点的块的分布是互补的时候,各取所需的时候,这才会工作的很好。 通常情况并非如此,在某些情况下,节点必须为自己的块而工作。 在节点没有其对等节点所需的(或根本没有的)情况下,它会更低的优先级去寻找对等节点想要的块。这会激励节点去缓存和传播稀有片段, 即使节点对这些片段不感兴趣。
BitSwap信用
这个协议必须带有激励机制, 去激励节点去seed 其他节点所需要的块,而它们本身是不需要这些块的。 因此, BitSwap的节点很积极去给对端节点发送块,期待获得报酬。但必须防止水蛭攻击(空负载节点从不共享块),一个简单的类似信用的系统解决了这些问题:
- 对等节点间会追踪他们的平衡(通过字节认证的方式)。
- 随着债务增加而概率降低,对等者概率的向债务人发送块。
BitSwap的策略
BitSwap 对等节点采用很多不同的策略,这些策略对整个数据块的交换执行力产生了不同的巨大影响。BitSwap 对等体可以类似地实现一系列的策略(良好和恶意)。对于功能的选择,应该瞄准:
- 为整个交易和节点最大化交易能力。
- 为了防止空负载节点利用和损害交易。
- 高效抵制未知策略。
- 对可信任的对等节点更宽容。
当节点负债比例超过节点已建立信贷的两倍,发送到负债节点的概率就会急速下降。负债比是信任的衡量标准:对于之前成功的互换过很多数据的节点会宽容债务,而对不信任不了解的节点会严格很多。
- 给与那些创造很多节点的攻击者(sybill 攻击)一个障碍。
- 保护了之前成功交易节点之间的关系,即使这个节点暂时无法提供数据。
- 最终阻塞那些关系已经恶化的节点之间的通信,直到他们被再次证明。
BitSwap账本
BitSwap节点保存了一个记录与所有其他节点之间交易的账本。这个可以让节点追踪历史记录以及避免被篡改。当激活了一个链接,BitSwap节点就会互换它们账本信息。如果这些账本信息并不完全相同,分类账本将会重新初始化, 那些应计信贷和债务会丢失。 恶意节点会有意去失去“这些“账本, 从而期望清除自己的债务。节点是不太可能在失去了应计信托的情况下还能累积足够的债务去授权认证。伙伴节点可以自由的将其视为不当行为, 拒绝交易。
Merkle DAG
DHT和BitSwap允许IPFS构造一个庞大的点对点系统用来快速稳定的分发和存储。最主要的是,IPFS建造了一个Merkle DAG,一个无回路有向图,对象之间的links都是hash加密嵌入在源目标中。这是Git数据结构的一种推广。
Merkle DAG拥有如下功能:
- 内容寻址:使用多重哈希来唯一识别一个数据块的内容,包括links。
- 防篡改:可以方便的检查哈希值来确认数据是否被篡改。
- 去重:由于内容相同的数据块哈希是相同的,可以很容易去掉重复的数据,节省存储空间。
IPFS通过Merkle DAG让应用完全控制对象的数据结构,应用可以随意定义自己的data类型和结构,甚至可以是一些IPFS系统无法理解的数据结构,灵活度非常的大。
文件
IPFS在Merkle DAG上还为模型化版本文件系统定义了一组对象。这个对象模型与Git比较相似:
- Block:一个可变大小的数据块
- List:块或者其他链表的集合
- Tree:块,链表,或者其他树的集合
- Commit:树在版本历史记录中的一个快照
文件对象:BLOB
blob对象代表一个文件且包含一个可寻址的数据单元,IPFS的blobs就像Git的blobs或者文件系统数据块。它们存储用户的数据。需要留意的是IPFS文件可以使用lists或者blobs来表示。Blobs没有links。
文件对象: LIST
List对象代表着由几个IPFS的blobs连接成的大文件或者重复数据删除文件。Lists包含着有序的blob序列或list对象。从某种程度上而言,IPFS的list函数就像一个间接块的文件系统。
文件对象:TREE
IPFS中的tree对象与Git中相似,它代表着一个目录,一个名字到哈希值的映射。
文件对象:COMMIT
IPFS中的commit对象代表任何对象在版本历史记录中的一个快照。与Git中类似,但是它能够表示任何类型的对象。它同样link着发起对象。
IPNS:命名以及易变状态
目前为止,IPFS桟形成了一个对等块交换组成一个内容可寻址的DAG对象。这提供了发布和获取不可改变的对象。这甚至可以跟踪这些对象的版本历史记录。但是,这里有一个关键成分遗漏了:易变的命名。没有这个,发送IPFS的links,所有新内容的通信肯定都会有所偏差。现在所需就是能有某些方法可以获取相同路径的的易变状态。
自我认证认文件系统-SFS
使用SFS中的命名方案,给我们提供了一个种可以构建自我认证名称的方法,
在一个加密指定的全局命名空间中,这是可变的。IPFS的方案如下:
- 在IPFS中:NodeId = hash(node.PubKey)
- 给每个用户分配一个可变的命名空间,在此路径下:/ipns/
- 一个用户可以在此路径下发布一个用自己私钥签名的对象,比如说:/ipns/XLF2ipQ4jD3UdeX5xp1KBgeHRhemUtaA8Vm/
- 当其他用户获取对象时,他们可以检测签名是否与公钥和NodeId匹配。这个验证了用户发布对象的真实性,达到了可变状态的获取。
提出了两个引人注目的实现:分布式信任链,和平等共享的全局命名空间。SFS引入了一种自我建构技术—注册文件:寻址远程文件系统使用以下格式:
/sfs/<Location>:<HostID>
Location:代表的是服务网络地方
HostID = hash(public_key || Location)
因此SFS文件系统的名字认证了它的服务,用户可以通过服务提供的公钥来验证,协商一个共享的私钥,保证所有的通信。所有的SFS实例都共享了一个全局的命名空间,这个命名空间的名称分配是加密的,不被任何中心化的body控制。
人类友好名称
IPNS的确是一个分配和在分配名称的好方法,但是对用户却不是十分友好的,因为它使用很长的哈希值作为名称,众所周知这样的名称很难被记住。IPNS足够应付URLs,但对于很多线下的传输工作就没有这么好用了。因此,IPFS使用下面的技术来增加IPNS的用户友好度。
对等节点Links被SFS所鼓舞,用户可以直接将其他用户的对象link到自己的对象上(命令空间,家目录等等)。这有一个好处就是创建了一个可信任的Web(也支持老的真实性认证模型):
# Alice links 到Bob上
ipfs link /<alice-pk-hash>/friends/bob /<bob-pk-hash>
# Eve links 到Alice上
ipfs link /<eve-pk-hash/friends/alice /<alice-pk-hash>
# Eve 也可以访问Bob
/<eve-pk-hash/friends/alice/friends/bob
# 访问Verisign 认证域
/<verisign-pk-hash>/foo.com
DNS TXT IPNS 记录
如果/ipns/是一个有效的域名称,IPFS会在DNS TXT记录中查找关键的ipns。IPFS会将查找到的值翻译为一个对象的哈希值或者另一个ipns的路径:
# DNS TXT 记录
ipfs.benet.ai. TXT "ipfs=XLF2ipQ4jD3U ..."
# 表现为符号链接
ln -s /ipns/XLF2ipQ4jD3U /ipns/fs.benet.ai
Filecoin协议是如何运行的?
分布式哈希表(DHT)
分布式哈希表被广泛用于协调和维护关于对等系统的元数据。比如,MainlineDHT是一个去中心化哈希表,他可追踪查找所有的对等节点。
Kademlia DHT
- 通过大量网络进行高效查询:查询平均联系人O(log2N)节点。(例如,20跳10万个节点的网络)
- 低协调开销:优化数量的控制消息发送到其他节点。
- 抵抗各种攻击,喜欢长寿节点。
- 在对等应用中广泛使用。
Coral DSHT
虽然一些对等文件系统直接在DHT中存储数据块,这种“数据存储在不需要的节点会乱费存储和贷款”。Coral DSHT扩展了Kademlia三个特别重要的方式:
- Kademlia在ids为“最近”(使用XOR-distance)的关键节点中存储值,不考虑应用程序数据的局部性,忽略“远”可能已经拥有数据的节点,并强制“最近”节点存储它,无论它们是否需要,这浪费了大量的存储和带宽。相反,Coral存储了地址,该地址的对等节点可以提供相应的数据块。
- Coral将DHT API从get_value(key)换成了get_any_values(key)(DSHT中的“sloppy”)中。这仍然是因为Coral用户只需要一个(工作)的对等体,而不是完整的列表。作为回报,Coral可以仅将子集分配到“最近”的节点,避免热点(当密钥变得流行时,重载所有最近的节点)。
- 另外,Coral根据区域和大小组织了一个称为群集的独立DSHT层次结构。这使得节点首先查询其区域中的对等体,“查找附近的数据而不查询远程节点”[5]并大大减少查找的延迟。
S/Kademlia DHT
S/Kademlia扩展了Kademlia,用于防止恶意的攻击,有如下两方面的方法:
- S/Kad 提供了方案来保证NodeId的生成已经防止Sybill攻击。它需要节点产生PKI公私钥对。从中导出他们的身份,并彼此间签名。一个方案使用POW工作量证明,使得生成Sybills成本高昂。
- S/Kad 节点在不相交的路径上查找直, 即使网络中存在大量的不诚实节点,也能确保诚实节点可以互相链接。即使网络中存在一半的不诚实节点,S/Kad 也能达到85%的成功率。
块交换 - BitTorrent
BitTorrent是一个广泛成功应用的点对点共享文件系统,它可以在存在不信任的对等节点(群集)的协作网络中分发各自的文件数据片。从BitTorrent和它的生态系统的关键特征, IPFS得到启示如下:
- BitTorrent的数据交换协议使用了一种bit-for-bat的激励策略,可以奖励对其他方面做贡献的节点,惩罚只榨取对方资源的节点。
- BitTorrent对等体跟踪文件的可用性,优先发送稀有片段。这减轻了seeds节点的负担, 让non-seeds节点有能力互相交易。
- 对于一些剥削带宽共享策略, BitTorrent的标准tit-for-tat策略是非常脆弱的。 然而,PropShare是一种不同的对等带宽分配策略, 可以更好的抵制剥削战略, 提高群集的表现。
版本控制系统-Git
版本控制系统提供了对随时间变化的文件进行建模的设施,并有效地分发不同的版本。流行版本控制系统Git提供了强大的Merkle DAG对象模型,以分布式友好的方式捕获对文件系统树的更改。
- 不可更改的对象表示文件(blob),目录(树)和更改(提交)。
- 通过加密hash对象的内容,让对象可寻址。
- 链接到其他对象是嵌入的,形成一个Merkle DAG。这提供了很多有用的完整和work-flow属性。
- 很多版本元数据(分支,标示等等)都只是指针引用,因此创建和更新的代价都小。
- 版本改变只是更新引用或者添加对象。
- 分布式版本改变对其他用户而言只是转移对象和更新远程引用。
Filecoin协议里有两个概念:
- 存储市场
- 检索市场
普通用户在ipf网络存储数据也可能是免费的,只是这些费用转嫁到那些基于ipf协议的应用开发商上,他们会用另外一种方式薅你身上的羊的毛。
Filecoin的共识机制(存储证明PoSt)
Filecoin的共识机制相对环保,淘宝店主(矿工)发完货(完成存储),买家是要确认收货(确认矿工完成存储),这里的“确认矿工完成存储”,就是Filecoin的共识机制(存储证明,PoSt),这个“确认矿工完成存储”会一直存在于Filecoin网络中,用户可以随时查看。
Filecoin把矿工在网络中的当前存储数据相对于整个网络的存储比例转化为矿工投票权,利用存储证明(PoSt)来产生共识,不用像比特币那样浪费计算资源和能源,并且能激励矿工投入更多的硬盘为网络做贡献。
挖矿
- 存储矿工
网络:没有特别的要求,普通家庭网络就可以满足,但不排除官方修改filecoin协议。
硬盘:硬盘是最重要的,存储是长期开着,24小时状态下,所以需要一个能够长时间稳定运行存储的硬盘,监控硬盘的性价比会更高。
矿机:后续filecoin会推出挖矿软件,矿机只要能流畅运行挖矿软件即可。并不需要特殊的cpu、特殊的硬件。普通家用机的配置就能运行。
- 检索矿工
网络:需要高网速、低延迟。重要的是搞到大型流量上传渠道,比如网吧,或者政府的流量渠道。
硬盘:没有要求。
矿机:后续filecoin会推出挖矿软件,矿机只要能流畅运行挖矿软件即可。并不需要特殊的cpu、特殊的硬件。普通家用机的配置就能运行。