Не удалось отправить транзакцию через cardano-submit-api, пишет "WithdrawalsNotInRewardsDELEGS", что подразумевает неправильные вознаграждения, либо пытается вывести не все вознаграждения. Я проверил все части, где что-то могло пойти не так. После этого я сравнил награды за случайные адреса, полученные от db-sync и от yoroi api. Вот такие несовпадения у некоторых (у ловеласов):
Каждая строка представляет вознаграждение за синхронизацию базы данных от этого 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
Мы также заметили это в Ёрои.
Вот результаты для 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
.
Я предполагаю, что - В резерве хранятся награды ИНН. В таблице вознаграждений указаны награды, полученные в начале этой эпохи. Таким образом, оставшиеся вознаграждения представляют собой сумму всех вознаграждений и их вознаграждений за вычетом снятия средств.
Мы обнаружили похожие проблемы. 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 Это в разных экземплярах? Мне нужен простой способ создать это, а наличие более одного экземпляра - непростая задача воспроизведения.
Извините, я назвал это преждевременно. Похоже, проблема исправлена, я отслеживаю ее и отчитаюсь через несколько дней.
Для меня это тоже выглядит исправленным, пока закрывается. Не стесняйтесь снова открывать, если возникнут какие-либо проблемы.
Самый полезный комментарий
Извините, я назвал это преждевременно. Похоже, проблема исправлена, я отслеживаю ее и отчитаюсь через несколько дней.