Ich habe versucht, der web3js
Dokumentation zu folgen, aber sie erwähnt Dinge, die nicht in Javascript nativ sind, wie "Buffer", also habe ich eine Bibliothek namens gefunden, mit der ethereumjs-tx
ich das verwenden kann.
Meine HTML-Seite zum Testen enthält Skripte zum Importieren web3js-1.0.0
undbrowser-ethereumjs-tx.js
Ich verwende Infura als meinen Web3-Provider
Hier ist meine Funktion, wobei Adressen und private Schlüssel aus Sicherheitsgründen entfernt wurden:
async function transferTokens(){
// example: https://ethereum.stackexchange.com/questions/24828/how-to-send-erc20-token-using-web3-api
// the ABI of the erc20
var abi;
// the token address for the specific token
var tokenAddr;
// instantiate the token contract using the ABI and the Contract Address.
var tokenContract = new web3.eth.Contract(abi, tokenAddr);
// who has the tokens to be sent?
var sender;
// where are the tokens being sent?
var tokenRecipient = document.getElementById('tokenRecipient').value;
// how many tokens are being sent?
var tokenAmount;
// nonce
var count = web3.eth.getTransactionCount(sender);
//set a gas price for the transfer in GWei (I picked 30 arbitrarily).
var gasPriceGwei = 30;
var gasLimit = 400000; // arbitrary, I know it's higher than needed
//Creating a raw Tx...
var rawTransaction = {
"from": sender,
"nonce": "0x" + count.toString(16),
"gasPrice": gasPriceGwei,
"gasLimit": gasLimit,
"to": tokenRecipient,
"value": "0x0",
"data": tokenContract.methods.transfer(tokenRecipient, tokenAmount).encodeABI(), // not sure wtf
"chainId": 0x04 //rinkeby network
};
// EthJS allows us a buffer function.
var privKey = new EthJS.Buffer.Buffer('[my_privKey]', 'hex');
var tx = new EthJS.Tx(rawTransaction);
tx.sign(privKey);
var serializedTx = tx.serialize();
// Comment out these three lines if you don't really want to send the TX right now
console.log(`Attempting to send signed tx: ${serializedTx.toString('hex')}`);
var receipt = web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'));
console.log(`Receipt info: ${JSON.stringify(receipt, null, '\t')}`);
}
Nichts passiert. Die Konsole loggt:
TEST.html:134 Attempting to send signed tx: [a Tx that is 334 characters long]
TEST.html:136 Receipt info: {}
transferTokens
Wenn ich versuche, eine andere Funktion (von der ich weiß, dass sie funktioniert) in Konsolenprotokolle einzufügen , werden sie nie protokolliert. Vermutlich wird die Funktion aus irgendeinem Grund nie ausgeführt. Meine Arbeitsfunktion ist:
tokenContract.methods.balanceOf(sender).call(function(err, bal){
console.log("LOG X");
if(!err){
bal = web3.utils.fromWei(bal, 'ether');
console.log("sender bal: "+bal);
document.getElementById('balBeforeSending').innerHTML
= "The balance of "+ document.getElementById('tokenTransfer').options[document.getElementById('tokenTransfer').selectedIndex].innerHTML
+ " before sending " + sender + " was: "
+ bal;
}
else{
console.log("line 106");
console.error(err);
}
});
Ich habe es direkt vor der Zeile "Creating Raw Transaction" in der ursprünglichen Funktion platziert.
Ich hatte await
vorher sowohl die Zählung als auch die Quittung, aber sie wurden nie protokolliert, also dachte ich, ich würde sie entfernen. Das Programm steckte fest und wartete auf sie, bekam aber nie etwas zurück, also glaube ich nichts, nachdem das await
ausgeführt wurde.
Web3 1.0 ist noch nicht veröffentlicht, weshalb Sie möglicherweise einige Probleme haben. Siehe den Haftungsausschluss hier . Verwenden Sie stattdessen die API-Dokumente hier, um Ihre Transaktionen zu erstellen.
Und da Sie in der Zeile, in der Sie Daten für die Transaktion generiert haben, eine Frage hinzugefügt haben, müssten Sie in web3 0.xx so etwas tun, um die Daten korrekt zu codieren:
const data = contractInstance.methodName.getData(param1 [, param2, ...])
Benutzer19510
receipt = await ...
.John Murphy