以太坊每个区块都有gas限制,每个区块所能容纳的交易有限,也不可能存储大容量文件。swarm与ipfs类似,提供一个云存储,可能将要存储的内容放在swarm上,得到一个内容hash(代表所存储的内容,只要内容有修改,哈希就会改变),将hash存储在区块链上生成证明。
----------------------------------------------------------------------------------------------------------------------------------------
具体介绍,官方文档
搭建参考:这篇
web3 api:here
---------------------------------------------------------------------------------------------------------------------------------------
一、搭建网络
这里打算使用swarm连接私有链,需要的环境是geth,要将geth和swarm加入西荣path中。
输入swarm version查看是否安装成功。
1、首先生成一个账户,swarm使用这个账户
创建测试项目目录:
mkdir test_swarm
cd test_swarm
geth --datadir ./ account new
2、启动geth
初始化(genesis.json为创世文件,文章最后有)
geth init genesis.json --datadir ./
启动:
geth --datadir ./ --nodiscover --rpc --rpcapi "net,eth,db,web" --networkid 7788 console
3、连接swarm和geth:
swarm --bzzaccount 0x1da7eda1fc9e2a5a51e74ed55ce0827dab4be44a --datadir /home/zhj/project/test_chain/test_swarm/ --swap-api /home/zhj/project/test_chain/test_swarm/geth.ipc --nodiscover
其中datadir是swarm上数据在本地的存储,swap-api需要连接geth.ipc,nodiscover是不主动发现连接其他节点,可以手动添加节点(一旦连接一次后,其他节点的地址就会被保存下来,下次启动时会自动尝试连接)
现在已经启动了,可以尝试使用命令行来上传和下载数据,参考官方文档,这篇主要介绍和使用web3进行交互,所以不再介绍命令行使用。
二、使用web3-swarm api
参考文档在前面有,或者这篇中文翻译文档
先初始化nodejs环境:npm init
然后下载依赖:
npm install web3
npm install web3-bzz
下面是使用web3和swarm交互的代码:
app.js
var Bzz = require('web3-bzz')
var bzz = new Bzz(Bzz.givenProvider || 'http://localhost:8500')
let User = {
"name": "z",
"age": 11,
"major": "cs"
};
buff = Buffer.from(JSON.stringify(User));
bzz.upload(buff).then(function(hash) {
console.log("uploaded a string. hash: ", hash)
bzz.download(hash).then(function(buffer){
console.log('downloaded string: ', String.fromCharCode.apply(null, buffer))
})
})
其中前两行是调用swarm的包,然后连接本地swarm。
然后创建了一个json类型,下面测试上传和下载功能就是要将这个json传到swarm上面,然后再下载下来。
执行node app.js:
zhj@zhj-HP:~/project/test_swarm/web3test$ node app.js
uploaded a string. hash: 195ed46aa020ee28c1b3f2ec8d69a5b78ae4d12c66bece1fa56d89fa1ec3d892
downloaded string: {"name":"z","age":11,"major":"cs"}
第二行是上传成功后返回的hash值,第三行是下载之前上传的内容,对比内容是相同的,说明成功。
更多功能参考官方文档。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
genesis.json:
{
"config":{
"chainId":7788,
"homesteadBlock":0,
"eip155Block":0,
"eip158Block":0
},
"nonce": "0x0000000000000042",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x00",
"gasLimit": "0x80000000",
"difficulty": "0x4ffff",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x3333333333333333333333333333333333333333",
"alloc": { }
}