Swarm 也是一个去中心化存储的项目。以太坊生态中比较重要的一个项目。借着这次在DevCon 5上Swarm的worshop机会,刚好记录一下对Swarm的学习。
初识 Swarm
从公开资料可以看到,Swarm 和 IPFS 是比较类似的一个项目,也是去中心化存储,在之前学习记录中也提到过 (用IPFS来保存和共享文件)。
相同点是:
- 均为 P2P 网络下的去中心化存储项目
- 可以用哈希来作为文件寻址方式
- 都还没有完成激励层 -_-
Swarm 不太一样的地方在于:
- 和以太坊生态绑定比较强,可以将 ETH 生态作为其激励层
- IPFS 强调要取代 HTTP 和 CDN;Swarm 对标 BitTorrent
- 正因为对标了 BT,有些说法是Swarm对小文件共享有比较低的延迟
网络信息
网络ID | 网络名 | 网络类型 | 维护者 | 网关地址 |
---|---|---|---|---|
Network ID #4 | EF-TestNetwork | 公共测试网 | Swarm Core-Team / EF Dev OPS | https://swarm-gateways.net |
基本搭建步骤
下载:
官网下载地址:
https://ethersphere.github.io/swarm-home/downloads/
启动
以下操作步骤来自于DevCon上的workshop
$ ./swarm \
--datadir $PWD/data \
--ens-api test:e7410170f87102df0055eb195163a03b7f2bff4a@https://rinkeby.infura.io/v3/b41676eda6c749768d51c615fc57bc6c \
--ws --wsorigins='*' --wsapi=admin,net,debug,bzz,stream,accounting,swap \
--debug \
--verbosity 3 \
--sync-mode push \
--bootnodes enode://30d8e3ab25ab1fc4bc020f79048d5d138f1362269158a3f2b8e69a242c59155376d8868747869f10a6994d882cf34d45536d90aa9a51041e1f76796e3cb97b1a@192.168.55.103:30300 \
--enable-pinning \
--bzznetworkid 61
## One liner (if you're having problems copying the previous command)
$ ./swarm --datadir $PWD/data --ens-api test:e7410170f87102df0055eb195163a03b7f2bff4a@https://rinkeby.infura.io/v3/b41676eda6c749768d51c615fc57bc6c --ws --wsorigins='*' --wsapi=admin,net,debug,bzz,stream,accounting,swap --debug --verbosity 3 --sync-mode push --bootnodes enode://30d8e3ab25ab1fc4bc020f79048d5d138f1362269158a3f2b8e69a242c59155376d8868747869f10a6994d882cf34d45536d90aa9a51041e1f76796e3cb97b1a@192.168.55.103:30300 --enable-pinning --bzznetworkid 61
检查
检查 Swarm 节点是否已在 Kademlia 列表中
$ echo '{"jsonrpc":"2.0","method":"bzz_hive","id":1}' | websocat ws://127.0.0.1:8546/ -n --one-message --origin localhost | jq .result | xargs printf
=========================================================================
commit hash: c1c233d179470661262ff22378dbe4f524c8c5f3
Wed Oct 2 11:40:29 UTC 2019 K???MLI? hive: queen's address: c661b1e8f6333565bff54ac54d7116b4b663a104f6bf878b2aad3d949ed437a7
population: 9 (9), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4
000 5 1da7 13c9 1348 5242 | 5 1da7 (0) 13c9 (0) 1348 (0) 5242 (0)
001 2 87f6 8b97 | 2 87f6 (0) 8b97 (0)
============ DEPTH: 2 ==========================================
002 0 | 0
003 0 | 0
004 1 c9a7 | 1 c9a7 (0)
005 1 c1d6 | 1 c1d6 (0)
006 0 | 0
007 0 | 0
008 0 | 0
009 0 | 0
010 0 | 0
011 0 | 0
012 0 | 0
013 0 | 0
014 0 | 0
015 0 | 0
=========================================================================
需要安装 jq
和 websocat
上传文件
用 swarm up
命令上传文件
$ ./swarm up --progress ~/Downloads/Big_Buck_Bunny_720_10s_30MB.mp4
Swarm Hash: 8264ca38c2d6c84955dd8dd3fa68d8411b2b34a447901bb59ee7b959110544d5
Tag UID: 2451023057
Upload status:
Syncing 7894 chunks 0s [============================================================>-] 98 %
Done! took 8.367633s
Your Swarm hash should now be retrievable from other nodes!
下载
有了文件哈希之后就可以下载了。这是从本地节点下载的示例:
wget http://localhost:8500/bzz:/8264ca38c2d6c84955dd8dd3fa68d8411b2b34a447901bb59ee7b959110544d5/
pin
pin
是一个目前比较有用的命令。因为 Swarm 目前还没有激励层但用户可以随意上传文件,所以目前默认模型是 FIFO 的方式。根据整体网络的存储容量,上传的文件可能会在几天后就被删除掉。
而如果想要文件能够长久的访问,就可以使用 pin
上传时 pin
可以在上传文件时增加 pin
这一个参数
$ ./swarm up --pin your_file.mp4
上传后 pin
也可以在上传后去 pin
任意一个文件,只要你的节点上有这一文件就行。
$ curl -X POST http://localhost:8500/bzz-pin:/<hash>
列出目前 pin 的内容
$ curl -X GET http://localhost:8500/bzz-pin:/
移除 pin 的内容
$ curl -X DELETE http://localhost:8500/bzz-pin:/<hash>
配合 ENS 使用
首先要通过 ENS (https://manager.ens.domains)增加一条内容记录,例如:bzz://<哈希值>/
然后就可以用通过域名来访问在 Swarm 上的文件了,例如:http://localhost:8500/bzz:/basicworkshop.test/
加密
除了普通均可访问的文件以外,还可以将文件加密
$ ./swarm up --encrypt ~/Desktop/secret-file
加密后的哈希比一般的要长,因为解密密钥也会成为哈希的一部分
密码访问控制
交互式的设置密码
$ ./swarm access new pass <encrypted-reference>
或者也可以使用文件来设置
$ echo "supersecretpassword" > password.txt
$ ./swarm access new pass --password password.txt <encrypted-reference>
读取内容
如上面的例子,自己搭建节点来获取内容。默认地址为:http://localhost:8500/
也可以直接用网关来访问:https://swarm-gateways.net/
参考资料
[1] What is the difference between Swarm and IPFS?
[2] What is Decentralized Storage? (IPFS, FileCoin, Sia, Storj & Swarm)
[3] DevCon 5 的 Swarm Workshop
[4] Swarm Guide