以太坊Web3J插件功能探究

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)

 

原文連接:https://mp.weixin.qq.com/s/NOuI7ZtsD6VOupp67AEZIA

相關文章
相關標籤/搜索