搭建完節點,順利啓動了節點並同步了區塊數據。使用 ./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