深入淺出EOSJS:連線到主網、測試網、交易
EOSJS是EOSIO區塊鏈的通用庫,這裡使用eosjs的目的是使用eosjs庫中封裝的交易的介面,使用及其簡單,可在此處檢視 ofollow,noindex" target="_blank">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) }) 首先啟動本地節點網路。
<code>nodeos -e -p eosio --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin --plugin eosio::wallet_api_plugin</code> 通過命令列<code>node index.js</code>執行以上指令碼,輸出如下
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
欄位的地址如何獲取。
- 開啟jungle網站地址是 http://jungle.cryptolions.io/
- 點選
API endpoints
按鈕 - 隨意選擇一個地址在
API Endpoints
列表中展示了多個連線地址,隨意選複製一個即可。上面程式碼示例中則是選擇了第一個地址http://jungle.cryptolions.io:18888
。
四、連線到主網
只需修改配置資訊中的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',則證明連線到了主網。
五、獲取主網節點地址
- 開啟eospark網站地址是 https://eospark.com。在該網站可查詢所有超級節點接入點網址。
- 選擇超級節點隨意選擇一個超級節點即可。
- 選擇接入點地址隨意選擇一個接入點地址即可。上面程式碼示例中則是選擇了第一個地址
https://node1.zbeos.com
。
六、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_info
API呼叫提供。簽署的所有交易僅對具有此chainId的區塊鏈有效。出於安全原因驗證chainId。 - keyProvider:array|string資料。提供用於簽名事務的私鑰。如果提供了多個私鑰,不能確定使用哪個私鑰,可以使用呼叫
get_required_keys
API 獲取要使用簽名的金鑰。 - 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'}
注意: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
欄位中需要填寫user
的active
許可權的私鑰 - 必須解鎖
user
賬號的active
許可權的私鑰所在的錢包 - 新賬號
user2
的owner
許可權與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
,如下所示八、代幣轉賬
下面程式碼是實現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的代幣餘額,如下
執行後返回的資料為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,如下所示。
九、總結
連線指定網路主要是設定httpEndpoint
欄位的地址,地址可以通過網站獲取。連線到網路後注意設定chainId
欄位。
根據
chainId
可以確定連線的網路型別:- 本地網路:cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f
- 測試網路:038f4b0fc8ff18a4f0842a8f0564611f6e96e8535901dd45e43ac8691a1c4dca
- 主網:aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906
物件eos操作時所帶有的私鑰由keyProvider配置,很關鍵,若填錯則無許可權操作。
版權宣告:部落格中的文章版權歸博主所有,未經授權禁止轉載,轉載請聯絡作者取得同意並註明出處。 未經授權禁止轉載、改編,轉載請註明出處!
-