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?
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.
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) { });
gelej
Edmund Edgar
gelej
Edmund Edgar