Übertragen eines ERC-20 mit web3js 1.0.0

Ich habe versucht, der web3jsDokumentation 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-txich das verwenden kann.

  • Meine HTML-Seite zum Testen enthält Skripte zum Importieren web3js-1.0.0undbrowser-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:  {}

transferTokensWenn 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 awaitvorher 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 awaitausgeführt wurde.

Wenn Sie mit einem tatsächlichen öffentlichen Netzwerk verbunden sind, ist Ihr Gaspreis meiner Meinung nach viel zu niedrig, um eine Transaktion zu fördern. Sie passieren 30 Wei, obwohl es ungefähr 1 oder 2 Gwei (2000000000 Wei) sein sollten. Und ja, das sollte man haben receipt = await ....
@smart Danke. Ich habe das behoben und es tatsächlich zum Laufen gebracht, basierend auf einer früheren Antwort von hier mit ihrem EthJS, damit ich einen Puffer und einen TX verwenden kann. Ich weiß von Ihrer Website und hier, dass Sie sehr sachkundig und hilfreich sind, also frage ich mich, ob Sie sich einen besseren Weg ausdenken, wie ich Buffer und Tx dazu bringen könnte, in meinem Browser-Skript zu arbeiten. Ich sage allen meinen Kollegen, dass ich von Stackexchange und programtheblockchain.com lerne. :)

Antworten (1)

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, ...])

Es gibt einige Funktionen, die unsere Anwendung benötigt und die nur in Version 1.0 verfügbar sind (z. B. das Erstellen von Brieftaschen), daher denke ich, dass ich in Zukunft v1.0 verwenden muss. Und um auf dem neuesten Stand zu sein, ist es nicht eine gute Idee, so schnell wie möglich zu 1.0 zu gehen? Vielen Dank für Ihre Antwort.
Das hängt meiner Meinung nach davon ab, ob Sie etwas brauchen, das jetzt funktioniert oder nicht, und ob Sie glücklich sind, der Timeline von web3 1.0 ausgeliefert zu sein. Können Sie mit Web3 0.x auf ein MVP schießen und parallel dazu die 1.0.0-Funktionalität entwickeln, um für die Veröffentlichung bereit zu sein?