Web3jを使った軽量のEthereumクライアント

1前書き

このチュートリアルでは、人気のあるWeb3抽象化ライブラリのJava実装であるWeb3jを紹介します。

  • Web3jは、JSON-RPC ** またはHTTP、WebSocket、IPCなどのよく知られた標準を使用してEthereumノードに接続することによって、Ethereumネットワークと対話するために使用されます。

Ethereumはそれ自体の全体的なトピックですので、まずはその内容を簡単に見てみましょう。

2 Ethereum

Ethereumは、(1)暗号通貨(トークンシンボルhttps://coinmarketcap.com/currencies/ethereum/[ETH])、(2)分散スーパーコンピュータ、(3)ブロックチェーン、(4)スマートコントラクトネットワークで、__Solidityで書かれています。

言い換えれば、Ethereum( network )は一種のメッシュトポロジで通信する nodes と呼ばれる多数の接続されたサーバーによって実行されます(厳密には正しくありませんが、すべてがどのように機能するかをよりしっかり理解するために十分近い)。 。

Web3j およびその親ライブラリである Web3 によって、 web applications はそれらのいずれかの node に接続し、それによって、以前にデプロイされたSolidity smart contract functions をコンパイルしたEthereum トランザクション を送信できます。 Ethereum ネットワーク へ。スマートコントラクトの詳細については、Solidityリンクを使ったそれらの作成とデプロイに関する記事を参照してください:/smart-contract-ethereum-solidity[ここ]。

各ノードは他のすべてのノードに変更をブロードキャストするので、合意と検証が可能になります。したがって、 ノード は同時に__Ethereumブロックチェーンの全履歴を含み、それによって 改ざん防止の方法で、およびネットワーク内の他のすべてのノードによる合意および検証を通じて、すべてのデータの冗長バックアップを作成します。

Ethereumの詳細については、https://www.ethereum.org/[公式ページ]を参照してください。

3セットアップ

Web3jが提供する一連の機能をすべて使用するには、通常よりも少しセットアップを追加する必要があります。まず、Web3jはいくつかの独立したモジュールで提供されています。それぞれのモジュールはオプションでコアの pom.xml 依存関係に追加できます。

<dependency>
    <groupId>org.web3j</groupId>
    <artifactId>core</artifactId>
    <version>3.3.1</version>
</dependency>
  • Web3jのチームは、いくつかの設定と限定された機能を内蔵した、構築済みのSpring Boot Starterを提供しています。

この記事では、中心となる機能(Spring MVCアプリケーションにWeb3jを追加する方法など、より広範囲のSpring Webアプリケーションとの互換性が得られるようにする)に焦点を絞ります。

これらのモジュールの完全なリストはhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22core%22%20AND%20g%3A%22org.web3j%22[Mavenにあります。中央]。

3.1. 契約のコンパイル:トリュフまたはSolc

Ethereumスマートコントラクト(. solc ファイル)をコンパイルおよびデプロイするには、主に2つの方法があります。

  1. 役人

Solidity コンパイラ。

  1. Truffle (抽象化スイート

スマート契約のテスト、展開、および管理用)

この記事ではTruffleを使い続けます。 Truffleは、スマート契約 のコンパイル、契約の移行、およびネットワークへの展開のプロセスを簡素化および抽象化します。また、 Solc コンパイラをラップして、両方である程度の経験を積むことができます。

トリュフを設定するには:

…… $ npm install tr​​uffle -g $トリュフ版 ……

それぞれプロジェクトを初期化し、アプリをコンパイルし、アプリをブロックチェーンにデプロイし、それをテストするために使用する4つの主要なコマンド:

$ truffle init
$ truffle compile
$ truffle migrate
$ truffle test

それでは、簡単な例を見てみましょう。

pragma solidity ^0.4.17;

contract Example {
  function Example() {
   //constructor
  }
}

コンパイル時に次のABI JSONが返されるはずです。

{
  "contractName": "Example",
  "abi":[    {
      "inputs":[],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "constructor"
    }
 ],
  "bytecode": "0x60606040523415600e57600080fd5b603580601b6...,
  "deployedBytecode": "0x6060604052600080fd00a165627a7a72305...,
 //...
}

その後、アプリケーション内で提供されたバイトコードとABIを使用して、デプロイされたコントラクトと対話することができます。

3.2. テスト契約:Ganache

  • Ethereumテストネットを使用する最も簡単な方法の1つは、独自のhttps://github.com/trufflesuite/gache[Ganache]サーバーを起動することです。それはセットアップと設定が最も簡単なので解決策です。また、Ganache CLIを操作するためのインターフェースとサーバーシェルも提供しています。

Ganacheサーバーには、提供されているデフォルトのURLアドレス( http://localhost:8545またはhttp://localhost:7545 . )で接続できます。

Meta-Mask 、https://web3j.readthedocs.io/en/latest/infura.html[Infura]の使用を含む、テストネットワークを設定するためのその他の一般的な方法がいくつかあります。またはhttps://github.com/ethereum/go-ethereum[Go-Lang and Geth]。

この記事では、独自のGoLangインスタンスの設定(およびカスタムテストネットとしての設定)はかなり面倒であり、Chrome上のMeta-Maskのステータスは現在不明なため、Ganacheを使用します。

手動テストのシナリオ(統合テストのデバッグ時または完了時)にGanacheを使用するか、自動テストのシナリオ(このような状況では利用可能なエンドポイントがない可能性があるため、テストを構築しなければなりません)

4 Web3とRPC

Web3は、EthereumブロックチェーンおよびEthereumサーバーノードと簡単にやり取りするためのファサードとインターフェースを提供します。言い換えれば、 Web3はJSON-RPCによってクライアントとEthereumブロックチェーン の間の相互通信を容易にします。 Web3Jはhttps://github.com/ethereum/web3.js[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番目のオプションは、サードパーティプロバイダを追加する方法を示しています(それによって、それらのEthereumノードと接続します)。しかし、私達は私達のプロバイダーオプションを空のままにするオプションもあります。その場合、 localhost ではデフォルトポートが使用されます( 8545 _. _

5必須Web3メソッド

Ethereumブロックチェーンと通信するようにアプリを初期化する方法がわかったので、Ethereumブロックチェーンと対話するためのいくつかの中心的な方法を見てみましょう。

設定したEthereumノードに対して行われたJSON-RPC要求の非同期性を処理するために、Web3のメソッドを CompleteableFuture でラップするのは良い方針です。

5.1. 現在のブロック番号

たとえば、 現在のブロック番号を返す ことができます。

public CompletableFuture<EthBlockNumber> getBlockNumber() {
    EthBlockNumber result = new EthBlockNumber();
    result = this.web3j.ethBlockNumber()
      .sendAsync()
      .get();
    return CompletableFuture.completedFuture(result);
}

5.2. アカウント

指定された住所の アカウントを取得するには

public CompletableFuture<EthAccounts> getEthAccounts() {
    EthAccounts result = new EthAccounts();
    result = this.web3j.ethAccounts()
        .sendAsync()
        .get();
    return CompletableFuture.completedFuture(result);
}

5.3. 口座取引数

特定のアドレスのトランザクション数を取得するには、次の手順に従います。

public CompletableFuture<EthGetTransactionCount> getTransactionCount() {
    EthGetTransactionCount result = new EthGetTransactionCount();
    result = this.web3j.ethGetTransactionCount(DEFAULT__ADDRESS,
      DefaultBlockParameter.valueOf("latest"))
        .sendAsync()
        .get();
    return CompletableFuture.completedFuture(result);
}

5.4. 勘定残高

そして最後に、住所や財布の現在の残高を取得するには:

public CompletableFuture<EthGetBalance> getEthBalance() {
    EthGetBalance result = new EthGetBalance();
    this.web3j.ethGetBalance(DEFAULT__ADDRESS,
      DefaultBlockParameter.valueOf("latest"))
        .sendAsync()
        .get();
    return CompletableFuture.completedFuture(result);
}

6. Web3j で契約を処理する

Truffleを使用してSolidity契約をコンパイルしたら、スタンドアロンのWeb3jコマンドラインツールhttps://docs.web3j.io/command__line.html[こちら]または自立型ジップhttps://github.com/web3j/web3j/releases/download/v3.3.1/web3j-3.3.1.zip[こちら]。

6.1. CLIマジック

次に、次のコマンドを使用して、Java Smart Contract Wrappers(基本的にはスマートコントラクト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

__Example __classを生成しました:

public class Example extends Contract {
    private static final String BINARY = "0x60606040523415600e576...";
   //...
}

6.2. Java POJOの

これでSmart Contract Wrapperが完成しました。 プログラムでWalletを作成してから、そのアドレスに契約を展開できます

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 を送信するには、入力値の List と出力パラメータの List を使用してWeb3j Function を初期化します。

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();

スマートコントラクト機能の完全なリストについては、https://docs.web3j.io/transactions.html[公式文書]を参照してください。

7. 結論

それでおしまい! Web3jを使ってJava Spring MVCアプリケーションを設定しました - ブロックチェーンの時間です。

いつものように、この記事で使われているコード例はhttps://github.com/eugenp/tutorials/tree/master/ethereum/src/main/java/com/baeldung/web3j[GitHub]にあります。