web3jseth轉賬
A. 【ETH錢包開發03】web3j轉賬ETH
在之前的文章中,講解了創建、導出、導入錢包。
【ETH錢包開發01】創建、導出錢包
【ETH錢包開發02】導入錢包
本文主要講解以太坊轉賬相關的一些知識。交易分為ETH轉賬和ERC-20 Token轉賬,本篇先講一下ETH轉賬。
1、解鎖賬戶發起交易。錢包keyStore文件保存在geth節點上,用戶發起交易需要解鎖賬戶,適用於中心化的交易所。
2、錢包文件離線簽名發起交易。錢包keyStore文件保存在本地,用戶使用密碼+keystore的方式做離線交易簽名來發起交易,適用於dapp,比如錢包。
本文主要講一下第二種方式,也就是錢包離線簽名轉賬的方式。
交易流程
1、通過keystore載入轉賬所需的憑證Credentials
2、創建一筆交易RawTransaction
3、使用Credentials對象對交易簽名
4、發起交易
注意以下幾點:
1、Credentials
這里,我是通過獲取私鑰的方式來載入 Credentials
還有另外一種方式,通過密碼+錢包文件keystore方式來載入 Credentials
2、nonce
nonce是指發起交易的賬戶下的交易筆數,每一個賬戶nonce都是從0開始,當nonce為0的交易處理完之後,才會處理nonce為1的交易,並依次加1的交易才會被處理。
可以通過 eth_gettransactioncount 獲取nonce
3、gasPrice和gasLimit
交易手續費由gasPrice 和gasLimit來決定,實際花費的交易手續費是 gasUsed * gasPrice 。所有這兩個值你可以自定義,也可以使用系統參數獲取當前兩個值
關於 gas ,你可以參考我之前的一篇文章。
以太坊(ETH)GAS詳解
gasPrice和gasLimit影響的是轉賬的速度,如果gas過低,礦工會最後才打包你的交易。在app中,通常給定一個默認值,並且允許用戶自己選擇手續費。
如果不需要自定義的話,還有一種方式來獲取。獲取以太坊網路最新一筆交易的 gasPrice ,轉賬的話, gasLimit 一般設置為21000就可以了。
Web3j還提供另外一種簡單的方式來轉賬以太幣,這種方式的好處是不需要管理nonce,不需要設置gasPrice和gasLimit,會自動獲取最新一筆交易的gasPrice,gasLimit 為21000(轉賬一般設置成這個值就夠用了)。
這個問題,我想是很多朋友所關心的吧。但是到目前為止,我還沒有看到有講解這方面的博客。
之前問過一些朋友,他們說可以通過區塊號、區塊哈希來判斷,也可以通過Receipt日誌來判斷。但是經過我的一番嘗試,只有 BlockHash 是可行的,在web3j中根據 blocknumber 和 transactionReceipt 都會報空指針異常。
原因大致是這樣的:在發起一筆交易之後,會返回 txHash ,然後我們可以根據這個 txHash 去查詢這筆交易相關的信息。但是剛發起交易的時候,由於手續費問題或者乙太網絡擁堵問題,會導致你的這筆交易還沒有被礦工打包進區塊,因此一開始是查不到的,通常需要幾十秒甚至更長的時間才能獲取到結果。我目前的解決方案是輪詢的去刷 BlockHash ,一開始的時候 BlockHash 的值為0x00000000000,等到打包成功的時候就不再是0了。
這里我使用的是rxjava的方式去輪詢刷的,5s刷新一次。
正常情況下,幾十秒內就可以獲取到區塊信息了。
區塊確認數=當前區塊高度-交易被打包時的區塊高度。
B. ETH轉賬的2種方式的對比
web3j支持使用以太坊錢包文件(推薦)和乙太網客戶端管理命令來發起一筆交易。當你創建了一個擁有以太幣的賬戶後,你可以通過以下兩種交易機制,和以太坊網路(私網/公網)交易:
這里主要講一下 線下簽名交易(Offline transaction signing) 。線下簽名交易允許你使用web3j提供的錢包賬戶發起交易,你完全控制自己的私鑰,交易發送到網路上的其它節點並廣播。
線下簽名交易使用 RawTransaction 對象來完成,一共有如下幾步:
1、通過私鑰或密碼+錢包文件(keystore)來載入轉賬憑證Credentials
2、獲取發起轉賬賬戶的nonce 值,也就是第幾筆交易
3、創建 RawTransaction交易 對象
4、簽名 RawTransaction 對象,也就是對交易做簽名
5、發送交易( RawTransaction 對象)給節點處理。
6、獲取交易哈希值TxHash
以太坊實戰-再談nonce使用陷阱: https://blog.csdn.net/wo541075754/article/details/79054937
此外,還有一種簡單的轉賬方式
這種方式,不需要自己管理nonce。
這2種方式都是離線交易,先組裝交易,然後發送到鏈上。
參考:
https://docs.web3j.io/getting_started.html#transactions
https://www.jianshu.com/p/6650d2a3aea9
C. iOS開發ETH錢包
框架:web3swift => https://github.com/matter-labs/web3swift
1、創建錢包
2、導入錢包
3、獲取余額
4、轉賬
5、調用智能合約
注意:
1、網路的切換
測試網 let web3 = Web3.InfuraRinkebyWeb3()
主網 let web3 = Web3.InfuraMainnetWeb3()
2、轉賬相關的,必須配置
KeystoreManager
TransactionOptions
3、調用智能合約,參數不對,會直接返回nil
D. 歐易web3錢包怎麼轉賬
1、首先打開歐易(OKEX),點擊頁面右上方資產管理,選擇提幣,進入提幣頁面。
2、其次選擇需要提幣的幣種,例如BTC,選擇提幣方式,可以選擇鏈上提幣或內部轉賬,然後點擊下一步。
3、最後填寫提幣信息,輸入提幣地址和數量,點擊下一步即可。
E. 使用Web3J與第三方合約交互——批量轉賬
之前使用NodeJs與智能合約交互,都是訪問的自己部署的合約。最近要對線上第三方合約進行轉賬操作,人數比較多,一筆筆操作起來手指都點斷了還容易出錯。既然代幣Token都遵守ERC20協議,肯定有統一的Transfer(轉賬)方法供客戶端調用,那麼編寫程序實現自動轉賬應該可以實現,去查了相關資料發現web3j是不錯的選擇。
輕量級客戶端與以太坊交互的Java庫。
既然是調用第三方合約那麼肯定需要知道合約地址,合約地址定義了到哪裡去訪問合約;
ABI(Application Binary Interface): 應用程序二進制介面,定義了智能合約提供的方法功能
若是無法獲取到ABI介面,也可以使用solc編譯生產bin和abi文件。
(生產代理類時可以指定包路徑和類名)
這樣一來,便可以使用程序完成批量轉賬操作。
後來研究發現,使用NodeJs直接調用Web3也可以實現對應功能,不過還是對Java更熟悉一些,就採用了Java的方式。
F. 以太坊如何使用web3.js或者rpc介面獲取交易數據交易時間與確認數
如果要查詢主網上的交易記錄,可以使用etherscan。但是,如果是你自己搭建的私鏈,應該如何查詢交易記錄呢?
答案是你需要自己監聽鏈上的日誌,存到資料庫里,然後在這個資料庫中查詢。例如:
varaddr=""
varfilter=web3.eth.filter({fromBlock:0,toBlock:'latest',address:addr});
filter.get(function(err,transactions){
transactions.forEach(function(tx){
vartxInfo=web3.eth.getTransaction(tx.transactionHash);
//這時可以將交易信息txInfo存入資料庫
});
});
web3.eth.filter()用來監聽鏈上的日誌,web3.eth.getTransaction()用來提取指定交易的信息,一旦獲得交易信息,就可以存入資料庫供查詢用了。
推薦一個實戰入門,你可以看看:以太坊教程