本文中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
}
]);
//自己写的休眠函数
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);
}
});
}