风险提示:理性看待区块链,提高风险意识!
深入浅出EOSJS:连接到主网、测试网、交易
首页 > 币界资讯 > 区块链知识 2018-11-17 12:05:00

EOSJS是EOSIO区块链的通用库,这里使用eosjs的目的是使用eosjs库中封装的交易的接口,使用及其简单,可在此处查看eosjs开发手册。

一、EOSJS简单用法

安装EOSJS

npm install eosjs
获取当前区块链的信息和查询指定区块的信息。
Eos = require('eosjs')

eos = Eos()

eos.getInfo((error, result) => {
     console.log("info:", error, result)
})

eos.getBlock(10, (error, result) => {
    console.log("block:", error, result)
})
首先启动本地节点网络。
nodeos -e -p eosio --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin --plugin eosio::wallet_api_plugin
通过命令行node index.js运行以上脚本,输出如下
lixu@ubuntu:~/Desktop/demo/eosjsdemo$ node index.js
info: null { server_version: 'a228b1dc',
  chain_id: 'cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f',
  head_block_num: 9259,
  last_irreversible_block_num: 9258,
  last_irreversible_block_id: '0000242a8128c109fb4f04c8b11b78e202e01745cf7949a6ec33e8bd9481a0d7',
  head_block_id: '0000242b9ee3ea0a6b5dfeefdd5603937778c90c3eb022dd16d3ad61a0346d13',
  head_block_time: '2018-09-15T03:32:19.000',
  head_block_producer: 'eosio',
  virtual_block_cpu_limit: 200000000,
  virtual_block_net_limit: 1048576000,
  block_cpu_limit: 199900,
  block_net_limit: 1048576 }

block: null { timestamp: '2018-09-14T07:36:19.000',
  producer: 'eosio',
  confirmed: 0,
  previous: '00000009d0016b6afe0bfee7fd168ca29dcc17fc990d54a8d81b3641136dc49c',
  transaction_mroot: '0000000000000000000000000000000000000000000000000000000000000000',
  action_mroot: 'c8e04cf40af8a6d62e4c7741dae972fe2ac5756fa4ce039959d4769f352c52ef',
  schedule_version: 0,
  new_producers: null,
  header_extensions: [],
  producer_signature: 'SIG_K1_KcXNRs7CTs4de3SdNvuJ4Z7zC2dwqxvpTTZpRfB6Mcndd7QKnkUkgXAyuNNhs6PvRi8NDim5xe7SUhEoP8YzRNJBKEmSrS',
  transactions: [],
  block_extensions: [],
  id: '0000000a8ab5ea5abd8f55b1a29f8a7b5ac1a9ad722ffeb4dfca4f32110f4df2',
  block_num: 10,
  ref_block_prefix: 2975174589 }
lixu@ubuntu:~/Desktop/demo/eosjsdemo$

若chain_id:为’cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f’,则证明连接到了本地网络。

二、连接到测试网络

需要如下配置eos对象连接到指定的网络。修改以上代码eos = Eos()为如下代码。

config = {
    // chainId: "", 
    keyProvider: ["5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"], 
    httpEndpoint: 'http://jungle.cryptolions.io:18888',
}
eos = Eos(config)
  • chainId:通过eos.getInfo方法获取到的chain_id值填写在该字段中,用于连接到不同的网络中的必填字段。
  • keyProvider:用于签名事务的私钥,当前测试案例可随意填写,后续我们再介绍如果填写该字段的值。
  • httpEndpoint:提供nodeos服务的地址。

输出如下

lixu@ubuntu:~/Desktop/demo/eosjsdemo$ node index.js
info: null { server_version: '08819aae',
  chain_id: '038f4b0fc8ff18a4f0842a8f0564611f6e96e8535901dd45e43ac8691a1c4dca',
  head_block_num: 14459108,
  last_irreversible_block_num: 14458782,
  last_irreversible_block_id: '00dc9f9e460a7cf24ec93634323c21955d75475ac7525a878f84ea565ef37c7c',
  head_block_id: '00dca0e4a8eb6a7d858acc85f8f462218462e8c5429f0ad9cdc897f2090c6ad9',
  head_block_time: '2018-09-15T03:37:12.500',
  head_block_producer: 'galapaguin22',
  virtual_block_cpu_limit: 200000000,
  virtual_block_net_limit: 1048576000,
  block_cpu_limit: 199900,
  block_net_limit: 1048576,
  server_version_string: 'v1.2.5-dirty' }

block: null { timestamp: '2018-06-09T00:55:45.500',
  producer: 'eosio',
  confirmed: 0,
  previous: '000000091be3d40e633cef45a18d0b74b87d535d0a57c2fa842d0d461bc08cae',
  transaction_mroot: '0000000000000000000000000000000000000000000000000000000000000000',
  action_mroot: '9d3683cd4eabf72aef6bed9fdf6bb3e50c4a01f39e9ca6848b71898e80151f0c',
  schedule_version: 0,
  new_producers: null,
  header_extensions: [],
  producer_signature: 'SIG_K1_JypxpucZxAjAC6chEzgF2j7JjhYMrh8ZXvVWqTaXZPZR2eefjzuMbNH4NPY6h8G9C77fhYTCekXJG4UZgHphuaGTJrVdcn',
  transactions: [],
  block_extensions: [],
  id: '0000000afd747564aceea23209cbc4dc1cff14e661c4cf5e14188fd080ea8067',
  block_num: 10,
  ref_block_prefix: 849538732 }
lixu@ubuntu:~/Desktop/demo/eosjsdemo$

若chain_id:为’038f4b0fc8ff18a4f0842a8f0564611f6e96e8535901dd45e43ac8691a1c4dca’,则证明连接到了测试网络。

三、获取jungle测试网节点地址

大家可能会有疑问,上面配置中httpEndpoint字段的地址如何获取。

  1. 打开jungle网站地址是http://jungle.cryptolions.io/
  2. 点击API endpoints按钮25729F82-18C1-491A-A58E-4C754FDA0A8A
  3. 随意选择一个地址在API Endpoints列表中展示了多个连接地址,随意选复制一个即可。上面代码示例中则是选择了第一个地址http://jungle.cryptolions.io:18888EC7EA31D-CA19-48EB-9386-C9EEDEE78457

四、连接到主网

只需修改配置信息中的httpEndpoint字段,如下。

config = {
    // chainId: "", 
    keyProvider: ["5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"], 
    httpEndpoint: 'https://node1.zbeos.com',
}
eos = Eos(config)
输出如下
lixu@ubuntu:~/Desktop/demo/eosjsdemo$ node index.js
info: null { server_version: '78708df4',
  chain_id: 'aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906',
  head_block_num: 16481648,
  ......
block: null { timestamp: '2018-06-09T11:56:34.000',
  producer: 'eosio',
  ......

若chain_id:为’aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906′,则证明连接到了主网。

五、获取主网节点地址

  1. 打开eospark网站地址是https://eospark.com。在该网站可查询所有超级节点接入点网址。
  2. 选择超级节点随意选择一个超级节点即可。430DB737-46AC-4418-8F96-8FF30EF6D9ED
  3. 选择接入点地址随意选择一个接入点地址即可。上面代码示例中则是选择了第一个地址https://node1.zbeos.com19D0EEE1-94DF-4F7A-B00D-3AB4789F88B5

六、EOSJS配置

以下的教程在不特别说明的情况下,都是在本地网络上进行的开发。

在前面介绍了简单的配置eos,在开发中我们一般需要如下完整的配置。

let Eos = require('eosjs')
let binaryen = require('binaryen')

config = {
    chainId: "cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f",
    keyProvider: ["5KYU9Xsv3SXY674eXfDiGD5SrQXU6JZeULZsXAtcY1x3huAzrHt"], 
    httpEndpoint: 'http://127.0.0.1:8888',
    binaryen: binaryen,
    expireInSeconds: 60,
    broadcast: true,
    verbose: false, 
    sign: true
}

eos = Eos(config)
  • chainId:16进制数据。要连接的区块链的唯一ID,这是有效交易签名所必需的字段。chainId通过 get_infoAPI调用提供。签署的所有交易仅对具有此chainId的区块链有效。出于安全原因验证chainId。
  • keyProvider:array|string数据。提供用于签名事务的私钥。如果提供了多个私钥,不能确定使用哪个私钥,可以使用调用get_required_keysAPI 获取要使用签名的密钥。
  • keyPrefix:string数据。更改公钥前缀。
  • httpEndpoint:string数据。提供nodeos服务的地址,如本地节点地址:http://127.0.0.1:8888。
  • expireInSeconds:number数据。事务到期前的秒数,时间基于nodeosd的时间。
  • broadcast:boolean值,默认是true。使用true将交易发布到区块链,使用false将获取签名的事务。
  • verbose:boolean值,默认是false。详细日志记录。
  • debug:boolean值,默认是false。低级调试日志记录。
  • sign:boolean值,默认是true。使用私钥签名交易。保留未签名的交易避免了提供私钥的需要。
  • authorization:array|auth数据。替换默认的eosjs的授权,通常在multisig配置中标识签名帐户和权限。授权可以是格式化为account@permission的字符串,如下
    {authorization: 'user@active'}
    
    • 1

    注意:authorization适用于个人操作,不属于Eos(config)

可选项:

可以在EOSJS方法的参数之后提供可选项,如下操作。

options = {
  authorization: 'user@active',
  broadcast: true,
  sign: true
}
eos.transfer('user', 'test', '1.0000 SYS', '', options)

七、创建账号

transaction函数接受标准区块链事务。

下面使用了newaccount去创建账号,新帐户需要抵押一定的代币用于RAM和带宽资源。使用已经存在的user账号去创建新账号user2

代码需求:

  • keyProvider字段中需要填写useractive权限的私钥
  • 必须解锁user账号的active权限的私钥所在的钱包
  • 新账号user2owner权限与active权限的公钥都是使用的局部变量pubkey里的值
  • let Eos = require('eosjs')
    let binaryen = require('binaryen')
    
    config = {
        chainId: "cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f", 
        keyProvider: ["5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"],
        httpEndpoint: 'http://127.0.0.1:8888',
        binaryen: binaryen,
        expireInSeconds: 60,
        broadcast: true,
        verbose: false, 
        sign: true
    }
    
    eos = Eos(config)
    
    async function transaction() {
        pubkey = 'EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV'
    
        let createor = "user"
        let acocunt = "user2"
    
        let data = await eos.transaction(tr => {
            tr.newaccount({
                creator: createor,
                name: acocunt,
                owner: pubkey,
                active: pubkey
            })
    
            tr.buyrambytes({
                payer: createor,
                receiver: acocunt,
                bytes: 8192
            })
    
            tr.delegatebw({
                from: createor,
                receiver: acocunt,
                stake_net_quantity: '10.0000 EOS',
                stake_cpu_quantity: '10.0000 EOS',
                transfer: 0
            })
        })
    
        console.log(JSON.stringify(data))
    }
    
    transaction()
  • 运行后返回的数据为json字符串,经过格式化后数据较多,下面只展示了前面一部分
  • {
        "broadcast": true,
        "transaction": {
            "compression": "none",
            "transaction": {
                "expiration": "2018-09-15T06:55:34",
                "ref_block_num": 10949,
                "ref_block_prefix": 1636345996,
                "max_net_usage_words": 0,
                "max_cpu_usage_ms": 0,
                "delay_sec": 0,
                "context_free_actions": [],
                "actions": [
                    {
                        "account": "eosio",
                        "name": "newaccount",
                        "authorization": [
                            {
                                "actor": "user",
                                "permission": "active"
                            }
                        ],
    ......
  • 运行后即可查询到公钥EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV所关联的账号有user2,如下所示14B473CD-9D2E-49D0-B2B2-7333D08599C8

    八、代币转账

    下面代码是实现user向tserer转账,转的代币是EOS,数额为1。

    代码需求:

    • keyProvider字段中需要填写user的私钥
    • 必须解锁user账号的私钥所在的钱包
    • user必须拥有EOS代币,且余额不小于1
    • Eos = require('eosjs')
      let binaryen = require('binaryen')
      
      config = {
          chainId: "cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f", 
          keyProvider: ["5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"], 
          httpEndpoint: 'http://127.0.0.1:8888',
          binaryen: binaryen,
          expireInSeconds: 60,
          broadcast: true,
          verbose: false,
          sign: true
      }
      
      eos = Eos(config)
      
      async function sendTransaction() {
          options = {
              authorization: 'user@active',
              broadcast: true,
              sign: true
            }
          let data = await eos.transaction(eos => {
              eos.transfer('user', 'tester', '1.0000 EOS', 'lixu', options)
          })
          console.log("data:",data)
      }
      sendTransaction()
    • 在运行转账代码之前,先查询一下user与tester的代币余额,如下924CD145-485A-4CD2-B003-74A4E678AB25运行后返回的数据为json字符串,经过格式化后数据较多,下面只展示了前面一部分
    • {
          "broadcast": true,
          "transaction": {
              "compression": "none",
              "transaction": {
                  "expiration": "2018-09-15T07:28:07",
                  "ref_block_num": 14856,
                  "ref_block_prefix": 3593559935,
                  "max_net_usage_words": 0,
                  "max_cpu_usage_ms": 0,
                  "delay_sec": 0,
                  "context_free_actions": [
      
                  ],
                  "actions": [
                      {
                          "account": "eosio.token",
                          "name": "transfer",
                          "authorization": [
                              {
                                  "actor": "user",
                                  "permission": "active"
                              }
                          ],
      ......
    • 运行后user账号的EOS代币余额会减少1个,由74变成了75;同时tester账号的EOS代币余额会增加1个由25变成了26,如下所示。019CEFDA-89E6-4AC6-AF07-5376E3A6DCF1

      九、总结

      连接指定网络主要是设置httpEndpoint字段的地址,地址可以通过网站获取。连接到网络后注意设置chainId字段。

      根据chainId可以确定连接的网络类型:

      • 本地网络:cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f
      • 测试网络:038f4b0fc8ff18a4f0842a8f0564611f6e96e8535901dd45e43ac8691a1c4dca
      • 主网:aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906

      对象eos操作时所带有的私钥由keyProvider配置,很关键,若填错则无权限操作。

      版权声明:博客中的文章版权归博主所有,未经授权禁止转载,转载请联系作者取得同意并注明出处。
      未经授权禁止转载、改编,转载请注明出处!

上一篇: 技术指南:如何启动Fabric CA
下一篇: 2019年区块链格局大猜想:谁将威胁以太坊的霸主地位?
推荐专栏
web3首席知识博主
一位相信价值投资的币圈KOL。稳定盈利的缠论野生交易员 #BTC行情分析师 #价值投资 #链上数据分析
爱Web 3,爱生活,爱科技,爱炒币的老韭菜
热门币种
更多
币种
价格
24H涨跌幅
BTC比特币
¥264,723.74
37,091.22 USDT
+0.1%
ETH以太坊
¥14,416.22
2,019.90 USDT
-0.12%
USDT泰达币
¥7.20
1.01 USDT
0%
BNB币安币
¥1,625.40
227.74 USDT
+0.36%
XRP瑞波币
¥4.32
0.60460 USDT
+0.37%
USDC
¥7.14
1.00 USDT
+0.03%
SOLSolana
¥398.85
55.89 USDT
+1.54%
OKBOK币
¥398.61
55.85 USDT
-1.64%
ADA艾达币
¥2.68
0.37580 USDT
-1.16%
DOGE狗狗币
¥0.55160
0.07730 USDT
-1.52%
热搜币种
更多
币种
价格
24H涨跌幅
Terra Classic
¥0.00
9.402E-5 USDT
-18.95%
Gala
¥0.18
0.025374 USDT
-4.66%
dYdX
¥22.58
3.1918 USDT
-0.91%
比特股
¥0.05
0.006964 USDT
+4.28%
PancakeSwap
¥15.52
2.1936 USDT
-2.74%
Conflux
¥1.08
0.1524 USDT
-2.87%
Filecoin
¥31.45
4.4454 USDT
-0.69%
FTX Token
¥29.82
4.2155 USDT
+16.96%
Yield Guild Games
¥2.55
0.3608 USDT
-0.52%
Shiba Inu
¥0.00
8.14E-6 USDT
-2.51%
比特币
¥262,381.44
37091.22 USDT
+0.1%
比原链
¥0.07
0.010011 USDT
-4.38%
最新快讯
更多
汇丰、恒生、渣打、富邦华一四家外资银行入围首批“数字人民币”业务试点名单
2023-11-28 19:06:57
摩根大通和Apollo计划建立代币化“企业主网”
2023-11-28 19:03:57
Nansen2公测版本上线,新增链上数据异动、智能搜索等功能
2023-11-28 18:59:52
西班牙公民需在明年3月底前申报其海外平台上加密货币持仓
2023-11-28 18:53:43
Nansen2已公开测试
2023-11-28 18:53:38
dYdX基金会:主网启动以来超过1645万DYDX被质押
2023-11-28 18:52:07
NicCarter等比特币倡导者发文:比特币挖矿是清洁能源和平衡电网的关键工具
2023-11-28 18:47:58
下载币界网APP