في القسم السابق، تعلّمت كيفية قراءة البيانات من شبكة سولانا عبر جلب الحسابات. تتطلب كتابة البيانات إلى شبكة سولانا معاملة. تحتوي المعاملة على تعليمة واحدة أو أكثر من التعليمات، وكل تعليمة تستدعي برنامجاً.
تحدد البرامج منطق الأعمال لكل تعليمة. عند إرسال معاملة، يُنفّذ وقت تشغيل سولانا تعليمات المعاملة بالترتيب. المعاملات ذرية. إما أن تنجح كل تعليمة في المعاملة، أو تفشل المعاملة بأكملها.
توضّح الأمثلة في هذا القسم كيفية:
- نقل SOL بين الحسابات
- إنشاء سك رمز مميز جديد
نقل SOL
يقوم المثال أدناه بنقل SOL من حساب إلى آخر. فقط البرنامج المعيّن بوصفه مالكاً للحساب يستطيع تعديل بيانات الحساب أو خصم lamports من رصيده. حسابات المحافظ مملوكة لـ System Program، لذا يتطلب نقل SOL بين حسابات المحافظ تعليمة تستدعي transfer الخاصة بـ System Program. يجب أيضاً أن يوقّع حساب المصدر على المعاملة.
import { createClient, generateKeyPairSigner, lamports } from "@solana/kit";import { solanaRpc, rpcAirdrop } from "@solana/kit-plugin-rpc";import { generatedPayer, airdropPayer } from "@solana/kit-plugin-signer";import { getTransferSolInstruction } from "@solana-program/system";const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "http://localhost:8899",rpcSubscriptionsUrl: "ws://localhost:8900"})).use(rpcAirdrop()).use(airdropPayer(lamports(1_000_000_000n)));const receiver = await generateKeyPairSigner();const transferInstruction = getTransferSolInstruction({source: client.payer,destination: receiver.address,amount: lamports(10_000_000n)});const result = await client.sendTransaction([transferInstruction]);console.log("Transaction Signature:", result.context.signature);const { value: senderBalance } = await client.rpc.getBalance(client.payer.address).send();const { value: receiverBalance } = await client.rpc.getBalance(receiver.address).send();console.log("Sender Balance:", senderBalance);console.log("Receiver Balance:", receiverBalance);
أنشئ عميل Kit لـ validator الاختباري المحلي. يضيف هذا المقطع موقّع الدافع، ويتصل بنقطة نهاية RPC المحلية، ويتيح الإسقاطات الجوية، ويموّل الدافع بـ SOL تجريبي للتحويل.
const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "http://localhost:8899",rpcSubscriptionsUrl: "ws://localhost:8900"})).use(rpcAirdrop()).use(airdropPayer(lamports(1_000_000_000n)));
أنشئ موقّعاً للمستلم. المُرسِل هو client.payer، الذي تم إنشاؤه بواسطة
generatedPayer() وتموّل بواسطة airdropPayer().
const receiver = await generateKeyPairSigner();
يُنشئ المساعد getTransferSolInstruction() تعليمة System Program. تنقل التعليمة
SOL من موقّع source إلى عنوان
destination بالمقدار المحدد amount
من lamports.
const transferInstruction = getTransferSolInstruction({source: client.payer,destination: receiver.address,amount: lamports(10_000_000n)});
استدعِ client.sendTransaction() مع مصفوفة من التعليمات. يحوّل عميل Kit
التعليمات إلى معاملة واحدة، ويوقّع باستخدام الموقّعين المرتبطين بالتعليمات،
ويرسل المعاملة، وينتظر التأكيد.
const result = await client.sendTransaction([transferInstruction]);console.log("Transaction Signature:", result.context.signature);
بعد تأكيد المعاملة، استرجع كلا الرصيدين باستخدام client.rpc.
const { value: senderBalance } = await client.rpc.getBalance(client.payer.address).send();const { value: receiverBalance } = await client.rpc.getBalance(receiver.address).send();
إنشاء رمز مميز
يوضح المثال أدناه كيفية إنشاء mint account جديد باستخدام Token Extensions Program. mint account هو الحساب الذي يحدد الإعدادات العامة للرمز المميز، مثل الكسور العشرية، والإمداد، وصلاحية الإصدار، وصلاحية التجميد.
يتطلب إنشاء mint account تعليمتين:
- استدعاء System Program لإنشاء حساب جديد مملوك لـ Token Extensions Program.
- استدعاء Token Extensions Program لتهيئة ذلك الحساب كـ mint.
import { createClient, generateKeyPairSigner, lamports } from "@solana/kit";import { solanaRpc, rpcAirdrop } from "@solana/kit-plugin-rpc";import { generatedPayer, airdropPayer } from "@solana/kit-plugin-signer";import { getCreateAccountInstruction } from "@solana-program/system";import {fetchMint,getInitializeMintInstruction,getMintSize,TOKEN_2022_PROGRAM_ADDRESS} from "@solana-program/token-2022";const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "http://localhost:8899",rpcSubscriptionsUrl: "ws://localhost:8900"})).use(rpcAirdrop()).use(airdropPayer(lamports(1_000_000_000n)));const mint = await generateKeyPairSigner();const space = BigInt(getMintSize());const rent = await client.rpc.getMinimumBalanceForRentExemption(space).send();const createAccountInstruction = getCreateAccountInstruction({payer: client.payer,newAccount: mint,space,lamports: rent,programAddress: TOKEN_2022_PROGRAM_ADDRESS});const initializeMintInstruction = getInitializeMintInstruction({mint: mint.address,decimals: 2,mintAuthority: client.payer.address,freezeAuthority: client.payer.address,tokenProgram: TOKEN_2022_PROGRAM_ADDRESS});const result = await client.sendTransaction([createAccountInstruction,initializeMintInstruction]);console.log("Mint Address:", mint.address);console.log("Transaction Signature:", result.context.signature);const mintAccount = await fetchMint(client.rpc, mint.address);console.log("Mint Account:", mintAccount);
أنشئ عميل Kit وموّله، ثم أنشئ موقّعاً لاستخدامه كعنوان لـ mint account الجديد. يموّل دافع العميل إنشاء الحساب ويدفع رسوم المعاملة.
const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "http://localhost:8899",rpcSubscriptionsUrl: "ws://localhost:8900"})).use(rpcAirdrop()).use(airdropPayer(lamports(1_000_000_000n)));const mint = await generateKeyPairSigner();
احسب حجم mint account بالبايت، ثم أرسل طلب RPC لحساب الـ lamports المطلوبة لتخزين تلك البيانات في الحساب. يُشار إلى هذا الرصيد المطلوب بـ rent.
const space = BigInt(getMintSize());const rent = await client.rpc.getMinimumBalanceForRentExemption(space).send();
تستدعي التعليمة الأولى System Program. تستخدم التعليمة payer
لتمويل newAccount، وتخصص space لـ
mint account، وتنقل الـ lamports المعفاة من rent، وتُسند
الملكية إلى programAddress.
const createAccountInstruction = getCreateAccountInstruction({payer: client.payer,newAccount: mint,space,lamports: rent,programAddress: TOKEN_2022_PROGRAM_ADDRESS});
تستدعي التعليمة الثانية Token Extensions Program. تُهيئ التعليمة عنوان
mint بقيمة decimals،
وmintAuthority،
وfreezeAuthority، وتحدد
tokenProgram المالك لـ mint account.
const initializeMintInstruction = getInitializeMintInstruction({mint: mint.address,decimals: 2,mintAuthority: client.payer.address,freezeAuthority: client.payer.address,tokenProgram: TOKEN_2022_PROGRAM_ADDRESS});
أرسل كلتا التعليمتين في معاملة واحدة. يجب أن تأتي تعليمة إنشاء الحساب قبل تعليمة تهيئة mint account، لأن mint account يجب أن يكون موجودًا قبل أن يتمكن Token Extensions Program من كتابة بيانات الـ mint إلى الحساب.
const result = await client.sendTransaction([createAccountInstruction,initializeMintInstruction]);
بعد تأكيد المعاملة، قم بجلب mint account.
const mintAccount = await fetchMint(client.rpc, mint.address);console.log("Mint Account:", mintAccount);
Is this page helpful?