Ta strona pokazuje, jak uruchomić faucet w łańcuchu testowym, czym jest transakcja Mint na poziomie protokołu oraz jak dokładnie obligacja (Bond) lub spalenie mostu (BridgeBurn) wyprowadza wartość z puli. Każde wejście i każde wyjście jest jawne; wszystko pomiędzy jest notą.
Mint z faucetu
Mint to jedyny sposób tworzenia RAND po genesis w łańcuchu 20, a istnieje tylko w łańcuchach, których genesis zawiera "faucet": true. Jest to transakcja podpisana przez walidatora, bez bundle’a:
Action::Mint { cm: Word8, pk: Word8, time: u32, r: Word8, envelope: Envelope, amount: u64,
minter: PublicKey, signature: Signature }
rand_mint(address[, amount]) wywołane na węźle walidatora buduje notę o wartości amount dla podanego adresu rand1…, zamyka jej kopertę pod jednorazowym kluczem nadawcy, podpisuje mint własnym kluczem Dilithium2 węzła i przesyła go przez zwykły mempool — dzięki temu mint przechodzi przez konsensus, a każdy węzeł go stosuje. Limit wynosi 100000000000 jednostek, czyli 100 RAND, na jedno wywołanie, i jest to także wartość domyślna. Od łańcucha 14 mint niesie otwarcie noty — pk, time i r — a podpis je obejmuje: admisja przelicza zobowiązanie dla (pk, no sender, amount, asset 0, time, r) i odrzuca cm, które się nie zgadza, komunikatem the mint's commitment does not open to its published note and amount, oraz ogranicza time do okna bundle’a. Parametry rand_mint nie uległy zmianie. Podpisywana wiadomość to blake3("rand-mint-2" ‖ bincode(chain_id, cm, pk, time, r, envelope, amount)) w łańcuchach od 14 do 19; w łańcuchu 20, którego genesis ustawia binding_domain: 1, jest to rand-mint-3 nad hashem genesis, po którym następują te same pola, więc mint podpisany dla jednego łańcucha jest odrzucany w każdym innym, nawet takim, który ma ten sam identyfikator łańcucha i te same klucze walidatorów. Obserwator nie ma klucza walidatora i odpowiada faucet mints are signed by validators; ask a validator node; łańcuch bez tej flagi odpowiada faucet is disabled on this chain.
Faucet łańcucha 20 jest włączony, ale ograniczony sekcją staking w genesis, z tymi samymi wartościami co w łańcuchu 19:
| reguła | łańcuch 20 | odmowa |
|---|---|---|
| odbiorcy | lista dozwolonych obejmująca 16 portfeli (staking.faucet_recipients); opublikowany pk minta musi się na niej znajdować | the faucet may not mint to this recipient (not in staking.faucet_recipients), na stałe |
| budżet | 10 000 RAND na epokę liczącą 1000 bloków (staking.faucet_budget_per_epoch), łącznie dla wszystkich walidatorów | the faucet budget of … for this epoch is exhausted (… minted); następna epoka go przyjmie |
| minterzy | 18 z 26 walidatorów (staking.faucet_minters, wymienieni od łańcucha 16); mint musi być podpisany przez jednego z nich | minter … is not a faucet minter on this chain |
Zatem rand faucet działa w łańcuchu 20 tylko dla portfela z listy, przy zapytaniu skierowanym do węzła walidatora, którego klucz należy do wymienionych minterów; każdy inny adres musi zostać opłacony przez kogoś, kto posiada RAND.
rand faucet # 100 RAND to this wallet's address, waits for the commit
rand faucet rand1… --amount 25 # to another address, less than the cap
→ {"method":"rand_mint","params":["rand1…", "100000000000"]}
← "9ab1c0…4f"
Jawne są: zobowiązanie nowej noty, jej koperta, kwota otwartym tekstem oraz klucz publiczny walidatora wykonującego mint (pokazany jako jego adres) i jego podpis. Otwarcie publikuje również klucz właściciela noty pk, więc właściciel noty z faucetu jest jawny, podobnie jak odbiorca wypłaty z Withdraw; ukryte pozostaje to, kiedy i gdzie ta nota zostanie później wydana. Jednokrokowe powiązanie „wymintowano 100 RAND” z „istnieje nota warta 100 RAND” to ta sama widoczność, jaką ma wpłata z przejrzystego konta do puli osłoniętej w dowolnym systemie. Admisja sprawdza, czy faucet jest włączony, czy kwota mieści się w limicie, czy budżet epoki ma jeszcze zapas, czy odbiorca znajduje się na liście dozwolonych (tam, gdzie genesis ją określa), czy zobowiązanie otwiera się do opublikowanej noty, czy minter jest walidatorem i należy do listy minterów (tam, gdzie genesis ją określa), oraz czy podpis jest poprawny; mint nie pobiera opłaty.
rand_getTransaction zwraca go jako { "kind": "mint", "cm": "…", "amount": "100000000000", "minter": "<validator base58>" } z "bundle": null — kwota jest ciągiem dziesiętnym, jak każda kwota u64 serwowana przez RPC od łańcucha 14; eksplorator wyświetla je pod kind=mint, jako jeden z niewielu rodzajów z jawną amount.
Wpłaty genesis
Drugi sposób wejścia wartości to plik genesis: każde --alloc rand1<address>=<RAND> przekazane do rand-node genesis staje się jedną notą wpłaty { cm, envelope, amount, opening } ze świeżą losowością zobowiązania, czyli pierwszymi liśćmi drzewa. Łańcuch 20 ma dziewięć not genesis: siedem not RAND, łącznie 5184,243719258 RAND (genesis_deposited), czyli salda operatora przeniesione ze zrzutu łańcucha 19, oraz dwie noty zUSD, 10 i 89 zUSD, czyli 99 zUSD depozytu mostu przeniesione z łańcucha 19 (Bridge), które nie są RAND i nie wchodzą do genesis_deposited. RAND posiadane w łańcuchu 19 przez portfele, których operator nie kontroluje, około 520 RAND, oraz niewypłacone opłaty walidatorów nie zostały przeniesione. Historia: łańcuch 19 miał osiem not, siedem not RAND na 5294,644359629 RAND i jedną na 10 zUSD; łańcuch 18 miał sześć not RAND, pięć po 1000 RAND i jedną na 300 RAND; łańcuchy 14 i 15 miały pięć po 1000 RAND. Kwota jest jawna, aby każdy mógł zsumować podaż początkową, a od łańcucha 14 nota niesie także swoje otwarcie, więc właściciel noty genesis jest jawny z założenia. Ponowne przygotowanie tych samych alokacji daje inne noty i inny hash genesis — celowo.
Spalenia
Każda transakcja niesie jeden czteroslotowy bundle z ukrytymi aktywami i ma dwa słowa spalenia: burn_r to RAND opuszczający pulę do miejsca publicznego, a burn_a to kwota tokena wskazanego przez burn_asset. Guest bundle’a bilansuje obie grupy w jednym dowodzie, a admisja wymaga, by wszystkie trzy wartości były równe zeru, z wyjątkiem następujących akcji:
| spalenie | reguła | dokąd trafia wartość |
|---|---|---|
bundle transakcji Bond | burn_r == amount | jawny stake walidatora w rejestrze |
bundle transakcji BridgeBurn | burn_asset == asset, burn_a == amount, burn_r == 0, asset != 0 | zniszczona w Rand; kontrakt w łańcuchu źródłowym wydaje amount wskazanej monety w zamian za komunikat spalenia podpisany przez strażników. W łańcuchu 20 łańcuch pobiera opłatę 10 bps jako notę zUSD dla skarbca, a wydanie wynosi amount − fee |
bundle transakcji TokenBurn | ten sam kształt co przy spaleniu mostu | zniszczona; jawne total_supply tokena RPL maleje dokładnie o tę kwotę |
bundle transakcji Invoke (RPL-2, łańcuch 20) | burn_r oraz burn_a dla burn_asset, zgodnie z deklaracją przejścia programu | RAND i tokeny wpłacone do jawnego skarbca programu albo zniszczony token własny programu; skarbiec wypłaca ponownie wyłącznie jako noty obliczone przez łańcuch (Programs) |
(Bundle register_aggregator także spala swoją obligację genesis przez burn_r; agregacja jest w łańcuchu 20 wyłączona.)
Spalenia nie są opłatami. Spalenie obligacji to RAND przechodzący z puli do rejestru, wliczany do burned w audycie podaży (i pojawiający się ponownie w register_total). Spalenie mostu jest od łańcucha 14 jednym bundle’em (wcześniej były dwa): sloty 0–1 spalają aktywo mostowane, a sloty 2–3 płacą opłatę, więc dotyka ono podaży RAND wyłącznie przez tę opłatę, BRIDGE_BURN_FEE, 0,01 RAND. Musi wskazywać monetę, która zabezpiecza aktywo, wydawać całkowitą liczbę jednostek tej monety i mieścić się w tym, co to zabezpieczenie ma zablokowane (Bridge). W łańcuchu 20 jego genesis bridge.fees pobiera też 10 bps od każdego mintu i spalenia mostowanego w zUSD: wpłata uznaje kwotę brutto pomniejszoną o opłatę, spalenie wydaje amount − fee, a każda opłata jest osłoniętą notą zUSD dla skarbca. Nota z opłatą pozostaje wyemitowana i zabezpieczona, więc total_supply == Σ locked dla zUSD nadal obowiązuje; nie jest to ruch RAND i nie wchodzi do audytu podaży RAND. TokenBurn płaci 0,001 RAND bazy bundle’a; token mostowany jest tam odrzucany i wychodzi przez bridge-burn.
Jedna opłata jest w łańcuchu 20 także spaleniem, tak jak w każdym łańcuchu od 15: jego genesis ustawia tokens.burn_registration_fee, więc 1 RAND registration_fee za RegisterToken lub RegisterBridgedToken jest niszczony zamiast trafiać do proposera, który zatrzymuje wyłącznie bazę bundle’a. Jest wliczany do burned oraz osobno do registration_fees_burned (RPL tokens).
rand bond <validator> 1000 [--registration <hex>] # burns 1000 RAND out of this wallet's notes
rand bridge-burn <ASSET> <AMOUNT> <TO_CHAIN> <TOKEN> <TO> # burns AMOUNT of a bridged asset, released as TOKEN on TO_CHAIN
rand token burn <ASSET> <AMOUNT> # destroys AMOUNT of an RPL token this wallet holds
Opłaty to drugie wyjście
fee każdego bundle’a opuszcza pulę i trafia do rewards proposera bloku, jawnego pola rejestru, a wraca do puli dopiero wtedy, gdy walidator wypłaci je jako notę (Staking). Withdraw płaci bazę 0,001 RAND z wypłacanej kwoty proposerowi bloku, który go stosuje; ta baza nigdy nie opuszcza rejestru, więc nie jest przejściem przez granicę.
Jak zmienia się podaż
in: genesis_deposited, faucet_minted, withdraw_deposited, program_rand_out
out: fees_paid, burned
pool_value = in − out
total_supply = pool_value + Σ register (stake + pending + rewards) + program_rand_held
== genesis_deposited + genesis_staked + faucet_minted − slashed − registration_fees_burned
program_rand_held i program_rand_out są nowe w łańcuchu 20 (RPL-2): RAND, który Invoke spala do skarbca programu przez burn_r, jest liczony w burned po stronie puli i przechowywany w skarbcu, a to, co skarbiec wypłaca jako noty, wraca do puli. rand_getSupply zwraca oba pola wraz z invariant_holds.
Tylko mint z faucetu zwiększa to, co łańcuch wyemitował, a na chain 20 tylko spalona opłata rejestracyjna to pomniejsza: slashed liczyłby obciętą (slashing) kaucję agregatora albo, w sekcji genesis staking.slashing, obciętą stawkę walidatora, a chain 20 nie ma żadnej z nich (agregacja jest wyłączona, a slashing ma wartość null). Kaucja, opłata, wypłata i wpłata do skarbca przenoszą wartość między pulą, rejestrem i skarbcami, a niczego nie tworzą. Podaż zawiera liczniki i przykład krok po kroku. Subsydium za agregację bloków — nowy RAND za każdy zapieczętowany blok, według harmonogramu z halvingiem, wypłacany agregatorowi jako nota depozytowa — byłoby pierwszą emisją zgodną z harmonogramem i nie jest aktywne na chain 20.