Hướng Dẫn Phát Hành Confidential Transfer

Phát Hành Token Confidential Transfer 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 một mint Token-2022 có sử dụng extension Confidential Transfer. Hướng dẫn này đề cập đến 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. Để biết luồng thao tác từ phía người dùng (nạp tiền, á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.

Confidential Transfer giữ cho số tiền chuyển và số dư tài khoản được mã hóa trong khi vẫn công khai địa chỉ tài khoản, mint và chủ sở hữu. Chúng dựa vào Chương trình ZK ElGamal Proof để xác minh bằng chứng trên chuỗi, vì vậy mint chỉ có thể sử dụng trên các cluster mà chương trình đó được kích hoạt.

Tính Khả Dụng

Confidential Transfer yêu cầu Token-2022 program@v11.0.0 trở lên. Tính năng này hiện có trên devnet và dự kiến sẽ được kích hoạt trên mainnet vào tháng 6 năm 2026. Token Extensions Program được triển khai riêng cho từng cluster, vì vậy hãy xác nhận việc triển khai trên cluster bạn đang nhắm tới.

Các quyết định bạn đưa ra khi tạo mint

Extension Confidential Transfer 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 cần quyết định:

  • Chính sách phê duyệt: liệu các tài khoản có thể tham gia confidential transfer một cách không cần phép (auto) hay phải được phê duyệt bởi authority confidential transfer của mint (manual).
  • Kiểm toán viên: liệu có đặt khóa công khai ElGamal cho kiểm toán viên toàn cục để một bên được chỉ định có thể giải mã mọi số tiền chuyển cho mint hay không. Tùy chọn, và có thể thay đổi sau.
  • Các extension đi kèm tùy chọn: phí confidential transfer (kết hợp với extension phí chuyển) và confidential mint/burn, cả hai đều được đề cập bên dưới. Những extension này cũng phải được khởi tạo khi tạo mint.

Tạo một mint bảo mật

CLI thiết lập 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 họ, trong khi manual yêu cầu phê duyệt từ authority chuyển khoản bảo mật (mặc định là mint authority). Các đường dẫn client nhận cùng các cài đặt thông qua tham số ConfidentialTransferMint: một authority, cờ tự động phê duyệt, và một khóa kiểm toán tùy chọn. Cả chính sách phê duyệt lẫn kiểm toán viên đều có thể 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 chính extension là cố định tại thời điểm 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à một khóa công khai ElGamal được lưu trữ trên mint. Khi được thiết lập, mỗi giao dịch chuyển khoản 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ã toàn bộ số tiền chuyển khoản cho mint. Đây là cách các giao dịch chuyển khoản bảo mật vẫn 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ả.

Authority chuyển khoản bảo mật có thể thiết lập, 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 một khóa công khai ElGamal; truyền --auditor-pubkey none để xóa 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 số 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 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ư khóa ký, và lên kế hoạch thay thế định kỳ. Việc đặt kiểm toán viên thành None sẽ vô hiệu hóa khả năng xem số tiền đối với tất cả mọi người ngoại trừ chính chủ sở hữu 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 giao dịch bảo mật không thể thực hiện giao dịch bảo mật cho đến khi quyền hạn chuyển tiền bảo mật phê duyệt nó. Điều này cung cấp cho nhà phát hành một cổng kiểm soát dành cho những người tham gia 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 một client.

token
.confidential_transfer_approve_account(
&token_account,
&authority,
&[&authority_keypair],
)
.await?;

Phí chuyển tiền bảo mật

Nếu mint của bạn tính phí chuyển tiền và các giao dịch được bảo mật, thì 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 tiền và chuyển tiền bảo mật.

Các khoản phí bị giữ lại được tích lũy dưới dạng mã hóa trên các tài khoản người nhận, được thu về mint, rồi được rút ra bởi quyền hạn rút phí bị giữ lại. Mọi khoản phí đều được giữ mã hóa xuyên suốt. 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 quyền hạn rút phí bị giữ lại có thể giải mã các khoản phí bị giữ lại, kết hợp với các tham số phí công khai có thể tiết lộ thông tin về số tiền giao dịch, vì vậy hãy coi khóa đó là thông tin nhạy cảm.

Khởi tạo cấu hình phí

Bao gồm điều này cùng với ConfidentialTransferMint và cấu hình phí chuyển tiề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í bị giữ lại

Thu hoạch chuyển các khoản phí bị giữ lại đã được mã hóa từ các tài khoản vào mint; rút ra chuyển chúng ra khỏi mint đến một tài khoản được chọn. Hai quyền hạn có liên quan, và một trong hai có thể khác với quyền hạn mint:

  • Quyền hạn phí chuyển tiền bảo mật (authority được đặt trên ConfidentialTransferFeeConfig) bật hoặc tắt tính năng thu hoạch.
  • Quyền hạn rút phí bị giữ lại (từ TransferFeeConfig của tiện ích mở rộng phí chuyển tiền) rút các khoản phí đã thu hoạch ra khỏi mint.

Việc rút tiền yêu cầu bằng chứng đẳng thức và bằng chứng phạm vi, được cung cấp trực tiếp hoặ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 None
None, // 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 phí đã thu từ mint (getWithdrawWithheldTokensFromMintForConfidentialTransferFeeInstruction) cũng yêu cầu bằng chứng đẳng thức và 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ẫu tài khoản bằng chứng như một giao dịch bảo mật.

Mint và burn bảo mật

Extension ConfidentialMintBurn cho phép mint authority phát hành và đốt nguồn cung trực tiếp đối với số dư bảo mật, giữ tổng nguồn cung được mã hóa. Một mint với extension 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/burn bảo mật dễ thực hiện nhất thông qua Rust spl-token-client, vốn tạo ra 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 tương tự) nhưng không có helper cấp cao để tạo bằng chứng, và không có lệnh CLI, do đó các ví dụ bên dưới chỉ dành cho Rust.

Khởi tạo extension khi tạo mint, sau đó mint, burn và điều chỉnh nguồn cung 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 một lượng burn đang chờ xử lý, sau đó được gộp vào nguồn cung. Cả hai đều tạo ra bằng chứng như một giao dịch bảo mật.

confidential-mint-burn.rs
use spl_token_client::token::ExtensionInitializationParams;
// 1. Initialize at creation (alongside ConfidentialTransferMint).
ExtensionInitializationParams::ConfidentialMintBurn {
supply_elgamal_pubkey, // encrypts the confidential supply
decryptable_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 account
None, // ciphertext validity proof account
None, // range proof account
mint_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 account
None, // ciphertext validity proof account
None, // range proof account
burn_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 nguồn cung bằng confidential_transfer_rotate_supply_elgamal_pubkey (lượng burn đang chờ xử lý phải bằng không trước), và làm mới văn bản mã hóa nguồn cung 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ủ

  • Lưu giữ khóa kiểm toán viê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. Hãy lưu trữ và xoay 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) nắm giữ nó.
  • Tư thế 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 vì các địa chỉ vẫn công khai. Giám sát dựa trên số lượng phụ thuộc vào khóa kiểm toán viên hoặc tiết lộ có chọn lọc từ chủ tài khoản. Hãy quyết định cách tiếp cận của bạn trước khi ra mắt.
  • Giới thiệu người dùng. Việc cấu hình tài khoản bảo mật cần 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ý 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 trải dài trên một vài 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?