Konstante Funktionen und Gas

Soweit ich gesehen habe, kosten Constant- und View-Funktionen Gas, um ausgeführt zu werden, da Rechenleistung involviert ist. Aber getherlaubt Ihnen, bis zu 50.000 Gas zu verbrauchen, ohne zu fragen. Ist das richtig? Hat Metamask ein ähnliches Limit für seine Knoten?

Antworten (1)

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 constantFunktionen und Gas.

Konstant, Aussicht und pur kosten kein Benzin, aber ...

constantFunktionen 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 constantFunktion, die das verbleibende Gas nach getaner Arbeit zurückgibt.

Es spielt normalerweise keine Rolle

Es spielt keine Rolle, wenn eine Funktion einfach constantvon 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 constantFunktion. 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 constantFunktion ausführen. Die Miner und Knoten müssen alle die constantFunktion 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 constantFunktion relevant. Wenn die Flusssteuerung zum aufrufenden Vertrag zurückkehrt, ist etwas Gas von der constantFunktion verbraucht worden und die Verarbeitung wird fortgesetzt. Die Kosten der constantFunktion werden in der Endabrechnung ausgewiesen.

Um es umzudrehen und es anders auszudrücken ... Wir können constantMiner und Nodes nicht dazu bringen, ohne Bezahlung schwere Lasten zu heben.

Ich hoffe es hilft.

Ich weiß nicht, wie Ethereum intern funktioniert, aber aus meiner Erfahrung, wenn Sie konstante Funktionen ausführen, erhalten Sie die Daten von Ihrem lokalen Knoten und führen diese Funktion lokal aus, Sie übertragen keine Informationen, sodass es kein Benzin kostet solange es den Zustand nicht ändert, weil man sagen könnte, dass eine Funktion konstant ist, aber intern den Zustand ändert, was falsch ist.