共计 4985 个字符,预计需要花费 13 分钟才能阅读完成。
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”。