Solana'da Gizli Transfer Token'ları İhraç Etme
Bu kılavuz ihraçcılar içindir: Gizli Transfer uzantısını kullanan bir Token-2022 mint'i oluşturan ve yöneten ekipler. Mint oluşturma sırasında alacağınız kararları ve mint'in ömrü boyunca gerçekleştireceğiniz işlemleri kapsar. Tutucu tarafı akışı (yatırma, uygulama, transfer, çekme) için adım adım sayfalara, bu token'ları bir üründe desteklemek içinse Entegrasyon Kılavuzu'na bakın.
Gizli transferler, hesap adresleri, mint ve sahipleri herkese açık bırakırken transfer tutarlarını ve hesap bakiyelerini şifreli tutar. Zincir üstü kanıt doğrulaması için ZK ElGamal Proof Program'a dayanırlar; bu nedenle mint, yalnızca söz konusu programın etkin olduğu kümelerde kullanılabilir.
Oluşturma sırasında aldığınız kararlar
Gizli Transfer uzantısı, mint başlatılmadan önce başlatılmalıdır ve sonradan eklenemez. Oluşturma sırasında şunlara karar verirsiniz:
- Onay politikası: hesapların gizli transferleri izinsiz olarak
etkinleştirip etkinleştiremeyeceği (
auto) ya da mint'in gizli transfer yetkisi tarafından onaylanması gerekip gerekmediği (manual). - Denetçi: belirli bir tarafın mint için tüm transfer tutarlarını şifresini çözebilmesi amacıyla global bir denetçi ElGamal pubkey ayarlanıp ayarlanmayacağı. İsteğe bağlıdır ve sonradan değiştirilebilir.
- İsteğe bağlı tamamlayıcı uzantılar: gizli transfer ücretleri (transfer ücreti uzantısıyla eşleştirilmiş) ve gizli mint/burn; her ikisi de aşağıda ele alınmıştır. Bunların da oluşturma sırasında başlatılması gerekir.
Gizli bir mint oluşturma
CLI, onay politikasını --enable-confidential-transfers auto veya manual ile
ayarlar; auto herhangi bir sahipten kendi hesabını yapılandırmasına izin
verirken, manual bunu gizli transfer yetkisinin (varsayılan olarak mint
yetkisine döner) onayına bağlar. İstemci tarafı yollar, aynı ayarları
ConfidentialTransferMint parametreleri aracılığıyla alır: bir yetki, otomatik
onay bayrağı ve isteğe bağlı bir denetçi anahtarı. Hem onay politikası hem de
denetçi sonradan değiştirilebilir (bkz.
Bir denetçi yapılandırma); yalnızca uzantının
kendisinin varlığı oluşturma sırasında sabitlenir.
$ spl-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb create-token --enable-confidential-transfers auto
Bir denetçi yapılandırma
Global denetçi, mint üzerinde saklanan bir ElGamal pubkey'dir. Ayarlandığında, her gizli transfer aynı zamanda tutarını bu anahtar altında şifreler; böylece karşılık gelen gizli anahtara sahip olan kişi, mint için tüm transfer tutarlarının şifresini çözebilir. Gizli transferlerin denetim ve uyumluluk gereksinimleriyle uyumlu kalması bu sayede mümkün olur: kamuoyu hiçbir şey görmez, denetçi her şeyi görür.
Gizli transfer yetkisi, denetçiyi istediği zaman ayarlayabilir, değiştirebilir
veya kaldırabilir. Aynı işlem onay politikasını da günceller. CLI'da denetçi
anahtarı, bir ElGamal public key'inin base64 kodlamasıdır; kaldırmak için
--auditor-pubkey none, politikayı değiştirmek için
--approve-policy auto|manual geçirin.
Rotasyon yalnızca gelecekteki transferleri etkiler. Zaten zincir üzerinde bulunan işlemlerdeki tutarlar, yürütüldüklerinde aktif olan denetçi anahtarına şifreli olarak kalır; bu nedenle geçmiş aktiviteyi çözmeniz gerekiyorsa eski denetçi anahtarlarını saklayın.
$ spl-token update-confidential-transfer-settings <MINT_PUBKEY> --auditor-pubkey <AUDITOR_ELGAMAL_PUBKEY>
Denetçi gizli anahtarı, mint için her transfer tutarını çözebilir. İmzalama
anahtarıyla aynı titizlikte saklayın ve rotasyon için plan yapın. Denetçinin
None olarak ayarlanması, hesap sahipleri dışında herkes için tutar
görünürlüğünü devre dışı bırakır.
Hesapları onaylama (manuel politika)
Manuel onay politikasıyla, gizli transferler için yapılandırılmış bir hesap, gizli transfer yetkisi tarafından onaylanana kadar gizli işlem yapamaz. Bu, yayıncılara izin listesindeki veya KYC doğrulamasından geçmiş katılımcılar için bir kapı sağlar. CLI bir onay komutu sunmadığından, onay işlemi bir istemci aracılığıyla gerçekleştirilir.
token.confidential_transfer_approve_account(&token_account,&authority,&[&authority_keypair],).await?;
Gizli transfer ücretleri
Mint'iniz bir transfer ücreti
uyguluyorsa ve transferler gizliyse, ücretin de gizli olarak alıkonulması
gerekir. ConfidentialTransferFeeConfig uzantısı bunu yönetir ve transfer
ücreti ile gizli transfer uzantılarının yanı sıra mint oluşturma sırasında
başlatılır.
Alıkonulan ücretler, alıcı hesaplarda şifreli olarak birikir, mint'e aktarılır ve ardından alıkonulan tutarları çekme yetkisi tarafından çekilir. Her ücret tutarı boyunca şifreli kalır. Bunların hiçbiri CLI aracılığıyla açığa çıkmaz. Alıkonulan tutarları çekme yetkisinin ElGamal gizli anahtarı, alıkonulan ücret tutarlarını çözebilir; bu durum, genel ücret parametreleriyle birleştiğinde transfer tutarları hakkında bilgi açığa çıkarabilir, bu nedenle bu anahtara hassas bir bilgi olarak davranın.
Ücret yapılandırmasını başlatın
Bunu ConfidentialTransferMint ve transfer ücreti yapılandırmasıyla birlikte
aynı mint oluşturma işlemine dahil edin.
use spl_token_client::token::ExtensionInitializationParams;ExtensionInitializationParams::ConfidentialTransferFeeConfig {authority: Some(authority.pubkey().into()),withdraw_withheld_authority_elgamal_pubkey: withdraw_withheld_elgamal_pubkey,};
Tutulan ücretleri toplayın ve çekin
Toplama işlemi, şifrelenmiş tutulan ücretleri hesaplardan mint'e taşır; çekme işlemi ise bunları mint'ten seçilen bir hesaba aktarır. Bu işlemde iki yetki söz konusudur ve her ikisi de mint yetkisinden farklı olabilir:
- Gizli transfer ücreti yetkisi (
ConfidentialTransferFeeConfigüzerinde ayarlananauthority), toplamayı etkinleştirir veya devre dışı bırakır. - Tutulan ücretleri çekme yetkisi (transfer ücreti uzantısının
TransferFeeConfigalanından), toplanan ücretleri mint'ten çeker.
Çekme işlemleri, satır içi olarak sağlanan veya bağlam durum hesaplarına doğrulanan bir eşitlik ve bir aralık kanıtı gerektirir.
// 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?;
JS istemcisinde, toplanan ücretlerin mint'ten çekilmesi
(getWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction)
ayrıca bağlam durum hesaplarına doğrulanan bir eşitlik ve bir aralık kanıtı
gerektirir; bu nedenle gizli bir transferle aynı kanıt hesabı kalıbını izler.
Gizli mint ve yakma
ConfidentialMintBurn uzantısı, mint yetkisine gizli bakiyelere karşı doğrudan
arz çıkarma ve yakma imkânı tanır; toplam arzı şifreli tutar. Bu uzantıya sahip
bir mint, genel yatırma ve çekme yolunu devre dışı bırakır; çünkü tokenlar
yalnızca gizli olarak var olur. Tam model için
protokol belgelerine
bakın.
Gizli mint/yakma işlemi, gerekli kanıtları oluşturan ve işlemleri sizin için
sıralayan Rust spl-token-client aracılığıyla en kolay şekilde
gerçekleştirilir. @solana-program/token-2022 JS istemcisi, alt düzey talimat
oluşturucularını (getConfidentialMintInstruction,
getConfidentialBurnInstruction ve benzerleri) içerir; ancak kanıtları
oluşturan üst düzey bir yardımcı bulunmamaktadır ve CLI komutları da mevcut
değildir; bu nedenle aşağıdaki örnekler yalnızca Rust içindir.
Uzantıyı mint oluşturulurken başlatın, ardından arzı zaman içinde mint edin, yakın ve mutabık kılın. Mint işlemi, şifrelenmiş bir miktarı alıcının gizli bakiyesine ekler; yakma işlemi ise şifrelenmiş bir miktarı, daha sonra arza dahil edilecek bekleyen bir yakma işlemine aktarır. Her ikisi de gizli bir transfer gibi kanıtlar üretir.
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?;
Arz şifreleme anahtarını confidential_transfer_rotate_supply_elgamal_pubkey
ile döndürün (önce bekleyen yakma işleminin sıfır olması gerekir) ve okunabilir
arz şifreli metnini confidential_transfer_update_decrypt_supply ile yenileyin.
Operasyonel ve uyumluluk değerlendirmeleri
- Denetçi anahtar yönetimi. Bir denetçi belirlerseniz, denetçi gizli anahtarı yüksek değerli bir şifre çözme anahtarıdır. Dikkatli bir şekilde saklayın ve döndürün; kuruluşunuzda kimin (ya da hangi düzenleyicinin) bu anahtarı tutacağına karar verin.
- Uyumluluk tutumu. Adresler herkese açık kalmaya devam ettiğinden adres taraması ve karşı taraf grafiği analizi çalışmaya devam eder. Tutara dayalı izleme, denetçi anahtarına veya hesap sahiplerinin seçici açıklamalarına bağlıdır. Başlatmadan önce yaklaşımınıza karar verin.
- Kullanıcıları dahil etme. Gizli bir hesabın yapılandırılması için sahibin imzası gerekir. Kullanıcılara sorunsuz hesap sağlamak için onların bir kez ElGamal anahtarı kaydetmesini sağlayın ve Entegrasyon Kılavuzu'nda açıklanan kayıt yolunu kullanın.
- İşlem sayısı. Gizli bir transfer, kanıtlar günümüzdeki işlem boyutu limitini aştığından şu anda birkaç bağımlı işlemi kapsamaktadır. İşlem formatı v1 (Agave v4.2 ile kullanıma girecek) bu limiti artıracak ve tek bir zincir üstü işleme olanak tanıması beklenmektedir.
Is this page helpful?