Wer bekommt die Gebühr vom Vertragsgespräch?

Grundsätzlich müssen Sie keine Gebühr für den Vertragsanruf zahlen, aber wenn eine Vertragsmethode viel Arbeit macht, müssen Sie dem Vertragsanruf Gas hinzufügen, um einen DoS-Angriff wie diesen zu verhindern:

Vertrag.Methode.Aufruf ({Gas: 1000000000})

Wer bekommt diese Gebühr?

Ich denke, das wird meistens hier beantwortet: ethereum.stackexchange.com/questions/11/… . Ich könnte hinzufügen, dass Ethereum unverbrauchtes Gas zurückgibt. In diesem Sinne ist es eine Obergrenze für die Ausführung. Ein weiteres kleines Detail ist, dass, wenn die Transaktion aus irgendeinem Grund wirft, anstatt erfolgreich ausgeführt zu werden, das Gas (alles) für immer zerstört wird.
Es sieht nicht nach der Antwort aus. Wer bekommt die Gebühr?

Antworten (2)

„Aufruf“ ist ein überladener Begriff, da es sich um eine Form des Vertragsaufrufs handelt (siehe Was ist der Unterschied zwischen einer Transaktion und einem Anruf? ) und davon abhängt, wo der Aufruf in Bezug auf die Ethereum Virtual Machine (EVM) durchgeführt wird.

Außerhalb der EVM (zB web3.js)

Die Frage contract.method.call({gas: 1000000000})befasst sich mit web3.js, das sich außerhalb von Solidity und EVM befindet.

Die web3.js-API ist web3.eth.call und wird für Solidity - constantFunktionen verwendet .

Niemand bekommt die Gebühr, weil der „Trockenlauf“ -Aufruf lokal für den Knoten ist, mit dem web3.js verbunden ist: Das Netzwerk und die Miner wissen nichts über diesen Aufruf.

Obwohl der Aufruf lokal ist, wird Gas immer noch „verbraucht“, und es ist immer noch möglich, dass Gas ausgeht oder (selbst) „DoS“ ausgeführt wird, wenn eine Solidity-Konstantenfunktion aufgerufen wird. Zum Beispiel, wie in Kann Soliditätskonstante Funktionen beliebig komplex sein? , Geth versorgt "nur" lokale Aufrufe mit 50 Millionen Gas:

if gas.Cmp(common.Big0) == 0 {
    gas = big.NewInt(50000000)
}

Um einen "Selbst-DoS" zu vermeiden, versuchen Sie mehr Gas wiecontract.method.call({gas: 999000000})

Ein genauerer Grund, warum niemand die Gebühr erhält, ist, dass Gas gemessen wird und die Messung sich von Gebühren unterscheidet , Auszug:

In Bitcoin erfolgt die Messung mit Bytes: die Anzahl der Bytes in der Transaktion. In Ethereum muss die Berechnung auch gemessen werden, da eine kleine Menge Code immer noch ein Programm sein könnte, das ewig läuft. Zählerberechnung ist einer der Gründe für Gas. Aber Benzin zu haben bedeutet nicht, Gebühren zu verlangen.

Zum Beispiel könnte in einer privaten Kette jedes Konto X Gas pro Tag haben, oder jedes Konto könnte Y Gas pro Transaktion haben, oder ein anderes Schema. Auf der anderen Seite bedeutet das Haben von Gebühren nicht, dass Benzin benötigt wird: Gebühren können auf unterschiedlichen Zählern basieren, z. B. Bytes. Die Sicherheit in einer öffentlichen Blockchain erfordert sowohl Gas als auch Gebühren, während die Alternativen eher für private Ketten gelten (z. B. kann ein System, bei dem jedes Konto X Gas pro Tag hat, in einer öffentlichen Kette, in der jeder ein Konto erstellen kann, von Sybil angegriffen werden). .

Ein Vertragsaufruf mit einem web3.eth.call wird immer noch gemessen, obwohl keine Gebühr anfällt, und deshalb ist immer noch Gas im Spiel.

Innerhalb der EVM (z. B. Solidity)

In Solidity callist es ein ganz anderes Biest und eine Low-Level-Funktion für einen Vertrag, um einem anderen Vertrag eine Nachricht zu senden, wie in Was bedeutet die „Anruf“-Funktion von Solidity erklärt?

Eine Sache zu beachten ist, wann .gasverwendet wird, zum Beispiel:

contract.call.gas(1000)(bytes4(sha3("methodName()")))

es bedeutet, dass der Unterrufaufruf auf 1000 Gas begrenztmethodName wird : es bedeutet nicht, 1000 mehr Gas bereitzustellen .methodName

Wenn die Solidity im Kontext eines lokalen Aufrufs „Trockenlauf“ ausgeführt wird, geht die Transaktionsgebühr an niemanden. Wenn der Solidity in einer Transaktion ausgeführt wird, geht die Gebühr immer an den Miner des Blocks, auch wenn ein Out of Gas oder ein Ausführungsfehler jeglicher Art vorliegt.

Vieles verstehe ich immer noch nicht. Ich fragte nach außerhalb des EVM-Anrufs. Es wird gesagt, dass Gas immer noch "verbraucht" wird, aber niemand bekommt die Gebühr. Wenn das Gas verbraucht wird, wohin fließt die Gebühr? Verschwindet es? oder Sie müssen nur die Gebühr angeben, aber die Gebühr wird nicht gesendet oder geht an niemanden?
Wenn die Ausführung nicht mit der Blockchain interagiert, bleibt der Eth-Saldo des Transaktionsurhebers am Ende unverändert.
Wenn das Guthaben des Senders unverändert bleibt, was bringt es dann, das Gas im Methodenaufruf anzugeben? Warum heißt das "Gas wird verwendet"? Wenn das Gleichgewicht nicht geändert wird, hört es sich an, als würde kein Gas verbraucht.
Danke für die Fragen, ich habe diese Antwort aktualisiert, um die Messung zu erklären, und eine weitere hinzugefügt, von der ich hoffe, dass sie hilft: ethereum.stackexchange.com/a/10940/42
Vermutlich verstehe ich jetzt was du meinst. Was Sie mit "Gas wird verbraucht" gemeint haben, ist, dass der Gasparameter in der Anrufmethode angegeben werden muss, wenn Sie mehr als 50 Millionen Gas verbrauchen. Habe ich recht?
Sie haben Recht, Sie müssen angeben, ob mehr als 50 Millionen Gas für Geth vorhanden sind (Parität kann ein anderes Verhalten haben). Das ist der praktische Punkt, und das hilfreiche Konzept ist, dass das EVM für "Anrufe" immer noch über Gas zählt.

Für den Fall, dass die Transaktion erfolgreich ausgeführt wird, geht die eigentliche Gebühr an den Miner, der den Block löst. Um Redundanzen zu vermeiden, werde ich hier nur auf einige Details hinweisen: Wie sind die Transaktionsgebühren von Ethereum im Vergleich zu Bitcoin? . Das Fazit hier ist, dass die Gebühr in den meisten Fällen nicht 1000000000 beträgt, aber sie wird sie nicht überschreiten.

Im Falle eines Ausführungsfehlers wird das Gas für immer zerstört, sodass niemand es erhält.

Es muss auch erwähnt werden, dass im Fall von „call“ (im Gegensatz zu sendTransaction) die Ausführung lokal erfolgt und kein Gas kostet, sodass der Anrufer am Ende immer noch das zugesagte Gas hat. Die Verwendung von „call“ ist üblich für schreibgeschützte Vorgänge, die den Status nicht ändern, da dies schneller und kostenlos ist.

Die Verwendung von "Anruf" ist nicht immer kostenlos. Wie ich im ersten Beitrag geschrieben habe, müssen Sie das Gas hinzufügen, wenn die Methode viel Arbeit macht, auch wenn Sie den "Ruf" verwenden.
Ich verstehe, worauf du jetzt hinauswillst. Ich bin aufgeschlossen und neugierig. Wo finde ich eine Erklärung zum Anruf ist nicht immer kostenlos?
Ich denke, es gibt keine Erklärung, also fragt bitte Geth-Comitters.