tp官网|ipfs

作者: tp官网
2024-03-07 19:21:33

IPFS是什么?看这篇文章就够了 - 知乎

IPFS是什么?看这篇文章就够了 - 知乎切换模式写文章登录/注册IPFS是什么?看这篇文章就够了Ty160M2区块链爱好者IPFS诞生于2014年,他是一个点对点的超媒体协议,他可以让互联网更快、更安全、更开放,业界称之为“下一代”互联网标准。 IPFS官网:https://ipfs.io/什么是IPFS星际文件系统(InterPlanetary File System)。IPFS,是点到点的超媒体协议,它让网络更快、更安全、更开放。说简单一点,它就是一个去中心化互联网。说技术一点,它是一个基于分布式哈希表DHT进行内容寻址的,基于git模型版本管理的,基于默克尔对象关联的,基于点对点技术的,基于全球化命名空间IPNS的,基于各种技术的,一种分布式文件系统。为什么需要IPFS现代社会中互联网对我们非常重要,它是我们生活、工作、学习、消费、娱乐和社交不可获取的媒介,但当下中心化的互联网有很多问题。中心化互联网效率低,成本高,HTTP是一个请求响应式协议,大家从一个中心服务商索取数据,服务器商构建大规模的服务器集群,服务全世界的用户。这,在高峰期,服务阻塞延迟,低峰期,大量资源闲置浪费。IPFS是通过激励,发动大量用户共享存储和带宽,资源分享和获取都在一个闭环的生态。因为网络带宽都被大文件消耗了,比如视频文件,很多都是重复数据,IPFS能有效的去重文件,消除冗余。所以IPFS能更高效的利用带宽,降低成本。目前互联网特别容易丢失数据,IPFS能永远保存有价值的数据。今天的互联网严重依赖主干网,一旦主干网发生故障,就会出现大规模服务中段或延迟,IPFS不依赖主干网,即便是网络不发达的地区,或者发生了灾害的地区,IPFS也能有很好的表现。中心化的网络非常容易引入审查机制,每个government都很容易干掉某个网站或者app。现在,用户对互联网服务性能要求越来越高,响应快、低延迟、4K无码高清视频,大的中心化公司,能快速集中资金,做出用户体验更好的产品,但这些成本是通过广告费、会员费和竞价搜索排名转嫁到消费者头上。用户是没有选择权的。IPFS希望超越HTTP协议,并构建一个更好的互联网生态。从技术角度看,IPFS是一个协议,它借鉴了许多技术,(P2P+BitTorrent+Git+Hash+kademlia DHT+SFS+Merkel DAG等等)。通过这些技术,IPFS能将网站、应用、文件和各种数据,建立在点对点分布式网络上,并且高效的索引,这种高效的核心在于它是基于内容寻址的。互联网上任何一个资源,都需要地址来找到它们,可能是IP地址、域名、文件的系统路径或者Nginx反向代理的路径。总之得有一个地址,这个地址指向哪个资源,就返回什么资源,如果资源的地址变了,或者给的地址失效了,就无法获取资源。但我们如果真的很需要这个资源,恰好之前有人下载过这个资源,并存在他的电脑上,我们很想找到这个人,因为我们并不在乎资源在什么位置,我们只在乎这个资源的内容是不是我们想要的,那这种基于位置,也就是location的寻址就没用了,我们需要一种新的寻址模式,基于内容content的寻址,IPFS就是基于内容的寻址,它的地址长这样↓IPFS实现内容寻址的工作原理第一步:将文件分割成一些小块blocks,并且分别打上hash指纹,hash指纹是一串字符,能够跟它的数据块一一对应,相当于我们每个人和自己指纹的关系。通过这个hash可以找到这个文件数据。第二步:IPFS去除重复文件,因为每个文件有了对应的哈希值,可以非常方便的找到重复的文件,最终只保留一个对象,当然每个节点都可以保留,这个文件对象的备份。第三步:每个IPFS网络节点都去存储它需要的数据,用一个叫DHT的表,来记录每个节点存储了哪些数据。下图左边Key代表文件内容的Hash(CID),右边的Value代表内容所在的节点(PeerID),这一条DHT数据表示,CID是QmCheese的数据块,存在QmRichard这个用户的设备上。第四步:当我们寻找或下载一个文件时,我们先计算这个文件的Hash指纹,通过指纹向其他节点寻找文件,当然获取他人的资源是需要成本的,别人给我分享资源也将得到回报,这种激励模式叫BitSwap。IPFS文件时如何存储和共享的IPFS object

DATA "Hello World"

Links []IPFS的文件都是通过对象的结构来存储的,每个对象包含数据Data项和连接Links数组,Data不超过256K,Data是一串文本“Hello World”,如果数据大于256K,比如图片或者视频,我们将拆分多个对象,都不超过256K,然后再建立一个更上层的对象,将他们归纳起来,就像一个文件夹,所以IPFS的文件结构,很想UNIX文件系统。还有一个问题,这些寻址链接都是通过内容查找的,如果一个文件更新了内容,那么Hash就变了,之前的索引就失效了,所以类似区块链一样,IPFS数据是不可变的,为了追踪文件的更新,IPFS引入了版本控制模型,IPFS版本控制模型和Git基本一致,Git是常用的版本控制系统,用来记录、追踪和同步文件的版本更新,每次更新的版本快照我们叫commit。IPFS最大大问题是不能保证文件始终有资源,比如一个文件在4个节点有备份,如果这4个节点离线或断开,我们就无法获取这个文件数据,类似BT下载就没有种子了。我们有2种方案解决这个问题:增加激励机制,鼓励节点多多存储文件,并在长期在线分享。主动分发文件,保证一直有足够量的在线备份,这是Filecoin要做的事。Filecoin和IPFS是同一个团队开发的,他是搭建在IPFS上的一个区块链应用。Filecoin构建了去中心化的存储市场,如果你有空闲的存储空间,可以通过Filecoin分享给别人,赚取收益,Filecoin也用奖励,来激励用户尽可能多的保持节点在线,并且保证文件有足够多的备份。IPFS已经建立了相对成熟的技术架构,他是去中心化产品开发者的首选存储技术方案,这些应用都在用IPFS技术,这里大多数是去中心化应用。IPFS还有一个经典案例,2017年土耳其政府block了维基百科,开发者在IPFS上搭建了一个去中心化的维基百科镜像,因为IPFS没有中心服务器,节点就像星星之火分布在世界各地,土耳其政府就无法再墙掉这个网站了。IPFS星际文件系统,一个如此带有科幻感和未来感的名字!他是一个适合跨越“星际”间使用的文件系统,在星球之间传输信号,延迟是比较大的,比如火星和地球之间,传输信号的时间在4~24分钟,那么我们要是在火星上访问地球上的网页,最快8分钟,最慢48分钟。如果有了IPFS系统,火星上查看了地球上的网页后,把网页数据存储下来,可以作为一个节点分享给其他火星人,这样,火星人的上网体验就快多了,所以我们给IPFS起名星际文件系统,一个去中心化的互联网文件分发协议,他会让互联网更快、更安全、更开放!发布于 2022-10-31 15:01IPFSWeb3​赞同 29​​3 条评论​分享​喜欢​收藏​申请

GitHub - ipfs/ipfs: Peer-to-peer hypermedia protocol

GitHub - ipfs/ipfs: Peer-to-peer hypermedia protocol

Skip to content

Toggle navigation

Sign in

Product

Actions

Automate any workflow

Packages

Host and manage packages

Security

Find and fix vulnerabilities

Codespaces

Instant dev environments

Copilot

Write better code with AI

Code review

Manage code changes

Issues

Plan and track work

Discussions

Collaborate outside of code

Explore

All features

Documentation

GitHub Skills

Blog

Solutions

For

Enterprise

Teams

Startups

Education

By Solution

CI/CD & Automation

DevOps

DevSecOps

Resources

Learning Pathways

White papers, Ebooks, Webinars

Customer Stories

Partners

Open Source

GitHub Sponsors

Fund open source developers

The ReadME Project

GitHub community articles

Repositories

Topics

Trending

Collections

Pricing

Search or jump to...

Search code, repositories, users, issues, pull requests...

Search

Clear

Search syntax tips

Provide feedback

We read every piece of feedback, and take your input very seriously.

Include my email address so I can be contacted

Cancel

Submit feedback

Saved searches

Use saved searches to filter your results more quickly

Name

Query

To see all available qualifiers, see our documentation.

Cancel

Create saved search

Sign in

Sign up

You signed in with another tab or window. Reload to refresh your session.

You signed out in another tab or window. Reload to refresh your session.

You switched accounts on another tab or window. Reload to refresh your session.

Dismiss alert

ipfs

/

ipfs

Public

Notifications

Fork

1.5k

Star

22.5k

Peer-to-peer hypermedia protocol

ipfs.tech

License

MIT license

22.5k

stars

1.5k

forks

Branches

Tags

Activity

Star

Notifications

Code

Issues

4

Pull requests

1

Discussions

Actions

Security

Insights

Additional navigation options

Code

Issues

Pull requests

Discussions

Actions

Security

Insights

ipfs/ipfs

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

 masterBranchesTagsGo to fileCodeFolders and filesNameNameLast commit messageLast commit dateLatest commit History410 Commits.github.github  LICENSELICENSE  README.mdREADME.md  ipfs-p2p-file-system.pdfipfs-p2p-file-system.pdf  View all filesRepository files navigationREADMELicenseIPFS is an open system to manage data without a central server

Check out our website at ipfs.tech.

For papers on IPFS, please see the Academic Papers section of the IPFS Docs.

License

MIT.

About

Peer-to-peer hypermedia protocol

ipfs.tech

Topics

paper

protocol

ipfs

p2p

multiformats

ipld

js-ipfs

ipfs-protocol

ipfs-web

Resources

Readme

License

MIT license

Activity

Custom properties

Stars

22.5k

stars

Watchers

977

watching

Forks

1.5k

forks

Report repository

Releases

No releases published

Packages

0

No packages published

Contributors

78

+ 64 contributors

Footer

© 2024 GitHub, Inc.

Footer navigation

Terms

Privacy

Security

Status

Docs

Contact

Manage cookies

Do not share my personal information

You can’t perform that action at this time.

史上最通俗易懂的IPFS小白入门指南 - 知乎

史上最通俗易懂的IPFS小白入门指南 - 知乎切换模式写文章登录/注册史上最通俗易懂的IPFS小白入门指南白鲸IPFS(Inter Planetary File System即星际文件系统)是一种基于内容寻址、版本化、点对点的超媒体传输协议,允许网络中的参与者互相存储、索取和传输可验证的数据,对标http的新一代通信协议。IPFS的目标是打造一个更加开放、快速、安全的互联网。IPFS产生的背景2014年5月,斯坦福大学计算机硕士毕业的Juan Benet创立了协议实验室(Protocol Lab)。协议实验室是一个网络协议的研究、开发和部署的实验室,致力于构建协议、系统和工具来改进互联网的工作方式,并关注如何存储、定位和传输信息。协议实验室的目标是用新的技术突破、伟大的用户体验设计和开源的方法来解决传统互联网的种种弊端,并创建了IPFS、Filecoin、libp2p、IPLD、Multiformats等五个项目。IPFS概述IPFS(InterPlanetary File System即星际文件系统)是一种基于内容寻址、版本化、点对点的超媒体传输协议,是一个P2P的分布式文件系统,对标http的新一代通信协议,目标是打造一个更加开放、快速、安全的互联网。IPFS可以被视为一个单一的BitTorrent群,交换对象在一个Git仓库,提供了一种高通量处理的依托于内容寻址超链接的块存储模型。对于一个存放在IPFS网络的文件资源,通过这个文件资源的内容生成的唯一编码去访问。IPFS可以讲数据分片存储到分布式的存储节点,与BitTorrent类似,在访问时不需要关系存储在哪里,可以从多个存储节点分片获取。IPFS继承了Git版本管理技术,从而可以使用内容的升级变化。为了实现真实性、不可篡改性,IPFS维护一个分布式的哈希表,实现一种Merkle DAG的数据结构,还结合了自我证明单命名空间。IPFS中没有单节点故障,且众多节点无须信任彼此。所以,IPFS是集合了BitTorrent—BT协议技术、Git—版块化技术、DHT—分布式哈希表、SFS—自认证命名技术这四个成熟技术组合形成的一种通讯协议方式,允许网络中的参与者互相存储、索取和传输可验证的数据。IPFS的目标是取代HTTP,打造一个更加开放、快速、安全的互联网。HTTP协议的弊端我们现在使用互联网都是在http或https协议下运行的,http协议也就是超文本传输协议,是用于从万维网服务器传输超文本到本地浏览器的传送协议,从1990年提出至今已经近30年了,他对于目前互联网的爆炸性成长居功至伟,成就了互联网的繁荣。但是HTTP协议是基于C/S架构下的互联网通信协议,基于主干网络中心化运行的机制,也存在诸多弊端。首先,互联网上的数据经常因为文件被删除或服务器关闭而永久被抹去。有人统计过目前互联网上的web页面平均保存寿命只有100天左右,我们经常看到一些网站出现“404错误”。近几年,新浪网盘、腾讯微云、金山快盘等网盘纷纷关闭,如果你不把数据下载到本地硬盘的话,你在网盘上的数据就会被清零。IPFS提供了文件的历史版本回溯功能,可以很容易的查看文件的历史版本, 且数据无法删除,可以得到永久保存其次,主干网络运行效率低,使用成本高。由于中心化的通讯模式导致所有终端都要从一个Web服务器查找数据,相同的文件会在不同的服务器上重复存储,这就要求服务器的带宽很大。使用HTTP协议每次需要从中心化的服务器下载完整的文件,速度慢、效率低。IPFS是基于内容寻址的存储模式,相同的文件都不会重复存储,它会把过剩的资源挤压下来,包括存储空间都释放出来,数据存储成本就会降低。如果改用P2P的方式下载,带宽使用成本可以节省近60%。第三,主干网络并发机制制约互联网访问速度。这种中心化主干网络的模式也导致在高并发情况下网络访问时候的拥堵,最典型的就是春运抢购火车票以及双11剁手节的时候。第四,中心化限制了web的成长。现在的互联网是由数百万个分布在世界各地的服务器构成的,是一个高度中心化的网络。在现有的http协议下,所有的数据都保存在这些中心化服务器上,互联网巨头们不但对我们的数据有绝对的控制权和解释权,各种各样的监管、封锁、监控一定程度上也极大的限制了创新和发展。建立在去中心化的分布式网络上的IFPS很难被中心化管理和限制,互联网将更加开放。第五,HTTP对主干网络依赖严重,存在严重的安全隐患。所有数据存储在一个地方,为寻求规模效应,机房就会建设在一个地方,就会非常依赖一个主干节点,一旦“单点式”的中心被摧毁或者发生数据丢失、造假的情况,那么整个网络都会随之瘫痪,或者接收到错误的信息,用户的信息安全和隐私容易受到威胁。为了支撑HTTP协议,服务器7*24小时开启,对于大流量公司,比如百度、腾讯、阿里等,投入大量资源维护服务器和安全隐患,防止DDoS、XSS、CSRF等攻击。主干网络受制于战争,自然灾害,中心服务器宕机等因素,都可能造成整个互联网中断服务。IPFS分布式存储可以极大的降低对中心主干网络的依赖。Juan Benet指出两个关键:“我们使用的是内容寻址的技术,也就是说内容可以从源服务器分离出来,并永久储存。这就意味着内容可以在距离用户非常近的地方储存和托管,甚至是储存在同一个房间里面。内容寻址还可以让我们校验数据,因为其他主机可能是不受信任的。一旦内容被下载到用户的设备之后,它就可以被无限期的保存。”IPFS还可以解决困扰HTTP互联网多时的安全问题:内容寻址和内容签名技术可以保护基于IPFS的网站,杜绝DDoS攻击发生的可能。IPFS还可以归档重要的公共记录内容,避免网站终止运营所带来的损失。IPFS的最后一个核心改进是去中心化的内容分布,这点可以让人们在分散的互联网服务(甚至是离线的情况)之下获取互联网的内容。“我们让网站和网页应用摆脱了源服务器的牵制。”Juan Benet解释,“它们可以按照比特币网络的模式进行分布。”这是HTTP无法做到的这一点,而且对于网络条件欠佳的地方和市郊地区来说是一个极大的好处。IPFS包含的内容节点身份。每一个IPFS节点都有一个独一无二的身份ID,利用节点的公钥生成的加密哈希,节点的活动都需要使用这个ID,就像是IPFS网络里面节点的身份证。网络。IPFS节点要和网络里面成百上千的其他节点通讯,现实中的网络结构如此复杂,IPFS使用ICE NAT穿透技术来保障网络的连通性。路由。IPFS网络的路由使用的事DHT,借鉴了S/Kademlia,使用一个节点可以快速地查找到其它节点。数据交换协议。IPFS借鉴BitTorrent协议,使用了叫做BitSwap的数据交换协议,该协议使用两个列表,想要的数据块(want_list)和我有的数据块(have_list)与其他节点进行数据交换。对象存储。IPFS存储数据私用的事MerkleDAG结构,这赋予了IPFS内容寻址、防篡改、去重功能。版本控制系统。IPFS在MerkleDAG上面添加了Git版本控制功能,这使得IPFS文件拥有了时光机功能,可以轻松查看文件的变动历史。自认证命名系统。IPFS使用了SFS自认证系统给文件命名,同时提供了IPNS解决传播问题,而且还兼容了现有的域名系统。IPFS的技术架构IPFS有八层子协议栈,从低往高分别为身份、网络、路由、交换、对象、文件、命名、应用,每个协议栈各司其职,又互相搭配。身份层和路由层对等节点身份信息的生成以及路由规则是通过Kademlia协议生成制定,KAD协议实质是构建了一个分布式松散Hash表(distributed hash table),简称DHT,每个加入这个DHT网络的人都要生成自己的身份信息,然后才能通过这个身份信息去负责存储这个网络里的资源信息和其他成员的联系信息。网络层lib2p可以支持任意传输层协议。ICE NAT traversal框架整合STUN、TURN和其他类型的NAT协议,该框架可以让客户端利用各种NAT方式打通网络,从而完成NAT通信,这对于IPFS的p2p网络非常重要。交换层类似迅雷、电驴这样的BT工具,IPFS团队把BitTorrent进行了创新,叫作Bitswap,它增加了信用和帐单体系来激励节点去分享,用户在发送给其他节点数据可以增加信用值,从其他节点接受数据降低信用值。如果用户只去接收数据而不分享数据,信用分会越来越低而被其他节点忽略掉。对象层和文件层对象层共同管理IPFS上80%的数据结构。大部分数据对象都是以Merkle DAG的结构存在,这为内容寻址和数据去重提供了便利。文件层是一个新的数据结构,和DAG并列,采用Git一样的数据结构来支持版本快照。命名层具有自我验证的特性(当其他用户获取该对象时,使用指纹公钥进行验签,即验证所用的公钥是否与NodeId匹配,这验证了用户发布对象的真实性,同时也获取到了可变状态),并且加入了IPNS这个巧妙的设计来使得加密后的DAG对象名可定义,增强可阅读性。应用层IPFS核心价值就在于上面运行的应用程序,可以利用它类似CDN的功能,在成本很低的带宽下,去获得想要的数据,从而提升整个应用程序的效率。IPFS的关系图谱协议实验室团队在开发IPFS时,采用高度模块集成化的方式,像搭积木一样去开发整个项目。其中IPLD、LibP2P、Multiformats这三个模块服务于IPFS底层。下面这张是IPFS的关系图谱。Mutiformats是一系列hash加密算法和自描述方式的集合,用以加密和描述nodeID以及指纹数据的生成,它在现有协议基础上对值进行自我描述改造,即从值上就可以知道是如何产生的。libP2P是IPFS核心中的核心,面对各式各样的传输层协议以及复杂的网络设备,它可以帮助开发者迅速建立一个可用P2P网络层,快速且节约成本。libp2p的主要功能包括:发现节点、连接节点、发现数据、传输数据。它类似现实世界的快递公司,连接着千千万万个节点,除了负责分发数据,还负责查找数据。IPLD是一个转换中间件,将现有的异构数据结构统一成一种格式,方便不同系统之间的数据交换和互操作。现在IPLD支持比特币、以太坊的区块数据。IPLD中间件可以把不同的区块结构统一成一个标准进行传递,为开发者提供了成功性比较高的标准,不用担心性能、稳定和bug,这也是IPFS为什么受到区块链系统欢迎的重要原因。IPFS应用了这几个模块的功能,集成为一种容器化的应用程序,运行在独立节点上,以Web服务的形式,供大家使用访问。IPFS允许网络中的参与者互相存储,索取和传输可验证的数据。但是由于IPFS是开源的,可以被免费下载和使用,并且已经被大量的团队使用。运用IPFS及技术各个节点可存储它们认为重要的数据;但目前没有简单的方法可以激励他人加入网络或存储特定数据,IPFS的推广普及的速度明显很慢。IPFS是如何工作的IPFS是基于文件内容进行寻址的。IPFS为每一个文件分配一个独一无二的哈希值(文件指纹:根据文件的内容进行创建),即使是两个文件内容只有1个比特的不同,其哈希值也是不相同的。所以IPFS是基于文件内容进行寻址,而不像传统的HTTP协议已于基于域名寻址。文件版本管理。IPFS在整个网络范围内去掉重复的文件,并且为文件建立版本管理,也就是说,每一个文件的变更历史都将被记录,可以很容易回到文件的历史版本查看数据。文件查询。当查询文件的时候,IPFS网络根据文件的哈希值(全网唯一)进行查找。由于每个文件的哈希值全网唯一,所以查询将很容易进行。每个节点除了存储自己需要的数据,还存储了一张哈希表,用来记录文件存储所在的位置,用来进行文件的查询、下载。IPNS。如果仅仅使用哈希值来区分文件的话,会给传播造成困难,因为哈希值不容易记忆,就像IP地址一样不容易记忆,于是人类发明了域名。IPFS利用IPNS将哈希值映射为容易记的名字。IPFS哈希代表不可变的数据,这意味着他们是不能被更改的,否则会导致哈希值的变更。IPFS通过一种特殊的功能来实现,即IPNS。IPNS允许用户使用一个私钥来对IPFS哈希附加一个引用,使用一个公钥哈希表示你的网站是最新版本。如果你使用过比特币,可能会对此比较熟悉,一个比特币地址也是一个公钥,如果该链接不起作用,不用担心,能够通过更改公钥所指向的内容,而公钥却永远保持不变。这样,网站的更新问题就得到了解决。接下来,只需要保证这些网站的位置是人类可读的,所有问题就解决了。人类可读的可变地址。IPFS/IPNS哈希是一些很大的、难看的字符串,而且不容易记住。所以IPFS允许用户使用现有的域名系统(Domain Name System,DNS)来为IPFS/IPNS内容提供人类可读的链接。它允许用户通过在域名服务器上将哈希插入TXT记录来实现这一点。IPFS HTTP网关,新旧网络之间的桥梁。通过一个HTTP网关,IPFS可以实现从HTTP到IPFS的过渡,在浏览器完全支持IPFS之前,现在已经允许当前的Web浏览器访问IPFS。用户很快就可以切换到IPFS,完成Web网络的存储、分发和服务。IPFS可以用来做什么在/ipfs和/ipns下面挂在全球永久文件系统。就是说所有的文件都可以存到上面。挂在个人同步的文件夹,可以自动进行版本管理、自动备份,也就意味着未来将拥有无限空间的网盘,不用担心数据丢失和隐私泄露。作为带版本控制的软件包管理系统。作为虚拟机的根文件系统。利用管理程序,把IPFS作为虚拟机的引导文件系统、在线操作系统。作为数据库。应用可以直接操作IPFS的MerkleDAG数据结构,并且可以使用IPFS的版本控制、缓存,自动备份、永不丢失、安全加密、无限空间、高速连接。作为加密通讯平台。作为加密CDN。永久Web。不存在不能访问的链接,不会出现404错误。编辑于 2021-06-30 13:19IPFS分布式存储数字货币​赞同 1​​1 条评论​分享​喜欢​收藏​申请

An open system to manage data without a central server | IPFS

An open system to manage data without a central server | IPFS

CommunityDevelopersDocsBlog Discover What's Out There with IPFS IPFS is an open system to manage data without a central server A Universe of Uses IPFS's versatility shines across different industries – making it the multi-purpose tool for the decentralized age. Develop offline-native productivity toolsAnytype uses the content addressing on IPFS to empower users to build personal knowledge webs that can be shared with others

Read how they do itMake archives and content libraries censorship resistantWhen the government of Turkey blocked access to Wikipedia, a copy of the site was posted to IPFS, restoring visibility to millions of people

Read the storySpeed up gameplay for your superfans3S Studios built an IPFS plugin for Unity that reduced the content size of a game from 2 gigabytes to 40 megabytes

Read the their storyGuarantee a permanent home for your digital artDigital artist Nancy Baker Cahill stores all of her full-resolution art assets using IPFS through NFT.storage

Watch her presentationPublish scientific research that invites global collaborationWeatherXM configured thousands of smart weather vanes with IPFS client functionality to collaboratively share weather patterns from around the world

Watch the presentationEnable data transparency in Web3Snapshot uses IPFS to publicly record all proposals, votes, and data for more than 9,000 web3 projects & DAOs

Read the case studyExpand our universeWe're reimagining the structure of the traditional web so we're ready for what's next - we need you to help us discover what's possible

Join the communityLiterally store your data out of this worldLockheed Martin is launching an IPFS node into orbit in 2023 to demonstrate more efficient interplanetary communication

Learn moreDevelop offline-native productivity toolsAnytype uses the content addressing on IPFS to empower users to build personal knowledge webs that can be shared with others

Read how they do itMake archives and content libraries censorship resistantWhen the government of Turkey blocked access to Wikipedia, a copy of the site was posted to IPFS, restoring visibility to millions of people

Read the storySpeed up gameplay for your superfans3S Studios built an IPFS plugin for Unity that reduced the content size of a game from 2 gigabytes to 40 megabytes

Read the their storyGuarantee a permanent home for your digital artDigital artist Nancy Baker Cahill stores all of her full-resolution art assets using IPFS through NFT.storage

Watch her presentationPublish scientific research that invites global collaborationWeatherXM configured thousands of smart weather vanes with IPFS client functionality to collaboratively share weather patterns from around the world

Watch the presentationEnable data transparency in Web3Snapshot uses IPFS to publicly record all proposals, votes, and data for more than 9,000 web3 projects & DAOs

Read the case studyExpand our universeWe're reimagining the structure of the traditional web so we're ready for what's next - we need you to help us discover what's possible

Join the communityLiterally store your data out of this worldLockheed Martin is launching an IPFS node into orbit in 2023 to demonstrate more efficient interplanetary communication

Learn moreDevelop offline-native productivity toolsAnytype uses the content addressing on IPFS to empower users to build personal knowledge webs that can be shared with others

Read how they do itMake archives and content libraries censorship resistantWhen the government of Turkey blocked access to Wikipedia, a copy of the site was posted to IPFS, restoring visibility to millions of people

Read the storySpeed up gameplay for your superfans3S Studios built an IPFS plugin for Unity that reduced the content size of a game from 2 gigabytes to 40 megabytes

Read the their storyGuarantee a permanent home for your digital artDigital artist Nancy Baker Cahill stores all of her full-resolution art assets using IPFS through NFT.storage

Watch her presentationPublish scientific research that invites global collaborationWeatherXM configured thousands of smart weather vanes with IPFS client functionality to collaboratively share weather patterns from around the world

Watch the presentationEnable data transparency in Web3Snapshot uses IPFS to publicly record all proposals, votes, and data for more than 9,000 web3 projects & DAOs

Read the case studyExpand our universeWe're reimagining the structure of the traditional web so we're ready for what's next - we need you to help us discover what's possible

Join the communityLiterally store your data out of this worldLockheed Martin is launching an IPFS node into orbit in 2023 to demonstrate more efficient interplanetary communication

Learn moreArrow pointing to the leftArrow pointing to the rightItem 1 of 8 Why IPFS? Our peer-to-peer content delivery network is built around the innovation of content addressing: store, retrieve, and locate data based on the fingerprint of its actual content rather than its name or location. Open The IPFS network is distributed and participatory, which reduces the problem of data silos that plague central servers. Verifiable The integrity of all data is verified using hash functions, so you can trust that you always get the data you’re looking for. Resilient Files and data can be stored across multiple nodes, which keeps content at the ready even during critical outages. Learn how it works Get Started Join thousands of developers who choose IPFS to build software that’s open, verifiable, and resilient. Build peer-to-peer apps with IPFS Our most popular implementations are written in Go, Rust, and JavaScript – and we also have support for desktop, browsers, mobile, embedded devices, and more. DevelopersDocumentationRead Case Studies Store and manage your data on IPFS Use content addressing to give your data unique identifiers, and use IPFS for large-scale data storage and compute. Publish with IPFSRetrieve CIDs with IPFS Use IPFS apps Share files, stream music, publish your website, store NFTs, and much more through hundreds of applications built on IPFS. Install IPFS DesktopInstall IPFS Browser ExtensionBrowse IPFS Applications Develop tooling for IPFS Design storage, compute, encryption, and implementation layers to optimize the way developers use IPFS. Kubo (Go)ClusterIroh (Rust)Helia (JavaScript) Connect Through Community We've sparked the most robust open-source ecosystem on Earth, and together we're achieving interplanetary aspirations. Application-Developers Scientists Infrastructure Developers Researchers Designers Archivists Yes, Even the occasional Astronaut Artists Our protocol's success hinges on participation from all of our neighbors: Each new node that joins IPFS makes the network stronger for everyone. Join the Community IPFS by the Numbers 2000+active contributors280,000+unique nodes1 Billion+CIDs published to network What's Happening On Our Blog In The Media Recent Videos From The Community “IPFS gives us a set of flexible building blocks for connecting devices and exchanging data. The plethora of IPFS documentation and community members contributes toward our goal at Agregore of making peer-to-peer web apps easy to use.” Mauve Signweaver, Founder - Agregore “It's crucially important to have a distributed file system in our open hypertext system. IPFS is the missing piece that allows for a truly decentralized and open web.” Gabo H Beaumont, Co-Founder - Mintter inc “As people learn about IPFS, they also get a view of IPFS as a component in a broader ecosystem. It's not an island. It's not a technology that lives entirely on its own, it's a piece of a broader stack of something. We see it as an onramp to broader decentralization.” Wes Floyd, Bacalhau “I use NFT.storage for my digital art. It was such a relief to know that I could store my videos in one place—each one with its own IPFS URL and CID. Resilience is important to me and having the work backed up to Filecoin means they'll be around for a long time.” Nancy Baker Cahill, Artist “At 3box labs, we are using IPFS as the storage layer. If you want to build full decentralized applications, you need data integrity. IPFS guarantees integrity by providing a framework for merkelized data.” Joel Thorstenssen, Co-founder - 3Box Labs “IPFS and content addressing give us the opportunity to work towards having every human be able to put data online effectively for free, and effectively forever.” Boris Mann, Co-founder - Fission “At Cloudflare, we offer to make content available to every user of the Internet. By removing lock-in to any single data storage provider, IPFS really allows our customers to choose a storage provider they are comfortable with.” Thibault Meunier, Research Engineer - Cloudflare “By using IPFS private swarms, we were able to deploy a fleet of devices communicating mission critical data in a factory without any central infrastructure, which has allowed us to move much faster.” Roland Kuhn, Actyx “IPFS gives us a set of flexible building blocks for connecting devices and exchanging data. The plethora of IPFS documentation and community members contributes toward our goal at Agregore of making peer-to-peer web apps easy to use.” Mauve Signweaver, Founder - Agregore “It's crucially important to have a distributed file system in our open hypertext system. IPFS is the missing piece that allows for a truly decentralized and open web.” Gabo H Beaumont, Co-Founder - Mintter inc “As people learn about IPFS, they also get a view of IPFS as a component in a broader ecosystem. It's not an island. It's not a technology that lives entirely on its own, it's a piece of a broader stack of something. We see it as an onramp to broader decentralization.” Wes Floyd, Bacalhau “I use NFT.storage for my digital art. It was such a relief to know that I could store my videos in one place—each one with its own IPFS URL and CID. Resilience is important to me and having the work backed up to Filecoin means they'll be around for a long time.” Nancy Baker Cahill, Artist “At 3box labs, we are using IPFS as the storage layer. If you want to build full decentralized applications, you need data integrity. IPFS guarantees integrity by providing a framework for merkelized data.” Joel Thorstenssen, Co-founder - 3Box Labs “IPFS and content addressing give us the opportunity to work towards having every human be able to put data online effectively for free, and effectively forever.” Boris Mann, Co-founder - Fission “At Cloudflare, we offer to make content available to every user of the Internet. By removing lock-in to any single data storage provider, IPFS really allows our customers to choose a storage provider they are comfortable with.” Thibault Meunier, Research Engineer - Cloudflare “By using IPFS private swarms, we were able to deploy a fleet of devices communicating mission critical data in a factory without any central infrastructure, which has allowed us to move much faster.” Roland Kuhn, Actyx “IPFS gives us a set of flexible building blocks for connecting devices and exchanging data. The plethora of IPFS documentation and community members contributes toward our goal at Agregore of making peer-to-peer web apps easy to use.” Mauve Signweaver, Founder - Agregore “It's crucially important to have a distributed file system in our open hypertext system. IPFS is the missing piece that allows for a truly decentralized and open web.” Gabo H Beaumont, Co-Founder - Mintter inc “As people learn about IPFS, they also get a view of IPFS as a component in a broader ecosystem. It's not an island. It's not a technology that lives entirely on its own, it's a piece of a broader stack of something. We see it as an onramp to broader decentralization.” Wes Floyd, Bacalhau “I use NFT.storage for my digital art. It was such a relief to know that I could store my videos in one place—each one with its own IPFS URL and CID. Resilience is important to me and having the work backed up to Filecoin means they'll be around for a long time.” Nancy Baker Cahill, Artist “At 3box labs, we are using IPFS as the storage layer. If you want to build full decentralized applications, you need data integrity. IPFS guarantees integrity by providing a framework for merkelized data.” Joel Thorstenssen, Co-founder - 3Box Labs “IPFS and content addressing give us the opportunity to work towards having every human be able to put data online effectively for free, and effectively forever.” Boris Mann, Co-founder - Fission “At Cloudflare, we offer to make content available to every user of the Internet. By removing lock-in to any single data storage provider, IPFS really allows our customers to choose a storage provider they are comfortable with.” Thibault Meunier, Research Engineer - Cloudflare “By using IPFS private swarms, we were able to deploy a fleet of devices communicating mission critical data in a factory without any central infrastructure, which has allowed us to move much faster.” Roland Kuhn, ActyxItem 1 of 8 Stay informed Sign up for the IPFS newsletter ( example ) for the latest on releases, upcoming developments, community events, and more. Signup About Blog & News Press Kit Code of Conduct Security Community Forums Office Hours Hackathons Developer Grants Accelerators Resources Specs Case Studies Research

IPFS Project · GitHub

IPFS Project · GitHub

Skip to content

Toggle navigation

Sign in

ipfs

Product

Actions

Automate any workflow

Packages

Host and manage packages

Security

Find and fix vulnerabilities

Codespaces

Instant dev environments

Copilot

Write better code with AI

Code review

Manage code changes

Issues

Plan and track work

Discussions

Collaborate outside of code

Explore

All features

Documentation

GitHub Skills

Blog

Solutions

For

Enterprise

Teams

Startups

Education

By Solution

CI/CD & Automation

DevOps

DevSecOps

Resources

Learning Pathways

White papers, Ebooks, Webinars

Customer Stories

Partners

Open Source

GitHub Sponsors

Fund open source developers

The ReadME Project

GitHub community articles

Repositories

Topics

Trending

Collections

Pricing

Search or jump to...

Search code, repositories, users, issues, pull requests...

Search

Clear

Search syntax tips

Provide feedback

We read every piece of feedback, and take your input very seriously.

Include my email address so I can be contacted

Cancel

Submit feedback

Saved searches

Use saved searches to filter your results more quickly

Name

Query

To see all available qualifiers, see our documentation.

Cancel

Create saved search

Sign in

Sign up

You signed in with another tab or window. Reload to refresh your session.

You signed out in another tab or window. Reload to refresh your session.

You switched accounts on another tab or window. Reload to refresh your session.

Dismiss alert

IPFS Project

A peer-to-peer hypermedia protocol

1.9k

followers

Earth

https://ipfs.tech

https://discuss.ipfs.tech

YouTube

@IPFSbot

X

@IPFS

hello [at] ipfs.tech

Overview

Repositories

Projects

Packages

People

More

Overview

Repositories

Projects

Packages

People

README.md

IPFS is an open system to manage data without a central server

IPFS is a modular suite of protocols for addressing, routing, and transferring data, designed from the ground up with the principles of content addressing and peer-to-peer networking. Many popular Web3 projects are built on IPFS - see the ecosystem directory for some of these projects.

Exceptionally talented open communities are building the future of the decentralized web. Excellent good first issues need your attention and support! Join the movement! Get involved today!

Resources

Docs

IPFS Forums

IPFS Blog

Community Calendar

Specs for Implementers

Quickstarts

Publish with IPFS

Retrieve CIDs with IPFS

Concepts

What is IPFS?

IPFS and the problems it solves

How IPFS Works

Implementations

Kubo (Go)

Helia (JS)

and more!

Pinned

specs

specs Public

Technical specifications for the IPFS protocol stack

HTML

1.1k

256

ipfs

ipfs Public

Peer-to-peer hypermedia protocol

22.5k

1.5k

ipfs-desktop

ipfs-desktop Public

An unobtrusive and user-friendly desktop application for IPFS on Windows, Mac and Linux.

JavaScript

5.7k

839

ipfs-companion

ipfs-companion Public

Browser extension that simplifies access to IPFS resources on the web

JavaScript

2k

315

kubo

kubo Public

An IPFS implementation in Go

Go

15.7k

2.9k

helia

helia Public

An implementation of IPFS in JavaScript

TypeScript

669

64

Repositories

Type

Select type

All

Public

Sources

Forks

Archived

Mirrors

Templates

Language

Select language

All

Go

Handlebars

HTML

JavaScript

Less

Makefile

PowerShell

Shell

TeX

TypeScript

Vue

Sort

Select order

Last updated

Name

Stars

Showing 10 of 218 repositories

eslint-config-ipfs

Public

An ESLint Shareable Config used by IPFS project

JavaScript

4

12

0

2

Updated Mar 7, 2024

public-gateway-checker

Public

Checks which public gateways are online or not

TypeScript

1,369

321

24

(7 issues need help)

13

Updated Mar 7, 2024

rainbow

Public

A specialized IPFS HTTP gateway

Go

54

11

5

2

Updated Mar 7, 2024

someguy

Public

A Delegated Routing V1 server and client for all your routing needs.

Go

8

3

7

2

Updated Mar 7, 2024

boxo

Public

A set of reference libraries for building IPFS applications and implementations in Go.

Go

163

68

154

(18 issues need help)

27

Updated Mar 7, 2024

kuboreleaser

Public

Go

1

4

9

2

Updated Mar 7, 2024

helia-verified-fetch

Public

A fetch-like API for obtaining verified & trustless IPFS CIDs on the web

TypeScript

2

0

4

5

Updated Mar 6, 2024

ipfs-docs

Public

IPFS documentation platform

Go

283

366

20

(3 issues need help)

20

Updated Mar 6, 2024

helia

Public

An implementation of IPFS in JavaScript

TypeScript

669

64

43

(1 issue needs help)

10

Updated Mar 6, 2024

aegir

Public

AEgir - Automated JavaScript project building

JavaScript

96

65

34

(3 issues need help)

7

Updated Mar 5, 2024

View all repositories

People

View all

Top languages

Go

TypeScript

JavaScript

Shell

HTML

Most used topics

Loading…

Footer

© 2024 GitHub, Inc.

Footer navigation

Terms

Privacy

Security

Status

Docs

Contact

Manage cookies

Do not share my personal information

You can’t perform that action at this time.

IPFS教程:五步部署你的专用IPFS网络 - 知乎

IPFS教程:五步部署你的专用IPFS网络 - 知乎首发于IPFS&Filecoin切换模式写文章登录/注册IPFS教程:五步部署你的专用IPFS网络知乎用户yYCR7e星际文件系统是一个点对点的分布式文件系统,它以一种类似于 Bittorrent 的方式存储和检索文件。IPFS 的默认安装将您的计算机连接到全局分布式网络。在某些情况下(隐私、机密性),私有 IPFS 网络优于连接到公共 IPFS 网络。本文介绍在同一网络中的不同 Ubuntu 机器上创建私有 IPFS 网络的步骤。确保机器之间能互相发出声音。将不连接到公共网络,因此这个私有网络上的所有数据将只能被网络上的已知节点访问。对于 Mac OS,安装步骤几乎相同,只需下载 Mac 版本的 Go 和 IPFS 即可。要在 Windows 上安装,你可以从微软商店安装 Ubuntu,并遵循以下步骤。第一步:安装 IPFS安装要安装最新版本的 IPFS,首先需要从 https://golang.org/doc/install 安装 Go。将存档下载到磁盘。然后将文件提取到中/usr/local,/usr/local/go并使用以下示例语句创建 Go。将以下语句中的文件名更改为本地文件的名称。sudo tar -C /usr/local -xzf go1.11.4.linux-amd64.tar.gz/usr/local/go/bin通过执行以下命令,添加到 PATH 环境变量中:export PATH=$PATH:/usr/local/go/bin并应用更改source $HOME/.profileIPFS 安装要安装 IPFS,请访问 https://dist.ipfs。io/#Go-IPFS 并复制最新的 Go 实现 IPFS 的链接(见下图)。运行以下命令(使用复制的链接将第 3 行和第 4 行更新为最新版本)。sudo apt-get updatewget https://dist.ipfs.io/go-ipfs/v0.4.18/go-ipfs_v0.4.18_linux-amd64.tar.gztar xvfz go-ipfs_v0.4.18_linux-amd64.tar.gzsudo mv go-ipfs/ipfs /usr/local/bin/ipfs可选清理:rm go-ipfs_v0.4.18_linux-amd64.tar.gzrm -R ./go-ipfs要验证您的安装,请键入ipfs version结果如下安装 IPFS 不会立即启动 IPFS 文件系统,因此不会建立到公共 IPFS 网络的连接。第二步:初始化节点02出于本教程的目的,我们将安装两个节点:一个引导节点和一个客户端节点。引导节点是一个 IPFS 节点,其他节点可以连接到这个节点,以便找到其他节点。因为我们正在创建自己的私有网络,所以我们不能使用来自公共 IPFS 网络的引导节点,所以我们将在稍后更改这些设置。选择一台机器作为引导节点,另一台机器作为客户端节点。IPFS 在用户主目录中的隐藏目录中初始化:〜/ .ipfs。该目录将用于初始化节点。在引导节点和客户端节点的两台计算机上,运行以下命令。IPFS_PATH=~/.ipfs ipfs init结果:注意:我们用于IPFS_PATH=~/.ipfs强制 IPFS 将目录与我们专用网络的配置文件(和 swarm 文件,请参阅第三步)一起使用。如果您已经在连接到公用网络的计算机上安装了IPFS,则该ipfs add语句可能会使用此安装,从而在公用网络上发布文档。如果此安装是 ipfs 的首次安装,IPFS_PATH=~/.ipfs则可以省略。第三步:创建一个专用网络现在,我们已经安装了两个 IPFS 节点,可以轻松连接到公共 IPFS 网络,但这不是我们所需要的。要创建专用网络,我们将使用群集密钥。该群密钥将被此专用网络中的所有节点引用。要生成群密钥,有两种选择:使用 bash 脚本或安装密钥生成器。选项 1:Bash 脚本在 bootnode 上运行以下代码,并将生成的 swarm 文件复制到所有客户端节点的.ipfs 目录。(注意:这适用于 Ubuntu,在 MacOS 上使用选项 2。)echo -e“ /key/swarm/psk/1.0.0/\n/base16/\n`tr -dc'a-f0-9'〜/ .ipfs / swarm.key选项 2:安装密钥生成器第二种选择是安装群密钥生成器。如果您使用了上面的 bash 脚本,则可以跳过本节,并继续执行“第四步:引导 IPFS 节点”。群密钥生成器仅在引导节点上执行。要安装群体密钥生成器,我们使用go get,它使用 git。如果尚未在引导节点上安装 git,那么可以使用。sudo apt-get install git运行以下命令以安装群密钥生成器:go get -u http://github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm-key-gen运行swarm密钥生成器以在.ipfs目录中创建swarm文件:./go/bin/ipfs-swarm-key-gen > ~/.ipfs/swarm.key将生成的swarm文件复制到所有客户端节点的.ipfs目录。第四步:引导 IPFS 节点04客户端节点使用引导节点来连接到专用 IPFS 网络。引导程序将客户端连接到网络上可用的其他节点。在我们的专用网络中,我们无法使用公共 IPFS 网络的引导程序,因此在本节中,我们将使用引导程序节点的 ip 地址和对等身份替换现有的引导程序。首先,从引导节点和客户端节点中删除引导程序节点的默认条目。在两台计算机上使用命令:IPFS_PATH=~/.ipfs ipfs bootstrap rm --all检查结果以查看引导程序是否为空:IPFS_PATH=~/.ipfs ipfs config show结果:现在,将您的引导节点的 ip 地址和对等身份(哈希地址)添加到每个节点(包括引导节点)。可以使用找到引导节点的 ip 地址hostname -I。对等身份是在 IPFS 初始化期间创建的,可以通过以下语句找到。IPFS_PATH=~/.ipfs ipfs config show | grep "PeerID"结果:add bootstrap如下汇编语句。IPFS_PATH=~/.ipfs ipfs bootstrap add /ip4//tcp/4001/ipfs/例:IPFS_PATH=~/.ipfs ipfs bootstrap add /ip4/172.25.10.5/tcp/4001/ipfs/QmdbaLZsKA94tsYeKJEPyLThWARFCtWyJWuudBUd4z9KBU在引导节点和客户端节点上运行您的语句。第五步:启动网络已安装了专用网络,因此我们可以测试该网络。我们将使用环境变量来确保如果我们的配置中有错误或专用网络未完全配置,则节点将不会连接到公共 IPFS 网络,并且守护进程会失败。相同的环境变量是“LIBP2P_FORCE_PNET”,要启动 IPFS 节点,您只需使用 ipfs daemon 带有以下语句的命令来启动守护程序。export LIBP2P_FORCE_PNET=1IPFS_PATH=~/.ipfs ipfs daemon &export LIBP2P_FORCE_PNET=1表示您将节点强制为私有。如果未配置专用网络,则守护程序将无法启动。在我们的例子中,命令和输出如下所示:请注意消息日志说明 Swarm is limited to private network of peers with the swarm key,这表示我们的专用网络运行正常。现在,在一个节点上将文件添加到我们的专用网络,然后尝试从另一节点访问该文件。mkdir ipfstestcd ipfstestecho "Hello World!" > file1.txtIPFS_PATH=~/.ipfs ipfs add file1.txtIPFS_PATH=~/.ipfs ipfs cat 结果:该ipfs add语句返回上载文件的哈希码。可以从其他节点使用此哈希码来检索文件。如果将同一文件上载到另一个节点,则会生成相同的哈希,因此该文件不会在网络上存储两次。要上传完整目录,请添加目录名称和-r选项(递归)。目录及其中的文件被散列:也可以通过浏览器访问文件。打开浏览器并输入:http://127.0.0.1:8080/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG结果:本教程到此结束,以构建专用的对等 IPFS 网络。在此网络中,所有文档均为该网络参与者的私有和机密信息。End非常感谢您对 IPFS&Filecoin 项目的持续支持。我们很高兴继续与您一起,为人类信息建立一个强大的,去中心化和高效的基础。FilCloud 帮你迅速了解 IPFS 领域的热点技术和应用公众号:filcloud发布于 2020-06-04 14:30IPFS分布式系统Filecoin​赞同​​添加评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录IPFS&Filecoin最新IPFS&Filecoi

星际文件系统IPFS入门指南 - 少数派

星际文件系统IPFS入门指南 - 少数派

PRIMEMatrix栏目Pi Store更多 无需申请,自由写作 任何用户都可使用写作功能。成功发布 3 篇符合基本规则的内容,可成为正式作者。了解更多退出登录反馈PRIMEMatrix栏目Pi Store更多 星际文件系统IPFS入门指南主作者关注少数派_816470少数派作者少数派作者 shidanqing.net 少数派_816470关注少数派_816470少数派作者少数派作者 shidanqing.net 联合作者关注少数派_816470少数派作者少数派作者 shidanqing.net 少数派_816470关注少数派_816470少数派作者少数派作者 shidanqing.net 2018 年 04 月 04 日 IPFS介绍IPFS的全称是InterPlanetary File System星际文件系统,是一个点对点的网络超媒体协议。它的目标是成为更快、更安全、更开放的下一代互联网。IPFS尝试解决HTTP目前存在的四个问题:服务低效,成本高。这也是大部分P2P服务比中心化服务器优秀的地方。网络服务受限于供应商,文件具有无法永久保存的风险,更无法历史回溯。中心化的网络权力过于集中,网络控制和监管某些程度上限制了科技创新。互联网服务大多依赖于骨干网络,一旦宕机大部分服务将无法使用。IPFS的野心是取代现在的HTTP,去创建一个全新的去中心化网络。在IPFS网络上,每个IPFS上的文件都具备一个唯一的哈希码。IPFS同时具备了文件去重和历史版本的功能,每个网络节点会存储自己感兴趣的内容,并且索引其它内容的位置,用户可以通过哈希码来寻找到每个文件的具体位置。此外IPFS本身还自带一个IPNS的域名,可以把你的内容和你的个人域名进行绑定。IPFS的下载与安装可参考官网:https://ipfs.io/docs/install文本以Ubuntu上的安装方法为例进行说明,在terminal内输入以下命令进行下载与安装。本文时间(2018.3.29)的最新版本为v0.4.14。wget https://dist.ipfs.io/go-ipfs/v0.4.14/go-ipfs_v0.4.14_linux-amd64.tar.gz

tar xvfz go-ipfs_v0.4.14_linux-amd64.tar.gz

cd go-ipfs

./install.sh

安装后使用help命令,可以测试是否成功。ipfs help

IPFS的使用:启动使用参考:https://ipfs.io/docs/getting-started首先进行初始化,创建一个全局的本地仓库与配置文件。ipfs init

然后需要开启IPFS的进程从而与网络保持连接状态。这里加上&是为了让进程在后台运行,可以在开启后同时按CTRL键C键回到之前界面。ipfs daemon &

可以通过下面的命令查看我们在IPFS网络上已经连接的节点ipfs swarm peers

IPFS的使用:上线这里讲解一下把你的GitHub Pages个人主页上传到IPFS网络上,GitHub确实是一个非常好的平台,但一个完全分布式的网络似乎非常具有吸引力。首先第一步先克隆你的主页项目到本地。git clone

通过add命令,直接把项目直接添加到IPFS网络。ipfs add -r

完成这一步后,你应该会在Terminal里看到打印了一串哈希码,类似于:QmP4AUYoXLpF1WXifkfyDCe6mpiXgsUcbBFXyWuEZtUgFz,你需要把它记录下来,它标识了你的文件在网路上的位置。现在你的文件已经在IPFS上了,网络为了避免垃圾资源过度的情况会在一段时间之后清空数据。为了保证我们的文件能够一直保持在IPFS网络上,我们需要执行pin命令,这样只要你的IPFS进程还开启着,数据就不会被垃圾回收。ipfs pin add -r

Done!现在你的个人网站已经搭建在了一个完全去中心化的网络上了。你可以通过网址 https://gateway.ipfs.io/ipfs/ 访问你的个人主页。另外要注意的是,IPFS的网关目前需要科学上网才能连接。例子:下面是我自己的个人主页在IPFS上的版本。https://gateway.ipfs.io/ipfs/QmP4AUYoXLpF1WXifkfyDCe6mpiXgsUcbBFXyWuEZtUgFz另外,如果需要绑定个人域名,可查阅官方手册的IPNS相关内容。10扫码分享 #互联网

1 等 1 人为本文章充电 扫码分享

举报本文章

举报 少数派_816470少数派作者

shidanqing.net

关注

全部评论(0)

请在登录后评论...

更多

推荐阅读

App 内打开 请绑定手机号码取消 前往绑定 关注公众号 sspaime 下载 App 联系我们 商务合作 关于我们 用户协议 常见问题 © 2013-2024 少数派 | 粤ICP备09128966号-4 | 粤B2-20211534© 2013-2024 少数派粤ICP备09128966号-4 | 粤B2-20211534 确定

What is IPFS? | IPFS Docs

What is IPFS? | IPFS Docs

IPFS Docs

Get Started

Concepts

Guides

Reference

Project

Case Studies Case Studies

Arbol

Audius

Fleek

LikeCoin

Morpheus.Network

Snapshot

Get Started

Concepts

Guides

Reference

Project

Case Studies Case Studies

Arbol

Audius

Fleek

LikeCoin

Morpheus.Network

Snapshot

Basics What is IPFS?Defining IPFSWhat IPFS isn'tFurther readingIPFS and the problems it solvesHow IPFS worksIdeas and theory Subsystems and components Implementations Compute-over-Data (CoD)IPFS comparisonsPublic IPFS UtilitiesUsage ideas and examplesMeasuring the networkFAQGlossaryAcademic Papers # What is IPFS IPFS is a modular suite of protocols for organizing and transferring data, designed from the ground up with the principles of content addressing and peer-to-peer networking. Because IPFS is open-source, there are multiple implementations of IPFS.

While IPFS has more than one use case, its main use case is for publishing data (files, directories, websites, etc.) in a decentralised fashion. This guide is part 1 of a 3-part introduction to the basic concepts of IPFS. The second part, IPFS and the problems it solves, covers the problems with the internet and current protocols like HTTP that IPFS solves. In this conceptual guide, you'll learn what IPFS is and isn't. # Defining IPFS The term IPFS can refer to multiple concepts: An implementation of IPFS protocol specifications (opens new window), such as Kubo. Learn more about the principles that define an IPFS implementation. A

decentralized network composed of IPFS nodes that is open and participatory. A modular suite of protocols and standards for organizing and transferring content-addressed data. # What IPFS isn't While IPFS shares similarities with, and is often used in architectures with the systems described below, IPFS is not: A storage provider: While there are storage providers built with IPFS support (typically known as pinning services), IPFS itself is a protocol, not a provider. A cloud service provider: IPFS can be deployed on and complement cloud infrastructure, but it in of itself is not a cloud service provider. # Further reading For an overview of the problems that IPFS solves, see part 2 of a 3-part introduction to the basic concepts of IPFS, IPFS and the problems it solves. To learn how IPFS is used by storage networks and other applications, see the usage ideas and examples. Looking for a deeper dive on IPFS compared to other similar technologies? See the IPFS Comparisons page. Was this information helpful?

Yes

No

Edit this page

on GitHub or

open an issue Help us improve this site! Suggest new content Give general feedback

IPFS白皮书 中文版 - IPFS

白皮书 中文版 - IPFSIPFS文档白皮书社群v1.0.1GitHubIPFS白皮书 中文版摘要

星际文件系统是一种点对点的分布式文件系统, 旨在连接所有有相同的文件系统的计算机设备。在某些方面, IPFS类似于web, 但web 是中心化的,而IPFS是一个单一的Bittorrent 群集, 用git 仓库分布式存储。换句话说, IPFS 提供了高吞吐量的内容寻址块存储模型, 具有内容寻址的超链接。这形成了一个广义的Merkle DAG 数据结构,可以用这个数据结构构建版本文件系统,区块链,甚至是永久性网站。。IPFS 结合了分布式哈希表, 带有激励机制的块交换和自我认证命名空间。IPFS 没有单故障点, 节点不需要相互信任。

1 介绍

在全球分布式文件系统这领域, 已经有许多人的尝试。一些系统已经取得了重大的成功, 而很多却完全失败了。在学术尝试中, AFS【6】就是成功的例子,如今已经得到广泛的应用, 然而,其他的【7, ?】却没有得到相同的结果。在学术界之外,应用最广泛的是面向音视频媒体的点对点文件共享系统。 最值得注意的是, Napster, KaZaA 和BitTorrent[2]部署的文件分发系统支持1亿用户的同时在线。即使在今天, BitTorrent 也维持着每天千万节点的活跃数。 基于这些学术文件系统理论而实现的应用程序有很多的用户量, 然而,这些系统理论是在应用层,而没有放在基础层。以致没有出现通用的文件系统基础框架, 给全球提供低延迟的分发。

也许是因为HTTP这样“足够好“的系统已经存在。到目前为止,HTTP已经作为“分布式文件系统“的协议,并且已经大量部署,再与浏览器相结合,具有巨大的技术和社会影响力。在现在, 它已经成为互联网传输文件的事实标准。然而,他没有采用最近15年的发明的数十种先进的文件分发技术。 从一方面讲, 由于向后兼容的限制 和 当前新模式的投入, 不断发展http web 的基础设施几乎是不可能的。但从一个角度看, 从http 出现以来, 已经有许多新协议出现并被广泛使用。升级http协议虽然能引入新功能和加强当前http协议,但会降低用户的体验。

有些行业已经摆脱使用HTTP 这么久, 因为移动小文件相对便宜,即使对拥有大流量的小组织也是如此。但是,随着新的挑战,我们正在进入数据分发的新纪元。

(a)托管和分发PB级数据集,

(b)跨组织的大数据计算,

(c)大批量的高清晰度按需或实时媒体流,

(d)大规模数据集的版本化和链接,

(e)防止意外丢失重要文件等。其中许多可以归结为“大量数据,无处不在”。由于关键功能和带宽问题,我们已经为不同的数据放弃了HTTP 分销协议。下一步是使它们成为web自己的一部分。

正交于有效的数据分发,版本控制系统,已经设法开发重要的数据协作工作流程。Git是分布式源代码版本控制系统,开发了许多有用的方法来建模和实现分布式数据操作。Git工具链提供了灵活的版本控制功能,这正是大量的文件分发系统所严重缺乏的。由Git启发的新解决方案正在出现,如Camlistore [?],个人文件存储系统,Dat [?]数据协作工具链和数据集包管理器。Git已经影响了分布式文件系统设计[9],因为其内容涉及到Merkle DAG数据模型,能够实现强大的文件分发策略。还有待探讨的是,这种数据结构如何影响面向高吞吐量的文件系统的设计,以及如何升级Web本身。

本文介绍了IPFS,一种新颖的对等版本控制的文件系统,旨在调和这些问题。 IPFS综合了许多以前成功的系统的优点。 IPFS产生了突出的效果, 甚至比参考的这些系统的总和还要好。IPFS的核心原则是将所有数据建模为同一Merkle DAG的一部分。

2 背景

本节回顾了IPFS所采用成功的点对点系统技术的重要属性。

2.1 分布式哈希表(DHT)

分布式散列表(DHT)被广泛用于协调和维护关于对等系统的元数据。比如,MainlineDHT 是一个去中心化哈希表,他可追踪查找所有的对等节点。

2.1.1 KADEMLIA DHT

Kademlia[10] 是受欢迎的DHT, 它提供:

1.通过大量网络进行高效查询:查询平均联系人O(log2N)节点。 (例如,20跳10万个节点的网络)

2.低协调开销:优化数量的控制消息发送到其他节点。

3.抵抗各种攻击,喜欢长寿节点。

4.在对等应用中广泛使用,包括Gnutella和BitTorrent,形成了超过2000万个节点的网络[16]。

2.1.2 CORAL DSHT

虽然一些对等文件系统直接在DHT中存储数据块,这种“数据存储在不需要的节点会乱费存储和带宽”[5]。Coral DSHT扩展了Kademlia三个特别重要的方式:

1.Kademlia在ids为“最近”(使用XOR-distance)的关键节点中存储值。这不考 虑应用程序数据的局部性,忽略“远”可能已经拥有数据的节点,并强制“最近”节点存储它,无论它们是否需要。这浪费了大量的存储和带宽。相反,Coral 存储了地址, 该地址的对等节点可以提供相应的数据块。

2.Coral将DHT API从get_value(key)换成了get_any_values(key)(DSHT中的“sloppy”)中。这仍然是因为Coral用户只需要一个(工作)的对等体,而不是完整的列表。作为回报,Coral可以仅将子集分配到“最近”的节点,避免热点(当密钥变得流行时,重载所有最近的节点)。

3.另外,Coral根据区域和大小组织了一个称为群集的独立DSHT层次结构。这使得节点首先查询其区域中的对等体,“查找附近的数据而不查询远程节点”[5]并大大减少查找的延迟。

2.1.3 S/KADEMLIA DHT

S/Kademlia[1] 扩展了Kademlia, 用于防止恶意的攻击。有如下两方面的方法:

1.S/Kad 提供了方案来保证NodeId的生成已经防止Sybill攻击。它需要节点产生PKI公私钥对。从中导出他们的身份,并彼此间签名。一个方案使用POW工作量证明,使得生成Sybills成本高昂。

2.S/Kad 节点在不相交的路径上查找直, 即使网络中存在大量的不诚实节点,也能确保诚实节点可以互相链接。即使网络中存在一半的不诚实节点,S/Kad 也能达到85%的成功率。

2.2 块交换 - BitTorrent

BitTorrent[3] 是一个广泛成功应用的点对点共享文件系统,它可以在存在不信任的对等节点(群集)的协作网络中分发各自的文件数据片。从BitTorrent和它的生态系统的关键特征, IPFS得到启示如下:

1.BitTorrent的数据交换协议使用了一种bit-for-tat的激励策略, 可以奖励对其他方面做贡献的节点,惩罚只榨取对方资源的节点。

2.BitTorrent对等体跟踪文件的可用性,优先发送稀有片段。这减轻了seeds节点的负担, 让non-seeds节点有能力互相交易。

3.对于一些剥削带宽共享策略, BitTorrent的标准tit-for-tat策略是非常脆弱的。 然而,PropShare[8]是一种不同的对等带宽分配策略, 可以更好的抵制剥削战略, 提高群集的表现。

2.3 版本控制系统 - Git

版本控制系统提供了对随时间变化的文件进行建模的设施,并有效地分发不同的版本。流行版本控制系统Git提供了强大的Merkle DAG对象模型,以分布式友好的方式捕获对文件系统树的更改。

1.不可更改的对象表示文件(blob),目录(树)和更改(提交)。

2.通过加密hash对象的内容,让对象可寻址。

3.链接到其他对象是嵌入的,形成一个Merkle DAG。这提供了很多有用的完整和work-flow属性。

4.很多版本元数据(分支,标示等等)都只是指针引用,因此创建和更新的代价都小。

5.版本改变只是更新引用或者添加对象。

6.分布式版本改变对其他用户而言只是转移对象和更新远程引用。

2.4 自我认证认文件系统-SFS

SFS [ 12,11 ]提出了两个引人注目的实现(a)分布式信任链,和(b)平等共享的全局命名空间。SFS引入了一种自我建构技术—注册文件:寻址远程文件系统使用以下格式:

/sfs/:

Location:代表的是服务网络地方

HostID = hash(public_key || Location)

因此SFS文件系统的名字认证了它的服务,用户可以通过服务提供的公钥来验证,协商一个共享的私钥,保证所有的通信。所有的SFS实例都共享了一个全局的命名空间,这个命名空间的名称分配是加密的,不被任何中心化的body控制。

3 IPFS设计

IPFS是一个分布式文件系统,它综合了以前的对等系统的成功想法,包括DHT,BitTorrent,Git和SFS。 IPFS的贡献是简化,发展和将成熟的技术连接成一个单一的内聚系统,大于其部分的总和。 IPFS提供了编写和部署应用程序的新平台,以及一个新的分发系统版本化大数据。 IPFS甚至可以演进网络本身。

IPFS是点对点的;没有节点是特权的。 IPFS节点将IPFS对象存储在本地存储中。节点彼此连接并传输对象。这些对象表示文件和其他数据结构。 IPFS协议分为一组负责不同功能的子协议:

身份 - 管理节点身份生成和验证。描述在3.1节。

2.网络 - 管理与其他对等体的连接,使用各种底层网络协议。可配置的。详见3.2节。

3.路由 - 维护信息以定位特定的对等体和对象。响应本地和远程查询。默认为DH​​T,但可更换。在3.3节描述。

4.交换 - 一种支持有效块分配的新型块交换协议(BitSwap)。模拟市场,弱化数据复制。贸易策略可替换。描述在3.4节。

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

6.文件 - 由Git启发的版本化文件系统层次结构。详见3.6节。

7.命名 - 自我认证的可变名称系统。详见3.7节。

这些子系统不是独立的;它们是集成在一起,互相利用各自的属性。但是,分开描述它们是有用的,从下到上构建协议栈。符号:Go语言中指定了以下数据结构和功能

3.1 身份

节点由NodeId标识,这是使用S / Kademlia的静态加密难题[1]创建的公钥的密码散列。节点存储其公私钥(用密码加密)。用户可以在每次启动时自由地设置一个“新”节点身份,尽管这会损失积累的网络利益。激励节点保持不变。

type NodeId Multihash

type Multihash []byte // 自描述加密哈希摘要

type PublicKey []byte

type PrivateKey []byte // 自描述的私钥

type Node struct {

NodeId NodeID

PubKey PublicKey

PriKey PrivateKey

}

基于S / Kademlia的IPFS身份生成:

difficulty =

n = Node{}

do {

n.PubKey, n.PrivKey = PKI.genKeyPair()

n.NodeId = hash(n.PubKey)

p = count_preceding_zero_bits(hash(n.NodeId))

} while (p < difficulty)

首次连接时,对等体交换公钥,并检查:hash(other.PublicKey)等于other.NodeId。如果没有,则连接被终止

关于加密函数的注意事项:

IPFS不是将系统锁定到一组特定的功能选择,而是支持自我描述的值。哈希摘要值以多重哈希格式存储,其包括指定使用的哈希函数的头和以字节为单位的摘要长度。例如:

这允许系统

(a)选择最佳功能用例(例如,更强的安全性与更快的性能),

(b)随着功能选择的变化而演变。自描述值允许兼容使用不同的参数选择。

3.2 网络

IPFS节点与数百个其他节点进行定期通信网络中的节点,可能跨越广域网络。IPFS网络堆栈功能:

传输层: IPFS可以使用任何传输协议,并且最适合WebRTC DataChannels [?](用于浏览器连接)或uTP(LEDBAT [14])。

可靠性: 如果底层网络不提供可靠性,IPFS可使用uTP(LEDBAT [14])或SCTP [15]来提供​​可靠性。

可连接性:IPFS还可以使用ICE NAT穿墙打洞技术[13]。

完整性:可以使用哈希校验和来检查邮件的完整性。

可验证性:可以使用发送者的公钥使用HMAC来检查消息的真实性。

3.2.1 对等节点寻址注意事项:

IPFS可以使用任何网络; 但它不承担对IP的获取以及不直接依赖于ip层。这允许在覆盖网络中使用IPFS。

IPFS将地址存储为多层地址,这个多层地址是由字节字符串组成的, 以便于给底层网络使用。多层地址提供了一种方式来表示地址及其协议,可以封装成好解析的格式。例如:

/ip4/10.20.30.40/sctp/1234/

# an SCTP/IPv4 connection proxied over TCP/IPv4

/ip4/5.6.7.8/tcp/5678/ip4/1.2.3.4/sctp/1234/

3.3 路由

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

(a)其他同伴的网络地址

(b)专门用于服务特定对象的对等节点

IPFS使用基于S / Kademlia和Coral的DSHT,在2.1节中具体介绍过。在对象大小和使用模式方面, IPFS 类似于Coral[5] 和Mainline[16], 因此,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) // 获取服务于该大数据的节点。

}

注意:

不同的用例将要求基本不同的路由系统(例如广域网中使用DHT,局域网中使用静态HT)。因此,IPFS路由系统可以根据用户的需求替换的。只要使用上面的接口就可以了,系统都能继续正常运行。

3.4 块交换 - BitSwap协议

IPFS 中的BitSwap协议受到BitTorrent 的启发,通过对等节点间交换数据块来分发数据的。像BT一样, 每个对等节点在下载的同时不断向其他对等节点上传已下载的数据。和BT协议不同的是, BitSwap 不局限于一个torrent文件中的数据块。BitSwap 协议中存在一个永久的市场。 这个市场包括各个节点想要获取的所有块数据。而不管这些块是哪些如.torrent文件中的一部分。这些快数据可能来自文件系统中完全不相关的文件。 这个市场是由所有的节点组成的。

虽然易货系统的概念意味着可以创建虚拟货币,但这将需要一个全局分类账本来跟踪货币的所有权和转移。这可以实施为BitSwap策略,并将在未来的论文中探讨。

在基本情况下,BitSwap节点必须以块的形式彼此提供直接的值。只有当跨节点的块的分布是互补的时候,各取所需的时候,这才会工作的很好。 通常情况并非如此,在某些情况下,节点必须为自己的块而工作。 在节点没有其对等节点所需的(或根本没有的)情况下,它会更低的优先级去寻找对等节点想要的块。这会激励节点去缓存和传播稀有片段, 即使节点对这些片段不感兴趣。

3.4.1 BITSWAP 信用

这个协议必须带有激励机制, 去激励节点去seed 其他节点所需要的块,而它们本身是不需要这些块的。 因此, BitSwap的节点很积极去给对端节点发送块,期待获得报酬。但必须防止水蛭攻击(空负载节点从不共享块),一个简单的类似信用的系统解决了这些问题:

1, 对等节点间会追踪他们的平衡(通过字节认证的方式)。

2, 随着债务增加而概率降低,对等者概率的向债务人发送块。注意的是,如果节点决定不发送到对等体,节点随后忽略对等体的ignore_cooldown超时。 这样可以防止发送者尝试多次发送(洪水攻击) (BitSwap默认是10秒)。

3.4.2 BITSWAP的策略

BitSwap 对等节点采用很多不同的策略,这些策略对整个数据块的交换执行力产生了不同的巨大影响。在BT 中, 标准策略是明确规定的(tit-for-tat),其他不同的策略也已经被实施,从BitTyrant [8](尽可能分享)到BitThief [8](利用一个漏洞,从不共享),到PropShare [8](按比例分享)。BitSwap 对等体可以类似地实现一系列的策略(良好和恶意)。对于功能的选择,应该瞄准:

1.为整个交易和节点最大化交易能力。

2.为了防止空负载节点利用和损害交易。

3.高效抵制未知策略。

4.对可信任的对等节点更宽容。

探索这些策略的空白是未来的事情。在实践中使用的一个选择性功能是sigmoid,根据负债比例进行缩放:

让负债比例在一个节点和它对等节点之间:

r = bytes_sent / bytes_recv + 1

根据r,发送到负债节点的概率为:

P(send | r ) = 1 − ( 1/ ( 1 + exp(6 − 3r) ) )

正如你看到的图片1,当节点负债比例超过节点已建立信贷的两倍,发送到负债节点的概率就会急速下降。

图片1 当r增加时发送的概率

负债比是信任的衡量标准:对于之前成功的互换过很多数据的节点会宽容债务,而对不信任不了解的节点会严格很多。这个(a)给与那些创造很多节点的攻击者(sybill 攻击)一个障碍。(b)保护了之前成功交易节点之间的关系,即使这个节点暂时无法提供数据。(c)最终阻塞那些关系已经恶化的节点之间的通信,直到他们被再次证明。

3.4.3 BITSWAP 账本

BitSwap节点保存了一个记录与所有其他节点之间交易的账本。这个可以让节点追踪历史记录以及避免被篡改。当激活了一个链接,BitSwap节点就会互换它们账本信息。如果这些账本信息并不完全相同,分类账本将会重新初始化, 那些应计信贷和债务会丢失。 恶意节点会有意去失去“这些“账本, 从而期望清除自己的债务。节点是不太可能在失去了应计信托的情况下还能累积足够的债务去授权认证。伙伴节点可以自由的将其视为不当行为, 拒绝交易。

type Ledger struct {

owner NodeId

partner NodeId

bytes_sent int

bytes_recv int

timestamp Timestamp

}

节点可以自由的保留分布式账本历史,这不需要正确的操作,因为只有当前的分类账本条目是有用的。节点也可以根据需要自由收集分布式帐本,从不太有用的分布式帐开始:老(其他对等节点可能不存在)和小。

3.4.4 BITSWAP 详解

BitSwap 节点有以下简单的协议。

// Additional state kept

type BitSwap struct {

ledgers map[NodeId]Ledger // Ledgers known to this node, inc inactive

active map[NodeId]Peer // currently open connections to other nodes

need_list []Multihash // checksums of blocks this node needs

have_list []Multihash // checksums of blocks this node has

}

type Peer struct {

nodeid NodeId

ledger Ledger // Ledger between the node and this peer

last_seen Timestamp // timestamp of last received message

want_list []Multihash // checksums of all blocks wanted by peer

// includes blocks wanted by peer's peers

}

// Protocol interface:

interface Peer {

open (nodeid : NodeId, ledger : Ledger);

send_want_list (want_list : WantList);

send_block(block: Block) -> (complete:Bool);

close(final: Bool);

}

对等连接的生命周期草图:

1.Open: 对等节点间发送ledgers 直到他们同意。

2.Sending: 对等节点间交换want_lists 和blocks。

3.Close: 对等节点断开链接。

4.Ignored: (特殊)对等体被忽略(等待时间的超时)如果节点采用防止发送策略。

Peer.open(NodeId, Ledger).

当发生链接的时候,节点会初始化链接的账本,要么保存一个份链接过去的账本,要么创建一个新的被清零的账本。然后,发送一个携带账本的open信息给对等节点。

接收到一个open信息之后,对等节点可以选择是否接受此链接。如果,根据接收者的账本,发送者是一个不可信的代理(传输低于零或者有很大的未偿还的债务),接收者可能会选择忽略这个请求。忽略请求是ignore_cooldown超时来概率性实现的,为了让错误能够有时间改正和攻击者被挫败。

如果链接成功,接收者用本地账本来初始化一个Peer对象以及设置last_seen时间戳。然后,它会将接受到的账本与自己的账本进行比较。如果两个账本完全一样,那么这个链接就被Open,如果账本并不完全一致,那么此节点会创建一个新的被清零的账本并且会发送此账本。

Peer.send_want_list(WantList)

当链接已经Open的时候,节点会广发它们的want_list给所有已经链接的对等节点。这个是在(a)open链接后(b)随机间歇超时后(c)want_list改变后(d)接收到一个新的块之后完成的。

当接收到一个want_list之后,节点会存储它。然后,会检查自己是否拥有任何它想要的块。如果有,会根据上面提到的BitSwap策略来将want_list所需要的块发送出去。

Peer.send_block(Block)

发送一个块是直接了当的。节点只是传输数据块。当接收到了所有数据的时候,接收者会计算多重hash校验和来验证它是否是自己所需数据,然后发送确认信息。

在完成一个正确的块传输之后,接受者会将此块从need_list一到have_list,最后接收者和发送者都会更新它们的账本来反映出传输的额外数据字节数。

如果一个传输验证失败了,发送者要么会出故障要么会攻击接收者,接收者可以选择拒绝后面的交易。注意,BitSwap是期望能够在一个可靠的传输通道上进行操作的,所以传输错误(可能会引起一个对诚实发送者错误的惩罚)是期望在数据发送给BitSwap之前能够被捕捉到。

Peer.close(Bool)

传给close最后的一个参数,代表close链接是否是发送者的意愿。如果参数值为false,接收者可能会立即重新open链接,这避免链过早的close链接。

一个对等节点close链接发生在下面两种情况下:

silence_wait超时已经过期,并且没有接收到来自于对等节点的任何信息(BitSwap默认使用30秒),节点会发送Peer.close(false)。

在节点退出和BitSwap关闭的时候,节点会发送Peer.close(true).

接收到close消息之后,接收者和发送者会断开链接,清除所有被存储的状态。账本可能会被保存下来为了以后的便利,当然,只有在被认为账本以后会有用时才会被保存下来。

注意点:

非open信息在一个不活跃的连接上应该是被忽略的。在发送send_block信息时,接收者应该检查这个块,看它是否是自己所需的,并且是否是正确的,如果是,就使用此块。总之,所有不规则的信息都会让接收者触发一个close(false)信息并且强制性的重初始化此链接。

3.5 Merkle DAG对象

DHT和BitSwap允许IPFS构造一个庞大的点对点系统用来快速稳定的分发和存储。最主要的是,IPFS建造了一个Merkle DAG,一个无回路有向图,对象之间的links都是hash加密嵌入在源目标中。这是Git数据结构的一种推广。Merkle DAGS给IPFS提供了很多有用的属性,包括:

内容可寻址:所有内容都是被多重hash校验和来唯一识别的,包括links。

防止篡改:所有的内容都用它的校验和来验证。如果数据被篡改或损坏,IPFS会检测到。

重复数据删除:所有的对象都拥有相同的内容并只存储一次。这对于索引对象非常有用,比如git的tree和commits,或者数据的公共部分。

IPFS对象的格式是:

type IPFSLink struct {

Name string // 此link的别名

Hash Multihash // 目标的加密hash

Size int // 目标总大小

}

type IPFSObject struct {

links []IPFSLink //links数组

data []byte //不透明内容数据

}

IPFS Merkle DAG是存储数据非常灵活的一种方式。只要求对象引用是(a)内容可寻址的,(b)用上面的格式编码。IPFS允许应用完全的掌控数据域;应用可以使用任何自定义格式的数据,即使数据IPFS都无法理解。单独的内部对象link表允许IPFS做:

用对象的形式列出所有对象引用,例如:

> ipfs ls /XLZ1625Jjn7SubMDgEyeaynFuR84ginqvzb

XLYkgq61DYaQ8NhkcqyU7rLcnSa7dSHQ16x 189458 less

XLHBNmRQ5sJJrdMPuu48pzeyTtRo39tNDR5 19441 script

XLF4hwVHsVuZ78FZK6fozf8Jj9WEURMbCX4 5286 template

解决字符串路经查找,例如foo/bar/baz。给出一个对象,IPFS会解析第一个路经成分进行hash放入到对象的link表中,再获取路径的第二个组成部分,一直如此重复下去。因此,任何数据格式的字符串路经都可以在Merkle DAG中使用。

*递归性的解决所有对象引用:

> ipfs refs --recursive \

/XLZ1625Jjn7SubMDgEyeaynFuR84ginqvzb

XLLxhdgJcXzLbtsLRL1twCHA2NrURp4H38s

XLYkgq61DYaQ8NhkcqyU7rLcnSa7dSHQ16x

XLHBNmRQ5sJJrdMPuu48pzeyTtRo39tNDR5

XLWVQDqxo9Km9zLyquoC9gAP8CL1gWnHZ7z

原始数据结构公共link结构是IPFS构建任意数据结构的必要组成部分。可以很容易看出Git的对象模型是如何套用DAG的。一些其他潜在的数据结构:

(a)键值存储

(b)传统关系型数据

(c)数据三倍存储

(d) 文档发布系统

(e)通信平台

(f)加密货币区块。

这些系统都可以套用IPFS Merkle DAG,这使这些系统更复杂的应用可以使用IPFS作为传输协议。

3.5.1 路经

IPFS对象可以遍历一个字符串路经。路经格式与传统UNIX文件系统以及Web一致。Merkle DAG的links使遍历变得很容易。全称路经在IPFS中的格式是:

*# 格式

/ipfs//

*# 例子

/ipfs/XLYkgq61DYaQ8NhkcqyU7rLcnSa7dSHQ16x/foo.txt

/ipfs前缀允许只要在挂载点不冲突(挂载点名称当然是可配置的)的情况下挂载到一个已存在的系统上。第二个路经组成部分(第一个是IPFS)是一个对象的hash。通常都是这种情况,因为没有全局的根。一个根对象可能会有一个不可能完成的任务,就是在分布式环境(可能还断开链接)中处理百万对象的一致性。因此,我们用地址可寻址来模拟根。通过的hash所有的对象都是可访问的。这意思是说,给一个路经对象/bar/baz,最后一个对象可以可以被所有的访问的:

/ipfs//bar/baz

/ipfs//baz

/ipfs/

3.5.2 本地对象

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

最终,所有的块在IPFS中都是能够获取的到的,块都存储在了一些节点的本地存储器中。当用户请求一个对象时,这个对象会被查找到并下载下来存储到本地,至少也是暂时的存储在本地。这为一些可配置时间量提供了快速的查找。

3.5.3 对象锁定

希望确保特定对象生存的节点可以锁定此对象。这保证此特定对象被保存在了节点的本地存储器上。也可以递归的进行锁定所有相关的派生对象。这使所有被指定的对象都保存在本地存储器上。这对长久保存文件特别有用,包括引用。这也同样让IPFS成为一个links是永久的Web,且对象可以确保其他被指定对象的生存。

3.5.4 发布对象

IPFS是全球分布的。它设计为允许成千上万的用户文件可以共同的存在的。DHT使用内容哈希寻址技术,使发布对象是公平的,安全的,完全分布式的。任何人都可以发布对象,只需要将对象的key加入到DHT中,并且以对象是对等节点的方式加入进去,然后把路径给其他的用户。要注意的是,对象本质上是不可改变的,就像在Git中一样。新版本的哈希值不同,因此是新对象。跟踪版本则是额外版本对象的工作。

3.5.5 对象级别的加密

IPFS是具备可以处理对象级别加密操作的。一个已加密的或者已签名的对象包装在一个特殊的框架里,此框架允许加密和验证原始字节。

type EncryptedObject struct {

Object []bytes // 已加密的原始对象数据

Tag []bytes // 可选择的加密标识

type SignedObject struct {

Object []bytes // 已签名的原始对象数据

Signature []bytes // HMAC签名

PublicKey []multihash // 多重哈希身份键值

}

加密操作改变了对象的哈希值,定义一个不同的新的对象。IPFS自动的验证签名以及使用用户指定的钥匙链解密数据。加密数据的links也同样的被保护着,没有解密秘钥就无法遍历对象。也存在着一种现象,可能父对象使用了一个秘钥进行了加密,而子对象使用了另一个秘钥进行加密或者根本没有加密。这可以保证links共享对象安全。

3.6 文件

IPFS在Merkle DAG上还为模型化版本文件系统定义了一组对象。这个对象模型与Git比较相似:

Block:一个可变大小的数据块

List:块或者其他链表的集合

Tree:块,链表,或者其他树的集合

Commit:树在版本历史记录中的一个快照

我原本希望使用与Git对象格式一致的模型,但那就必须要分开来引进在分布式文件系统中有用的某些特征,如

(a)快速大小查找(总字节大小已经加入到对象中)

(b)大文件的重复删除(添加到list对象)

(c)commits嵌入到trees中。不过,IPFS文件对象与Git还是非常相近的,两者之间进行交流都是有可能的。而且,Git的一个系列的对象可以被引进过来转换都不会丢失任何的信息。(UNIX文件权限等等)。

标记:下面的文件对象格式使用JSON。注意,虽然IPFS包含了JSON的互相转换,但是文件对象的结构体还是使用protobufs的二进制编码。

3.6.1 文件对象:BLOB

blob对象代表一个文件且包含一个可寻址的数据单元,IPFS的blobs就像Git的blobs或者文件系统数据块。它们存储用户的数据。需要留意的是IPFS文件可以使用lists或者blobs来表示。Blobs没有links。

{

"data": "some data here", // blobs无links

}

3.6.2 文件对象: LIST

List对象代表着由几个IPFS的blobs连接成的大文件或者重复数据删除文件。Lists包含着有序的blob序列或list对象。从某种程度上而言,IPFS的list函数就像一个间接块的文件系统。由于lists可以包含其他的lists,那么包含linked的链表和平衡树的拓扑结构是有可能的。有向图中相同的节点出现在多个不同地方允许在文件中重复数据删除。当然,循环是不可以能的,因为是被哈希寻址强制实行的。

{

"data": ["blob", "list", "blob"], //lists有一个对象类型的数组作为数据

"links": [

{ "hash": "XLYkgq61DYaQ8NhkcqyU7rLcnSa7dSHQ16x",

"size": 189458

},

{ "hash": "XLHBNmRQ5sJJrdMPuu48pzeyTtRo39tNDR5",

"size": 19441

},

{ "hash": "XLWVQDqxo9Km9zLyquoC9gAP8CL1gWnHZ7z",

"size": 5286

} //在links中lists是没有名字的

]

}

3.6.3 文件对象:TREE

IPFS中的tree对象与Git中相似,它代表着一个目录,一个名字到哈希值的映射。哈希值则表示着blobs,lists,其他的trees,或者commits。注意,传统路径的命名早已经被Merkle DAG实现了。

"data": ["blob", "list", "blob"],//trees有一个对象类型的数组作为数据

"links": [

{ "hash": "XLYkgq61DYaQ8NhkcqyU7rLcnSa7dSHQ16x",

"name": "less", "size": 189458 },

{ "hash": "XLHBNmRQ5sJJrdMPuu48pzeyTtRo39tNDR5",

"name": "script", "size": 19441 },

{ "hash": "XLWVQDqxo9Km9zLyquoC9gAP8CL1gWnHZ7z",

"name": "template", "size": 5286 }//trees是有名字的

]

}

3.6.4 文件对象:COMMIT

IPFS中的commit对象代表任何对象在版本历史记录中的一个快照。与Git中类似,但是它能够表示任何类型的对象。它同样link着发起对象。

3.6.5 版本控制

Commit对象代表着一个对象在历史版本中的一个特定快照。在两个不同的commit中比较对象(和子对象)可以揭露出两个不同版本文件系统的区别。只要commit和它所有子对象的引用是能够被访问的,所有前版本是可获取的,所有文件系统改变的全部历史是可访问的,这就与Merkle DAG对象模型脱离开来了。

Git版本控制工具的所有功能对于IPFS的用户是可用的。对象模型不完全一致,但也是可兼容的。这可能:

(a)构建一个Git工具版本改造成使用IPFS对象图,

(b)构建一个挂载FUSE文件系统,挂载一个IPFS的tree作为Git的仓库,把Git文件系统的读/写转换为IPFS的格式。

3.6.6 文件系统路径

如我们在Merkle DAG中看到的一样,IPFS对象可以使用字符串路径API来遍历。IPFS文件对象是特意设计的,为了让挂载IPFS到UNIX文件系统更加简单。文件对象限制trees没有数据,为了使它们可以表示目录。Commits可以以代表目录的形式出现,也可以完全的隐藏在文件系统中。

3.6.7 将文件分隔成LISTS和BLOBS

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

就像在LIBFS[?]中一样使用Rabin Fingerprints [?]来选择一个比较合适的块边界。

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

允许用户指定专为特定文件而调整的’快分隔’函数。

3.6.8 路径查找性能

基于路径的访问需要遍历对象图。获取每个对象要求在DHT中查找它们的key,连接到对等节点,然后获取它的块。这造成相当大的开销,特别是查找的路径由很多子路径组成时。下面的方法可以减缓开销:

tree缓存:由于所有的对象都是哈希寻址的,它们可以被无限的缓存。另外,trees一般比较小,所以比起blobs,IPFS会优先缓存trees。

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

例如,对于上面的ttt111的flattened tree如下:

{

"data":

["tree", "blob", "tree", "list", "blob" "blob"],

"links": [

{

"hash": "",

"size": 1234

"name": "ttt222-name"

},

{

"hash": "",

"size": 123,

"name": "ttt222-name/bbb111-name"

},

{

"hash": "",

"size": 3456,

"name": "ttt333-name"

},

{

"hash": "",

"size": 587,

"name": "ttt333-name/lll111-name"

},

{

"hash": "",

"size": 22,

"name": "ttt333-name/lll111-name/bbb222-name"

},

{

"hash": "",

"size": 22

"name": "bbb222-name"

}

]

}

3.7 IPNS:命名以及易变状态

目前为止,IPFS桟形成了一个对等块交换组成一个内容可寻址的DAG对象。这提供了发布和获取不可改变的对象。这甚至可以跟踪这些对象的版本历史记录。但是,这里有一个关键成分遗漏了:易变的命名。没有这个,发送IPFS的links,所有新内容的通信肯定都会有所偏差。现在所需就是能有某些方法可以获取相同路径的的易变状态。

这值得详述原因—如果最终易变数据是必须的—我们费了很大的力气构建了一个不可改变的Merkle DAG。就当做IPFS脱离了Merkle DAG的特征:对象可以

(a)通过哈希值可以获取

(b)完整性的检查

(c)link其他的对象

(d)无限缓存。从某种意义上说:

对象就是永恒的

这些就是一个高性能分布式系统的关键特征,在此系统上跨网络links之间移动文件是非常昂贵的。对象内容可寻址构建了一个具有以下特点的Web,(a)优秀的宽带优化(b)不受信任的内容服务(c)永恒的links(d)能够永久备任何对象以及它的引用。

不可变的内容可寻址对象和命名的Merkle DAG, 可变指针指向Merkle DAG,实例化了一个出现在很多成功分布式系统中的二分法。这些系统包括Git的版本控制系统,使用不可变的对象和可变的引用;还有UNIX分布式的继承者Plan9[?]文件系统,使用可变的Fossil和不可变的Venti[?]。LBFS[?]同样使用可变的索引以及不可变的块。

3.7.1 自我认证名称

使用SFS[12,11]中的命名方案,给我们提供了一个种可以构建自我认证名称的方法,

在一个加密指定的全局命名空间中,这是可变的。IPFS的方案如下:

1.回想一下在IPFS中:NodeId = hash(node.PubKey)

2.我们给每个用户分配一个可变的命名空间,在此路径下:/ipns/

3.一个用户可以在此路径下发布一个用自己私钥签名的对象,比如说:/ipns/XLF2ipQ4jD3UdeX5xp1KBgeHRhemUtaA8Vm/

4.当其他用户获取对象时,他们可以检测签名是否与公钥和NodeId匹配。这个验证了用户发布对象的真实性,达到了可变状态的获取。

注意下面的细节:

IPNS(InterPlanetary的命名空间)分开前缀是在可变和不可变的路径之间建立一个很容易辨认的区别,为了程序也为了人类阅读的便利。

因为这不是一个内容可寻址的对象,所以发布它就要依靠IPFS中的唯一的可变状态分配制度,路由系统。过程是(a)首先把此对象做一个常规的不可变IPFS的对象来发布(b)将此对象的哈希值作为元数据的值发布到路由系统上:

routing.setValue(NodeId, )

发布的对象中任何links在命令空间中充当子名称:

/ipns/XLF2ipQ4jD3UdeX5xp1KBgeHRhemUtaA8Vm/

/ipns/XLF2ipQ4jD3UdeX5xp1KBgeHRhemUtaA8Vm/docs

/ipns/XLF2ipQ4jD3UdeX5xp1KBgeHRhemUtaA8Vm/docs/ipfs

一般建议发布一个commit对象或者其他对象的时候,要使用历史版本记录,因为这样就用户就可以找到之前使用过的名字。不过由于这并不总是需要的,所以留个用户自己选择。

注意当用户发布一个对象的时候,他不能使用相同的方式来发布对象。

3.7.2 人类友好名称

IPNS的确是一个分配和在分配名称的好方法,但是对用户却不是十分友好的,因为它使用很长的哈希值作为名称,众所周知这样的名称很难被记住。IPNS足够应付URLs,但对于很多线下的传输工作就没有这么好用了。因此,IPFS使用下面的技术来增加IPNS的用户友好度。

对等节点Links被SFS所鼓舞,用户可以直接将其他用户的对象link到自己的对象上(命令空间,家目录等等)。这有一个好处就是创建了一个可信任的Web(也支持老的真实性认证模型):

# Alice links 到Bob上

ipfs link //friends/bob /

# Eve links 到Alice上

ipfs link /

# Eve 也可以访问Bob

/

# 访问Verisign 认证域

//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

Proquint 可读的标识符

总是会有将二进制编码翻译成可读文件的方法。IPNS则支持Proquint[?].。如下:

# proquint语句

/ipns/dahih-dolij-sozuk-vosah-luvar-fuluh

# 分解为相应的下面形式

/ipns/KhAwNprxYVxKqpDZ

缩短名称服务

会涌现出很多服务器提供缩短名称的服务,向用户提供他们的命名空间。就像我们现在看到的DNS和Web的URLs:

# 用户可以从下面获取一个link

/ipns/shorten.er/foobar

# 然后放到自己的命名空间

/ipns/XLF2ipQ4jD3UdeX5xp1KBgeHRhemUtaA8Vm

3.8 使用IPFS

IPFS设计为可以使用多种不同的方法来使用的,下面就是一些我将会继续追求的使用方式:

1.作为一个挂载的全局文件系统,挂载在/ipfs和/ipns下

2.作为一个挂载的个人同步文件夹,自动的进行版本管理,发布,以及备份任何的写入

3.作为一个加密的文件或者数据共享系统

4.作为所有软件的版本包管理者

5.作为虚拟机器的根文件系统

6.作为VM的启动文件系统 (在管理程序下)

7.作为一个数据库:应用可以直接将数据写入Merkle DAG数据模型中,获取所有的版本,缓冲,以及IPFS提供的分配

8.作为一个linked(和加密的)通信平台

9.作为一个为大文件的完整性检查CDN(不使用SSL的情况下)

10.作为一个加密的CDN

11.在网页上,作为一个web CDN

12.作为一个links永远存在新的永恒的Web

IPFS实现的目标:

(a)一个IPFS库可以导出到你自己应用中使用

(b)命令行工具可以直接操作对象

(c)使用FUSE[?]或者内核的模型挂载文件系统

4 未来

IPFS的思想是几十年成功的分布式系统的探索和开源的产物。IPFS综合了很多迄今为止很成功的系统中优秀的思想。除了BitSwap新协议之外,IPFS最大的特色就是系统的耦合以及设计的综合性。

IPFS是去中心化网络基础设施的一个野心设想,很多不同类型的应用都可以建立在IPFS上。最低限度,它可以用来作为一个全局的,挂载性,版本控制文件系统和命名空间,或者作为下一代的文件共享系统。而最好的情况是,IPFS可以让Web升级一个层次,当发布一个有价值的信息时,任何感兴趣的人都可以进行发布而不会强迫性的必须只允许发布机构进行发布,用户可以信任信息的内容,信不信任信息的发送者都是无关紧要的,还有一个特点就是,一些重要但很老的文件也不会丢失。IPFS期待着带我们进入到一个永恒Wdb的世界。

5 感谢

IPFS是一个很多很棒的主意以及系统的综合体。没有站在巨人的肩膀上,IPFS也不可能敢于有一个这么有野心的目标。

个人感谢参与这些主意长期讨论的人:

David Dalrymple, Joe Zimmerman, and Ali Yahya,特别是:揭开Merkle DAG的总体架构(David, Joe),滚动哈希阻塞(David), s/kademlia sybill 保护(David, Ali),特别感谢David Mazieres,为他之前非常聪明的主意。

6 引用

[1].I. Baumgart and S. Mies. S/kademlia:一个安全的基于秘钥路由的可行方法。2007年国际会议,第2卷,1-8页,在《并发和分布式系统》中。IEEE,2007年。

[2].I. BitTorrent.Bittorrent和Attorrent软件超过1亿5000万用户里程碑,Jan。2012

[3].B. Cohen.激励机制在bittorrent中建立了健壮性。在《对等系统经济研讨会》中,第6卷,68-72页,2003年。

[4].J. Dean and S. Ghemawat. Leveldb - 一个快速和轻量级键值存储数据库,谷歌提供,2011年。

[5].M. J. Freedman, E. Freudenthal, and D. Mazieres. Coral民主内容发布。在NSDI中,第4卷,18-18页,2004年。

[6].J. H. Howard, M. L. Kazar, S. G. Menees, D. A,Nichols, M. Satyanarayanan, R. N. Sidebotham, 以及M. J. West.分布式文件系统的规模和性能。“ACM电脑系统上的交易 (TOCS)” 6(1):51-81, 1988年IPFS白皮书摘要1 介绍2 背景3 IPFS设计4 未来5 感谢6 引用Filecoin白皮书摘要1 介绍2 去中心化存储网络的定义3 复制证明与时空证明4 filecoindsn构建5 filecoin的存储和检索市场6 有用工作共识7 智能合约8 未来的工作参考文献文档入门指南API文档ContributingFAQ链接GitHubIPFS官方知乎专栏BinSTD微信公众号社区社群资源更多QQ开发群微信开发群Copyright © 2018 binstd I

带你读《IPFS原理与实践》之一:认识IPFS-阿里云开发者社区

带你读《IPFS原理与实践》之一:认识IPFS-阿里云开发者社区

产品解决方案文档与社区权益中心定价云市场合作伙伴支持与服务了解阿里云售前咨询 95187-1 在线服务售后咨询 4008013260 在线服务其他服务 我要建议 我要投诉更多联系方式备案控制台开发者社区首页探索云世界探索云世界云上快速入门,热门云上应用快速查找了解更多问产品动手实践考认证TIANCHI大赛活动广场活动广场丰富的线上&线下活动,深入探索云世界任务中心做任务,得社区积分和周边高校计划让每位学生受益于普惠算力训练营资深技术专家手把手带教话题畅聊无限,分享你的技术见解开发者评测最真实的开发者用云体验乘风者计划让创作激发创新阿里云MVP遇见技术追梦人直播技术交流,直击现场下载下载海量开发者使用工具、手册,免费下载镜像站极速、全面、稳定、安全的开源镜像技术资料开发手册、白皮书、案例集等实战精华插件为开发者定制的Chrome浏览器插件探索云世界新手上云云上应用构建云上数据管理云上探索人工智能云计算弹性计算无影存储网络倚天云原生容器serverless中间件微服务可观测消息队列数据库关系型数据库NoSQL数据库数据仓库数据管理工具PolarDB开源向量数据库热门Modelscope模型即服务弹性计算云原生数据库物联网云效DevOps龙蜥操作系统平头哥钉钉开放平台大数据大数据计算实时数仓Hologres实时计算FlinkE-MapReduceDataWorksElasticsearch机器学习平台PAI智能搜索推荐人工智能机器学习平台PAI视觉智能开放平台智能语音交互自然语言处理多模态模型pythonsdk通用模型开发与运维云效DevOps钉钉宜搭支持服务镜像站码上公益

开发者社区

华章出版社

文章

正文

带你读《IPFS原理与实践》之一:认识IPFS

2019-11-11

11573

版权

版权声明:

本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《

阿里云开发者社区用户服务协议》和

《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写

侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

简介:

本书由国内IPFS社区公认 的领袖撰写,从技术、原理与实战3个维度讲解了IPFS。全书一共分为3个部分:第一部分:准备篇(第1章)从宏观角度简单介绍了IPFS的概念、价值以及与区块链的关系;第二部分:原理篇(第2~5章)分别深入讲解了IPFS的工作原理、底层基础、协议栈和架构。第三部分:实战篇(第6~8章)——应用IPFS讲解了IPFS应用开发的技术、方法,并配合有个综合性的案例。第四部分:扩展篇(第9章)前瞻性地讲解了IPFS与其他领域的知识的一些扩展。

点击查看第二章IPFS原理与实践

董天一 戴嘉乐 黄禹铭 著

第1章

认识IPFS欢迎大家来到第1章。在这一章里,我们首先将从宏观上介绍IPFS。在了解技术细节之前,我们先来回答如下问题:什么是IPFS?为什么我们需要IPFS?它与常规的区块链系统相比有什么异同?IPFS和Filecoin会给现在的区块链技术带来什么样的改变?相信读者读完这一章后,会对上述几个问题有自己的理解。

1.1 IPFS概述

早在2017年上半年,国内大部分投资人或开发者就已经接触到了IPFS和Filecoin项目。那么IPFS和Filecoin究竟是什么?IPFS与区块链到底是什么关系?其有什么优势,竟然会得到如此广泛的关注?其未来的应用前景到底如何?本节我们就来解答这几个问题。

1.1.1 IPFS的概念和定义

IPFS(InterPlanetary File System)是一个基于内容寻址的、分布式的、新型超媒体传输协议。IPFS支持创建完全分布式的应用。它旨在使网络更快、更安全、更开放。IPFS是一个分布式文件系统,它的目标是将所有计算设备连接到同一个文件系统,从而成为一个全球统一的存储系统。某种意义上讲,这与Web最初的目标非常相似,但是它是利用BitTorrent协议进行Git数据对象的交换来达到这一个目的的。IPFS正在成为现在互联网的一个子系统。IPFS有一个更加宏伟而疯狂的目标:补充和完善现有的互联网,甚至最终取代它,从而成为新一代的互联网。这听起来有些不可思议,甚至有些疯狂,但的确是IPFS正在做的事情。图1-1所示为IPFS的官方介绍。

IPFS项目通过整合已有的技术(BitTorrent、DHT、Git和SFS),创建一种点对点超媒体协议,试图打造一个更加快速、安全、开放的下一代互联网,实现互联网中永久可用、数据可以永久保存的全球文件存储系统。同时,该协议有内容寻址、版本化特性,尝试补充甚至最终取代伴随了我们20多年的超文本传输协议(即HTTP协议)。IPFS是一个协议,也是一个P2P网络,它类似于现在的BT网络,只是拥有更强大的功能,使得IPFS拥有可以取代HTTP的潜力。Filecoin是运行在IPFS上的一个激励层,是一个基于区块链的分布式存储网络,它把云存储变为一个算法市场,代币(FIL)在这里起到了很重要的作用。代币是沟通资源(存储和检索)使用者(IPFS用户)和资源的提供者(Filecoin矿工)之间的中介桥梁,Filecoin协议拥有两个交易市场—数据检索和数据存储,交易双方在市场里面提交自己的需求,达成交易。IPFS和Filecoin相互促进,共同成长,解决了互联网的数据存储和数据分发的问题,特别是对于无数的区块链项目,IPFS和Filecoin将作为一个基础设施存在。这就是为什么我们看到越来越多的区块链项目采取了IPFS作为存储解决方案,因为它提供了更加便宜、安全、可快速集成的存储解决方案。

1.1.2 IPFS的起源

全球化分布式存储网络并不是最近几年的新鲜品,其中最有名的3个就是BitTorrent、Kazaa、和Napster, 至今这些系统在全世界依旧拥有上亿活跃用户。尤其是BitTorrent客户端,现在BitTorrent网络每天依然有超过1000万个节点在上传数据。(不少刚从高校毕业的朋友应该还记得在校内网IPv6上分享电影和游戏资源的情景)但令人遗憾的是,这些应用最初就是根据特定的需求来设计的,在这三者基础上灵活搭建更多的功能显然很难实现。虽然在此之前学术界和工业界做过一些尝试,但自始至终没有出现一个能实现全球范围内低延时并且完全去中心化的通用分布式文件系统。之所以普及进展十分缓慢,一个原因可能是目前广泛使用的HTTP协议已经足够好用。截至目前,HTTP是已经部署的分布式文件系统中最成功的案例。它和浏览器的组合是互联网数据传输和展示的最佳搭档。然而,互联网技术的进步从未停止,甚至一直在加速。随着互联网的规模越来越庞大,现有技术也越来越暴露出了诸多弊端,庞大的基础设施投资也让新技术的普及异常困难。但我们说,技术都有其适用的范围,HTTP也是如此。四大问题使得HTTP面临越来越艰巨的困难:1)极易受到攻击,防范攻击成本高。随着Web服务变得越来越中心化,用户非常依赖于少数服务供应商。HTTP是一个脆弱的、高度中心化的、低效的、过度依赖于骨干网的协议,中心化的服务器极易成为攻击的目标。当前,为了维护服务器正常运转,服务商不得不使用各类昂贵的安防方案,防范攻击成本越来越高。这已经成为HTTP几乎无法克服的问题。2)数据存储成本高。经过十多年互联网的飞速发展,互联网数据存储量每年呈现指数级增长。2011年全球数据总量已经达到0.7ZB(1ZB等于1万亿GB);2015年,全球的数据总量为8.6ZB;2016年,这个数字是16.1ZB。到2025年,全球数据预计将增长至惊人的163ZB,相当于2016年所产生16.1ZB数据的10倍。如果我们预计存储4000GB(4TB)的数据,AWS简单存储服务(S3)的报价是对于第1个TB每GB收取0.03美金,对于接下来的49TB每GB收取0.0295美金的费用,那么每个月将花费118.5美金用于磁盘空间。数据量高速增长,但存储的价格依旧高昂,这就导致服务器-客户端架构在今后的成本将会面临严峻的挑战。3)数据的中心化带来泄露风险。服务提供商们在为用户提供各类方便服务的同时,也存储了大量的用户隐私数据。这也意味着一旦数据中心产生大规模数据泄露,这将是一场数字核爆。对于个人而言,用户信息泄露,则用户账号面临被盗风险,个人隐私及财产安全难以保障;对于企业而言,信息泄露事件会导致其在公众中的威望和信任度下降,会直接使客户改变原有的选择倾向,可能会使企业失去一大批已有的或者潜在的客户。这并不是危言耸听,几乎每一年都会发生重大数据库泄露事件。2018年5月,推特被曝出现安全漏洞,泄露3.3亿用户密码;2017年11月,美国五角大楼意外泄露自2009年起收录的18亿条用户信息;2016年,LinkedIn 超1.67亿个账户在黑市被公开销售;2015年,机锋网被曝泄露2300万用户信息。有兴趣的读者可以尝试在公开密码泄露数据库中查询,是否自己的常用信息或常用密码被泄露,但自己却毫不知情。4)大规模数据存储、传输和维护难。现在逐步进入大数据时代,目前HTTP协议已无法满足新技术的发展要求。如何存储和分发PB级别的大数据、如何处理高清晰度的媒体流数据、如何对大规模数据进行修改和版本迭代、如何避免重要的文件被意外丢失等问题都是阻碍HTTP继续发展的大山。IPFS就是为解决上述问题而诞生的。它的优势如下:1)下载速度快。如图1-2所示,HTTP上的网站大多经历了中心化至分布式架构的变迁。与HTTP相比,IPFS将中心化的传输方式变为分布式的多点传输。IPFS使用了BitTorrent协议作为数据传输的方式,使得IPFS系统在数据传输速度上大幅度提高,并且能够节省约60%的网络带宽。2)优化全球存储。IPFS采用为数据块内容建立哈希去重的方式存储数据,数据的存储成本将会显著下降。3)更加安全。与现有的中心化的云存储或者个人搭建存储服务相比,IPFS、Filecoin的分布式特性与加密算法使得数据存储更加安全,甚至可以抵挡黑客攻击。4)数据的可持续保存。当前的Web页面平均生命周期只有100天,每天会有大量的互联网数据被删除。互联网上的数据是人类文明的记录和展示,IPFS提供了一种使互联网数据可以被可持续保存的存储方式,并且提供数据历史版本(Git)的回溯功能。

上文我们提到IPFS技术积累已经有很多年了,它至少参考了4种技术的优点,并将它们整合在一起。这4种技术分别是分布式哈希表DHT、Kademlia、Git和自验证文件系统(Self-Certifying File System)。第一种对IPFS有借鉴意义的技术是DHT,全称为分布式哈希表(Distributed Hash Table),是一种分布式存储方法。DHT的原理是:在不需要服务器的情况下,每一个客户端存储一小部分数据,并负责一定区域的检索,进而实现整个DHT网络的寻址和检索。新版BitComet允许同时连接DHT网络和Tracker,可以在无Tracker的情况下进行下载。IPFS借鉴的第二种技术是Kademlia。在Kademlia网络中,所有信息均以哈希表条目的形式加以存储,这些信息被分散地存储在各个节点上,从而以全网构成一张巨大的分布式哈希表。可以形象地把这张哈希大表看成一本字典:只要知道了信息索引的key,便可以通过Kademlia协议来查询与其对应的value信息,而不管这个value信息究竟是存储在哪一个节点之上。正是这一特性确保了IPFS成为没有中心调度节点的分布式系统。IPFS还借鉴了BitTorrent网络。首先是消极上传者的惩罚措施,在BitTorrent的客户端上传数据会奖励积分,而长期不上传的消极节点会被扣分,如果分数低于一定限度,那么网络会拒绝再为他们提供服务;其次是文件可用性检查,BitTorrent优先把稀缺的文件分享出去,各个客户端之间相互补充,这样种子不容易失效,传输效率也提高了。针对BitTorrent我们不再详细展开,有感兴趣的读者可以查阅BitTorrent相关文档。第三种对IPFS有重大影响的项目是Git。我们在进行大文件传输或修改的时候总会遇到存储或传输压力大的问题,而Git在版本迭代方面非常出色。Git存储时会把文件拆成若干个部分,并计算各个部分的哈希值,利用这些构建起与文件对应的有向无环图(DAG),DAG的根节点也就是该文件的哈希值。这样的好处十分明显:如果需要修改文件,那么只需要修改少数图中节点即可;需要分享文件,等价于分享这个图;需要传输全部的文件,按照图中的哈希值下载合并即可。最后一种是具有自验证功能的分布式文件系统(Self-certifying File System,SFS),它将所有的文件保存在同一个目录下,所有的文件都可以在相对路径中找到,其SFS路径名是其原路径与公钥的哈希。聪明的读者会发现,这样的设计包含身份的隐式验证功能,这就是为什么SFS被称为自验证文件系统了。

1.2 IPFS与区块链的关系

现在提到IPFS就一定会提到区块链。那么区块链和IPFS之间到底有什么关系呢?在介绍二者关系之前,我们需要先来了解一下区块链。

1.2.1 区块链基础

那么区块链又是什么呢?在最早期,区块链仅仅被认为是比特币的底层技术之一,是一种不可篡改的链式数据结构。经过几年的发展,区块链被越来越多的人熟知,它也从单纯的数据结构变成分布式账本的一系列技术的总称。它整合了加密、共识机制、点对点网络等技术。近些年,区块链的非账本类应用开始逐渐兴起,大家开始将区块链描述为分布式的数据库,认为它是价值传递网络,它逐渐被赋予了更多的内涵。从技术方面来讲,区块链是一种分布式数据库,旨在维护各个互相不信任的节点中数据库的一致性,并且不可篡改。信用和记录会被保存到区块链上,每一个新的区块中存有上一个区块的数字指纹、该区块的信用和记录,以及生成新区块的时间戳。这样一来,区块链会持续增长,并且很难被篡改,一旦修改区块链上任意一个区块的信息,那么后续区块的数字指纹也就全部失效了。链式数据结构使得区块链历史很难被篡改,而在各个互不信任的节点之间保持数据的一致性,则需要共识机制完成。共识机制是网络预先设定的规则,以此判断每一笔记录及每一个区块的真实性,只有那些判断为真的区块会被记录到区块链中;相反,不能通过共识机制的新区块会被网络抛弃,区块里记录的信息也就不再被网络认可。目前常见的共识机制包括PoW(工作量证明)、PoS(权益证明)、PBFT(实用拜占庭容错)等。比特币、以太币、比特币现金及大部分加密数字货币使用的是PoW工作量证明。维护比特币账本的节点被称为矿工,矿工每次在记录一个新区块的时候,会得到一定的比特币作为奖励。因此,矿工们会为自己的利益尽可能多地去争夺新的区块记账权力,并获得全网的认可。工作量证明要求新的区块哈希值必须拥有一定数量的前导0。矿工们把交易信息不断地与一个新的随机数进行哈希运算,计算得到区块的哈希值。一旦这个哈希值拥有要求数目的前导0,这个区块就是合法的,矿工会把它向全网广播确认。而其他的矿工收到这一新的区块,会检查这一区块的合法性,如果合法,新的区块会写入该矿工自己的账本中。这一结构如图1-3所示。

与要求证明人执行一定量的计算工作不同,PoS权益证明要求证明人提供一定数量加密货币的所有权即可。权益证明机制的运作方式是,当创造一个新区块时,矿工需要创建一个“币权”交易,交易会按照预先设定的比例把一些币发送给矿工。权益证明机制根据每个节点拥有代币的比例和时间,依据算法等比例降低节点的挖矿难度。这种共识机制可以加快共识,也因矿工不再继续竞争算力,网络能耗会大大降低。但也有专家指出,PoS权益证明牺牲部分网络去中心化的程度。目前,PoW和PoS是加密数字货币的主流算法,其他几个常见的共识机制有DPoS和PBFT,限于篇幅,这里不再进一步展开了。

1.2.2 区块链发展

1976年是奠定区块链的密码学基础的一年,这一年Whitfield Diffie与Martin Hellman(见图1-4)首次提出Diffie-Hellman算法,并且证明了非对称加密是可行的。与对称算法不同,非对称算法会拥有两个密钥—公开密钥和私有密钥。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。这是后来比特币加密算法的核心之一,我们使用比特币钱包生成私钥和地址时,通过椭圆曲线加密算法,生成一对公钥和私钥。有了私钥我们可以对一笔转账签名,而公钥则可以验证这一笔交易是由这个比特币钱包的所有者签名过的,是合法的。将公钥通过哈希运算,可以计算出我们的钱包地址。

1980年,Martin Hellman的学生Merkle Ralf提出了Merkle Tree(默克尔树)数据结构和生成算法。默克尔树最早是要建立数字签名证书的公共目录,能够确保在点对点网络中传输的数据块是完整的,并且是没有被篡改的。我们前面提到,在比特币网络中,每一个区块都包含了交易信息的哈希值。这一哈希值并不是直接将交易顺序连接,然后计算它们的哈希,而是通过默克尔树生成的。默克尔树如图1-5所示。默克尔树生成算法会将每笔交易做一次哈希计算,然后两两将计算后的哈希值再做哈希,直到计算到默克尔根。而这个默克尔根就包含了全部的交易信息。这样,能大大节省钱包的空间占用。例如,在轻钱包中,我们只需下载与自己钱包对应的交易信息,需要验证的时候,只需找到一条从交易信息的叶节点到根节点的哈希路径即可,而不需要下载区块链的全部数据。在IPFS项目里,也借鉴了默克尔树的思想。数据分块存放在有向无环图中,如果数据被修改了,只需要修改对应默克尔有向无环图中的节点数据,而不需要向网络重新更新整个文件。值得一提的是,Merkle在提出默克尔树时,分布式技术尚未成型,更别提数字货币了,而他在当时就能察觉并提出这样的方法,实在是令人赞叹。

非对称加密算法和默克尔树数字结构是后续数字货币和区块链的理论基础。而真正将密码学用于数字货币的尝试,则晚了许多。数字货币兴起于1990年的数字朋克(CyberPunk)运动,它是由一批热爱网络的极客们推动的。数字朋克们大多是密码学的专家,对于个人隐私十分向往,希望建立一套独立于现实中的国家、等级制度以外的空间。其中最典型的代表是David Chaum,他最早提出了盲签名技术,并将其应用到了Digit Cash项目(又名Ecash)中。盲签名是一种保护隐私的签名方式,它的签名者对其签署的消息不可见。比如,用户需要签署一个转账信息,而这一信息需要银行签名,用户为了保护隐私,不希望银行看到其具体的转账对象,就可以使用盲签名。David在他的论文中提出了用盲签名实现匿名货币的想法,具体方式是用户在本地计算机的Ecash程序中以数字格式存储现金,再交给银行进行盲签名。这套系统已经与当时的银行系统非常接近了,差一点获得了成功。但是Digit Cash始终需要中心化的银行服务器支持。在后续,没有一家银行愿意再支持他的项目,最终项目失败了。数字朋克运动中诞生的系统及关键人物如表1-1所示。

在Digit Cash失败后的几年里,人们几乎放弃了数字现金的构想。仅有少数数字朋克继续着研究。一个名为Hashcash的想法是在1997年由当时同为数字朋克的博士后研究员Adam Back独立发明的。Hashcash的想法很简单:它没有后门,也不需要中心第三方,它只使用哈希函数而不是数字签名。Hashcash基于一个简单的原理:哈希函数在某些实际用途中表现为随机函数,这意味着找到哈希到特定输出的输入的唯一方法是尝试各种输入,直到产生期望的输出为止。而且,为了找到这样一个符合条件的输入,唯一方法是再次逐个尝试对不同的输入进行哈希。所以,如果让你尝试找到一个输入,使得哈希值前10位是0,你将不得不尝试大量的输入,你每次尝试成功的机会是(1/2)10。这就是工作量证明的早期来源,也是矿工们每天在重复做的事情。他甚至在技术设计上做了一些修改,使其看起来更像一种货币。但显然,他的方案不能检验节点是否作弊,不能作为真正的数字现金。还有两位有杰出贡献的数字朋克—Hal Finney和Nick Szabo,他们经过重新考虑将技术整合了起来。Nick Szabo不仅是一位计算机科学家,同时精通法律。Szabo受到David Chaum的启发后,希望利用密码协议和安全机制,提出了数字合约的构想。数字合约能在网络上不依靠第三方协助而是利用程序来验证并执行合同,它与传统合同相比更安全,并且减少了烦琐沟通的成本。这对后续的加密数字货币设计有着极大的影响。比特币网络可以提供非图灵完备的脚本语言实现部分智能合约功能;以太坊则进一步在EVM上运行Solidity语言,提供了图灵完备的智能合约环境,这也为后续分布式应用开发奠定了基础。Nick做出的贡献还不只是发明了智能合约,在2008年,他发起了Bit Gold项目。在项目计划书中,Nick阐述的Bit Gold架构与现在的比特币完全相同,同样是工作量证明机制,同样是链式网络结构,同样的新区块包含旧区块的数字指纹,包含时间戳等诸多特性。然而,最终Bit Gold项目还是没有顺利完成。目前,Bit Gold可查寻的源头只有在Bitcoin Talk论坛中的帖子,后续的可查证资料就很少了。有一些比特币爱好者们一度认为Szabo就是中本聪本人,不仅因为Bit Gold与Bitcoin的也相似之处令大家充满想象,甚至是在词法和句法上,中本聪的比特币论文与Bit Gold论文也有相似之处。而且Nick家不远的地方,有一位叫中本聪的日本人,大家猜测这是Nick为了掩人耳目而故意隐藏自己的身份。Nick本人对此表示否认,并觉得这是个很搞笑的八卦。当然这也成为数字货币里最大谜团,究竟中本聪是谁呢?再之后,到了2009年,中本聪发表了比特币论文。他提出了一整套加密协议,而不仅仅是加密货币。比特币使用计算机程序控制货币的发行,发行总量2100万枚。比特币的账本记录在成千上万台计算机上,黑客无法入侵;每个账户都是加密地址,你不知道谁在花钱,但是每个比特币的流通都被记录,你知道它的来源和去向的地址。比特币是第一个达到上述全部思想的项目,整合了之前30多年的技术积累。比特币在设计之时,考虑到网络的稳定性和抵御恶意攻击,它使用的是非图灵完备的脚本语言(主要不能使用循环语句)。2013年,Vitalik Buterin 认为,比特币需要一种图灵完备的脚本语言来支持多样的应用开发。这个思路没有被比特币社区支持,于是 Buterin考虑用更通用的脚本语言开发一个新的平台,这就是后来的以太坊。以太坊在大致思路上与比特币相似,在账户状态、UTXO、地址形式上进行了一些优化。其最大的亮点在于,开发了Solidity智能合约编程语言和以太坊虚拟机(EVM)这一以太坊智能合约的运行环境,用于按照预期运行相同的代码。正因为EVM和Solidity,区块链的平台应用(DAPP)迅速兴起了。以太坊平台提出了许多新用途,包括那些不可能或不可行的用途,例如金融、物联网服务、供应链服务、电力采购和定价及博彩等。时至今日,基于DAPP的各类应用还在迅速发展,新的市场和需求在进一步被发现。后续区块链会如何发展,我们拭目以待。

1.2.3 IPFS为区块链带来了什么改变

区块链的诞生本是为了做到去中心化,在没有中心机构的情况下达成共识,共同维护一个账本。它的设计动机并不是为了高效、低能耗,抑或是拥有可扩展性(如果追求高效、低能耗和扩展性,中心化程序可能是更好的选择)。IPFS与区块链协同工作,能够补充区块链的两大缺陷:

区块链存储效率低,成本高。

跨链需要各个链之间协同配合,难以协调。

针对第1个问题,区块链网络要求全部的矿工维护同一个账本,需要每一个矿工留有一个账本的备份在本地。那么在区块链中存放的信息,为了保证其不可篡改,也需要在各个矿工手中留有一份备份,这样是非常不经济的。设想,现在全网有1万个矿工,即便我们希望在网络保存1MB信息,全网消耗的存储资源将是10GB。目前,也有折中的方案来缓解这一问题。在搭建去中心化应用DAPP时,大家广泛采取的方式是,仅在区块链中存放哈希值,将需要存储的信息存放在中心化数据库中。而这样,存储又成为去中心化应用中的一个短板,是网络中脆弱的一环。IPFS则提出了另一个解决方法:可以使用IPFS存储文件数据,并将唯一永久可用的IPFS地址放置到区块链事务中,而不必将数据本身放在区块链中。针对第2个问题,IPFS能协助各个不同的区块链网络传递信息和文件。比特币和以太坊区块结构不同,通过IPLD可以定义不同的分布式数据结构。这一功能目前还在开发中,目前的IPLD组件,已经实现了将以太坊智能合约代码通过IPFS存储,在以太坊交易中只需存储这个链接。

1.2.4 Filecoin:基于IPFS技术的区块链项目

在1.1节中我们介绍了IPFS的结构。Filecoin是IPFS的激励层。我们知道,IPFS网络要想稳定运行需要用户贡献他们的存储空间、网络带宽,如果没有恰当的奖励机制,那么巨大的资源开销很难维持网络持久运转。受到比特币网络的启发,将Filecoin作为IPFS的激励层就是一种解决方案了。对于用户,Filecoin能提高存取速度和效率,能带来去中心化等应用;对于矿工,贡献网络资源可以获得一笔不错的收益;而对于业务伙伴,例如数据中心,也能贡献他们的空闲计算资源用于获得一定的报酬。Filecoin会用于支付存储、检索和网络中的交易。与比特币类似,它的代币总量为2亿枚,其中70%会通过网络挖矿奖励贡献给矿工,15%为开发团队持有,10%给投资人,剩下5%为Filecoin基金会持有。投资人和矿工获得的代币按照区块发放,而基金会和开发团队的代币按照6年时间线性发放。由此可见,Filecoin与比特币挖矿机制完全不同。我们前面提到,为了避免攻击,比特币通过PoW工作量证明机制,要求矿工挖出下一个满足哈希值包含多个前导0的新区块。这个过程会需要大量的哈希运算。Filecoin使用的是复制证明(Proof of Replication,RoRep)。复制证明是矿工算力证明形成的主要方式,证明矿工在自己的物理存储设备上实际存储了数据,可以防止恶意矿工的各种攻击,网络中的验证节点会随机检查矿工是否在作弊。如果矿工不能提供正确的复制证明,那么它将被扣除一定的Filecoin作为惩罚。相比于PoW机制带来的算力竞争,PoRep显得环保的多。

1.3 IPFS的优势与价值

前文描述了IPFS大概的基础知识和与区块链的关系,这节我们详细介绍一下IPFS的优势和价值来源。

1.3.1 IPFS的优势

IPFS的优势在于其强大的技术积淀、精巧的架构设计及强大的开发者生态。1.技术优势IPFS技术可以分为多层子协议栈,从上至下为身份层、网络层、路由层、交换层、对象层、文件层、命名层,每个协议栈各司其职,又互相协同。图1-6所示为IPFS协议栈的构成。接下来我们逐一进行解释。(1)身份层和路由层对等节点身份信息的生成以及路由规则是通过Kademlia协议生成制定的,该协议实质上是构建了一个分布式哈希表,简称DHT。每个加入这个DSHT网络的节点都要生成自己的身份信息,然后才能通过这个身份信息去负责存储这个网络里的资源信息和其他成员的联系信息。

(2)网络层比较核心,所使用的Libp2p可以支持主流传输层协议。NAT技术能让内网中的设备共用同一个外网IP,我们都体验过的家庭路由器就是这个原理。(3)交换层IPFS吸取了BitTorrent的技术,并在其之上进行了再创新,自研了BitSwap模块。使用BitSwap进行数据的分发和交换,用户上传分享数据会增加信用分,分享得越多信用分越高;用户下载数据会降低信用分,当信用分低于一定值时,将会被其他节点忽略。简单来讲就是,你乐于分享数据,其他节点也乐于发送数据给你,如果你不愿意分享,那么其他节点也不愿意给你数据。(4)对象层和文件层这两层适合结合起来看,它们管理了IPFS上80%的数据结构,大部分数据对象都是以Merkle-DAG的结构存在,这为内容寻址和去重提供了便利。文件层具有blob、tree、list、commit等多种结构体,并采用与Git类似的方式来支持版本控制。(5)命名层具有自我验证的特性(当其他用户获取该对象时,将交换节点公钥进行验签,即验证公钥信息是否与NodeID匹配,从而来验证用户发布对象的真实性),并且加入了IPNS这个巧妙的设计使得哈希过后的内容路径名称可定义,增强可阅读性。新旧技术的更替无非两点:其一,能够提高系统效率;其二,能够降低系统成本。IPFS把这两点都做到了。图1-7是一个IPFS技术模块的和功能间的映射关系图,同时也是一个纵向数据流图。前文所描述的多层协议,每一层的实现都绑定在对应的模块下,非常直观。协议实验室在开发IPFS时,采用了高度模块集成化的方式,像搭积木一样去开发整个项目。截至2017年,协议实验室主要精力集中在设计并实现 IPLD、LibP2P、Multiformats 等基础模块,这些模块服务于IPFS协议的底层。Multiformats是一系列散列函数和自描述方式(从值上就可以知道值是如何生成的)的集合,目前拥有多种主流的散列处理方式,用以加密和描述NodeID以及内容ID的生成。基于Multiformats用户可以很便捷地添加新的哈希算法,或者在不同的哈希算法之间迁移。

LibP2P是IPFS模块体系内核心中的核心,用以适配各式各样的传输层协议以及连接众多复杂的网络设备,它可以帮助开发者迅速建立一个高效可用的P2P网络层,非常利于区块链的网络层搭建。这也是IPFS技术被众多区块链项目青睐的缘由。IPLD是一个转换中间件,将现有的异构数据结构统一成一种格式,方便不同系统之间的数据交换和互操作。当前,IPLD已经支持了比特币、以太坊的区块数据。这也是IPFS受到区块链系统欢迎的另一个原因,IPLD中间件可以把不同的区块结构统一成一个标准进行传输,为开发者提供了简单、易用、健壮的基础组件。IPFS将这几个模块集成为一种系统级的文件服务,以命令行(CLI)和Web服务的形式供大家使用。最后是Filecoin,该项目最早于2014年提出,2017年7月正式融资对外宣传。Filecoin把这些应用的数据价值化,通过类似比特币的激励政策和经济模型,让更多的人去创建节点,去让更多的人使用IPFS。本节只对IPFS的技术特性进行了概要介绍,每个子模块的细节将在原理篇中做深度详解。2.社区优势协议实验室由Juan Benet在2014年5月创立。Juan Benet毕业于斯坦福大学,在创建IPFS项目之前,他创办的第一家公司被雅虎收购。2015年,他发起的IPFS项目在YCombinator孵化竞赛中拿到了巨额投资,并于2017年8月底,完成了Filecoin项目的全球众筹,在Coinlist(协议实验室独立开发、严格遵从SAFT协议的融资平台)上共募集了2.57亿美金。如图1-8所示,协议实验室具有强大的投资者和开发者社区。

IPFS的社区由协议实验室团队维护,到目前为止,开发者社区已经拥有上百位代码贡献者和数十位核心开发人员,如图1-9所示。IPFS目前已经发布了30余个版本迭代,开发进度一直保持良好。

同时,协议实验室官方也授权了部分社区(IPFS Community)中的Co-Organizer牵头全球性的推广交流活动。目前,已在美国芝加哥、美国华盛顿、英国伦敦、印度德里、哥斯达黎加圣何塞、巴西圣保罗、西班牙巴塞罗那、加拿大蒙特利尔、德国柏林以及中国的北京、深圳、福州等数十个城市开展了社区自治的Meetup线下活动,拥有来自世界各地广泛的支持者。

1.3.2 Filecoin与其他区块链存储技术的对比

当前,全球去中心存储区块链项目出现了包括Filecoin、Sia、StorJ、Burst、Bluzelle等一批优质的区块链项目,欲抢占存储市场制高点,如图1-10所示。它们都能够提供类似的去中心化存储功能,但在具体技术手段和应用场景上则略有差异。下面将重点阐述IPFS和Filecoin所构建的区块链存储体系与其他区块链项目的对比。

1.BurstBurst作为第一个使用容量证明(Proof-of-capacity)的项目,还是具有很大的进步意义的。该项目是2014年8月10日在Bitcointalk上发起的,发起人的账号是 “Burstcoin”。一年后,创始人“Burstcoin”跟中本聪一样消失了。由于项目是开源的,2016年1月11日,一些社区成员将这个开源项目重新激活,独立运营开发,并且在Bitcointalk上新开了一个专区板块来维护。相较Filecoin所采用的复制证明和时空证明,Burst使用的是一种叫作容量证明(Proof-of-capacity)的机制,即:挖矿的时候,利用矿机未使用的硬盘驱动器空间,而不是处理器和显卡。矿工可以提前生成的大量数据,这里数据被称为plot,然后保存到硬盘。plot的生成只需要计算一次,能耗方面表现得更加友好,且实现起来更为简单。2. SiaSia是一个2015年7月发布的去中心化的存储项目,通过运用加密技术、加密合约和冗余备份,Sia能够使一群互不了解和互不信任的计算机节点联合起来,成为一种有统一运行逻辑和程序的云存储平台。其倾向于在P2P和企业级领域与现有存储解决方案进行竞争。Sia不是从集中供应商处租用存储,而是从彼此个体节点租用存储。Sia采用的是PoW(Proof Of Work)和PoS(Proof Of Storage)的组合证明计模式,要使用Sia,在数据存储空间的提供者和租用者必须签订协议。租用者需要提前购置一笔代币,用以抵押至链上,如果满足了协议条款,那些代币就会支付给提供者。如果协议没有按照预期的那样完成,代币就会返给租用者。对于存储使用者而言,需要为文件的上传、下载和存储付费。3. StorJStorJ是一个去中心化的、伪区块链的分布式云存储系统,主要功能与中心化的Dropbox、Onedrive类似。StorJ激励用户分享自己的剩余空间和流量,以获得奖励。因为其充分利用用户资源,所以成本极低,并且数据采用端对端加密的冗余存储,更加安全可靠。StorJ已经与开源FTP文件传输项目FileZilla达成合作。相较于Filecoin,StorJ代币为基于ERC2.0的以太坊众筹币种,没有区块链架构,采用按月支付结算的方式,在这种方式里租用者频繁地给托管主机付款,如果用户不见了或不在线,托管主机将得不到报酬。StorJ更像一个被项目方撮合的共享存储经济体,不存在矿工挖矿产生区块的概念。4. BluzelleBluzelle是一款快速的、低成本的、可扩展的、使用于全球DApp的去中心化数据库服务,填补了去中心化基础架构的一个关键空白。软件通常处理两种类型的数据:文件和数据字段。以IPFS和Filecoin为基础的项目侧重于对大文件提供分布式的存储和分发解决方案,而Bluzelle想要打造的是将那些通常很小且大小固定,按照数组、集合等结构的数据字段进行结构化存储,以便于快速存储和检索。数据字段存储在数据库中可以实现最佳的安全性、性能和可扩展性,并提供创建、读取、更新和删除(CRUD)等基本功能,区别于类似IPFS和Filecoin这样的分布式文件存储服务。综上对比,以IPFS和Filecoin所构建的区块链存储体系,同时从基础层和应用层对传统云存储模式进行了颠覆,因此决定了其应用的范围更加广阔,其对应的加密数字货币增长空间也更大。

1.4 IPFS的应用领域

IPFS的应用领域如图1-11所示。

1.建立长久信息档案IPFS提供了一个弱冗余的、高性能的集群化存储方案。仅仅通过现有的互联网模式来组织这个世界的信息是远远不够的,我们需要建立一个可以被世界长久记住、随着人类历史发展而一直存在的信息档案。2.降低存储、带宽成本IPFS提供了一个安全的点对点内容分发网络,如果你的公司业务需要分发大量的数据给用户,IPFS可以帮你节约大量的带宽成本。在云计算时代,我们大部分的网络带宽和网络存储服务都由第三方服务平台来支持,例如YouTube这样的大型视频平台,需要支付高额的流量费用给ISP(互联网服务提供商),而YouTube也将通过各种商业广告及收费会员的商业形式把这部分的成本转嫁到广大用户身上,整个流程体系的总成本是相当庞大的。为了激励人们参与IPFS协议,协议实验室团队借鉴了比特币的经济模型,设计了基于IPFS的区块链项目Filecoin。Filecoin将IPFS网络参与者分为两类:Storage Miner(为网络提供空闲的存储空间)和Retriver(为网络中的节点提供带宽,帮助其他用户传输文件),通过这种共享模型充分利用闲置资源,降低了系统总成本,并为用户降低了使用成本。目前,将这个应用方向做得比较成功的项目叫Dtube,它是一个搭建在Steemit上的去中心化视频播放平台,其用户上传的视频文件都经过IPFS协议进行存储,具有唯一标识。相较于传统视频网站,它降低了同资源冗余程度。3.与区块链完美结合IPFS和区块链是完美的搭配,我们可以使用IPFS处理大量数据,并将不变的、永久的IPFS链接放置到区块链事务中,而不必将数据本身放在区块链中。毕竟,区块链的本质是分布式账本,本身的瓶颈之一就是账本的存储能力,目前大部分公链的最大问题是没法存储大量的数据在自己的链上。比特币至今全部的区块数据也才数百GB,以太坊这样可编程的区块链项目也只能执行和存储小段合约代码,DApp的发展受到了很大的制约。运用IPFS技术解决存储瓶颈是可行方案之一。4.为内容创作带来自由IPFS为网络内容创作带来了自由和独立的精神,可以帮助用户以一种去中介化的方式交付内容。Akasha是一个典型的应用,它是一个基于以太坊和IPFS的社交博客创作平台,用户创作的博客内容通过一个IPFS网络进行发布,而非中心服务器。同时,将用户与以太坊钱包账户绑定,用户可以对优质内容进行ETH打赏,内容创作者能以此赚取ETH。它没有太多审查的限制,也没有中间商分利,内容收益直接归创作者所有。

1.5 本章小结

本章主要为读者构建IPFS大致的概念和框架,只涉及很少量的技术描述。我们知道了,IPFS是一种基于内容检索、去中心化、点对点的分布式文件系统 。IPFS项目通过整合已有的分布式存储方式和密码学的成果,力图实现互联网中高可用、数据可持续保存的全球存储系统。它整合了分布式哈希表、BitTorrent、Git和自验证文件系统4种技术的优点。使用DHT实现内容检索;借鉴BitTorrent,实行分块存储、分块传输和奖励机制;Git中应用的默克尔DAG使得大文件分享、修改变得简单高效;而自验证文件系统确保了数据发布的真实性。我们还回顾了区块链的基本知识和重要研究历史,了解了区块链从加密算法到比特币和以太坊的历史进程。同时,我们指出了当前区块链和互联网难以解决的问题,以及IPFS在这二者中有可能会带来哪些改变。Filecoin是IPFS的激励层,可激励矿工贡献出更多的网络资源和存储资源,矿工越多,IPFS 和 Filecoin 的网络越健壮、高速。我们还提到了IPFS的多层协议栈,从上至下为身份、网络、路由、交换、对象、文件、命名这几层协议,以及IPLD、LibP2P、Multiformats三个组件。同时介绍了Filecoin与Burst、Storj和Sia等区块链存储项目的区别。第4节里,主要介绍了应用领域的几个典型的例子,包括分布式社交创作平台Akasha,基于Steemit的去中心化视频平台Dtube,以及目前区块链与IPFS结合使用的方式。下一章我们将开始介绍IPFS的底层原理。

温柔的养猫人

目录

热门文章

最新文章

为什么选择阿里云什么是云计算全球基础设施技术领先稳定可靠安全合规分析师报告产品和定价全部产品免费试用产品动态产品定价价格计算器云上成本管理解决方案技术解决方案文档与社区文档开发者社区天池大赛培训与认证权益中心免费试用高校计划企业扶持计划推荐返现计划支持与服务基础服务企业增值服务迁云服务官网公告健康看板信任中心关注阿里云关注阿里云公众号或下载阿里云APP,关注云资讯,随时随地运维管控云服务售前咨询:95187-1售后服务:400-80-13260法律声明及隐私权政策Cookies政策廉正举报安全举报联系我们加入我们阿里巴巴集团淘宝网天猫全球速卖通阿里巴巴国际交易市场1688阿里妈妈飞猪阿里云计算AliOS万网高德UC友盟优酷钉钉支付宝达摩院淘宝海外阿里云盘饿了么© 2009-2024 Aliyun.com 版权所有 增值电信业务经营许可证: 浙B2-20080101 域名注册服务机构许可: 浙D3-20210002 京D3-20220015浙公网安备 33010602009975号浙B2-20080101-4