Δημιουργία token mint

Πώς να δημιουργήσετε ένα mint με Confidential Balances

Τα Confidential Balances επιτρέπουν ιδιωτικές μεταφορές token προσθέτοντας επιπλέον κατάσταση στο mint account. Αυτή η ενότητα εξηγεί πώς να δημιουργήσετε ένα token mint με την απαιτούμενη επέκταση ενεργοποιημένη.

Το παρακάτω διάγραμμα δείχνει τα βήματα που απαιτούνται για τη δημιουργία ενός mint με την επέκταση Confidential Balances:

Create Mint with Confidential Balances

Κατάσταση Mint των Confidential Balances

Η επέκταση προσθέτει την κατάσταση ConfidentialTransferMint στο mint account:

Confidential Mint State
#[repr(C)]
#[derive(Clone, Copy, Debug, Default, PartialEq, Pod, Zeroable)]
pub struct ConfidentialTransferMint {
/// Authority to modify the `ConfidentialTransferMint` configuration and to
/// approve new accounts (if `auto_approve_new_accounts` is true)
///
/// The legacy Token Multisig account is not supported as the authority
pub authority: OptionalNonZeroPubkey,
/// Indicate if newly configured accounts must be approved by the
/// `authority` before they may be used by the user.
///
/// * If `true`, no approval is required and new accounts may be used
/// immediately
/// * If `false`, the authority must approve newly configured accounts (see
/// `ConfidentialTransferInstruction::ConfigureAccount`)
pub auto_approve_new_accounts: PodBool,
/// Authority to decode any transfer amount in a confidential transfer.
pub auditor_elgamal_pubkey: OptionalNonZeroElGamalPubkey,
}

Το ConfidentialTransferMint περιέχει τρία πεδία ρύθμισης παραμέτρων:

  • authority: Ο λογαριασμός που έχει άδεια να αλλάζει τις ρυθμίσεις των Confidential Balances για το mint και να εγκρίνει νέα εμπιστευτικά accounts αν η αυτόματη έγκριση είναι απενεργοποιημένη.

  • auto_approve_new_accounts: Όταν οριστεί σε true, οι χρήστες μπορούν να δημιουργούν token accounts με ενεργοποιημένα τα Confidential Balances από προεπιλογή. Όταν είναι false, η authority πρέπει να εγκρίνει κάθε νέο token account πριν μπορεί να χρησιμοποιηθεί για εμπιστευτικές μεταφορές.

  • auditor_elgamal_pubkey: Ένας προαιρετικός ελεγκτής που μπορεί να αποκρυπτογραφεί ποσά μεταφοράς σε confidential συναλλαγές, παρέχοντας έναν μηχανισμό συμμόρφωσης ενώ διατηρεί την ιδιωτικότητα από το ευρύ κοινό.

Απαιτούμενες Οδηγίες

Η δημιουργία ενός mint με ενεργοποιημένα τα Confidential Balances απαιτεί τρεις εντολές σε μία μόνο συναλλαγή:

  1. Δημιουργία του Mint Account: Καλέστε την οδηγία CreateAccount του System Program για τη δημιουργία του mint account.

  2. Αρχικοποίηση Confidential Balances: Καλέστε την εντολή ConfidentialTransferInstruction::InitializeMint του Token Extension Program για να διαμορφώσετε την κατάσταση ConfidentialTransferMint για το mint.

  3. Αρχικοποίηση Mint: Καλέστε την οδηγία Instruction::InitializeMint του Token Extensions Program για να αρχικοποιήσετε την τυπική κατάσταση mint.

Ενώ θα μπορούσατε να γράψετε αυτές τις οδηγίες χειροκίνητα, το crate spl_token_client παρέχει μια μέθοδο create_mint που δημιουργεί και αποστέλλει μια συναλλαγή με και τις τρεις οδηγίες σε μία μόνο κλήση συνάρτησης, όπως φαίνεται στο παράδειγμα παρακάτω.

Παράδειγμα Κώδικα

Ο παρακάτω κώδικας δείχνει πώς να δημιουργήσετε ένα mint με ενεργοποιημένα τα Confidential Balances.

Τα Confidential Balances εξαρτώνται από το πρόγραμμα ZK ElGamal Proof, το οποίο είναι ενεργοποιημένο στο mainnet και στο devnet. Ένα τυπικό solana-test-validator δεν το ενεργοποιεί, αλλά ένας τοπικός validator με fork του mainnet, όπως το Surfpool, το υποστηρίζει. Εκτελέστε το παράδειγμα σε ένα από αυτά (ο κώδικας χρησιμοποιεί devnet) με έναν χρηματοδοτημένο payer, και αντικαταστήστε τις διευθύνσεις mint και account που χρησιμοποιούνται ως παραδείγματα με τις δικές σας.

Rust

fn main() -> Result<()> {
let rpc_client = RpcClient::new_with_commitment(
String::from("https://api.devnet.solana.com"),
CommitmentConfig::confirmed(),
);
let payer = load_keypair()?;
let mint = Keypair::new();
let decimals: u8 = 2;
// Allocate space for a mint that carries the ConfidentialTransferMint
// extension, then fund it for rent exemption.
let space =
ExtensionType::try_calculate_account_len::<Mint>(&[ExtensionType::ConfidentialTransferMint])?;
let rent = rpc_client.get_minimum_balance_for_rent_exemption(space)?;
// The auditor ElGamal key lets the issuer decrypt transfer amounts for
// compliance. Persist this key. Pass `None` to create a mint with no auditor.
let auditor = ElGamalKeypair::new_rand();
let auditor_pubkey: PodElGamalPubkey = (*auditor.pubkey()).into();
let create_account_ix = system_instruction::create_account(
&payer.pubkey(),
&mint.pubkey(),
rent,
space as u64,
&spl_token_2022::id(),
);
// The confidential-transfer extension must be initialized before the base
// mint and cannot be added later.
let init_confidential_ix = initialize_confidential_transfer_mint(
&spl_token_2022::id(),
&mint.pubkey(),
Some(payer.pubkey()), // authority that can update confidential settings
true, // auto-approve new accounts
Some(auditor_pubkey),
)?;
let init_mint_ix = initialize_mint_base(
&spl_token_2022::id(),
&mint.pubkey(),
&payer.pubkey(), // mint authority
None, // freeze authority
decimals,
)?;
let blockhash = rpc_client.get_latest_blockhash()?;
let transaction = Transaction::new_signed_with_payer(
&[create_account_ix, init_confidential_ix, init_mint_ix],
Some(&payer.pubkey()),
&[&payer, &mint],
blockhash,
);
let signature = rpc_client.send_and_confirm_transaction(&transaction)?;
println!("Created confidential mint {}: {signature}", mint.pubkey());
Ok(())
}
fn load_keypair() -> Result<Keypair> {
let keypair_path = dirs::home_dir()
.context("could not find home directory")?
.join(".config/solana/id.json");
let bytes: Vec<u8> = serde_json::from_reader(std::fs::File::open(keypair_path)?)?;
let mut secret = [0u8; 32];
secret.copy_from_slice(&bytes[0..32]);
Ok(Keypair::new_from_array(secret))
}

Typescript

const client = await createClient()
.use(signerFromFile(join(homedir(), ".config/solana/id.json")))
.use(
solanaRpc({
rpcUrl: "https://api.devnet.solana.com"
})
);
const payer = client.payer;
const mint = await generateKeyPairSigner();
// The auditor ElGamal key lets the issuer decrypt transfer amounts for
// compliance. Persist it; omit `auditorElgamalPubkey` to create a mint with no
// auditor.
const auditor = await deriveElGamalKeypairForOwnerMint({
signer: payer,
owner: payer.address,
mint: mint.address
});
const plan = getCreateMintInstructionPlan({
payer,
newMint: mint,
decimals: 2,
mintAuthority: payer,
extensions: [
{
__kind: "ConfidentialTransferMint",
authority: some(payer.address),
autoApproveNewAccounts: true,
auditorElgamalPubkey: some(auditor.elgamalPubkey)
}
]
});
const result = await client.sendTransaction(plan);
console.log(
`Created confidential mint ${mint.address}: ${result.context.signature}`
);

Is this page helpful?

Πίνακας Περιεχομένων

Επεξεργασία Σελίδας
© 2026 Ίδρυμα Solana. Με επιφύλαξη παντός δικαιώματος.