第五十篇 墨客區塊鏈(MOAC BlockChain) 怎麼發mc

moac批量轉賬工具:http://transfer.moacchina.info/

本文中mc是指墨客區塊鏈的底層COIN,在墨客區塊鏈上主要用來支付交易手續費和作爲運算服務的媒介。

1.通過手機版錢包發mc

登錄手機錢包TokenPocket官網,下載相應版本的客戶端,並安裝。

1.1 創建錢包

進入TP錢包,點擊最下面的菜單“我”,進入“個人中心”。

選擇“管理錢包”,選擇“創建錢包”或“導入錢包”,“錢包體系”選擇“墨客”。

在輸入錢包名稱和錢包密碼後會創建一個新的墨客底層錢包。

1.2 發送和接收mc

進入一個墨客底層錢包。界面顯示該錢包所擁有的資產。

點擊“轉賬”可以發送mc,點擊“收款”接收mc。

 

2.使用網頁版錢包發mc

使用網頁版錢包發mc需要節點。節點安裝參考《第三篇 墨客區塊鏈(MOAC BlockChain)節點安裝教程》。

節點啓動命令:

D:\nuwa1.0.10.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.10.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.10.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.10.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;
    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.部署智能合約”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章