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.
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 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, generateKeyPairSigner } from "@solana/kit";import { createClient } from "@solana/kit-client-rpc";const feePayer = await generateKeyPairSigner();const client = createClient({url: "https://api.mainnet.solana.com",payer: feePayer});const programId = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" as Address;const accountInfo = await client.rpc.getAccountInfo(programId, { encoding: "base64" }).send();console.log(accountInfo);
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:
- Kutsu System Program -ohjelmaa tilin luomiseksi. System Program siirtää omistajuuden määritetylle ohjelmalle.
- Omistava ohjelma alustaa tilin
data-kentän ohjeidensa mukaisesti.
Diagram of a data account owned by a program account
Seuraava esimerkki luo ja hakee Token Mint -tilin, jonka omistaa Token 2022 -ohjelma.
import { generateKeyPairSigner } from "@solana/kit";import { createLocalClient } from "@solana/kit-client-rpc";import { systemProgram } from "@solana-program/system";import {getInitializeMintInstruction,getMintSize,TOKEN_2022_PROGRAM_ADDRESS,fetchMint} from "@solana-program/token-2022";const client = await createLocalClient().use(systemProgram());// Generate keypair to use as address of mintconst mint = await generateKeyPairSigner();// Get default mint account size (in bytes), no extensions enabledconst space = BigInt(getMintSize());// Get minimum balance for rent exemptionconst rent = await client.rpc.getMinimumBalanceForRentExemption(space).send();const transactionSignature = await client.sendTransaction([client.system.instructions.createAccount({newAccount: mint,lamports: rent,space,programAddress: TOKEN_2022_PROGRAM_ADDRESS}),getInitializeMintInstruction({mint: mint.address,decimals: 9,mintAuthority: client.payer.address})]);console.log("Mint Address:", mint.address);console.log("Transaction Signature:", transactionSignature.context.signature);const accountInfo = await client.rpc.getAccountInfo(mint.address).send();console.log(accountInfo);const mintAccount = await fetchMint(client.rpc, mint.address);console.log(mintAccount);
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 lamports
Seuraava esimerkki generoi uuden keypair-avaimen, rahoittaa sen SOL:lla ja hakee
tilin. owner-kenttä on 11111111111111111111111111111111
(System Program).
import { generateKeyPairSigner, lamports } from "@solana/kit";import { createLocalClient } from "@solana/kit-client-rpc";const client = await createLocalClient();// Generate a new keypairconst keypair = await generateKeyPairSigner();console.log(`Public Key: ${keypair.address}`);// Funding an address with SOL automatically creates an accountconst signature = await client.airdrop(keypair.address,lamports(1_000_000_000n));const accountInfo = await client.rpc.getAccountInfo(keypair.address).send();console.log(accountInfo);
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.
| Sysvar | Osoite | Tarkoitus |
|---|---|---|
| Clock | SysvarC1ock11111111111111111111111111111111 | Nykyinen slot, epoch ja Unix-aikaleima |
| EpochSchedule | SysvarEpochSchedu1e111111111111111111111111 | Genesiksessä asetetut epochin ajoitusvakiot |
| EpochRewards | SysvarEpochRewards1111111111111111111111111 | Epochin palkkioiden jakelun tila ja edistyminen |
| Rent | SysvarRent111111111111111111111111111111111 | Vuokra-aste ja vapautuskynnys |
| SlotHashes | SysvarS1otHashes111111111111111111111111111 | Slotin ylätason pankkien viimeisimmät hajautusarvot |
| StakeHistory | SysvarStakeHistory1111111111111111111111111 | Staken aktivoinnit ja deaktivoinnit per epoch |
| LastRestartSlot | SysvarLastRestartS1ot1111111111111111111111 | Viimeisin klusterin uudelleenkäynnistysslot |
| Instructions | Sysvar1nstructions1111111111111111111111111 | Nykyisen transaktion sarjallistetut ohjeet |
| SlotHistory | SysvarS1otHistory11111111111111111111111111 | Tallenne siitä, mitkä slotit tuotettiin viimeisen epochin aikana |
Seuraava esimerkki hakee ja deserialisoi Sysvar Clock -tilin.
import { generateKeyPairSigner } from "@solana/kit";import { createClient } from "@solana/kit-client-rpc";import { fetchSysvarClock, SYSVAR_CLOCK_ADDRESS } from "@solana/sysvars";const feePayer = await generateKeyPairSigner();const client = createClient({url: "https://api.mainnet.solana.com",payer: feePayer});const accountInfo = await client.rpc.getAccountInfo(SYSVAR_CLOCK_ADDRESS, { encoding: "base64" }).send();console.log(accountInfo);// Automatically fetch and deserialize the account dataconst clock = await fetchSysvarClock(client.rpc);console.log(clock);
Is this page helpful?