Cardano-db-sync: Tabela de recompensas por alguns lovelaces

Criado em 12 nov. 2020  ·  12Comentários  ·  Fonte: input-output-hk/cardano-db-sync

Não consegui enviar uma transação através do cardano-submit-api, dizia "WithdrawalsNotInRewardsDELEGS", implicando recompensas erradas ou tentando retirar nem todas as recompensas. Eu verifiquei todas as peças, onde poderia ter dado errado. Depois disso, comparei recompensas por endereços aleatórios obtidos do db-sync e da yoroi api. Estes são os desencontros para alguns (em lovelaces):

image
Cada linha representa recompensas de sincronização de banco de dados deste 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"
menos recompensas de yoroi api.

O que está acontecendo @erikd ?

Edit: yoroi também obtém do db-sync, então estes são possivelmente diferenças de dois valores errados. De qualquer forma, o erro se origina no db-sync

Comentários muito úteis

Desculpe, liguei prematuramente. Parece que o problema foi corrigido, estou monitorando e retornarei em alguns dias.

Todos 12 comentários

Também notamos isso em Yoroi

Aqui estão os resultados para 7 instâncias diferentes de cardano-db-sync onde o valor real é 30428426

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

Como você pode ver, apenas 1/7 dos back-ends obtiveram o resultado correto

Verificamos duas vezes se esses valores incorretos estão armazenados no banco de dados SQL, portanto, sabemos que esse problema não está em nossa parte da pilha

@SebastienGllmt O quê? Diferentes instâncias db-sync dão resultados diferentes??? Estão todos rodando a mesma versão?

@xdzurman Você seria capaz de simplificar essa consulta SQL? Seria bom ter três colunas, recompensa, reserva e diferença.

Eu suspeito que a consulta está realmente errada. A tabela de recompensas se parece com isso (minha instância não está sincronizada no momento):

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

Portanto, para cada época há um valor de recompensa (ou seja, um instantâneo das recompensas para a época) e, sem explorá-lo adequadamente, nem tenho certeza do que está na tabela reserve .

@erikd Esta é a consulta que executamos nos 7 back-ends diferentes que deram resultados diferentes. Eles são todos a mesma versão do cardano-db-sync e a mesma versão do nó

  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'

O endereço especificado nesta consulta SQL só ganhou recompensas uma vez, por isso é mais fácil trabalhar com ele.

Eu suspeito que a consulta está realmente errada. A tabela de recompensas se parece com isso (minha instância não está sincronizada no momento):

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

Portanto, para cada época há um valor de recompensa (ou seja, um instantâneo das recompensas para a época) e, sem explorá-lo adequadamente, nem tenho certeza do que está na tabela reserve .
image

Presumo que - A reserva detém recompensas ITN. A tabela de recompensas especifica as recompensas recebidas no início dessa época. Portanto, as recompensas restantes são a soma de todas as recompensas e suas recompensas menos as retiradas.

Descobrimos problemas semelhantes. 137 delegantes retiraram exatamente 500 ADA. Mostrado dentro do db-sync db na retirada da tabela. Alguns deles ficaram com saldo negativo depois disso. Ou isso está conectado a esse problema ou estamos fazendo algo errado do nosso lado.

Por exemplo:

Um retirou 500 ADA, mas obteve apenas 200 ADA de acordo com o db-sync. Meu exemplo é para a Epoche em ou após 214

@mmahut Não tenho certeza. O bug corrigido no #413 poderia facilmente ter causado esse problema também. Ou pode haver mais de um problema. @xdzurman ?

@mmahut Isso é em instâncias separadas? Eu preciso de uma maneira fácil de produzir isso e ter mais de uma instância não é um caso de reprodução fácil.

Desculpe, liguei prematuramente. Parece que o problema foi corrigido, estou monitorando e retornarei em alguns dias.

Parece fixo para mim também, fechando por enquanto. Sinta-se à vontade para reabrir se ocorrer algum problema.

Esta página foi útil?
0 / 5 - 0 avaliações