Soweit ich gesehen habe, kosten Constant- und View-Funktionen Gas, um ausgeführt zu werden, da Rechenleistung involviert ist. Aber geth
erlaubt Ihnen, bis zu 50.000 Gas zu verbrauchen, ohne zu fragen. Ist das richtig? Hat Metamask ein ähnliches Limit für seine Knoten?
Ich bin mir bei den Gaskostenschwellen für verschiedene Kunden nicht 100% sicher. Ich würde eher denken, dass alles nördlich von Null eine Benutzerbestätigung erfordert. Es wäre kein streng durchgesetztes Detail auf Protokollebene.
Ich bin mir sicher, dass wirklich schreibgeschützte Funktionen ohne Benutzerbestätigung aufgerufen werden können, und 50.000 ist nichts Besonderes. Sie würden ohne Einwände bis zum Block laufen gasLimit
(etwa 7 Millionen zum Zeitpunkt des Schreibens).
Wenn ich zwischen den Zeilen lese, vermute ich vielleicht eine kleine Verwirrung über die Feinheiten von constant
Funktionen und Gas.
Konstant, Aussicht und pur kosten kein Benzin, aber ...
constant
Funktionen werden auf der Hardware des lokalen Knotens unter Verwendung einer eigenen Kopie der Blockchain ausgeführt. Dadurch werden die Aktionen von Natur aus schreibgeschützt, da sie niemals tatsächlich an das Netzwerk gesendet werden.
... gibt es Einzelheiten.
Gas wird benötigt und Gas wird berechnet. Es gibt Szenarien, in denen es wichtig ist, und andere, in denen es nicht so ist. Die Szenarien, auf die es ankommt, werden durch die Buchhaltung abgedeckt.
Zum Beispiel eine constant
Funktion, die das verbleibende Gas nach getaner Arbeit zurückgibt.
Es spielt normalerweise keine Rolle
Es spielt keine Rolle, wenn eine Funktion einfach constant
von einem Client aufgerufen wird. Es wird nichts an das Netz gesendet und obwohl Gas gezählt wird, gibt es keine Zustandsänderung. Der Knoten verwendet seine eigene CPU und seine eigene Kopie der Blockchain, um seine eigenen Schlussfolgerungen zu ziehen. Am Ende wird der Zustand nicht aktualisiert und auf der Konsens-Blockchain-Ebene ändert sich nichts, das ist also so, als würde man die Ergebnisse verwerfen.
Ein gar nicht so ungewöhnlicher Fall
Stellen Sie sich eine Kette von Vertragsfunktionen vor, die Funktionen in anderen Verträgen aufrufen. Jemand könnte eine Transaktion unterzeichnen und an senden contract.doSomething()
. Dies ist eine Zustandsänderungstransaktion, die an das Netzwerk gesendet wird. Wir erwarten, dass es Benzin kostet.
Angenommen, inside function doSomething()
ist eine schreibgeschützte Nachricht an einen anderen Vertrag. otherContract.getSomething()
. Angenommen, das ist eine constant
Funktion. Das ist nicht besonders ungewöhnlich. Vielleicht muss es nur etwas aus einer Referenztabelle lesen, die von einem anderen Vertrag gehalten wird.
In diesem Zusammenhang bedeutet die Verwendung von "lokalen" Ressourcen lokal auf der Maschine, die die Transaktion verifiziert. Jeder muss die signierte Transaktion verifizieren ... also ... jeder muss die constant
Funktion ausführen. Die Miner und Knoten müssen alle die constant
Funktion ausführen, um herauszufinden, wie sie reagiert, damit sie die von der signierten Transaktion angeforderte Statusaktualisierung verarbeiten können.
In diesem Fall ist die Gasabrechnung für die constant
Funktion relevant. Wenn die Flusssteuerung zum aufrufenden Vertrag zurückkehrt, ist etwas Gas von der constant
Funktion verbraucht worden und die Verarbeitung wird fortgesetzt. Die Kosten der constant
Funktion werden in der Endabrechnung ausgewiesen.
Um es umzudrehen und es anders auszudrücken ... Wir können constant
Miner und Nodes nicht dazu bringen, ohne Bezahlung schwere Lasten zu heben.
Ich hoffe es hilft.
Merunas Grincalaitis