Gas für Sichtfunktionen

Ich habe an vielen Stellen gelesen, dass Ansichtsfunktionen kein Benzin kosten, aber das stimmt nicht, weil sie Benzin für Blockchain-Operationen kosten, auch wenn diese den Zustand nicht ändern. Korrigiert mich, wenn ich falsch liege Zum Beispiel:

pragma solidity ^0.4.17;

contract myContract {
    uint[] public anArray;   /// assume it has 1,000,000 (1Million) elements

/* function which returns how many times a specific element is in the n array*/

    function elementIndex(uint element) public view returns(uint){
        uint counter;
        for(uint i; i<anArray.length; i++){
            if(anArray[i] == element){
                counter++;
            }
        }
        return counter;
    }
function returnAllElements() public view returns(uint[]){
return anArray;
}}

Das eigentliche Problem tritt am Frontend auf, wenn das Array 1 Million Elemente enthält. Das Ausführen von elementIndex() wird niemals funktionieren, da die Iteration zu lange dauert. returnAllElements wird auch nicht funktionieren (nehme ich an).

Was kann in solchen Situationen getan werden?

Antworten (2)

In Ihrem Fall kosten sowohl elementIndexdie Funktionen als auch kein Gas, da beide Funktionen Zustandsvariablen aus der Blockchain lesen und ein beabsichtigtes Ergebnis liefern.returnAllElements

Sie können die oben genannten Funktionen optimieren, um die von ihnen benötigte Zeit zu reduzieren.

Beziehen Sie sich auf die folgende Frage, um die Verwendung von View/Pure Gas zu verstehen - Kostengas, wenn es intern von einer anderen Funktion aufgerufen wird?

Lesen Sie den folgenden Blog, um den Unterschied zwischen Anrufen und Transaktionen in Ethereum zu verstehen -

https://blog.b9lab.com/calls-vs-transactions-in-ethereum-smart-contracts-62d6b17d0bc2

View kostet nur dann Gas, wenn es von außerhalb des Netzwerks aufgerufen wird, dh wenn eine Funktion in einem Vertrag View ist und von einem anderen Vertrag aufgerufen wird, kostet es Gas.

Der Grund dafür, dass es kein Gas kostet, wenn es von außerhalb des Netzwerks aufgerufen wird, ist, dass die Funktion in dem lokalen Knoten, den Sie verwenden, um sich mit dem Netzwerk zu verbinden, aufgelöst werden kann, ohne eine Transaktion zu übermitteln.

Hoffe das hilft.

viewkostet nur Benzin, wenn es von der normalen (Zustandsänderung) Funktion aufgerufen wird, oder? Ich glaube nicht, dass es wichtig ist, wenn Sie viewvon einem anderen Vertrag aus anrufen, solange die Funktion in einem anderen Vertrag auch ist view. Oder liege ich falsch?
@Jaime, @Maxpeinas Die Antwort macht immer noch keinen Sinn. Könntest du es mir erklären? Dieser Teil the function can be resolved in the local node that you are using. Was ist ein lokaler Knoten? Wenn Sie eine Website in Azure betreiben, haben Sie höchstwahrscheinlich keinen Zugriff auf die Unix-Konsole (es sei denn, Sie besitzen eine virtuelle Maschine) und Sie installieren keine Ethereum-Knoten lokal. Zahlen Sie in solchen Fällen NOCH keine Transaktionsgebühr?
Ich nenne lokalen Knoten den Knoten, mit dem Sie verbunden sind, es Infura usw. Wenn Sie eine Ansichtsfunktion aufrufen, muss der Knoten keine Transaktion senden, er kann den Wert erhalten, indem er die Funktion einfach lokal ausführt. Wenn Sie jedoch eine Transaktion einreichen und eine der Operationen darin besteht, eine Ansichtsfunktion auszuführen, wird Gas verbraucht. Zusammenfassend lässt sich sagen, dass wenn die View-Funktion intern (während der Ausführung einer Transaktion) aufgerufen wird, Kosten anfallen. Wenn es extern aufgerufen wird (dh eine Webanwendung, die den Wert einer Variablen liest), entstehen keine Kosten.