Повторное чтение блока из блокчейна
⚠️ Только для продвинутых пользователей. Все действия выполняются на страх и риск исполнителя. Неверное изменение данных в базе может привести к потере или дублированию транзакций. Перед выполнением убедитесь, что понимаете каждый шаг.
Проблема
В результате реорганизации блоков в сети Ethereum подтверждённая в блокчейне транзакция может отсутствовать в системе. Это происходит, если процессинг обработал блок из временной (отброшенной) ветки цепочки и пропустил соответствующий блок из основной цепочки. Для восстановления корректного состояния необходимо вручную инициировать повторное чтение нужного блока.
Решение
1. Создаём резервную копию базы данных
sudo -u postgres pg_dump dv-processing > /tmp/dv-processing_backup_$(date +%Y%m%d_%H%M%S).sqlУбедитесь, что файл создался и не пустой:
ls -lh /tmp/dv-processing_backup_*.sql2. (!ВАЖНО — в отдельном терминале) Останавливаем процессинг
sudo systemctl stop dv-processing3. (в основном терминале) Заходим в систему от имени базы данных
sudo su
sudo su - postgres4. (в основном терминале) Запускаем psql
psqlили
/home/dv/embedded/usr/local/pgsql/bin/psql -p 54335. (в основном терминале) Подключаемся к базе dv-processing
\c dv-processing6. (в основном терминале) Считываем текущее состояние парсинга
select number from processed_blocks where blockchain = 'bsc';!ВАЖНО — запоминаем ответ:
number ---------- 81923203 (1 row)
7. (в основном терминале) Обновляем значение на блок -1 от вашей транзакции
Пример для транзакции 0xffe238ba2c1e028a8ec1c467cef53fa59112e2ccc922dc64345817f9da0f4e71 — блок 81921203:
update processed_blocks set number = 81921203 where blockchain = 'bsc';8. (!ВАЖНО — в отдельном терминале) Запускаем процессинг
sudo systemctl start dv-processing9. (в основном терминале) Через пару минут проверяем, что блоки сдвинулись вперёд
Значение должно вырасти на несколько десятков/сотен от 81921203 — это означает успешную перечитку блока.
select number from processed_blocks where blockchain = 'bsc';10. (!ВАЖНО — в отдельном терминале) Останавливаем процессинг
sudo systemctl stop dv-processing11. (в основном терминале) Возвращаем значение блока на то, что запомнили в пункте 6
update processed_blocks set number = 81923203 where blockchain = 'bsc';12. (!ВАЖНО — в отдельном терминале) Запускаем процессинг
sudo systemctl start dv-processingПосле этого с высокой степенью вероятности транзакция долетит.