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.部署智能合約”。