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?
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.
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) { });
gellej
Edmundo Edgar
gellej
Edmundo Edgar