第二十二篇 墨客区块链(MOAC BlockChain) 墨客公共节点:gateway

版权声明:Copyright Reserved © 2018-2020 https://blog.csdn.net/lyq13573221675/article/details/83582762

2018-10-31,MOAC推出官方公共节点,https://gateway.moac.io

本文测试环境:Windows 10 + node Ver8.11.1 + chain3 Ver0.1.8。

1.介绍

moac gateway是一个托管的墨客节点集群,为用户提供公开的墨客区块链主网和测试网节点。

出于安全原因,gateway不管理用户的私钥,这意味着gateway不能代表用户签署交易。

因此,在使用chain3的过程中,不能通过sendTransaction,而只能使用sendRawTransaction发出交易。

1.1 主要特性(优势):

  1. 实现不同地理位置的服务器负载均衡;
  2. 实现MOAC区块链上的全功能RPC方法;
  3. 不再需要技术开发人员部署MOAC Vnode节点;
  4. 使用与本地节点完全一样的方式调用Chain3;
  5. 保持与最新的MOAC发布版本一致。

1.2 使用方法:

通过以下脚本,可以使用http(s)://gateway.moac.io代替自己的Vnode节点。

之前使用代码连接本地Vnode节点方式:

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

改为通过以下方式连接公共Vnode节点:

var Chain3 = require('chain3');
var chain3 = new Chain3(new Chain3.providers.HttpProvider('http://gateway.moac.io/testnet'));  //For testnet
var chain3 = new Chain3(new Chain3.providers.HttpProvider('http://gateway.moac.io/mainnet'));  //For mainnet

1.3 不足:

使用gateway跟使用本地Vnode节点相比,也有一些不足:

  1. 因为用户网络原因,可能有意想不到的无法连接Vnode情况;
  2. 无法按自己的方式启动节点,无法看到Vnode界面的反馈,有时候这些反馈很有用且很关键;
  3. 某些特殊应用不支持,比如试图使用http://wallet.moac.io部署合约。

2.账号管理

moac gateway提供Vnode功能的时候,从安全角度考虑,没有启动personal,因此不能通过persoanl.newAccount()创建账号。

鉴于moac gateway需要私钥签名才能发送交易,这里给出管理墨客账号的部分代码。

2.1 安装依赖模块ethereumjs-wallet

在具有管理员权限的控制台中,运行以下命令安装ethereumjs-wallet。

C:\>npm install -g ethereumjs-wallet

此处注意:如果是在Windows上安装并且遇到错误,则可能需要安装Windows构建工具。

在具有管理员权限的控制台中,运行以下命令安装Windows构建工具,然后再尝试安装依赖模块。

C:\>npm install -g windows-build-tools

2.2 离线生成账号privateKey

方法一:node环境下运行以下代码,可以离线生成账号,分别得到私钥、公钥和地址。

var crypto = require('crypto');         //npm install  -g crypto
var secp256k1 = require('secp256k1');   //npm install  -g secp256k1
var keccak = require('keccak');         //npm install  -g keccak

//获得随机的32个字节作为私钥,在使用中,请注意随机数来源的安全
var privateKey = crypto.randomBytes(32);
//获得公钥
var publicKey = secp256k1.publicKeyCreate(privateKey, false).slice(1);
//获得地址
var address = keccak('keccak256').update(publicKey).digest().slice(-20);

console.log('public key', publicKey.toString('hex'));
console.log('private key', privateKey.toString('hex'));
console.log('address', '0x' + address.toString('hex'));

方法二:node环境下运行以下代码,可以离线生成账号,得到私钥和地址。

var Wallet = require('ethereumjs-wallet');    //npm install -g ethereumjs-wallet
const wallet = Wallet.generate();

console.log("privateKey: " + wallet.getPrivateKeyString());
console.log("address: " + wallet.getAddressString());

运行结果:

2.3 从privateKey得到keystore

node环境下运行以下代码,可以从privateKey得到keystore文件内容:

var Wallet = require('ethereumjs-wallet');      
var key = Buffer.from('6bee6f2a97fc1e2e9d9aa041dbdcebbd50c2ae3488070e01e47dcd38e5840ff8', 'hex');  //填入privateKey,没有0x
var wallet = Wallet.fromPrivateKey(key);        
var keystore = wallet.toV3String('123456');    //填入要设置的密码,该密码可以从keystore得到privateKey
console.log("wallet: " + JSON.stringify(keystore));

运行结果:

将输出内容(wallet后面双引号中的内容),去掉所有“\”符号,新建一个文件,保存到D盘keystore目录下。

2.4 从keystore得到privateKey

从keystore得到privateKey需要提供账号密码。

node环境下运行以下代码,可以从keystore文件得到privateKey:

var keythereum = require("keythereum");  //npm install -g keythereum
var datadir = "D:";                      //此处需默认保存在keystore目录下,也就是keystore文件实际保存在D:\keystore目录下
var address= "0xd3ab5cdba1d540fb049b88e05241b3393e52e230";
const password = "123456";

var keyObject = keythereum.importFromFile(address, datadir);
var privateKey = keythereum.recover(password, keyObject);
console.log(privateKey.toString('hex'));

运行结果:

正确地从keystore得到privateKey。

3.基础使用测试

使用公共节点,用户通常有些信息需要拿到,而不能像本地节点那样是当然知道的,包括节点版本信息及当前区块高度等。

3.1 版本信息

使用代码如下:

var Chain3 = require('chain3');
var chain3 = new Chain3(new Chain3.providers.HttpProvider('https://gateway.moac.io/mainnet'));

var version = chain3.version.api;
console.log(version); 

var version = chain3.version.node;
console.log(version); 

var version = chain3.version.network;
console.log(version); 

输出结果:

前面是主网信息,后面是测试网信息,通常测试网的Vnode版本会比主网高,得到的结果均为当前最新发布版本。

3.2 区块高度

使用代码如下:

var Chain3 = require('chain3');
var chain3 = new Chain3(new Chain3.providers.HttpProvider('http://gateway.moac.io/mainnet'));

if(chain3.isConnected()){	
    console.log(chain3.mc.blockNumber);
}

输出结果:与浏览器同步较好。

以上测试,及部分chain3的基础使用(如获取账号balance、交易信息等),使用方式与本地节点相同,均输出正确结果。

过程中,快的时候1秒左右返回结果,慢的时候需要三十多秒。

4.发送签名交易

此处测试过程使用本文第二节生成的账号私钥、地址。

先向该地址发送0.5个mc;然后运行以下代码,使用sendRawTransaction发送一个签名交易,该笔交易发送0.2个mc。

var Chain3 = require('chain3');
var chain3 = new Chain3(new Chain3.providers.HttpProvider('http://gateway.moac.io/mainnet'));

var address = "0xd3ab5cdba1d540fb049b88e05241b3393e52e230";
var account = {address:"0xd3ab5cdba1d540fb049b88e05241b3393e52e230",secret:"6bee6f2a97fc1e2e9d9aa041dbdcebbd50c2ae3488070e01e47dcd38e5840ff8"};

var toAddress = "0x68986c1bcd54ae5dae69310fc64ea544ff1d56c4";
var amount = 0.2;

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, //default is global contract
    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);
      }
  });
}

输出结果:

此处测试多次,均成功返回结果。

到浏览器查询签名交易发送情况:

5.调用合约

为了测试的方便,该步骤使用一个已经部署好的erc20合约。

6.使用RPC

猜你喜欢

转载自blog.csdn.net/lyq13573221675/article/details/83582762
今日推荐