Web3j是一個輕量級,Reactive(響應式),類型安全的Java庫,用於與Ethereum網絡上的客戶端(節點)集成,這容許您使用Ethereum塊鏈,而不須要爲平臺編寫本身的集成代碼的額外開銷。javascript
經過HTTP和IPC 完成Ethereum的JSON-RPC客戶端API的實現html
1.Ethereum錢包支持java
2.使用過濾器的函數式編程功能的APIgit
3.自動生成Java智能合約包裝器,以建立、部署、處理和調用來自本地Java代碼的智能合約github
4.支持Parity的 我的和Geth的 我的客戶端APIweb
5.支持Infura,因此您沒必要本身運行一個Ethereum客戶端sql
6.綜合整合測試展現了上述一些場景apache
7.命令行工具編程
1.RxJava函數式編程的的API中間件json
2.Apache HTTP Client中間件
3.Jackson Core 用於快速JSON序列化/反序列化中間件
4.Bouncy Castle加密解密和 Java Scrypt加密中間件
5.生成智能合約java包裝器類的java源代碼(.java)的JavaPoet中間件
6.Java的UNIX域套接字的*nix系統進程間通訊API中間件
1 |
$ geth --fast --cache = 512 –networkid 2 - -rpcapi 「personal,db,eth,net,web3」 --rpc --dev |
Web3j還支持經過文件套接字快速進行進程間通訊(IPC)到在與web3j相同的主機上運行的客戶端。在建立服務時,鏈接只需使用相關的IpcService實現而不是 HttpService:
Web3j的函數式編程的特性讓咱們設置觀察者很容易,這樣通知訂閱者在區塊鏈以便知道區塊鏈上設置的事件。
當全部新的塊被添加到塊鏈中的時候,接收到這些區塊
若是您但願查看最近的當前的區塊,以便於新的後續塊的建立:
當全部新的交易被添加到塊鏈中的時候,接收到這些交易
當全部待處理的交易被提交到網絡時(也就是說,在它們被分組到一個塊以前),接收這些交易
Web3j支持使用Ethereum錢包文件(推薦)和用於發送交易的Ethereum客戶端管理命令。
使用您的Ethereum錢包文件將Ether發送到另外一方:
若是想自定義交易
獲取可用的nonce
建立交易
簽名併發送交易
使用web3j的智能合約包裝器要簡單得多
使用Java智能合約包裝器處理智能合約
web3j能夠自動生成智能合約包裝器代碼,以便在不離開Java的狀況下部署和與智能合約進行交互,生成包裝代碼
$ solc .sol —bin —abi —optimize -o <output-dir>
Web3j solidity生成/path/to/<smart-contract>.bin /path/to/<smart-contract>.abi -o / path / to / src / main / java -p com.your.organisation.name
從廣義上講,以太坊有三種類型的交易
從以太坊的一方轉移到另外一方
建立智能合約
交易智能合約
在Ethereme測試網絡(TestNet)中,採礦難度低於主網絡(MainNet)。這意味着您可使用常規CPU(如筆記本電腦)挖掘新的Ether,您須要作的就是運行一個Ethereum客戶端
在使用Ethereum客戶端時,這意味着有兩個參數(GasPrice,GasLimit)用來決定你想花多少時間來完成一項任務:
這是你在每單位Gas中所準備的量。它的價格是9000 Wei (9 x 10 ^15 Ether)
這是你在交易執行過程當中願意花費的總金額。在以太坊中,一個交易的大小是有上限的,它限制了這個值,一般限制爲1,500,000
這些參數組合在一塊兒,決定了您願意花費在交易成本上的最大數量。也就是說,你不能再用Gas的價格限制了。GasPrice也會影響交易發生的速度,這取決於其餘交易的價格,而這些交易對礦商來講更有利可圖,您可能須要對這些參數進行調整,以確保交易可以及時地進行。
當您使用某種Ether建立有效的賬戶時,可使用兩種機制來與Ethereum進行交易,這兩種機制都經過web3j來支持。
[經過Ethereum客戶端進行交易簽名](https://docs.web3j.io/transactions.html#signing-via-client)
[離線交易簽名](https://docs.web3j.io/transactions.html#offline-signing)
爲了經過Ethereum客戶端進行交易,您首先須要確保您所交易的客戶知道您的錢包地址。爲了作到這一點,你最好運行本身的Ethereum客戶端,如Geth / Parity。一旦您有客戶端運行,您能夠經過如下方式建立一個錢包:
Geth Wiki包含了Geth支持的不一樣機制的良好運行,好比導入私鑰文件,並經過它的控制檯建立一個新賬戶或者,您能夠爲客戶端使用JSON-RPC管理命令,例如,用於[Parity](https://github.com/paritytech/parity/wiki/JSONRPC-personal-module#personal_newaccount) 或[Geth的personal_newAccount](https://github.com/ethereum/go-ethereum/wiki/Management-APIs#personal_newaccount)
在客戶端使用json-rpc管理命令,對於 [Parity](https://github.com/paritytech/parity/wiki/JSONRPC-personal-module#personal_newaccount) or [Geth](https://github.com/ethereum/go-ethereum/wiki/Management-APIs#personal_newaccount)使用personal_newAccount
建立您的錢包文件後,您能夠經過web3j解鎖賬戶,首先建立一個支持Parity / Geth管理命令的web3j實例
若是您不想管理本身的Ethereum客戶端,或者不想向Ethereum客戶端提供電子錢包詳細信息(如密碼),那麼離線交易簽名就是要走的路。
離線交易簽名容許您使用您在Web3j中的Ethereum Ethereum錢包簽署交易,從而能夠徹底控制您的私人憑據。離線建立的交易能夠發送到網絡上的任何Ethereum客戶端,這將會將交易傳播到其餘節點,前提是它是一個有效的交易。
爲了離線簽署交易,您須要使用您的Ethereum錢包文件或與Ethereum錢包/賬戶相關的公鑰和私鑰,web3j可以爲您生成一個新的安全Ethereum錢包文件,或者使用現有的錢包文件。
要建立一個新的錢包文件:
String fileName = WalletUtils.generateNewWalletFile(「your password」,new File(「/path/to/destination」));
若是具備達到脫機簽名能力目的交易應該使用 RawTransaction類型。RawTransaction相似於以前提到的交易類型,可是它不須要from地址,由於這能夠從簽名中推斷出來。
爲了建立和簽名一個raw交易,順序以下:
肯定發件人賬戶的下一個可用隨機數
建立RawTransaction對象
編碼RawTransaction對象
簽名RawTransaction對象
將RawTransaction對象發送到節點進行處理
獲取下一個可用的[隨機數後](https://docs.web3j.io/transactions.html#nonce),該值就能夠用於建立交易對象:
而後能夠對交易進行簽名和編碼:
這些憑證是在建立和處理錢包文件時加載的。
而後使用ethsendrawtransaction發送該交易:
Nonce是一個遞增的數值,它用於唯一地標識交易。一個nonce只能被使用一次,直到一個交易被挖礦確認,它能夠用同一個nonce發送多個版本的交易,然而,一旦被挖礦確認,任何後續的提交都將被拒絕,能夠經過
爲了防止交易重播,ETH(ETC)節點要求每筆交易必須有一個nonce數值。每個帳戶從同一個節點發起交易時,這個nonce值從0開始計數,發送一筆nonce對應加1。當前面的nonce處理完成以後纔會處理後面的nonce。
注意這裏的前提條件是相同的地址在相同的節點發送交易。
當nonce過小(小於以前已經有交易使用的nonce值),交易會被直接拒絕。
當nonce太大,交易會一直處於隊列之中,這也就是致使咱們上面描述的問題的緣由;
當發送一個比較大的nonce值,而後補齊開始nonce到那個值之間的nonce,那麼交易依舊能夠被執行。
當交易處於queue中時中止geth客戶端,那麼交易queue中的交易會被清除掉。
若是智能合約包含構造函數,則相關的構造函數字段值必須編碼並附加到編譯後的智能合約代碼中.
web3j負責爲您提供功能編碼,進一步的詳細信息能夠在Ethereum維基百科的電子合同ABI節中找到。
等待響應就使用EthGetTransactionReceipt…
無論消息簽名的返回類型是什麼,都不可能從事務性函數調用返回值。可是,可使用過濾器捕獲函數返回的值.
此功能由ethcall json-rpc調用實現, ethcall容許您在智能合約中調用一個方法來查詢一個值。這個函數不存在交易成本,這是由於它不會改變任何智能合約方法的狀態,它只是簡單地返回它們的值:
注意:若是生成了一個無效的函數調用,或者得到了一個null結果,那麼返回值將是一個集合。emptylist的實例.
原文連接:http://wangxiaoming.com/blog/2018/02/28/HPB-43-ETH-Web3j-function/