搭建IPFS私有网络

IPFS (InterPlanetary File System) 是一个面向全球的、点对点的分布式版本文件系统。它用基于内容的地址替代基于域名的地址,也就是用户寻找的不是某个地址而是储存在某个地方的内容,不需要验证发送者的身份,而只需要验证内容的哈希,通过这样可以让网页的速度更快、更安全、更健壮、更持久。IPFS表示,IPFS未来将替代HTTP(以及其他的许多东西)。

IPFS 和 BitTorrent 的区别: How does it compare to BitTorrent's Project Maelstrom?

IPFS从根本上改变了用户搜索的方式。通过IPFS,用户搜索的是内容。通过HTTP浏览器搜索文件的时候,首先找到服务器的位置(IP地址),然后使用路径名称在服务器上查找文件。按照这个设计,只有文件所有者可以判断这是否是用户要找的文件。此时,必须保证托管者不会通过移除文件或者关闭服务器而对文件做任何更改。

当文件被添加到IPFS节点上,它得到一个新的名字。这个名字实际上是一个加密哈希,它是从文件内容中被计算出来。通过加密保证该哈希始终只表示该文件的内容。哪怕只在文件中修改一个比特的数据,哈希都会完全不同。

当下一步向IPFS分布式网络询问哈希的时候,它通过使用一个分布式哈希表,可以快速(在一个拥有10,000,000个节点的网络中只需要20跳)地找到拥有数据的节点,从而检索该数据,并使用哈希验证这是否是正确的数据。

不幸的是, IPFS 被了。如果你有幸能翻墙,你可以通过通过下面的命令下载并安装预编译的ipfs工具。

1
2
3
tar xvfz go-ipfs.tar.gz
cd go-ipfs
./install.sh

然后初始化仓库:

1
2
3
4
5
6
7
8
> ipfs init
initializing ipfs node at /Users/jbenet/.go-ipfs
generating 2048-bit RSA keypair...done
peer identity: Qmcpo2iLBikrdf1d6QU6vXuNb6P7hwrbNPW9kLAH8eG67z
to get started, enter:
ipfs cat /ipfs/QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG/readme

它默认会在你的Home下创建一个.ipfs文件夹。

1
ipfs cat /ipfs/QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG/readme

查看ipfs网络上的一个文件,正常你可以看到这个文件的内容。

你可以使用ipfs add上传文件,ipfs cat查看文件。当然ipfs包含很多的命令,你可以在 commands 页面查看每个命令。

默认IPFS会通过一些种子连接到IPFS全球网络, 如果你想搭建一个私有的IPFS网络,可以使用本文下面介绍的方法。

初始化一个私有仓库

命令同上

1
ipfs init

默认$IPFS_PATH$Home\.ipfs文件夹。

创建共享的key

使用ipfs-swarm-key-gen创建私有网络共享的key, 私有网络的所有的节点都使用这个key, 不使用这个key的节点无法加入这个私有网络。

1
2
go get github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm-key-gen
ipfs-swarm-key-gen > ~/.ipfs/swarm.key

移除默认的bootstrap节点

为了不连接全球的IPFS网络,你需要将默认的bootstrap的节点信息删除。

1
ipfs bootstrap rm --all

加入私有网络

如果是第一个节点, 这一步可以省略。

如果你已经知道了私有网络的一些节点,你可以把它们作为bootstrap节点。

1
ipfs bootstrap add <multiaddr>

例如

1
ipfs bootstrap add /ip4/104.236.76.40/tcp/4001/ipfs/QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64

设置LIBP2P_FORCE_PNET

设置环境变量LIBP2P_FORCE_PNET1

1
export LIBP2P_FORCE_PNET=1

测试

在一个节点上增加一个文件,然后在另外一个节点cat这个文件,看看是否成功了。

参考资料

  1. http://www.infoq.com/cn/articles/ipfs
  2. https://github.com/ipfs/go-ipfs/blob/master/docs/experimental-features.md#private-networks