《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的IPFS是一个分布式系统,用于存储和访问文件、网站、应用程序和数据。 而且,当您使用IPFS时,您不只是从其他人那里下载文件您的计算机也有助于分发它们。当您在几个街区外的朋友需要相同的Wikipedia页面时,他们可能会像从您的邻居或任何使用IPFS的人那里一样从您那里获得它。 IPFS不仅可以用于网页,还可以用于计算机可能存储的任何类型的文件,无论是文档、电子邮件,甚至是数据库记录。权力下放 可以从不由一个组织管理的多个位置下载文件:支持弹性互联网。如果有人攻击了Wikipedia的Web服务器,或者Wikipedia的工程师犯了一个大错误,导致他们的服务器着火,您仍然可以从其他地方获取相同的网页。使审查内容变得更加困难。因为IPFS上的文件可能来自很多地方,所以任何人(无论是州、公司还是其他人)都很难阻止事情。当您远离或断开连接时,可以加快网络速度。如果您可以从附近而不是数百或数千英里之外的人那里检索文件,您通常可以更快地获取它。如果您的社区在本地联网但与更广泛的互联网没有良好的连接,这将特别有价值。 最后一点实际上是IPFS的全名:InterPlanetaryFileSystem。我们正在努力建立一个系统,该系统可以在不连贯或相隔很远的地方工作,就像行星一样。虽然这是一个理想主义的目标,但它让我们努力工作和思考,几乎我们为实现这一目标而创造的一切在家里也很有用。IPFS的工作原理 IPFS是一个点对点(p2p)存储网络。可以通过位于世界任何地方的对等点访问内容,这些对等点可能会传递信息、存储信息或两者兼而有之。IPFS知道如何使用其内容地址而不是其位置来查找您要求的内容。 理解IPFS的三个基本原则:通过内容寻址的唯一标识通过有向无环图(DAG)进行内容链接通过分布式哈希表(DHT)发现内容 这三个原则相互依赖,以启用IPFS生态系统。让我们从内容寻址和内容的唯一标识开始。 内容寻址 IPFS使用内容寻址来根据内容而不是位置来识别内容。按内容查找项目是您一直在做的事情。比如你在图书馆找一本书,经常是按书名来找的;那是内容寻址,因为你在问它是什么。如果您使用位置寻址来查找那本书,您会通过它的位置来询问它:我想要在二楼的书,第一叠,底部第三个书架,从左边算起四本书。如果有人搬了那本书,那你就倒霉了! 互联网和您的计算机上都存在这个问题!现在,内容是按位置查找的,例如:https:en。wikipedia。orgwikiAardvarkUsersAliceDocumentstermpaper。docC:UsersJoeMyDocumentsprojectsprintpresentation。ppt 相比之下,每条使用IPFS协议的内容都有一个内容标识符,即CID,即其哈希值。散列对于它所来自的内容来说是唯一的,即使它与原始内容相比可能看起来很短。 有向无环图(DAG) IPFS和许多其他分布式系统利用称为有向无环图的数据结构(打开新窗口),或DAG。具体来说,他们使用MerkleDAG,其中每个节点都有一个唯一标识符,该标识符是节点内容的哈希。 IPFS使用针对表示目录和文件进行了优化的MerkleDAG,但您可以通过多种不同的方式构建MerkleDAG。例如,Git使用MerkleDAG,其中包含许多版本的存储库。 为了构建内容的MerkleDAG表示,IPFS通常首先将其拆分为块。将其拆分为块意味着文件的不同部分可以来自不同的来源并可以快速进行身份验证。 分布式哈希表(DHT) 要查找哪些对等方正在托管您所追求的内容(发现),IPFS使用分布式哈希表或DHT。哈希表是值键的数据库。分布式哈希表是一种表在分布式网络中的所有对等方之间拆分的表。要查找内容,您需要询问这些同行。 libp2p项目(打开新窗口)是IPFS生态系统的一部分,它提供DHT并处理对等点之间的连接和交谈。 一旦你知道你的内容在哪里(或者更准确地说,哪些对等点正在存储构成你所追求的内容的每个块),你就可以再次使用DHT来查找这些对等点的当前位置(路由)。因此,要获取内容,请使用libp2p查询DHT两次。隐私和加密 作为一种点对点数据存储和交付的协议,IPFS是一个公共网络:参与网络的节点存储与全球一致的内容地址(CID)相关的数据,并宣传他们拥有这些CID可供其他节点通过公开可见的分布式哈希表(DHT)。这种范式是IPFS的核心优势之一在最基本的情况下,它本质上是网络总可用数据的全球分布式服务器,内容本身(那些CID)和拥有或想要内容。 然而,这确实意味着IPFS本身并没有明确保护有关CID和提供或检索它们的节点的知识。这不是分布式网络所独有的。在dweb和legacyweb上,流量和其他元数据都可以通过可以推断出很多关于网络及其用户的方式进行监控。下面概述了这方面的一些关键细节,但简而言之:虽然节点之间的IPFS流量是加密的,但这些节点发布到DHT的元数据是公开的。节点宣布对DHT功能至关重要的各种信息包括它们的唯一节点标识符(PeerID)和它们提供的数据的CID因此,关于哪些节点正在检索和或重新提供哪些CID的信息是公开的可用的。 加密 网络中有两种类型的加密:传输加密和内容加密。 在两方之间发送数据时使用传输加密。阿尔伯特加密文件并将其发送给莱卡,莱卡在收到文件后对其进行解密。这会阻止第三方在数据从一个地方移动到另一个地方时查看数据。 内容加密用于保护数据,直到有人需要访问它。Albert为他的每月预算创建了一个电子表格,并用密码保存它。当Albert需要再次访问它时,他必须输入密码才能解密文件。没有密码,Laika无法查看该文件。 IPFS使用传输加密,但不使用内容加密。这意味着您的数据在从一个IPFS节点发送到另一个节点时是安全的。但是,如果拥有CID,任何人都可以下载和查看该数据。缺乏内容加密是一个有意的决定。您可以自由选择最适合您的项目的方法,而不是强迫您使用特定的加密协议。IPFS操作方法和教程 命令行快速入门 如果您精通命令行并且只想立即启动并运行IPFS,请遵循此快速入门指南。请注意,本指南假定您将安装goipfs,这是用Go编写的参考实现。 ipfs将其所有设置和内部数据存储在称为存储库的目录中。在第一次使用IPFS之前,您需要使用以下ipfsinit命令初始化存储库:ipfsinitinitializingipfsnodeatUsersjbenet。ipfsgenerating2048bitRSAkeypair。。。donepeeridentity:Qmcpo2iLBikrdf1d6QU6vXuNb6P7hwrbNPW9kLAH8eG67ztogetstarted,enter:ipfscatipfsQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdGreadme 如果您在数据中心的服务器上运行,则应使用server配置文件初始化IPFS。这样做会阻止IPFS创建大量数据中心内部流量来尝试发现本地节点:ipfsinitprofileserver 您可能需要设置大量其他配置选项查看完整参考(打开新窗口)更多。 后面的散列peeridentity:是您节点的ID,与上面输出中显示的不同。网络上的其他节点使用它来查找并连接到您。如果需要,您可以随时运行ipfsid以再次获取它。 现在,尝试运行在ipfsinit。那个样子ipfscatipfsreadme。 您应该看到如下内容:HelloandWelcometoIPFS!Ifyouseethis,youhavesuccessfullyinstalledIPFSandarenowinterfacingwiththeipfsmerkledag!Warning:Thisisalphasoftware。useatyourowndiscretion!Muchismissingorlackingpolish。Therearebugs。Notyetsecure。Readthesecuritynotesformore。Checkoutsomeoftheotherfilesinthisdirectory:。about。help。quickstartusageexamples。readmethisfile。securitynotes 您可以探索存储库中的其他对象。特别是quickstart显示示例命令尝试的目录:ipfscatipfsQmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdGquickstart让你的节点上线 准备好将节点加入公共网络后,在另一个终端中运行ipfs守护程序,并等待以下所有三行显示您的节点已准备好:ipfsdaemonInitializingdaemon。。。APIserverlisteningonip4127。0。0。1tcp5001Gatewayserverlisteningonip4127。0。0。1tcp8080 记下您收到的TCP端口。如果它们不同,请在下面的命令中使用您的。 现在,切换回原来的终端。如果您已连接到网络,您应该能够在运行时看到对等方的IPFS地址:ipfsswarmpeersip4104。131。131。82tcp4001p2pQmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJip4104。236。151。122tcp4001p2pQmSoLju6m7xTh3DuokvT3886QRYqxAzb1kShaanJgW36yxip4134。121。64。93tcp1035p2pQmWHyrPWQnsz1wxHR219ooJDYTvxJPyZuDUPSDpdsAovN5ip4178。62。8。190tcp4002p2pQmdXzZ25cyzSF99csCQmmPZ1NTbWTe8qtKFaZKpZQPdTFB 这些是p2p。 现在,您应该能够从网络中获取对象了。尝试:ipfscatipfsQmSgvgwxZGaBLqkGyWemEDqikCqU52XxsYLKtdy3vGZ8uqDesktopspaceshiplaunch。jpg 使用上述命令,IPFS在网络中搜索CIDQmSgv。。。并将数据写入spaceshiplaunch。jpg桌面上调用的文件中。 接下来,尝试将对象发送到网络,然后在您喜欢的浏览器中查看它。以下示例curl用作浏览器,但您也可以在其他浏览器中打开IPFSURL:hashechoI3IPFS(whoami)ipfsaddqcurlhttps:ipfs。ioipfshashI3IPFSyourusername网页控制台 您可以通过转到来查看本地节点上的Web控制台localhost:5001webui。这应该会弹出一个这样的控制台: Web控制台显示可变文件系统(MFS)中的文件。MFS是内置于Web控制台的工具,可帮助您以与基于名称的文件系统相同的方式导航IPFS文件。 当您使用CLI命令ipfsadd。。。添加文件时,这些文件不会自动在MFS中可用。要查看您使用CLI添加的IPFS桌面中的文件,您必须将文件复制到MFS:ipfsfilescpipfsipfsCID END 开源协议:MITLicense 开源地址:https:github。comipfskubo