1. 程式人生 > >以太坊錢包2-Android-轉賬(ETH)

以太坊錢包2-Android-轉賬(ETH)


在這裡插入圖片描述在這裡插入圖片描述

參考

前提準備

在說ETH轉賬和查詢餘額之前需要準備環境:也就是普通app平時請求後臺資料時分為開發、測試以及正式環境。以太坊同樣的也有幾個網路供我們開發測使用。後續會使用ropsten作為測試網路

在相應區塊鏈瀏覽器上均可以查詢到所有部署在此鏈上的智慧合約以及使用者的以太幣。

選中ropsten作為測試網路,首先需要獲取在該網路上獲取以太幣。有多種獲取方式。如下:

獲取ropsten上的以太幣

這裡採用的是方式2

  1. 安裝Chrome瀏覽器或者火狐瀏覽器的METAMASK外掛

  2. 通過metamask選擇ropsten網路建立錢包

  3. 進入水龍頭網站進行轉賬(一會就到賬了)

     地址:0xB4939cd825d4408656e64C987C8cf8354Cc2208d
     私鑰:f48028e1e37f507e59f0011ddd106b18747936b09e03ba565a085f17c672f671
    

上面的賬號就是通過metamask生成的 裡面有幾個以太幣,如果不方便可以直接使用上面的賬號,通過錢包匯入即可

查詢餘額、轉賬ETH以及後續的智慧合約部署,呼叫均使用Web3j

ETH查詢餘額

//初始化web3j
Web3j web3j = Web3jFactory.build(new HttpService("https://ropsten.infura.io/"));
//獲取餘額 ETH支援小數點後18位,此處獲取的balance要除以10^18
BigInteger balance = web3j.ethGetBalance(address, DefaultBlockParameterName.LATEST)
                .send()//是同步獲取
                //.sendAsync()//非同步獲取
                .getBalance();

通過直接呼叫web3j.ethGetBalance()即可。第一個引數address:查詢餘額的地址,第二個填寫的引數表示到最新的挖掘塊,第二個引數其他值。這樣就可以獲取每個賬戶的以太幣的餘額,如果使用同步方式獲取餘額記得在其他執行緒呼叫。

ETH轉賬

  1. 簡單使用Transfer轉賬
//初始化web3j
Web3j web3j = Web3jFactory.build(new HttpService("https://ropsten.infura.io/"));
//此處密碼為輸入的,walletFile為錢包裡面中儲存的WalletFile檔案
Credentials credentials = Credentials.create(Wallet.decrypt(pwd, walletFile));
TransactionReceipt transactionReceipt = Transfer.sendFunds(
        web3j, credentials, toAddr,
        BigDecimal.valueOf(value), Convert.Unit.ETHER)
        .send()
//toAddr 轉入賬戶地址
//BigDecimal.valueOf(value) 轉賬的以太幣數量value為1
//Convert.Unit.ETHER 以太幣的單位 因為以太幣支援小數點後面18位。
//所以當轉賬1個ETH時實際上轉換為BigInteger為100 0000 0000 0000 0000。
//此處不懂先看後面,看完就能弄懂
  1. 自定義轉賬
//初始化web3j
Web3j web3j = Web3jFactory.build(new HttpService("https://ropsten.infura.io/"));
//此處密碼為輸入的,walletFile為錢包裡面中儲存的WalletFile檔案
Credentials credentials = Credentials.create(Wallet.decrypt(pwd, walletFile));
//獲取當前賬戶的下一個有效隨機數 此處的address為當前錢包的地址
EthGetTransactionCount ethGetTransactionCount = web3j.ethGetTransactionCount(
             address, DefaultBlockParameterName.LATEST).send();
BigInteger nonce = ethGetTransactionCount.getTransactionCount();
//建立交易 這裡幾個引數沒寫,統一在下面解釋
RawTransaction rawTransaction  = RawTransaction.createEtherTransaction(
             nonce, <gas price>, <gas limit>, <toAddress>, <value>);
// 簽名交易 並轉換為16進位制
byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
String hexValue = Numeric.toHexString(signedMessage);
//傳送交易 傳送完了或獲取一個交易的hash值,這個值可以在區塊鏈瀏覽器上查詢當前交易的結果
EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).send();

建立交易需要用到一下幾個引數
RawTransaction.createTransaction(nonce,gasPrice,gasLimit,to,value,data);

  • nonce:當前賬戶下有效的隨機數 用來唯一地標識交易。一個nonce只能使用一次,直到交易被挖掘完成
  • gasPrice:挖礦中用到的gas對eth的價格。好比汽油價格。
  • gasLimit:針對本次交易所使用的最大gas數量。好比汽車的油箱。比如一輛汽車加滿油箱是40,每1L油的價格為7塊,汽車每跑100km耗油10L,那麼跑400km需要消耗40L油,換成錢是280塊。也就是說花280塊能跑400km,在400km內隨便跑都沒有關係。同理:進行這次交易,假設gasPrice = 0.01ETH,gasLimit = 10。也就是說我願意替這次交易花費最大數為0.1ETH。如果這次交易所消耗的ETH大於0.1ETH,那麼這次交易不會完成,且這0.1ETH會被消耗而不會退還。如果這次交易只需要用到0.05ETH那麼還剩下0.05ETH會退還到賬戶上。還有一個概念:gasUsed 也就是一個詞交易需要花費的gas數量。
  • to:轉入的地址
  • value:轉入的ETH數量,因為ETH支援小數點後面18位,假如需要轉賬1ETH,那麼此處的值為100 0000 0000 0000 0000。
  • data:進行合約呼叫的時使用,也可以新增備註。不過需要進行16進位制轉換(後續通過智慧合約轉讓代幣會描述)

參考

因為簡單的描述無法讓人快速的弄懂比較生疏的概念,所以這裡找了幾篇比較友好的文章

Demo 參考程式碼