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 "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
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.
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