Ich habe eine sortierte verknüpfte Liste, die ungefähr 1000 Elemente enthält. Wenn ich einen neuen Artikel erhalte, ist es mein Ziel, den Artikel in die Liste zu verschieben, wobei die sortierte Reihenfolge beibehalten wird. Wenn ich also einen sehr kleinen Wert erhalte, muss ich die gesamte Liste durchlaufen, um das Ende der Liste zu finden.
Das Ziel der konstanten Funktion besteht darin, den Indexspeicherort zurückzugeben, in den die Transaktionsfunktion verschoben werden soll.
Iteration(iterateListToFindPushIndex()) könnte so aussehen:
struct Interval {
uint32 num; //contained value.
uint32 next; //points to next node on the linkedlist.
}
prevNode = self.list[self.head]; //head of the list, largest value.
currentNode = self.list[prevNode.next];
while( true ) {
if( s > currentNode.num ){
//self.list.push(Interval( { num: s, next: prevNode.next }) );
//prevNode.next = uint32(self.list.length - 1);
return prevNode.next;
//returned indexed would be use in transaction function to insert intem into the correct location.
}
prevNode = currentNode;
currentNode = self.list[currentNode.next];
}
Wie wir wissen, kostet der Aufruf einer konstanten Funktion kein Gas und ist kostenlos zu verwenden. Wenn ich also die Indexposition über eine konstante Funktion finde, kostet mich das kein Benzin.
function iterateListToFindPushIndex() constant returns(uint index){}
function func(intervalNode storage self) {
index = iterateListToFindPushIndex();
self.list.push(Interval( { num: s, next: index }) )
}
Wenn ich in einer Transaktionsfunktion durch meine Liste iteriere, obwohl ich keinen Speicher ändere, kostet mich das zusätzliches Benzin.
Ist es also möglich, eine konstante Funktion aufzurufen, ohne Gas innerhalb einer Transaktionsfunktion auszugeben?
Vielen Dank für Ihre wertvolle Zeit und Hilfe.
Der Aufruf einer constant
Funktion innerhalb einer Transaktion kostet genauso viel wie der Aufruf einer Nicht- constant
Funktion innerhalb einer Transaktion. Das constant
heißt, da es den Zustand nicht ändert, kann Ihr lokaler Knoten es ausführen und Ihnen das Ergebnis mitteilen, ohne dass eine Transaktion erforderlich ist. Das kostet kein Gas, da nur Ihr Knoten die Berechnung durchführen muss.
Sie können dies möglicherweise verwenden, um Gas in einer Transaktion zu sparen, indem Sie zuerst die Konstantenfunktion aus Ihrem JavaScript-Code ausführen, um ein Ergebnis zu erhalten, und dieses Ergebnis dann als Parameter an die Transaktion übergeben. Wenn Ihr Vertrag der sendenden Person jedoch nicht vertraut, müssen Sie ihn dennoch innerhalb der Transaktion verifizieren. Dies kann immer noch nützlich sein: Wenn Sie eine sortierte Liste haben und wissen möchten, wo ein Element abgelegt werden soll, kann es nützlich sein, es auf der Clientseite zu überprüfen und den Index zu finden x
, den Index x
als Transaktionsparameter zu übergeben und dann zu lassen der Smart-Contract-Code in der Transaktion überprüft, ob der Artikel bei x-1
vor dem steht, was Sie hinzufügen, und der Artikel bei x+1
danach kommt.
Ein Fallstrick besteht darin, dass sich die Daten zwischen dem Lesen eines Ergebnisses und dem Senden eines Aufrufs, der es enthält, an die Blockchain in einer Transaktion ändern können. In diesem Fall schlägt Ihre Transaktion fehl und Sie müssen sie erneut senden.
Wie wir wissen, kostet der Aufruf einer konstanten Funktion kein Gas und ist kostenlos zu verwenden.
Diese Aussage ist falsch. Ich würde gerne wissen, was die Quelle dieser Aussage ist, da sie korrigiert werden sollte.
Eine Transaktion ändert per Definition den Zustand der Ethereum-Blockchain, verschiebt ETH oder Bits.
Wenn Transaktionen Berechnungen durchführen, verwenden sie die CPU-Zeit von Minern. Nicht nur Miner, sondern auch CPU-Zeit aller Ethereum Full Nodes, da derzeit jede Transaktion auf jedem Node gespielt wird. Bergleute sind nicht gemeinnützig und stellen Ihnen natürlich Gebühren für die Nutzung ihrer CPU in Rechnung. Es spielt keine Rolle, ob die Unteraufrufe oder Berechnungen den Zustand verändern (nicht konstant) oder keine Seiteneffekte haben (konstant), wenn das Gesamtergebnis der Transaktion die Änderung von nur einem Bit in der Ethereum-Blockchain ist.
Das Aufrufen einer konstanten Funktion ist nur kostenlos, wenn Sie den Status von Ihrem lokalen Knoten abfragen, da Sie dann keine Transaktion durchführen, sondern nur einen RPC-Abfrageaufruf an Ihre lokale Blockchain-Datenbank.
Die Anruffunktion constant
kann Ihren Gasverbrauch erhöhen . Die EVM muss nun eine weitere Funktion abrufen und dem Stack hinzufügen, um den richtigen Wert zu berechnen. Sehen Sie sich zum Beispiel den folgenden Code an:
contract Child{
uint8 public age = 1;
function birthDay() { <-- gas used: 26933
age = age + 1;
}
function nextYearIllBe() constant returns (uint8){
return age + 1;
}
function newBirthDay() { <-- gas used 26991
age = nextYearIllBe();
}
}
Beide Geburtstagsfunktionen führen denselben Additions- und Speichervorgang aus, aber die newBirthDay
Funktion fügt Ihrem Flow auch einen zusätzlichen Aufruf hinzu.
Alper
Alper
Edmund Edgar
Alper