本篇大概介绍下在PC(mac系统)及Android设备上如何运行起ipfs,上传文件并在浏览器上访问到。
有关IPFS是什么、有什么特点百度一下就好了,这里不做复制粘贴的介绍。
1. 环境篇
1.1 建议使用mac,探索类似新东西的时候往往会遇上一些依赖以及一些莫名其妙的异常,使用mac可以比windows/Linux系统省掉一些不必要的麻烦。
1.2 访问ipfs官网需要翻墙,需要自己或者公司准备翻墙条件。如果是使用的shadowsocks类似的工具,它的代理是针对的浏览器,终端上操作的时候还需要配置下代理的环境变量,参考如下:
1.3 需要准备golang的环境,需要Go 1.10或更新版本。
2. PC安装之安装包方式
使用安装包方式是最简单的,https://ipfs.io/docs/install/ 官网下载安装包, 解压后执行其中install.sh,或者自行拷贝ipfs到/usr/local/bin下即可。
3. PC安装之源码编译方式
3.1 下载并编译go-ipfs
源码仓库:https://github.com/ipfs/go-ipfs ,README部分就有介绍如何下载及编译,即如下三条:
3.2 如果一开始没有配置终端的代理会遇到这样的一些报错(即使事先配置代理,仍然可能有部分报错):
看一下内容其实是尝试通过ipfs的地址下载一个叫gx的依赖,以防后续移植到android环境中的时候也需要一同移植这个gx,因此去ipfs的依赖网站https://dist.ipfs.io/下载gx的源码,用源码编译安装。gx代码仓库:https://github.com/whyrusleeping/gx,按照其README.md说明:go get github.com/whyrusleeping/gx 下载源码后编译可能出现报错:
于是单独下载crypto:git clone https://github.com/golang/crypto.git,放到GOPATH指定目录下。
继续编译,还有报错:
单独下载sys:git clone https://github.com/golang/sys.git,放到GOPATH指定目录下。
到此gx编译通过, go build; go install; 完成安装。
回到go-ipfs编译,修改bin/Rules.mk使得不去下载gx包,编译还有报错:
类似gx,还需要安装gx-go,从https://dist.ipfs.io/找到gx-go的源码仓库:https://github.com/whyrusleeping/gx-go,编译过程会有类似的依赖cli和fs,go get github.com/codegangsta/cli; go get github.com/kr/fs 即可。
至此gx-go 编译通过,go build; go install; 完成安装。
3.3 继续go-ipfs编译,十几分钟后编译并安装完成,install到了$GOPATH/bin下,在此之前安装的二进制版本在/usr/local/bin下。
4. PC中配置ipfs及上传文件
此条中涉及操作完全可以参照文章:【IPFS + 区块链 系列】 入门篇 - IPFS环境配置
4.1 创建ipfs节点
执行 ipfs init
即可
4.2 修改节点默认存储空间
执行 export EDITOR=/usr/bin/vim
; ipfs config edit
; 找到StorageMax,可以修改默认的10G存储空间大小。
4.3 跨域资源共享CORS配置
后续跨域资源共享需要用到的配置
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "GET", "POST", "OPTIONS"]'
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["*"]'
4.4 启动节点服务器
执行 ipfs daemon
,正常情况如下所示:
如果出现下图所示地址被占用的问题,如上述步骤二将其中5001替换为5002再试试应该就ok了。
4.5 添加文件
执行ipfs可以看到使用说明,下面演示了添加文件、添加目录的操作。然后确认一下ipfs daemon是否在运行,如果没有就执行一下。
4.6 浏览器上查看上传的文件
地址为https://ipfs.io/ipfs/+文件或目录的hash,实际操作中发现在添加文件后,并不能立即看到,需要等几分钟,一时刷不出来不要怀疑人生,耐心等会。
4.7 配置ipns
每次改动文件其hash都会变,上一次目录的hash也会变,为了有个恒定的地址ipfs提供了一个类似dns的机制叫ipns,可以使用本节点的id来作为固定地址。
这里拿sayHi目录作为发布地址,执行ipfs name publish + 目录hash。执行ipfs id可以查看本节点的ID值,这里就是QmY48kQboUo1NCoWHYWpEw1MgvyFYoUj3ZwhJrhNZf4Hg4,在发布ipns后执行resovle能看到跟ipfs地址的对应关系。
4.8 浏览器上通过ipns地址来查看文件
留意此时的地址变为https://ipfs.io/ipns/+节点ID值,另外在publish ipns之后同样需要等待一段时间。
5. 编译Android上运行版本(同理可编译Ubuntu等Linux版本)
此条内容可以参考 打包Golang并在Android环境下运行,重点就是配置目标机器的cpu架构和操作系统类型。
5.1 配置环境变量
其实可以在go build 时候添加参数 CGO_ENABLED=0 GOARCH=arm GOOS=linux,不过为了简便起见还是建议修改环境变量,可参考如下。
在更改环境变量之前mac上的env是这样的:
修改环境变量之后env是这样的:
5.2 编译ipfs源码
本来以为会需要编译很多内容才能最终编译出可以运行在Android上的ipfs,结果试了下只编译go-ipfs/cmd/ipfs部分代码编译出来ipfs文件就可以在Android设备上运行了。所以上面【3.2】中编译go-ipfs的时候本来可以不用这么小心翼翼多费那些事了。
5.3 在Android设备上配置ipfs
将上面编译出来的ipfs文件push到设备的/system/bin目录下,操作步骤基本一样,不同的是init生成的.ipfs目录不是home目录了而是/data目录,另外由于没有vi,可以直接使用busybox vi /data/.ipfs/config
来修改默认的存储空间和5001端口。
5.4 在Android设备上上传文件
5.5 浏览器上查看上传的文件