IPFS (InterPlanetary File System)
Table of Contents
1. IPFS
2. IPFS 基本使用
2.1. 初始化运行环境
运行 ipfs init ,可以初始化运行环境,生成 ~/.ipfs 目录以及当前节点的 peer identity,如:
$ ipfs init initializing IPFS node at /home/cig01/.ipfs generating 2048-bit RSA keypair...done peer identity: QmNxZBt6z92QJLJ2ewnSxr343af1c6GaTQWaF9BsB4aMYU to get started, enter: ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme
在上面例子中,当前节点的 identity 为“QmNxZBt6z92QJLJ2ewnSxr343af1c6GaTQWaF9BsB4aMYU”。
初始化完成后,运行 ipfs id 可以查看当前节点的 peer identity 等基本信息,如:
$ ipfs id
{
"ID": "QmNxZBt6z92QJLJ2ewnSxr343af1c6GaTQWaF9BsB4aMYU",
"PublicKey": "CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDXkrHfdm6KIEq6FEGUZJB73M4X56eYneU+gyMZeVTRgES4nRZ4Xp+UWvJIo0/ZnqCrF5tdqFiR3Ysr8JynwZFQn5Pw2Ch03aK1nWBb2rg1i5/Y/dayI1Ezm58zOgQknHEdiw39rv/1Dn2ZbC9yLuqA0PVEwpaqQfIOIVuB4ooyaEstQQditDXszpnZcTol6Y54Rj5Z3WcuEQadTzgzyIXtudIO7B8fPXwnlHBbBpQPRGC03yQNgckiCJjDXwuw1wkdryZHhnaVzd+3OdPvGhssuiaMWVFZGel/bfXZtNWL+jQPTRg6Ov3EgMnFZMuCKeNyws3MJL4HC+8js9CK/It1AgMBAAE=",
"Addresses": null,
"AgentVersion": "go-ipfs/0.4.17/",
"ProtocolVersion": "ipfs/0.1.0"
}
2.2. 添加和查看文件
2.2.1. 通过命令行操作
假设文件 1.txt 的内容为:
test file
执行命令 ipfs add 可以添加文件到 IPFS 网络中,执行成功后会返回 hash 值。如:
$ ipfs add 1.txt added QmShBmhvEZ1dDwPvLvpjimRW76AQrVz3fbpZYwsqNJN2Xh 1.txt 10 B / 10 B [=========================================================] 100.00%
执行命令 ipfs cat <hash> 可以查看 hash 对应文件的内容。如:
$ ipfs cat QmShBmhvEZ1dDwPvLvpjimRW76AQrVz3fbpZYwsqNJN2Xh test file
2.2.2. 通过 HTTP API 操作
IPFS 的 HTTP API Endpoint 默认监听在 127.0.0.1:5001,如果修改过,则可以通过 ipfs config show 查看当前配置。
下面是使用 HTTP API 添加文件到 IPFS 网络中的例子:
$ curl -F file=@1.txt "http://localhost:5001/api/v0/add"
{"Name":"1.txt","Hash":"QmShBmhvEZ1dDwPvLvpjimRW76AQrVz3fbpZYwsqNJN2Xh","Size":"18"}
下面是使用 HTTP API 查看 hash 所对应文件内容的例子:
$ curl "http://localhost:5001/api/v0/cat?arg=QmShBmhvEZ1dDwPvLvpjimRW76AQrVz3fbpZYwsqNJN2Xh" test file
2.2.3. 通过 Gateway 查看文件
除了使用 HTTP API 查看文件外,还可以使用 Gateway 端口(默认为 8080,可以通过 ipfs config Addresses.Gateway 查看配置)查看文件,测试如下:
$ curl http://localhost:8080/ipfs/QmShBmhvEZ1dDwPvLvpjimRW76AQrVz3fbpZYwsqNJN2Xh test file
2.3. 查看和修改配置
使用 ipfs config <key> [<value>] 可以查看和修改 IPFS 配置。如:
$ ipfs config Addresses.API # 查看配置(省略value) /ip4/127.0.0.1/tcp/5001 $ ipfs config Addresses.API /ip4/127.0.0.1/tcp/6001 # 修改配置(指定value)
参考: ipfs config --help
2.3.1. 查看所有配置
运行 ipfs config show 可以查看所有配置,如:
$ ipfs config show
{
"API": {
"HTTPHeaders": {
"Server": [
"go-ipfs/0.4.17"
]
}
},
"Addresses": {
"API": "/ip4/127.0.0.1/tcp/5001",
"Announce": [],
"Gateway": "/ip4/127.0.0.1/tcp/8080",
"NoAnnounce": [],
"Swarm": [
"/ip4/0.0.0.0/tcp/4001",
"/ip6/::/tcp/4001"
]
},
"Bootstrap": [
"/dnsaddr/bootstrap.libp2p.io/ipfs/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
"/dnsaddr/bootstrap.libp2p.io/ipfs/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa",
"/dnsaddr/bootstrap.libp2p.io/ipfs/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb",
"/dnsaddr/bootstrap.libp2p.io/ipfs/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt",
"/ip4/104.131.131.82/tcp/4001/ipfs/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ",
"/ip4/104.236.179.241/tcp/4001/ipfs/QmSoLPppuBtQSGwKDZT2M73ULpjvfd3aZ6ha4oFGL1KrGM",
"/ip4/128.199.219.111/tcp/4001/ipfs/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu",
"/ip4/104.236.76.40/tcp/4001/ipfs/QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64",
"/ip4/178.62.158.247/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd",
"/ip6/2604:a880:1:20::203:d001/tcp/4001/ipfs/QmSoLPppuBtQSGwKDZT2M73ULpjvfd3aZ6ha4oFGL1KrGM",
"/ip6/2400:6180:0:d0::151:6001/tcp/4001/ipfs/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu",
"/ip6/2604:a880:800:10::4a:5001/tcp/4001/ipfs/QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64",
"/ip6/2a03:b0c0:0:1010::23:1001/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd"
],
"Datastore": {
"BloomFilterSize": 0,
"GCPeriod": "1h",
"HashOnRead": false,
"Spec": {
"mounts": [
{
"child": {
"path": "blocks",
"shardFunc": "/repo/flatfs/shard/v1/next-to-last/2",
"sync": true,
"type": "flatfs"
},
"mountpoint": "/blocks",
"prefix": "flatfs.datastore",
"type": "measure"
},
{
"child": {
"compression": "none",
"path": "datastore",
"type": "levelds"
},
"mountpoint": "/",
"prefix": "leveldb.datastore",
"type": "measure"
}
],
"type": "mount"
},
"StorageGCWatermark": 90,
"StorageMax": "10GB"
},
"Discovery": {
"MDNS": {
"Enabled": true,
"Interval": 10
}
},
"Experimental": {
"FilestoreEnabled": false,
"Libp2pStreamMounting": false,
"ShardingEnabled": false,
"UrlstoreEnabled": false
},
"Gateway": {
"HTTPHeaders": {
"Access-Control-Allow-Headers": [
"X-Requested-With",
"Range"
],
"Access-Control-Allow-Methods": [
"GET"
],
"Access-Control-Allow-Origin": [
"*"
]
},
"PathPrefixes": [],
"RootRedirect": "",
"Writable": false
},
"Identity": {
"PeerID": "QmNxZBt6z92QJLJ2ewnSxr343af1c6GaTQWaF9BsB4aMYU"
},
"Ipns": {
"RecordLifetime": "",
"RepublishPeriod": "",
"ResolveCacheSize": 128
},
"Mounts": {
"FuseAllowOther": false,
"IPFS": "/ipfs",
"IPNS": "/ipns"
},
"Reprovider": {
"Interval": "12h",
"Strategy": "all"
},
"Routing": {
"Type": "dht"
},
"Swarm": {
"AddrFilters": null,
"ConnMgr": {
"GracePeriod": "20s",
"HighWater": 900,
"LowWater": 600,
"Type": "basic"
},
"DisableBandwidthMetrics": false,
"DisableNatPortMap": false,
"DisableRelay": false,
"EnableRelayHop": false
}
}
3. Pinning
通过 IPFS 某个节点(记为 A)的命令行(或 API)增加数据后,通过另外节点(记为 B)的命令行(或 API)访问该数据时,会先把节点 A 上的该数据缓存到节点 B 中,不过这些缓存是临时的,可能会被定期清理掉(称为 GC)。我们可以通过 Pinning 操作来防止 GC 操作清理掉缓存的数据。
通过 ipfs pin add <ipfs-path> 可以防止缓存的数据被 GC 掉,其它 pin 相关命令可以参考:https://docs.ipfs.io/reference/api/cli/#ipfs-pin
4. Block
IPFS 默认会把大文件拆分成若干个 256KB 大小的块(block),使用 ipfs ls <hash> 可以查看对象包含哪些块,如:
$ ls -l ripgrep_0.10.0_amd64.deb # 文件ripgrep_0.10.0_amd64.deb超过了256KB -rw-rw-r-- 1 jack jack 1461290 Oct 26 10:03 ripgrep_0.10.0_amd64.deb $ ipfs add ripgrep_0.10.0_amd64.deb added QmS6BjZ5RvmwSpNd1XycqidNuJ2eCNxUUdwhLz9ASDe24u ripgrep_0.10.0_amd64.deb 1.39 MiB / 1.39 MiB [=================================================] 100.00% $ ipfs ls QmS6BjZ5RvmwSpNd1XycqidNuJ2eCNxUUdwhLz9ASDe24u # 上面文件分为了6个块 QmWTWG2eDDCoZyzmduFMQNvxFg6EoU7Y5JjedbUnV2Hcoo 262158 QmexCKzioztpQtgiURVKgAKwNtEDEZugWu3o9vBn1W9ucK 262158 QmPn4siTHJYLcB22FhfRdhznWBJ4AzSPCUfQmVnFN7oxme 262158 QmfCiwR25Q93pTdKEjrwFtARzdG9sBZ3SKWnkdrAHQDKYA 262158 QmaH9RXNKehPtcpnJAiVJurGcvQLmmEm9cUWsirmfA3FHN 262158 QmfUyvJGxVqS99vnk2oBfnoguuwoJAN2mMKZsgurJxG7c8 150584