美文网首页
Node.js+EOS

Node.js+EOS

作者: arthur25 | 来源:发表于2019-01-16 10:47 被阅读34次

这是一篇简单的eos接入指南

首先推荐一个资源,这里几乎涵盖了EOS所有的资源,包括资料,工具,开发等. 需要请自行查看.

简书博客

我看的比较多的是下面这个eos开发指南.

EOS开发指南

技术接入

下面我会用简单的例子, 介绍NODE.JS如何接入EOS测试网 (由于主网账号需要真金白银,就没进行测试了)

JUNGLE TESTNET
你可以通过这个网站进行测试账号以及测试币的申请.

  1. 环境准备
node v11.3.0
npm 6.4.1

需要用到的关联模块

npm install eosjs@beta node-fetch text-encoding eosjs-ecc
  1. 开始开发

模块调用

const { Api, JsonRpc, RpcError, JsSignatureProvider } = require('eosjs');

const ecc = require('eosjs-ecc');

// 只有在node.js环境下,才需要以下模组; 浏览器不需要引入这个模组。
const fetch = require('node-fetch');
// 只有在node.js / IE11 /IE Edge 浏览器环境下,需要以下模组;
const { TextDecoder, TextEncoder } = require('text-encoding');

// 这里的私钥填写刚才生成的私钥(网页申请步骤中)
const privateKey = "5KFkyd2N6Bhxg39VYseZ9r6kfnXNfHGRJ18wPcb3DUGNQ8G2U8v";
const signatureProvider = new JsSignatureProvider([privateKey]);

// rpc 对象可以运行 eos的rpc命令
// rpc 命令查询 https://eosio.github.io/eosjs/classes/json_rpc.jsonrpc.html
const rpc = new JsonRpc('https://jungle2.cryptolions.io', { fetch });


// api 对象可以运行eos的合约,比如转账,创建账号等等(需要费用的操作)
const api = new Api({ rpc, signatureProvider, textDecoder: new TextDecoder(), textEncoder: new TextEncoder() });

测试连接

// rpc对象支持promise,所以使用 async/await 函数运行rpc命令
const  runRpc = async () => {

  // 获取主网信息
  const info = await rpc.get_info();
  console.log(info);

  // 获取账号bazinga11111的信息
  const accountInfo = await rpc.get_account('bazinga11111');
  console.log(accountInfo);

  // 获取账号bazinga11111的资产,查询资产的时候要加上资产的合约名字eosio.token
  const balance = await rpc.get_currency_balance('eosio.token','bazinga11111');
  console.log(balance);

  const accountInfo2 = await rpc.get_account('sniper111111');
  console.log(accountInfo2);

  //获取账号操作历史
  const actionHistory = await rpc.history_get_actions('bazinga11111');
  console.log(actionHistory);

};

运行以下命令,如果一切正常会打印出查询的结果.(由于结果数据很长,就不贴出查询结果了)

runRpc().catch(err=>{
  console.log("rpc error: ",err)
});

运行合约

在eos系统中, 创建账号或者转账都可以认为是运行合约.

创建账号:需要生产公私钥对, 需要使用 eosjs-ecc 模组, 或者你可以通过在线EOS公私钥工具生成, 这里我们使用代码生成.
发起创建账号这个合约需要三个步骤, 并且这三个要打包在一起, 同时发起.

  • 将用户名与公钥绑在一起
  • 为新用户租借网络带宽与cpu
  • 为新用户购买内存

注意:创建账号的参数中有可能使用newact 或者 name, 具体要看区块链的版本, 以及根据报错信息进行修改, 以下的例子是两个都写上了.

// 创建账号
// api对象支持promise,所以使用 async/await 函数运行api命令
const createAccount = async () => {

  // 创建账号前,生成公私钥,需要使用 eosjs-ecc 模组
  const newPrivateKey = await ecc.randomKey();
  const newPublicKey = ecc.privateToPublic(newPrivateKey);
  console.log(newPrivateKey, newPublicKey);

  // 本次生成结果是
  // newPublicKey  EOS5zYn71M57Sw3dzdCkjwmzqQ7BnaMq8yK6mH7QRHfuBmUnQHZ7M
  // newPrivateKey 5JSCCAzinaNsDe7Pc42kJxWn2ur7mZVJWXGEZHbyKYh3ZHbtdNg
   
  // 这是将多个action合并到一起发起。
  // 因为在创建账号的时候需要三个步骤
  // 1)将用户名与公钥绑在一起
  // 2) 为新用户租借网络带宽与cpu
  // 3) 为新用户购买内存
  const result = await api.transact({
    actions: [{
      // 这个account是指合约名
      account: 'eosio',
      // 创建新账号的action名
      name: 'newaccount',
      authorization: [{
        actor: 'bazinga11111',
        permission: 'active',
      }],
      data: {
        creator: 'bazinga11111',
        // 这里的name指的是新用户的名字,在内部测试时候用的是name这个字段。
        name: 'sniper111111',
        // newcat 是公测链,新用户名的参数,可能版本不一样,字段不一样
        newact:'sniper111111',
        owner: {
          threshold: 1,
          keys: [{
            // 写入上面新生成的公钥
            key: newPublicKey,
            weight: 1
          }],
          accounts: [],
          waits: []
        },
        active: {
          threshold: 1,
          keys: [{
            // 写入上面新生成的公钥
            key: newPublicKey,
            weight: 1
          }],
          accounts: [],
          waits: []
        },
      },
    },
      {
        account: 'eosio',
        // 购买内存的action名
        name: 'buyrambytes',
        authorization: [{
          actor: 'bazinga11111',
          permission: 'active',
        }],
        data: {
          payer: 'bazinga11111',
          receiver: 'sniper111111',
          bytes: 8192,
        },
      },
      {
        account: 'eosio',
        // 抵押资产的action名,用于租用带宽与cpu,抵押资产,抵押的越多,带宽和cup就越多
        name: 'delegatebw',
        authorization: [{
          actor: 'bazinga11111',
          permission: 'active',
        }],
        data: {
          from: 'bazinga11111',
          receiver: 'sniper111111',
          // 这里的货币单位,要查询一下系统货币的名称才能填,可能是SYS或者EOS
          stake_net_quantity: '1.0000 EOS',
          stake_cpu_quantity: '1.0000 EOS',
          transfer: false,
        }
      }]
  }, {
    blocksBehind: 3,
    expireSeconds: 30,
  });

  console.log(result)
};

运行以下命令,如果一切正常会打印出查询的结果.(由于结果数据很长,就不贴出查询结果了)

createAccount().catch(err=>{
  console.log("api error: ",err)
});

私钥导入账号

importAddress() {
  var importAddress = async () => {
    var newPublicKey = ecc.privateToPublic(privateKey);
    var account = await rpc.history_get_key_accounts(newPublicKey);
    console.log(account.account_names[0]);
  };
  importAddress().catch(err=>{
    console.log('importAddress error: ',err);
  })
},

转账

转账相对要简单很多

注意:转账金额一定要带四位小数

// 转账操作
const transfer = async () => {
  const result = await api.transact({
    actions: [{
      account: 'eosio.token',
      name: 'transfer',
      authorization: [{
        actor: 'bazinga11111',
        permission: 'active',
      }],
      data: {
        from: 'bazinga11111',
        to: 'sniper111111',
        quantity: '1.1234 EOS',
        memo: '',
      },
    }]
  }, {
    blocksBehind: 3,
    expireSeconds: 30,
  });
  console.dir(result);
};

运行以下命令,如果一切正常会打印出查询的结果. (由于结果数据很长,就不贴出查询结果了)

transfer().catch(err=>{
  console.log("transfer error: ",err)
});

那么, 创建账号和成功后, 可以用rpc命令检查一下是否成功:

const accountInfo2 = await rpc.get_account('sniper111111');
console.log(accountInfo2);

以上, 就完成了一套简单的接入EOS测试网的流程, 包括账号的创建, 转账.

相对注意学习一下 async/await 语法

EOS的账号同ETH的结构上有一点细微上的差别,比如网络宽带, CPU 以及 内存.

EOS主网的连接是需要连接的主网的超级节点, 这里跟测试网络有一点区别, 超级节点类似于以太坊里的infura公共节点.

OK, 你可以开始搭建你的EOS测试网络并测试你的代码了. 你可以试试如何从私钥中获得关联账户的信息!

相关文章

  • Node.js+EOS

    这是一篇简单的eos接入指南 首先推荐一个资源,这里几乎涵盖了EOS所有的资源,包括资料,工具,开发等. 需要请自...

网友评论

      本文标题:Node.js+EOS

      本文链接:https://www.haomeiwen.com/subject/zfwpdqtx.html