likes
comments
collection

中移链EOSJS实战使用

作者站长头像
站长
· 阅读数 0

id:BSN_2021 公众号:BSN 研习社 作者:中移信息

中移(动)信息技术有限公司(以下统称“IT公司”)与BSN在2021年10月开展合作,由BSN搭建BSN-DDC基础网络,IT公司区块链团队自主研发基于EOS的中移链DDC,面向存在DDC业务需求的各行业客户提供接入服务,使其可便捷管理DDC操作,从而灵活升级产品模式,助力客户业务创新。

一、中移链eosjs简述

中移链是基于EOS区块链框架改造,满足BSN开放联盟链要求,符合国内监管政策。中移链区块链是一个具有行业领先的交易速度和灵活的实用程序的区块链平台,专为企业级用例而设计,并为公共和私有区块链部署而构建。<br/>中移链是可定制的,通过基于角色的权限系统和安全的应用程序交易处理来满足跨行业的广泛业务需求。<br/>中移链架构引入了一种新的块链架构,旨在实现分布式应用的性能扩展。这是通过创建一个可以构建应用程序的类似操作系统的架构来实现的。中移链的家族成员很多,其中eosjs使其家族中最为重要的成员之一。<br/>

eosjs是一个 Javascript 库,其核心是提供了一些 API,能使中移链Nodeos RPC API与基于中移链的区块链集成,这使js(包括nodejs、html中的js、前端框架里的js)具有能直接操作区块链的能力。<br/>

二、eosjs的使用。

(一)环境准备

确保安装了较新版本的 Node.js

(二)安装

通过yarn安装eosjs

yarn add eosjs

通过npm安装eosjs

npm install eosjs

(三)eosjs核心描述

eosjs核心: eosjs包主要提供JsonRpc对象和Api对象。

JsonRpc

JsonRpc是一个无状态且轻量级的远程过程调用(RPC)传送协议。其传递内容如下:<br/> 1、必需参数:能连接到的节点的字符串形式; 2、可选参数:fetch对象。<br/> 通过new一个JsonRpc对象,在构造函数里传两个参数,第一个参数必填,即字符串形式的URL(节点的URL地址);第二个参数非必填,即fetch对象,一般在nodejs里传过去,其他(例如:vue端)不需要。代码如下:

const rpc = new JsonRpc('http://172.0.0.1:8888', { fetch });

api

在区块链上发送交易和触发操作,必须有一个Api实例,该实例在其构造函数中接收 SignatureProvider 对象。<br/>SignatureProvider 对象必须包含与正在执行操作的参与者和权限要求相对应的私钥。获取到一个api的完整代码如下:

const defaultPrivateKey = "5JWuxonweDjwWFuXRwt4sqj5YriEc8ehZh6EKszYYcf3Puh6gAa"; // bob
const signatureProvider = new JsSignatureProvider([defaultPrivateKey]);
const rpc = new JsonRpc('http://172.0.0.1:8888', { fetch });
const api = new Api({ rpc, signatureProvider, textDecoder: new TextDecoder(), textEncoder: new TextEncoder() });

SignatureProviders 通过dist/eosjs-api-interfaces.SignatureProvider接口实现。如下所示:

const { JsSignatureProvider } = require('eosjs/dist/eosjs-jssig');

该方法是开发者为签名提供者提供的一个简单选项,主要是作为示例,鉴于安全性考量,建议仅在开发中使用。

在生产代码中,建议使用安全保险库(即eosjs-api-interfaces.SignatureProvider接口),确保签署交易时的安全性,官方推荐的库: Ledger Signature Provider**

(四)基本用法

1、在nodejs中使用eosjs:通过commonjs 语法导入。

关键代码如下:

const { Api, JsonRpc } = require('eosjs');//引入eosjs里两个核心对象
const { JsSignatureProvider } = require('eosjs/dist/eosjs-jssig');      // 签名提供者,只能在开发环境中使用
const fetch = require('node-fetch');  // node only; not needed in browsers,只有nodejs中需要,浏览器中不需要。node-fetch版本需要用到2.6.6版
const { TextEncoder, TextDecoder } = require('util'); //转码器

const defaultPrivateKey = "5JWuxonweDjwWFuXRwt4sqj5YriEc8ehZh6EKszYYcf3Puh6gAa"; //操作链的私钥
const signatureProvider = new JsSignatureProvider([defaultPrivateKey]);//对私钥签名
const rpc = new JsonRpc('http://172.0.0.1:8888', { fetch }); // http://172.0.0.1:8888为链的地址
const api = new Api({ rpc, signatureProvider, textDecoder: new TextDecoder(), textEncoder: new TextEncoder() }); //实例化api,通过api就可以直接操作链了
    //下面自执行函数是一个交易操作
      (async () => {
        const result = await api.transact({
          actions: [{
            account: 'eosio.token',
            name: 'transfer',
            authorization: [{
              actor: 'eosio',
              permission: 'active',
            }],
            data: {
              from: 'eosio',
              to: 'user2',
              quantity: '0.0001 SYS',
              memo: 'test',
            },
          }]
        }, {
          blocksBehind: 3,
          expireSeconds: 30,
        });
        console.dir(result);
      })();

2、在浏览器中使用eosjs

首先将eosjs从官方仓库拉取下来,仓库地址为:https://github.com/EOSIO/eosj... 。<br/> 在cmd管理器里依次执行下列代码:<br/> (1)从远程仓库拉取代码。

git clone https://github.com/EOSIO/eosjs.git 

(2)进入到eosjs文件夹下。

cd ./eosjs 

(3)加载依赖包。

npm install

(4)运行导出压缩过的eosjs。

npm run build-web

yarn build-web

这将创建dist-web文件夹和 Web 分发模块。确保externals.min.js包含 eosjs 使用的外部包。<br/> (5)在目标html里使用<script>标签进行引入dist-web文件夹里的文件。代码如下:

<pre style="width: 100%; height: 100%; margin:0px; "></pre>

<script src='dist-web/externals.min.js'></script>
<script src='dist-web/eosjs-api.min.js'></script>
<script src='dist-web/eosjs-jsonrpc.min.js'></script>
<script src='dist-web/eosjs-jssig.min.js'></script>

引入之后再到script标签里添加如下代码:

<script>
  let pre = document.getElementsByTagName('pre')[0];
  const privateKey = '5JWuxonweDjwWFuXRwt4sqj5YriEc8ehZh6EKszYYcf3Puh6gAa';
  const rpc = new eosjs_jsonrpc.JsonRpc('http://172.0.0.1:8888');
  const signatureProvider = new eosjs_jssig.JsSignatureProvider([privateKey]);
  const api = new eosjs_api.Api({ rpc, signatureProvider });
  (async () => {
        const result = await api.transact({
          actions: [{
            account: 'eosio.token',
            name: 'transfer',
            authorization: [{
              actor: 'eosio',
              permission: 'active',
            }],
            data: {
              from: 'eosio',
              to: 'user2',
              quantity: '0.0001 SYS',
              memo: 'test',
            },
          }]
        }, {
          blocksBehind: 3,
          expireSeconds: 30,
        });
        console.dir(result);
     pre.textContent += '\n\nTransaction pushed!\n\n' + JSON.stringify(result, null, 2)

      })();
</script>

在浏览器中点击html,成功后将运行 pre.textContent,页面上会打印出交易后返回的结果的序列化。<br/>在dist-web文件夹和 Web 分发模块创建后,在eos的文件夹下新建一个html,再将上面两部分的代码复制进去,通过浏览器打开即可看到运行结果。

3、在vue项目中使用eosjs:通过ES 模块语法导入。<br/>

具体代码如下:<br/>

import { Api, JsonRpc } from 'eosjs';
import { JsSignatureProvider } from 'eosjs/dist/eosjs-jssig'; 
//可以把下面代码封装成一个方法在created周期函数中直接调用,或者直接扔created周期函数中也行。
const defaultPrivateKey = "5JWuxonweDjwWFuXRwt4sqj5YriEc8ehZh6EKszYYcf3Puh6gAa"; 
const signatureProvider = new JsSignatureProvider([defaultPrivateKey]);
const rpc = new JsonRpc('http://172.0.0.1:8888');
const api = new Api({ rpc, signatureProvider });
(async () => {
        const result = await api.transact({
          actions: [{
            account: 'eosio.token',
            name: 'transfer',
            authorization: [{
              actor: 'eosio',
              permission: 'active',
            }],
            data: {
              from: 'eosio',
              to: 'user2',
              quantity: '0.0001 SYS',
              memo: 'test',
            },
          }]
        }, {
          blocksBehind: 3,
          expireSeconds: 30,
        });
        console.dir(result);

      })();

4、在react项目中使用eosjs:通过ES 模块语法导入。

在react项目中使用eosjs,代码与在vue项目是相同的,需要注意的一点是react-script的版本问题:<br/>因为是通过react的脚手架创建项目,默认使用的react-scripts是最新版本,在交易的时候会报buffer错误,这就需要将 "react-scripts"的版本更改为"react-scripts": "4.0.3"。