Получить отметку времени последнего обновления переменной контракта

Можно ли получить последнее время обновления переменной контракта без сохранения хэша транзакции,

contract Demo{
uint numb;

  function setNumb(uint var1){
    numb=var1
  }
}

в приведенном выше контракте всякий раз, когда numb обновляется с помощью setNumb(uint) , транзакция запускается и сохраняется в каком-либо блоке, если я хочу знать отметку времени блока, в котором хранится транзакция, я могу получить блок с помощью хэша транзакции и легко получить отметку времени блока,

Но что, если я не знаю хеш транзакции

Можно ли получить время последней транзакции (т.е. отметку времени блока), которая обновляет numb . Есть ли способ получить блок/блоки, в которых хранятся транзакции, связанные с numb?

Ответы (2)

Да, вот пример, который включает 2 способа: использование и переменной состояния. Можно использовать один или оба способа в зависимости от того, что лучше подходит для варианта использования.

contract Demo {
  uint _var;
  uint public _lastTimeVarWritten;

  event LogLastTimeVarWritten(uint timestamp);

  function setVar(uint var1){
    _var=var1;
    _lastTimeVarWritten = block.timestamp;
    LogLastTimeVarWritten(_lastTimeVarWritten);
  }
}

(Код в вопросе недействителен, поскольку varявляется ключевым словом в Solidity.)

Как объяснил @Michal, вы должны реализовать это (в данном случае для хранения block.timestamp) явно.

Краткий ответ: нет

Длинный ответ:

Ethereum поддерживает состояние контракта как поддерево глобального дерева состояний. Связь между транзакцией и вызванным ею изменением состояния поддерживается как связь между старым корнем глобального состояния и новым корнем глобального состояния.

Навигация по истории изменений состояния и поиск транзакции и блока, содержащего эту транзакцию, требует больших вычислительных ресурсов. Кроме того, из-за сокращения дерева состояний это может быть невозможно без «обратного воспроизведения» транзакций (сокращение дерева состояний - это удаление состояний истории, чтобы снизить требования к хранилищу состояний).

Поэтому, если история изменений состояния является частью вашего состояния контракта, вы должны реализовать ее явно.