IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。git
能够把 IPFS 想象成全部文件数据是在同一个 BitTorrent 群而且经过同一个 Git 仓库存取。github
总之,它集一些成功系统(分布式哈希表、BitTorrent、Git、自认证文件系统)的优点于一身,是一套很厉害的文件存取系统。golang
IPFS 的发明者 Juan Benet(juan@benet.ai)在 IPFS 技术白皮书中假设了一些使用场景:web
我以为做为数据库这一点对应用开发者来讲会颇有用。数据库
下载 go-ipfs 解压(下面的示例我是在 Windows 10 上作的,解压目录为 D:\go-ipfs),而后到解压目录执行命令 ipfs init
,将在用户 home(~)下创建 .ipfs 目录存放数据,默认最大存储 10G。init 命令能够带参,好比修改最大存储、目录等,具体参考 ipfs init help
。浏览器
继续执行命令 ipfs daemon
启动节点服务器:缓存
新开一个命令行,执行命令 ipfs id
以查看当前节点标识:服务器
{ "ID": "QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R", "PublicKey": "....", "Addresses": [ "/ip4/169.254.40.215/tcp/4001/ipfs/...", .... ], "AgentVersion": "go-ipfs/0.4.12/", "ProtocolVersion": "ipfs/0.1.0" }
{ "ID": "QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R", "PublicKey": "....", "Addresses": [ "/ip4/169.254.40.215/tcp/4001/ipfs/...", .... ], "AgentVersion": "go-ipfs/0.4.12/", "ProtocolVersion": "ipfs/0.1.0" }
网络
浏览器访问 http://localhost:5001/webui 进入管理界面,查看系统状态、管理文件以及配置系统。tcp
除了使用 Web 管理界面修改配置外,也能够直接用命令行 ipfs config show > ipfs.conf
先导出当前配置(JSON 格式,配置项很少且含义明显),改完后使用 ipfs config replace ipfs.conf
更新配置,重启服务器就生效了。固然,修改配置也能够直接用 ipfs config edit
。
服务器最终使用的配置文件保存在 ~/.ipfs/config 中,对比刚刚导出的文件咱们发现导出的文件只比这个 config 少了一项 Identity.PrivKey
,即节点初始化时自动生成的 RSA 私钥。
节点初始化时会自动生成 RSA 密钥对,而且私钥没有设置密码。
公钥经过多重哈希获得节点 id(即上面的 QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R
),节点服务器启动后会和其余节点交互公钥,后续通信时使用对方公钥加密数据,经过多重哈希对方公钥、对比对方节点 id 来确认是否正在和正确的节点交互。
私钥用来解密接收到的数据,也用于 ipns 来绑定文件名。整个过程没有引入证书,仅是使用了 PKI 机制。
总之,我以为能够暂时不用关心密钥对,可能只有在一些使用场景下面才须要吧。
我当前目录结构是这样的:
D:\GO-IPFS │ build-log │ config │ install.sh │ ipfs.conf │ ipfs.exe │ LICENSE │ README.md │ └─b3log └─hacpai README.md
D:\GO-IPFS │ build-log │ config │ install.sh │ ipfs.conf │ ipfs.exe │ LICENSE │ README.md │ └─b3log └─hacpai README.md
我准备添加的目录是 b3log
,执行命令:
D:\go-ipfs>ipfs add -r b3log 94 B / 94 B [=============================================================================================] 100.00% 0s added Qmco94dYP733XwrUqFUhDtDG8RsqmGQ6UDPvnmH4Pvy2rv b3log/hacpai/README.md added Qmbkno2HVZdW7XfwsVjmuu9VDKBByczFR8qwsBXMjMrjPQ b3log/hacpai added QmPxebZuW2pgfzj5JWq22KUzxStmqQ6i7YUK9Sq9xepXT9 b3log
D:\go-ipfs>ipfs add -r b3log 94 B / 94 B [=============================================================================================] 100.00% 0s added Qmco94dYP733XwrUqFUhDtDG8RsqmGQ6UDPvnmH4Pvy2rv b3log/hacpai/README.md added Qmbkno2HVZdW7XfwsVjmuu9VDKBByczFR8qwsBXMjMrjPQ b3log/hacpai added QmPxebZuW2pgfzj5JWq22KUzxStmqQ6i7YUK9Sq9xepXT9 b3log
这样咱们使用 ipfs cat /ipfs/Qmco94dYP733XwrUqFUhDtDG8RsqmGQ6UDPvnmH4Pvy2rv
就能够查看 README.md 了。在其余节点上也能够,只要记住这个文件的哈希值就好了。咱们能够在本身的 HTTP 网关上试试(注意个人端口改为了 5002,你的默认应该是 8080):
固然也能够用 ipfs 官方的 HTTP 网关:https://ipfs.io/ipfs/Qmco94dYP733XwrUqFUhDtDG8RsqmGQ6UDPvnmH4Pvy2rv
ipfs get /ipns/QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R
ipfs get /ipns/QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R
将获取刚才咱们发布的 b3log 目录。
IPFS 的本意是让用户以为全部文件都是在本地的,没有“从远程服务器上下载文件”。Pin 是将文件长期保留在本地,不被垃圾回收。
执行 ipfs pin ls
能够查看哪些文件在本地是持久化的,经过 add 添加的文件默认就是 pin 过的。
每次修改文件后 add 都会返回不一样的哈希,这对于网站来讲就无法固定访问地址了,因此咱们须要经过 ipns 来“绑定”节点名。
上面 b3log 目录的哈希值是 QmPxebZuW2pgfzj5JWq22KUzxStmqQ6i7YUK9Sq9xepXT9
,咱们将整个目录做为节点根目录发布:
D:\go-ipfs>ipfs name publish QmPxebZuW2pgfzj5JWq22KUzxStmqQ6i7YUK9Sq9xepXT9 Published to QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R: /ipfs/QmPxebZuW2pgfzj5JWq22KUzxStmqQ6i7YUK9Sq9xepXT9
D:\go-ipfs>ipfs name publish QmPxebZuW2pgfzj5JWq22KUzxStmqQ6i7YUK9Sq9xepXT9 Published to QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R: /ipfs/QmPxebZuW2pgfzj5JWq22KUzxStmqQ6i7YUK9Sq9xepXT9
而后咱们就能够经过 ipns 访问了,注意是 ipns:
D:\go-ipfs>ipfs cat /ipns/QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R/hacpai/README.md The piper will lead us to reason. 欢迎访问黑客与画家的社区 https://hacpai.com
D:\go-ipfs>ipfs cat /ipns/QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R/hacpai/README.md The piper will lead us to reason. 欢迎访问黑客与画家的社区 https://hacpai.com
之后每次更新文件都再 publish 一下就好了。目前(v0.4.12)使用 ipns 访问会很慢,听说 v0.4.14 会解决。
IPFS 容许用户使用现有的域名系统,这样就能用一个好记的地址来访问文件了,好比:
D:\go-ipfs>ipfs cat /ipns/ipfs.b3log.org/hacpai/README.md The piper will lead us to reason. 欢迎访问黑客与画家的社区 https://hacpai.com
D:\go-ipfs>ipfs cat /ipns/ipfs.b3log.org/hacpai/README.md The piper will lead us to reason. 欢迎访问黑客与画家的社区 https://hacpai.com
只须要在 DNS 解析加入一条 TXT 记录:
记录类型 | 主机记录 | 记录值 |
---|---|---|
TXT | ipfs | dnslink=/ipns/QmSYF1HZxhPUWWGrz5bMn16tdD73AeMVhp7pNSHkVCMF7R |
原文:https://hacpai.com/article/1511015097370
推荐两个以太坊相关的实战教程: