【劉傑良】使用RPC接口新建EOS賬戶 - 實戰

適用於最新的 EOS Dawn 4.0/4.1

前言

最近在研究 EOS 的 RPC API,但是由於官方API文檔的不夠詳盡,新建賬號(new account)這一個操作就折騰了一個多星期。皇天不負有心人,終於調通了新建賬號,代幣轉賬也輕鬆解決。特地寫這篇文章(適用於 EOS dawn 4.0 和 4.1),幫助準備使用 EOS RPC 做 Dapp 開發的朋友,如有問題,歡迎批評指正。

少廢話,先看東西

1、POST http://127.0.0.1:8888/v1/chain/abi_json_to_bin (序列化新建賬號的 json)

{
 "code": "eosio",
 "action": "newaccount",
 "args": {
   "creator": "bitcoin",
   "name": "eason",
   "owner": {
     "threshold": 1,
     "keys": [
       {
         "key": "EOS4ufZoTw95yHJS6Cyz3h4w5a2W4cyYpMYRnd7gbFZuCfPxUFS6r", //owner public key
         "weight": 1
       }
     ],
     "accounts": [],
     "waits": []
   },
   "active": {
     "threshold": 1,
     "keys": [
       {
         "key": "EOS4ufZoTw95yHJS6Cyz3h4w5a2W4cyYpMYRnd7gbFZuCfPxUFS6r", //active public key
         "weight": 1
       }
     ],
     "accounts": [],
     "waits": []
   }
 }
}

2、POST http://127.0.0.1:8888/v1/wallet/sign_transaction(簽名新建賬號的交易)

[
 {
   "ref_block_num": 363759,
   "ref_block_prefix": 4033496171,
   "expiration": "2018-05-17T09:54:06.500",
   "actions": [
     {
       "account": "eosio",
       "name": "newaccount",
       "authorization": [
         {
           "actor": "bitcoin",
           "permission": "active"
         }
       ],
       "data": "000000603a8ab23b000000ca3d364dfb0100000001000202aba1b7d9fc5de9dd93308dc5ebedcb066c8e5b36970bfd82ae715d9e8c3060010000000100000001000202aba1b7d9fc5de9dd93308dc5ebedcb066c8e5b36970bfd82ae715d9e8c306001000000"
     }
   ],
   "signatures": []
 },
 [
   "EOS5wQ4HaFFDxyfc23dZNXUTGBHepM1vXGfr1vkfWHfRfvAMXP7VV"
 ],
 ""
]

3、http://127.0.0.1:8888/v1/chain/push_transaction (把簽名後的交易push 推送到 EOS 系統中,即新建賬號完成)

{
 "compression": "none",
 "transaction": {
   "expiration": "2018-05-17T09:54:06.500",
   "ref_block_num": 363759,
   "ref_block_prefix": 4033496171,
   "actions": [
     {
       "account": "eosio",
       "name": "newaccount",
       "authorization": [
         {
           "actor": "bitcoin",
           "permission": "active"
         }
       ],
       "data": "000000603a8ab23b000000ca3d364dfb0100000001000202aba1b7d9fc5de9dd93308dc5ebedcb066c8e5b36970bfd82ae715d9e8c3060010000000100000001000202aba1b7d9fc5de9dd93308dc5ebedcb066c8e5b36970bfd82ae715d9e8c306001000000"
     }
   ]
 },
 "signatures": ["SIG_K1_KY58QhP4jWLJWr7cVkahgL3JAjC8QMK5jnHurFUmn8xU71v6Mh4DmgjY75DxmWE6Je457N6MRM7GapxU43hywnAWKEmC1W"]
}

(代幣轉賬 和 新建賬號的 sign_transaction、push_transaction 類似,主要就是 智能合約的不同 和 調用的action 的不同 以及 action 中具體的參數不同。)

新建賬號(newaccount)需要用 「已有的賬號」 創建「 新賬號」

內部是 已有賬號 調用系統智能合約eosio中的 newaccount 的 action

新建賬號的交易需要用 創建者  私鑰簽名交易(sign_transaction),然後 推送簽名後的交易 (push_transaction)到區塊鏈中。

a. sign_transaction 圖示

【圖1】

b. push_transaction 圖示

【圖2】

具體接口

1、POST http://127.0.0.1:8888/v1/chain/abi_json_to_bin (序列化新建賬號的 json)

請求參數

參數名稱參數類型描述
codestring系統智能合約,默認填寫“eosio”
actionstring智能合約中的action,默認填寫“newaccount”
creatorstring創建者
namestring新建賬號名
keystring新建賬號的公鑰

請求示例

{
 "code": "eosio",
 "action": "newaccount",
 "args": {
   "creator": "bitcoin",
   "name": "eason",
   "owner": {
     "threshold": 1,
     "keys": [
       {
         "key": "EOS4ufZoTw95yHJS6Cyz3h4w5a2W4cyYpMYRnd7gbFZuCfPxUFS6r", //owner public key
         "weight": 1
       }
     ],
     "accounts": [],  
     "waits": []      
   },
   "active": {
     "threshold": 1,
     "keys": [
       {
         "key": "EOS4ufZoTw95yHJS6Cyz3h4w5a2W4cyYpMYRnd7gbFZuCfPxUFS6r", //active public key
         "weight": 1
       }
     ],
     "accounts": [],    
     "waits": []        
   }
 }
}

響應參數

參數名稱參數類型描述
binargsstring序列化的結果,在sign_transaction 和 push_transaction 中作爲 data 請求參數

響應示例

{
   "binargs": "000000603a8ab23b000000ca3d364dfb0100000001000202aba1b7d9fc5de9dd93308dc5ebedcb066c8e5b36970bfd82ae715d9e8c3060010000000100000001000202aba1b7d9fc5de9dd93308dc5ebedcb066c8e5b36970bfd82ae715d9e8c306001000000"
}

2、GET http://127.0.0.1:8888/v1/chain/get_info (獲取 EOS 區塊鏈的最新區塊號)

響應參數

參數名稱參數類型描述
head_block_numnumber最新區塊號

響應示例

{
   "server_version": "13952d45",
   "head_block_num": 359934,
   "last_irreversible_block_num": 359934,
   "last_irreversible_block_id": "a69af2c4aa56b5c4bd1cdf9c2acb1a7796bbc3043954e36da182a144ddcf58fb",
   "head_block_id": "a69af2c4aa56b5c4bd1cdf9c2acb1a7796bbc3043954e36da182a144ddcf58fb",
   "head_block_time": "2018-05-17T09:02:12",
   "head_block_producer": "eosio",
   "virtual_block_cpu_limit": 100000000,
   "virtual_block_net_limit": 1048576000,
   "block_cpu_limit": 99900,
   "block_net_limit": 1048576
}

3、POST http://127.0.0.1:8888/v1/chain/get_block (獲取最新區塊的具體信息)

請求參數

參數名稱參數類型描述
block_num_or_idnumber最新區塊號,上一個響應結果中的 head_block_num
{
 "block_num_or_id":359934
}

響應參數

參數名稱參數類型描述
timestampstring最新區塊的生成時間
block_numnumber區塊號,作爲sign_transaction 和 push_transaction中的 ref_block_num請求參數
ref_block_prefixnumber作爲sign_transaction 和 push_transaction中的ref_block_prefix 請求參數

響應示例

{
   "timestamp": "2018-05-17T09:02:12.500",
   "producer": "eosio",
   "confirmed": 0,
   "previous": "00057dfd5044aba0d750eff1fbb84ac92cbf29db1354968816fd2a9aefb0a0b4",
   "transaction_mroot": "0000000000000000000000000000000000000000000000000000000000000000",
   "action_mroot": "dee87e5d025383574ac12c310faf6b759fba52bd19977399b7ebf6ccdd81c7fa",
   "schedule_version": 0,
   "header_extensions": [],
   "producer_signature": "SIG_K1_KVX3RRTS4ch9m6bWDctsAhDWtFydTrg3mW7PaqCXnBZZWezBW23enggeW4ijuWBHBVsDoxzjMvspoFtPsU5nmau4ZYomZo",
   "transactions": [],
   "block_extensions": [],
   "id": "a69af2c4aa56b5c4bd1cdf9c2acb1a7796bbc3043954e36da182a144ddcf58fb",
   "block_num": 359934,
   "ref_block_prefix": 1943477914
}

4、POST http://127.0.0.1:8888/v1/wallet/unlock (解鎖錢包,簽名交易前,需要解鎖賬號所在的錢包)

請求參數

參數名稱參數類型描述

string錢包名稱

string錢包密碼

請求示例

["liu","PW5KjWHnhL5kSRxpWyHQj321dFsZN62HAbZjVSqnDvzKMuEKBZ1T9"]

響應示例

{}  //成功解鎖錢包,返回{}

5、POST http://127.0.0.1:8888/v1/wallet/sign_transaction(簽名新建賬號的交易)

請求的參數

參數名稱參數類型描述
ref_block_numnumber上面獲得的最新區塊號
ref_block_prefixnumber上面獲得的最新區塊號相關信息
expirationstring過期時間 = timestamp 加上 一段時間 ,例如1分鐘
accountstring調用系統智能合約賬號名,默認爲 eosio
namestring新建賬號的action,默認爲 newaccount
actorstring創建者 賬戶名
datastringabi_json_to_bin 序列化後的 值 binargs

string創建者的 公鑰

請求示例

[
 {
   "ref_block_num": 363759,
   "ref_block_prefix": 4033496171,
   "expiration": "2018-05-17T09:54:06.500",
   "actions": [
     {
       "account": "eosio",  //有 newaccount 的 action 的智能合約賬號
       "name": "newaccount",
       "authorization": [
         {
           "actor": "bitcoin",
           "permission": "active"
         }
       ],
       "data": "000000603a8ab23b000000ca3d364dfb0100000001000202aba1b7d9fc5de9dd93308dc5ebedcb066c8e5b36970bfd82ae715d9e8c3060010000000100000001000202aba1b7d9fc5de9dd93308dc5ebedcb066c8e5b36970bfd82ae715d9e8c306001000000" // //abi_json_to_bin 的響應參數 binargs
     }
   ],
   "signatures": []
 },
 [
   "EOS5wQ4HaFFDxyfc23dZNXUTGBHepM1vXGfr1vkfWHfRfvAMXP7VV" //創建者的公鑰(交易發起者的公鑰),其實是用的公鑰對應的私鑰進行簽名的,簽名前需要先解鎖包含此私鑰的錢包
 ],
 ""
]

響應參數

參數名稱參數類型描述
signaturesstring新建賬號的交易 的簽名結果,最後 push_transaction 中使用

響應示例

{
   "expiration": "2018-05-17T09:54:06",
   "ref_block_num": 36079,
   "ref_block_prefix": 4033496171,
   "max_net_usage_words": 0,
   "max_cpu_usage_ms": 0,
   "delay_sec": 0,
   "context_free_actions": [],
   "actions": [
       {
           "account": "eosio",
           "name": "newaccount",
           "authorization": [
               {
                   "actor": "bitcoin",
                   "permission": "active"
               }
           ],
           "data": "000000603a8ab23b000000ca3d364dfb0100000001000202aba1b7d9fc5de9dd93308dc5ebedcb066c8e5b36970bfd82ae715d9e8c3060010000000100000001000202aba1b7d9fc5de9dd93308dc5ebedcb066c8e5b36970bfd82ae715d9e8c306001000000"
       }
   ],
   "transaction_extensions": [],
   "signatures": [
   "SIG_K1_KY58QhP4jWLJWr7cVkahgL3JAjC8QMK5jnHurFUmn8xU71v6Mh4DmgjY75DxmWE6Je457N6MRM7GapxU43hywnAWKEmC1W"   // 簽名 用在 push_transaction 中
   ],
   "context_free_data": []
}

6、http://127.0.0.1:8888/v1/chain/push_transaction (把簽名後的交易push 推送到 EOS 系統中,即新建賬號完成)

請求參數

參數名稱參數類型描述
compressionstring默認 none
datastringabi_json_to_bin 序列化後的 值 binargs
signaturesstring交易簽名後的結果

請求示例

{
 "compression": "none",
 "transaction": {
   "expiration": "2018-05-17T09:54:06.500",
   "ref_block_num": 363759,
   "ref_block_prefix": 4033496171,
   "actions": [
     {
       "account": "eosio",
       "name": "newaccount",
       "authorization": [
         {
           "actor": "bitcoin",
           "permission": "active"
         }
       ],
       "data": "000000603a8ab23b000000ca3d364dfb0100000001000202aba1b7d9fc5de9dd93308dc5ebedcb066c8e5b36970bfd82ae715d9e8c3060010000000100000001000202aba1b7d9fc5de9dd93308dc5ebedcb066c8e5b36970bfd82ae715d9e8c306001000000"    //abi_json_to_bin 的響應參數 binargs
     }
   ]
 },
 "signatures": ["SIG_K1_KY58QhP4jWLJWr7cVkahgL3JAjC8QMK5jnHurFUmn8xU71v6Mh4DmgjY75DxmWE6Je457N6MRM7GapxU43hywnAWKEmC1W"]
}

響應示例

{
   "transaction_id": "2047702bfdc4678aabe123f335b4b5f604203edf7b4de8e42fa2c9211d4de075",
   "processed": {
       "id": "2047702bfdc4678aabe123f335b4b5f604203edf7b4de8e42fa2c9211d4de075",
       "receipt": {
           "status": "executed",
           "cpu_usage_us": 390,
           "net_usage_words": 25
       },
       "elapsed": 390,
       "net_usage": 200,
       "scheduled": false,
       "action_traces": [
           {
               "receipt": {
                   "receiver": "eosio",
                   "act_digest": "ae18e275184e7defe81be175711cd24206990518963f857715e98755f713957c",
                   "global_sequence": 365444,
                   "recv_sequence": 365419,
                   "auth_sequence": [
                       [
                           "bitcoin",
                           27
                       ]
                   ]
               },
               "act": {
                   "account": "eosio",
                   "name": "newaccount",
                   "authorization": [
                       {
                           "actor": "bitcoin",
                           "permission": "active"
                       }
                   ],
                   "data": {
                       "creator": "bitcoin",
                       "name": "zhangjie",
                       "owner": {
                           "threshold": 1,
                           "keys": [
                               {
                                   "key": "EOS4ufZoTw95yHJS6Cyz3h4w5a2W4cyYpMYRnd7gbFZuCfPxUFS6r",
                                   "weight": 1
                               }
                           ],
                           "accounts": [],
                           "waits": []
                       },
                       "active": {
                           "threshold": 1,
                           "keys": [
                               {
                                   "key": "EOS4ufZoTw95yHJS6Cyz3h4w5a2W4cyYpMYRnd7gbFZuCfPxUFS6r",
                                   "weight": 1
                               }
                           ],
                           "accounts": [],
                           "waits": []
                       }
                   },
                   "hex_data": "000000603a8ab23b000000ca3d364dfb0100000001000202aba1b7d9fc5de9dd93308dc5ebedcb066c8e5b36970bfd82ae715d9e8c3060010000000100000001000202aba1b7d9fc5de9dd93308dc5ebedcb066c8e5b36970bfd82ae715d9e8c306001000000"
               },
               "elapsed": 163,
               "cpu_usage": 0,
               "console": "",
               "total_cpu_usage": 0,
               "trx_id": "2047702bfdc4678aabe123f335b4b5f604203edf7b4de8e42fa2c9211d4de075",
               "inline_traces": []
           }
       ],
       "except": null
   }
}




圓方圓學院博客中文章全部都是圓方圓的講師或者朋友們的文章,全部得到過授權。都是經過圓方圓審覈過的,優秀的文章。

圓方圓學院彙集大批區塊鏈名師,打造精品的區塊鏈技術課程。 
許曉笛老師的51CTO學院視頻專欄 http://edu.51cto.com/lecturer/13766370.html

郭金宏老師的51CTO學院視頻專欄:  http://edu.51cto.com/lecturer/4968230.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章