Was passiert, wenn die View-Funktion eine Funktion aufruft, die weder 'view' noch 'pure' ist?

aktuelle Ansicht wird nicht erzwungen. Der Aufruf einer Funktion, die weder 'view' noch 'pure' ist, aus einer Funktion heraus, die eine Warnung auslöst, aber kompiliert.

Meine Frage ist, was ist das Ergebnis des externen Aufrufs einer solchen Funktion, und ist das Ergebnis gut definiert? Gibt es das richtige Ergebnis zurück, ändert aber einfach nicht den Zustand?

Zum Beispiel:

contract Test {
    uint counter = 0;
    function A() public returns (uint256) {
        counter++;
        return counter;
    }

    function B() public view returns (uint256) {
        return A();
    }
}

Was passiert, wenn ich B() extern aufrufe? Gibt es sicher den aktuellen Zähler zurück, ohne Gas zu verbrauchen, nur ohne eine Statusänderung am Vertrag vorzunehmen?

Antworten (1)

Funktionen können auf zwei verschiedene Arten aufgerufen werden:

  1. Über eine Transaktion , die an das Netzwerk gesendet wird und den Blockchain-Status ändert.
  2. Über einen Aufruf , der lokal auf einem einzelnen Ethereum-Netzwerk durchgeführt wird und keinen Blockchain-Zustand ändert.

Es ist eigentlich Sache des Clients zu entscheiden, was zu tun ist, aber wenn eine Funktion markiert ist view, verwenden die meisten Clients (z. B. Remix, web3.js usw.) standardmäßig einen call . Das bedeutet im Grunde, dass die Transaktion ausgeführt wird, aber keine Statusänderungen aufgezeichnet werden.

Wenn Sie also im obigen Fall aufrufen B(), erhalten Sie tatsächlich den Wert zurück counter + 1. (Während der Ausführung wird der Zähler erhöht, aber diese Änderung wird einfach verworfen.)

Das heißt, Sie könntenB() über eine Transaktion aufrufen , in diesem Fall counterwürde die wirklich dauerhaft inkrementiert. Im Wesentlichen viewist dies ein Hinweis für Kunden, dass sie eher einen Anruf als eine Transaktion verwenden sollten.

Tolle Antwort, danke! Ich sehe, dass der zurückgegebene Wert in beiden Fällen gleich wäre. Wäre der zweite Fall - abgesehen davon, dass sich auch der Status ändert - in irgendeiner Weise zuverlässiger?
Transaktionen haben eigentlich keine Rückgabewerte, daher wäre es schwierig, den neuen counterWert zurückzubekommen, wenn Sie eine Transaktion verwenden. Es ist schwer zu sagen, ob eine Transaktion "zuverlässiger" ist, ohne eine Definition dessen, was Sie meinen.