Acceder al estado anterior

Digamos que tengo un uint public myvaren mi contrato que se inicializa a algún valor.

Luego, myvarse establece 3en el siguiente bloque.

¿Cómo puedo recuperar el valor anterior? ¿Es esto posible con web3?

Editar

Supongamos que no hay eventos que se emitan cuando myvarse cambia.

Respuestas (1)

Si la función que cambia el valor de myvar activa un evento, puede recuperar el registro de eventos de web3 para obtener los datos.

event MyEvent(uint indexed dateModified, uint prevValue, uint newValue);

function changeValue(uint newValue){

  uint prevValue = myvar;
  myVar = newValue;

  MyEvent(now, prevValue, newValue);

}

(La indexación de dateModified le permitirá filtrar por fecha, por ejemplo)

Cada vez que se llama a la función, el

Luego, en web3, vería (obtendría nuevos eventos a medida que ocurren) o los obtendría (obtendría todos los eventos pasados).

De documentos web3:

var MyContract = web3.eth.contract(abi);
var myContractInstance = MyContract.at('0x78e97bcc5b5dd9ed228fed7a4887c0d7287344a9');

// watch for an event with {some: 'args'}
var myEvent = myContractInstance.MyEvent({some: 'args'}, {fromBlock: 0, toBlock: 'latest'});
myEvent.watch(function(error, result){
   ...
});

// would get all past logs again.
var myResults = myEvent.get(function(error, logs){ ... });

...

// would stop and uninstall the filter
myEvent.stopWatching();

Una cosa más: solo se puede acceder a los registros de eventos desde fuera de Solidity, por lo que si desea obtener los valores anteriores de su variable desde dentro de Solidity, probablemente necesitará codificar su propia lógica que almacene los valores anteriores en una matriz.

Ya veo, esa es una solución muy práctica. Digamos que la función no emitió un registro, ¿cómo podría accederse a ese valor anterior?
No es posible. O mejor dicho, extremadamente complicado. Vea esta respuesta: ethereum.stackexchange.com/a/1061/20200