nodejs的客户端deploy墨客子链

技术文档网 2021-04-26

前提条件:

  • 已经在本地建了一个私有链,已经启动了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出块

相关文章

  1. 使用NodeJS搭建你的微信机器人

    你可以把该程序运行在任何支持 NodeJS 的云平台,或者你自己的 VPS 上。 首先你需要理解几个概念: node.js -使用v8引擎的服务器端 JavaScript npm - nodejs

  2. webpack和browserify用法

    这两种技术都是使用按需加载的模块化的思想来开发项目,让我可以按照node的require模块的方法写前端代码。。 两者用法、思想相差不大 1.webpack的安装及使用方法 安装webpack:

  3. 基于webpack的前后端分离开发实践

    前后端分离开发分析 前后端开发分离,即是前后端除商定 API 接口外,其他的开发工作都不再相互干涉,前端开发进度不再受后端影响。 以开发一个 SPA 单页应用为例,日常开发工作流程变为: 前后端同设

  4. Node多版本管理

    为每个项目指定运行的Node版本 nvm 安装nvm, 用于下载和管理NodeJS的版本$ curl -o- https://raw.githubusercontent.com/creationix

  5. nodejs的客户端deploy墨客子链

    前提条件: 已经在本地建了一个私有链,已经启动了vnode,已经启动两个scs 在vnode上已经有了主账户,并已经启动miner.start(),并且主账户已经有至少200个moac 假设你的主账

随机推荐

  1. 使用NodeJS搭建你的微信机器人

    你可以把该程序运行在任何支持 NodeJS 的云平台,或者你自己的 VPS 上。 首先你需要理解几个概念: node.js -使用v8引擎的服务器端 JavaScript npm - nodejs

  2. webpack和browserify用法

    这两种技术都是使用按需加载的模块化的思想来开发项目,让我可以按照node的require模块的方法写前端代码。。 两者用法、思想相差不大 1.webpack的安装及使用方法 安装webpack:

  3. 基于webpack的前后端分离开发实践

    前后端分离开发分析 前后端开发分离,即是前后端除商定 API 接口外,其他的开发工作都不再相互干涉,前端开发进度不再受后端影响。 以开发一个 SPA 单页应用为例,日常开发工作流程变为: 前后端同设

  4. Node多版本管理

    为每个项目指定运行的Node版本 nvm 安装nvm, 用于下载和管理NodeJS的版本$ curl -o- https://raw.githubusercontent.com/creationix

  5. nodejs的客户端deploy墨客子链

    前提条件: 已经在本地建了一个私有链,已经启动了vnode,已经启动两个scs 在vnode上已经有了主账户,并已经启动miner.start(),并且主账户已经有至少200个moac 假设你的主账