Ich versuche, eine signierte Transaktion mit web3 1.0 und Infura.io über den Browser zu senden. Wenn ich es ausführe, bekomme ich keine Fehler, aber die Transaktion trifft nie auf die Blockchain, also bin ich verwirrt darüber, was passiert.
*Siehe das Protokoll unten, um die Details anzuzeigen
<script src="https://cdn.jsdelivr.net/gh/ethereum/web3.js@1.0.0-beta.34/dist/web3.min.js"></script>
<script src="https://cdn.rawgit.com/ethereumjs/browser-builds/2fb69a714afe092b06645286f14b94f41e5c062c/dist/ethereumjs-tx.js"></script>
Hier ist das Skript -
var web3 = new Web3();
if(web3.setProvider(new Web3.providers.HttpProvider('https://mainnet.infura.io/v3/API KEY'))){
web3.eth.net.isListening();
}
// Get Contract ABI
var abi = JSON.parse('MY ABI')
// Define Variable for Contract ABI
var AK = new web3.eth.Contract(abi);
// Set Contract Address
AK.options.address = "CONTRACT ADDRESS";
// Set amount
var amountToSend = 100;
var weiAmount = amountToSend * 1e18;
// create transaction - to address, amount
var data = AK.methods.transfer("SEND TO ADDRESS", weiAmount).encodeABI();
// object to hold the transaction data From Address
web3.eth.getTransactionCount("SEND FROM ADDRESS").then(count => {
// Set transaction params
let privateKey = new EthJS.Buffer.Buffer("FROM ADDRESS PRIVATE KEY", "hex")
web3.eth.getGasPrice().then(gasPrice => {
let txParams = {
nonce: web3.utils.toHex(count),
gasLimit: web3.utils.toHex(250000),
value: web3.utils.toHex(0),
gas: web3.utils.toHex(1000000),
gasPrice: web3.utils.toHex(web3.eth.gasPrice),
to: "TO ADDRESS",
from: "FROM ADDRESS",
data: data
}
// Sign Transaction
let tx = new EthJS.Tx(txParams)
tx.sign(privateKey)
let serializedTx = tx.serialize().toString('hex')
var receipt = web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'));
console.log('serializedTx:', serializedTx)
console.log('Receipt:', receipt)
});
});
Wenn ich das Skript ausführe, protokolliert es -
Promise {<pending>, _events: undefined, emit: ƒ, on: ƒ, once: ƒ, off: ƒ, …}
addListener: ƒ (t,e,r)
emit: ƒ (t,e,r,i,o,a)
listeners: ƒ (t,e)
off: ƒ (t,e,r,i)
on: ƒ (t,e,r)
once: ƒ (t,e,r)
removeAllListeners: ƒ (t)
removeListener: ƒ (t,e,r,i)
_events: undefined
__proto__: Promise
[[PromiseStatus]]: "pending"
[[PromiseValue]]: undefined
Das sendSignedTransaction(...)
gibt ein Promise zurück (dasselbe wie getTransactionCount(...)
oben). Eine Möglichkeit, das Ergebnis zu erhalten, besteht darin, Folgendes zu tun:
web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'))
.then( receipt => {
console.log('Receipt:', receipt);
})
.catch(e => {
console.error('Error broadcasting the transaction: ', e);
});
Die Transaktion wird nicht sofort abgebaut. Es dauert zwischen einigen Sekunden und mehr als einer Stunde (abhängig von Ihrem gas_price und der Netzwerküberlastung), bis es abgebaut und das Ergebnis auf der Konsole ausgegeben wird.
Sie können den Transaktions-Hash abrufen , bevor Sie ihn senden mit:
const tx_hash = tx.hash().toString('hex')
Und suchen Sie einige Sekunden/Minuten nach der Übertragung nach dem Transaktionsstatus auf Etherscan. Wenn die tx gültig ist, sollte sie als ausstehend/bestätigt angezeigt werden.
Ok, also habe ich es endlich verstanden. Ich musste 2 Probleme beheben, ich musste die Vertragsadresse hinzufügen
"to: "TO ADDRESS",
Auch hinzugefügt
chainId: web3.utils.toHex('4'),
zu den txParams und jetzt funktioniert alles wie es soll.
Ich hatte hier das gleiche Problem und fand ein vorübergehendes Problem:
Das Problem war mit dem web3-Pach, ich habe die Version "1.0.0-beta.52" verwendet. Also kehrte ich zu "1.0.0-beta.37" zurück und alles funktionierte.
Ich weiß nicht, warum es mit der neuen Version nicht funktioniert hat ... übrigens
Ryan D
Tudor Constantin
.catch()
Methode ausgelöst? Haben Sie versucht, auf Etherscan nach dem tx_hash zu suchen?Ryan D
Tudor Constantin
Ryan D