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-parin luomiseen.

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 johdetaan deterministisesti käyttäen ohjelman tunnusta 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 on enimmäiskoko 10MiB ja se sisältää seuraavat tiedot:

  • lamports: Lamports-yksiköiden määrä tilillä
  • data: Tilin data
  • owner: Sen ohjelman tunnus, joka omistaa tilin
  • 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,
}

Lamport-yksiköt

Tilin saldo lamport-yksiköissä.

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

Vaikka tätä saldoa kutsutaan rentiksi, se toimii enemmän talletuksen tavoin, sillä koko saldo voidaan palauttaa, kun tili suljetaan. (Nimi "rent" tulee nyt vanhentuneesta rent epoch -kentästä.)

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

Data

Tähän kenttään viitataan yleisesti "tilin datana". 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 -tilit: Tämä kenttä sisältää joko suoritettavan ohjelmakoodin tai program data account -tilin osoitteen, joka tallentaa suoritettavan ohjelmakoodin.
  • Datatilit: Tämä kenttä yleensä tallentaa tiladataa, joka on tarkoitettu luettavaksi.

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.

Omistaja

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

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

(Program account -tilin tapauksessa omistaja on sen loader program.)

Suoritettava

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

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

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ä.

Lamport-yksiköt

Tilin saldo lamport-yksiköissä.

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

Vaikka tätä saldoa kutsutaan rentiksi, se toimii enemmän talletuksen tavoin, sillä koko saldo voidaan palauttaa, kun tili suljetaan. (Nimi "rent" tulee nyt vanhentuneesta rent epoch -kentästä.)

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

Data

Tähän kenttään viitataan yleisesti "tilin datana". 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 -tilit: Tämä kenttä sisältää joko suoritettavan ohjelmakoodin tai program data account -tilin osoitteen, joka tallentaa suoritettavan ohjelmakoodin.
  • Datatilit: Tämä kenttä yleensä tallentaa tiladataa, joka on tarkoitettu luettavaksi.

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.

Omistaja

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

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

(Program account -tilin tapauksessa omistaja on sen loader program.)

Suoritettava

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

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

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:

Tämä erottelu tarkoittaa, että ohjelman suoritettava koodi ja sen tila tallennetaan erillisiin tileihin. (Samankaltaisesti kuin käyttöjärjestelmissä, joissa tyypillisesti on erilliset tiedostot ohjelmille ja niiden datalle.)

Program account -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 program account -tiliksi. (Yksinkertaisuuden vuoksi voit ajatella program account -tilin olevan itse ohjelma.)

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

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

Program data account -tilit

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

Program account datalla. Data osoittaa erilliseen program data account -tiliinProgram account datalla. Data osoittaa erilliseen program data account -tiliin

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.

Datatilit

Datatilit eivät sisällä suoritettavaa koodia. Sen sijaan ne tallentavat tietoa.

Ohjelman tilatilit

Ohjelmat käyttävät datatilejä tilansa ylläpitämiseen. Tätä varten niiden on ensin luotava uusi datatili. Ohjelman tilatilien luomisprosessi on usein abstrahoitu, mutta on hyödyllistä ymmärtää taustalla oleva prosessi.

Tilansa hallitsemiseksi uuden ohjelman täytyy:

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

Kaavio datatiliistä, jonka omistaa program accountKaavio datatiliistä, 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.

Järjestelmätilit

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

System Program -ohjelman omistama lompakko, joka sisältää 1 000 000 lamportsiaSystem Program -ohjelman omistama lompakko, joka sisältää 1 000 000 lamportsia

Kun SOL lähetetään ensimmäistä kertaa uuteen osoitteeseen, kyseiseen osoitteeseen luodaan tili, jonka omistaa System Program.

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

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

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.