¿Es posible acceder al historial de almacenamiento desde un contrato en Solidez?

Con web3, puedo acceder al historial de la cadena de bloques de esta manera:

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

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

No he podido encontrar nada similar en Solidity. ¿Hay un patrón correspondiente en Solidity? ¿O en el código de bytes EVM? ¿O razones fundamentales por las que no se puede hacer?

Respuestas (2)

No, el código Solidity (y el código EVM en general) solo puede leer el estado actual en el bloque en el que se llama. Si pudiera leer el estado en bloques anteriores, necesitaría el historial completo de la cadena de bloques para validar un bloque. Al no permitir esto, los desarrolladores de Ethereum hicieron posible validar un bloque solo con el estado actual, que es un requisito mucho menos exigente.

En teoría, debería ser posible construir una prueba de Merkle de que una dirección tenía un estado particular en un bloque en particular y pasar los datos necesarios para permitir que un contrato verifique esta prueba. De esa manera, la persona que llama de un contrato podría obtener los datos antiguos como lo hace en su ejemplo con Web3 y el código de Solidity podría obtener esos datos como parámetro, verificar que eran reales y actuar en consecuencia. Sin embargo, esto probablemente no sea algo trivial, y no conozco ningún ejemplo en el que se haya hecho.

Si necesita un historial de estado en bloques anteriores, la solución normal es almacenar explícitamente este historial en el almacenamiento del contrato y agregarlo a los datos de su historial cada vez que realice un cambio.

Veo el punto de que es deseable poder validar un bloque solo con el estado actual. Pero si el costo/velocidad es un problema, ¿no hubiera sido mejor agregar un código de operación y hacerlo (muy) costoso, en lugar de limitar el EVM de una manera tan fundamental?
No es solo que sea oneroso leer el conjunto de todos los estados anteriores, es oneroso que realmente se requiera tenerlo en primer lugar, por lo que encarecerlo no resolvería el problema.
Según tengo entendido, cada nodo completo ya "tiene" todo el historial en el sentido de que puede reconstruirlo a partir del bloque de génesis y el historial de transacciones (mi nodo local no tiene problemas para reconstruir estados intermedios si lo consulto con web3). (Quizás ahora estoy preguntando por las motivaciones de los diseñadores del EVM, y quizás este no sea el lugar adecuado para preguntar :-)
Un nodo completo sí, pero un nodo ligero no. También iiuc con sharding, los nodos completos de un fragmento serán nodos ligeros de otro.

Sí, es posible con Web3 en cualquier bloque dado.

Si su contrato tiene:

contrato ValueStore {
    la función getValue(uint param) devuelve constantes (uint returnValue);
}

Luego, después de crear una instancia de su contrato Web3, puede hacer:

valueStoreInstance.getValue.call(param, blockNumber, function(error, returnValue) { });
Por favor, responda si es posible o no.
Te di un código para Web3. Este código funciona. Así que sí, es posible para Web3.
gracias, pero eso no era lo que estaba preguntando. mi pregunta es si es posible hacer algo similar en solidez (es decir, en el EVM)