1 Java Web3J 概述java
Web3j是一個輕量級,Reactive(響應式),類型安全的Java庫,用於與Ethereum網絡上的客戶端(節點)集成,這容許您使用Ethereum塊鏈,而不須要爲平臺編寫本身的集成代碼的額外開銷。web
1.1 Web3J 提供的功能編程
經過HTTP和IPC 完成Ethereum的JSON-RPC客戶端API的實現api
Ethereum錢包支持安全
使用過濾器的函數式編程功能的API網絡
自動生成Java智能合約包裝器,以建立、部署、處理和調用來自本地Java代碼的智能合約併發
支持Parity的 我的和Geth的 我的客戶端APIsocket
支持Infura,因此您沒必要本身運行一個Ethereum客戶端函數式編程
綜合整合測試展現了上述一些場景函數
命令行工具
1.2 Web3J的依賴的庫(中間件)
RxJava函數式編程的API中間件
Apache HTTP Client中間件
Jackson Core 用於快速JSON序列化/反序列化中間件
Bouncy Castle加密解密和 Java Scrypt加密中間件
生成智能合約java包裝器類的java源代碼(.java)的JavaPoet中間件
Java的UNIX域套接字的*nix系統進程間通訊API中間件
1.3 啓動Ethereum客戶端
$ geth --fast --cache = 512 –networkid 2 - -rpcapi 「personal,db,eth,net,web3」 --rpc --dev
1.4 Web3J的進程間通訊IPC
Web3j還支持經過文件套接字快速進行進程間通訊(IPC)到在與web3j相同的主機上運行的客戶端。在建立服務時,鏈接只需使用相關的IpcService實現而不是HttpService:
//OS X/Linux/Unix;
Web3j web3 = Web3j.build(new UnixIpcService("/path/to/socketfile"));
1.5 Web3J的過濾器
Web3j的函數式編程的特性讓咱們設置觀察者很容易,這樣通知訂閱者在區塊鏈以便知道區塊鏈上設置的事件。
1.5.1 區塊過濾器
當全部新的塊被添加到塊鏈中的時候,接收到這些區塊:
Subscription subscription = web3j.blockObservable(false).subscribe(block ->{});
若是您但願查看最近的當前的區塊,以便於新的後續塊的建立:
Subscription subscription = catchUpToLatestAndSubscribeToNewBlocksObservable(
<startBlockNumber>,<fullTxObjects>)
.subscribe(block ->{
});
1.5.2 交易過濾器
當全部新的交易被添加到塊鏈中的時候,接收到這些交易:
Subscription subscription = web3j.transactionObservable().subscribe(tx ->{
});
1.5.3 待處理的交易過濾器
當全部待處理的交易被提交到網絡時(也就是說,在它們被分組到一個塊以前),接收這些交易:
Subscription subscription = web3j.pendingTransactionObservable().subscribe(tx ->{
});
1.5.4 使用Web3J交易
Web3j支持使用Ethereum錢包文件(推薦)和用於發送交易的Ethereum客戶端管理命令。 使用您的Ethereum錢包文件將Ether發送到另外一方:
Web3j web3 = Web3j,build(new HttpService());//defaults to http://localhost:8545/Credentials credentials = WalletUtils.loadCredentials("password","/path/to/walletfile");
TransactionReceipt transactionReceipt = Transfer.sendFunds(web3,credentials,"0×04",BigDecimal.valueOf(1.0),Convert.Unit.ETHER);
Web3j web3 = Web3j,build(new HttpService());//defaults to http://localhost:8545/Credentials credentials = WalletUtils.loadCredentials("password","/path/to/walletfile");
若是想自定義交易
1. 獲取可用的nonce
EthGetTransactionCount ethGetTransactionCount = web3j.ethGetTransactionCount(address,DefaultBlockParameterName.LATEST).sendAsync().get();BigInteger nonce = ethGet TransactionCount.getTransactionCount();
2. 建立交易
RawTransaction rawTransaction = RawTransaction.createEtherTransaction(nonce,<gas price>,<gas limit>,<toAddress>,<value>);
3. 簽名併發送交易
byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction,credentials);
String hexValue = Numeric.toHexString(signedMessage);
EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).sendAsync().get();
4. 使用web3j的智能合約包裝器要簡單得多
Parity parity = Parity.build(new HttpService());//dedaults to http://localhost:8545/PersonalUnlockAccount personalUnlockAccount = parity.personalUnlockAccount["0×000...","a password"].sendAsync().get();
if (personalUnlockAccount.accountUnlocked()){
parity.personalSignAndSendTransaction()
}
1.6 使用Web3J智能合約
使用Java智能合約包裝器處理智能合約 web3j能夠自動生成智能合約包裝器代碼,以便在不離開Java的狀況下部署和與智能合約進行交互,生成包裝代碼
1.6.1 編譯智能合約
$ solc .sol --bin --abi --optimize -o
1.6.2 而後使用Web3J的命令行工具生成包裝器代碼
1.6.3 建立並部署智能合約
Web3j web3 = web3j .build(new HttpService());
YourSmartContract contract = YourSmartContract.deploy(<web3j>,<credential>,GAS_PRICE,GAS_LIMIT,<initialEtherValue>,<paramL>,...,<paramN>).get();//構造函數參數
1.6.4 使用已存在的智能合約
YourSmartContract contract = YourSmartContract.load("0×<adress>",<web3j>,<credentials>,GAS_PRICE,GAS_LIMIT)