Mir ist bewusst, dass Pure/View-Funktionen bei einem einfachen "Anruf" kein Gas kosten. Aber was passiert, wenn ich eine Funktion habe, die den Vertragsstatus basierend auf dem Ergebnis der Pure/View-Funktion ändert? Muss ich Gas für die Pure/View-Funktionsschleife bezahlen, wenn ich einen "Send" mache?
In meinem Beispiel möchte ich eine Zahl in einem Array finden und den Index zurückgeben.
function indexOfUint(uint256[] _array, uint _value) public pure returns (uint256) {
bool exist;
for (uint i=0; i<_array.length;i++){
if(_array[i] == _value){
exist = true;
return i;
}
}
assert(exist == true);
}
Es gibt zwei Aussagen in https://github.com/ethereum/solidity/issues/992
das Schlüsselwort
view
wird für Funktionen eingeführt (es ersetztconstant
). Das Aufrufen einer Ansicht kann das Verhalten zukünftiger Interaktionen mit einem Vertrag nicht ändern. Das bedeutet, dass solche Funktionen keine verwenden könnenSSTORE
, keine Äther senden oder empfangen können und nur andere Ansichten oder reine Funktionen aufrufen können.das Schlüsselwort
pure
für Funktionen eingeführt wird, handelt es sich umview
Funktionen mit der zusätzlichen Einschränkung, dass ihr Wert nur von den Funktionsargumenten abhängt.SSTORE
Das bedeutet, dass sie , nicht verwendenSLOAD
, kein Ether senden oder empfangen, keine msg oder block verwenden und nur andere reine Funktionen aufrufen können.
Es bedeutet, dass Ansicht und reiner Vertragsstatus nicht geändert werden können. Wenn Sie den Vertragsstatus ändern müssen, müssen Sie pure
, view
Keywords entfernen.
function indexOfUint(uint256[] _array, uint _value) public pure returns (uint256) {
bool exist;
...
}
Die Funktion ändert den Vertragszustand nicht. exist
Variable speichert im Stack
Pure- und View-Funktionen verbrauchen kein Gas, wenn diese in Ihrem lokalen Knoten ausgeführt werden (oder dem Knoten, den Sie als local, infura, etherscan usw. verwenden). in solchen Fällen wird die Transaktion nicht gesendet.
Auf der anderen Seite, wenn die Transaktion an das Netzwerk gesendet wird (wie in Ihrem Fall), verbrauchen reine und Ansichtsfunktionen Gas.
Hoffe das hilft.
Ja, wenn Ihre Funktion den Zustand ändert, wird sie definitiv Gas verbrauchen.
Siehe hierzu: http://ethdocs.org/en/latest/contracts-and-transactions/account-types-gas-and-transactions.html#estimating-transaction-costs
Eine detailliertere Gaskostenanalyse basierend auf der Art des Betriebs: https://docs.google.com/spreadsheets/d/1m89CVujrQe5LAFJ8-YAUCcNK950dUzMQPMJBxRtGCqs/edit#gid=0
Bei Anrufen wird Gas nur dann berechnet, wenn es über einen Vertrag angerufen wird.
Wenn Sie eine Ansichtsfunktion aufrufen, wird sie lokal ausgeführt. Die Transaktion wird nicht übertragen. Es ist frei.
Aber wenn die Ansichtsfunktion von einem Vertrag aufgerufen wird. es von anderen ausgeführt wird, kann die Transaktion in der Blockchain aufgezeichnet werden.