Supongamos que tengo una matriz de algunos datos, digamos
arr[15]="cualquier valor"
Si cambié este valor a cualquier otro valor
arr[15] = "valor cambiado"
¿Cómo puedo obtener el valor anterior de arr[15]= "cualquier valor"
Explique sobre la base del concepto inmutable de Blockchain
¿Hay alguna forma de programación sólida?
Una copia completa de la cadena de bloques contiene un historial completo de todas las transacciones que alguna vez ocurrieron en su historial, por lo que los datos nunca se borran de un nodo que descarga todos los datos en cada bloque y los guarda sin eliminarlos. Entonces, si tiene una copia completa de la cadena de bloques, puede descubrir que arr[15]
solía tener el valor "any value"
.
Sin embargo, en lo que respecta a un contrato de Solidity, el almacenamiento es como una base de datos normal: siempre ve el estado en el punto en que se ejecuta la transacción, que siempre es la punta de la cadena. Entonces, una vez que escribe un nuevo valor, el valor anterior desaparece. Diseñarlo así hace que sea mucho más económico ejecutar un nodo que pueda verificar un bloque: para verificar una transacción, solo necesita conocer el estado actual de la base de datos en ese momento en particular, que es muchas veces más pequeño que el historial completo. de estado en todos los momentos posibles del pasado. Eso le permite ejecutar un nodo con muchos menos datos de los que necesitaría si los contratos tuvieran acceso arbitrario al estado de la base de datos en bloques anteriores.
Aunque no es posible que un contrato lea los datos que ha sobrescrito o borrado, teóricamente es posible confirmar los datos de un bloque anterior. Si tiene un hash de bloque actual, debería poder probar que un hash de bloque anterior vino antes, y si tiene ese hash de bloque anterior, debería poder hacer una prueba Merkle que muestre que los datos estaban en la cadena de bloques en ese bloque anterior. Entonces, alguien con una copia completa de la cadena de bloques podría leer los datos en un bloque anterior, construir la prueba necesaria y enviar los datos, junto con los datos que prueban que son correctos, a su contrato. Sin embargo, no conozco ninguna implementación real de este método, y puede ser que los costos de gas para hacerlo lo hagan poco práctico.
En la práctica, si realmente necesita su contrato para poder acceder a los datos antiguos, normalmente solo tiene que pagar los costos de gasolina necesarios y pagar para mantener los datos históricos almacenados, de modo que nunca se eliminen de su contrato.
Badr Bellaj