Ich schreibe einen intelligenten Vertrag, der die Funktion hat, Ether (für Gasgeld) und Token zu verteilen. Die Funktion sieht so aus
function distribute(address to, uint256 token, uint256 gasMoney) payable onlyAuthorized returns (bool sucess) {
createToken(to, token);
to.transfer(gasMoney);
currentContractBalance -= gasMoney;
return true;
}
Wenn ich jedoch die Funktion über web3 py as aufrufe
mycontract.transact().distribute(myAddress, numberOfTokens, gasMoney)
es gibt eine Fehlermeldung zurück
ValueError: Contract does not appear to be deployable within the current network gas limits. Estimated: 4704624. Current gas limit: 4700036
Ich konnte den Fehler von meiner Seite aus nicht herausfinden. Ich habe das Standardkonto zu der Adresse gemacht, die zum Bereitstellen des Vertrags verwendet wurde.
ValueError: Der Vertrag scheint innerhalb der aktuellen Netzwerkgasgrenzen nicht einsetzbar zu sein. Geschätzt: 4704624. Aktuelles Gaslimit: 4700036
Dieser Fehler bedeutet, dass createToken
es sich um eine sehr schwere Funktion handelt. Einige frühere Kommentare schlugen vor, das Gaslimit zu erhöhen, aber das wird Ihnen hier nicht helfen. Das Blockgaslimit ist zu niedrig, um Ihre Transaktion auszuführen. Das bedeutet, dass selbst wenn Sie Ihr Gaslimit auf 10 Millionen setzen und keine anderen Transaktionen in einem Block enthalten sind, Ihre Transaktion immer noch nicht passen würde. (Wenn ich hier "passen" sage, meine ich rechnerisch, nicht die Anzahl der Bytes)
Die einzigen Optionen, die Sie wirklich haben, sind 1) createToken in separate Teile aufzuteilen oder 2) es effizienter zu machen. Sie möchten es wahrscheinlich effizienter machen, weil 4,7 Millionen Benzin teuer sind ! Vor nicht allzu langer Zeit lag ein günstiger Gaspreis bei 4 Gwei. Zu diesem Preis würde die Ausgabe der Transaktion (wenn es überhaupt möglich wäre) 0,0188 Ether kosten, was 6,20 $ zum heutigen ETH/USD-Preis entspricht.
Im Moment ist Benzin sehr billig, also würde es Sie nur etwa 0,155 $ für jede Transaktion kosten, aber das wird vielleicht nicht lange dauern.
Wiederholung 122442
Wiederholung 122442