Help us understand the problem. What is going on with this article?

Ethereum トランザクションの送信方法sendとsendAsyncの違い

記事の内容

EthereumのJavaライブラリ「Web3j」を使って署名付きトランザクションを送信する方法でsendメソッドとsendAsyncメソッドがあります。
この記事でsendを使ったトランザクションの送信方法を記載しましたが、sendAsyncを使った方法も実装してみたので記録として残します。
Web3jを使って署名付きトランザクションを送信する

環境

  • geth:1.9.0-stable
  • web3j:4.5.0

実装

コードです。

SendTransaction.java
 public TransactionReceipt sendTransactionAsync(Credentials credentials, String password, String toAddress, long value) {

    CompletableFuture<TransactionReceipt> receipt = null;
      try {
        // トランザクションの生成
        // "personal_unlockAccount"のリクエストを送信し、レスポンスを受信する
        PersonalUnlockAccount unlockAccountResponse = web3j.personalUnlockAccount(
              credentials.getAddress(), // アドレス
              password  // パスワード
              ).send();

        // アンロックが成功していたら、Etherを送金する
        if (unlockAccountResponse.getResult()) {
          // Transactionを送信する。
          receipt = Transfer.sendFunds(web3j, credentials, toAddress, BigDecimal.valueOf(value), Unit.ETHER).sendAsync();
        }

          return receipt.get();
        }catch(IOException | TransactionException ex) {
          ex.printStackTrace();
        }catch(Exception ex) {
          ex.printStackTrace();
        }
      return null;
    }

違いとしては以下の部分になります。

SendTransaction.java
receipt = Transfer.sendFunds(web3j, credentials, toAddress, BigDecimal.valueOf(value), Unit.ETHER).send();
SendTransaction.java
receipt = Transfer.sendFunds(web3j, credentials, toAddress, BigDecimal.valueOf(value), Unit.ETHER).sendAsync();

sendの方はトランザクションがブロックに取り込まれるまで応答が返ってきません。
sendAsyncの方はトランザクションが送信された時点で応答が返ってくるため、ブロックに取り込まれるのを待つ必要がありません。

ただし、sendAsyncの実行結果として得られる「CompletableFuture」のgetメソッドを使用し、TransactionReceiptを取得する際はブロックに取り込まれるまで応答が返ってきません。

トランザクションがブロックに取り込まれるのを待つ必要がない場面ではsendAsyncを使うほうが良さそうです。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away