没有痛苦的 IPFS(但这并不准确)

没有痛苦的 IPFS(但这并不准确)

尽管哈布雷已经 不止一篇关于 IPFS 的文章.

我将立即澄清,我不是该领域的专家,但我不止一次表现出对这项技术的兴趣,但尝试使用它常常会带来一些痛苦。 今天我又开始尝试,得到了一些我想分享的结果。 简而言之,将描述 IPFS 安装过程和一些功能(一切都是在 ubuntu 上完成的,我没有在其他平台上尝试过)。

如果你错过了 IPFS 是什么,这里有一些详细的介绍: habr.com/en/post/314768

安装

为了实验的纯粹性,我建议立即将它安装在某个外部服务器上,因为我们会考虑在本地模式和远程模式下工作的一些陷阱。 然后,如果需要,很长一段时间都不会拆除,没有多少。

安装去

官方文档
查看当前版本 golang.org/dl

注意:最好为应该最常使用它的用户安装 IPFS。 事实上,下面我们将考虑通过以下方式安装的选项 FUSE 还有一些微妙之处。

cd ~
curl -O https://dl.google.com/go/go1.12.9.linux-amd64.tar.gz
tar xvf go1.12.9.linux-amd64.tar.gz
sudo chown -R root:root ./go
sudo mv go /usr/local
rm go1.12.9.linux-amd64.tar.gz

然后你需要更新环境(更多细节在这里: golang.org/doc/code.html#GOPATH).

echo 'export GOPATH=$HOME/work' >> ~/.bashrc
echo 'export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin' >> ~/.bashrc
source ~/.bashrc

检查是否已安装 go

go version

安装 IPFS

我最喜欢的安装方法 ipfs更新.

使用命令安装它

go get -v -u github.com/ipfs/ipfs-update

之后,您可以运行以下命令:

ipfs-更新版本 - 查看所有可供下载的版本。
ipfs-更新版本 - 查看当前安装的版本(在我们安装 IPFS 之前,它将没有)。
ipfs-update 安装最新的 - 安装最新版本的 IPFS。 您可以分别从可用版本列表中指定任何所需版本,而不是最新版本。

安装 ipfs

ipfs-update install latest

检查

ipfs --version

直接用一般意义上的安装一切。

启动IPFS

初始化

首先,您需要执行初始化。

ipfs init

作为回应,您将收到如下内容:

 ipfs init
initializing IPFS node at /home/USERNAME/.ipfs
generating 2048-bit RSA keypair...done
peer identity: QmeCWX1DD7HnXXXXXXXXXXXXXXXXXXXXXXXXxxx
to get started, enter:
	ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme

您可以运行建议的命令

ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme

导致

Hello and Welcome to IPFS!

██╗██████╗ ███████╗███████╗
██║██╔══██╗██╔════╝██╔════╝
██║██████╔╝█████╗  ███████╗
██║██╔═══╝ ██╔══╝  ╚════██║
██║██║     ██║     ███████║
╚═╝╚═╝     ╚═╝     ╚══════╝

If you're seeing this, you have successfully installed
IPFS and are now interfacing with the ipfs merkledag!

 -------------------------------------------------------
| Warning:                                              |
|   This is alpha software. Use at your own discretion! |
|   Much is missing or lacking polish. There are bugs.  |
|   Not yet secure. Read the security notes for more.   |
 -------------------------------------------------------

Check out some of the other files in this directory:

  ./about
  ./help
  ./quick-start     <-- usage examples
  ./readme          <-- this file
  ./security-notes

在我看来,有趣的事情开始了。 安装阶段的家伙已经开始使用他们自己的技术。 提议的哈希 QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv 不是专门为您生成的,而是嵌入到发行版中的。 也就是说,在发布之前,他们准备了一个欢迎文本,将其倒入 IPFS 并将地址添加到安装程序中。 我觉得这很酷。 而这个文件(更准确地说是整个文件夹)现在不仅可以在本地查看,还可以在官方网关上查看 ipfs.io/ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv. 同时,您可以确定该文件夹的内容没有发生任何变化,因为如果它发生了变化,那么哈希值也会发生变化。

顺便说一句,在这种情况下,IPFS 与版本控制服务器有一些相似之处。 如果您更改文件夹的源文件并再次将文件夹放入 IPFS,那么它将收到一个新地址。 同时,旧文件夹不会像那样去任何地方,而是可以在它以前的地址使用。

直接发射

ipfs daemon

你应该收到这样的回复:

ipfs daemon
Initializing daemon...
go-ipfs version: 0.4.22-
Repo version: 7
System version: amd64/linux
Golang version: go1.12.7
Swarm listening on /ip4/x.x.x.x/tcp/4001
Swarm listening on /ip4/127.0.0.1/tcp/4001
Swarm listening on /ip6/::1/tcp/4001
Swarm listening on /p2p-circuit
Swarm announcing /ip4/127.0.0.1/tcp/4001
Swarm announcing /ip6/::1/tcp/4001
API server listening on /ip4/127.0.0.1/tcp/5001
WebUI: http://127.0.0.1:5001/webui
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
Daemon is ready

打开互联网之门

注意这两行:

WebUI: http://127.0.0.1:5001/webui
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080

现在,如果您在本地安装了 IPFS,那么您将在本地地址访问 IPFS 接口,并且您可以使用所有内容(例如, 本地:5001/网页界面/)。 但是当安装在外部服务器上时,默认情况下,网关对 Internet 是关闭的。 网关二:

  1. webui管理员(github上) 在端口 5001 上。
  2. 端口 8080 上的外部 API(只读)。

到目前为止,两个端口(5001和8080)都可以打开进行实验,但是在战斗服务器上,当然要用防火墙关闭5001端口。 还有端口 4001,这是其他对等方可以找到您所必需的。 它应该对外部请求开放。

打开 ~/.ipfs/config 进行编辑并在其中找到以下行:

"Addresses": {
  "Swarm": [
    "/ip4/0.0.0.0/tcp/4001",
    "/ip6/::/tcp/4001"
  ],
  "Announce": [],
  "NoAnnounce": [],
  "API": "/ip4/127.0.0.1/tcp/5001",
  "Gateway": "/ip4/127.0.0.1/tcp/8080"
}

将127.0.0.1改成你服务器的ip并保存文件,然后重启ipfs(Ctrl+C停止正在运行的命令,重新启动)。

应得

...
WebUI: http://ip_вашего_сервера:5001/webui
Gateway (readonly) server listening on /ip4/ip_вашего_сервера/tcp/8080

现在外部接口应该可用了。

退房

http://домен_или_ip_сервера:8080/ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme

上面的自述文件应该打开。

http://домен_или_ip_сервера:5001/webui/

Web 界面应打开。

如果 webui 适合你,那么可以直接在其中更改 IPFS 设置,包括查看统计信息,但下面我将直接通过配置文件考虑配置选项,这通常并不重要。 只是最好记住config在哪里,用它做什么,不然万一web face不行,就更难了。

设置 Web 界面以与您的服务器一起使用

这是第一个陷阱,大约花了三个小时。

如果你在外部服务器上安装了 IPFS,但没有在本地安装或运行 IPFS,那么当你在 Web 界面中转到 /webui 时,你应该会看到一个连接错误:

没有痛苦的 IPFS(但这并不准确)

事实上,在我看来,webui 的工作方式非常模糊。 首先,它会尝试连接到打开接口的服务器的 API(当然,基于浏览器中的地址)。 如果它在那里不起作用,它会尝试连接到本地网关。 如果你有本地运行的 IPFS,那么 webui 对你来说会很好,只有你会使用本地 IPFS,而不是外部 IPFS,尽管你在外部服务器上打开了 webui。 然后你上传文件,但出于某种原因,你在外部服务器上看不到它们......

如果它没有在本地运行,则会出现连接错误。 在我们的例子中,错误很可能是由于 CORS,webui 也指出了这一点,建议添加一个配置。

ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["http://ip_вашего сервера:5001", "http://127.0.0.1:5001", "https://webui.ipfs.io"]'
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "GET", "POST"]'

我刚刚注册了一个通配符

ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["*"]'

添加的标头可以在同一个 ~/.ipfs/config 中找到。 在我的例子中是

  "API": {
    "HTTPHeaders": {
      "Access-Control-Allow-Origin": [
        "*"
      ]
    }
  },

我们重新启动 ipfs,我们看到 webui 已成功连接(无论如何,如果您为来自外部的请求打开网关,它应该是,如上所述)。

现在您可以直接通过 Web 界面上传文件夹和文件,也可以创建自己的文件夹。

挂载 FUSE 文件系统

这是一个非常有趣的功能。

文件(以及文件夹),我们不仅可以通过网页界面添加,也可以直接在终端中添加,例如

ipfs add test -r
added QmfYuz2gegRZNkDUDVLNa5DXzKmxxxxxxxxxx test/test.txt
added QmbnzgRVAP4fL814h5mQttyqk1aURxxxxxxxxxxxx test

最后一个哈希是根文件夹的哈希。

使用这个哈希,我们可以在任何 ipfs 节点上打开一个文件夹(它可以找到我们的节点并获取内容),我们可以在端口 5001 或 8080 上的 Web 界面中,或者我们可以在本地通过 ipfs。

ipfs ls QmbnzgRVAP4fL814h5mQttyqk1aUxxxxxxxxxxxxx
QmfYuz2gegRZNkDUDVLNa5DXzKmKVxxxxxxxxxxxxxx 10 test.txt

但您仍然可以像打开普通文件夹一样打开它。

让我们在根目录下创建两个文件夹并将它们的权限授予我们的用户。

sudo mkdir /ipfs /ipns
sudo chown USERNAME /ipfs /ipns

并使用 --mount 标志重新启动 ipfs

ipfs daemon --mount

可以在其他地方创建文件夹,通过ipfs守护进程参数-mount -mount-ipfs /ipfs_path -mount-ipns /ipns_path指定路径

现在从这个文件夹中读取有点不寻常。

ls -la /ipfs
ls: reading directory '/ipfs': Operation not permitted
total 0

也就是说,无法直接访问此文件夹的根目录。 但是你可以得到内容,知道散列。

ls -la /ipfs/QmbnzgRVAP4fL814h5mQttyqxxxxxxxxxxxxxxxxx
total 0
-r--r--r-- 1 root root 10 Aug 31 07:03 test.txt

cat /ipfs/QmbnzgRVAP4fL814h5mQttyqxxxxxxxxxxxxxxxxx/test.txt 
test
test

同时,当指定路径时,甚至自动完成在文件夹内工作。

正如我上面所说,这种挂载有一些微妙之处:默认情况下,挂载的 FUSE 文件夹仅对当前用户可用(即使是 root 也无法从这样的文件夹中读取,更不用说系统中的其他用户了)。 如果您想让其他用户可以使用这些文件夹,则需要在配置中将“FuseAllowOther”:false 更改为“FuseAllowOther”:true。 但这还不是全部。 如果您以 root 身份运行 IPFS,则一切正常。 如果代表普通用户(甚至是 sudo),那么你会得到一个错误

mount helper error: fusermount: option allow_other only allowed if 'user_allow_other' is set in /etc/fuse.conf

在这种情况下,您需要通过取消注释 #user_allow_other 行来编辑 /etc/fuse.conf。

之后,重启 ipfs。

FUSE 的已知问题

这个问题已经不止一次被注意到,在重新启动 ipfs 并挂载后(可能在其他情况下),/ipfs 和 /ipns 挂载点变得不可用。 无法访问它们,并且 ls -la /ipfs 显示 ????? 在权限列表中。

找到了这个解决方案:

fusermount -z -u /ipfs
fusermount -z -u /ipns

然后重启ipfs。

添加服务

当然,在终端中运行只适合初期测试。 在战斗模式下,守护进程应该在系统启动时自动启动。

代表 sudo,创建文件 /etc/systemd/system/ipfs.service 并写入:

[Unit]
Description=IPFS Daemon
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=simple
ExecStart=/home/USERNAME/work/bin/ipfs daemon --mount
User=USERNAME
Restart=always

[Install]
WantedBy=multi-user.target

当然,USERNAME 必须替换为您的用户(也许 ipfs 程序的完整路径对您来说会有所不同(您必须指定完整路径))。

我们激活服务。

sudo systemctl enable ipfs.service

我们启动服务。

sudo service ipfs start

检查服务的状态。

sudo service ipfs status

为了实验的纯洁性,以后可以重启服务器查看ipfs是否自动启动成功。

添加我们已知的盛宴

考虑这样一种情况,我们在外部服务器和本地都安装了 IPFS 节点。 在外部服务器上,我们添加一些文件并尝试通过 CID 在本地通过 IPFS 获取它。 会发生什么? 当然,本地服务器很可能对我们的外部服务器一无所知,只会通过“询问”所有可用的 IPFS 对等点(它已经设法“熟悉”)来尝试通过 CID 查找文件。 那些反过来会问别人。 依此类推,直到找到该文件。 实际上,当我们尝试通过官方网关获取文件时,也会发生同样的事情 ipfs.io. 如果幸运的话,文件将在几秒钟内找到。 而如果不是,几分钟也找不到,极大影响了工作的舒适度。 但是我们知道这个文件首先会出现在哪里。 那么我们为什么不立即告诉我们的本地服务器“先在那里搜索”呢? 显然,这是可以做到的。

1. 我们去远程服务器查看 ~/.ipfs/config 配置

"Identity": {
    "PeerID": "QmeCWX1DD7HnPSuMHZSh6tFuxxxxxxxxxxxxxxxx",

2. 运行 sudo service ipfs status 并在其中查找 Swarm 条目,例如:

Swarm announcing /ip4/ip_вашего_сервера/tcp/4001

3. 我们从这里添加“/ip4/ip_your_server/tcp/4001/ipfs/$PeerID”形式的通用地址。

4.为了可靠性,我们会尝试通过我们本地的webui将这个地址添加到peer。

没有痛苦的 IPFS(但这并不准确)

5.如果一切OK,打开本地config~/.ipfs/config,在里面找到“Bootstrap”:[...
并将接收到的地址首先添加到数组中。

重启 IPFS。

现在让我们将文件添加到外部服务器并尝试在本地服务器上请求它。 应该飞得快

但是这个功能还不稳定。 据我了解,即使我们在 Bootstrap 中指定了对等点的地址,ipfs 在运行期间也会更改与对等点的活动连接列表。 无论如何,关于指定永久盛宴的可能性的讨论和愿望正在进行中 这里 好像 应该 添加一些功能 [电子邮件保护]+

当前节点列表可以在 webui 和终端中查看。

ipfs swarm peers

你可以在这里和那里手动添加你的盛宴。

ipfs swarm connect "/ip4/ip_вашего_сервера/tcp/4001/ipfs/$PeerID"

在改进此功能之前,您可以编写一个工具来检查与所需对等点的连接,如果没有,则添加一个连接。

推理

在已经熟悉 IPFS 的人中,既有支持 IPFS 的,也有反对 IPFS 的。 基本上,昨天 讨论 并促使我再次深入研究 IPFS。 而关于上面提到的讨论:我不能说我强烈反对发言者的任何论点(我不同意一个半程序员使用IPFS的事实)。 一般来说,两者都以自己的方式是正确的(特别是 关于支票的评论 让你思考)。 但如果我们抛弃道德和法律的评估,谁来对这项技术进行技术评估呢? 我个人有一种内心的感觉,“这个一定要搞清楚,有一定的前景”。 但具体为什么,没有明确的提法。 比如,如果你看看现有的集中式工具,那么它们在许多方面都遥遥领先(稳定性、速度、可管理性等)。 尽管如此,我有一个想法似乎是有道理的,但如果没有这样的去中心化系统,这个想法就很难实现。 当然,我摇得太厉害了,但我会这样表述:必须改变互联网上传播信息的原则。

让我解释。 如果你想一想,现在我们根据“我希望我给它的人保护它并且它不会丢失或被不想要的人收到”的原则分发信息。 例如,很容易考虑各种邮件服务、云存储等。 我们最终会得到什么? 在哈布雷轮毂上 信息安全 处于第一线,几乎每天我们都会收到有关另一起全球泄密事件的消息。 原则上,所有最有趣的东西都列在<irony> wonderful 文章 夏天快结束了。 几乎没有未泄露的数据. 也就是主要的互联网巨头越来越大,他们积累的信息越来越多,这种泄露就是一种信息原子爆炸。 这在以前从未发生过,现在又发生了。 同时,虽然很多人明白存在风险,但他们会继续将自己的数据托付给第三方公司。 首先,没有太多的选择,其次,他们承诺他们已经修补了所有的漏洞,这样的事情再也不会发生了。

我看到什么选项? 在我看来,数据最初应该公开分发。 但这种情况下的开放并不意味着一切都应该易于阅读。 我说的是存储和分发的开放,而不是阅读的完全开放。 我假设信息应该用公钥分发。 毕竟公钥/私钥的原理已经很老了,跟互联网差不多。 如果信息不是机密的并且是为广泛的圈子准备的,那么它会立即使用公钥进行布局(但仍然以加密形式,任何人都可以使用可用密钥对其进行解密)。 如果没有,那么它就没有公钥,密钥本身被转移到应该访问这些信息的地方。 同时,应该阅读它的人应该只有一把钥匙,从哪里获得这些信息,他不应该真正飙升——他只是从网络上拉下来(这是按内容分发的新原则,而不是按内容分发)地址)。

因此,对于大规模攻击,攻击者将需要获得大量的私钥,而这不太可能在一个地方完成。 在我看来,这项任务比破解特定服务更困​​难。

另一个问题在这里解决了:作者身份的确认。 现在在互联网上,您可以找到我们朋友写的许多引述。 但是,哪里能保证是他们写的呢? 现在,如果每个这样的记录都附有数字签名,那就容易多了。 而且这些信息位于何处并不重要,主要是签名,当然,签名很难伪造。

有趣的是:IPFS 已经带有加密工具(毕竟它是建立在区块链技术之上的)。 私钥立即在配置中指定。

  "Identity": {
    "PeerID": "QmeCWX1DD7HnPSuMHZSh6tFuMxxxxxxxxxxxxxx",
    "PrivKey": "CAASqAkwggSkAgEAAoIBAQClZedVmj8JkPvT92sGrNIQmofVF3ne8xSWZIGqkm+t9IHNN+/NDI51jA0MRzpBviM3o/c/Nuz30wo95vWToNyWzJlyAISXnUHxnVhvpeJAbaeggQRcFxO9ujO9DH61aqgN1m+JoEplHjtc4KS5
pUEDqamve+xAJO8BWt/LgeRKA70JN4hlsRSghRqNFFwjeuBkT1kB6tZsG3YmvAXJ0o2uye+y+7LMS7jKpwJNJBiFAa/Kuyu3W6PrdOe7SqrXfjOLHQ0uX1oYfcqFIKQsBNj/Fb+GJMiciJUZaAjgHoaZrrf2b/Eii3z0i+QIVG7OypXT3Z9JUS60
KKLfjtJ0nVLjAgMBAAECggEAZqSR5sbdffNSxN2TtsXDa3hq+WwjPp/908M10QQleH/3mcKv98FmGz65zjfZyHjV5C7GPp24e6elgHr3RhGbM55vT5dQscJu7SGng0of2bnzQCEw8nGD18dZWmYJsE4rUsMT3wXxhUU4s8/Zijgq27oLyxKNr9T7
2gxqPCI06VTfMiCL1wBBUP1wHdFmD/YLJwOjV/sVzbsl9HxqzgzlDtfMn/bJodcURFI1sf1e6WO+MyTc3.................

我不是安全专家,无法确切知道如何正确使用它,但在我看来,这些密钥是在 IPFS 节点之间的交换级别使用的。 并且 js-ipfs 和示例项目,例如 轨道数据库它在其上工作 轨道.chat. 也就是说,理论上,每个设备(不仅是移动设备)都可以轻松配备自己的加密解密机。 在这种情况下,就剩下大家自己保管好自己的私钥了,大家自己负责自己的安全,不要在某个超人气的互联网巨头身上被其他人为因素所挟持。

只有注册用户才能参与调查。 登录拜托

你以前听说过 IPFS 吗?

  • 没听说过IPFS,不过好像很有意思

  • 没听过也不想听

  • 听过但不感兴趣

  • 听说过,没听懂,现在看来很有趣

  • 很长一段时间以来,我一直在积极使用 IPFS。

69 位用户投票。 13 名用户弃权。

来源: habr.com

添加评论