Phát Hành Token Số Dư Bảo Mật trên Solana
Hướng dẫn này dành cho nhà phát hành: các nhóm tạo và vận hành mint Token-2022 có sử dụng Số Dư Bảo Mật. Hướng dẫn bao gồm các quyết định bạn đưa ra khi tạo mint và các thao tác bạn thực hiện trong suốt vòng đời của mint. Để xem quy trình phía người nắm giữ (nạp, áp dụng, chuyển, rút), hãy xem các trang hướng dẫn từng bước; và để tích hợp các token này vào sản phẩm, hãy xem Hướng Dẫn Tích Hợp.
Số Dư Bảo Mật giữ cho số tiền giao dịch và số dư tài khoản được mã hóa, trong khi địa chỉ tài khoản, mint và chủ sở hữu vẫn được công khai. Tiện ích mở rộng dựa vào Chương Trình Bằng Chứng ZK ElGamal để xác minh bằng chứng trên chuỗi, do đó mint có thể sử dụng trên các cụm máy chủ mà chương trình đó được kích hoạt.
Các quyết định bạn đưa ra khi tạo
Tiện ích mở rộng Số Dư Bảo Mật phải được khởi tạo trước khi mint được khởi tạo và không thể thêm vào sau. Khi tạo, bạn quyết định:
- Chính sách phê duyệt: liệu các tài khoản có thể đăng ký sử dụng Số Dư Bảo Mật
một cách không cần cấp phép (
auto) hay phải được phê duyệt bởi cơ quan Số Dư Bảo Mật của mint (manual). - Kiểm toán viên: liệu có đặt khóa công khai ElGamal kiểm toán toàn cục để một bên được chỉ định có thể giải mã mọi số tiền chuyển khoản cho mint hay không. Tùy chọn, và có thể thay đổi sau.
- Tiện ích mở rộng đi kèm tùy chọn: phí chuyển khoản bí mật (kết hợp với tiện ích mở rộng phí chuyển khoản) và mint/burn bí mật, cả hai đều được đề cập bên dưới. Những tiện ích này cũng phải được khởi tạo khi tạo.
Tạo một mint bí mật
CLI đặt chính sách phê duyệt bằng --enable-confidential-transfers auto hoặc
manual; auto cho phép bất kỳ người nắm giữ nào tự cấu hình tài khoản của mình, trong khi manual
yêu cầu phê duyệt từ cơ quan Số Dư Bảo Mật (mặc định là cơ quan mint). Các đường dẫn client
nhận các cài đặt tương tự thông qua tham số ConfidentialTransferMint: một cơ quan, cờ tự động phê duyệt,
và khóa kiểm toán viên tùy chọn. Cả chính sách phê duyệt lẫn kiểm toán viên đều có thể được
thay đổi sau này (xem Cấu hình kiểm toán viên); chỉ có
sự hiện diện của bản thân tiện ích mở rộng là cố định khi tạo.
$ spl-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb create-token --enable-confidential-transfers auto
Cấu hình kiểm toán viên
Kiểm toán viên toàn cục là khóa công khai ElGamal được lưu trữ trên mint. Khi được đặt, mỗi giao dịch bảo mật sẽ mã hóa thêm số tiền của nó bằng khóa này, do đó bất kỳ ai nắm giữ khóa bí mật tương ứng đều có thể giải mã tất cả số tiền giao dịch cho mint. Đây là cách Số Dư Bảo Mật duy trì khả năng tương thích với các yêu cầu kiểm toán và tuân thủ: công chúng không thấy gì, kiểm toán viên thấy tất cả.
Cơ quan Số Dư Bảo Mật có thể đặt, thay thế hoặc xóa kiểm toán viên bất kỳ
lúc nào. Thao tác tương tự cũng cập nhật chính sách phê duyệt. Trên CLI, khóa kiểm toán viên
là mã hóa base64 của khóa công khai ElGamal; truyền --auditor-pubkey none
để xóa nó và --approve-policy auto|manual để thay đổi chính sách.
Việc thay thế khóa chỉ ảnh hưởng đến các giao dịch trong tương lai. Các khoản tiền trong các giao dịch đã có trên chuỗi vẫn được mã hóa theo khóa kiểm toán viên nào đang hoạt động khi chúng được thực thi, vì vậy hãy giữ lại các khóa kiểm toán viên cũ nếu bạn cần giải mã lịch sử hoạt động.
$ spl-token update-confidential-transfer-settings <MINT_PUBKEY> --auditor-pubkey <AUDITOR_ELGAMAL_PUBKEY>
Khóa bí mật của kiểm toán viên có thể giải mã mọi số tiền chuyển khoản cho
mint. Hãy bảo quản nó với mức độ nghiêm ngặt tương tự như một khóa ký, và lên
kế hoạch thay thế định kỳ. Đặt kiểm toán viên thành None sẽ vô hiệu hóa khả
năng hiển thị số tiền cho tất cả mọi người ngoại trừ chính chủ tài khoản.
Phê duyệt tài khoản (chính sách thủ công)
Với chính sách phê duyệt thủ công, một tài khoản được cấu hình cho Số Dư Bảo Mật không thể thực hiện giao dịch bảo mật cho đến khi cơ quan Số Dư Bảo Mật phê duyệt. Điều này cho phép nhà phát hành kiểm soát những người tham gia có trong danh sách cho phép hoặc đã qua KYC. CLI không cung cấp lệnh phê duyệt, vì vậy việc phê duyệt được thực hiện thông qua client.
token.confidential_transfer_approve_account(&token_account,&authority,&[&authority_keypair],).await?;
Phí chuyển khoản bảo mật
Nếu mint của bạn tính phí chuyển khoản và
các giao dịch là bảo mật, phí cũng phải được giữ lại một cách bảo mật. Tiện ích mở rộng
ConfidentialTransferFeeConfig xử lý điều này và được khởi tạo khi
tạo mint cùng với cả tiện ích mở rộng phí chuyển khoản lẫn Số Dư Bảo Mật.
Các khoản phí bị khấu giữ được tích lũy dưới dạng mã hóa trên tài khoản người nhận, được thu gom vào mint, sau đó được rút bởi cơ quan có thẩm quyền rút phí bị khấu giữ. Mọi khoản phí đều được giữ mã hóa trong suốt quá trình. Không có điều nào trong số này được hiển thị qua CLI. Khóa bí mật ElGamal của cơ quan rút phí bị khấu giữ có thể giải mã các khoản phí bị khấu giữ, kết hợp với các thông số phí công khai có thể tiết lộ thông tin về số tiền chuyển khoản, vì vậy hãy xử lý khóa đó như thông tin nhạy cảm.
Khởi tạo cấu hình phí
Bao gồm phần này cùng với ConfidentialTransferMint và cấu hình phí chuyển
trong cùng một lần tạo mint.
use spl_token_client::token::ExtensionInitializationParams;ExtensionInitializationParams::ConfidentialTransferFeeConfig {authority: Some(authority.pubkey().into()),withdraw_withheld_authority_elgamal_pubkey: withdraw_withheld_elgamal_pubkey,};
Thu hoạch và rút phí đã giữ lại
Thu hoạch chuyển các phí đã giữ lại được mã hóa từ các tài khoản vào mint; rút tiền chuyển chúng ra khỏi mint đến một tài khoản được chọn. Có hai thẩm quyền liên quan, và mỗi thẩm quyền có thể khác với thẩm quyền mint:
- Thẩm quyền phí chuyển bảo mật (
authorityđược đặt trênConfidentialTransferFeeConfig) cho phép hoặc vô hiệu hóa việc thu hoạch. - Thẩm quyền rút phí đã giữ lại (từ
TransferFeeConfigcủa phần mở rộng phí chuyển) rút các phí đã thu hoạch ra khỏi mint.
Việc rút tiền yêu cầu một bằng chứng bình đẳng và một bằng chứng phạm vi, được cung cấp nội tuyến hoặc được xác minh vào các tài khoản trạng thái ngữ cảnh.
// 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?;
Trong JS client, việc rút các phí đã thu hoạch ra khỏi mint
(getWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction) ngoài
ra còn yêu cầu một bằng chứng bình đẳng và một bằng chứng phạm vi được xác minh
vào các tài khoản trạng thái ngữ cảnh, do đó nó tuân theo cùng một mẫu tài khoản
bằng chứng như một giao dịch chuyển bảo mật.
Mint và đốt bảo mật
Phần mở rộng ConfidentialMintBurn cho phép thẩm quyền mint phát hành và đốt
nguồn cung trực tiếp dựa trên số dư bảo mật, giữ tổng nguồn cung được mã hóa.
Một mint với phần mở rộng này sẽ vô hiệu hóa đường dẫn nạp và rút công khai, vì
các token chỉ tồn tại dưới dạng bảo mật. Xem
tài liệu giao thức
để biết mô hình đầy đủ.
Mint/đốt bảo mật dễ thực hiện nhất thông qua Rust spl-token-client, giúp tạo
các bằng chứng cần thiết và sắp xếp các giao dịch cho bạn. JS client
@solana-program/token-2022 cung cấp các trình tạo lệnh cấp thấp
(getConfidentialMintInstruction, getConfidentialBurnInstruction, và các
hàm liên quan) nhưng không có trình trợ giúp cấp cao để tạo bằng chứng, và
không có lệnh CLI, vì vậy các ví dụ bên dưới chỉ dành cho Rust.
Khởi tạo tiện ích mở rộng khi tạo mint, sau đó mint, burn và điều chỉnh cung ứng theo thời gian. Việc mint phát hành một lượng được mã hóa vào số dư bảo mật của người nhận; việc burn loại bỏ một lượng được mã hóa vào khoản burn đang chờ xử lý và sau đó được tổng hợp vào nguồn cung. Cả hai đều tạo ra các bằng chứng tương tự như một giao dịch bảo mật.
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?;
Xoay khóa mã hóa cung ứng bằng
confidential_transfer_rotate_supply_elgamal_pubkey (khoản burn đang chờ xử lý
phải bằng không trước), và làm mới bản mã cung ứng có thể đọc được bằng
confidential_transfer_update_decrypt_supply.
Các cân nhắc về vận hành và tuân thủ
- Quản lý khóa kiểm toán. Nếu bạn thiết lập kiểm toán viên, khóa bí mật của kiểm toán viên là một khóa giải mã có giá trị cao. Lưu trữ và xoay vòng khóa cẩn thận, đồng thời quyết định ai trong tổ chức của bạn (hoặc cơ quan quản lý nào) sẽ nắm giữ nó.
- Lập trường tuân thủ. Việc sàng lọc địa chỉ và phân tích đồ thị đối tác vẫn hoạt động hiệu quả vì địa chỉ vẫn được công khai. Giám sát dựa trên số tiền phụ thuộc vào khóa kiểm toán hoặc tiết lộ có chọn lọc từ chủ tài khoản. Hãy quyết định phương pháp tiếp cận của bạn trước khi ra mắt.
- Onboarding người dùng. Cấu hình tài khoản bảo mật yêu cầu chữ ký của chủ sở hữu. Để cung cấp tài khoản cho người dùng một cách suôn sẻ, hãy để họ đăng ký một khóa ElGamal một lần và sử dụng đường dẫn registry, được mô tả trong Hướng dẫn Tích hợp.
- Số lượng giao dịch. Một giao dịch bảo mật hiện tại bao gồm một số giao dịch phụ thuộc vì các bằng chứng vượt quá giới hạn kích thước giao dịch hiện tại. Định dạng giao dịch v1 (ra mắt cùng Agave v4.2) nâng cao giới hạn đó và dự kiến sẽ cho phép một giao dịch onchain duy nhất.
Is this page helpful?