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?
Funktionen können auf zwei verschiedene Arten aufgerufen werden:
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 counter
würde die wirklich dauerhaft inkrementiert. Im Wesentlichen view
ist dies ein Hinweis für Kunden, dass sie eher einen Anruf als eine Transaktion verwenden sollten.
matthias_bühlmann
Benutzer19510
counter
Wert 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.