近日,在Moac NUWA 1.0.8测试版中做了重大技术升级。此次升级引入了子链多合约概念,本文将会通过以下三个部分加以介绍:
-
什么是子链,为什么要搭建子链
-
子链的搭建
-
部署基础业务合约
注:本文测试环境:64位Windows 10 中文版;
版本号:1.0.8;
网络:testnet
1
什么是子链
1.1 子链的概念
子链是相对于母链而言的,简单理解就是构建在底层母链基础上的区块链,其次,子链和母链有一定的区别,母链可以单独运行,而子链不能单独存在,必须通过主链提供的基础设施才能运行。
我们可以拿阿里巴巴作为例子,如果说母链是阿里巴巴,那么子链就可比拟为淘宝、猫眼电影、阿里大药房等等;然而假如有一天,阿里巴巴倒闭了,那么阿里旗下的所有项目也会倒闭。
1.2 为何MOAC要搭建子链
首先,当前区块链底层技术对于Dapp非常不友好,主要表现在三个方面:
1.对于区块链的小白来说,想要使用Dapp就需要学习钱包的使用,以及怎么买币,选择哪些交易所等等,这些流程非常繁琐,无形间增加了用户的学习成本,非常不利于公链的发展。
2.维护DAPP运行的成本不公平。DAPP的创建者不需要为系统的维护支付任何费用,而是把消耗系统资源的成本转嫁到了DAPP的用户身上;不利于构建DAPP的生态。
3.对于一个区块链网络而言,其终极目标就是希望构建一个去中心化生态,而随着矿工数量激增,挖矿难度越来越高,矿工们的挖矿成本也日益增加。
2
子链搭建
以下按照《视频教程 | 如何部署墨客子链》的步骤,使用版本1.0.8搭建子链。
部署子链矿池SubChainProtocolBase.sol;
部署三个scs,并注册到子链矿池;
部署Vnode矿池VnodeProtocolBase.sol并将本机vnode节点注册到矿池;
部署erc20合约erc20.sol;
部署子链合约SubChainBase.sol;
此处请注意,部署SubChainBase.sol的时候,对参与子链的SCS个数及刷新周期有要求,在合约里这么规定的:
//限定条件在此处
function SubChainBase(address proto, address vnodeProtocolBaseAddr, address ercAddr, uint ercRate, uint min, uint max, uint thousandth, uint flushRound) public {
require(min == 1 || min == 3 || min == 5 || min == 7); //最小scs数量
require(max == 11 || max == 21 || max == 31 || max == 51 || max == 99);//最大scs数量,与最小数量对应
require(flushRound >= 40 && flushRound <= 500); //刷新周期
本文实验实际部署SubChainBase.sol的参数如下:
部署scs开始出块,加入scs monitor并同步到最新,子链即部署成功:
3
部署基础业务合约
DAPP智能合约也通过主链的sendTransaction发送交易到 proxy vnode 的方式进行部署。
参数:
to: 子链控制合约subchainbase的地址
gas: 不需要消耗gas费用,传值:0
shardingflag:表示操作子链,传值:0x3,请注意,多合约版本部署任何合约shardingflag都为0x3
via: 对应proxy vnode的收益地址
在子链上部署多合约基础合约 dappbase.sol, 部署示例:
chain3 = require('chain3')
solc = require('solc')
chain3 = new chain3();
chain3.setProvider(new chain3.providers.HttpProvider('http://localhost:8545'));
solfile = 'deorder.sol';
contract = fs.readFileSync(solfile, 'utf8');
output = solc.compile(contract, 1);
abi = output.contracts[':DeOrder'].interface;
bin = output.contracts[':DeOrder'].bytecode;
subchainaddr = '0x1195cd9769692a69220312e95192e0dcb6a4ec09';
via = '0xf103bc1c054babcecd13e7ac1cf34f029647b08c';
chain3.personal.unlockAccount(chain3.mc.accounts[0], '123456');
chain3.mc.sendTransaction({from: chain3.mc.accounts[0], value:0, to: subchainaddr, gas:0, shardingFlag: "0x3", data: '0x' + bin, nonce: 0, via: via, });
本文使用http://wallet.moac.io/deploy-contract钱包工具部署
验证:
合约部署成功后,Nonce值应该是1,可调用monitor的rpc接口ScsRPCMethod.GetNonce进行检查。