一、下载安装
首先去官网下载go-ipfs包。笔者用的是ubuntu系统,下的是linux amd64版本的。
tar xvfz go-ipfs.tar.gz
cd go-ipfs
./install.sh
二、使用
1、初始化ipfs
$ ipfs init
initializing IPFS node at /home/ubuntu/.ipfs
generating 2048-bit RSA keypair...done
peer identity: QmapfGyBKDrz77LxHcxDZbQ8DeNZtYACVgPkLv8y2g6U5a
to get started, enter:
ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme
查看ipfs的readme,该readme默认被添加ipfs
$ ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/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
2、添加和查找内容
将字符串添加到ipfs
$ echo "ipfs test data" | ipfs add
added QmdnqtJeDP6eq6cM8Vn7zp1fxmnUuFUzPoX3WyiaixcaeY QmdnqtJeDP6eq6cM8Vn7zp1fxmnUuFUzPoX3WyiaixcaeY
15 B / ? [------------------------------------------------------------------------------------------------------------------=--------------]
通过字符串hash,查找添加的内容
$ ipfs cat QmdnqtJeDP6eq6cM8Vn7zp1fxmnUuFUzPoX3WyiaixcaeY
ipfs test data
将文件添加到ipfs
(1)创建文件夹和文件
mkdir -p foo/bar
cd foo/bar
echo "hello ipfs" > baz
(2)将文件夹添加到ipfs
$ ipfs add -r foo
added QmSoASxb8aNVGk3pNWpZvXEZTQKxjGeu9bvpYHuo5bP1VJ foo/bar/baz
added QmNqnuDQVvRchoyAJx93CyA68mH5xAehAHGv3gR5kh6G2p foo/bar
added QmY76eBuKrAwhXUdDsupYDoYpdmXW1pSjnwg2KpdMyTJVq foo
11 B / 11 B [=======================================================================================================================] 100.00%
(3)通过文件hash查找文件
$ ipfs cat /ipfs/QmY76eBuKrAwhXUdDsupYDoYpdmXW1pSjnwg2KpdMyTJVq/bar/baz
hello ipfs
$ ipfs cat /ipfs/QmNqnuDQVvRchoyAJx93CyA68mH5xAehAHGv3gR5kh6G2p/baz
hello ipfs
$ ipfs cat /ipfs/QmSoASxb8aNVGk3pNWpZvXEZTQKxjGeu9bvpYHuo5bP1VJ
hello ipfs
ipfs的数据通过Merkel DAG(默克尔有向无环图)来管理,图中一个节点就是一个object,图中的每个节点都可以存储数据(这个和Merkel Tree只在叶子节点存放数据不同)或链接其它的obejcts,因此可以通过object和dag查看文件或者文件夹数据。
(3)查找object
$ ipfs object get QmY76eBuKrAwhXUdDsupYDoYpdmXW1pSjnwg2KpdMyTJVq
{"Links":[{"Name":"bar","Hash":"QmNqnuDQVvRchoyAJx93CyA68mH5xAehAHGv3gR5kh6G2p","Size":68}],"Data":"\u0008\u0001"}
获取存储foo的object,可以看到链接(Link)到foo目录的bar。
$ ipfs object get QmNqnuDQVvRchoyAJx93CyA68mH5xAehAHGv3gR5kh6G2p
{"Links":[{"Name":"baz","Hash":"QmSoASxb8aNVGk3pNWpZvXEZTQKxjGeu9bvpYHuo5bP1VJ","Size":19}],"Data":"\u0008\u0001"}
获取存储bar的object,可以看到链接(Link)到bar目录的baz。
$ ipfs object get QmSoASxb8aNVGk3pNWpZvXEZTQKxjGeu9bvpYHuo5bP1VJ
{"Links":[],"Data":"\u0008\u0002\u0012\u000bhello ipfs\n\u0018\u000b"}
获取存储baz的object,可以看到baz的文件内容"hello ipfs"。
(4)通过dag查找数据
通过dag查找文件也是类似的:
$ ipfs dag get QmY76eBuKrAwhXUdDsupYDoYpdmXW1pSjnwg2KpdMyTJVq
{"data":"CAE=","links":[{"Name":"bar","Size":68,"Cid":{"/":"QmNqnuDQVvRchoyAJx93CyA68mH5xAehAHGv3gR5kh6G2p"}}]}
$ ipfs dag get QmNqnuDQVvRchoyAJx93CyA68mH5xAehAHGv3gR5kh6G2p
{"data":"CAE=","links":[{"Name":"baz","Size":19,"Cid":{"/":"QmSoASxb8aNVGk3pNWpZvXEZTQKxjGeu9bvpYHuo5bP1VJ"}}]}
$ ipfs dag get QmSoASxb8aNVGk3pNWpZvXEZTQKxjGeu9bvpYHuo5bP1VJ
{"data":"CAISC2hlbGxvIGlwZnMKGAs=","links":[]}
5、域名
从上面的示例可以看到一个文件添加后可以通过hash来访问,但在baz文件每次变化后foo的hash都会发生变化,这样访问这个文件的URL也要变。
ipfs采用ipns了解决这个问题,ipns就是应用在ipfs中的dns。
$ ipfs name publish QmY76eBuKrAwhXUdDsupYDoYpdmXW1pSjnwg2KpdMyTJVq --allow-offline
Published to QmapfGyBKDrz77LxHcxDZbQ8DeNZtYACVgPkLv8y2g6U5a: /ipfs/QmY76eBuKrAwhXUdDsupYDoYpdmXW1pSjnwg2KpdMyTJVq
$ ipfs cat /ipns/QmapfGyBKDrz77LxHcxDZbQ8DeNZtYACVgPkLv8y2g6U5a/bar/baz
hello ipfs
QmapfGyBKDrz77LxHcxDZbQ8DeNZtYACVgPkLv8y2g6U5a是NodeID,这个ID是不会变化的。如果需要修改baz文件的内容,只需要add后publish,用原来的URL就可查看到修改后的内容。
$ echo "hello ipfs world" > foo/bar/baz
$ ipfs add -r foo
added QmT6EWWciJiqM4WBp37oHQF7g2ec1qQH38HWre9r1AnS5Q foo/bar/baz
added QmYnEJeoec4zrBEoxT7CJtVpGJ7e9LJ9C275H9dMuE61sT foo/bar
added QmTQec9f73shhRkM6n9pqFLRPxgb9mfRR4EM499iifA9jT foo
17 B / 17 B [=======================================================================================================================] 100.00%
$ ipfs name publish QmTQec9f73shhRkM6n9pqFLRPxgb9mfRR4EM499iifA9jT --allow-offline
Published to QmapfGyBKDrz77LxHcxDZbQ8DeNZtYACVgPkLv8y2g6U5a: /ipfs/QmTQec9f73shhRkM6n9pqFLRPxgb9mfRR4EM499iifA9jT
$ ipfs cat /ipns/QmapfGyBKDrz77LxHcxDZbQ8DeNZtYACVgPkLv8y2g6U5a/bar/baz
hello ipfs world