بنية الحساب

ملخص

تحتوي الحسابات على 5 حقول: lamports وdata وowner وexecutable وrent_epoch. يتم تحديد كل حساب بعنوان فريد بحجم 32 بايت. يجب أن تحتفظ الحسابات برصيد أدنى من lamports يتناسب مع حجم بياناتها للبقاء على السلسلة.

عنوان الحساب

كل عنوان حساب هو قيمة بحجم 32 بايت، يتم عرضها كسلسلة نصية مشفرة بنظام base58. يمكن أن يكون العنوان من نوعين:

  1. مفتاح عام: يتوافق مع زوج مفاتيح Ed25519 (يحتوي على مفتاح خاص)
  2. عنوان مشتق من البرنامج (PDA): يتم اشتقاقه بشكل حتمي من معرف البرنامج والبذور (لا يحتوي على مفتاح خاص)

حساب مع عنوان مفتاحه العام المشفر بنظام base58حساب مع عنوان مفتاحه العام المشفر بنظام base58

مفتاح عام

يتكون Keypair من مفتاح عام (يُستخدم كعنوان للحساب) ومفتاح خاص (يُستخدم لتوقيع المعاملات). يُنشئ المثال التالي زوج مفاتيح باستخدام Solana SDK.

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.

عنوان مشتق من البرنامج

العنوان المشتق من البرنامج (PDA) يتم اشتقاقه بشكل حتمي من معرف البرنامج وبذرة واحدة أو أكثر اختيارية. لا تحتوي عناوين PDA على مفتاح خاص مقابل. يشتق المثال التالي PDA باستخدام Solana SDK.

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.

حقول الحساب

كل Account له حجم أقصى يبلغ MAX_ACCOUNT_DATA_LEN (10 ميجابايت، أي ما يعادل MAX_PERMITTED_DATA_LENGTH) ويحتوي على خمسة حقول:

الحقلالنوعالوصف
lamportsu64الرصيد بوحدة lamport. يمكن للمالك الخصم؛ أي برنامج يمكنه الإضافة.
dataVec<u8>حالة الحساب أو bytecode البرنامج. الحد الأقصى 10 ميجابايت. قابل للكتابة من المالك فقط.
ownerPubkeyالبرنامج الذي لديه صلاحية الكتابة. قابل لإعادة التعيين فقط عند تصفير البيانات.
executableboolصحيح = حساب برنامج.
rent_epochEpochمهمل. يتم تعيينه إلى u64::MAX للحسابات المعفاة من rent.
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,
/// if true, this account's data contains a program (and is now read-only)
pub executable: bool,
/// deprecated
pub rent_epoch: Epoch,
}

Lamports

يحتوي حقل lamports على رصيد الحساب بوحدة lamport (1 SOL = 1,000,000,000 lamport).

يجب أن يحتفظ كل حساب برصيد أدنى من lamport، يُعرف بالرصيد المعفى من rent، للحفاظ على بياناته مخزنة على السلسلة. هذا الرصيد يتناسب مع حجم بيانات الحساب.

على الرغم من أنه غالبًا ما يُسمى "rent"، فإن الرصيد المعفى من rent يعمل كوديعة قابلة للاسترداد، ويتم استرداد الرصيد الكامل عند إغلاق الحساب.

راجع minimum_balance() وثوابت rent constants.

Data

يخزن حقل data مصفوفة بايتات عشوائية. تعتمد محتوياته على نوع الحساب:

  • حسابات البرامج: تحتوي على bytecode قابل للتنفيذ أو عنوان حساب بيانات البرنامج الذي يخزن bytecode.
  • حسابات البيانات: تحتوي على بيانات الحالة المحددة من قبل البرنامج. يحدد البرنامج المالك تنسيق التسلسل.

تتطلب قراءة بيانات الحساب خطوتين:

  1. جلب الحساب عن طريق عنوانه.
  2. إلغاء تسلسل حقل data من البايتات الخام إلى بنية البيانات المحددة من قبل البرنامج.

المالك

يحتوي حقل owner على معرّف البرنامج (المفتاح العام) للبرنامج الذي يمتلك هذا الحساب.

البرنامج المالك هو البرنامج الوحيد الذي يمكنه:

  • تعديل حقل data للحساب
  • خصم lamports من حقل lamports للحساب

يمكن لأي برنامج إضافة lamports إلى حساب آخر، لكن المالك فقط هو من يمكنه خصم lamports منه.

بالنسبة لحسابات البرامج، المالك هو برنامج التحميل الخاص بالحساب.

قابل للتنفيذ

حقل executable هو قيمة منطقية تحدد ما إذا كان الحساب حساب برنامج أو حساب بيانات:

  • true = حساب برنامج (يحتوي على كود قابل للتنفيذ)
  • false = حساب بيانات (يخزن الحالة)

فترة الإيجار

حقل rent_epoch لم يعد مستخدماً.

كان يتتبع سابقاً موعد خصم lamports تلقائياً من الحساب لدفع تكلفة الاحتفاظ ببياناته على السلسلة. نظراً لأن تحصيل rent لم يعد مستخدماً، يتم تعيين rent_epoch إلى u64::MAX لجميع الحسابات الجديدة المعفاة من الإيجار.

Lamports

يحتوي حقل lamports على رصيد الحساب بوحدة lamport (1 SOL = 1,000,000,000 lamport).

يجب أن يحتفظ كل حساب برصيد أدنى من lamport، يُعرف بالرصيد المعفى من rent، للحفاظ على بياناته مخزنة على السلسلة. هذا الرصيد يتناسب مع حجم بيانات الحساب.

على الرغم من أنه غالبًا ما يُسمى "rent"، فإن الرصيد المعفى من rent يعمل كوديعة قابلة للاسترداد، ويتم استرداد الرصيد الكامل عند إغلاق الحساب.

راجع minimum_balance() وثوابت rent constants.

Data

يخزن حقل data مصفوفة بايتات عشوائية. تعتمد محتوياته على نوع الحساب:

  • حسابات البرامج: تحتوي على bytecode قابل للتنفيذ أو عنوان حساب بيانات البرنامج الذي يخزن bytecode.
  • حسابات البيانات: تحتوي على بيانات الحالة المحددة من قبل البرنامج. يحدد البرنامج المالك تنسيق التسلسل.

تتطلب قراءة بيانات الحساب خطوتين:

  1. جلب الحساب عن طريق عنوانه.
  2. إلغاء تسلسل حقل data من البايتات الخام إلى بنية البيانات المحددة من قبل البرنامج.

المالك

يحتوي حقل owner على معرّف البرنامج (المفتاح العام) للبرنامج الذي يمتلك هذا الحساب.

البرنامج المالك هو البرنامج الوحيد الذي يمكنه:

  • تعديل حقل data للحساب
  • خصم lamports من حقل lamports للحساب

يمكن لأي برنامج إضافة lamports إلى حساب آخر، لكن المالك فقط هو من يمكنه خصم lamports منه.

بالنسبة لحسابات البرامج، المالك هو برنامج التحميل الخاص بالحساب.

قابل للتنفيذ

حقل executable هو قيمة منطقية تحدد ما إذا كان الحساب حساب برنامج أو حساب بيانات:

  • true = حساب برنامج (يحتوي على كود قابل للتنفيذ)
  • false = حساب بيانات (يخزن الحالة)

فترة الإيجار

حقل rent_epoch لم يعد مستخدماً.

كان يتتبع سابقاً موعد خصم lamports تلقائياً من الحساب لدفع تكلفة الاحتفاظ ببياناته على السلسلة. نظراً لأن تحصيل rent لم يعد مستخدماً، يتم تعيين rent_epoch إلى u64::MAX لجميع الحسابات الجديدة المعفاة من الإيجار.

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,
}

Is this page helpful?

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

تعديل الصفحة

تدار بواسطة

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