Web3j API詳解

Web3j是什麼

Web3j是什麼,我們可以把它理解成是輕量級的Java庫,實現了與以太坊節點通訊。

對於Web3j的最大特性,我的理解是,將Solidity語言的智慧合約翻譯成Java版本的智慧合約。

它的核心特性有:

  • 以Java型別的JSON-RPC實現以太坊客戶端的互動
  • 支援所有JSON-RPC型別的方法
  • 支援所有Geth和Parity方法來管理賬戶、簽名、交易
  • 傳送客戶端同步請求和非同步請求
  • 自動Solidity ABI檔案生成Java智慧合約包裝

API常用命令

由於以太坊客戶端Geth已經整合了Web3j API和Admin API,所以本文結合Geth命令詳解,食用更佳。

  • 進入Geth控制檯
    geth --datadir testNet --dev console 2>> test.log
  • 輸入eth,回車。
    這裡寫圖片描述
    我們可以看到Web3j的一些函式方法。
  accounts: ["0x4d373f26dddfe07f98460fffca508eaf3194abf4", "0xba0f181533b2f99258650a036d66718a7f3bde29"],
blockNumber: 3,
coinbase: "0x4d373f26dddfe07f98460fffca508eaf3194abf4",
compile: {
lll: function(),
serpent: function(),
solidity: function()
},
defaultAccount: undefined,
defaultBlock: "latest",
gasPrice: 1,
hashrate: 0,
mining: true,
pendingTransactions: [],
protocolVersion: "0x3f",
syncing: false,
call: function(),
contract: function(abi),
estimateGas: function(),
filter: function(options, callback, filterCreationErrorCallback),
getAccounts: function(callback),
getBalance: function(),
getBlock: function(),
getBlockNumber: function(callback),
getBlockTransactionCount: function(),
getBlockUncleCount: function(),
getCode: function(),
getCoinbase: function(callback),
getCompilers: function(),
getGasPrice: function(callback),
getHashrate: function(callback),
getMining: function(callback),
getPendingTransactions: function(callback),
getProtocolVersion: function(callback),
getRawTransaction: function(),
getRawTransactionFromBlock: function(),
getStorageAt: function(),
getSyncing: function(callback),
getTransaction: function(),
getTransactionCount: function(),
getTransactionFromBlock: function(),
getTransactionReceipt: function(),
getUncle: function(),
getWork: function(),
iban: function(iban),
icapNamereg: function(),
isSyncing: function(callback),
namereg: function(),
resend: function(),
sendIBANTransaction: function(),
sendRawTransaction: function(),
sendTransaction: function(),
sign: function(),
signTransaction: function(),
submitTransaction: function(),
submitWork: function()
}

如果想要了解更詳細的函式引數,請參考官方API文件

建立賬號

> personal.newAccount("新建的賬戶密碼")
> "0xba0f181533b2f99258650a036d66718a7f3bde29"

這時在對應的datadir的keystore資料夾下也會生成一個對應的keyfile檔案,它的名稱格式為UTC–時間–公鑰地址如:
UTC--2018-05-08T03-40-45.305449600Z--4d373f26dddfe07f98460fffca508eaf3194abf4
一定記住輸入的密碼並且儲存備份好keyfile檔案,在發起交易時,必須同時擁有keyfile和密碼。如果丟失了keyfile或者忘記了對應的密碼,那麼就意味著丟失了賬戶中所有的以太幣。

注意,不像中心化的服務,忘記密碼後可以通過聯絡客戶等方式找回,我們需要自己對安全負責。

轉賬-傳送以太幣

> var sender = eth.accounts[0];
> var receiver = eth.accounts[1];
> var amount = web3.toWei(1, "ether")
> eth.sendTransaction({from:sender, to:receiver, value: amount})

也可以這樣寫:
eth.sendTransaction({from:"0x4d373f26dddfe07f98460fffca508eaf3194abf4",to: "0xba0f181533b2f99258650a036d66718a7f3bde29",value: web3.toWei(1,"ether")})
注意在花費以太幣時,需要對賬戶進行解鎖,解鎖使用
personal.unlockAccount(account)

miner模組:開始和停止挖礦

> miner.start()
true
> miner.stop()
true

miner.start()可以帶引數指明並行的挖礦執行緒數
挖礦的獎勵會傳送到收錢(coinbase)地址,預設是第一個賬號,可以使用

> eth.coinbase
"0x81c9fdc9910740cdc0debf90ce52a087e3ce014e"

獲取收錢(coinbase)地址。
miner.setEtherbase(eth.accounts[1])來設定收錢地址。

admin模組

admin主要提供節點的管理功能,這裡列幾個常用API, 完整文件請參考官方文件Admin API

  • 節點的資訊:admin.nodeInfo
> admin.nodeInfo
{
enode: "enode://aec0b7d58c59e4f9c56ae75de43d4a80b223b78234818b16532f66902e91f0afd[email protected][::]:58383?discport=0",
id: "aec0b7d58c59e4f9c56ae75de43d4a80b223b78234818b16532f66902e91f0afd9c6382429baca5670d80eecfaa11eeee9931f5247896b1f952659963474946a",
ip: "::",
listenAddr: "[::]:58383",
name: "Geth/v1.8.7-stable-66432f38/windows-amd64/go1.10.1",
ports: {
discovery: 0,
listener: 58383
},
protocols: {
eth: {
config: {
byzantiumBlock: 0,
chainId: 1337,
clique: {...},
eip150Block: 0,
eip150Hash: "0x0000000000000000000000000000000000000000000000000000000000000000",
eip155Block: 0,
eip158Block: 0,
homesteadBlock: 0
},
difficulty: 1,
genesis: "0x270498b86be5bd46cd274e4eb2621a38e920bd32b3fe19041e1e176e4fef5e85",
head: "0x270498b86be5bd46cd274e4eb2621a38e920bd32b3fe19041e1e176e4fef5e85",
network: 1
},
shh: {
maxMessageSize: 1048576,
minimumPoW: 0.2,
version: "6.0"
}
}
}

返回的資訊有:enode(節點的Url,在連線節點的時候使用), id, ip, 監聽埠,使用的協議等

  • admin.addPeer(enodde)
    連線網路上的節點

  • admin.peers
    > admin.peers
    包含已連線節點資訊的物件陣列.

  • admin.startRPC

> admin.startRPC("127.0.0.1", 8545)
true

啟動一個基於HTTP JSON RPC API伺服器, 對應的是stopRPC()
startRPC用一下方式啟動控制檯的效果是一樣的。

geth --rpc --rpcaddr 127.0.0.1 --rpcport 8545