假设希望尝试这个方法的读者已经有了自己搭建的一个IPFS系统,并且有多个运行在Ubuntu16操作系统上的节点。
适合阅读这篇文章的读者有以下几类: - 读者希望在自己已搭建的IPFS系统中快速搜索内容; - 读者的IPFS系统中不仅运行着普通节点,还运行了IPFS网关; - 读者的IPFS系统中总有节点时不时和其他节点断开或失联。
IPFS是一个强大的去中心化文件分发和存储协议,但它也存在一些缺憾,比如无法保证所有节点之间始终互联。
这个缺憾导致即使在系统刚搭建好时所有节点都启动了,这些节点最终可能会互相断开失联,从而降低内容搜索的速度。
在这种情况下,当系统使用了网关,并将用户引导到网关来搜索所需内容时,就会出现问题 - 如果网关与所有节点都没有直接连接,则用户搜索的内容需要花费更长的时间才能被发现。
那么如何解决这个问题呢?
第一步是获取节点的"multiAddresses"。
在每个IPFS节点中打开命令行工具,并运行命令ipfs id。你将会看到如下结果:
{"ID":"YourNodeID","PublicKey":"YourPublicKey","Addresses":["/ip4/127.0.0.1/tcp/4001/ipfs/YourNodeID","/ip4/XXX.XXX.XXX.XXX/tcp/4001/ipfs/YourNodeID","/ip6/::1/tcp/4001/ipfs/YourNodeID","/ip6/YYYY:YYYY:YYYY:YYYY:YYYY:YYYY:YYYY:YYYY/tcp/4001/ipfs/YourNodeID","/ip6/YYYY:YYYY:YYYY:YYYY:YYYY:YYYY:YYYY:YYYY/tcp/4001/ipfs/YourNodeID","/ip6/YYYY:YYYY:YYYY:YYYY:YYYY:YYYY:YYYY:YYYY/tcp/4001/ipfs/YourNodeID","/ip4/XXX.XXX.XXX.XXX/tcp/4001/ipfs/YourNodeID",],"AgentVersion":"go-ipfs/0.4.17/","ProtocolVersion":"ipfs/0.1.0"}
我们重点关注这里的"Addresses"数组。它包含了"multiAddress"值,这些值是外部的IPFS节点用来连接节点使用的数据。这些结果有可能会有重复,但这没关系。我们只需要记录下那些包含外部IP地址的值。如果你的系统使用的是IPv6,记下那个IPv6的"multiAddress",如果你的系统没有使用IPv6,就记下IPv4的"multiAddress"。
第二步是连接你的IPFS节点。
现在把系统中的IPFS节点互相连接起来。
假设我们有一个节点A和一个节点B,如果有多个节点,下列方法也适用。运行下列命令:
ipfs swarm connect /ip4/BBB.BBB.BBB.BBB/tcp/4001/ipfs/NodeBID
将上例中的"multiAddress"用节点B的IPv4"multiAddress"替换。
如果节点使用的是IPv6,运行下列命令:
ipfs swarm connect /ip6/BBBB:BBBB:BBBB:BBBB:BBBB:BBBB:BBBB:BBBB/tcp/4001/ipfs/NodeBID
将上例中的"multiAddress"用节点B的IPv6"multiAddress"替换。
运行完命令后,我们会得到"connectNodeBIDsuccess"的结果。
我们可以用下列命令测试一下看这些节点是否已经互联了:
ipfs swarm peers
在节点A上,你现在应该能在返回的结果中看到节点B的"multiAddress",同理在节点B上,你应该能在返回的结果中看到节点A的"multiAddress"。
现在节点A和节点B已经互联了。如果A搜索的内容就在B上,那么搜索就应该很快,而不再像普通IPFS那样通过一堆节点中介才能搜索到内容。这时节点B将会是节点A搜索内容时的第一个被查询的对象。
第三步是让运行自动化。
前面我们的操作都是在命令行手动输入指令实现的,那有没有办法让这些指令自动执行,使节点之间永远互联呢?
我们可以使用Linux服务中的计时器来实现这个目标。
假设我们有一个网关节点,并希望我们所有的IPFS节点都能自动连接到这个网关。那么对于每一个希望直接连接网关的节点,我们在该节点上添加两个文件:
1. 第一个文件是:/etc/systemd/system/gateway-connector.service,其内容如下:
[Unit] Description=Job that periodically connects this IPFS node to the gateway node [Service] ExecStart=/home/yourUserName/go/bin/ipfs swarm connect /ip4/GGG.GGG.GGG.GGG/tcp/4001/ipfs/gatewayID Environment="IPFS_PATH=/ipfs"
注意:在上述文件中,有几个值需要替换成你自己的值。
在ExecStart中,你要将IPFS的执行路径替换成你安装"Go/IPFS"可执行文件的路径。
在ExecStart中,将"multiAddress"替换成你在网关上运行"ipfs id"得到的返回值。这里也可以使用IPv6的"multiAddress"。
在Environment中,你需要用你安装IPFS repo的路径替换。你执行"ipfs repo stat"后会得到一个返回值"RepoPath",就是这个值。
2. 第二个文件是:/etc/systemd/system/gateway-connector.timer,其内容如下:
[Unit] Description=Timer that periodically triggers gateway-connector.service [Timer] OnBootSec=3min OnUnitActiveSec=1min [Install] WantedBy=timers.target
在上述文件中,"OnBootSec"是你的机器在启动后要等待多久才启动计时器的时间设定;"OnUnitActiveSec"是每个"gateway-connector.service"执行后下一个"gateway-connector.service"执行之间要等待的时间。
第四步是运行自动化。
现在我们创建了自动化文件,并运行它们。
在每个节点的命令行中,添加我们上述列出的两个文件,然后运行下列命令:
sudo systemctl enable gateway-connector.timer sudo systemctl start gateway-connector.timer
为了验证我们添加的文件是否有效,运行下列命令:
systemctl list-timers
现在你就能看到"gateway-connector"有一个值,可以运行下列命令验证其结果:
systemctl status gateway-connector
至此,我们的系统就搭建好了。
参考链接:https://medium.com/pinata/how-to-keep-your-ipfs-nodes-connected-and-ensure-fast-content-discovery-7d92fb23da46 作者:Filecoin社区
最开始的数据互换协议当属BitTorrent,这也是大部分区块链技术节点中间完成沟通交流的基本协议,自然IPFS也务必必须能完成p2p的数据互换协议,IPFS在BitTorrent的根基上完成了自身BitSwap协议,该...
NFT作为区块链异构经济通证概念的鼻祖,经历了多年的沉寂,20年后终于开始接受众多应用,迄今为止,NFT已经接待了众多互联网科技巨头和文化界,众多布局应用正式启动积极发展区块链加密金融。随着NFT作品的陆续上线和交易,N...
2018年,IPFS该协议风靡矿区,掀起了疯狂的采矿浪潮,各种IPFS矿机到处遍地开花。由于主网上线的一再延迟,挖掘算法已经很久没有公布了。矿机和代币只是期货,不能真正挖掘。模仿和冒充他们项目的门槛很低,市场投资者很难。...
现在普通的交易所不一定是最安全的。比如我现在用的BTBTOP,这是一家小交易所,但由于体积小,投资成本大,没有必要为我的小钱逃跑。大型交易所并不是绝对安全的。你想要火币和Okex。这些交易所很大,但政策风险也很高,对用户...