Отслеживание данных из блокчейна и неизменяемых концепций

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

подумайте о любой переменной как о стеке, который принимает последний результат, но вся история (предыдущие состояния) сохраняется в блокчейне.

Ответы (1)

Полная копия блокчейна содержит полную историю всех транзакций, которые когда-либо происходили в его истории, поэтому данные никогда не стираются с узла, который загружает все данные в каждом блоке и хранит их, не удаляя ничего из них. Поэтому, если у вас есть полная копия блокчейна, вы можете обнаружить, что arr[15]раньше она имела значение "any value".

Однако, что касается контракта Solidity, хранилище похоже на обычную базу данных: оно всегда видит состояние в момент выполнения вашей транзакции, который всегда является вершиной цепочки. Поэтому, как только вы записываете новое значение, старое значение исчезает. Такой дизайн значительно удешевляет запуск ноды, которая может проверить блок: для проверки транзакции вам нужно знать только текущее состояние базы данных в этот конкретный момент времени, что во много раз меньше, чем полная история. состояния в каждый возможный момент в прошлом. Это позволяет вам запускать узел с гораздо меньшим объемом данных, чем вам потребовалось бы, если бы контракты имели произвольный доступ к состоянию базы данных в предыдущих блоках.

Хотя контракт не может прочитать данные, которые он перезаписал или стер, теоретически возможно подтвердить данные из предыдущего блока. Если у вас есть текущий хэш блока, вы должны быть в состоянии доказать, что предыдущий хеш блока был до него, и если у вас есть этот предыдущий хеш блока, вы должны быть в состоянии сделать доказательство Меркла, показывающее, что данные были в цепочке блоков в этот предыдущий блок. Таким образом, кто-то с полной копией блокчейна может прочитать данные в предыдущем блоке, построить необходимое доказательство и отправить данные вместе с данными, подтверждающими их правильность, в ваш контракт. Однако я не знаю никаких реальных реализаций этого метода, и, возможно, затраты на газ, необходимые для этого, в значительной степени делают его непрактичным.

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

Вы хотите сказать, что если майнер установит нулевой лимит газа, мы сможем отследить предыдущую транзакцию? иначе это возможно только для тестовой сети, а не для реального блокчейна? А как насчет контрактного программирования, как это сделать?
Что ж, это зависит от того, какой объем памяти используется вашими историческими данными. Например, каждая запись может храниться как один хэш, и пользовательское приложение может отправлять открытый текст записи в качестве параметра транзакции, когда контракту необходимо его обработать. В этом случае запись занимает всего 32 байта памяти, что обычно не должно быть невозможным при текущих ценах на газ.
Ой ! да я понял. Буду признателен, если вы подробно расскажете, как делается лог и в чем его феномен?
Я не думаю, что понимаю ваш вопрос о журналах, но это звучит как другой вопрос, поэтому я предлагаю вам опубликовать новый вопрос.