[JAVA] Überprüfen Sie, ob Ethereum-Transaktionen nicht im Block enthalten sind

Artikelinhalt

Ich habe einen Artikel geschrieben, der web3j verwendet, um eine signierte Transaktion zu veröffentlichen, aber auf diese Weise wurde die Transaktion nicht in den Block eingefügt.

Signierte Transaktion mit Web3j senden

Ich werde die Korrekturmethode einschließlich der Bestätigungsmethode verlassen.

Überprüfen Sie den Transaktionspool

Überprüfen Sie "txpool" in der JavaScript-Konsole von 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)
}

Der Punkt hier ist "in der Warteschlange". Wenn eine Transaktion erstellt wird, wird sie in die Warteschlange gestellt, verschiedene Prüfungen wie die Signaturprüfung werden durchgeführt. Wenn bei der Prüfung kein Problem auftritt, wird sie auf "Ausstehend" verschoben und wartet darauf, dass sie im Block gespeichert wird.

Es wurde auf dieser Seite ausführlich erklärt. Informationen zu ausstehenden Transaktionen und Transaktionspool von Ethereum

So senden Sie eine signierte Transaktion mit Web3j

Signierte Transaktion mit Web3j senden Ich habe die sendSignedTransaction geändert, die ich in diesem Artikel geschrieben habe.

SendTransaction.java


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

      TransactionReceipt receipt = null;
      try {
        //Holen Sie sich Nonce-Wert
        EthGetTransactionCount ethTransactionCount =
            web3j.ethGetTransactionCount(credentials.getAddress(), DefaultBlockParameterName.PENDING).send();
        BigInteger nonce = ethTransactionCount.getTransactionCount();

        // "eth_sendTransaction"Erstellen Sie ein Objekt, das an das Argument von übergeben werden soll
        RawTransaction rawTransaction = RawTransaction.createEtherTransaction(
            nonce,                        // nonce
            BigInteger.valueOf(100),     // gasPrice
            BigInteger.valueOf(4712388), // gasLimit
            toAddress,                    // to
            BigInteger.valueOf(1010000)  // value
            );

        //Unterzeichnen Sie die Transaktion
        byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
        String hexValue = Numeric.toHexString(signedMessage);

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

        //Senden einer Transaktion
        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;
  }

Der Fehler bestand darin, dass der in RawTransaction festgelegte Nonce-Wert ein fester Wert war, sodass er bei der Transaktionsprüfung abgefangen wurde und in der Warteschlange blieb.

Ich habe die Transaktionsinformationen sofort nach dem Senden von RawTransaction überprüft.

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
}

Transaktionen haben sich in ausstehenden angesammelt. Ich habe es auch nach dem Bergbau überprüft.

> 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
}

In einem Block gespeichert und anstehend auf 0 geändert.

Impressionen

Mir wurde klar, dass es notwendig ist, den Inhalt der Transaktion und den Ablauf von der Erstellung der Transaktion bis zur Aufnahme in den Block genau zu verstehen.

Recommended Posts

Überprüfen Sie, ob Ethereum-Transaktionen nicht im Block enthalten sind
Wenn die Submodul-Assets nicht im Play Framework gefunden werden
Was tun, wenn die Änderungen nicht in der JAR-Manifestdatei berücksichtigt werden?
Der Zeilenumbruch des eingegebenen Textes wird in der Ansicht nicht angezeigt
Was tun, wenn die Änderungen im Servlet nicht berücksichtigt werden?
Beurteilen Sie, ob die zu vergleichenden Zeichenfolgen in Java identisch sind
Was sind die Regeln in JUnit?
Was tun, wenn das Präfix c in JSP nicht gebunden ist?
Verarbeitung, um zu überprüfen, ob "einige Felder dupliziert sind" aus der Bean-Liste
darf nicht in der for-Anweisung zurückgegeben werden
Hinzufügen, wenn nicht in Set, Fehlermeldung, wenn
[Rails] Wenn CSS in collection_select nicht angewendet wird, prüfen Sie, ob Sie die Klasse angeben können.