Tilit

Kaikki data Solana-verkossa tallennetaan tileihin. Voit ajatella Solana-verkkoa julkisena tietokantana, jossa on yksi Tilit-taulu. Tilin ja sen osoitteen välinen suhde on samankaltainen kuin avain-arvo-parissa, jossa avain on osoite ja arvo on tili.

Jokaisella tilillä on sama perus rakenne ja se voidaan paikantaa sen osoitteen avulla.

Kaavio kolmesta tilistä ja niiden osoitteista. Sisältää tilin rakenteen määritelmän.Kaavio kolmesta tilistä ja niiden osoitteista. Sisältää tilin rakenteen määritelmän.

Tilin osoite

Tilin osoite on 32-tavuinen yksilöllinen tunniste, jota käytetään tilin paikantamiseen Solana-lohkoketjussa. Tilien osoitteet näytetään usein base58-koodattuina merkkijonoina. Useimmat tilit käyttävät Ed25519 julkista avainta osoitteenaan, mutta tämä ei ole pakollista, sillä Solana tukee myös ohjelmasta johdettuja osoitteita.

Tili ja sen base58-koodattu julkisen avaimen osoiteTili ja sen base58-koodattu julkisen avaimen osoite

Julkinen avain

Alla oleva esimerkki näyttää, miten Solana SDK:ta käytetään keypair-avaimen luomiseen. keypair sisältää:

  • Julkisen avaimen, joka toimii tilin osoitteena
  • Yksityisen avaimen, jota käytetään transaktioiden allekirjoittamiseen
import { generateKeyPairSigner } from "@solana/kit";
// Kit does not enable extractable private keys
const keypairSigner = await generateKeyPairSigner();
console.log(keypairSigner);
Console
Click to execute the code.

Program derived address

Program derived address (PDA) on osoite, joka on deterministisesti johdettu käyttäen ohjelmatunnusta ja yhtä tai useampaa valinnaista syötettä (siemeniä). Alla oleva esimerkki näyttää, miten Solana SDK:ta käytetään Program derived address -osoitteen luomiseen.

import { Address, getProgramDerivedAddress } from "@solana/kit";
const programAddress = "11111111111111111111111111111111" as Address;
const seeds = ["helloWorld"];
const [pda, bump] = await getProgramDerivedAddress({
programAddress,
seeds
});
console.log(`PDA: ${pda}`);
console.log(`Bump: ${bump}`);
Console
Click to execute the code.

Tilin rakenne

Jokaisella Account -tilillä on enimmäiskoko 10MiB ja se sisältää seuraavat tiedot:

  • lamports: Lamport-yksiköiden määrä tilillä
  • data: Tilin data
  • owner: Tiliä omistavan ohjelman tunnus
  • executable: Ilmaisee, sisältääkö tili suoritettavan binäärin
  • rent_epoch: Vanhentunut rent epoch -kenttä
Account
pub struct Account {
/// lamports in the account
pub lamports: u64,
/// data held in this account
#[cfg_attr(feature = "serde", serde(with = "serde_bytes"))]
pub data: Vec<u8>,
/// the program that owns this account. If executable, the program that loads this account.
pub owner: Pubkey,
/// this account's data contains a loaded program (and is now read-only)
pub executable: bool,
/// the epoch at which this account will next owe rent
pub rent_epoch: Epoch,
}

Lamports

Tilin saldo lamport-yksiköissä.

Jokaisella tilillä on oltava vähimmäismäärä lamport-yksiköitä, jota kutsutaan nimellä rent, mikä mahdollistaa sen tietojen tallentamisen lohkoketjuun. Rent on verrannollinen tilin kokoon.

Vaikka tätä saldoa kutsutaan nimellä rent, se toimii enemmän talletuksen tavoin, sillä koko saldon voi saada takaisin, kun tili suljetaan. (Nimi "rent" tulee nyt vanhentuneesta rent epoch -kentästä.)

(Katso vähimmäissaldon kaava ja sovellettavat vakiot.)

Data

Tätä kenttää kutsutaan yleisesti "tilin dataksi". Tämän kentän data katsotaan mielivaltaiseksi, koska se voi sisältää mitä tahansa tavusarjoja. Jokainen ohjelma määrittelee tähän kenttään tallennetun datan rakenteen.

  • Program account: Tämä kenttä sisältää joko suoritettavan ohjelmakoodin tai program data account -osoitteen, johon suoritettava ohjelmakoodi on tallennettu.
  • Data account: Tämä kenttä yleensä tallentaa tilatietoja, jotka on tarkoitettu luettaviksi.

Datan lukeminen Solana-tililtä sisältää kaksi vaihetta:

  1. Tilin hakeminen sen osoitteen avulla
  2. Tilin data -kentän deserialisointi raakatavuista asianmukaiseen tietorakenteeseen, jonka määrittelee tiliä omistava ohjelma.

Owner

Tämä kenttä sisältää tilin omistajan ohjelmatunnuksen.

Jokaisella Solana-tilillä on ohjelma, joka on määritetty sen omistajaksi. Tilin omistaja on ainoa ohjelma, joka voi muuttaa tilin data -kenttää tai vähentää lamporteja ohjelman ohjeiden mukaisesti.

(Program account -tapauksessa omistaja on sen lataaja-ohjelma.)

Executable

Tämä kenttä ilmaisee, onko tili program account vai data account

  • Jos true: Tili on program account
  • Jos false: Tili on data account

Rent epoch

rent_epoch -kenttä on vanhentunut.

Aiemmin tämä kenttä seurasi, milloin tilin pitäisi maksaa rent-maksua. Tämä rent-keräysmekanismi on kuitenkin sittemmin poistettu käytöstä.

Lamports

Tilin saldo lamport-yksiköissä.

Jokaisella tilillä on oltava vähimmäismäärä lamport-yksiköitä, jota kutsutaan nimellä rent, mikä mahdollistaa sen tietojen tallentamisen lohkoketjuun. Rent on verrannollinen tilin kokoon.

Vaikka tätä saldoa kutsutaan nimellä rent, se toimii enemmän talletuksen tavoin, sillä koko saldon voi saada takaisin, kun tili suljetaan. (Nimi "rent" tulee nyt vanhentuneesta rent epoch -kentästä.)

(Katso vähimmäissaldon kaava ja sovellettavat vakiot.)

Data

Tätä kenttää kutsutaan yleisesti "tilin dataksi". Tämän kentän data katsotaan mielivaltaiseksi, koska se voi sisältää mitä tahansa tavusarjoja. Jokainen ohjelma määrittelee tähän kenttään tallennetun datan rakenteen.

  • Program account: Tämä kenttä sisältää joko suoritettavan ohjelmakoodin tai program data account -osoitteen, johon suoritettava ohjelmakoodi on tallennettu.
  • Data account: Tämä kenttä yleensä tallentaa tilatietoja, jotka on tarkoitettu luettaviksi.

Datan lukeminen Solana-tililtä sisältää kaksi vaihetta:

  1. Tilin hakeminen sen osoitteen avulla
  2. Tilin data -kentän deserialisointi raakatavuista asianmukaiseen tietorakenteeseen, jonka määrittelee tiliä omistava ohjelma.

Owner

Tämä kenttä sisältää tilin omistajan ohjelmatunnuksen.

Jokaisella Solana-tilillä on ohjelma, joka on määritetty sen omistajaksi. Tilin omistaja on ainoa ohjelma, joka voi muuttaa tilin data -kenttää tai vähentää lamporteja ohjelman ohjeiden mukaisesti.

(Program account -tapauksessa omistaja on sen lataaja-ohjelma.)

Executable

Tämä kenttä ilmaisee, onko tili program account vai data account

  • Jos true: Tili on program account
  • Jos false: Tili on data account

Rent epoch

rent_epoch -kenttä on vanhentunut.

Aiemmin tämä kenttä seurasi, milloin tilin pitäisi maksaa rent-maksua. Tämä rent-keräysmekanismi on kuitenkin sittemmin poistettu käytöstä.

Account Examples
// Example Token Mint Account
Account {
lamports: 1461600,
data.len: 82,
owner: TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb,
executable: false,
rent_epoch: 0,
data: 010000001e213c90625a7e643d9555bb01b6c3fe6416d7afd523ce8c7ddd9b923ceafb9d00000000000000000901010000001e213c90625a7e643d9555bb01b6,
}
// Example Token Program Account
Account {
lamports: 4513200894,
data.len: 134080,
owner: BPFLoader2111111111111111111111111111111111,
executable: true,
rent_epoch: 18446744073709551615,
data: 7f454c460201010000000000000000000300f70001000000d8f90000000000004000000000000000800902000000000000000000400038000400400009000800,
}

Tilityypit

Tilit jakautuvat kahteen peruskategoriaan:

  • Ohjelma-tilit: Tilit, jotka sisältävät suoritettavaa koodia
  • Data-tilit: Tilit, jotka eivät sisällä suoritettavaa koodia

Tämä ohjelman koodin ja sen tilan erottaminen on keskeinen ominaisuus Solanan tilimallissa. (Samankaltaisesti kuin käyttöjärjestelmissä, joissa tyypillisesti on erilliset tiedostot ohjelmille ja niiden datalle.)

Ohjelma-tilit

Jokaisen ohjelman omistaa lataaja-ohjelma, jota käytetään tilin käyttöönottoon ja hallintaan. Kun uusi ohjelma otetaan käyttöön, luodaan tili sen suoritettavan koodin tallentamiseen. Tätä kutsutaan ohjelma-tiliksi. (Yksinkertaisuuden vuoksi voit ajatella ohjelma-tilin olevan itse ohjelma.)

Alla olevassa kaaviossa näet, kuinka lataaja-ohjelmaa käytetään ohjelma-tilin käyttöönottoon. Ohjelma-tilin data sisältää suoritettavan ohjelmakoodin.

Kaavio ohjelma-tilistä, sen 4 komponentista ja sen lataaja-ohjelmasta.Kaavio ohjelma-tilistä, sen 4 komponentista ja sen lataaja-ohjelmasta.

Ohjelma-datatilit

Ohjelmat, jotka on otettu käyttöön loader-v3:n avulla, eivät sisällä ohjelmakoodia niiden data -kentässä. Sen sijaan niiden data osoittaa erilliseen ohjelma-datatiliin, joka sisältää ohjelmakoodin. (Katso alla oleva kaavio.)

Ohjelma-tili datalla. Data osoittaa erilliseen ohjelma-datatiliinOhjelma-tili datalla. Data osoittaa erilliseen ohjelma-datatiliin

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

Alla oleva esimerkki hakee Token Program -tilin. Huomaa, että executable -kenttä on asetettu arvoon true, mikä osoittaa tilin olevan ohjelma.

import { Address, createSolanaRpc } from "@solana/kit";
const rpc = createSolanaRpc("https://api.mainnet-beta.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.

Data-tilit

Data-tilit eivät sisällä suoritettavaa koodia. Sen sijaan ne tallentavat tietoa.

Program state account -tilit

Ohjelmat käyttävät data-tilejä tilansa ylläpitämiseen. Tehdäkseen niin, niiden täytyy ensin luoda uusi data-tili. Ohjelman tilatilien luomisprosessi on usein abstrahoitu, mutta on hyödyllistä ymmärtää taustalla oleva prosessi.

Hallitakseen tilaansa, uuden ohjelman täytyy:

  1. Kutsua System Program luomaan tili. (System Program siirtää sitten omistajuuden uudelle ohjelmalle.)
  2. Alustaa tilin data, kuten sen ohjeet määrittelevät.

Kaavio data-tilistä, jonka omistaa program accountKaavio data-tilistä, jonka omistaa program account

Alla oleva 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.

System-tilit

Kaikkia tilejä ei määritetä uudelle omistajalle sen jälkeen, kun System Program on luonut ne. System Programin omistamia tilejä kutsutaan system-tileiksi. Kaikki lompakkotilit ovat system-tilejä, mikä mahdollistaa niiden maksaa transaktiomaksuja.

System Programin omistama lompakko, joka sisältää 1 000 000 lamportsiaSystem Programin omistama lompakko, joka sisältää 1 000 000 lamportsia

Kun SOL lähetetään uuteen osoitteeseen ensimmäistä kertaa, tili luodaan kyseiseen osoitteeseen System Programin omistamana.

Alla olevassa esimerkissä luodaan uusi keypair ja rahoitetaan se SOLilla. Koodin suorittamisen jälkeen näet, että tilin owner on 11111111111111111111111111111111 (eli 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 ennalta määritetyissä osoitteissa ja tarjoavat pääsyn klusterin tilatietoihin. Ne päivittyvät dynaamisesti verkkoklusterin tiedoilla. Katso täydellinen luettelo Sysvar-tileistä.

Alla oleva esimerkki hakee ja purkaa tietoja Sysvar Clock -tililtä.

import { createSolanaRpc } from "@solana/kit";
import { fetchSysvarClock, SYSVAR_CLOCK_ADDRESS } from "@solana/sysvars";
const rpc = createSolanaRpc("https://api.mainnet-beta.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

© 2025 Solana Foundation.
Kaikki oikeudet pidätetään.