[JAVA] Vérifiez si les transactions Ethereum ne sont pas incluses dans le bloc

Contenu de l'article

J'ai écrit un article qui utilise web3j pour publier une transaction signée, mais de cette façon, la transaction n'a pas été renseignée dans le bloc.

Envoyer la transaction signée via Web3j

Je laisserai la méthode de correction y compris la méthode de confirmation.

Vérifier le pool de transactions

Cochez «txpool» dans la console JavaScript de geth.

> txpool
{
  content: {
    pending: {
      0x945Cd603A6754cB13C3D61d8fe240990f86f9f8A: {
        19: {...}
      }
    },
    queued: {
      0x66B4e7bE902300F9a15D900822Bbd8803Be87391: {
        1: {...},
        100: {...},
        5: {...}
      },
      0x945Cd603A6754cB13C3D61d8fe240990f86f9f8A: {
        100: {...}
      }
    }
  },
  inspect: {
    pending: {
      0x945Cd603A6754cB13C3D61d8fe240990f86f9f8A: {
        19: "0xf5ad7542173e8944D1aE16B4394eAA34cfdA4814: 0 wei + 200000 gas × 500 wei"
      }
    },
    queued: {
      0x66B4e7bE902300F9a15D900822Bbd8803Be87391: {
        1: "0x945Cd603A6754cB13C3D61d8fe240990f86f9f8A: 0 wei + 4712388 gas × 100 wei",
        100: "0x945Cd603A6754cB13C3D61d8fe240990f86f9f8A: 0 wei + 4712388 gas × 100 wei",
        5: "0x945Cd603A6754cB13C3D61d8fe240990f86f9f8A: 0 wei + 4712388 gas × 100 wei"
      },
      0x945Cd603A6754cB13C3D61d8fe240990f86f9f8A: {
        100: "0x66B4e7bE902300F9a15D900822Bbd8803Be87391: 1000000000000000 wei + 200000 gas × 100 wei"
      }
    }
  },
  status: {
    pending: 1,
    queued: 4
  },
  getContent: function(callback),
  getInspect: function(callback),
  getStatus: function(callback)
}

Le point ici est "en file d'attente". Lorsqu'une transaction est créée, elle est mise en file d'attente, diverses vérifications telles que la vérification de signature sont effectuées, et s'il n'y a pas de problème avec la vérification, elle passe à "en attente" et attend qu'elle soit stockée dans le bloc.

Cela a été expliqué en détail sur ce site. À propos des transactions en attente et du pool de transactions d'Ethereum

Comment envoyer une transaction signée à l'aide de Web3j

Envoyer la transaction signée via Web3j J'ai modifié le sendSignedTransaction que j'ai écrit dans cet article.

SendTransaction.java


  public TransactionReceipt sendSignedTransaction(Credentials credentials, String password, String toAddress) {

      TransactionReceipt receipt = null;
      try {
        //Obtenez une valeur nonce
        EthGetTransactionCount ethTransactionCount =
            web3j.ethGetTransactionCount(credentials.getAddress(), DefaultBlockParameterName.PENDING).send();
        BigInteger nonce = ethTransactionCount.getTransactionCount();

        // "eth_sendTransaction"Créez un objet à passer à l'argument de
        RawTransaction rawTransaction = RawTransaction.createEtherTransaction(
            nonce,                        // nonce
            BigInteger.valueOf(100),     // gasPrice
            BigInteger.valueOf(4712388), // gasLimit
            toAddress,                    // to
            BigInteger.valueOf(1010000)  // value
            );

        //Signez la transaction
        byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
        String hexValue = Numeric.toHexString(signedMessage);

        EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).send();
        String transactionHash = ethSendTransaction.getTransactionHash();

        //Envoi d'une transaction
        Optional<TransactionReceipt> transactionReceipt = null;
        int retry = 0;

        if(transactionHash != null) {
          do {
            System.out.printf("%3d checking if transaction " + transactionHash + " is mined....\n" ,retry);
            EthGetTransactionReceipt ethGetTransactionReceiptResp = web3j.ethGetTransactionReceipt(transactionHash).send();
            transactionReceipt = ethGetTransactionReceiptResp.getTransactionReceipt();

            Thread.sleep(3000);
            retry++;
          }while(!transactionReceipt.isPresent() && retry < 100);
        } else {
          System.out.println("Transaction Send failed...");
          System.out.println("Message:" + ethSendTransaction.getError().getMessage());
          System.out.println("Data   :" + ethSendTransaction.getError().getData());
        }
      }catch(IOException | InterruptedException ex) {
        ex.printStackTrace();
      }catch(Exception ex) {
        ex.printStackTrace();
      }
    return receipt;
  }

L'erreur était que la valeur nonce définie dans RawTransaction était une valeur fixe, elle a donc été interceptée dans le processus de vérification des transactions et est restée dans la file d'attente.

J'ai vérifié les informations de transaction immédiatement après l'envoi de RawTransaction.

INFO [09-17|20:52:21.455] Submitted transaction                    fullhash=0x84b89a096fcb1a5381319cf08348f633ebe2dc2ef93ba48b0c05d5b460110970 recipient=0x66B4e7bE902300F9a15D900822Bbd8803Be87391
> eth.getTransaction("0x84b89a096fcb1a5381319cf08348f633ebe2dc2ef93ba48b0c05d5b460110970")
{
  blockHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  blockNumber: null,
  from: "0x945cd603a6754cb13c3d61d8fe240990f86f9f8a",
  gas: 4712388,
  gasPrice: 100,
  hash: "0x84b89a096fcb1a5381319cf08348f633ebe2dc2ef93ba48b0c05d5b460110970",
  input: "0x",
  nonce: 24,
  r: "0xd6bb90deea18af081795bc335c3323389c830721d5d7db54f6ef6c19f3425358",
  s: "0x4e99740c21f5ef2f3debafcff0256340dfff07e00a86801eb90d72804439d602",
  to: "0x66b4e7be902300f9a15d900822bbd8803be87391",
  transactionIndex: 0,
  v: "0x1c",
  value: 1010000
}
> txpool.status
{
  pending: 1,
  queued: 0
}

Les transactions se sont accumulées en attente. Je l'ai vérifié même après l'exploitation minière.

> eth.getTransaction("0x84b89a096fcb1a5381319cf08348f633ebe2dc2ef93ba48b0c05d5b460110970")
{
  blockHash: "0x3a150aebfffbe81804f4d5b193e3a22aea79654c3bd5c53d2a3df8d7d8417c34",
  blockNumber: 3066,
  from: "0x945cd603a6754cb13c3d61d8fe240990f86f9f8a",
  gas: 4712388,
  gasPrice: 100,
  hash: "0x84b89a096fcb1a5381319cf08348f633ebe2dc2ef93ba48b0c05d5b460110970",
  input: "0x",
  nonce: 24,
  r: "0xd6bb90deea18af081795bc335c3323389c830721d5d7db54f6ef6c19f3425358",
  s: "0x4e99740c21f5ef2f3debafcff0256340dfff07e00a86801eb90d72804439d602",
  to: "0x66b4e7be902300f9a15d900822bbd8803be87391",
  transactionIndex: 0,
  v: "0x1c",
  value: 1010000
}

> txpool.status
{
  pending: 0,
  queued: 0
}

Stocké dans un bloc et en attente changé à 0.

Impressions

Je me suis rendu compte qu'il était nécessaire de comprendre précisément le contenu à définir dans la transaction et le flux depuis la création de la transaction jusqu'à l'inclusion dans le bloc.

Recommended Posts

Vérifiez si les transactions Ethereum ne sont pas incluses dans le bloc
Si les éléments du sous-module ne sont pas trouvés dans Play Framework
Que faire si les modifications ne sont pas reflétées dans le fichier manifeste JAR
Le saut de ligne du texte saisi n'est pas affiché dans la vue
Que faire lorsque les modifications du servlet ne sont pas reflétées
Juger si les chaînes de caractères à comparer sont les mêmes en Java
Quelles sont les règles de JUnit?
Que faire lorsque le préfixe c n'est pas lié dans JSP
Traitement pour vérifier si "certains champs sont dupliqués" à partir de la liste des haricots
ne doit pas retourner dans l'instruction for
Ajouter si non dans l'ensemble, message d'erreur si
[Rails] Si CSS n'est pas appliqué dans collection_select, vérifiez si vous pouvez spécifier la classe.