Можно ли получить последнее время обновления переменной контракта без сохранения хэша транзакции,
contract Demo{
uint numb;
function setNumb(uint var1){
numb=var1
}
}
в приведенном выше контракте всякий раз, когда numb обновляется с помощью setNumb(uint) , транзакция запускается и сохраняется в каком-либо блоке, если я хочу знать отметку времени блока, в котором хранится транзакция, я могу получить блок с помощью хэша транзакции и легко получить отметку времени блока,
Но что, если я не знаю хеш транзакции
Можно ли получить время последней транзакции (т.е. отметку времени блока), которая обновляет numb . Есть ли способ получить блок/блоки, в которых хранятся транзакции, связанные с numb?
Да, вот пример, который включает 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 поддерживает состояние контракта как поддерево глобального дерева состояний. Связь между транзакцией и вызванным ею изменением состояния поддерживается как связь между старым корнем глобального состояния и новым корнем глобального состояния.
Навигация по истории изменений состояния и поиск транзакции и блока, содержащего эту транзакцию, требует больших вычислительных ресурсов. Кроме того, из-за сокращения дерева состояний это может быть невозможно без «обратного воспроизведения» транзакций (сокращение дерева состояний - это удаление состояний истории, чтобы снизить требования к хранилищу состояний).
Поэтому, если история изменений состояния является частью вашего состояния контракта, вы должны реализовать ее явно.