Skip to content

Повторное чтение блока из блокчейна

⚠️ Только для продвинутых пользователей. Все действия выполняются на страх и риск исполнителя. Неверное изменение данных в базе может привести к потере или дублированию транзакций. Перед выполнением убедитесь, что понимаете каждый шаг.

Проблема

В результате реорганизации блоков в сети Ethereum подтверждённая в блокчейне транзакция может отсутствовать в системе. Это происходит, если процессинг обработал блок из временной (отброшенной) ветки цепочки и пропустил соответствующий блок из основной цепочки. Для восстановления корректного состояния необходимо вручную инициировать повторное чтение нужного блока.

Решение

1. Создаём резервную копию базы данных

bash
sudo -u postgres pg_dump dv-processing > /tmp/dv-processing_backup_$(date +%Y%m%d_%H%M%S).sql

Убедитесь, что файл создался и не пустой:

bash
ls -lh /tmp/dv-processing_backup_*.sql

2. (!ВАЖНО — в отдельном терминале) Останавливаем процессинг

bash
sudo systemctl stop dv-processing

3. (в основном терминале) Заходим в систему от имени базы данных

bash
sudo su
sudo su - postgres

4. (в основном терминале) Запускаем psql

bash
psql

или

bash
/home/dv/embedded/usr/local/pgsql/bin/psql -p 5433

5. (в основном терминале) Подключаемся к базе dv-processing

sql
\c dv-processing

6. (в основном терминале) Считываем текущее состояние парсинга

sql
select number from processed_blocks where blockchain = 'bsc';

!ВАЖНО — запоминаем ответ:

  number
----------
 81923203
(1 row)

7. (в основном терминале) Обновляем значение на блок -1 от вашей транзакции

Пример для транзакции 0xffe238ba2c1e028a8ec1c467cef53fa59112e2ccc922dc64345817f9da0f4e71 — блок 81921203:

sql
update processed_blocks set number = 81921203 where blockchain = 'bsc';

8. (!ВАЖНО — в отдельном терминале) Запускаем процессинг

bash
sudo systemctl start dv-processing

9. (в основном терминале) Через пару минут проверяем, что блоки сдвинулись вперёд

Значение должно вырасти на несколько десятков/сотен от 81921203 — это означает успешную перечитку блока.

sql
select number from processed_blocks where blockchain = 'bsc';

10. (!ВАЖНО — в отдельном терминале) Останавливаем процессинг

bash
sudo systemctl stop dv-processing

11. (в основном терминале) Возвращаем значение блока на то, что запомнили в пункте 6

sql
update processed_blocks set number = 81923203 where blockchain = 'bsc';

12. (!ВАЖНО — в отдельном терминале) Запускаем процессинг

bash
sudo systemctl start dv-processing

После этого с высокой степенью вероятности транзакция долетит.