Gibt es ein Gaslimit für Ansichtsanfragen?

ZB eine Funktion, die nur riesige Struct-Daten zurückgibt. Gibt es eine Datenbeschränkung, sodass der Aufruf dieser Funktion nicht möglich ist?

pragma solidity ^0.4.13;

contract Project
{
    struct Person {
        address addr;
        uint funds;
    }
    
    Person[] people;
    
    function getPeople(uint[] indexes)
        public
        view
        returns (address[], uint[])
    {
        address[] memory addrs = new address[](indexes.length);
        uint[]    memory funds = new uint[](indexes.length);
        
        for (uint i = 0; i < indexes.length; i++) {
            Person storage person = people[indexes[i]];
            addrs[i] = person.addr;
            funds[i] = person.funds;
        }
        
        return (addrs, funds);
    }
}

Codequelle

Wenn ich 100000000000 gespeichert habe ... Mensch, kann ich sie mit zurückgeben getPeople()?

Bearbeiten: Funktion in Ansicht geändert, um Verwirrung zu vermeiden.

Ihre Funktion sollte deklariert werden view, und dann sollten keine Gaskosten anfallen. Alle Daten sind (bereits) auf der Blockchain, Sie ändern nichts, es gibt also kein Mining, also keine nachträglichen Benzinkosten.
@goodvibration zur Klärung, meine Frage war, ob eine Funktion, die nicht per Vertrag aufgerufen werden kann, da sie das Gaslimit überschreiten würde, noch angezeigt werden kann?
Im Jahr 2022 scheint Geth immer noch 50 Millionen Gas bereitzustellen . Wenn Sie höher benötigen, müssen Sie angeben .

Antworten (2)

Wenn Sie dies von einem externen Konto (mit web3 oder ähnlichem) aufrufen, fallen keine Gaskosten an, da die Funktion Ansicht ist und in dem Knoten aufgelöst wird, mit dem Sie verbunden sind. Auf der anderen Seite, wenn dies aus einem Vertrag abgerufen wird, sind damit Gaskosten verbunden, und das Gaslimit ist das gleiche wie für jede andere Transaktion.

Was die Menge betrifft, auf die Sie hinweisen, ist das Speichern dieser Datenmenge unpraktisch und sehr teuer. Wenn Sie dieses Formular lesen, ist der Knoten machbar, aber mit einem Vertrag würde es nicht funktionieren.

Hoffe das hilft

Liegt das Problem nicht am internen Speicher des evm?
Ich habe den Teil verpasst, in dem das OP sagte, dass er eine große Datenmenge speichern und lesen möchte. Der Betrag, den er vorschlägt, ist unpraktisch, da dies zu teuer ist.
Sie haben das übersehen, weil die gesamte Frage verwirrt und unklar ist. Erstens lautet der Titel der Frage „Gibt es ein Gaslimit für Ansichtsanfragen“, was impliziert, dass es bei der Frage um viewFunktionen geht, auf die Sie sich mehr oder weniger bezogen haben. Dann wird im Fragetext die Funktion selbst nicht deklariert view, was nicht wirklich zum Titel passt. Dann zeigt ein genauerer Blick, dass es deklariert werden kannview , was Ihre Antwort wieder relevant macht. Und zuletzt ändert sich die Frage plötzlich von Datenlesen zu Datenveränderung, und so wird Ihre Antwort wieder einmal unvollständig.
Aktualisierte die Funktion mitview

Definitiv ja, es verbraucht Benzin!

Es verbraucht kein Gas, wenn es NUR von einem lokalen Knoten oder Web3 angerufen wird.

Die Ausführung des von Ihnen geschriebenen Codes verbraucht Gas auf der EVM, auch wenn sie nicht die Blockchain, sondern nur den lokalen Speicher modifiziert.

Wenn dies nicht der Fall wäre, sollte jede EVM-Ansichtsfunktion in der Lage sein, in einer Endlosschleife zu gehen, ohne in der Ewigkeit gestoppt zu werden ...

Zum Beispiel verbraucht Ihre for-Schleife Gas: Achten Sie auf gelbe Papiertische.

Wenn andererseits Ihre JavaScript-Anwendung, die auf Ihrem lokalen PC ausgeführt wird, auf öffentliche Variablen zugreift, verbraucht sie kein Gas beim Lesen der Blockchain (z. B. durch Web3-Zugriff).

Nur zur bestätigung. Bezieht sich Ihr „definitives Ja“ auf die erste oder zweite Frage?
Meines Erachtens ist diese Antwort irreführend - sie ist nicht "definitiv ja", da Anruffunktionen viewkein Gas kosten, wenn sie von einem externen Konto aus angerufen werden. Dies wird alles in der anderen Antwort richtig erklärt.
Definitiv ja, es verbraucht Gas, aber wenn es von einem lokalen Knoten oder Web3 aufgerufen wird.
Ich füge für Lauri Peltonen hinzu: Die Frage ist klar, lesen Sie den Titel. Die Antwort „definitiv ja“ ist die richtige Antwort auf diesen Titel. Natürlich.
Aber was wäre die tatsächliche Grenze der Datenmenge, die der Knoten an einen Client senden könnte? Ist das durch das gleiche Gaslimit im Genesis-Block begrenzt? Ist das auf den Knoten selbst beschränkt?