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"; // bobconst 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"。