Cardano-db-sync: 報酬は未登録のステークアドレスに配布されました

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

メインネット、db-sync 6.0.1、ステークアドレス

登録履歴

SELECT stake_registration.addr_id, block.epoch_no, block.time
FROM stake_address
LEFT JOIN stake_registration ON stake_registration.addr_id = stake_address.id
LEFT JOIN tx ON tx.id = stake_registration.tx_id
LEFT JOIN block ON block.id = tx.block_id 
WHERE stake_address.view = 'stake1u838ke609j09ezrgj5nwnplvc7g3cq62pa2n9z0x6w3clhsagtp86';

 addr_id | epoch_no |        time
---------+----------+---------------------
   38278 |      208 | 2020-08-01 07:45:51
   38278 |      233 | 2020-12-01 22:31:13
(2 rows)

登録解除履歴

SELECT stake_deregistration.addr_id, block.epoch_no, block.time
FROM stake_address
LEFT JOIN stake_deregistration ON stake_deregistration.addr_id = stake_address.id
LEFT JOIN tx ON tx.id = stake_deregistration.tx_id
LEFT JOIN block ON block.id = tx.block_id 
WHERE stake_address.view = 'stake1u838ke609j09ezrgj5nwnplvc7g3cq62pa2n9z0x6w3clhsagtp86';

 addr_id | epoch_no |        time
---------+----------+---------------------
   38278 |      232 | 2020-12-01 18:25:59
(1 row)

ご覧のとおり、アドレスは 232 エポックの終わりに登録されておらず、エポック 231 の報酬はこのアドレスに配布されるべきではありませんが、

SELECT reward.*, block.epoch_no AS block_epoch_no, block.time
FROM reward
LEFT JOIN block ON block.id = reward.block_id 
WHERE reward.addr_id = 38278 AND reward.epoch_no = 231;

   id    | addr_id |  amount   | epoch_no | pool_id | block_id | block_epoch_no |        time
---------+---------+-----------+----------+---------+----------+----------------+---------------------
 1041508 |   38278 | 192969560 |      231 |     144 |  5023676 |            233 | 2020-12-01 21:44:51
(1 row)
bug priority high

最も参考になるコメント

PR #469 のdb-syncのバージョンを使用します。 ステークアドレス\xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fdeの報酬はorphaned_rewardsテーブルに正しく挿入されます。

cexplorer=# select stake_address.hash_raw, orphaned_reward.epoch_no, orphaned_reward.amount
         from orphaned_reward inner join stake_address on stake_address.id = orphaned_reward.addr_id
         where stake_address.hash_raw = '\xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde'; 
                           hash_raw                           | epoch_no |  amount   
--------------------------------------------------------------+----------+-----------
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |      231 | 192969560

また、報酬表にも存在しません。

cexplorer=# select stake_address.hash_raw as "stakeAddress", "totalReward".* from stake_address
    left outer join (SELECT addr_id, amount, epoch_no  FROM reward) as "totalReward"
     on stake_address.id = "totalReward".addr_id
     where stake_address.hash_raw = '\xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde' ;
                         stakeAddress                         | addr_id |  amount   | epoch_no 
--------------------------------------------------------------+---------+-----------+----------
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 162720747 |      211
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 162485461 |      212
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 167344099 |      213
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 167043060 |      214
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 200722225 |      215
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 191413549 |      216
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 143111843 |      217
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 147836812 |      218
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 154740829 |      219
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 145433327 |      220
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 165631299 |      221
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 151825651 |      222
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 169141624 |      223
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 165184716 |      224
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 148899668 |      225
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 157838234 |      226
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 223252352 |      227
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 147889017 |      228
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 151858721 |      229
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 165782849 |      230
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 135711434 |      232
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 145964545 |      233
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 |    100702 |      235
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 |    102078 |      236
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 |        65 |      238
(25 rows)

全てのコメント28件

:フェイスパーム:

しばらくこれを見て、突然、最初のクエリが@dmitrystasが示していると考えているものを示していないことにtx.id = stake_registration.tx_id参加し、トランザクションからblock.epoch_noを取得することにより、ステークの登録/登録解除が発生するエポックを取得しますが、実際にアクティブな場合は発生しません。

ステーキングに関連するほとんどの操作では、エポックNで発生するアクション (登録、賭け金の増加など) がエポックN + 2アクティブになります。

つまり、最初のクエリは実際には次のようになります。

cexplorer=# SELECT stake_registration.addr_id, block.epoch_no + 2 as epoch_no, block.time FROM stake_address 
              INNER JOIN stake_registration ON stake_registration.addr_id = stake_address.id 
              INNER JOIN tx ON tx.id = stake_registration.tx_id INNER JOIN block ON block.id = tx.block_id
              WHERE stake_address.view = 'stake1u838ke609j09ezrgj5nwnplvc7g3cq62pa2n9z0x6w3clhsagtp86';
addr_id | epoch_no |        time         
---------+----------+---------------------
   38266 |      210 | 2020-08-01 07:45:51
   38266 |      235 | 2020-12-01 22:31:13

そして2番目:

cexplorer=# SELECT stake_deregistration.addr_id, block.epoch_no + 2 as epoch_no, block.time FROM stake_address
              INNER JOIN stake_deregistration ON stake_deregistration.addr_id = stake_address.id
              INNER JOIN tx ON tx.id = stake_deregistration.tx_id INNER JOIN block ON block.id = tx.block_id
              WHERE stake_address.view = 'stake1u838ke609j09ezrgj5nwnplvc7g3cq62pa2n9z0x6w3clhsagtp86';
 addr_id | epoch_no |        time         
---------+----------+---------------------
   38266 |      234 | 2020-12-01 18:25:59

@dmitrystasそれはすべてactive_epoch_noの列stake_registrationstake_deregistration私が持っているように、テーブルをdelegationテーブル?

@erikdこんばんは。 それは元の問題https://github.com/Emurgo/yoroi-frontend/issues/1832#issue -754776885
役に立つかもしれない

Yoroi と Adalite は間違った 192 FAKE ADA 報酬を表示しますが、実際には 0 です。最後の 2 報酬は adawallet.io から引き出されます (db-sync は使用しません)
image

ステップでの問題の簡単な説明:
1)紀元 232 年。 報酬の引き出しとステーキングキーの登録解除を同時に行います。 報酬は 0 です。料金には十分な ADA があります
2)エポック 233 。 キーが登録されていても登録されていない場合、最初に残った報酬を受け取るべきですが、ヨロイは 192ADA を受け取ったと表示しています。 退出しようとすると、ヨロイがエラーを出します。 db-sync show Reward 0ADA を使用しない他のウォレット
3)エポック 233 。 再び同じプールに委任します。 キーが登録されました。 真の報酬は0。ヨロイは192の報酬。
4)エポック 234 。 残り 2 番目の報酬 135ADA を受け取ります。 真の報酬残高は 135ADA です。
ヨロイは 327ADA (192+135) を示しています。 ヨロイを通じて報酬を引き出せない トランザクションの送信中にサーバーからエラーが発生しました。
5)エポック 235 。 私は最後の3番目の報酬145ADAを受け取ります。 真の報酬残高は 280ADA (135+145) です。
Yoroi は 472ADA (192+135+145) を示しています Yoroi を介して報酬を引き出すことができません トランザクションの送信中にサーバーからエラーを受け取りました。
6)エポック 235 。 db-synsを使用せず、280ADAの報酬残高を正しく表示するadawallet.ioを通じて280ADAをスムーズに引き出します
7) 280ADA の真の報酬が引き出された後 (0ADA のまま)、ヨロイはまだ 192ADA の報酬残高を示しています。

Yoroi はまだ報酬残高 192ADA を示しています。

少なくとも 2 つの可能性があります。

  • db-syncバグがあります
  • ヨロイバグがある

db-syncしか扱い

stake1u838ke609j09ezrgj5nwnplvc7g3cq62pa2n9z0x6w3clhsagtp86はここで関心のあるステークキーですか?

@erikdはい、ステークキーはtake1u838ke609j09ezrgj5nwnplvc7g3cq62pa2n9z0x6w3clhsagtp86です
Yoroi だけでなく、Adalite.io と adastat.net にもバグがあることに注意してください。
彼らはそのバグを持っていません: cardanoscan.io と adawallet.io

一部のオンライン ウォレットにこのバグがあり、他のウォレットにはない場合、そしてこれらすべてがdb-sync依存している場合、問題がdb-syncあることは非常にまれです。

@erikdしかし、adawallet.ioはdb-syncを使用せず、正しい報酬バランス(0ADA)を表示し、最後の報酬を撤回させます

これもまた、これがdb-syncバグではなく、ヨロイのバグであることを示唆しています。

Exodus もこのバグに遭遇しました。

これは間違いなく cardano-db-sync のバグであり、Yoroi だけでなく cardano-db-sync の他の複数のユーザーにも影響を与えることを考えると、Yoroi のバグではありません。 cardanoscan と adawallet はどちらも cardano-db-sync を使用しないため、影響を受けません。

cardano-db-syncが報告するもの

@IlyaSofronovによって提供されたアドレスの報酬履歴を与える SQL クエリは次の

select stake_address.hash_raw as "stakeAddress"
      , "totalReward".*

from stake_address

left outer join (
  SELECT addr_id, amount, epoch_no
  FROM reward
) as "totalReward" on stake_address.id = "totalReward".addr_id

where encode(stake_address.hash_raw, 'hex') = 'e1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde'

次の結果が得られます

 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 162720747 |      211
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 162485461 |      212
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 167344099 |      213
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 167043060 |      214
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 200722225 |      215
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 191413549 |      216
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 143111843 |      217
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 147836812 |      218
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 154740829 |      219
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 145433327 |      220
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 165631299 |      221
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 151825651 |      222
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 169141624 |      223
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 165184716 |      224
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 148899668 |      225
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 157838234 |      226
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 223252352 |      227
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 147889017 |      228
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 151858721 |      229
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 165782849 |      230
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 192969560 |      231
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 135711434 |      232
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 145964545 |      233
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 |    100702 |      235
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 |    102078 |      236

: これらの行の合計は 3,765,004,402 です。

バックエンドからの現在の (間違った) 状態

{
    "remainingAmount": "193172340",
    "rewards": "3765004402",
    "withdrawals": "3571832062",
}

バックエンドがrewards値の db-sync 行の合計を返すことがわかります (これが問題になる理由は後で説明します)

このバグの影響を受けないことがわかっている cardanoscan の値を合計することで、 withdrawals金額が正しいことを確認することもできます

remainingAmountはちょうどrewards - withdrawals

ウォレットの登録履歴

このステーキング キーの履歴を見ると、次のことがわかります。

  • エポック 232 に登録解除されました
  • エポック 233 に再登録されました

カルダノノードからの現在の状態

私のcardano-nodeインスタンスによると、これはステーキングアドレス内の現在の値です

[
    {
        "address": "stake1u838ke609j09ezrgj5nwnplvc7g3cq62pa2n9z0x6w3clhsagtp86",
        "delegation": "pool1kkfkdces5mdcyc9dn2hgg3463jggjvw3h89nejjarkz25uavaqu",
        "rewardAccountBalance": 202780
    }
]

したがって、ノードによると、ウォレットの残高はエポック 235 + エポック 236 (100702 + 102078 = 202780) であることがわかります。

問題は何ですか?

cardanoscanを見ると、ウォレットの完全な引き出し履歴を確認できます。 各引き出しに対応するものを見てみましょう。

| エポック撤退 | 出金額 | db-sync エポック行が含まれています |
|-----------------|------------------|------------ -----------------|
| 228 | 2601.373144 | 211、212、...、225、226 |
| 230 | 371.141369 | 227、228 |
| 232 | 317.641570 | 229、230 |
| 234 | 135.711434 | 232 |
| 235 | 145.964545 | 233 |

しかし、あなたはこれらのいずれにも含まれていません(192969560)カルダーノ-DB-同期エポック231を見ることができます!

案の定、私たちのバックエンド応答"remainingAmount": "193172340",を見て、誤って含まれていたエポック 231 を削除すると、フルノードから期待される結果である193172340 - 192969560 = 202780が得られます!

結論

私の調査によると、cardano-db-syncには、すべきではないにもかかわらず、報酬履歴の結果に行231が含まれているようです。

最初のクエリを簡素化し、同じ結果が得られることを確認しました (実際に実行しました)。

バックエンドからの現在の (間違った) 状態

単一のソースからすべての情報を取得したいので、次のようにします。

cexplorer=# select sum (amount) from stake_address
        left outer join (SELECT addr_id, amount, epoch_no 
        FROM reward) as "totalReward" on stake_address.id = "totalReward".addr_id
        where stake_address.hash_raw = '\xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde' ;
    sum     
------------
 3765004402

そして:

cexplorer=# select sum (amount) from withdrawal where addr_id = 38266;
    sum     
------------
 3571832062

どちらもあなたの数字と一致しています。

興味深いことに、 3571832062 + 192969560 + 202780 - 3765004402で、 3571832062は引き出しの合計、 3765004402は報酬の合計です。 他の値は次のとおりです。 202780は引き出し後の報酬残高のあなたの数字であり、 192969560はエポック231の報酬です。

cexplorer=# select stake_address.view as "stakeAddress", "totalReward".* from stake_address
     left outer join (SELECT addr_id, amount, epoch_no  FROM reward) as "totalReward"
     on stake_address.id = "totalReward".addr_id
     where stake_address.hash_raw = '\xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde'
     and epoch_no = 231 ;
                        stakeAddress                         | addr_id |  amount   | epoch_no 
-------------------------------------------------------------+---------+-----------+----------
 stake1u838ke609j09ezrgj5nwnplvc7g3cq62pa2n9z0x6w3clhsagtp86 |   38266 | 192969560 |      231

では、エポック231 ( db-sync単に元帳の状態から引き出され、余分な処理なしでデータベースに挿入される) に対する報酬は正しいですか? そのステークアドレスのステーク登録履歴を見てみましょう:

cexplorer=# select stake_address.hash_raw, stake_registration.tx_id, block.epoch_no
    as tx_epoch_no, (block.epoch_no + 2) as active_epoch_no
    from stake_registration inner join stake_address on stake_registration.addr_id = stake_address.id 
    inner join tx on tx.id = stake_registration.tx_id inner join block on tx.block_id = block.id
    where stake_address.hash_raw = '\xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde' ;
                           hash_raw                           |  tx_id  | tx_epoch_no | active_epoch_no 
--------------------------------------------------------------+---------+-------------+-----------------
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde | 2449294 |         208 |             210
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde | 3103705 |         233 |             235
(2 rows)

cexplorer=# select stake_address.hash_raw, stake_deregistration.tx_id, block.epoch_no
    as tx_epoch_no, (block.epoch_no + 2) as active_epoch_no from stake_deregistration
    inner join stake_address on stake_deregistration.addr_id = stake_address.id
    inner join tx on tx.id = stake_deregistration.tx_id inner join block
    on tx.block_id = block.id
    where stake_address.hash_raw = '\xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde' ;
                           hash_raw                           |  tx_id  | tx_epoch_no | active_epoch_no 
--------------------------------------------------------------+---------+-------------+-----------------
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde | 3101670 |         232 |             234

登録と登録解除の両方について、 tx_id (登録/登録解除を含む tx の ID)、 tx_epoch_no (tx が含まれたエポック)、およびactive_epoch_no (登録/登録解除がアクティブになるエポック)。

アクティブなエポック番号を見ると、ステーク登録はエポック[210 .. 233][235 ..]アクティブになっているはずです。 これは、このアドレスの実際の報酬と一致します。

cexplorer=# select stake_address.hash_raw as "stakeAddress", "totalReward".* from stake_address
    left outer join (SELECT addr_id, amount, epoch_no  FROM reward) as "totalReward"
     on stake_address.id = "totalReward".addr_id
     where stake_address.hash_raw = '\xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde' ;
                         stakeAddress                         | addr_id |  amount   | epoch_no 
--------------------------------------------------------------+---------+-----------+----------
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 162720747 |      211
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 162485461 |      212
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 167344099 |      213
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 167043060 |      214
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 200722225 |      215
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 191413549 |      216
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 143111843 |      217
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 147836812 |      218
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 154740829 |      219
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 145433327 |      220
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 165631299 |      221
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 151825651 |      222
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 169141624 |      223
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 165184716 |      224
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 148899668 |      225
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 157838234 |      226
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 223252352 |      227
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 147889017 |      228
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 151858721 |      229
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 165782849 |      230
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 192969560 |      231
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 135711434 |      232
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 145964545 |      233
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 |    100702 |      235
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 |    102078 |      236
(25 rows)

つまり、 234を除くすべてのエポックに報酬があります。

したがって、あなたの結論は次のように思います。

私の調査によると、cardano-db-syncには、すべきではないにもかかわらず、報酬履歴の結果に行231が含まれているようです。

が正しくない場合、そのステークアドレスにエポック231報酬が必要です。

さらに、あなたのコメントは次のように信じています。

バックエンドからの現在の (間違った) 状態
{
"remainingAmount": "193172340",
「報酬」:「3765004402」、
「引き出し」:「3571832062」、
}

実際には正しいです。 報酬の価値と引き出しの価値の差が、現在の引き出しされていない報酬の残高です。

実際には正しいです。 報酬の価値と引き出しの価値の差が、現在の引き出しされていない報酬の残高です。

ノードがアカウントの報酬残高として193172340ではなく202780を返すことがわかっているため、これは当てはまりません。

つまり、234 を除くすべてのエポックに報酬があります。

2 つのエポックが欠落していることを期待する必要があります。

  1. ステークキーが登録されていなかったため、リザーブがリザーブに返送されたエポック
  2. キーの登録を解除してから再登録するまでの 1 エポックのギャップを表すエポック

欠落している234エポックは (2) に対応しており、231 はエポック 233 でユーザーのウォレットに表示される必要があるため、231 は (1) に対応すると思います。 (1)

2 つのエポックが欠落していることを期待する必要があります。

どうして? このステークアドレスの操作によると:

| 操作 | tx_epoch_no | active_epoch_no |
|-------------------|---------------------|------- ---------|
| 登録 | 208 | 210 |
| 登録解除 | 232 | 234 |
| 登録 | 233 | 235 |

単一のエポック ( 234 ) でのみ登録解除され、そのエポックでは報酬を受け取りませんでした。

報酬のない時代が 2 つあるのはなぜですか? あなたが言及している 2 つのケースは実際には同じものであり、1 つのエポックだけが報酬なしに進むと確信しています。

Slack の@SebastienGllmt

登録解除は、2 エポックではなく、すぐに行われるという点で特別です。

登録解除がすぐに進んだ場合、これはtx_epoch_no == 232ため、231 の報酬だけでなく、エポック[231..234]すべての報酬が失われます。

これには@JaredCorduanが必要だと思います。

@SebastienGllmtの説明は、元帳のルールと一致しています。

ステーク資格証明が登録解除されるのは少し哲学的ですが、私は次のように表現します。登録解除はすぐに行われますが、報酬は遅れます。 クレデンシャルがエポックeで登録解除された場合、 e / e+1境界 ( e-2 / e -1境界で取得されたスナップショットから取得) で報酬を受け取ります。 e+1 / e+2境界で報酬を受け取ります ( e-1 / e境界で撮影されたスナップショットから)

これは、命名法に混乱があるようです。

dbs-yncの POV から: :

  • tx_epoch_no : 登録/登録抹消証明書のトランザクションを含むエポック。
  • active_epoch_no : 基本的にtx_epoch_no + 2 、ステークアドレスへの変更がアクティブになるエポック。
  • epoch_no rewardテーブルのepoch_no : 報酬が獲得された実際のエポック。

ステーク資格情報がエポック 232 のトランザクションからの登録解除証明書に含まれていた場合、232/233 境界で取得されたスナップショットには含まれません。 これは、235/236 境界で配布される報酬の更新には含まれないことを意味します。 @erikdの言葉では、これは 234 の報酬です。 さらに、(再) 登録証明書がエポック 233 のトランザクションに上陸した場合、これは _唯一の_ 報酬更新であり、見逃すことになります。

「いつ登録が解除されたか」、「報酬が」、「いつアクティブになったか」などは、はっきりしないと混乱する可能性があることに注意してください。 だから、私が誰に同意しているかは明確ではありません:)

混乱しているように見えるので、2 つの予想される欠落エポック (db-sync 231 と db-sync 234) を示す写真を作成しました。

私は、231 が厳密には欠落していない可能性があるという事実から混乱が生じていると思います。これは、元帳の状態が、ユーザーではなく準備金に配布されたと考えているだけの可能性があります。 元帳の状態から見れば報酬は存在する(準備金に分配される)が、ユーザーの観点からは231は含まれるべきではない

image

不足している 2 つのエポック (db-sync 231 および db-sync 234) を示す画像を作成しました。

しかし、 db-syncが報告する実際の報酬は次のとおりです。

cexplorer=# select stake_address.hash_raw as "stakeAddress", "totalReward".* from stake_address
    left outer join (SELECT addr_id, amount, epoch_no  FROM reward) as "totalReward"
     on stake_address.id = "totalReward".addr_id
     where stake_address.hash_raw = '\xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde' ;
                         stakeAddress                         | addr_id |  amount   | epoch_no 
--------------------------------------------------------------+---------+-----------+----------
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 162720747 |      211
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 162485461 |      212
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 167344099 |      213
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 167043060 |      214
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 200722225 |      215
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 191413549 |      216
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 143111843 |      217
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 147836812 |      218
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 154740829 |      219
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 145433327 |      220
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 165631299 |      221
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 151825651 |      222
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 169141624 |      223
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 165184716 |      224
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 148899668 |      225
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 157838234 |      226
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 223252352 |      227
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 147889017 |      228
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 151858721 |      229
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 165782849 |      230
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 192969560 |      231
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 135711434 |      232
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 145964545 |      233
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 |    100702 |      235
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 |    102078 |      236
(25 rows)

そして、エポック234は報酬がありません。 db-syncは ledger-state からこのテーブルの内容を取得し、 db-sync追加するのはepoch_no列だけです。

あなたの図はこの表と一致しないため、図が正しくない可能性があります。 node (具体的にはアドレス報酬残高の計算) にもバグがある可能性がありますが、現時点では単一の変数 ( db-sync ) のみを処理したいと思います。

あなたの図では、エポック 233 の「配信された報酬」に取り消し線が引かれていますが、Jared と私はどちらもそれは正しくないと思います。チェーン)。

@SebastienGllmtは次の

私は、231 が厳密には欠落していない可能性があるという事実から混乱が生じていると思います。これは、元帳の状態が、ユーザーではなく準備金に配布されたと考えているだけの可能性があります。

しかし、 rewardsテーブルは、ステーク アドレスに分配される報酬を示しています。 準備金に分配された場合、この表には含まれません。 db-syncは、この報奨情報をステークアドレスから報奨金額までのマップとして受け取ります。 現在、元帳の状態自体が間違っている可能性がありますが、元帳の状態からマップを取得した後、エラーが忍び込む余地はほとんどありません。

私が言ったとき、私は間違っていました:

さらに、(再) 登録証明書がエポック 233 のトランザクションに到着した場合、これが見逃される唯一の報酬更新になります。

実際、 @SebastienGllmtが次のように言ったときはまさに正しかった。

2 つのエポックが欠落していることを期待する必要があります。

  1. ステークキーが登録されていなかったため、リザーブがリザーブに返送されたエポック
  2. キーの登録を解除してから再登録するまでの 1 エポックのギャップを表すエポック

232/233 エポック境界に登録されていないことにより、ステーク資格証明は次の両方を行います。

  • 232/233 境界で適用されている更新から報酬を受け取らない、および
  • は、232/233 境界で取得されたステーク分配スナップショットには含まれていません (235/236 境界で配布された報酬を取得しないようにするため)。

db-sync が 232/233 境界で配布された報酬をどのように報告しているのか推測できます (これは実際には@SebastienGllmtの推測です :))。 元帳の状態は、エポック境界の直前まで、どの資格情報がまだ登録されているかを知ることができません。 未登録のクレデンシャルに対する報酬は、リザーブに返却されます。 (正式な仕様のFigure 51: Reward Update Application

@SebastienGllmtの上の写真は見栄えがしますが、実際には、矢印はブロック生成フェーズを説明するために別のエポックにまたがる必要があることに注意してください。 たとえば、230/231 境界で撮影されたスナップショットからの報酬は、実際には 233/234 境界まで配布されません。

さて、これについての説明があります。 db-syncはレグステートを維持し、エポック報酬をMap StakeAddress Coinとして引き出し、それをデータベースに挿入します。 ただし、そのマップには無効なStakeAddressエントリが含まれており、レダーステートはこれらのエントリを削除し、獲得した報酬をリザーブに効果的に還元します。

解決策は、元帳の状態から有効なStakeAddressのセットをプルし、有効なStakeAddressのセットで発生しないすべてのエントリを削除してMapをフィルタリングすることです。

この「ファントム」報酬が「nondistributed_rewards」などの新しいテーブルに配置されると素晴らしいでしょう。 これにより、プールの収益性を正しく計算できます。

@dmitrystas :

この「ファントム」報酬が「nondistributed_rewards」などの新しいテーブルに配置されると素晴らしいでしょう。 これにより、プールの収益性を正しく計算できます。

これらの分配されない報酬 (準備金に戻される)、投票の収益性を計算するために使用最良の方法や最も簡単な方法ではないと確信しています。

この問題のために特別にチケットを作成しまし

OK、挿入される前に報酬リストから無効な報酬を除外するソリューションがあり、実際にエポック231そのアドレスには報酬があります。

これらの「無効」な報酬を別のテーブルに追加できるように、これを変更する必要があります。

PR #469 のdb-syncのバージョンを使用します。 ステークアドレス\xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fdeの報酬はorphaned_rewardsテーブルに正しく挿入されます。

cexplorer=# select stake_address.hash_raw, orphaned_reward.epoch_no, orphaned_reward.amount
         from orphaned_reward inner join stake_address on stake_address.id = orphaned_reward.addr_id
         where stake_address.hash_raw = '\xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde'; 
                           hash_raw                           | epoch_no |  amount   
--------------------------------------------------------------+----------+-----------
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |      231 | 192969560

また、報酬表にも存在しません。

cexplorer=# select stake_address.hash_raw as "stakeAddress", "totalReward".* from stake_address
    left outer join (SELECT addr_id, amount, epoch_no  FROM reward) as "totalReward"
     on stake_address.id = "totalReward".addr_id
     where stake_address.hash_raw = '\xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde' ;
                         stakeAddress                         | addr_id |  amount   | epoch_no 
--------------------------------------------------------------+---------+-----------+----------
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 162720747 |      211
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 162485461 |      212
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 167344099 |      213
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 167043060 |      214
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 200722225 |      215
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 191413549 |      216
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 143111843 |      217
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 147836812 |      218
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 154740829 |      219
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 145433327 |      220
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 165631299 |      221
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 151825651 |      222
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 169141624 |      223
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 165184716 |      224
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 148899668 |      225
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 157838234 |      226
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 223252352 |      227
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 147889017 |      228
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 151858721 |      229
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 165782849 |      230
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 135711434 |      232
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 | 145964545 |      233
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 |    100702 |      235
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 |    102078 |      236
 \xe1e27b674f2c9e5c88689526e987ecc7911c034a0f553289e6d3a38fde |   38266 |        65 |      238
(25 rows)
このページは役に立ちましたか?
0 / 5 - 0 評価