第九篇 墨客区块链(MOAC BlockChain) 怎么发mc

本文中mc是指墨客区块链的底层COIN,在墨客区块链上主要用来支付交易手续费和作为运算服务的媒介。

1.通过手机版钱包发mc

登录手机版钱包TokenPocket官网,下载相应版本的客户端,并安装。

1.1 创建钱包

进入TP钱包,点击最下面的菜单“我”,进入“个人中心”。

选择“管理钱包”,选择“创建钱包”或“导入钱包”,“钱包体系”选择“墨客”。

在输入钱包名称和钱包密码后会创建一个新的墨客底层钱包。

1.2 发送和接收mc

进入一个墨客底层钱包。界面显示该钱包所拥有的资产。

点击“转账”可以发送mc,点击“收款”接收mc。

2.使用网页版钱包发mc

使用网页版钱包发mc需要节点。节点安装参考《第三篇 墨客区块链(MOAC BlockChain)节点安装教程》。

节点启动命令:

D:\nuwa1.0.0.win>moac --rpc --rpccorsdomain "http://wallet.moac.io"

登录网页版钱包:http://wallet.moac.io/

如果本地节点有账号,并且账号里有mc。点击界面“发送”。

输入“接收地址”、“发送数量”、选择发送“MC”,选择手续费后点击按钮“发送”。

发送前需要在节点解锁发送账号。

>personal.unlockAccount(mc.accounts[0], "passwd", 300)

发送成功,通常可以马上查看到mc数量的变化情况。

3.使用节点[Send]命令发mc

使用节点[Send]发mc需要本地节点。节点安装参考《第三篇 墨客区块链(MOAC BlockChain)节点安装教程》。

节点启动后,另开一个cmd窗口进入attach界面。

D:\nuwa1.0.0.win>moac attach

需要本地节点至少有一个有mc的账号。

Send函数封装在mctest.js里,因此需要先load。

>loadScript("mctest.js")

使用Send发mc命令如下:

> Send(mc.accounts[0], 'passwd', mc.accounts[1], 0.1)

这个过程中,mc.accounts[0]是发送账号,mc.accounts[1]是接收账号,'passwd'是第一个账号的密码,发送额为0.1 mc。

发送mc通常在下一个区块产生时完成。

通过命令可以查看到本地所有账号余额变化情况:

>checkBalance()

4.使用代码发mc

在节点文件夹的mctest.js里有Send函数,可以直接拿来嵌入代码,发送mc。

4.1 Send函数

function sendtx(src, tgtaddr, amount, strData) {		
    chain3.mc.sendTransaction(
        {
            from: src,
            value:chain3.toSha(amount,'mc'),
            to: tgtaddr,
            gas: "22000",//min 1000
            gasPrice: chain3.mc.gasPrice,
            data: strData
        }, function (e, transactionHash){
            if (!e) {
                console.log('Transaction hash: ' + transactionHash);
            }
        });		
    console.log('sending from:' + 	src + ' to:' + tgtaddr  + ' amount:' + amount + ' with data:' + strData);
}

//Send function unlock the source account and
//send the input value to the target account
function Send(src, passwd, target, value){
    chain3.personal.unlockAccount(src, passwd, 0);
    sendtx(src, target, value, '' );	
}

这段代码需要personal.unlockAccount,因此节点启动方式为:

D:\nuwa1.0.0.win>moac --rpc --rpcapi="db,mc,net,chain3,personal,debug"

4.2 给多个地址自动发送mc

在4.1节代码的基础上,尝试实现给多个地址发送mc。

首先设计一个excel文件,保存接收mc的地址及每个地址的数量。命名为test.xlsx。

本实例用到address和amount。id和name不在代码里使用,仅用于文档记录。

这段代码需要personal.unlockAccount,因此节点启动方式为:

D:\nuwa1.0.0.win>moac --rpc --rpcapi="db,mc,net,chain3,personal,debug"

代码文件sendMoac.js。node执行即可。

var Chain3 = require('chain3');
var chain3 = new Chain3(new Chain3.providers.HttpProvider('http://localhost:8545'));

var xlsx = require('node-xlsx');
var fs = require('fs');

//发送mc地址
var address_from = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
var password_from = "password";		//发送地址密码

//主要参数
var interval = 2;			//发送一笔交易的间隔时间,秒
var address_to = "";		        //接收地址,从test.xlsx得到
var amount = 0.0;			//发送额度,从test.xlsx得到

//读取文件内容
var obj = xlsx.parse(__dirname+'/test.xlsx');
var excelObj=obj[0].data;
//console.log(excelObj);

var data = [];
for(var i in excelObj){
    var arr=[];
    var value=excelObj[i];		//记录循环
    //console.log(i,"  ",value);	
	
    if (i > 0){
        //以下每隔2秒,发送一次墨客
        sleep(interval * 1000);
        address_to = value[2];
        amount = value[3];
        console.log(i,"  ",address_to,"  ",amount);
        Send(address_from,password_from,address_to,amount);
    }
	
    for(var j in value){		//每一条记录内容
        arr.push(value[j]);
        //console.log(j,"  ",value[j]);
    }
    data.push(arr);
}

var buffer = xlsx.build([
    {
        name:'sheet1',
        data:data
    }        
]);

//将文件内容插入新的文件中,根据实际需要使用
fs.writeFileSync((new Date).toLocaleDateString()+'-'+(new Date).getTime()+'-'+'test.xlsx',buffer,{'flag':'w'});

//自己写的休眠函数
function sleep(numberMillis) { 				
    var now = new Date(); 
    var exitTime = now.getTime() + numberMillis; 
    while (true) { 
        now = new Date(); 
        if (now.getTime() > exitTime) 
        return; 
    } 
}

function sendtx(src, tgtaddr, amount, strData) {		
    chain3.mc.sendTransaction(
        {
            from: src,
            value:chain3.toSha(amount,'mc'),
            to: tgtaddr,
            gas: "22000",//min 1000
            gasPrice: chain3.mc.gasPrice,
            data: strData
        }, function (e, transactionHash){
            if (!e) {
                console.log('Transaction hash: ' + transactionHash);
            }
        });		
    console.log('sending from:' + 	src + ' to:' + tgtaddr  + ' amount:' + amount + ' with data:' + strData);
}

//Send function unlock the source account and
//send the input value to the target account
function Send(src, passwd, target, value)
{
    chain3.personal.unlockAccount(src, passwd, 0); //启动节点的时候需要包含personal
    sendtx(src, target, value, '' );	
}

5.使用私钥签名发mc

该方法的主要优点是安全。

var Chain3 = require('chain3');
var chain3 = new Chain3(new Chain3.providers.HttpProvider('http://localhost:8545'));

var address = "0x745c57ca5318093115d61bbca368XXXXXXXXXXXX";
var account = {address:"0x745c57ca5318093115d61bbca368XXXXXXXXXXXX",secret:"bb673026deda3c3cd0c63f6ccddfb02a7ae320078aa8XXXXXXXXXXXXXXXXXXXX"};

var toAddress = "0x68986c1bcd54ae5dae69310fc64eXXXXXXXXXXXX";
var amount = 0.002;

send(chain3, account.address, account.secret, toAddress, amount, txCount = -1)

function send(chain3, fromAddress, fromSecret, toAddress, amount, txCount = -1){
    var mc = chain3.mc;

    var txcount = txCount >= 0 ? txCount : chain3.mc.getTransactionCount(fromAddress);
    console.log("Get tx account", txcount);

    var gasPrice = 25000000000;
    var gasLimit = 100000;
    var value = chain3.toSha(amount, 'mc');
    var gasTotal = gasPrice * gasLimit + Number(value);
    console.log(gasPrice, gasLimit, value, chain3.fromSha(gasTotal, 'mc'));

    var rawTx = {
        from: fromAddress,
        to: toAddress,
        nonce: chain3.intToHex(txcount),
        gasPrice: chain3.intToHex(gasPrice),
        gasLimit: chain3.intToHex(gasLimit),
        value: chain3.intToHex(value),
        shardingFlag: 0, 
        chainId: chain3.version.network
    };

    var signedTx = chain3.signTransaction(rawTx, fromSecret);
    mc.sendRawTransaction(signedTx, function(err, hash) {
        if (!err){
            console.log("succeed: ", hash);
            return hash;
        }else{
            console.log("error:", err);
            console.log('raw tx:', rawTx);
        }
    });
}

代码使用sendRawTransaction时需要私钥签名,得到本地节点账号的私钥方法见:

本博客《第八篇 墨客区块链(MOAC BlockChain) 程序猿怎么部署和调用智能合约》的第三节“3.部署智能合约”。

猜你喜欢

转载自blog.csdn.net/lyq13573221675/article/details/81329107