BTMの節點RPC遠程調試

搭建完節點,順利啓動了節點並同步了區塊數據。使用 ./bytomcli 命令可以成功獲取數據,使用 curl -X POST get-block-count調用rpc,結果提示說get-block-count未找到命令,於是順手加上端口號, curl -X POST localhost:9888/get-block-count,成功的獲取到了json格式的數據。

​ 習慣了使用Postman調試接口,於是嘗試POST一個rpc請求,開始踩坑之旅哈哈。

遠程調用RPC需要帶上token方可請求,否則就出現BTM860的錯誤提示,如何獲取token並設置呢?

在節點服務器本地使用cli或者curl,生成access-token。

bytomcli 方式:

./bytomcli create-access-token test

或者

curl -X POST create-access-token -d '{"id":"test"}'

返回 json 數據

{
  "created_at": "2018-05-18T16:00:25.284677605+08:00",
  "id": "test",
  "token": "test:fe50927ddaa5bcca77021e9f50fa5ef236a6140c012d1fe2eb9241f61a9228e4"
}

其中 test是遠程訪問的username,冒號後面的字符串是password

Postman如何帶上Auth呢?

設置Authorization爲Basic Auth,Username填剛纔生成的sccess-test的id,Password填token冒號後面的字符串即可

​ 使用普通的表單提交,比如獲取新地址的方法create-account-receiver ,在表單的key填account_alias ,value填賬戶的別名,提交請求發現返回錯誤信息,code爲BTM003。需要將Body切到raw格式,輸入json格式的參數即可,如:{“account_alias”:”test”}

Java中直接通過POST請求就可以遠程調用RPC,但需要構造Authorization並加入到Header中,關鍵代碼如下

String auth = Username + ":" + Password;
byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(Charset.forName("US-ASCII")));
String authHeader = "Basic " + new String(encodedAuth);
Map<String, String> header = new LinkedHashMap<String, String>();
header.put("Authorization", authHeader);

【這裏的Username即是 test,Password是fe50927xxxxxxxxxxxxx228e4,根據自己生成的token改】

body使用JSONObject即可。

關於轉賬的流程,比較複雜。需要先打包交易,對交易進行簽名,再進行廣播。對應的rpc是:

build-transaction -> sign-transaction -> submit-transaction

build-transaction時帶的參數根據api即可,主要是actions可能有點不清楚怎麼用,比如通過地址轉賬時,可以設置actions如下:

“actions”:[

{

"account_id":"xxxx",   // 賬戶ID 

"amount":300000000,  //轉賬額度,需要包含手續費
"asset_id":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",  //資產ID,BTM是全F,可以轉合約上的其它資產
"type":"spend_account"  //表示花費的賬號即轉賬方

},

{
	"account_id":"xxxxx",  //接收方賬戶ID
	"amount":200000000, //轉賬額度
	"asset_id":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
	"type":"control_address",  //類型表示是地址轉賬
	"address":"sm1q9s703yayrvn8g3zq80um65ul9ffg6pvx8cgpme"  //接收地址
}

]

轉賬主要是在手續費方面會踩坑,1BTM=10,000,000NEU,個人感覺NEU就是類似比特幣中的一聰吧哈哈,就是小數點後八位。所以上面的amount是以NEU算的,其實就是轉了2個BTM,拿1個BTM當作手續費,故轉賬賬戶需要出3個BTM。

打包完交易,就需要進行簽名, 用創建賬戶時的密碼進行簽名。即是調用 sign-transaction 的rpc,參數是password和transaction,其中transaction是build成功後返回的data中的一個對象Object。簽名後返回結果,可以根據 sign_complete 判斷是否簽名成功,如果爲true即成功。

廣播交易,submit-transaction 只有一個參數raw_transaction,打包完或者簽名完都會有返回該參數,是一串很長的序列化後的字符串。如果廣播成功,即返回tx_id,失敗會返回失敗信息。

這兩天對btm的rpc調用研究收穫了不少,還搭建了個solonet節點自己挖礦測試轉賬,感謝比原技術羣的大牛提供不少的幫助。我會繼續努力的踩坑~嘻嘻

​ good-boy~zhangxuewen.

​ 2018-05-18

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