أنواع الحسابات

ملخص

تحتوي حسابات البرامج على كود sBPF القابل للتنفيذ. تخزن حسابات البيانات الحالة، وتكون مملوكة للبرامج. حسابات النظام مملوكة لبرنامج النظام. توفر متغيرات النظام حالة الكتلة يمكن الوصول إليها على عناوين محددة مسبقًا.

يحدد حقل executable فئة الحساب:

هذا الفصل بين الكود والحالة القابلة للتغيير يعني أن البرنامج يتم نشره مرة واحدة ويمكنه إدارة أي عدد من حسابات البيانات.

حسابات البرامج

يخزن حساب البرنامج الكود القابل للتنفيذ. كل حساب برنامج مملوك لـبرنامج محمل. عندما يتم نشر برنامج، ينشئ وقت التشغيل حساب برنامج لحفظ الكود الثنائي الخاص به.

مخطط لحساب برنامج ومكوناته الأربعة وبرنامج المحمل الخاص به.مخطط لحساب برنامج ومكوناته الأربعة وبرنامج المحمل الخاص به.

حسابات بيانات البرامج

البرامج المنشورة باستخدام loader-v3 (انظر برامج المحمل) لا تخزن الكود الثنائي القابل للتنفيذ في حقل data الخاص بها. بدلاً من ذلك، يشير حقل data الخاص بها إلى حساب بيانات برنامج منفصل يحتوي على كود البرنامج. (انظر المخطط أدناه.)

حساب برنامج مع بيانات. تشير البيانات إلى حساب بيانات برنامج منفصلحساب برنامج مع بيانات. تشير البيانات إلى حساب بيانات برنامج منفصل

أثناء نشر البرنامج أو الترقيات، تُستخدم حسابات المخزن المؤقت لتجهيز التحميل مؤقتًا.

يسترجع المثال التالي حساب Token Program. حقل executable هو true، مما يؤكد أنه حساب برنامج.

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.

حسابات البيانات

حسابات البيانات لا تحتوي على كود قابل للتنفيذ. إنها تخزن الحالة المحددة بواسطة البرنامج.

حساب حالة البرنامج

تخزن البرامج حالتها في حسابات البيانات. يتضمن إنشاء حساب حالة البرنامج خطوتين:

  1. استدعاء System Program لإنشاء الحساب. يقوم System Program بنقل الملكية إلى البرنامج المحدد.
  2. يقوم البرنامج المالك بتهيئة حقل data الخاص بالحساب وفقًا لـ التعليمات الخاصة به.

مخطط لحساب بيانات مملوك بواسطة program accountمخطط لحساب بيانات مملوك بواسطة program account

ينشئ المثال التالي ويجلب mint account مملوكًا بواسطة برنامج Token 2022.

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 Program بعد الإنشاء تسمى حسابات النظام. إرسال SOL إلى عنوان جديد لأول مرة ينشئ حسابًا جديدًا في ذلك العنوان مملوكًا لـ System Program.

جميع حسابات المحفظة هي حسابات نظام. يجب أن يكون دافع الرسوم في المعاملة حساب نظام، لأن الحسابات المملوكة لـ System Program فقط يمكنها دفع رسوم المعاملات.

محفظة مملوكة لـ System Program تحتوي على 1,000,000 lamportمحفظة مملوكة لـ System Program تحتوي على 1,000,000 lamport

ينشئ المثال التالي keypair جديدًا، ويموله بـ SOL، ويجلب الحساب. حقل owner هو 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

حسابات Sysvar هي حسابات خاصة بعناوين محددة مسبقاً توفر وصولاً للقراءة فقط إلى بيانات حالة الشبكة. يتم تحديثها ديناميكياً كل slot.

Sysvarالعنوانالغرض
ClockSysvarC1ock11111111111111111111111111111111الـ slot الحالي، الـ epoch، والطابع الزمني Unix
EpochScheduleSysvarEpochSchedu1e111111111111111111111111ثوابت جدولة الـ epoch المحددة في genesis
EpochRewardsSysvarEpochRewards1111111111111111111111111حالة وتقدم توزيع مكافآت الـ epoch
RentSysvarRent111111111111111111111111111111111معدل الـ rent وحد الإعفاء
SlotHashesSysvarS1otHashes111111111111111111111111111أحدث hashes لـ banks الأصلية للـ slot
StakeHistorySysvarStakeHistory1111111111111111111111111تفعيلات وإلغاء تفعيلات الـ stake لكل epoch
LastRestartSlotSysvarLastRestartS1ot1111111111111111111111آخر slot لإعادة تشغيل الشبكة
InstructionsSysvar1nstructions1111111111111111111111111التعليمات المتسلسلة للمعاملة الحالية
SlotHistorySysvarS1otHistory11111111111111111111111111سجل الـ slots التي تم إنتاجها خلال الـ epoch الأخير

يوضح المثال التالي كيفية جلب وإلغاء تسلسل حساب Sysvar Clock.

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?

جدول المحتويات

تعديل الصفحة

تدار بواسطة

© 2026 مؤسسة سولانا.
جميع الحقوق محفوظة.
تواصل معنا