القراءة من الشبكة

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

جلب حساب محفظة

حساب المحفظة هو حساب مملوك لـ System Program. تُستخدم حسابات المحافظ بشكل أساسي لحفظ SOL وتوقيع المعاملات. عند إرسال SOL إلى عنوان جديد لأول مرة، يُنشأ تلقائياً حساب نظام.

يقوم المثال أدناه بإنشاء عميل Kit، وإنشاء موقّع جديد، وطلب SOL لتمويل العنوان الجديد، واسترداد بيانات الحساب من واجهة RPC الخاصة بالعميل.

Fetch account
import { createClient, generateKeyPairSigner, lamports } from "@solana/kit";
import { solanaRpc, rpcAirdrop } from "@solana/kit-plugin-rpc";
import { generatedPayer } from "@solana/kit-plugin-signer";
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "http://localhost:8899",
rpcSubscriptionsUrl: "ws://localhost:8900"
})
)
.use(rpcAirdrop());
const signer = await generateKeyPairSigner();
console.log(`Address: ${signer.address}`);
// Funding an address with SOL automatically creates an account
await client.airdrop(signer.address, lamports(1_000_000_000n));
const accountInfo = await client.rpc.getAccountInfo(signer.address).send();
console.log(accountInfo);
Console
Click to execute the code.

عند جلب حساب محفظة باستخدام getAccountInfo()، يُعيد Kit استجابة RPC كما هو موضح في نموذج الإخراج على اليمين.

تحتوي الاستجابة على حقلين رئيسيين: يصف context وقت حدوث عملية القراءة، بينما يحتوي value على حقول الحساب التي تُعيدها طريقة RPC.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

يُظهر حقل context الـ slot المستخدم لقراءة الحساب وإصدار واجهة RPC التي أرسلت الاستجابة. قد تُعيد عملية قراءة لاحقة slot مختلفاً أو إصدار واجهة برمجية مختلفاً.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

يحتوي حقل value على حالة الحساب التي تُعيدها طريقة RPC. تستعرض الخطوات التالية الحقول داخل value بالترتيب الذي تظهر فيه.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

يحتوي حقل lamports على رصيد SOL للحساب، مقاساً بالـ lamports، وهي أصغر وحدة في SOL.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

يحتوي حقل data على بيانات الحساب المخزنة على شكل بايتات. يُعيد RPC بيانات الحساب كزوج مرتب: سلسلة البيانات المُرمَّزة، يليها نوع الترميز. بالنسبة لحسابات المحفظة، تكون سلسلة البيانات المُرمَّزة فارغة لأن الحساب يخزن 0 بايت من البيانات.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

يُظهر حقل owner البرنامج المالك للحساب. بالنسبة للمحافظ، يكون المالك دائماً هو System Program، بالعنوان 11111111111111111111111111111111.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

يُخبرك حقل executable بما إذا كان عنوان الحساب قابلاً للاستدعاء. true يعني أن العنوان يمثل برنامجاً يمكنه معالجة التعليمات. false يعني أن الحساب يخزن حالة، كرصيد المحفظة أو بيانات الحساب، وليس مستدعىً كبرنامج. تستخدم حسابات المحفظة false.

حقل rentEpoch هو حقل قديم موروث من آلية rent مُهمَلة. لا يزال هذا الحقل يُعاد للحفاظ على التوافق مع الإصدارات السابقة.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

يُظهر حقل space عدد البايتات الموجودة في حقل data. يُعاد حقل space ضمن استجابة جلب الحساب، لكنه ليس جزءاً من نوع بيانات الحساب.

في مثال حساب المحفظة، قيمة حقل space هي 0 لأن حقل data يحتوي على 0 بايت من البيانات.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

عند جلب حساب محفظة باستخدام getAccountInfo()، يُعيد Kit استجابة RPC كما هو موضح في نموذج الإخراج على اليمين.

تحتوي الاستجابة على حقلين رئيسيين: يصف context وقت حدوث عملية القراءة، بينما يحتوي value على حقول الحساب التي تُعيدها طريقة RPC.

يُظهر حقل context الـ slot المستخدم لقراءة الحساب وإصدار واجهة RPC التي أرسلت الاستجابة. قد تُعيد عملية قراءة لاحقة slot مختلفاً أو إصدار واجهة برمجية مختلفاً.

يحتوي حقل value على حالة الحساب التي تُعيدها طريقة RPC. تستعرض الخطوات التالية الحقول داخل value بالترتيب الذي تظهر فيه.

يحتوي حقل lamports على رصيد SOL للحساب، مقاساً بالـ lamports، وهي أصغر وحدة في SOL.

يحتوي حقل data على بيانات الحساب المخزنة على شكل بايتات. يُعيد RPC بيانات الحساب كزوج مرتب: سلسلة البيانات المُرمَّزة، يليها نوع الترميز. بالنسبة لحسابات المحفظة، تكون سلسلة البيانات المُرمَّزة فارغة لأن الحساب يخزن 0 بايت من البيانات.

يُظهر حقل owner البرنامج المالك للحساب. بالنسبة للمحافظ، يكون المالك دائماً هو System Program، بالعنوان 11111111111111111111111111111111.

يُخبرك حقل executable بما إذا كان عنوان الحساب قابلاً للاستدعاء. true يعني أن العنوان يمثل برنامجاً يمكنه معالجة التعليمات. false يعني أن الحساب يخزن حالة، كرصيد المحفظة أو بيانات الحساب، وليس مستدعىً كبرنامج. تستخدم حسابات المحفظة false.

حقل rentEpoch هو حقل قديم موروث من آلية rent مُهمَلة. لا يزال هذا الحقل يُعاد للحفاظ على التوافق مع الإصدارات السابقة.

يُظهر حقل space عدد البايتات الموجودة في حقل data. يُعاد حقل space ضمن استجابة جلب الحساب، لكنه ليس جزءاً من نوع بيانات الحساب.

في مثال حساب المحفظة، قيمة حقل space هي 0 لأن حقل data يحتوي على 0 بايت من البيانات.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

استرجاع Token Program

يسترجع المثال أدناه Token Program لتوضيح الفرق بين حسابات المحفظة وحسابات البرامج. يُحدِّد Token Program التعليمات الخاصة بالتعامل مع الرموز، كإنشاء الرموز ونقلها. تُستدعى البرامج لمعالجة التعليمات. أما حالة البرنامج، كبيانات الرموز والأرصدة، فتُخزَّن في حسابات منفصلة يمتلكها البرنامج.

عنوان Token Program هو program account على السلسلة. للتبسيط، يمكنك التفكير في عنوان البرنامج باعتباره البرنامج نفسه، لأن هذا هو العنوان المستخدم لاستدعائه. بالنسبة للبرامج القابلة للترقية، يُخزِّن program account البيانات الوصفية ويُشير إلى ProgramData account منفصل يحتوي على الكود التنفيذي المنشور. يمكنك الاطلاع على كود مصدر Token Program و program account على مستكشف سولانا.

Fetch program account
import { address, createClient, fetchJsonParsedAccount } from "@solana/kit";
import { solanaRpc } from "@solana/kit-plugin-rpc";
import { generatedPayer } from "@solana/kit-plugin-signer";
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "https://api.mainnet.solana.com"
})
);
const tokenProgramAddress = address(
"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
);
const accountInfo = await client.rpc
.getAccountInfo(tokenProgramAddress, {
encoding: "base64"
})
.send();
console.log(accountInfo);
const parsedAccount = await fetchJsonParsedAccount(
client.rpc,
tokenProgramAddress
);
console.log(parsedAccount);
Console
Click to execute the code.

Token Program هو program account تنفيذي. تمتلك البرامج نفس الحقول الأساسية لجميع الحسابات، ولكن مع اختلافات جوهرية.

يستخدم مثال Token Program ترميز base64 لإرجاع البيانات الخام لـ program account.

تستعرض الخطوات التالية الحقول داخل value بالترتيب الذي تظهر به.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

يُخزِّن حقل data حالة program account الخاصة بـ BPF Upgradeable Loader. يحتوي العنصر الأول من الصف على بيانات الحساب الكاملة مُرمَّزةً بصيغة base64، فيما يُحدِّد العنصر الثاني طريقة الترميز. تتضمن الـ 36 بايت هنا البيانات الوصفية وعنوان programdata account.

بالنسبة للبرامج القابلة للترقية، تُشير حالة program account إلى programdata account المنفصل الذي يُخزِّن الكود التنفيذي للبرنامج.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

حقل executable مضبوط على true، مما يشير إلى أن عنوان الحساب يمكن استدعاؤه كبرنامج.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

يحتوي حقل lamports على رصيد SOL المحتفظ به في program account. تحتاج program accounts إلى عدد كافٍ من lamport للبقاء معفاة من rent.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

كل program account مملوكة لـ برنامج محمّل. بالنسبة لـ Token Program account، فإن owner هو BPF Upgradeable Loader.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

حقل rentEpoch هو حقل قديم موروث من آلية rent مهجورة. لا يزال الحقل يُعاد للحفاظ على التوافق مع الإصدارات السابقة.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

يُظهر حقل space الحجم الكامل لبيانات program account بالبايت. قيمة space تبلغ 36 بايت فقط، لأن program account تخزّن بيانات وصفية لبرنامج التحميل وعنوان programdata account، وليس البرنامج المُجمَّع الكامل.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

أعاد الاستجابة السابقة حقل data الخاص بـ program account كـ قائمة مرمّزة بـ base64. تُفكّك الاستجابة المُحللة تلك البايتات إلى حقول مسماة في كائن data. يحتوي حقل programData على عنوان programdata account الذي يخزّن كود البرنامج القابل للتنفيذ.

Parsed Token program account
{
executable: true,
lamports: 43712780n,
programAddress: "BPFLoaderUpgradeab1e11111111111111111111111",
space: 36n,
address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
data: {
programData: "3gvYRKWyXRR9xKWe1ZjPhLY5ZJRN7KDB4rFZFGoJfFk2",
parsedAccountMeta: { program: "bpf-upgradeable-loader", type: "program" }
},
exists: true
}

Token Program هو program account تنفيذي. تمتلك البرامج نفس الحقول الأساسية لجميع الحسابات، ولكن مع اختلافات جوهرية.

يستخدم مثال Token Program ترميز base64 لإرجاع البيانات الخام لـ program account.

تستعرض الخطوات التالية الحقول داخل value بالترتيب الذي تظهر به.

يُخزِّن حقل data حالة program account الخاصة بـ BPF Upgradeable Loader. يحتوي العنصر الأول من الصف على بيانات الحساب الكاملة مُرمَّزةً بصيغة base64، فيما يُحدِّد العنصر الثاني طريقة الترميز. تتضمن الـ 36 بايت هنا البيانات الوصفية وعنوان programdata account.

بالنسبة للبرامج القابلة للترقية، تُشير حالة program account إلى programdata account المنفصل الذي يُخزِّن الكود التنفيذي للبرنامج.

حقل executable مضبوط على true، مما يشير إلى أن عنوان الحساب يمكن استدعاؤه كبرنامج.

يحتوي حقل lamports على رصيد SOL المحتفظ به في program account. تحتاج program accounts إلى عدد كافٍ من lamport للبقاء معفاة من rent.

كل program account مملوكة لـ برنامج محمّل. بالنسبة لـ Token Program account، فإن owner هو BPF Upgradeable Loader.

حقل rentEpoch هو حقل قديم موروث من آلية rent مهجورة. لا يزال الحقل يُعاد للحفاظ على التوافق مع الإصدارات السابقة.

يُظهر حقل space الحجم الكامل لبيانات program account بالبايت. قيمة space تبلغ 36 بايت فقط، لأن program account تخزّن بيانات وصفية لبرنامج التحميل وعنوان programdata account، وليس البرنامج المُجمَّع الكامل.

أعاد الاستجابة السابقة حقل data الخاص بـ program account كـ قائمة مرمّزة بـ base64. تُفكّك الاستجابة المُحللة تلك البايتات إلى حقول مسماة في كائن data. يحتوي حقل programData على عنوان programdata account الذي يخزّن كود البرنامج القابل للتنفيذ.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

جلب mint account

الـ mint account هو حساب مملوك للـ Token Program يخزّن البيانات الوصفية العامة لرمز مميز محدد. يخزّن الـ mint account إجمالي المعروض من الرمز المميز، وعدد الخانات العشرية، وصلاحية الإصدار، وصلاحية التجميد. يُعرِّف عنوان الـ mint account بشكل فريد كل رمز مميز على شبكة سولانا.

يجلب المثال أدناه حساب USD Coin Mint لتوضيح كيفية تخزين حالة البرنامج في حساب منفصل. قد تختلف قيم الأرصدة والمعروض تبعاً للـ slot الذي يقرأ منه عقدة RPC الخاصة بك.

Fetch mint account
import { address, createClient } from "@solana/kit";
import { solanaRpc } from "@solana/kit-plugin-rpc";
import { generatedPayer } from "@solana/kit-plugin-signer";
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "https://api.mainnet.solana.com"
})
);
const mintAddress = address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
const accountInfo = await client.rpc
.getAccountInfo(mintAddress, {
encoding: "base64"
})
.send();
console.log(accountInfo);
Console
Click to execute the code.

تخزّن حسابات mint المعروفة بـ mint accounts الحالةَ وليس الشيفرة القابلة للتنفيذ. تخضع mint accounts لملكية الـ Token Program، الذي يتضمن تعليمات تحدد كيفية إنشاء mint accounts وتحديثها.

تستعرض الخطوات التالية الحقول الموجودة داخل value بالترتيب الذي تظهر فيه.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

يحتوي حقل data على حالة حساب Mint المُسلسَلة. يحتوي العنصر الأول في الصف على بيانات الحساب الكاملة البالغة 82 بايت مُرمَّزةً بصيغة base64. أما العنصر الثاني في الصف فيُحدد طريقة الترميز.

لقراءة البيانات من mint account، يجب إلغاء تسلسل حقل data إلى نوع البيانات Mint، وهو ما يظهر في المثال التالي.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

يُشير حقل executable إلى ما إذا كان يمكن استدعاء الحساب كبرنامج. تخزّن mint accounts الحالةَ، لذا فإن حقل executable يكون false.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

يحتوي حقل lamports على رصيد SOL المحتفظ به في الـ mint account. قيمة الـ lamports هي الرصيد المعفي من الإيجار الخاص بالـ mint account، وليست المعروض من الرمز المميز.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

يمتلك Token Program حساب mint account. لا يمكن تعديل حقل data الخاص بـ mint account إلا من خلال تعليمات Token Program.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

حقل rentEpoch هو حقل قديم موروث من آلية rent منتهية الصلاحية. لا يزال هذا الحقل يُعاد للحفاظ على التوافق مع الإصدارات السابقة.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

يُظهر حقل space أن mint account يحتوي على 82 بايت من البيانات.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

تخزّن حسابات mint المعروفة بـ mint accounts الحالةَ وليس الشيفرة القابلة للتنفيذ. تخضع mint accounts لملكية الـ Token Program، الذي يتضمن تعليمات تحدد كيفية إنشاء mint accounts وتحديثها.

تستعرض الخطوات التالية الحقول الموجودة داخل value بالترتيب الذي تظهر فيه.

يحتوي حقل data على حالة حساب Mint المُسلسَلة. يحتوي العنصر الأول في الصف على بيانات الحساب الكاملة البالغة 82 بايت مُرمَّزةً بصيغة base64. أما العنصر الثاني في الصف فيُحدد طريقة الترميز.

لقراءة البيانات من mint account، يجب إلغاء تسلسل حقل data إلى نوع البيانات Mint، وهو ما يظهر في المثال التالي.

يُشير حقل executable إلى ما إذا كان يمكن استدعاء الحساب كبرنامج. تخزّن mint accounts الحالةَ، لذا فإن حقل executable يكون false.

يحتوي حقل lamports على رصيد SOL المحتفظ به في الـ mint account. قيمة الـ lamports هي الرصيد المعفي من الإيجار الخاص بالـ mint account، وليست المعروض من الرمز المميز.

يمتلك Token Program حساب mint account. لا يمكن تعديل حقل data الخاص بـ mint account إلا من خلال تعليمات Token Program.

حقل rentEpoch هو حقل قديم موروث من آلية rent منتهية الصلاحية. لا يزال هذا الحقل يُعاد للحفاظ على التوافق مع الإصدارات السابقة.

يُظهر حقل space أن mint account يحتوي على 82 بايت من البيانات.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

إلغاء تسلسل mint account

تُخزَّن بيانات الحساب في حقل data بصيغة متسلسلة. لقراءة هذه البيانات كحقول مثل supply أو decimals، يجب إلغاء تسلسل حقل data إلى نوع الحساب المُعرَّف بواسطة البرنامج المالك. توفر معظم برامج سولانا مكتبات عميل تحتوي على دوال مساعدة لهذه الخطوة. تُعيد هذه الدوال المساعدة بيانات الحساب بصيغة منظمة، مما يُسهّل التعامل مع النتيجة.

على سبيل المثال، تتضمن مكتبة @solana-program/token الدالة fetchMint() لجلب mint account وإلغاء تسلسل حقل data الخاص بـ mint account إلى نوع البيانات Mint المُعرَّف بواسطة Token Program.

Deserialize mint account data
import { address, createClient } from "@solana/kit";
import { solanaRpc } from "@solana/kit-plugin-rpc";
import { generatedPayer } from "@solana/kit-plugin-signer";
import { fetchMint } from "@solana-program/token";
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "https://api.mainnet.solana.com"
})
);
const mintAddress = address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
const mint = await fetchMint(client.rpc, mintAddress);
console.log(mint);
Console
Click to execute the code.
Mint account type
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 initialized
pub is_initialized: bool,
/// Optional authority to freeze token accounts.
pub freeze_authority: COption<Pubkey>,
}

تجلب الدالة fetchMint() mint account وتُلغي تسلسل حقل data الخاص بـ mint account إلى نوع حساب Mint.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

يمكنك عرض بيانات mint account المفككة بالكامل في مستكشف سولانا.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

يحتوي حقل address على عنوان mint account.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

يحتوي حقل data على حالة حساب Mint المفككة. وتأتي الحقول المتداخلة في data من نوع حساب Mint الخاص بـ Token Program.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

يُظهر حقل data.mintAuthority الحساب الوحيد الذي يملك صلاحية إنشاء وحدات جديدة من الرمز.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

يُظهر حقل supply إجمالي عدد الرموز التي تم سكّها. تُقاس قيمة العرض بأصغر وحدة للرمز. للحصول على إجمالي العرض بالوحدات المعيارية، اضبط قيمة حقل supply وفقاً لـ decimals.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

يُظهر حقل decimals عدد المنازل العشرية للرمز.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

يُشير حقل isInitialized إلى ما إذا كان mint account قد تمت تهيئته. ويُعدّ حقل isInitialized فحصاً أمنياً يُستخدم في Token Program.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

يُظهر حقل data.freezeAuthority الحساب الذي يملك صلاحية تجميد token accounts. إن token account هو حساب منفصل يخزن وحدات من الرمز لصاحبه. عند التجميد، لا يستطيع token account نقل رصيده من الرموز أو حرقها.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

قيمة الحقل executable هي false. يخزّن mint account الخاص بـ USDC حالة الرمز، لذلك لا يمكن استدعاء mint account الخاص بـ USDC كبرنامج.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

يحتوي حقل lamports على رصيد SOL الذي يحتفظ به mint account. قيمة lamports هي رصيد الإعفاء من الإيجار الخاص بـ mint account، وليست إجمالي المعروض من الرموز.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

يُظهر حقل programAddress البرنامج المالك لـ mint account. بالنسبة لـ USDC، البرنامج المالك هو Token Program. فقط البرنامج الذي يملك الحساب يمكنه تعديل حقل data من خلال التعليمات المنشورة للبرنامج.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

يُظهر حقل space حجم بيانات mint account الأصلية بالبايت. حجم حساب Mint الأساسي في Token Program هو 82 بايت.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

تجلب الدالة fetchMint() mint account وتُلغي تسلسل حقل data الخاص بـ mint account إلى نوع حساب Mint.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

يمكنك عرض بيانات mint account المفككة بالكامل في مستكشف سولانا.

يحتوي حقل address على عنوان mint account.

يحتوي حقل data على حالة حساب Mint المفككة. وتأتي الحقول المتداخلة في data من نوع حساب Mint الخاص بـ Token Program.

يُظهر حقل data.mintAuthority الحساب الوحيد الذي يملك صلاحية إنشاء وحدات جديدة من الرمز.

يُظهر حقل supply إجمالي عدد الرموز التي تم سكّها. تُقاس قيمة العرض بأصغر وحدة للرمز. للحصول على إجمالي العرض بالوحدات المعيارية، اضبط قيمة حقل supply وفقاً لـ decimals.

يُظهر حقل decimals عدد المنازل العشرية للرمز.

يُشير حقل isInitialized إلى ما إذا كان mint account قد تمت تهيئته. ويُعدّ حقل isInitialized فحصاً أمنياً يُستخدم في Token Program.

يُظهر حقل data.freezeAuthority الحساب الذي يملك صلاحية تجميد token accounts. إن token account هو حساب منفصل يخزن وحدات من الرمز لصاحبه. عند التجميد، لا يستطيع token account نقل رصيده من الرموز أو حرقها.

قيمة الحقل executable هي false. يخزّن mint account الخاص بـ USDC حالة الرمز، لذلك لا يمكن استدعاء mint account الخاص بـ USDC كبرنامج.

يحتوي حقل lamports على رصيد SOL الذي يحتفظ به mint account. قيمة lamports هي رصيد الإعفاء من الإيجار الخاص بـ mint account، وليست إجمالي المعروض من الرموز.

يُظهر حقل programAddress البرنامج المالك لـ mint account. بالنسبة لـ USDC، البرنامج المالك هو Token Program. فقط البرنامج الذي يملك الحساب يمكنه تعديل حقل data من خلال التعليمات المنشورة للبرنامج.

يُظهر حقل space حجم بيانات mint account الأصلية بالبايت. حجم حساب Mint الأساسي في Token Program هو 82 بايت.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

المخرجات المتسلسلة مقابل غير المتسلسلة

يقرأ كلا المثالين mint account الخاص بـ USDC ذاته. تترك الاستجابة الأولى حقل data متسلسلاً. لقراءة محتويات mint account، يجب فك ترميز تلك البيانات وفق نوع الحساب الذي يحدده البرنامج المالك. بالنسبة لـ mint account، يُعرّف Token Program النوع Mint الظاهر على اليمين.

قبل فك التشفير، يحتوي حقل data على بيانات الحساب المتسلسلة.

Serialized mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

بعد فك تشفير البيانات بوصفها Mint، يحتوي حقل data على حقول الحساب المسمّاة.

Deserialized mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Is this page helpful?

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

تعديل الصفحة