Web3jを使用した軽量イーサリアムクライアント
1. 序章
このチュートリアルでは、人気のあるWeb3抽象化ライブラリのJava実装であるWeb3jを紹介します。
Web3jは、JSON-RPC またはHTTP、WebSocket、IPCなどの使い慣れた標準を使用してEthereumノードに接続することにより、Ethereumネットワークと対話するために使用されます。
イーサリアムはそれ自体がトピック全体なので、最初にそれが何であるかを簡単に見てみましょう!
2. イーサリアム
イーサリアムは、(1)暗号通貨(トークンシンボル ETH )、(2)分散型スーパーコンピューター、(3)ブロックチェーン、および(4)Solidityで記述されたスマートコントラクトネットワークです。
言い換えれば、イーサリアム(ネットワーク)は、一種のメッシュトポロジで通信するノードと呼ばれる接続されたサーバーの束によって実行されます(技術的には、これは正確には当てはまりませんが、十分に近いです)すべてがどのように機能するかをより確実に理解するため)。
Web3jとその親ライブラリWeb3、により、Webアプリケーションはこれらのノードの1つに接続し、イーサリアムトランザクションを送信できます。は、すべての目的と目的のために、以前にイーサリアムネットワークにデプロイされたコンパイル済みのSolidityスマートコントラクト関数です。 スマートコントラクトの詳細については、Solidityこちらを使用したスマートコントラクトの作成と展開に関する記事を参照してください。
各ノードは、コンセンサスと検証を実現できるように、変更を1つおきのノードにブロードキャストします。 したがって、各ノードにはイーサリアムブロックチェーンの履歴全体が同時に含まれ、それによって改ざん防止の方法で、他のすべてのノードによるコンセンサスと検証を介してすべてのデータの冗長バックアップが作成されます ネットワークのX231X]。\
イーサリアムの詳細については、公式ページをご覧ください。
3. 設定
Web3jが提供するすべての機能を使用するには、通常よりも少し多くの設定を行う必要があります。 まず、Web3jはいくつかの独立したモジュールで提供され、各モジュールはオプションでコアpom.xml依存関係に追加できます。
<dependency>
<groupId>org.web3j</groupId>
<artifactId>core</artifactId>
<version>3.3.1</version>
</dependency>
Web3jのチームは、いくつかの構成と制限された機能が組み込まれた、事前に構築されたSpring Boot Starterを提供していることに注意してください!
この記事では、焦点をコア機能に限定します(Web3jをSpring MVCアプリケーションに追加する方法を含むため、より広範囲のSpring Webアプリケーションとの互換性が得られます)。
これらのモジュールの完全なリストは、 MavenCentralにあります。
3.1. 契約の編集:トリュフまたはソルク
イーサリアムスマートコントラクト(。 solc ファイル)をコンパイルおよびデプロイするには、主に2つの方法があります。
この記事ではTruffleを使用します。Truffleは、スマートコントラクトのコンパイル、移行、およびネットワークへの展開のプロセスを簡素化および抽象化します。 また、 Solc コンパイラーをラップして、両方の経験を積むことができます。
Truffleを設定するには:
$ npm install truffle -g
$ truffle version
プロジェクトをそれぞれ初期化し、アプリをコンパイルし、アプリをブロックチェーンにデプロイし、それぞれテストするために使用する4つの主要なコマンド:
$ truffle init
$ truffle compile
$ truffle migrate
$ truffle test
それでは、簡単な例を見てみましょう。
pragma solidity ^0.4.17;
contract Example {
function Example() {
// constructor
}
}
これにより、コンパイル時に次のABIJSONが生成されます。
{
"contractName": "Example",
"abi": [
{
"inputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
}
],
"bytecode": "0x60606040523415600e57600080fd5b603580601b6...,
"deployedBytecode": "0x6060604052600080fd00a165627a7a72305...,
//...
}
次に、アプリケーション内で提供されたバイトコードとABIを使用して、デプロイされたコントラクトと対話できます。
3.2. テスト契約:ガナッシュ
イーサリアムテストネットを操作する最も簡単な方法の1つは、独自のGanacheサーバーを起動することです。セットアップが最も簡単で、すぐに使用できるソリューションを使用します。構成、設定。 また、Ganacheを内部で駆動するGanacheCLIのインターフェイスとサーバーシェルも提供します。
デフォルトで提供されているURLアドレスhttp:// localhost:8545またはhttp:// localhost:7545でGanacheサーバーに接続できます。
Meta-Mask 、 Infura 、または Go-Lang and Geth を使用するなど、テストネットワークを設定するための一般的なアプローチが他にもいくつかあります。
独自のGoLangインスタンスを設定する(およびカスタムテストネットとして構成する)のはかなり難しい場合があり、ChromeでのMeta-Maskのステータスは現在不明であるため、この記事ではGanacheを使用します。
Ganacheは、手動テストシナリオ(統合テストのデバッグまたは完了時)に使用することも、自動テストシナリオに使用することもできます(このような状況では、使用可能なエンドポイントがない可能性があるため、テストを構築する必要があります)。
4. Web3とRPC
Web3は、EthereumブロックチェーンおよびEthereumサーバーノードと簡単に対話するためのファサードとインターフェイスを提供します。 つまり、 Web3は、JSON-RPCを介したクライアントとEthereumBlockchain間の相互通信を容易にします。 Web3JはWeb3の公式Javaポートです。
プロバイダーを渡すことにより、アプリケーション内で使用するためにWeb3jを初期化できます(例: –サードパーティまたはローカルEthereumノードのエンドポイント):
Web3j web3a = Web3j.build(new HttpService());
Web3j web3b = Web3j.build(new HttpService("YOUR_PROVIDER_HERE"));
Web3j myEtherWallet = Web3j.build(
new HttpService("https://api.myetherapi.com/eth"));
3番目のオプションは、サードパーティプロバイダーを追加する方法を示しています(これにより、サードパーティプロバイダーに接続します)。 ただし、プロバイダーオプションを空のままにするオプションもあります。 その場合、 localhost ではなく。でデフォルトのポート( 8545 )が使用されます。
5. 重要なWeb3メソッド
イーサリアムブロックチェーンと通信するようにアプリを初期化する方法がわかったので、イーサリアムブロックチェーンと対話するためのいくつかのコアな方法を見てみましょう。
Web3メソッドをCompleteableFutureでラップして、構成済みのイーサリアムノードに対して行われるJSON-RPCリクエストの非同期性を処理することをお勧めします。
5.1. 現在のブロック番号
たとえば、現在のブロック番号を返すことができます。
public EthBlockNumber getBlockNumber() {
EthBlockNumber result = new EthBlockNumber();
result = this.web3j.ethBlockNumber()
.sendAsync()
.get();
return result;
}
5.2. アカウント
指定されたアドレスのアカウントを取得するには:
public EthAccounts getEthAccounts() {
EthAccounts result = new EthAccounts();
result = this.web3j.ethAccounts()
.sendAsync()
.get();
return result;
}
5.3. アカウントトランザクションの数
特定のアドレスのトランザクション数を取得するには:
public EthGetTransactionCount getTransactionCount() {
EthGetTransactionCount result = new EthGetTransactionCount();
result = this.web3j.ethGetTransactionCount(DEFAULT_ADDRESS,
DefaultBlockParameter.valueOf("latest"))
.sendAsync()
.get();
return result;
}
5.4. 勘定残高
そして最後に、アドレスまたはウォレットの現在のバランスを取得するには:
public EthGetBalance getEthBalance() {
EthGetBalance result = new EthGetBalance();
this.web3j.ethGetBalance(DEFAULT_ADDRESS,
DefaultBlockParameter.valueOf("latest"))
.sendAsync()
.get();
return result;
}
6. Web3jでの契約の操作
Truffleを使用してSolidityコントラクトをコンパイルしたら、コンパイル済みのアプリケーションバイナリインターフェイス( ABI )を、スタンドアロンのWeb3jコマンドラインツールこちらを使用して操作できます。または自立型zipとしてここ。
6.1. CLIマジック
次に、次のコマンドを使用して、Javaスマートコントラクトラッパー(基本的にはスマートコントラクトABIを公開するPOJO)を自動的に生成できます。
$ web3j truffle generate [--javaTypes|--solidityTypes]
/path/to/<truffle-smart-contract-output>.json
-o /path/to/src/main/java -p com.your.organisation.name
プロジェクトのルートで次のコマンドを実行します。
web3j truffle generate dev_truffle/build/contracts/Example.json
-o src/main/java/com/baeldung/web3/contract -p com.baeldung
例クラスを生成しました:
public class Example extends Contract {
private static final String BINARY = "0x60606040523415600e576...";
//...
}
6.2. JavaPOJOの
スマートコントラクトラッパーができたので、プログラムでウォレットを作成し、そのアドレスにコントラクトをデプロイできます:
WalletUtils.generateNewWalletFile("PASSWORD", new File("/path/to/destination"), true);
Credentials credentials = WalletUtils.loadCredentials("PASSWORD", "/path/to/walletfile");
6.3. 契約を展開する
契約は次のように展開できます。
Example contract = Example.deploy(this.web3j,
credentials,
ManagedTransaction.GAS_PRICE,
Contract.GAS_LIMIT).send();
そして、アドレスを取得します。
contractAddress = contract.getContractAddress();
6.4. トランザクションの送信
ContractのFunctionsを使用してTransactionを送信するには、Web3j FunctionをListで初期化します。入力値と出力パラメータのリスト:
List inputParams = new ArrayList();
List outputParams = new ArrayList();
Function function = new Function("fuctionName", inputParams, outputParams);
String encodedFunction = FunctionEncoder.encode(function);
次に、必要な gas ( Transaction の実行に使用)とnonceパラメーターを使用してTransactionを初期化できます。
BigInteger nonce = BigInteger.valueOf(100);
BigInteger gasprice = BigInteger.valueOf(100);
BigInteger gaslimit = BigInteger.valueOf(100);
Transaction transaction = Transaction
.createFunctionCallTransaction("FROM_ADDRESS",
nonce, gasprice, gaslimit, "TO_ADDRESS", encodedFunction);
EthSendTransaction transactionResponse = web3j.ethSendTransaction(transaction).sendAsync().get();
transactionHash = transactionResponse.getTransactionHash();
スマートコントラクト機能の完全なリストについては、公式ドキュメントを参照してください。
7. 結論
それでおしまい! Web3jを使用してJavaSpringMVCアプリをセットアップしました–ブロックチェーンの時間です!
いつものように、この記事で使用されているコード例は、GitHubから入手できます。