Τύποι λογαριασμών

Περίληψη

Οι λογαριασμοί προγράμματος περιέχουν εκτελέσιμο κώδικα sBPF. Οι λογαριασμοί δεδομένων αποθηκεύουν κατάσταση, που ανήκει σε προγράμματα. Οι λογαριασμοί συστήματος ανήκουν στο System Program. Τα sysvars παρέχουν κατάσταση σε επίπεδο συστάδας προσβάσιμη σε προκαθορισμένες διευθύνσεις.

Το πεδίο executable καθορίζει την κατηγορία ενός λογαριασμού:

Αυτός ο διαχωρισμός του κώδικα από την μεταβλητή κατάσταση σημαίνει ότι ένα πρόγραμμα αναπτύσσεται μία φορά και μπορεί να διαχειριστεί οποιονδήποτε αριθμό λογαριασμών δεδομένων.

Λογαριασμοί προγράμματος

Ένας λογαριασμός προγράμματος αποθηκεύει εκτελέσιμο κώδικα. Κάθε λογαριασμός προγράμματος ανήκει σε ένα πρόγραμμα φόρτωσης. Όταν ένα πρόγραμμα αναπτύσσεται, το runtime δημιουργεί έναν λογαριασμό προγράμματος για να αποθηκεύσει τον bytecode του.

Διάγραμμα ενός λογαριασμού προγράμματος, των 4 συστατικών του και του προγράμματος φόρτωσής του.Διάγραμμα ενός λογαριασμού προγράμματος, των 4 συστατικών του και του προγράμματος φόρτωσής του.

Λογαριασμοί δεδομένων προγράμματος

Τα προγράμματα που αναπτύσσονται χρησιμοποιώντας το loader-v3 (δείτε Προγράμματα φόρτωσης) δεν αποθηκεύουν εκτελέσιμο bytecode στο δικό τους πεδίο data. Αντίθετα, το data τους δείχνει σε έναν ξεχωριστό λογαριασμό δεδομένων προγράμματος που περιέχει τον κώδικα του προγράμματος. (Δείτε το παρακάτω διάγραμμα.)

Ένας λογαριασμός προγράμματος με δεδομένα. Τα δεδομένα δείχνουν σε έναν ξεχωριστό λογαριασμό δεδομένων προγράμματοςΈνας λογαριασμός προγράμματος με δεδομένα. Τα δεδομένα δείχνουν σε έναν ξεχωριστό λογαριασμό δεδομένων προγράμματος

Κατά την ανάπτυξη ή αναβάθμιση προγράμματος, οι λογαριασμοί buffer χρησιμοποιούνται για προσωρινή σταδιοποίηση της μεταφόρτωσης.

Το παρακάτω παράδειγμα ανακτά τον λογαριασμό Token Program. Το πεδίο executable είναι true, επιβεβαιώνοντας ότι είναι λογαριασμός προγράμματος.

import { Address, createSolanaRpc } from "@solana/kit";
const rpc = createSolanaRpc("https://api.mainnet.solana.com");
const programId = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" as Address;
const accountInfo = await rpc
.getAccountInfo(programId, { encoding: "base64" })
.send();
console.log(accountInfo);
Console
Click to execute the code.

Λογαριασμοί δεδομένων

Οι λογαριασμοί δεδομένων δεν περιέχουν εκτελέσιμο κώδικα. Αποθηκεύουν την κατάσταση που ορίζεται από το πρόγραμμα.

Λογαριασμός κατάστασης προγράμματος

Τα προγράμματα αποθηκεύουν την κατάστασή τους σε λογαριασμούς δεδομένων. Η δημιουργία ενός λογαριασμού κατάστασης προγράμματος περιλαμβάνει δύο βήματα:

  1. Κλήση του System Program για τη δημιουργία του λογαριασμού. Το System Program μεταφέρει την κυριότητα στο καθορισμένο πρόγραμμα.
  2. Το πρόγραμμα που κατέχει τον λογαριασμό αρχικοποιεί το πεδίο data του λογαριασμού σύμφωνα με τις οδηγίες του.

Διάγραμμα λογαριασμού δεδομένων που ανήκει σε program accountΔιάγραμμα λογαριασμού δεδομένων που ανήκει σε program account

Το παρακάτω παράδειγμα δημιουργεί και ανακτά έναν λογαριασμό Token Mint που ανήκει στο πρόγραμμα Token 2022.

import {
airdropFactory,
appendTransactionMessageInstructions,
createSolanaRpc,
createSolanaRpcSubscriptions,
createTransactionMessage,
generateKeyPairSigner,
getSignatureFromTransaction,
lamports,
pipe,
sendAndConfirmTransactionFactory,
setTransactionMessageFeePayerSigner,
setTransactionMessageLifetimeUsingBlockhash,
signTransactionMessageWithSigners
} from "@solana/kit";
import { getCreateAccountInstruction } from "@solana-program/system";
import {
getInitializeMintInstruction,
getMintSize,
TOKEN_2022_PROGRAM_ADDRESS,
fetchMint
} from "@solana-program/token-2022";
// Create Connection, local validator in this example
const rpc = createSolanaRpc("http://localhost:8899");
const rpcSubscriptions = createSolanaRpcSubscriptions("ws://localhost:8900");
// Generate keypairs for fee payer
const feePayer = await generateKeyPairSigner();
// Fund fee payer
await airdropFactory({ rpc, rpcSubscriptions })({
recipientAddress: feePayer.address,
lamports: lamports(1_000_000_000n),
commitment: "confirmed"
});
// Generate keypair to use as address of mint
const mint = await generateKeyPairSigner();
// Get default mint account size (in bytes), no extensions enabled
const space = BigInt(getMintSize());
// Get minimum balance for rent exemption
const rent = await rpc.getMinimumBalanceForRentExemption(space).send();
// Instruction to create new account for mint (token 2022 program)
// Invokes the system program
const createAccountInstruction = getCreateAccountInstruction({
payer: feePayer,
newAccount: mint,
lamports: rent,
space,
programAddress: TOKEN_2022_PROGRAM_ADDRESS
});
// Instruction to initialize mint account data
// Invokes the token 2022 program
const initializeMintInstruction = getInitializeMintInstruction({
mint: mint.address,
decimals: 9,
mintAuthority: feePayer.address
});
const instructions = [createAccountInstruction, initializeMintInstruction];
// Get latest blockhash to include in transaction
const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();
// Create transaction message
const transactionMessage = pipe(
createTransactionMessage({ version: 0 }), // Create transaction message
(tx) => setTransactionMessageFeePayerSigner(feePayer, tx), // Set fee payer
(tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx), // Set transaction blockhash
(tx) => appendTransactionMessageInstructions(instructions, tx) // Append instructions
);
// Sign transaction message with required signers (fee payer and mint keypair)
const signedTransaction =
await signTransactionMessageWithSigners(transactionMessage);
// Send and confirm transaction
await sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions })(
signedTransaction,
{ commitment: "confirmed" }
);
// Get transaction signature
const transactionSignature = getSignatureFromTransaction(signedTransaction);
console.log("Mint Address:", mint.address);
console.log("Transaction Signature:", transactionSignature);
const accountInfo = await rpc.getAccountInfo(mint.address).send();
console.log(accountInfo);
const mintAccount = await fetchMint(rpc, mint.address);
console.log(mintAccount);
Console
Click to execute the code.

Λογαριασμοί συστήματος

Οι λογαριασμοί που παραμένουν στην κυριότητα του System Program μετά τη δημιουργία τους ονομάζονται λογαριασμοί συστήματος. Η αποστολή SOL σε μια νέα διεύθυνση για πρώτη φορά δημιουργεί έναν νέο λογαριασμό σε αυτή τη διεύθυνση που ανήκει στο System Program.

Όλοι οι λογαριασμοί πορτοφολιού είναι λογαριασμοί συστήματος. Ο πληρωτής των τελών σε μια συναλλαγή πρέπει να είναι λογαριασμός συστήματος, επειδή μόνο οι λογαριασμοί που ανήκουν στο System Program μπορούν να πληρώσουν τέλη συναλλαγών.

Ένα πορτοφόλι που ανήκει στο System Program και περιέχει 1.000.000 lamportsΈνα πορτοφόλι που ανήκει στο System Program και περιέχει 1.000.000 lamports

Το παρακάτω παράδειγμα δημιουργεί ένα νέο keypair, το χρηματοδοτεί με SOL και ανακτά τον λογαριασμό. Το πεδίο owner είναι 11111111111111111111111111111111 (το System Program).

import {
airdropFactory,
createSolanaRpc,
createSolanaRpcSubscriptions,
generateKeyPairSigner,
lamports
} from "@solana/kit";
// Create a connection to Solana cluster
const rpc = createSolanaRpc("http://localhost:8899");
const rpcSubscriptions = createSolanaRpcSubscriptions("ws://localhost:8900");
// Generate a new keypair
const keypair = await generateKeyPairSigner();
console.log(`Public Key: ${keypair.address}`);
// Funding an address with SOL automatically creates an account
const signature = await airdropFactory({ rpc, rpcSubscriptions })({
recipientAddress: keypair.address,
lamports: lamports(1_000_000_000n),
commitment: "confirmed"
});
const accountInfo = await rpc.getAccountInfo(keypair.address).send();
console.log(accountInfo);
Console
Click to execute the code.

Λογαριασμοί Sysvar

Οι λογαριασμοί Sysvar είναι ειδικοί λογαριασμοί σε προκαθορισμένες διευθύνσεις που παρέχουν πρόσβαση μόνο για ανάγνωση στα δεδομένα κατάστασης του cluster. Ενημερώνονται δυναμικά σε κάθε slot.

SysvarΔιεύθυνσηΣκοπός
ClockSysvarC1ock11111111111111111111111111111111Τρέχον slot, epoch και χρονική σήμανση Unix
EpochScheduleSysvarEpochSchedu1e111111111111111111111111Σταθερές προγραμματισμού epoch που ορίζονται στο genesis
EpochRewardsSysvarEpochRewards1111111111111111111111111Κατάσταση και πρόοδος διανομής ανταμοιβών epoch
RentSysvarRent111111111111111111111111111111111Τιμή rent και όριο απαλλαγής
SlotHashesSysvarS1otHashes111111111111111111111111111Πιο πρόσφατα hashes των γονικών banks του slot
StakeHistorySysvarStakeHistory1111111111111111111111111Ενεργοποιήσεις και απενεργοποιήσεις stake ανά epoch
LastRestartSlotSysvarLastRestartS1ot1111111111111111111111Τελευταίο slot επανεκκίνησης cluster
InstructionsSysvar1nstructions1111111111111111111111111Σειριοποιημένες οδηγίες της τρέχουσας συναλλαγής
SlotHistorySysvarS1otHistory11111111111111111111111111Καταγραφή των slots που παράχθηκαν κατά τη διάρκεια του τελευταίου epoch

Το παρακάτω παράδειγμα ανακτά και αποσειριοποιεί τον λογαριασμό Sysvar Clock.

import { createSolanaRpc } from "@solana/kit";
import { fetchSysvarClock, SYSVAR_CLOCK_ADDRESS } from "@solana/sysvars";
const rpc = createSolanaRpc("https://api.mainnet.solana.com");
const accountInfo = await rpc
.getAccountInfo(SYSVAR_CLOCK_ADDRESS, { encoding: "base64" })
.send();
console.log(accountInfo);
// Automatically fetch and deserialize the account data
const clock = await fetchSysvarClock(rpc);
console.log(clock);
Console
Click to execute the code.

Is this page helpful?

Διαχειρίζεται από

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