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?
„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.
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 - constant
Funktionen 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.
In Solidity call
ist 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 .gas
verwendet 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.
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.
Rob Hitchens
Satoshi Nakanishi