القراءة من الشبكة
يستكشف هذا القسم كيفية قراءة البيانات من شبكة سولانا عن طريق استرجاع حسابات مختلفة لفهم بنية حساب سولانا.
في سولانا، توجد جميع البيانات في "حسابات". يمكنك التفكير في البيانات على سولانا كقاعدة بيانات عامة تحتوي على جدول "حسابات" واحد، حيث كل إدخال هو حساب بنفس نوع الحساب الأساسي.
#[derive(PartialEq, Eq, Clone, Default)]pub struct Account {/// lamports in the accountpub 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 rentpub rent_epoch: Epoch,}
الحسابات
يمكن للحسابات على سولانا تخزين "حالة" أو برامج "قابلة للتنفيذ". كل حساب له "عنوان" (مفتاح عام) يعمل كمعرف فريد يستخدم لتحديد موقع البيانات المقابلة على السلسلة.
تحتوي حسابات سولانا على أحد الأمرين:
- الحالة: البيانات المقصود قراءتها والاحتفاظ بها. على سبيل المثال، معلومات حول الرموز، أو بيانات المستخدم، أو بيانات أخرى محددة ضمن برنامج.
- البرامج القابلة للتنفيذ: الحسابات التي تحتوي على الشفرة الفعلية لبرامج سولانا. تخزن هذه الحسابات التعليمات التي يمكن للمستخدمين استدعاؤها.
هذا الفصل بين شفرة البرنامج وحالة البرنامج هو ميزة أساسية في نموذج حساب سولانا. لمزيد من التفاصيل، راجع صفحة نموذج حساب سولانا.
استرجاع حساب المحفظة
يوضح هذا المثال كيفية:
- إنشاء زوج مفاتيح جديد (زوج المفتاح العام/الخاص).
- طلب إسقاط جوي من SOL لتمويل العنوان الجديد.
- استرجاع بيانات الحساب للعنوان الممول.
على سولانا، يؤدي تمويل عنوان جديد بـ SOL تلقائيًا إلى إنشاء حساب مملوك من قبل System Program. جميع حسابات "المحفظة" هي ببساطة حسابات مملوكة من System Program تحتفظ بـ SOL ويمكنها توقيع المعاملات.
import { Keypair, Connection, LAMPORTS_PER_SOL } from "@solana/web3.js";const keypair = Keypair.generate();console.log(`Public Key: ${keypair.publicKey}`);const connection = new Connection("http://localhost:8899", "confirmed");// Funding an address with SOL automatically creates an accountconst signature = await connection.requestAirdrop(keypair.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");const accountInfo = await connection.getAccountInfo(keypair.publicKey);console.log(JSON.stringify(accountInfo, null, 2));
"المحفظة" على سولانا هي حساب مملوك من قبل
برنامج النظام،
وهو أحد البرامج المدمجة في سولانا. تُستخدم حسابات المحفظة بشكل أساسي لحفظ SOL
(يتم تتبعها في حقل lamports
) وتوقيع المعاملات.
عندما تقوم بجلب حساب محفظة، تتضمن الاستجابة الحقول الموضحة في مثال المخرجات.
يحتوي حقل data
على بيانات الحساب المخزنة كبايتات.
بالنسبة لحسابات المحفظة، يكون هذا الحقل فارغًا (0 بايت). تستخدم الحسابات الأخرى هذا الحقل لتخزين إما حالة البرنامج أو رمز البرنامج القابل للتنفيذ.
يشير حقل executable
إلى ما إذا كان حقل data
للحساب يحتوي على رمز برنامج قابل
للتنفيذ.
بالنسبة للمحفظة والحسابات التي تخزن حالة البرنامج، يكون هذا الحقل false
.
يحتوي حقل lamports
على رصيد الحساب من SOL، مقومًا بوحدة لامبورت.
اللامبورت هي أصغر وحدة من SOL. 1 SOL = 1,000,000,000 لامبورت.
يوضح حقل owner
البرنامج الذي يملك الحساب.
بالنسبة للمحافظ، المالك دائمًا هو System Program، بالعنوان
11111111111111111111111111111111
.
حقل rentEpoch
هو حقل قديم من آلية مهجورة حيث كانت الحسابات تُفرض عليها "rent"
(بوحدة lamport) للحفاظ على بياناتها على الشبكة.
هذا الحقل غير مستخدم حاليًا، ولكنه مُدرج للتوافق مع الإصدارات السابقة.
يوضح حقل space
عدد البايتات في حقل data
. هذا ليس حقلًا في نوع Account
نفسه، ولكنه مُدرج في الاستجابة.
في هذا المثال، حقل space
هو 0 لأن حقل data
يحتوي على 0 بايت من البيانات.
جلب Token Program
يقوم هذا المثال بجلب Token Program لتوضيح الفرق بين حسابات المحفظة وحسابات البرنامج.
يخزن حساب البرنامج الشفرة الثنائية المُجمّعة لـ الشفرة المصدرية الخاصة بـ Token Program. يمكنك عرض حساب البرنامج هذا على مستكشف سولانا.
import { Connection, PublicKey } from "@solana/web3.js";const connection = new Connection("https://api.mainnet-beta.solana.com","confirmed");const address = new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");const accountInfo = await connection.getAccountInfo(address);
Token Program هو حساب برنامج قابل للتنفيذ على سولانا. مثل حسابات المحفظة، تمتلك البرامج نفس بنية البيانات الأساسية Account، ولكن مع اختلافات رئيسية في حقولها.
تم تعيين الحقل executable
إلى true
، مما يشير إلى أن حقل data
لهذا الحساب
يحتوي على شفرة برنامج قابلة للتنفيذ.
بالنسبة لحسابات البرامج، يخزن الحقل data
الشفرة القابلة للتنفيذ للبرنامج. على
العكس من ذلك، تحتوي حسابات المحفظة على حقل بيانات فارغ.
عندما تقوم بنشر برنامج سولانا، يتم تخزين الشفرة القابلة للتنفيذ للبرنامج في حقل
data
للحساب.
تحتوي حسابات البرامج القابلة للتنفيذ أيضًا على برنامج معين كـ owner
للحساب.
جميع حسابات البرامج مملوكة لبرنامج Loader، وهو فئة من البرامج المدمجة التي تمتلك حسابات برامج قابلة للتنفيذ على سولانا.
بالنسبة لـ Token Program، فإن owner
هو برنامج BPFLoader2.
جلب حساب mint account
يقوم هذا المثال بجلب حساب mint account لعملة الدولار الأمريكي (USDC) لإظهار كيفية تخزين البرامج على سولانا للحالة في حسابات منفصلة.
حساب Mint هو حساب مملوك لـ Token Program. يخزن البيانات الوصفية العالمية لرمز معين، بما في ذلك إجمالي العرض، وعدد الكسور العشرية، والحسابات المصرح لها بسك أو تجميد الرموز. عنوان حساب mint account يحدد بشكل فريد رمزًا على شبكة سولانا.
import { Connection, PublicKey } from "@solana/web3.js";const connection = new Connection("https://api.mainnet-beta.solana.com","confirmed");const address = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");const accountInfo = await connection.getAccountInfo(address);
النقطة الأساسية التي يجب ملاحظتها في هذا المثال هي أن حساب Mint يخزن الحالة، وليس الكود القابل للتنفيذ.
حسابات Mint مملوكة من قبل Token Program، الذي يتضمن تعليمات تحدد كيفية إنشاء وتحديث حسابات Mint.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
الحقل executable
هو false
لأن حقل data
الخاص بحساب mint يخزن الحالة، وليس
الكود القابل للتنفيذ.
يحدد Token Program نوع البيانات Mint
، الذي يتم تخزينه في حقل data
الخاص
بحساب mint.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
يحتوي حقل data
على حالة الحساب Mint
المشفرة، مثل سلطة الإصدار، والعرض الكلي،
وعدد الكسور العشرية.
لقراءة حساب Mint، يجب عليك فك تشفير حقل data
إلى نوع البيانات Mint
. سيتم
تناول ذلك في الخطوة التالية.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Token Program (TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
) يملك حساب mint.
هذا يعني أن حقل data
الخاص بحساب mint يمكن تعديله فقط بواسطة التعليمات المحددة
في Token Program.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
فك تشفير حساب Mint
يحتوي حقل data
في حساب سولانا على بايتات خام. لتفسير هذه البيانات بشكل مفيد،
يجب عليك فك تشفيرها إلى نوع البيانات المناسب المحدد بواسطة البرنامج الذي يملك
الحساب.
توفر معظم برامج سولانا مكتبات عميلة مع دوال مساعدة تجرد عملية فك التشفير. تحول هذه الدوال بايتات الحساب الخام إلى أنواع بيانات منظمة، مما يسهل العمل مع بيانات الحساب.
على سبيل المثال، يتضمن @solana/spl-token
دالة
getMint()
للمساعدة في فك تشفير حقل data
الخاص بحساب Mint
إلى نوع البيانات
Mint.
import { PublicKey, Connection } from "@solana/web3.js";import { getMint } from "@solana/spl-token";const connection = new Connection("https://api.mainnet-beta.solana.com","confirmed");const address = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");const mintData = await getMint(connection, address, "confirmed");
pub struct Mint {/// Optional authority used to mint new tokens. The mint authority may only/// be provided during mint creation. If no mint authority is present/// then the mint has a fixed supply and no further tokens may be/// minted.pub mint_authority: COption<Pubkey>,/// Total supply of tokens.pub supply: u64,/// Number of base 10 digits to the right of the decimal place.pub decimals: u8,/// Is `true` if this structure has been initializedpub is_initialized: bool,/// Optional authority to freeze token accounts.pub freeze_authority: COption<Pubkey>,}
تقوم دالة getMint()
بفك تشفير حقل data
الخاص بحساب mint إلى نوع البيانات
Mint
المُعرّف بواسطة Token Program.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
يمكنك عرض بيانات حساب Mint المفككة بالكامل على مستكشف سولانا.
يحتوي حقل address
على عنوان حساب Mint.
يُستخدم عنوان حساب mint لتحديد هوية الرمز على شبكة سولانا.
يُظهر حقل mintAuthority
السلطة المسموح لها بإنشاء رموز جديدة.
هذا هو الحساب الوحيد الذي يمكنه إنشاء وحدات جديدة من الرمز.
يُظهر حقل supply
العدد الإجمالي للرموز التي تم إنشاؤها.
هذه القيمة هي بأصغر وحدة للرمز. للحصول على إجمالي المعروض بالوحدات القياسية، قم
بتعديل قيمة حقل supply
بواسطة decimals
.
يوضح حقل decimals
عدد المنازل العشرية للرمز.
يشير حقل isInitialized
إلى ما إذا كان حساب Mint قد تم تهيئته. هذا الحقل هو فحص
أمان يستخدم في Token Program.
يوضح حقل freezeAuthority
السلطة المسموح لها بتجميد حسابات الرمز.
لا يمكن لحساب الرمز المجمد تحويل أو حرق الرمز الموجود في الحساب.
يحتوي حقل tlvData
على بيانات إضافية لـ Token Extensions (تتطلب تفكيكًا
إضافيًا).
هذا الحقل مهم فقط للحسابات التي تم إنشاؤها بواسطة Token Extension Program (Token2022).
Is this page helpful?