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.

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

Tiện ích mở rộng Chuyển khoản Bí 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ể tự nguyện tham gia chuyển khoản bí mật mà không cần cấp phép (auto) hay phải được phê duyệt bởi cơ quan quản lý chuyển khoản bí 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 họ, trong khi manual yêu cầu phê duyệt từ cơ quan quản lý chuyển khoản bí mật (mặc định là cơ quan quản lý mint). Các đường dẫn client nhận các cài đặt tương tự thông qua các tham số ConfidentialTransferMint: một cơ quan quản lý, 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 và kiểm toán viên đều có thể thay đổi sau (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à một khóa công khai ElGamal được lưu trữ trên mint. Khi được đặt, mọi chuyển khoản bí mật sẽ mã hóa thêm số tiền của nó dưới khóa này, để 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 chuyển khoản cho mint. Đây là cách các chuyển khoản bí 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ả.

Cơ quan quản lý 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 cứ lúc nào. Cùng một thao tác 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 chuyển khoản bảo mật sẽ không thể thực hiện giao dịch bảo mật cho đến khi cơ quan quản lý chuyển khoản bảo mật phê duyệt. Đ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 đã được 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 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 được thực hiện bảo mật, thì phí cũng phải được khấu trừ một cách bảo mật. Phần mở rộng ConfidentialTransferFeeConfig xử lý việc này và được khởi tạo khi tạo mint cùng với cả phần mở rộng phí chuyển khoản và chuyển khoản 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ên ConfidentialTransferFeeConfig) 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ừ TransferFeeConfig củ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 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 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.

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 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?