IPFS 协议包括4种不同语言的实现:
从 Juan Benet 在2015年5月5日在IPFS 网络上存储第一段数据 Hello World^11 开始,目前已经发展到 7k+ star, 200位代码贡献者。go-ipfs 版本也迭代到 0.4.18 版本。
IPFS 协议目前主要是 go-ipfs 和 js-ipfs 实现得较为完善。这里我们采用 golang 实现的版本验证测试。
根据自己的操作系统选择相应的安装包
https://dist.ipfs.io/#go-ipfs
官网: https://github.com/ipfs/go-ipfs#install-prebuilt-packages
二进制安装有两种方式:
方式一:https://ipfs.io/ipns/dist.ipfs.io#go-ipfs 直接下载 IPFS 安装包
方式二: 使用linux 包管理工具nix
如上,它通过nix 这个包管理软件来安装。
nix官网: https://nixos.org/download.html
#安装nix
curl -L https://nixos.org/nix/install | sh
# 通过nix直接安装
nix-env -i ipfs
方式一,下载完成 IPFS 安装包后,我们将它解压到你的可执行文件路径($PATH)之下,执行命令:
$ tar xvfz go-ipfs.tar.gz
$ cd go-ipfs
$ ./install.sh
测试:
$ ipfs help
USAGE:
ipfs - Global p2p merkle-dag filesystem.
官网: https://nixos.org/
Nix
For Linux and MacOSX you can use the purely functional package manager Nix:
$ nix-env -i ipfs
You can also install the Package by using its attribute name, which is also ipfs.
Nix是一个强大的Linux和其他Unix系统的包管理器,它使包管理变得可靠和可复制。在不同的机器上共享您的开发和构建环境。
NixOS是一个Linux发行版,具有独特的包和配置管理方法。它建立在Nix包管理器之上,是完全声明式的,使升级系统更加可靠,并且具有许多其他优点。
下载地址:https://dist.ipfs.io/#go-ipfs (选windows binary)
解压
创建一个ipfs节点
执行:.\ipfs.exe init
查看节点ID
执行:.\ipfs.exe id
启动节点服务器
执行:.\ipfs.exe daemon
打开 http://localhost:5001/webui 浏览web ui界面
往节点中新增文件或目录
新增文件: .\ipfs.exe add hello.txt
新增目录: .\ipfs.exe add -r hello
备注:可以通过文件hash直接访问文件
.\ipfs.exe cat /ipfs/QmYx4BnhnLXeMWF5mKu16fJgUBiVP7ECXh7qcsUZnXiRxc
https://ipfs.io/ipfs/QmYx4BnhnLXeMWF5mKu16fJgUBiVP7ECXh7qcsUZnXiRxc
将节点ID与文件Hash进行绑定
绑定后,只需访问 https://ipfs.io/ipns/节点ID 就可以访问对应的文件或目录了
注意:文件或目录更新后,需要重新进行绑定
绑定操作: .\ipfs.exe name publish 文件或目录的hash值
官网参考: https://github.com/ipfs/go-ipfs#download-and-compile-ipfs
首先是下载节点软件IPFS
#git clone https://github.com/ipfs/go-ipfs.git
#$ cd go-ipfs
#$ make install
# 使用下面方法,下载成功了
$ go get -u -d github.com/ipfs/go-ipfs
$ cd $GOPATH/src/github.com/ipfs/go-ipfs
$ make install
$GOPATH没有设置,Go 1.8 版本之后,GOPATH 默认在用户目录的 go 文件夹下。
/root/go/bin 下 生成有刚才安装的ipfs命令
[root@VM_0_14_centos bin]# ls
ipfs
[root@VM_0_14_centos bin]# pwd
/root/go/bin
可以使用ln (ln [选项] 源文件 目标文件) 建立软连接 方便使用
ln -s /root/go/bin/ipfs /usr/sbin/ipfs
初始化本地仓库
和git类似,ipfs节点也要初始化一个本地仓库,执行init子命令来初始化本地仓库,ipfs init
在home目录下面运行 ipfs init 进行初始化,完成ipfs节点的创建
cd /root/go/bin/
./ipfs init
看到如下提醒,说明已经安装成功!
[root@VM_0_14_centos bin]# ./ipfs init
initializing IPFS node at /root/.ipfs
generating 2048-bit RSA keypair...done
peer identity: QmZa1uirV57QcKj5CLv9myxVJ5LyYLs7cdFdETPEtrL1px
to get started, enter:
ipfs cat /ipfs/QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc/readme
[root@VM_0_14_centos bin]# ipfs cat /ipfs/QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc/readme
-bash: ipfs: command not found
[root@VM_0_14_centos bin]# ./ipfs cat /ipfs/QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc/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
[root@VM_0_14_centos bin]#
执行以上命令后,或者用户的根目录(linux:/root/ 或 /home/xxx windows:下C:\Users\Administrator.ipfs)下生成一个名为.ipfs文件夹用于存储节点数据。
ipfs init也就是ipfs初始化。通过初始化我们创建了一个本地的离线IPFS节点在这个离线节点中我们也可以做一些简单的操作。比如添加文件、查看文件内容、查看版本、查看配置等。
打开ipfs配置文件
.ipfs节点的默认存储空间为10个G,如果需要修改可以在~/.ipfs/config文件中修改。
将"StorageMax": "10GB"修改为其他值即可。
查看节点ID
./ipfs id
添加文件到节点
添加命令:ipfs add filename
查看命令:ipfs cat 添加文件时返回的哈希值
具体操作:
创建一个文件并在里面写入"123456":
添加到本地节点:
添加成功后,会返回该文件的哈希,我们可以通过它来查看刚刚添加的文件:
[root@VM_0_14_centos bin]# touch ipfsfile.txt
[root@VM_0_14_centos bin]# echo "123456" > ipfsfile.txt
[root@VM_0_14_centos bin]# ./ipfs add ipfsfile.txt
added QmQU2gS4gZ7TpiTECjDUxdQFd9bBBEWxDxPPfhLfYHVuei ipfsfile.txt
7 B / 7 B [===============================================================================] 100.00%[root@VM_0_14_centos bin]# ./ipfs cat QmQU2gS4gZ7TpiTECjDUxdQFd9bBBEWxDxPPfhLfYHVuei
123456
[root@VM_0_14_centos bin]#
你需要记录下这个编码,因为需要使用它来访问本地仓库(或ipfs网络)中的文件。
注意:ipfs并不会无节制地将你本地仓库中的文件分布到其他ipfs节点中,如果没有其他的ipfs节点搜索你的文件(的哈希值),那么你本地仓库中的文件将始终只存在于本地。
将节点接入网络
IPFS是分布式的全球存储网络。也就是说可以随时跟全球的计算机进行通信并做数据交换。显而易见离线的情况下肯定无法跟其他节点进行通信对不对 所以需要加入到IPFS网络中。在IPFS中要加入到网络中相当简单只需要运行一个简单的命令就能实现。
使用命令ipfs daemon,通过ipfs daemon 实现和其他节点链接
[root@VM_0_14_centos bin]# ./ipfs daemon
只有当启动监听后,节点才能够接受ipfs网络中的内容检索请求,参与内容的交换与分布。
启动后在浏览器中输入:https://ipfs.io/ipfs/QmQU2gS4gZ7TpiTECjDUxdQFd9bBBEWxDxPPfhLfYHVuei
即可查看刚刚添加的文件的具体内容。
打开Web节点客户端
http://localhost:5001/webui
ipfs daemon命令用来启动一个连接网络的IPFS节点。
命令行
ipfs daemon [--init] [--routing=] [--mount] [--writable]
[--mount-ipfs=] [--mount-ipns=]
[--unrestricted-api] [--disable-transport-encryption]
[--enable-gc] [--manage-fdlimit=false] [--offline] [--migrate]
[--enable-pubsub-experiment] [--enable-mplex-experiment=false]
选项
-init bool - 是否使用默认设置自动初始化ipfs,默认值:false
--routing string - 路由选项,默认值:dht
--mount bool - 是否将IPFS挂载到文件系统,默认值:false
--writable bool - 是否允许使用`POST/PUT/DELETE`修改对象,默认值: false.
--mount-ipfs string - 当使用--mount选项时IPFS的挂接点,默认值采用配置文件中的设置
--mount-ipns string - 当使用--mount选项时IPNS的挂接点,默认值采用配置文件中的设置
--unrestricted-api bool - 是否允许API访问未列出的哈希,默认值:false
--disable-transport-encryption bool - 是否进制传输层加密,默认值:false。当调试协议时可开启该选项
--enable-gc bool - 是否启用自动定时仓库垃圾回收,默认值:false
--manage-fdlimit bool - 是否按需自动提高文件描述符上限,默认值:false
--offline bool - 是否离线运行,即不连接到网络,仅提供本地API,默认值:false
--migrate bool - true对应于mirage提示时输入yes,false对应于输入no
--enable-pubsub-experiment bool - 是否启用发布订阅(pubsub)特性,该特性目前尚处于实验阶段
--enable-mplex-experiment bool - 是否启用`go-multiplex`流多路处理器,默认值:true
说明
服务进程将在指定的端口监听网络连接。使用ipfs config Addresses 命令修改默认端口。
例如,修改网关监听端口:
ipfs config Addresses.Gateway /ip4/127.0.0.1/tcp/8082
同样的方式修改API地址:
ipfs config Addresses.API /ip4/0.0.0.0/tcp/5001
在修改地址后,确保重新启动服务进程以便生效。
默认情况下,网络仅在本地可以访问,如果希望允许其他计算机访问,可以 使用地址0.0.0.0。例如
./ipfs config Addresses.Gateway /ip4/0.0.0.0/tcp/8080
**当开放API访问时请千万小心,这存在一定的安全风险,因为任何人都可以 远程控制你的节点。**如果你希望远程控制节点,请使用防火墙、授权代理 或其他服务来保护该API访问地址。
ipfs本身开发了基于http的服务框架,客户端发送http post请求到远程节点,远程节点接受请求并处理。默认的http api接口端口地址是:5001,可以直接修改config文件或通过命令修改。
命令修改: $ ipfs config Addresses.API /ip4/0.0.0.0/tcp/5001
另外ipfs默认http只监听本地端口,想要支持远程访问,需要API配置做如下修改: /ip4/127.0.0.1——>/ip4/0.0.0.0
外网访问webui,web界面报错如下:
您的 IPFS 守护程序是否正在运行?
Failed to connect to the API.
Make sure you configure your IPFS API to allow cross-origin (CORS) requests, running the commands below:
解决方法:
./ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["http://taigu.xxx.cn:5002", "http://127.0.0.1:5001", "https://webui.ipfs.io"]'
./ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "POST"]'
Ipfs节点提供和REST API接口,可供我们在程序代码中操作节点进行文件的上传等操作。不过大多数情况下,我们并不需要直接操作这个REST开发接口,而是使用经过封装的更友好的ipfs-api。
即官方封装好了一些,ipfs 客户端工具。
https://pypi.org/project/ipfsapi/
https://www.npmjs.com/package/ipfs-http-client
ipfs安装和配置
参考URL: https://www.jianshu.com/p/ba332e67278a
ipfs节点安装与使用
参考URL: https://www.cnblogs.com/helloworld2018/p/8971449.html
https://github.com/xipfs/IPFS-Internals/blob/master/ebook/01.0.md
[推荐]ipfs命令手册
参考URL: http://cw.hubwiz.com/card/c/ipfs/1/1/5/