Ich versuche, meinen Smart Contract zu optimieren und breche auf, wo das Gas ausgegeben wird.
Jede Ausführung für eine Funktion kostet mich etwa 5 $ an Benzin. Ich habe mir Etherscan angesehen und in den internen txs wird ein Wert von 5 $ angezeigt, der für meinen Oraclize-Aufruf an die Oraclize-Adresse gesendet wurde (nur ein URL-Aufruf).
Schicke ich wirklich so viel Gas an Oraclize oder ist der Wertrechner von Etherscan für interne TX's inklusive Speicherkosten in der Funktion, die den Oraclize-Aufruf platziert? Bei meinem Oraclize-Aufruf habe ich 800000 für Gas in den benutzerdefinierten Parameter eingegeben.
Danke für jede Klarstellung.
Die Oraclize-API enthält eine Hilfsfunktion namens oraclize_getPrice
. Es erwartet zwei Parameter, der erste ist die Datenquelle, die Sie abfragen, zum Beispiel "URL" oder "computation" , und der zweite ist das Gaslimit, das Sie Oraclize zur Verfügung stellen, um Ihre __callback
. Es gibt den Wei-Betrag als Typ 'uint' zurück, den Ihre Abfrage kosten wird, und nimmt es so aus Ihrem Vertrag heraus, wenn Sie anrufen oraclize_query
.
Es wird berechnet, indem Sie Ihr geliefertes Gaslimit (in Ihrem Fall 800000) nehmen und es mit dem Gaspreis multiplizieren, den Sie möglicherweise angegeben haben oder nicht. Wenn Sie über kein benutzerdefiniertes Limit festgelegt haben, oraclize_setCustomGasPrice
ist es standardmäßig 20gwei
. Anschließend wird der Grundpreis des von Ihnen durchgeführten Abfragetyps, in diesem Fall "URL", zuzüglich etwaiger zusätzlicher Gebühren für einen Nachweistyp hinzugefügt ( Sie können die Aufschlüsselung hier sehen ). Die Gebühren werden in Wei anhand des aktuellen USD/ETH-Wechselkurses berechnet.
Berechnen Sie nur die Gaskosten Ihrer Gebühr (wie Sie es in Ihrer Antwort getan haben):
800000 gasLimit * 20e8 gasPrice = 0.016 ETH
Was Sie bei den aktuellen ETH-Preisen sehen können, ist der weitaus größere Teil der Gebühr von 5 $ (~ 90 %), die Sie sehen, um Ihren Vertrag zu verlassen. Und als solches ist es unerlässlich , dass Sie Ihre __callback
(und tatsächlich jede Funktion in Solidity) so gaseffizient wie möglich gestalten!
W/r/t sich von Oraclize abzuwenden, das ist natürlich Ihr Vorrecht. Sie sollten die Gaspreise Ihrer Vertragsfunktionen immer noch feinabstimmen, da diese unabhängig von Ihnen oder den Benutzern Ihres Smart-Vertrags bezahlt werden müssen.
Aber was Oraclize als Service anbietet, ist ein vertrauensloses Modell, bei dem Sie Oraclize über die bereitgestellten Beweistypen überhaupt nicht vertrauen müssen. Besser noch, Sie können dieser Vertrauenslosigkeit einen Wert beimessen. Wenn Sie sich beispielsweise für den TLS_Notary-Beweis entscheiden, verlassen Sie sich auf eine AWS-Instanz, die Kosten für das Hacken/Brechen/Ändern sind dann quantifizierbar . Das bedeutet, dass Sie wissen, wie viel Ihr von Oraclize abhängiger Vertrag „sicher“ ist, was die Anreize betrifft.
Sie können natürlich absolut Ihre eigenen rollen, aber sollten Sie anfangen, dieses Maß an quantifizierbarer Vertrauenslosigkeit zu fordern und damit beginnen, die dafür erforderlichen Strukturen zu implementieren, werden Sie diese Gebühr von 0,05 c$ vielleicht bald zu schätzen wissen!
Die Antwort ist, dass es genau ist, wie viel Wert Sie an Oraclize senden, und nicht nur, wie viel Wert in der Funktion verwendet wurde.
Ich habe mir die Oraclize-Dokumentation angesehen. und sie verwenden gasPrice von 20 Gwei und ich lege ein benutzerdefiniertes gasLimit von 800000 fest. Oraclize kann nicht verwendetes Gas nicht zurückerstatten, also nehmen sie alles.
Also 20 Gwei * 800000 Wei = 0,016 ETH. Die Lösung wäre, den gasPrice von 20 Gwei oder gasLimit auf einen niedrigeren Wert zu ändern oder Oraclize nicht zu verwenden.
Savard
Savard