这是一篇简单的eos接入指南
首先推荐一个资源,这里几乎涵盖了EOS所有的资源,包括资料,工具,开发等. 需要请自行查看.
我看的比较多的是下面这个eos开发指南.
技术接入
下面我会用简单的例子, 介绍NODE.JS如何接入EOS测试网 (由于主网账号需要真金白银,就没进行测试了)
JUNGLE TESTNET
你可以通过这个网站进行测试账号以及测试币的申请.
- 环境准备
node v11.3.0
npm 6.4.1
需要用到的关联模块
npm install eosjs@beta node-fetch text-encoding eosjs-ecc
- 开始开发
模块调用
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测试网络并测试你的代码了. 你可以试试如何从私钥中获得关联账户的信息!
网友评论