nodejs的客户端deploy墨客子链 - coolcat2012/MoacDoc GitHub Wiki
前提条件:
- 已经在本地建了一个私有链,已经启动了vnode,已经启动两个scs
- 在vnode上已经有了主账户,并已经启动miner.start(),并且主账户已经有至少200个moac
- 假设你的主账号的密码是123456,否则需要改deploy.js里这一行:chain3.personal.unlockAccount(address, '123456')
- 另外,要把下面deploy.js里面的scs1和scs2的id改为你自己的id
- 还要把deploy.js里面这一行改成你自己的:var basepath = "/Users/yuechaoma/go/src/github.com/innowells/moac-vnode/solidity/abibin424";
- 另外,如果你的。。。solidity/abibin424这个目录里面还没有编译好的sol,运行一下两行先编译一下
npm install solc -g
cd /Users/yuechaoma/go/src/github.com/innowells/moac-vnode/solidity
solcjs -o abibin424 --optimize --abi --bin SubChainBase.sol SubChainProtocolBase.sol VnodeProtocolBase.sol
安装nodejs的库:
npm install chain3 -g
npm install solc -g
启动vnode的时候打开rpcapi,否则有些api不能调用:
./moac --datadir ./data --networkid 102 --port 30303 --rpc --rpcport 8545 --verbosity 4 --nodiscover --rpcapi="db,mc,net,chain3,personal,debug"
运行nodejs
# node deploy.js
这是deploy.js的代码
const Chain3 = require('chain3');
const fs = require('fs');
const solc = require('solc');
const vnodeUri = 'http://localhost:8545';
var address = '';
let chain3 = new Chain3();
chain3.setProvider(new chain3.providers.HttpProvider(vnodeUri));
if(!chain3.isConnected()){
throw new Error('unable to connect to moac vnode at ' + vnodeUri);
}else{
console.log('connected to moac vnode at ' + vnodeUri);
let coinbase = chain3.mc.coinbase;
console.log('coinbase:' + coinbase);
let balance = chain3.mc.getBalance(coinbase);
console.log('balance:' + balance/1000000000000000000 + " MC");
let accounts = chain3.mc.accounts;
console.log(accounts);
address = coinbase;
if (chain3.personal.unlockAccount(address, '123456')) {
console.log(`${address} is unlocaked`);
}else{
console.log(`unlock failed, ${address}`);
throw new Error('unlock failed ' + address);
}
}
//==========================================================================
//==========================================================================
console.log("Deploying the subchainprotocolbaseContract");
var basepath = "/Users/yuechaoma/go/src/github.com/innowells/moac-vnode/solidity/abibin424";
var abipath = basepath + "/SubChainProtocolBase_sol_SubChainProtocolBase.abi";
var binpath = basepath + "/SubChainProtocolBase_sol_SubChainProtocolBase.bin";
var abi = fs.readFileSync(abipath, "utf8");
var bin = fs.readFileSync(binpath, "utf8");
//console.log("abi:"+abi);
//console.log("bin:"+bin);
var protocol = "POR";
var bmin = 10;
var subchainprotocolbaseContract = chain3.mc.contract(JSON.parse(abi));
var subchainprotocolbase = subchainprotocolbaseContract.new(
protocol,
bmin,
{
from: chain3.mc.accounts[0],
data: '0x' + bin,
gas: '4700000'
}
);
console.log("subchainprotocolbaseContract is being deployed transaction: " + subchainprotocolbase.transactionHash);
waitBlock(subchainprotocolbase.transactionHash);
subchainprotocolbase = subchainprotocolbaseContract.at(chain3.mc.getTransactionReceipt(subchainprotocolbase.transactionHash).contractAddress);
//==========================================================================
//==========================================================================
console.log("Deploying the vnodeprotocolbaseContract");
abipath = basepath + "/VnodeProtocolBase_sol_VnodeProtocolBase.abi";
binpath = basepath + "/VnodeProtocolBase_sol_VnodeProtocolBase.bin";
abi = fs.readFileSync(abipath, "utf8");
bin = fs.readFileSync(binpath, "utf8");
var bmin = 1;
var vnodeprotocolbaseContract = chain3.mc.contract(JSON.parse(abi));
var vnodeprotocolbase = vnodeprotocolbaseContract.new(
bmin,
{
from: chain3.mc.accounts[0],
data: '0x' + bin,
gas: '4700000'
}
);
console.log("vnodeprotocolbaseContract is being deployed transaction: " + vnodeprotocolbase.transactionHash);
waitBlock(vnodeprotocolbase.transactionHash);
vnodeprotocolbase = vnodeprotocolbaseContract.at(chain3.mc.getTransactionReceipt(vnodeprotocolbase.transactionHash).contractAddress);
//==========================================================================
//==========================================================================
console.log("Deploying the subchainbaseContract");
abipath = basepath + "/SubChainBase_sol_SubChainBase.abi";
binpath = basepath + "/SubChainBase_sol_SubChainBase.bin";
abi = fs.readFileSync(abipath, "utf8");
bin = fs.readFileSync(binpath, "utf8");
console.log("subchainprotocolbase.address:"+subchainprotocolbase.address);
console.log("vnodeprotocolbase.address:"+vnodeprotocolbase.address);
var proto = subchainprotocolbase.address ;
var vnodeProtocolBaseAddr = vnodeprotocolbase.address ;
var min = 1 ;
var max = 10 ;
var thousandth = 1 ;
var flushRound = 20 ;
var subchainbaseContract = chain3.mc.contract(JSON.parse(abi));
var subchainbase = subchainbaseContract.new(
proto,
vnodeProtocolBaseAddr,
min,
max,
thousandth,
flushRound,
{
from: chain3.mc.accounts[0],
data: '0x' + bin,
gas: '9000000'
}
);
console.log("subchainbaseContract is being deployed transaction: " + subchainbase.transactionHash);
waitBlock(subchainbase.transactionHash);
subchainbase = subchainbaseContract.at(chain3.mc.getTransactionReceipt(subchainbase.transactionHash).contractAddress);
//==========================================================================
//==========================================================================
console.log("send mc to scs1 and scs2");
scs1="0xcfFf88aF063D8783fCa45e19935EA1D3a3fEceF5";
sendtx(chain3.mc.accounts[0], scs1, 20);
waitBalance(scs1, 20);
scs2="0x4D591aE30e96F4A0487027cDfF98187280620111";
sendtx(chain3.mc.accounts[0], scs2, 20);
waitBalance(scs2, 20);
addfundtosubchain(subchainbase.address);
waitBalance(subchainbase.address, 10);
//==========================================================================
//==========================================================================
console.log("Registering SCS to the pool");
registertopool(subchainprotocolbase.address, scs1);
registertopool(subchainprotocolbase.address, scs2);
while (true) {
let count = subchainprotocolbase.scsCount();
if (count >= 2) {
console.log("registertopool has enough scs " + count);
break;
}
console.log("Waiting registertopool, current scs count=" + count);
sleep(5000);
}
let scslist=subchainprotocolbase.scsList(scs2);
console.log(scslist);
let startnum = chain3.mc.blockNumber;
while (true) {
let number = chain3.mc.blockNumber;
if (number > startnum + 5) {
console.log("reached target block number " + number);
break;
}
console.log("Waiting block number, current block number=" + number);
sleep(5000);
}
registeropen();
while (true) {
let count = subchainbase.nodeCount();
if (count >= 2) {
console.log("registertopool has enough scs " + count);
break;
}
console.log("Waiting registertopool, current scs count=" + count);
sleep(5000);
}
registerclose();
console.log("all Done!!!");
sleep(100000);
function registertopool(contractadd, scsaddress) {
var registerdata = "0x4420e486000000000000000000000000"+scsaddress.substring(2);
sendtx(chain3.mc.coinbase, contractadd, 12, registerdata);
}
function registeropen() {
sendtx(chain3.mc.coinbase, subchainbase.address, 0, "0x5defc56c");
}
function addfundtosubchain() {
sendtx(chain3.mc.coinbase, subchainbase.address, 10, "0xa2f09dfa");
}
function registerclose() {
sendtx(chain3.mc.coinbase, subchainbase.address, 0, "0x69f3576f");
}
function subchainRegisterAsMonitor(scsAddr)
{
sendtx(chain3.mc.coinbase, subchainbase.address, '0', '0x4e592e2f000000000000000000000000' + scsAddr );
}
function waitBlock(transactionHash) {
while (true) {
let receipt = chain3.mc.getTransactionReceipt(transactionHash);
if (receipt && receipt.contractAddress) {
console.log("contract has been deployed at " + receipt.contractAddress);
break;
}
console.log("Waiting a mined block to include your contract... currently in block " + chain3.mc.blockNumber);
sleep(5000);
}
}
function waitBalance(addr, target) {
while (true) {
let balance = chain3.mc.getBalance(addr)/1000000000000000000;
if (balance >= target) {
console.log("account has enough balance " + balance);
break;
}
console.log("Waiting the account has enough balance " + balance);
sleep(5000);
}
}
function sendtx(src, tgtaddr, amount, strData) {
chain3.mc.sendTransaction(
{
from: src,
value:chain3.toSha(amount,'mc'),
to: tgtaddr,
gas: "2000000",
gasPrice: chain3.mc.gasPrice,
data: strData
});
console.log('sending from:' + src + ' to:' + tgtaddr + ' amount:' + amount + ' with data:' + strData);
}
function sleep(milliseconds) {
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++) {
if ((new Date().getTime() - start) > milliseconds){
break;
}
}
}
TRACE:
Yuechaos-MacBook-Pro:vnode yuechaoma$ node deploy.js
connected to moac vnode at http://localhost:8545
coinbase:0xd5fe269d1e6489c83920aeb492e35ef1fdd4b33d
balance:21272.016759332 MC
[ '0xd5fe269d1e6489c83920aeb492e35ef1fdd4b33d' ]
0xd5fe269d1e6489c83920aeb492e35ef1fdd4b33d is unlocaked
Deploying the subchainprotocolbaseContract
subchainprotocolbaseContract is being deployed transaction: 0xb29e6eddab42dc278c119d89b36c5315dd4178916068f68232c72e6e7ce8d424
Waiting a mined block to include your contract... currently in block 11166
Waiting a mined block to include your contract... currently in block 11167
Waiting a mined block to include your contract... currently in block 11167
Waiting a mined block to include your contract... currently in block 11167
Waiting a mined block to include your contract... currently in block 11167
contract has been deployed at 0x73691cab4c8c4f9b3f108d13aa545e994bcc46e5
Deploying the vnodeprotocolbaseContract
vnodeprotocolbaseContract is being deployed transaction: 0x287f3696207d318f3f180564bfd03ea49998cb3c871faca00bab63b3b9bac96e
Waiting a mined block to include your contract... currently in block 11169
Waiting a mined block to include your contract... currently in block 11169
Waiting a mined block to include your contract... currently in block 11169
Waiting a mined block to include your contract... currently in block 11169
Waiting a mined block to include your contract... currently in block 11169
Waiting a mined block to include your contract... currently in block 11169
Waiting a mined block to include your contract... currently in block 11169
Waiting a mined block to include your contract... currently in block 11169
Waiting a mined block to include your contract... currently in block 11169
Waiting a mined block to include your contract... currently in block 11169
Waiting a mined block to include your contract... currently in block 11170
Waiting a mined block to include your contract... currently in block 11170
contract has been deployed at 0x163cf91510ab41491cb56ce03707df767fea6b16
Deploying the subchainbaseContract
subchainprotocolbase.address:0x73691cab4c8c4f9b3f108d13aa545e994bcc46e5
vnodeprotocolbase.address:0x163cf91510ab41491cb56ce03707df767fea6b16
subchainbaseContract is being deployed transaction: 0xe9bfffc8bc3a4e3aa35a039e09f06040fabe31b4e3b91a291ed882004d5dd5eb
Waiting a mined block to include your contract... currently in block 11171
Waiting a mined block to include your contract... currently in block 11171
Waiting a mined block to include your contract... currently in block 11172
Waiting a mined block to include your contract... currently in block 11172
Waiting a mined block to include your contract... currently in block 11172
Waiting a mined block to include your contract... currently in block 11172
contract has been deployed at 0x32aee3a99d8e1042373b8f929a0d3d4ad042a5d6
send mc to scs and scs2
sending from:0xd5fe269d1e6489c83920aeb492e35ef1fdd4b33d to:0xcfFf88aF063D8783fCa45e19935EA1D3a3fEceF5 amount:20 with data:undefined
account has enough balance 559.9960885459998
sending from:0xd5fe269d1e6489c83920aeb492e35ef1fdd4b33d to:0x4D591aE30e96F4A0487027cDfF98187280620111 amount:20 with data:undefined
account has enough balance 259.99556362999976
sending from:0xd5fe269d1e6489c83920aeb492e35ef1fdd4b33d to:0x32aee3a99d8e1042373b8f929a0d3d4ad042a5d6 amount:10 with data:0xa2f09dfa
Waiting the account has enough balance 0
Waiting the account has enough balance 0
account has enough balance 10
Registering SCS to the pool
sending from:0xd5fe269d1e6489c83920aeb492e35ef1fdd4b33d to:0x73691cab4c8c4f9b3f108d13aa545e994bcc46e5 amount:12 with data:0x4420e486000000000000000000000000cfFf88aF063D8783fCa45e19935EA1D3a3fEceF5
sending from:0xd5fe269d1e6489c83920aeb492e35ef1fdd4b33d to:0x73691cab4c8c4f9b3f108d13aa545e994bcc46e5 amount:12 with data:0x4420e4860000000000000000000000004D591aE30e96F4A0487027cDfF98187280620111
Waiting registertopool, current scs count=0
Waiting registertopool, current scs count=0
Waiting registertopool, current scs count=0
Waiting registertopool, current scs count=0
Waiting registertopool, current scs count=0
registertopool has enough scs 2
[ '0x4d591ae30e96f4a0487027cdff98187280620111',
BigNumber { s: 1, e: 19, c: [ 120000 ] },
BigNumber { s: 1, e: 0, c: [ 1 ] },
BigNumber { s: 1, e: 4, c: [ 11182 ] },
BigNumber {
s: 1,
e: 77,
c:
[ 11579208,
92373161954235,
70985008687907,
85326998466564,
5640394575840,
7913129639935 ] } ]
Waiting block number, current block number=11178
Waiting block number, current block number=11178
Waiting block number, current block number=11178
Waiting block number, current block number=11178
Waiting block number, current block number=11180
Waiting block number, current block number=11180
Waiting block number, current block number=11180
Waiting block number, current block number=11180
Waiting block number, current block number=11180
Waiting block number, current block number=11180
Waiting block number, current block number=11180
Waiting block number, current block number=11180
Waiting block number, current block number=11181
Waiting block number, current block number=11181
Waiting block number, current block number=11181
Waiting block number, current block number=11181
Waiting block number, current block number=11181
Waiting block number, current block number=11181
Waiting block number, current block number=11181
Waiting block number, current block number=11181
Waiting block number, current block number=11182
Waiting block number, current block number=11182
Waiting block number, current block number=11182
Waiting block number, current block number=11183
Waiting block number, current block number=11183
Waiting block number, current block number=11183
Waiting block number, current block number=11183
Waiting block number, current block number=11183
Waiting block number, current block number=11183
reached target block number 11184
sending from:0xd5fe269d1e6489c83920aeb492e35ef1fdd4b33d to:0x32aee3a99d8e1042373b8f929a0d3d4ad042a5d6 amount:0 with data:0x5defc56c
Waiting registertopool, current scs count=0
Waiting registertopool, current scs count=0
Waiting registertopool, current scs count=0
Waiting registertopool, current scs count=0
Waiting registertopool, current scs count=0
Waiting registertopool, current scs count=0
Waiting registertopool, current scs count=0
Waiting registertopool, current scs count=0
Waiting registertopool, current scs count=0
Waiting registertopool, current scs count=0
registertopool has enough scs 2
sending from:0xd5fe269d1e6489c83920aeb492e35ef1fdd4b33d to:0x32aee3a99d8e1042373b8f929a0d3d4ad042a5d6 amount:0 with data:0x69f3576f
all Done!!!
每个scs都在这个子链出块中
本脚本执行的命令包括:
loadScript("unlock.js")
loadScript("test.js")
loadScript("p421.js")
等待mining
loadScript("v421.js")
等待minging
loadScript("s421.js")
等待minging
scs1="0xcfFf88aF063D8783fCa45e19935EA1D3a3fEceF5"
scs2="0x4D591aE30e96F4A0487027cDfF98187280620111"
sendtx(mc.accounts[0], scs1, 20)
sendtx(mc.accounts[0], scs2, 20)
等待转账成功
mc.getBalance(scs1)/1000000000000000000
mc.getBalance(scs2)/1000000000000000000
addfundtosubchain()
等待转账成功
registertopool(scs1)
registertopool(scs2)
subchainprotocolbase.scsCount()
等待count为2
subchainprotocolbase.scsList(scs1)
subchainprotocolbase.scsList(scs2)
mc.blockNumber
等待达到scs2的期待号
registeropen()
subchainbase.nodeCount()
等待count为2
registerclose()
等待两个scs出块