1、解鎖賬戶發(fā)起交易:使用中心化交易所時,用戶需要解鎖賬戶以發(fā)起交易。
2、錢包文件離線簽名發(fā)起交易:在本地保存錢包文件時,用戶可以使用密碼方式離線簽名來發(fā)起交易,適用于dapp。
本文主要介紹第二種方式,即錢包離線簽名轉(zhuǎn)賬的方法。
交易流程: 1、通過私鑰獲取憑證Credentials; 2、創(chuàng)建交易RawTransaction; 3、使用Credentials對象對交易進(jìn)行簽名; 4、發(fā)起交易。
需要注意以下幾點:
1、Credentials:可以通過獲取私鑰或使用密碼錢包文件keystore來加載Credentials。
2、nonce:發(fā)起交易的賬戶下的交易筆數(shù),nonce從0開始,每個賬戶處理完nonce為0的交易后,再處理nonce為1的交易,以此類推??梢允褂胑th_gettransactioncount獲取nonce的值。
3、gasPrice和gasLimit:交易手續(xù)費由gasPrice和gasLimit決定,實際花費手續(xù)費為gasUsed * gasPrice。這兩個值可以自定義,也可以使用系統(tǒng)參數(shù)獲取當(dāng)前值。
關(guān)于gas,可以參考以太坊GAS詳解的文章。gasPrice和gasLimit會影響轉(zhuǎn)賬的速度,如果gas過低,礦工最后才會打包交易。通常在應(yīng)用程序中會給定一個默認(rèn)值,并允許用戶自己選擇手續(xù)費。
如果不需要自定義,可以通過獲取最新一筆交易的gasPrice來獲取gasLimit,一般轉(zhuǎn)賬設(shè)置為21000就足夠。
Web3j還提供了一種簡單的轉(zhuǎn)賬方式,無需管理nonce、設(shè)置gasPrice和gasLimit,會自動獲取最新一筆交易的gasPrice,gasLimit為21000(一般轉(zhuǎn)賬使用)。
關(guān)于如何判斷交易是否成功,我嘗試了通過區(qū)塊號、區(qū)塊哈希和Receipt日志來判斷,但只有BlockHash是可行的。在web3j中,根據(jù)blocknumber和transactionReceipt都會報空指針異常。
原因是,在發(fā)起一筆交易后,需要通過txHash查詢相關(guān)信息。但一開始時,由于手續(xù)費問題或以太網(wǎng)絡(luò)擁堵,交易可能還未被礦工打包進(jìn)區(qū)塊,因此無法查詢到結(jié)果。通常需要幾十秒甚至更長時間才能獲取到結(jié)果。我的解決方案是輪詢BlockHash,一開始的值為0x00000000000,直到打包成功后才會變?yōu)槠渌怠?p>我使用了rxjava的方式來輪詢刷新,每5秒刷新一次。通常情況下,幾十秒內(nèi)就可以獲取到區(qū)塊信息。
區(qū)塊確認(rèn)數(shù)=當(dāng)前區(qū)塊高度-交易被打包時的區(qū)塊高度。