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. Ich habe vorgeschlagen, dass ich den Index über eine konstante Funktion abrufen könnte und meine Transaktionsfunktion den zurückgegebenen Indexwert verwenden könnte, um das Element an die richtige Position zu verschieben, ohne Gas auszugeben, um die Liste zu durchlaufen.
Mein Ziel ist es, diesem Leitfaden ( https://ethereum.stackexchange.com/a/13855/4575 ) zu folgen , um eine konstante Funktion aufzurufen und ihren Rückgabewert an eine Transaktionsfunktion zu senden.
getIndex() => constant
setArray() => transaction
setArray( getIndex() );
Es stellt sich folgende Frage: Wenn ich eine konstante Funktion auf meinem Client-Knoten aufrufe, ist es möglich zu überprüfen, ob die Blocknummer meines Client-Knotens die beste Blocknummer ist oder hinterherhinkt. Wenn es zurückliegt, kann die konstante Funktion falsche Informationen zurückgeben.
Zum Beispiel ist der beste Block der Blockchain 100. Aber mein Knoten befindet sich derzeit bei blockNumber 90 (im Grunde hinter der Blockchain). Wenn also der Client-Knoten den Index der Liste bis zu den ersten 90 Blöcken erhält und Elemente vermisst, die auf den verbleibenden 10 Blöcken generiert wurden.
[F] Ist es möglich zu überprüfen, ob die Blocknummer des Client-Knotens mit der besten Blocknummer der Blockchain übereinstimmt, die die neueste Blocknummer ist?
Wie Sie auf dem Beispielbild sehen können, kann die Blocknummer auf den Client-Knoten variieren. Die beste Blocknummer ist 1.002.312, aber die Blocknummer ist 1.002.304 auf dem Knoten oben. Aber manchmal sind alle Knoten auf der neuesten Blocknummer. Daher ist es schwierig, dem Verhalten des Knotens zu vertrauen.
Folgende Antwort scheint zu funktionieren:
web3.eth.syncing; sync.highestBlock
Aber die zurückgegebene highestBlock
Nummer scheint immer noch ein paar Blöcke kleiner zu sein als meine beste Blocknummer in meiner privaten Kette. Handelt es sich um einen Normalfall?
Ethereum ist ein probabilistisches System.
Meiner Meinung nach gibt es einfach keine Möglichkeit, sicher zu sein, dass man den letzten Block betrachtet, der es letztendlich in die längste Kette schafft, mit verschwindend geringer Wahrscheinlichkeit, dass eine Kettenreorganisation die Dinge neu ordnet. Daher glaube ich nicht, dass das Vertrauen auf einen Kundenzeugen ein guter Weg ist, um einen Sortierprozess zu informieren.
Ich glaube fest an das Prinzip, dass ein Smart Contract die Integrität der internen Datenspeicherung gewährleisten muss. Wenn die Daten in sortierter Reihenfolge zugänglich sein müssen (nicht unbedingt ein On-Chain-Anliegen), dann liegt die Reihenfolge der Daten im Rahmen der „garantierten internen Integrität“.
Aus diesem Grund muss das Vertrauen auf korrekte Informationen aus den von call()
Ihnen beschriebenen und die Notwendigkeit, dass sie aktuell sind, verschwinden . Es ist eine inakzeptable externe Abhängigkeit und wahrscheinlich nicht zufriedenstellend lösbar.
Betrachten Sie drei allgemeine Ansätze
Die erste erfordert möglicherweise eine beträchtliche Tiefe bei der internen Suche und lässt sich nicht gut skalieren. Der zweite Ansatz ist auf verlässliche Informationen von außen angewiesen; Zuverlässigkeit können wir wahrscheinlich nicht erreichen. Der dritte Ansatz setzt auf einen Hinweis zur Gaseffizienz, überlässt es aber dem Vertrag, die endgültige, richtige Entscheidung zu treffen.
"In der Nähe" ist im Grunde ein Vorsprung beim Suchvorgang. Wichtig ist, dass der Vertrag die Suche abschließt und seine eigenen Schlussfolgerungen darüber zieht, wo und wie „Bob“ angesichts des aktuellen Stands der geordneten Liste einzufügen ist. Jede Liste in jedem Zustand in jedem Block auf jeder Kette müsste korrekt geordnet sein, da sie nicht von einer präzisen externen Anleitung abhängig ist.
Zusammenfassend:
Ich würde erstmal überlegen, ob die Sorte wirklich unbedingt an der Kette sein muss.
Wenn die Sortierung unvermeidbar ist, organisieren Sie im Vertrag eine sortierte verkettete Liste oder ein ähnliches Indexschema. Der Vertrag allein sollte die korrekten Einfügepunkte bestimmen. Ein "Hinweis" kann die dafür erforderliche interne Suche reduzieren, wodurch die Benzinkosten gesenkt werden und sichergestellt wird, dass der Prozess mit einer Liste beliebiger Größe funktioniert.
Ich hoffe es hilft.
Die Schritte wären
Der Teil der Übermittlung der Transaktion erfordert einige Änderungen in der Kern-/API-Schicht.
Die RPC-API hält Ihnen den Rücken frei.
Verwenden Sie einfach diese Funktion, um Ihren letzten Block und den des Kunden zu überprüfen. Je nachdem, wie sehr Sie dem Client vertrauen möchten, können Sie die Werte auf der Client-Seite vergleichen oder sicherstellen, dass sie ohne Manipulation an Sie zurückübertragen werden.
Funktion zum Abrufen des neuesten Blocks:
web3.currentProvider.sendAsync({
method: "eth_blockNumber",
params: [],
jsonrpc: "2.0",
id: 83
} function (error, result) {...})
Weitere Details zur JSON-RPC-API und wie Sie sie auf vielfältige Weise verwenden können (z. B. mit curl): Hier
Sie können übrigens curl verwenden, um die aktuelle Blockierung des Clients aus der Ferne zu überprüfen, ob seine Knoten- und Firewall-Einstellungen die Verbindung zulassen.
Vergessen Sie natürlich nicht, das Ergebnis in eine Dezimalzahl umzuwandeln, parseInt(value, 16)
.
Ein Beispiel zur Implementierung solcher web3-Funktionen finden Sie hier.
curl --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":83}' -X POST localhost:8545
. Dies gibt auch die aktuelle Blocknummer des Knotens zurück, nicht die höchste erreichte Blocknummer. Das Erhalten der Blocknummer des Kunden ist nicht das Problem, aber es kann hinter der höchsten Blocknummer liegen. @NikitaFuchs
Alper
Rob Hitchens
Alper
web3.eth.syncing;
funktioniert nicht immer und wenn es keine gültigen Informationen zurückgibt, kann sich die neueste Nummer der Blockchain auch ändern, bis eine gültige Information zurückgegeben wird. Ethereum ist ein probabilistisches System, wie Sie sagten, ich kann es kaum erwarten, wann genau das Netzwerk antwortet, denke ich. Entschuldigung für zu viele Fragen... @RobHitchensNeo
Rob Hitchens