С помощью web3 я могу получить доступ к истории блокчейна следующим образом:
web3.eth.getBalance('0x1234') // returns current balance at address 0x1234
web3.eth.getBalance('0x1234', 1000) // returns balance at block 1000
См. https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethdefaultblock
Я не смог найти ничего подобного в Solidity. Есть ли соответствующий паттерн в Solidity? Или в байт-коде EVM? Или фундаментальные причины, почему это невозможно сделать?
Нет, код Solidity (и код EVM в целом) может считывать текущее состояние только в том блоке, в котором он вызывается. Если бы он мог считывать состояние в предыдущих блоках, вам понадобилась бы вся история блокчейна для проверки блока. Не допустив этого, разработчики Ethereum сделали возможным проверку блока только с текущим состоянием, что является гораздо менее строгим требованием.
Теоретически должно быть возможно построить доказательство Меркла того, что адрес имеет определенное состояние в конкретном блоке, и передать необходимые данные, чтобы позволить контракту проверить это доказательство. Таким образом, вызывающая сторона контракта могла получить старые данные, как вы делаете в своем примере с Web3, а код Solidity мог получить эти данные в качестве параметра, убедиться, что они реальны, и действовать соответствующим образом. Тем не менее, это, вероятно, не тривиальная вещь, и я не знаю ни одного примера того, как это делается.
Если вам нужна история состояния в предыдущих блоках, обычным решением является явное сохранение этой истории в хранилище контрактов и добавление к вашим данным истории каждый раз, когда вы вносите изменения.
Да, это возможно с Web3 в любом заданном блоке.
Если в вашем договоре есть:
контракт ValueStore { функция getValue(uint param) возвращает константу (uint returnValue); }
Затем, после создания экземпляра вашего контракта Web3, вы можете сделать:
valueStoreInstance.getValue.call (параметр, blockNumber, функция (ошибка, возвращаемое значение) {});
геллей
Эдмунд Эдгар
геллей
Эдмунд Эдгар