У меня есть простой смарт-контракт с переменным цветом, в котором хранится строка.
Если я правильно понимаю, каждая транзакция может изменить состояние этой переменной и навсегда сохраняется в блокчейне. Допустим, tx#1 меняет его на красный, tx#1 меняет его на синий, tx#2 — на красный, tx#3 — на зеленый.
Я хочу иметь красный, синий и зеленый, а не только последнее состояние этой переменной цвета.
Как я могу этого добиться?
Спасибо
Обычный подход состоит в том, чтобы генерировать события для всех изменений состояния. Их можно отслеживать извне, включая воспроизведение с самого начала и/или фильтры. Это хороший способ раскрыть историю, не используя слишком много контрактного (дорогого) хранилища.
bytes32 x;
event LogChangedX(bytes32 X);
function doSomething(bytes32 newX) {
x = newX;
LogChangedX(x);
Клиенты, например браузеры или серверы, могут просматривать журнал событий, чтобы обнаружить все изменения, произошедшие с "x". Использует прослушиватели событий web3.
Существует более затратный по газу и емкий для хранения подход, который больше напоминает таблицу истории txn базы данных, но в большинстве случаев он не нужен.
Надеюсь, это поможет.
Вы можете вызывать константные функции для более старых состояний, указав blockNumber в списке аргументов. Хороший способ найти blockNumber для изменения состояния — создать событие. Я создал пример, который показывает это здесь:
https://github.com/chafey/эфириум-события
И запись в блоге тоже:
http://chafey.blogspot.com/2017/03/applying-blockchain-to-healthcare-part_4.html
Вот ссылка на код, который перебирает события и получает старое состояние для смарт-контрактов:
https://github.com/chafey/ethereum-events/blob/master/app/client/patientChanges.js#L6
FrenchieiSverige
Роб Хитченс
FrenchieiSverige
Роб Хитченс