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つの方法があります。

  1. 公式のSolidityコンパイラ。
  2. Truffle (スマートコントラクトをテスト、展開、および管理するための抽象化スイート)。

この記事では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. トランザクションの送信

ContractFunctionsを使用してTransactionを送信するには、Web3j FunctionListで初期化します。入力値と出力パラメータのリスト

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から入手できます。