Cardano-db-sync: Наградной стол от нескольких ловеласов

Созданный на 12 нояб. 2020  ·  12Комментарии  ·  Источник: input-output-hk/cardano-db-sync

Не удалось отправить транзакцию через cardano-submit-api, пишет "WithdrawalsNotInRewardsDELEGS", что подразумевает неправильные вознаграждения, либо пытается вывести не все вознаграждения. Я проверил все части, где что-то могло пойти не так. После этого я сравнил награды за случайные адреса, полученные от db-sync и от yoroi api. Вот такие несовпадения у некоторых (у ловеласов):

image
Каждая строка представляет вознаграждение за синхронизацию базы данных от этого SQL:
SELECT (SELECT COALESCE(SUM(rewards.amount), 0) FROM ( SELECT amount FROM reward WHERE addr_id=$1 UNION ALL SELECT amount FROM reserve WHERE addr_id=$1 ) rewards ) - ( SELECT COALESCE(SUM(amount), 0) FROM withdrawal WHERE addr_id=$1 ) AS "remainingRewards"
минус награды от ёрой апи.

Что происходит @erikd ?

Изменить: yoroi также получает его из db-sync, так что, возможно, это различия двух неправильных значений. В любом случае ошибка возникает в db-sync

Самый полезный комментарий

Извините, я назвал это преждевременно. Похоже, проблема исправлена, я отслеживаю ее и отчитаюсь через несколько дней.

Все 12 Комментарий

Мы также заметили это в Ёрои.

Вот результаты для 7 разных экземпляров cardano-db-sync, где реальное значение равно 30428426.

backend#1 30428424
backend#2 30428424
backend#3 30428424
backend#4 30428423
backend#5 30428430
backend#6 30428424
backend#7 30428426

Как видите, только 1/7 бэкэндов дали правильный результат

Мы дважды проверили, что эти неверные значения хранятся в базе данных SQL, поэтому мы знаем, что эта проблема не в нашей части стека.

@SebastienGllmt Что? Разные экземпляры db-sync дают разные результаты??? Они все используют одну и ту же версию?

@xdzurman Не могли бы вы упростить этот SQL-запрос? Было бы неплохо иметь три колонки, награда, резерв и разница.

Я подозреваю, что запрос на самом деле неверен. Таблица вознаграждений выглядит так (мой экземпляр в данный момент не синхронизирован):

cexplorer=# select * from reward ; 
 id | addr_id | amount | epoch_no | pool_id | block_id 
----+---------+--------+----------+---------+----------
(0 rows)

Итак, для каждой эпохи есть сумма вознаграждения (т.е. моментальный снимок вознаграждений за эпоху), и, не изучив ее должным образом, я даже не уверен, что находится в таблице reserve .

@erikd Это запрос, который мы выполнили на 7 разных бэкэндах, которые дали разные результаты. Это одна и та же версия cardano-db-sync и одна и та же версия узла.

  select stake_address.hash_raw as "stakeAddress"
       , "totalReward".*

  from stake_address

  left outer join (
    SELECT addr_id, amount
    FROM reward
  ) as "totalReward" on stake_address.id = "totalReward".addr_id

  where encode(stake_address.hash_raw, 'hex') = 'e1567298bc998d188d936f105f9e9e616f1980adacc06fc5732a57f9cc'

Адрес, указанный в этом SQL-запросе, зарабатывал вознаграждение только один раз, поэтому с ним проще работать.

Я подозреваю, что запрос на самом деле неверен. Таблица вознаграждений выглядит так (мой экземпляр в данный момент не синхронизирован):

cexplorer=# select * from reward ; 
 id | addr_id | amount | epoch_no | pool_id | block_id 
----+---------+--------+----------+---------+----------
(0 rows)

Итак, для каждой эпохи есть сумма вознаграждения (т.е. моментальный снимок вознаграждений за эпоху), и, не изучив ее должным образом, я даже не уверен, что находится в таблице reserve .
image

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

Мы обнаружили похожие проблемы. 137 делегатов сняли ровно 500 ADA. Показано внутри db-sync db в выводе таблицы. Некоторые из них после этого получили отрицательный баланс. Либо это связано с этой проблемой, либо мы делаем что-то не так с нашей стороны.

Например:

Один снял 500 ADA, но получил только 200 ADA согласно db-sync. Мой пример для Epoche в или после 214

https://github.com/input-output-hk/cardano-db-sync/pull/413 также исправляет это?

@mmahut я не уверен. Ошибка, исправленная в #413, также могла вызвать эту проблему. Или может быть более одной проблемы. @xdzurman ?

@mmahut Это в разных экземплярах? Мне нужен простой способ создать это, а наличие более одного экземпляра - непростая задача воспроизведения.

Извините, я назвал это преждевременно. Похоже, проблема исправлена, я отслеживаю ее и отчитаюсь через несколько дней.

Для меня это тоже выглядит исправленным, пока закрывается. Не стесняйтесь снова открывать, если возникнут какие-либо проблемы.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги