Tilityypit

Yhteenveto

Ohjelmatileillä on suoritettavaa sBPF-koodia. Datatileillä tallennetaan tilaa, ja ne ovat ohjelmien omistuksessa. Järjestelmätilit ovat System Programin omistuksessa. Sysvars-muuttujat tarjoavat klusterin laajuista tilaa, joka on saatavilla ennalta määritellyissä osoitteissa.

executable-kenttä määrittää tilin kategorian:

  • Ohjelmatili: executable = true. Sisältää suoritettavaa koodia.
  • Datatili: executable = false. Tallentaa tilaa tai käyttäjädataa.

Tämä koodin ja muuttuvan tilan erottaminen tarkoittaa, että ohjelma otetaan käyttöön kerran ja se voi hallita mitä tahansa määrää datatilejä.

Ohjelmatili

Ohjelmatili tallentaa suoritettavaa koodia. Jokainen ohjelmatili on loader-ohjelman omistuksessa. Kun ohjelma otetaan käyttöön, runtime luo ohjelmatili sen tavukoodin tallentamiseksi.

Kaavio ohjelmatilista, sen neljästä komponentista ja sen loader-ohjelmasta.Kaavio ohjelmatilista, sen neljästä komponentista ja sen loader-ohjelmasta.

Ohjelman datatilit

Ohjelmat, jotka on otettu käyttöön loader-v3:lla (katso Loader-ohjelmat), eivät tallenna suoritettavaa tavukoodia omaan data-kenttäänsä. Sen sijaan niiden data osoittaa erilliseen ohjelman datatiliin, joka sisältää ohjelmakoodin. (Katso alla oleva kaavio.)

Ohjelmatili datalla. Data osoittaa erilliseen ohjelman datatiliinOhjelmatili datalla. Data osoittaa erilliseen ohjelman datatiliin

Ohjelman käyttöönoton tai päivitysten aikana puskuritilejä käytetään latauksen väliaikaiseen vaiheistamiseen.

Seuraava esimerkki hakee Token Program -tilin. executable-kenttä on true, mikä vahvistaa, että kyseessä on ohjelmatili.

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.

Datatilit

Datatilit eivät sisällä suoritettavaa koodia. Ne tallentavat ohjelman määrittelemän tilan.

Ohjelman tilatili

Ohjelmat tallentavat tilansa datatileihin. Ohjelman tilatilin luominen sisältää kaksi vaihetta:

  1. Kutsu System Program -ohjelmaa tilin luomiseksi. System Program siirtää omistajuuden määritetylle ohjelmalle.
  2. Omistava ohjelma alustaa tilin data-kentän ohjeidensa mukaisesti.

Diagram of a data account owned by a program accountDiagram of a data account owned by a program account

Seuraava esimerkki luo ja hakee Token Mint -tilin, jonka omistaa Token 2022 -ohjelma.

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.

Järjestelmätilit

Tilejä, jotka pysyvät System Program -ohjelman omistuksessa luomisen jälkeen, kutsutaan järjestelmätileiksi. SOL:n lähettäminen uuteen osoitteeseen ensimmäistä kertaa luo uuden tilin kyseiseen osoitteeseen, jonka omistaa System Program.

Kaikki lompakkotilit ovat järjestelmätilejä. Tapahtuman maksajan on oltava järjestelmätili, koska vain System Program -ohjelman omistamat tilit voivat maksaa transaktiomaksuja.

A wallet owned by the System Program containing 1,000,000 lamportsA wallet owned by the System Program containing 1,000,000 lamports

Seuraava esimerkki generoi uuden keypair-avaimen, rahoittaa sen SOL:lla ja hakee tilin. owner-kenttä on 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-tilit

Sysvar-tilit ovat erityisiä tilejä ennalta määritetyissä osoitteissa, jotka tarjoavat vain luku -pääsyn klusterin tilatietoihin. Ne päivittyvät dynaamisesti joka slotissa.

SysvarOsoiteTarkoitus
ClockSysvarC1ock11111111111111111111111111111111Nykyinen slot, epoch ja Unix-aikaleima
EpochScheduleSysvarEpochSchedu1e111111111111111111111111Genesiksessä asetetut epochin ajoitusvakiot
EpochRewardsSysvarEpochRewards1111111111111111111111111Epochin palkkioiden jakelun tila ja edistyminen
RentSysvarRent111111111111111111111111111111111Vuokra-aste ja vapautuskynnys
SlotHashesSysvarS1otHashes111111111111111111111111111Slotin ylätason pankkien viimeisimmät hajautusarvot
StakeHistorySysvarStakeHistory1111111111111111111111111Staken aktivoinnit ja deaktivoinnit per epoch
LastRestartSlotSysvarLastRestartS1ot1111111111111111111111Viimeisin klusterin uudelleenkäynnistysslot
InstructionsSysvar1nstructions1111111111111111111111111Nykyisen transaktion sarjallistetut ohjeet
SlotHistorySysvarS1otHistory11111111111111111111111111Tallenne siitä, mitkä slotit tuotettiin viimeisen epochin aikana

Seuraava esimerkki hakee ja deserialisoi Sysvar Clock -tilin.

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?

Sisällysluettelo

Muokkaa sivua

Hallinnoi

© 2026 Solana Foundation.
Kaikki oikeudet pidätetään.
Yhdistä