Предположим, у меня есть массив некоторых данных, скажем,
arr[15]="любое значение"
Если я изменил это значение на любое другое значение
arr[15] = "измененное значение"
Как я могу получить предыдущее значение arr[15]= «любое значение»
. Объясните, пожалуйста, на основе неизменной концепции блокчейна
. Есть ли какой- нибудь способ программирования на солидности?
Полная копия блокчейна содержит полную историю всех транзакций, которые когда-либо происходили в его истории, поэтому данные никогда не стираются с узла, который загружает все данные в каждом блоке и хранит их, не удаляя ничего из них. Поэтому, если у вас есть полная копия блокчейна, вы можете обнаружить, что arr[15]
раньше она имела значение "any value"
.
Однако, что касается контракта Solidity, хранилище похоже на обычную базу данных: оно всегда видит состояние в момент выполнения вашей транзакции, который всегда является вершиной цепочки. Поэтому, как только вы записываете новое значение, старое значение исчезает. Такой дизайн значительно удешевляет запуск ноды, которая может проверить блок: для проверки транзакции вам нужно знать только текущее состояние базы данных в этот конкретный момент времени, что во много раз меньше, чем полная история. состояния в каждый возможный момент в прошлом. Это позволяет вам запускать узел с гораздо меньшим объемом данных, чем вам потребовалось бы, если бы контракты имели произвольный доступ к состоянию базы данных в предыдущих блоках.
Хотя контракт не может прочитать данные, которые он перезаписал или стер, теоретически возможно подтвердить данные из предыдущего блока. Если у вас есть текущий хэш блока, вы должны быть в состоянии доказать, что предыдущий хеш блока был до него, и если у вас есть этот предыдущий хеш блока, вы должны быть в состоянии сделать доказательство Меркла, показывающее, что данные были в цепочке блоков в этот предыдущий блок. Таким образом, кто-то с полной копией блокчейна может прочитать данные в предыдущем блоке, построить необходимое доказательство и отправить данные вместе с данными, подтверждающими их правильность, в ваш контракт. Однако я не знаю никаких реальных реализаций этого метода, и, возможно, затраты на газ, необходимые для этого, в значительной степени делают его непрактичным.
На практике, если вам действительно нужно, чтобы ваш контракт имел доступ к старым данным, вам обычно просто нужно оплатить необходимые расходы на газ и заплатить за хранение исторических данных в хранилище, чтобы они никогда не удалялись из вашего контракта.
Бадр Беллай