Cardano-db-sync: Table de récompense par quelques lacets d'amour

Créé le 12 nov. 2020  ·  12Commentaires  ·  Source: input-output-hk/cardano-db-sync

Je n'ai pas pu envoyer une transaction via cardano-submit-api, elle indiquait "WithdrawalsNotInRewardsDELEGS", impliquant de mauvaises récompenses ou essayant de ne pas retirer toutes les récompenses. J'ai vérifié toutes les pièces, là où ça aurait pu mal tourner. Après cela, j'ai comparé les récompenses pour les adresses aléatoires obtenues de db-sync et de yoroi api. Ce sont les décalages pour quelques-uns (en lovelaces):

image
Chaque ligne représente les récompenses db-sync de ce 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"
moins les récompenses de Yoroi api.

Que se passe-t-il @erikd ?

Edit : yoroi l'obtient également de db-sync, il s'agit donc peut-être de différences de deux valeurs erronées. Dans tous les cas, l'erreur provient de db-sync

Commentaire le plus utile

Désolé, je l'ai appelé prématurément. Il semble que le problème soit résolu, je le surveille et ferai rapport dans quelques jours.

Tous les 12 commentaires

Nous avons également remarqué cela à Yoroi

Voici les résultats pour 7 instances différentes de cardano-db-sync où la valeur réelle est 30428426

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

Comme vous pouvez le voir, seuls 1/7 backends ont obtenu le bon résultat

Nous avons revérifié que ces valeurs incorrectes sont stockées dans la base de données SQL, nous savons donc que ce problème n'est pas dans notre partie de la pile

@SebastienGllmt Quoi ? Différentes instances db-sync donnent des résultats différents ??? Exécutent-ils tous la même version ?

@xdzurman Seriez-vous capable de simplifier cette requête SQL ? Ce serait bien d'avoir trois colonnes, récompense, réserve et différence.

Je soupçonne que la requête est en fait erronée. Le tableau des récompenses ressemble à ceci (mon instance n'est pas actuellement synchronisée) :

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

Donc, pour chaque époque , il y a un montant de récompense (c'est-à-dire un instantané des récompenses pour l'époque) et sans l'explorer correctement, je ne suis même pas sûr de ce qu'il y a dans la table reserve .

@erikd C'est la requête que nous avons exécutée sur les 7 backends différents qui ont donné des résultats différents. Ce sont tous la même version de cardano-db-sync et la même version de nœud

  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'

L'adresse spécifiée dans cette requête SQL n'a jamais gagné de récompenses qu'une seule fois, il est donc plus facile de travailler avec.

Je soupçonne que la requête est en fait erronée. Le tableau des récompenses ressemble à ceci (mon instance n'est pas actuellement synchronisée) :

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

Donc, pour chaque époque , il y a un montant de récompense (c'est-à-dire un instantané des récompenses pour l'époque) et sans l'explorer correctement, je ne suis même pas sûr de ce qu'il y a dans la table reserve .
image

Je suppose que - La réserve détient des récompenses ITN. Le tableau des récompenses spécifie les récompenses reçues au début de cette époque. Ainsi, les récompenses restantes sont la somme de toutes les récompenses et des récompenses moins les retraits.

Nous avons découvert des problèmes similaires. 137 délégants ont retiré exactement 500 ADA. Montré à l'intérieur de la base de données db-sync dans le retrait de la table. Certains d'entre eux ont obtenu un solde négatif par la suite. Soit cela est lié à ce problème, soit nous faisons quelque chose de mal de notre côté.

Par example:

L'un a retiré 500 ADA mais n'a obtenu que 200 ADA selon db-sync. Mon exemple est pour Epoche à ou après 214

@mmahut je ne suis pas sûr. Le bogue corrigé sur #413 pourrait facilement avoir causé ce problème également. Ou il peut y avoir plus d'un problème. @xdzurman ?

@mmahut C'est dans des instances distinctes ? J'ai besoin d'un moyen simple de produire cela et avoir plus d'une instance n'est pas un cas de reproduction facile.

Désolé, je l'ai appelé prématurément. Il semble que le problème soit résolu, je le surveille et ferai rapport dans quelques jours.

Cela semble également corrigé pour moi, fermant pour l'instant. N'hésitez pas à rouvrir en cas de problème.

Cette page vous a été utile?
0 / 5 - 0 notes