Gaskostenanruf vs. Senden für Pure/View-Funktionen

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);
}

Antworten (4)

Es gibt zwei Aussagen in https://github.com/ethereum/solidity/issues/992

das Schlüsselwort viewwird für Funktionen eingeführt (es ersetzt constant). Das Aufrufen einer Ansicht kann das Verhalten zukünftiger Interaktionen mit einem Vertrag nicht ändern. Das bedeutet, dass solche Funktionen keine verwenden können SSTORE, keine Äther senden oder empfangen können und nur andere Ansichten oder reine Funktionen aufrufen können.

das Schlüsselwort purefür Funktionen eingeführt wird, handelt es sich um viewFunktionen mit der zusätzlichen Einschränkung, dass ihr Wert nur von den Funktionsargumenten abhängt. SSTOREDas bedeutet, dass sie , nicht verwenden SLOAD, 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, viewKeywords entfernen.

function indexOfUint(uint256[] _array, uint _value) public pure returns (uint256) {
    bool exist;
    ...
}

Die Funktion ändert den Vertragszustand nicht. existVariable 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.