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?
In Ihrem Fall kosten sowohl elementIndex
die 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.
Maxpeinas
view
kostet nur Benzin, wenn es von der normalen (Zustandsänderung) Funktion aufgerufen wird, oder? Ich glaube nicht, dass es wichtig ist, wenn Sieview
von einem anderen Vertrag aus anrufen, solange die Funktion in einem anderen Vertrag auch istview
. Oder liege ich falsch?Alex
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?Jaime