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, 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);
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 {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 exampleconst rpc = createSolanaRpc("http://localhost:8899");const rpcSubscriptions = createSolanaRpcSubscriptions("ws://localhost:8900");// Generate keypairs for fee payerconst feePayer = await generateKeyPairSigner();// Fund fee payerawait airdropFactory({ rpc, rpcSubscriptions })({recipientAddress: feePayer.address,lamports: lamports(1_000_000_000n),commitment: "confirmed"});// 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 rpc.getMinimumBalanceForRentExemption(space).send();// Instruction to create new account for mint (token 2022 program)// Invokes the system programconst createAccountInstruction = getCreateAccountInstruction({payer: feePayer,newAccount: mint,lamports: rent,space,programAddress: TOKEN_2022_PROGRAM_ADDRESS});// Instruction to initialize mint account data// Invokes the token 2022 programconst initializeMintInstruction = getInitializeMintInstruction({mint: mint.address,decimals: 9,mintAuthority: feePayer.address});const instructions = [createAccountInstruction, initializeMintInstruction];// Get latest blockhash to include in transactionconst { value: latestBlockhash } = await rpc.getLatestBlockhash().send();// Create transaction messageconst 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 transactionawait sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions })(signedTransaction,{ commitment: "confirmed" });// Get transaction signatureconst 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);
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 {airdropFactory,createSolanaRpc,createSolanaRpcSubscriptions,generateKeyPairSigner,lamports} from "@solana/kit";// Create a connection to Solana clusterconst rpc = createSolanaRpc("http://localhost:8899");const rpcSubscriptions = createSolanaRpcSubscriptions("ws://localhost:8900");// Generate a new keypairconst keypair = await generateKeyPairSigner();console.log(`Public Key: ${keypair.address}`);// Funding an address with SOL automatically creates an accountconst 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);
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 { 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 dataconst clock = await fetchSysvarClock(rpc);console.log(clock);
Is this page helpful?