cardano-submit-apiを介してトランザクションを送信できませんでした。「WithdrawalsNotInRewardsDELEGS」と表示され、間違った報酬を意味するか、すべての報酬を取り消そうとしました。 うまくいかなかった可能性のあるすべての部品をチェックしました。 その後、db-syncとyoroiapiから取得したランダムアドレスの報酬を比較しました。 これらはいくつかの(ラブレースでの)ミスマッチです:
各行は、この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で発生します
よろいでも気づきました
これは、実際の値が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
テーブルに何が含まれているかさえわかりません。
私は仮定します-予備はITN報酬を保持します。 報酬テーブルは、そのエポックの開始時に受け取った報酬を指定します。 したがって、残りの報酬は、すべての報酬とitn報酬の合計から引き出しを差し引いたものになります。
同様の問題を発見しました。 137人の代表者が正確に500人のADAを撤回しました。 テーブルwithdrawalのdb-syncdb内に表示されます。 その後、一部はマイナスのバランスになりました。 これはこの問題に関連しているか、私たちの側で何か間違ったことをしています。
例えば:
db-syncによると、1つは500 ADAを撤回しましたが、200ADAしか取得していません。 私の例は214以降のEpocheの例です
@mmahutわかりません。 #413で修正されたバグは、この問題も簡単に引き起こした可能性があります。 または、複数の問題がある可能性があります。 @xdzurman ?
@mmahutこれは別々のインスタンスにまたがっていますか? これを作成する簡単な方法が必要であり、複数のインスタンスを持つことは簡単な再現ケースではありません。
申し訳ありませんが、時期尚早に電話しました。 問題は修正されたようです。監視しており、数日後に報告します。
私にとっても修正されたようで、今は閉じています。 問題が発生した場合は、お気軽に再開してください。
最も参考になるコメント
申し訳ありませんが、時期尚早に電話しました。 問題は修正されたようです。監視しており、数日後に報告します。