Emitowanie tokenów Confidential Balances na Solanie
Ten przewodnik jest przeznaczony dla emitentów: zespołów tworzących i obsługujących mint Token-2022 korzystający z Confidential Balances. Omawia decyzje podejmowane podczas tworzenia mintu oraz operacje wykonywane przez cały okres jego życia. Opis przepływu po stronie posiadacza (wpłata, zastosowanie, transfer, wypłata) znajdziesz na stronach krok po kroku, a informacje o obsłudze tych tokenów w produkcie – w Przewodniku integracji.
Confidential Balances szyfruje kwoty transferów i salda kont, zostawiając adresy kont, mint i właścicieli publicznymi. Rozszerzenie opiera się na ZK ElGamal Proof Program do weryfikacji dowodów on-chain, dlatego mint jest użyteczny w klastrach, w których ten program jest włączony.
Decyzje podejmowane przy tworzeniu
Rozszerzenie Confidential Balances musi zostać zainicjalizowane przed zainicjalizowaniem mintu i nie można go dodać później. Podczas tworzenia decydujesz o:
- Zasadzie zatwierdzania: czy konta mogą włączyć Confidential Balances
bez uprawnień (
auto), czy muszą zostać zatwierdzone przez authority Confidential Balances mintu (manual). - Audytor: czy ustawić globalny klucz publiczny ElGamal audytora, aby wyznaczona strona mogła odszyfrować każdą kwotę transferu dla minta. Opcjonalne i można to zmienić później.
- Opcjonalne rozszerzenia towarzyszące: poufne opłaty za transfer (w parze z rozszerzeniem opłat za transfer) oraz poufny mint/burn – oba opisane poniżej. Również muszą zostać zainicjalizowane przy tworzeniu.
Utwórz poufny mint
CLI ustawia zasadę zatwierdzania za pomocą --enable-confidential-transfers auto lub
manual; auto pozwala każdemu posiadaczowi samodzielnie skonfigurować swoje konto, natomiast manual
uzależnia to od zatwierdzenia przez authority Confidential Balances (która
domyślnie jest authority mintu). Ścieżki klienta przyjmują te same ustawienia przez
parametry ConfidentialTransferMint: authority, flagę automatycznego zatwierdzania
oraz opcjonalny klucz audytora. Zarówno zasadę zatwierdzania, jak i audytora można
zmienić później (zob. Konfigurowanie audytora); jedynie
obecność samego rozszerzenia jest ustalona w momencie tworzenia.
$ spl-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb create-token --enable-confidential-transfers auto
Konfiguracja audytora
Globalny audytor to klucz publiczny ElGamal przechowywany w mincie. Gdy jest ustawiony, każdy poufny transfer dodatkowo szyfruje swoją kwotę tym kluczem, dzięki czemu ktokolwiek posiada odpowiadający mu klucz prywatny, może odszyfrować wszystkie kwoty transferów dla mintu. W ten sposób Confidential Balances pozostaje zgodny z wymogami audytu i kompliance: opinia publiczna nie widzi nic, audytor widzi wszystko.
Authority Confidential Balances może ustawić, rotować lub usunąć audytora w dowolnym
momencie. Ta sama operacja aktualizuje również zasadę zatwierdzania. W CLI klucz audytora
jest kodowaniem base64 klucza publicznego ElGamal; podaj --auditor-pubkey none
aby go usunąć, oraz --approve-policy auto|manual aby zmienić zasadę.
Rotacja dotyczy wyłącznie przyszłych transferów. Kwoty w transakcjach już zapisanych w łańcuchu bloków pozostają zaszyfrowane dla klucza audytora, który był aktywny w momencie ich wykonania – dlatego zachowaj stare klucze audytora, jeśli chcesz odszyfrować historyczną aktywność.
$ spl-token update-confidential-transfer-settings <MINT_PUBKEY> --auditor-pubkey <AUDITOR_ELGAMAL_PUBKEY>
Tajny klucz audytora umożliwia odszyfrowanie każdej kwoty transferu dla danego
mint. Przechowuj go z taką samą starannością jak klucz podpisujący i zaplanuj
jego rotację. Ustawienie audytora na None wyłącza widoczność kwot dla
wszystkich z wyjątkiem właścicieli kont.
Zatwierdzanie kont (polityka manualna)
Przy zasadzie ręcznego zatwierdzania konto skonfigurowane dla Confidential Balances nie może dokonywać poufnych transakcji, dopóki authority Confidential Balances go nie zatwierdzi. Daje to emitentom bramkę dla uczestników z listy dozwolonych lub po weryfikacji KYC. CLI nie udostępnia polecenia zatwierdzania, więc zatwierdzenie odbywa się przez klienta.
token.confidential_transfer_approve_account(&token_account,&authority,&[&authority_keypair],).await?;
Poufne opłaty za transfer
Jeśli Twój mint pobiera opłatę za transfer, a
transfery są poufne, opłata również musi być pobierana poufnie. Rozszerzenie
ConfidentialTransferFeeConfig obsługuje to i jest inicjalizowane podczas
tworzenia mintu razem z rozszerzeniami opłaty za transfer i Confidential Balances.
Zatrzymane opłaty narastają w formie zaszyfrowanej na kontach odbiorców, są następnie zbierane do mint, a potem wypłacane przez organ władzy ds. wypłaty zatrzymanych środków. Każda kwota opłaty pozostaje zaszyfrowana przez cały czas. Żadna z tych operacji nie jest dostępna przez CLI. Tajny klucz ElGamal organu władzy ds. wypłaty zatrzymanych środków umożliwia odszyfrowanie kwot zatrzymanych opłat, co w połączeniu z publicznymi parametrami opłat może ujawnić informacje o kwotach transferów – dlatego traktuj ten klucz jako wrażliwy.
Zainicjalizuj konfigurację opłat
Dołącz to razem z ConfidentialTransferMint i konfiguracją opłat transferowych
podczas tworzenia tego samego minta.
use spl_token_client::token::ExtensionInitializationParams;ExtensionInitializationParams::ConfidentialTransferFeeConfig {authority: Some(authority.pubkey().into()),withdraw_withheld_authority_elgamal_pubkey: withdraw_withheld_elgamal_pubkey,};
Zbieranie i wypłacanie wstrzymanych opłat
Zbieranie przenosi zaszyfrowane wstrzymane opłaty z kont do minta; wypłacanie przenosi je z minta na wybrane konto. Zaangażowane są dwie jednostki upoważnione, z których każda może różnić się od jednostki uprawnionej do minta:
- Jednostka uprawniona do poufnych opłat transferowych (
authorityustawiona naConfidentialTransferFeeConfig) włącza lub wyłącza zbieranie. - Jednostka uprawniona do wypłacania wstrzymanych środków (z pola
TransferFeeConfigrozszerzenia opłat transferowych) wypłaca zebrane opłaty z minta.
Wypłaty wymagają dowodu równości i dowodu zakresu, dostarczonych inline lub zweryfikowanych w kontach stanu kontekstu.
// Permissionless: move withheld fees from accounts into the mint.token.confidential_transfer_harvest_withheld_tokens_to_mint(&[&source_account]).await?;// Withdraw withheld fees from the mint (requires the withdraw withheld authority).token.confidential_transfer_withdraw_withheld_tokens_from_mint(&destination_account,&withdraw_withheld_authority,None, // proof context state account, supplied inline if NoneNone, // withheld tokens info, fetched if None&withdraw_withheld_elgamal_keypair,&destination_elgamal_pubkey,&new_decryptable_available_balance,&[&withdraw_withheld_authority_keypair],).await?;
W kliencie JS wypłacanie zebranych opłat z minta
(getWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction)
wymaga dodatkowo dowodu równości i dowodu zakresu zweryfikowanych w kontach
stanu kontekstu, dlatego stosuje ten sam schemat kont dowodowych co poufny
transfer.
Poufne mintowanie i spalanie
Rozszerzenie ConfidentialMintBurn pozwala jednostce uprawnionej do minta
emitować i spalać podaż bezpośrednio na poufnych saldach, utrzymując całkowity
zasób zaszyfrowany. Mint z tym rozszerzeniem wyłącza publiczną ścieżkę
deponowania i wypłacania, ponieważ tokeny istnieją wyłącznie w sposób poufny.
Zapoznaj się z
dokumentacją protokołu
dotyczącą pełnego modelu.
Poufne mintowanie/spalanie jest najłatwiejsze za pomocą biblioteki Rust
spl-token-client, która generuje wymagane dowody i sekwencjonuje transakcje
za Ciebie. Klient JS @solana-program/token-2022 udostępnia niskopoziomowe
konstruktory instrukcji (getConfidentialMintInstruction,
getConfidentialBurnInstruction i inne), ale nie zawiera wysokopoziomowego
pomocnika budującego dowody i nie ma poleceń CLI, więc poniższe przykłady
dotyczą wyłącznie Rust.
Zainicjuj rozszerzenie podczas tworzenia mint, a następnie emituj, spalaj i uzgadniaj podaż w czasie. Emisja wprowadza zaszyfrowaną kwotę do poufnego salda odbiorcy; spalanie usuwa zaszyfrowaną kwotę do oczekującego spalenia, które jest później uwzględniane w podaży. Obie operacje generują dowody podobnie jak poufny przelew.
use spl_token_client::token::ExtensionInitializationParams;// 1. Initialize at creation (alongside ConfidentialTransferMint).ExtensionInitializationParams::ConfidentialMintBurn {supply_elgamal_pubkey, // encrypts the confidential supplydecryptable_supply, // AES ciphertext of the initial supply (zero)};// 2. Mint an encrypted amount into a recipient's confidential balance.token.confidential_transfer_mint(&mint_authority,&destination_account,None, // equality proof accountNone, // ciphertext validity proof accountNone, // range proof accountmint_amount,&supply_elgamal_keypair,&destination_elgamal_pubkey,auditor_elgamal_pubkey, // Option&supply_aes_key,None, // supply account info, fetched if None&[&mint_authority_keypair],).await?;// 3. Burn an encrypted amount from a holder's confidential balance into the// mint's pending burn. Generates proofs like a confidential transfer.token.confidential_transfer_burn(&owner,&source_account,None, // equality proof accountNone, // ciphertext validity proof accountNone, // range proof accountburn_amount,&source_elgamal_keypair,&supply_elgamal_pubkey,auditor_elgamal_pubkey, // Option&source_aes_key,None, // burn account info, fetched if None&[&owner_keypair],).await?;// 4. Fold the accumulated pending burn into the confidential supply.token.confidential_transfer_apply_pending_burn(&mint_authority, &[&mint_authority_keypair]).await?;
Zmień klucz szyfrowania podaży za pomocą
confidential_transfer_rotate_supply_elgamal_pubkey (oczekujące spalenie musi
wynosić wpierw zero), a następnie odśwież czytelny tekst zaszyfrowanej podaży za
pomocą confidential_transfer_update_decrypt_supply.
Kwestie operacyjne i związane ze zgodnością
- Przechowywanie klucza audytora. Jeśli ustawisz audytora, jego klucz prywatny jest kluczem deszyfrującym o wysokiej wartości. Przechowuj go i rotuj ostrożnie, i zdecyduj, kto w Twojej organizacji (lub który organ regulacyjny) go posiada.
- Podejście do zgodności. Weryfikacja adresów i analiza grafu kontrahentów nadal działają, ponieważ adresy pozostają publiczne. Monitorowanie oparte na kwotach zależy od klucza audytora lub selektywnego ujawnienia przez właścicieli kont. Zdecyduj o swoim podejściu przed uruchomieniem.
- Onboarding posiadaczy. Konfiguracja poufnego konta wymaga podpisu właściciela. Aby sprawnie tworzyć konta dla użytkowników, poproś ich o jednorazową rejestrację klucza ElGamal i skorzystaj ze ścieżki rejestru opisanej w Przewodniku integracji.
- Liczba transakcji. Poufny przelew obejmuje obecnie kilka zależnych transakcji, ponieważ dowody przekraczają obecny limit rozmiaru transakcji. Format transakcji v1 (wprowadzany wraz z Agave v4.2) podnosi ten limit i ma umożliwić przeprowadzenie pojedynczej transakcji onchain.
Is this page helpful?