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