id:BSN_2021 公众号:BSN 研习社 作者:中移信息
中移(动)信息技术有限公司(以下统称“IT 公司”)与 BSN 在 2021 年 10 月开展合作,由 BSN 搭建 BSN-DDC 基础网络,IT 公司区块链团队自主研发基于 EOS 的中移链 DDC,面向存在 DDC 业务需求的各行业客户提供接入服务,使其可便捷管理 DDC 操作,从而灵活升级产品模式,助力客户业务创新。
一、中移链 eosjs 简述
中移链是基于 EOS 区块链框架改造,满足 BSN 开放联盟链要求,符合国内监管政策。中移链区块链是一个具有行业领先的交易速度和灵活的实用程序的区块链平台,专为企业级用例而设计,并为公共和私有区块链部署而构建。中移链是可定制的,通过基于角色的权限系统和安全的应用程序交易处理来满足跨行业的广泛业务需求。中移链架构引入了一种新的块链架构,旨在实现分布式应用的性能扩展。这是通过创建一个可以构建应用程序的类似操作系统的架构来实现的。中移链的家族成员很多,其中 eosjs 使其家族中最为重要的成员之一。
eosjs
是一个 Javascript 库,其核心是提供了一些 API,能使中移链Nodeos RPC API与基于中移链的区块链集成,这使 js(包括 nodejs、html 中的 js、前端框架里的 js)具有能直接操作区块链的能力。
二、eosjs 的使用。
(一)环境准备
确保安装了较新版本的 Node.js。
(二)安装
通过 yarn 安装 eosjs
通过 npm 安装 eosjs
(三)eosjs 核心描述
eosjs 核心: eosjs 包主要提供 JsonRpc 对象和 Api 对象。
JsonRpc
JsonRpc
是一个无状态且轻量级的远程过程调用(RPC)传送协议。其传递内容如下:1、必需参数:能连接到的节点的字符串形式;2、可选参数:fetch
对象。通过 new 一个 JsonRpc 对象,在构造函数里传两个参数,第一个参数必填,即字符串形式的 URL(节点的 URL 地址);第二个参数非必填,即fetch
对象,一般在 nodejs 里传过去,其他(例如:vue 端)不需要。代码如下:
const rpc = new JsonRpc('http://172.0.0.1:8888', { fetch });
复制代码
api
在区块链上发送交易和触发操作,必须有一个Api
实例,该实例在其构造函数中接收 SignatureProvider 对象。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/eosjs.git 。在 cmd 管理器里依次执行下列代码:(1)从远程仓库拉取代码。
git clone https://github.com/EOSIO/eosjs.git
复制代码
(2)进入到 eosjs 文件夹下。
(3)加载依赖包。
(4)运行导出压缩过的 eosjs。
或
这将创建dist-web
文件夹和 Web 分发模块。确保externals.min.js
包含 eosjs 使用的外部包。(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,页面上会打印出交易后返回的结果的序列化。在dist-web
文件夹和 Web 分发模块创建后,在 eos 的文件夹下新建一个 html,再将上面两部分的代码复制进去,通过浏览器打开即可看到运行结果。
3、在 vue 项目中使用eosjs
:通过ES 模块语法导入。
具体代码如下:
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 的版本问题:因为是通过 react 的脚手架创建项目,默认使用的 react-scripts 是最新版本,在交易的时候会报 buffer 错误,这就需要将 "react-scripts"的版本更改为"react-scripts": "4.0.3"。
评论