Cardano-db-sync: Contoh saldo akun

Dibuat pada 25 Mar 2021  ·  10Komentar  ·  Sumber: input-output-hk/cardano-db-sync

Saya mungkin sedikit terlambat ke pesta, tetapi maukah Anda berbagi bagaimana seseorang akan melacak saldo akun, misalnya?

Menghitung outputs + reward + reserve + treasury - inputs - withdrawal tidak akan berhasil dan sepertinya tidak ada cara yang bagus dan mudah untuk mengatasi ini.

Kandidat yang baik bisa menjadi stake1uyluup0rh6r2cc7kcw8nudqz990ezf5ltagxmw3u8deukvqwq7etq (akun hadiah untuk kumpulan yang sudah pensiun). Penjelajah yang berbeda menunjukkan ini dengan cara yang berbeda, tetapi saya pikir saat ini tidak mungkin tanpa solusi apa pun/komputasi rumit tambahan. Hal-hal menjadi lebih kabur saat mempertimbangkan kasus tepi. Dengan semua itu, bukankah bermanfaat untuk secara eksplisit melacak info reap (selain deposit ) bersama dengan akun dan epoch di dbsync?

_Awalnya diposting oleh @1000101 di https://github.com/input-output-hk/cardano-db-sync/issues/474#issuecomment -804793203_

Komentar yang paling membantu

Saya setuju dengan ini. Ada juga banyak kasus tepi yang harus ditangani oleh setiap "pengguna" cardano-db-sync. Baik Adalite dan Yoroi bingung ketika mereka melihat akun yang sebelumnya merupakan akun hadiah dari kumpulan pensiunan:
image
image

Selain itu, hanya cardanoscan AFAIK yang menangani sisa hadiah dengan benar, dan mereka tidak menggunakan db-sync.

Seharusnya ada hubungan mudah yang akan diperbarui dengan cara yang sama seperti hadiah yang ditambahkan secara otomatis. Mari kita ambil kumpulan dengan beberapa deregistrasi sebagai contoh, karena itu sebenarnya cukup umum dan sulit untuk menangani saldo hadiah dari akun pemiliknya.

Ada 9 sertifikat pensiun untuk itu
image

Dan 15 sertifikat pendaftaran
image

Ada banyak kasus tepi dan aturan pensiun yang tidak jelas yang ditolak oleh sertifikat baru .

@erikd , jika Anda bersikeras pada koneksi yang memadai antara setoran 500 tx dan pensiun, bagaimana Anda akan menulis kueri hanya untuk setoran yang dikembalikan dari salah satu akun pemiliknya - e127e9e94eaa9287680e877832700a1724255e9688609497e09a6c440f? Jika tidak, dapatkah kita menambahkan ini secara eksplisit ke db-sync? Katakanlah, sebagai tabel baru, bernama pool_refunds , dengan addr_id , jumlah (saat ini harus kelipatan 500) dan epoch_no - sehingga ini ditangani dengan benar, dan di satu tempat.

Semua 10 komentar

Terima kasih telah membuka masalah ini atas nama saya! Hanya untuk memperjelas sedikit lebih lanjut - ini bukan hanya tentang akun itu sendiri, tetapi terutama tentang pelacakan reap di suatu tempat di db sehingga dapat dengan mudah digunakan dalam perhitungan saldo akun (yang digunakan di mana-mana, misalnya pool live ukuran pasak, janji langsung kumpulan, dll.).

@1000101 Apa itu "menuai"? Tidak ada tabel atau kolom di db-sync yang disebut "menuai".

Saldo akun tidak sepele.

Alamat di Shelley dan era selanjutnya memiliki dua komponen; kredensial pembayaran dan kredensial staking. Alamat pasak (misalnya stake1uyluup0rh6r2cc7kcw8nudqz990ezf5ltagxmw3u8deukvqwq7etq ) berasal dari yang belakangan. Namun dimungkinkan untuk membuat alamat yang valid yang tidak mengandung kredensial staking.

Jadi meskipun dimungkinkan untuk mendapatkan saldo akun untuk alamat pasak tertentu, tidak ada cara untuk mendapatkan saldo akun dompet kecuali setiap alamat di dompet itu menyertakan kredensial taruhan yang sama.

@1000101 Apa itu "menuai"? Tidak ada tabel atau kolom di db-sync yang disebut "menuai".

Oh, saya minta maaf karena tidak cukup menjelaskan ini. Apa yang saya maksud dijelaskan dalam https://github.com/input-output-hk/cardano-db-sync/issues/474 - yaitu apa yang saya katakan adalah persis bahwa tidak ada kolom untuk ini tetapi akan lebih bagus jika akan ada.

Saat ini tidak ada cara mudah untuk menghitung saldo akun, ketika akun ini telah digunakan dalam pendaftaran pool (sebagai akun hadiah) dan kemudian pool dihentikan, sehingga mendapatkan kembali deposit pool. "Pembayaran" deposit kumpulan dilacak di dbsync, tetapi bukan "pengembalian dana" ketika kumpulan dihentikan.

Saya setuju dengan ini. Ada juga banyak kasus tepi yang harus ditangani oleh setiap "pengguna" cardano-db-sync. Baik Adalite dan Yoroi bingung ketika mereka melihat akun yang sebelumnya merupakan akun hadiah dari kumpulan pensiunan:
image
image

Selain itu, hanya cardanoscan AFAIK yang menangani sisa hadiah dengan benar, dan mereka tidak menggunakan db-sync.

Seharusnya ada hubungan mudah yang akan diperbarui dengan cara yang sama seperti hadiah yang ditambahkan secara otomatis. Mari kita ambil kumpulan dengan beberapa deregistrasi sebagai contoh, karena itu sebenarnya cukup umum dan sulit untuk menangani saldo hadiah dari akun pemiliknya.

Ada 9 sertifikat pensiun untuk itu
image

Dan 15 sertifikat pendaftaran
image

Ada banyak kasus tepi dan aturan pensiun yang tidak jelas yang ditolak oleh sertifikat baru .

@erikd , jika Anda bersikeras pada koneksi yang memadai antara setoran 500 tx dan pensiun, bagaimana Anda akan menulis kueri hanya untuk setoran yang dikembalikan dari salah satu akun pemiliknya - e127e9e94eaa9287680e877832700a1724255e9688609497e09a6c440f? Jika tidak, dapatkah kita menambahkan ini secara eksplisit ke db-sync? Katakanlah, sebagai tabel baru, bernama pool_refunds , dengan addr_id , jumlah (saat ini harus kelipatan 500) dan epoch_no - sehingga ini ditangani dengan benar, dan di satu tempat.

Saat ini db-sync mengekstrak data dari status buku besar dan memasukkannya ke dalam database. Itu membuang beberapa informasi, tetapi tidak melakukan agregasi apa pun. Apa yang dimasukkan ke dalam database hanyalah cerminan dari apa yang disediakan oleh status buku besar.

Mari kita lihat pool_hash.id yang relevan :

> select id, hash_raw from pool_hash
    where hash_raw = '\x9c8e59ea7004a51f953642653d70a94d066359b9dd6e6416a5430ff3' ;
  id  |                          hash_raw                          
------+------------------------------------------------------------
 5022 | \x9c8e59ea7004a51f953642653d70a94d066359b9dd6e6416a5430ff3
(1 row)

Kumpulan telah didaftarkan (gabungan tambahan untuk menempatkannya dalam urutan block_no menaik) sebagai berikut:

> select pool_update.id, hash_id, cert_index, active_epoch_no, block.block_no, block.epoch_no
    from pool_update
      inner join tx on tx.id = pool_update.registered_tx_id
      inner join block on tx.block_id = block.id
    where pool_update.hash_id = 5022
    order by block.block_no asc; 
  id  | hash_id | cert_index | active_epoch_no | block_no | epoch_no 
------+---------+------------+-----------------+----------+----------
 5022 |    5022 |          0 |             220 |  4717004 |      218
 5023 |    5022 |          0 |             220 |  4717035 |      218
 5024 |    5022 |          0 |             220 |  4717057 |      218
 5029 |    5022 |          0 |             220 |  4717140 |      218
 5030 |    5022 |          0 |             220 |  4717146 |      218
 5031 |    5022 |          0 |             220 |  4717169 |      218
 5032 |    5022 |          0 |             220 |  4717189 |      218
 5033 |    5022 |          0 |             220 |  4717216 |      218
 5034 |    5022 |          0 |             220 |  4717234 |      218
 5035 |    5022 |          0 |             220 |  4717241 |      218
 5037 |    5022 |          0 |             220 |  4717296 |      218
 5038 |    5022 |          0 |             220 |  4717425 |      218
 5061 |    5022 |          0 |             220 |  4721000 |      218
 5080 |    5022 |          0 |             221 |  4725394 |      219
 5081 |    5022 |          0 |             221 |  4725435 |      219
(15 rows)

dan dibatalkan pendaftarannya di:

> select pool_retire.id, hash_id, cert_index, retiring_epoch, block.block_no, block.epoch_no
    from pool_retire
      inner join tx on tx.id = pool_retire.announced_tx_id
      inner join block on tx.block_id = block.id
    where hash_id = 5022
    order by block.block_no asc ; 
 id  | hash_id | cert_index | retiring_epoch | block_no | epoch_no 
-----+---------+------------+----------------+----------+----------
 180 |    5022 |          0 |            219 |  4717395 |      218
 181 |    5022 |          0 |            219 |  4717397 |      218
 182 |    5022 |          0 |            219 |  4717401 |      218
 183 |    5022 |          0 |            219 |  4717403 |      218
 184 |    5022 |          0 |            219 |  4717405 |      218
 185 |    5022 |          0 |            219 |  4717417 |      218
 186 |    5022 |          0 |            219 |  4717430 |      218
 187 |    5022 |          0 |            220 |  4725366 |      219
 188 |    5022 |          0 |            220 |  4725717 |      219
(9 rows)

Membatalkan pemutakhiran dan pembatalan pendaftaran:

action   | block_no
---------+------------
register | 4717004
update   | 4717035
update   | 4717057
update   | 4717140
update   | 4717146
update   | 4717169
update   | 4717189
update   | 4717216
update   | 4717234
update   | 4717241
update   | 4717296
retire   | 4717395
retire   | 4717397
retire   | 4717401
retire   | 4717403
retire   | 4717405
retire   | 4717417
update   | 4717425
retire   | 4717430
update   | 4721000
retire   | 4725366
update   | 4725394
update   | 4725435
retire   | 4725717

Bersambung ....

Ini pasti terlalu banyak rasa sakit di leher. Berbicara dengan orang-orang dengan spesifikasi buku besar untuk mencoba menemukan solusi.

Disampaikan kepada orang-orang ledger-specs yang menyarankan cara cepat dan kotor untuk memalsukannya untuk saat ini sambil menunggu solusi yang lebih baik.

Idenya adalah memiliki sesuatu seperti tabel pool_registration_refund yang berisi alamat pasak dan jumlahnya.

Itu bagus!

Disampaikan kepada orang-orang ledger-specs yang menyarankan cara cepat dan kotor untuk memalsukannya untuk saat ini sambil menunggu solusi yang lebih baik.

Idenya adalah memiliki sesuatu seperti tabel pool_registration_refund yang berisi alamat pasak dan jumlahnya.

Luar biasa! Maksud saya, kami memiliki solusi untuk saat ini sehingga kami tidak akan mencapai saldo negatif yang dibagikan @xdzurman , tetapi ada sekitar 100 baris yang tidak terlalu cantik:tm : SQL yang harus dihitung per setiap akun. Ini pasti akan membantu banyak. Terima kasih satu juta!!!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat