Ist es möglich, von einem soliden Vertrag aus auf den Speicherverlauf zuzugreifen?

Mit web3 kann ich wie folgt auf den Verlauf der Blockchain zugreifen:

web3.eth.getBalance('0x1234') // returns current balance at address 0x1234
web3.eth.getBalance('0x1234', 1000) // returns balance at block 1000

Vgl. https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethdefaultblock

Ich habe in Solidity nichts Vergleichbares finden können. Gibt es ein entsprechendes Muster in Solidity? Oder im EVM-Bytecode? Oder grundsätzliche Gründe, warum es nicht geht?

Antworten (2)

Nein, Solidity-Code (und EVM-Code im Allgemeinen) kann nur den aktuellen Zustand in dem Block lesen, in dem er aufgerufen wird. Wenn es in der Lage wäre, den Zustand früherer Blöcke zu lesen, benötigen Sie den gesamten Verlauf der Blockchain, um einen Block zu validieren. Indem sie dies nicht zuließen, ermöglichten es die Ethereum-Entwickler, einen Block nur mit dem aktuellen Zustand zu validieren, was eine viel weniger anspruchsvolle Anforderung ist.

Theoretisch sollte es möglich sein, einen Merkle-Beweis zu konstruieren, dass eine Adresse in einem bestimmten Block einen bestimmten Zustand hatte, und die erforderlichen Daten einzugeben, damit ein Vertrag diesen Beweis überprüfen kann. Auf diese Weise könnte der Aufrufer eines Vertrags die alten Daten abrufen, wie Sie es in Ihrem Beispiel mit Web3 tun, und der Solidity-Code könnte diese Daten als Parameter abrufen, überprüfen, ob sie echt sind, und entsprechend handeln. Dies ist jedoch wahrscheinlich keine triviale Sache, und ich kenne keine Beispiele dafür.

Wenn Sie einen Zustandsverlauf früherer Blöcke benötigen, besteht die normale Lösung darin, diesen Verlauf explizit im Vertragsspeicher zu speichern und bei jeder Änderung zu Ihren Verlaufsdaten hinzuzufügen.

Ich sehe den Punkt, dass es wünschenswert ist, einen Block nur mit dem aktuellen Status validieren zu können. Aber wenn Kosten/Geschwindigkeit ein Thema sind, wäre es nicht besser gewesen, einen Opcode hinzuzufügen und ihn (sehr) teuer zu machen, anstatt die EVM auf so grundlegende Weise einzuschränken?
Es ist nicht nur mühsam, den Satz aller vorherigen Zustände zu lesen , es ist auch mühsam, ihn überhaupt zu haben, also würde es das Problem nicht lösen, ihn teuer zu machen.
Nach meinem Verständnis "hat" jeder vollständige Knoten bereits die gesamte Historie in dem Sinne, dass er sie aus dem Genesis-Block und der Transaktionshistorie rekonstruieren kann (mein lokaler Knoten hat kein Problem, Zwischenzustände zu rekonstruieren, wenn ich ihn mit web3 abfrage). (Vielleicht frage ich jetzt nach den Beweggründen der Designer des EVM, und vielleicht ist dies nicht der richtige Ort, um zu fragen :-)
Ein Full Node tut es, aber ein Light Node nicht. Auch iiuc mit Sharding, Full Nodes eines Shards sind Light Nodes eines anderen.

Ja, es ist mit Web3 an jedem beliebigen Block möglich.

Wenn Ihr Vertrag Folgendes enthält:

Vertrag ValueStore {
    Funktion getValue(uint param) Konstante gibt zurück (uint returnValue);
}

Dann können Sie nach der Instanziierung Ihres Web3-Vertrags Folgendes tun:

valueStoreInstance.getValue.call(param, blockNumber, function(error, returnValue) { });
Bitte antworten Sie, ob es möglich ist oder nicht?
Ich habe Ihnen einen Code für Web3 gegeben. Dieser Code funktioniert. Also ja, es ist für Web3 möglich.
danke, aber danach hatte ich nicht gefragt. Meine Frage ist, ob es möglich ist, etwas Ähnliches in Solidität (dh in der EVM) zu tun.