Cardano-db-sync: いくつかのラブレースによる報酬テーブル

作成日 2020年11月12日  ·  12コメント  ·  ソース: input-output-hk/cardano-db-sync

cardano-submit-apiを介してトランザクションを送信できませんでした。「WithdrawalsNotInRewardsDELEGS」と表示され、間違った報酬を意味するか、すべての報酬を取り消そうとしました。 うまくいかなかった可能性のあるすべての部品をチェックしました。 その後、db-syncとyoroiapiから取得したランダムアドレスの報酬を比較しました。 これらはいくつかの(ラブレースでの)ミスマッチです:

image
各行は、このSQLからのdb-sync報酬を表します。
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"
yoroiapiからのマイナスの報酬。

@erikdはどうなっているのですか?

編集:yoroiはdb-syncからも取得するため、これらは2つの間違った値の差分である可能性があります。 いずれにせよ、エラーはdb-syncで発生します

最も参考になるコメント

申し訳ありませんが、時期尚早に電話しました。 問題は修正されたようです。監視しており、数日後に報告します。

全てのコメント12件

よろいでも気づきました

これは、実際の値が30428426であるcardano-db-syncの7つの異なるインスタンスの結果です。

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クエリを単純化できますか? 報酬、準備金、差額の3つの列があると便利です。

クエリが実際に間違っているのではないかと思います。 報酬テーブルは次のようになります(私のインスタンスは現在同期されていません):

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

私は仮定します-予備はITN報酬を保持します。 報酬テーブルは、そのエポックの開始時に受け取った報酬を指定します。 したがって、残りの報酬は、すべての報酬とitn報酬の合計から引き出しを差し引いたものになります。

同様の問題を発見しました。 137人の代表者が正確に500人のADAを撤回しました。 テーブルwithdrawalのdb-syncdb内に表示されます。 その後、一部はマイナスのバランスになりました。 これはこの問題に関連しているか、私たちの側で何か間違ったことをしています。

例えば:

db-syncによると、1つは500 ADAを撤回しましたが、200ADAしか取得していません。 私の例は214以降のEpocheの例です

@mmahutわかりません。 #413で修正されたバグは、この問題も簡単に引き起こした可能性があります。 または、複数の問題がある可能性があります。 @xdzurman

@mmahutこれは別々のインスタンスにまたがっていますか? これを作成する簡単な方法が必要であり、複数のインスタンスを持つことは簡単な再現ケースではありません。

申し訳ありませんが、時期尚早に電話しました。 問題は修正されたようです。監視しており、数日後に報告します。

私にとっても修正されたようで、今は閉じています。 問題が発生した場合は、お気軽に再開してください。

このページは役に立ちましたか?
0 / 5 - 0 評価