FileStorm Dapp开发指南
FileStorm是在墨客子链上实现的基于IPFS的去中心化存储平台。详细介绍可参看这篇 html/appchain/FileStorm.html 在墨客子链上实现的IPFS存储平台。这个平台的用户有三类。
存储提供方: 存储提供方将会提供用于存储的硬件设备,如带大容量硬盘的电脑,或者订制的硬件盒子。设备需要安装FileStorm程序,用来链接墨客FileStorm子链,和IPFS网络。为FileStorm提供存储可以得到收益,就是俗称的存储挖矿。
应用部署方:应用部署方为FileStorm子链的创建者。他们可以搭建一个专门的子链为自己的应用做存储。应用部署方需要承担运营FileStorm子链的费用(墨客也会做为应用部署方部署一条FileStorm子链供用户使用。)
存储使用者:存储的使用者通过使用应用部署方部署的应用来存储和读取文件。存储使用者无需为使用FileStorm付费。但是可能要承担使用应用的费用。
我们的用户指南将根据用户的不同,,分成三部分。
存储提供方 运行FileStorm子链需要安装下面四个模块
redis - 本地数据库,用于缓存文件调用的请求。 IPFS Daemon - 文件以IPFS的方式存储的主要平台。 SCSServer - 墨客子链节点程序。 stormcatcher - 墨客子链节点对IPFS的调用。 这些模块可以用以下的方式一个一个下载安装,也可以用Docker的方式安装。先介绍一个一个下载安装流程。
redis:
Ubuntu
sudo apt update sudo apt full-upgrade sudo apt install build-essential tcl curl -O http://download.redis.io/redis-stable.tar.gz tar xzvf redis-stable.tar.gz sudo apt install redis-server
CentOs
sudo yum install epel-release sudo yum update sudo yum install redis
ipfs 可以用下面的方法安装与filestorm的ipfs软件包。
Ubuntu
curl https://dist.ipfs.io/go-ipfs/v0.4.18/go-ipfs_v0.4.18_linux-amd64.tar.gz > go-ipfs.tar.gz tar xvfz go-ipfs.tar.gz sudo mv go-ipfs/ipfs /usr/local/bin/ipfs CentOs curl https://dist.ipfs.io/go-ipfs/v0.4.17/go-ipfs_v0.4.17_linux-amd64.tar.gz > go-ipfs.tar.gz tar xvfz go-ipfs.tar.gz sudo mv go-ipfs/ipfs /usr/local/bin/ipfs
scsserver 和 stormcatcher 可以从这个链接下载最新版本。
下载后,下载的文件包会在服务器端生成filestorm工作文件夹。将文件夹内解压出如下文件:
scsserver stormcatcher userconfig.json run_filestorm_scs.sh stop_filestorm_scs.sh
也可以从这里下载Docker版本。关于Docker的安装和使用,可以看着里:Get Started with Docker.
设置 设置文件是userconfig.json
VnodeServiceCfg的设置是从 Node info - Testnet上,找到Vnode Protocol Pool下面的任何一个Vnode/Port组合加上。 Beneficiary设置成SCS节点收益的受益人钱包地址。
服务器上必须把下面的端口打开:
4001 5001 8080 如果节点做为子链监控节点,还需要打开run_filestorm_scs.sh中定义的rpc端口,缺省是50068.
运行 第一次使用必须先生成IPFS文件库
ipfs init 然后还需要生成一个节点ID。用如下指令
cd filestorm ./scsserver
生成的ID可以通过ll scskeystore看到。ID就是一个地址,是scskeystore下的文件名-后面的哪一部分在前面加上0x。 如文件名是UTC--2018-09-23T05-52-26.554142261Z--e09f56c0c8c528b14ea594764c09c7ede73f88c0 ID就是0xe09f56c0c8c528b14ea594764c09c7ede73f88c0
我们必须往这个ID里打一定的MOAC,0.05个即可,让这个ID记录到墨客区块链的主链上去。(可以用任何墨客钱包,如wallet.moac.io来做。)
然后就可以运行FileStorm了。FileStorm可以调用下面的脚本运行。
./run_filestorm_scs.sh 脚本代码如下,在后台调用四个模块
#!/bin/bash echo "Starting FileStorm SCS--" #IPFS_PATH=~/.ipfs nohup ipfs daemon > ipfs.out 2>&1 & echo "IPFS Daemon started." nohup redis-server --port 6373 > ipfs.out 2>&1 & echo "Redis Server started. " nohup ./stormcatcher-linux-amd64 --listen-host-port 127.0.0.1:18083 --redis-host-port 127.0.0.1:6373 --ipfs-host-port 127.0.0.1:5001 --subChain-contract-address 0x13512e62c8Cb1De316F7C442d767d0365350720c --subChain-address 127.0.0.1:50068/rpc > ipfs.out 2>&1 & echo "Storm Catcher started." nohup ./scsserver-linux-amd64 --rpc --rpcaddr 127.0.0.1 --rpcport 50068 --verbosity 4 > scs.out 2>&1 & echo "SCS started."
可以用调用下面的脚本停止 ./stop_filestorm_scs.sh
脚本代码如下,关闭四个模块
#!/bin/bash echo "Stoping FileStorm SCS--" pkill ipfs_monkey pkill redis-server pkill ipfs pkill scsserver echo "FileStorm SCS Stopped."
为了让子链节点正常使用,我们还需要给每个子链节点地址打0.5个Moac。
监测 可以用下面的指令检测墨客子链运行进程
tail -f scs.out
可以用下面的指令检测IPFS成勋运行进程
tail -f scs.out
应用部署方 本地必须开一个vnode连接到Moac testnet上。在 https://github.com/MOACChain/moac-core/releases 下载Nuwa1.0.7 用下面的指令开启vnode ./moac --testnet --rpc --rpccorsdomain "http://wallet.moac.io" console 打开 http://wallet.moac.io 发合约 DeploySubChainBase.sol 从 Node info - Testnet 上找SubChainProtocolBase pool地址和 Vnodeproxy pool地址 发子链合约 FileStormMicroChain.sol 注册检测子链 子链浏览器检测 存储使用者 存储使用者一般都是通过应用来存储文件。应用部署方则通过部署子链合约 FileStormMicroChain.sol把文件存到FileStorm上,或者读出来。
我们可以用如下的步骤演示文件读写的流程。方便应用方了解熟悉后集成到应用中。
本地必须开一个vnode连接到Moac testnet上。在 https://github.com/MOACChain/moac-core/releases 下载Nuwa1.0.2。(希望将来应用开发者会把这个模块) 用下面的指令开启vnode
./moac --testnet console
在本地安装IPFS(希望将来应用开发者会把这个模块集成到应用中。) 可以从这个链接下载最新版本ipfs软件包。我们以ubuntu版本为例
wget https://dist.ipfs.io/go-ipfs/v0.4.17/go-ipfs_v0.4.17_linux-amd64.tar.gz tar xvfz go-ipfs_v0.4.17_linux-amd64.tar.gz sudo mv go-ipfs/ipfs /usr/local/bin/ipfs
我们本地生成一个测试文件。vi newtestfile.txt 我们将测试文件放到IPFS中:ifps add newtestfile.txt 我们将拿到的文件hash生成16进制代码。可以在这个网站实现:https://codebeautify.org/string-hex-converter。 也可以用下面这段代码得到。
npm install --save ethereumjs-abi var abi = require('ethereumjs-abi'); var original = 'QmQNe96LqV5TcRQyBz12iQXPZQjemBqkgnpHki3wmKjtd6'; var encoded = abi.simpleEncode('write(string)', original); console.log('original', original); console.log('encoded', encoded.toString('hex'));
得到的字节数是46位的16进制数(因为每一位两个数字,一共92个数字)。因为solidty参数的存储空间是32位,46位的16进制数需要两个存储空间才行,然后我们要把得到的16进制数后面补上足够多的0,变成一个64位的16进制数(一共128个数字)。 调用函数处理文件有如下三个函数,分别可以对文件进行写,读,删。 from: 这必须是本机keystore里存在的一个账号。如果是vnode里第一次生成的就是chain3.mc.accounts[0],必须先进行一下personal.unlockAccount(mc.accounts[0])解锁使用。 to: subchainbaseaddress是SubChainBase合约地址,必须由应用项目方提供,我们可以用前面测试得到的地址。 data: 把第7步得到的数字加到data的数值里2e的后面。 每次调用要把nonce手动加1。(下一个版本会有更好的方法拿到nonce) via必须跟moac同文件夹下的vnodeproxy.json文件里
// write(fileHash) chain3.mc.sendTransaction( { from: chain3.mc.accounts[0], value:chain3.toSha('0','mc'), to: subchainbaseaddress, gas: "200000", gasPrice: chain3.mc.gasPrice, shardingflag: 1, data: '0xba3835ba00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e' nonce: 1, via: chain3.mc.accounts[0] }); // read(fileHash) chain3.mc.sendTransaction( { from: mc.accounts[0], value:chain3.toSha('0','mc'), to: subchainbaseaddress, gas: "200000", gasPrice: chain3.mc.gasPrice, shardingflag: 1, data: '0x616ffe830000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002e' nonce: 2, via: mc.accounts[0] }); // remove(fileHash) chain3.mc.sendTransaction( { from: mc.accounts[0], value:chain3.toSha('0','mc'), to: subchainbaseaddress, gas: "200000", gasPrice: chain3.mc.gasPrice, shardingflag: 1, data: '0x80599e4b0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002e' nonce: 3, via: mc.accounts[0] });
调用结果:
Write:IPFS文件被存到FileStorm子链的每一个节点上,文件Hash值被改变。 Read:FileStorm子链的每一个节点上都会出现原始Hash值的原文件。(会在24小时后自动删除。) Remove:IPFS文件会从FileStorm子链的每一个节点上被删除。