الكتابة على الشبكة

في القسم السابق، تعلّمت كيفية قراءة البيانات من شبكة سولانا عبر جلب الحسابات. تتطلب كتابة البيانات إلى شبكة سولانا معاملة. تحتوي المعاملة على تعليمة واحدة أو أكثر من التعليمات، وكل تعليمة تستدعي برنامجاً.

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

توضّح الأمثلة في هذا القسم كيفية:

  1. نقل SOL بين الحسابات
  2. إنشاء سك رمز مميز جديد

نقل SOL

يقوم المثال أدناه بنقل SOL من حساب إلى آخر. فقط البرنامج المعيّن بوصفه مالكاً للحساب يستطيع تعديل بيانات الحساب أو خصم lamports من رصيده. حسابات المحافظ مملوكة لـ System Program، لذا يتطلب نقل SOL بين حسابات المحافظ تعليمة تستدعي transfer الخاصة بـ System Program. يجب أيضاً أن يوقّع حساب المصدر على المعاملة.

Transfer SOL
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);
Console
Click to execute the code.

أنشئ عميل Kit لـ validator الاختباري المحلي. يضيف هذا المقطع موقّع الدافع، ويتصل بنقطة نهاية RPC المحلية، ويتيح الإسقاطات الجوية، ويموّل الدافع بـ SOL تجريبي للتحويل.

Client setup
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().

Receiver signer
const receiver = await generateKeyPairSigner();

يُنشئ المساعد getTransferSolInstruction() تعليمة System Program. تنقل التعليمة SOL من موقّع source إلى عنوان destination بالمقدار المحدد amount من lamports.

Transfer instruction
const transferInstruction = getTransferSolInstruction({
source: client.payer,
destination: receiver.address,
amount: lamports(10_000_000n)
});

استدعِ client.sendTransaction() مع مصفوفة من التعليمات. يحوّل عميل Kit التعليمات إلى معاملة واحدة، ويوقّع باستخدام الموقّعين المرتبطين بالتعليمات، ويرسل المعاملة، وينتظر التأكيد.

Send transaction
const result = await client.sendTransaction([transferInstruction]);
console.log("Transaction Signature:", result.context.signature);

بعد تأكيد المعاملة، استرجع كلا الرصيدين باستخدام client.rpc.

Fetch balances
const { value: senderBalance } = await client.rpc
.getBalance(client.payer.address)
.send();
const { value: receiverBalance } = await client.rpc
.getBalance(receiver.address)
.send();

أنشئ عميل Kit لـ validator الاختباري المحلي. يضيف هذا المقطع موقّع الدافع، ويتصل بنقطة نهاية RPC المحلية، ويتيح الإسقاطات الجوية، ويموّل الدافع بـ SOL تجريبي للتحويل.

Client setup
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().

Receiver signer
const receiver = await generateKeyPairSigner();

يُنشئ المساعد getTransferSolInstruction() تعليمة System Program. تنقل التعليمة SOL من موقّع source إلى عنوان destination بالمقدار المحدد amount من lamports.

Transfer instruction
const transferInstruction = getTransferSolInstruction({
source: client.payer,
destination: receiver.address,
amount: lamports(10_000_000n)
});

استدعِ client.sendTransaction() مع مصفوفة من التعليمات. يحوّل عميل Kit التعليمات إلى معاملة واحدة، ويوقّع باستخدام الموقّعين المرتبطين بالتعليمات، ويرسل المعاملة، وينتظر التأكيد.

Send transaction
const result = await client.sendTransaction([transferInstruction]);
console.log("Transaction Signature:", result.context.signature);

بعد تأكيد المعاملة، استرجع كلا الرصيدين باستخدام client.rpc.

Fetch balances
const { value: senderBalance } = await client.rpc
.getBalance(client.payer.address)
.send();
const { value: receiverBalance } = await client.rpc
.getBalance(receiver.address)
.send();
Transfer SOL
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)));

إنشاء رمز مميز

يوضح المثال أدناه كيفية إنشاء mint account جديد باستخدام Token Extensions Program. mint account هو الحساب الذي يحدد الإعدادات العامة للرمز المميز، مثل الكسور العشرية، والإمداد، وصلاحية الإصدار، وصلاحية التجميد.

يتطلب إنشاء mint account تعليمتين:

  1. استدعاء System Program لإنشاء حساب جديد مملوك لـ Token Extensions Program.
  2. استدعاء Token Extensions Program لتهيئة ذلك الحساب كـ mint.
Create mint account
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);
Console
Click to execute the code.

أنشئ عميل Kit وموّله، ثم أنشئ موقّعاً لاستخدامه كعنوان لـ mint account الجديد. يموّل دافع العميل إنشاء الحساب ويدفع رسوم المعاملة.

Client and mint setup
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.

Mint account size and rent
const space = BigInt(getMintSize());
const rent = await client.rpc.getMinimumBalanceForRentExemption(space).send();

تستدعي التعليمة الأولى System Program. تستخدم التعليمة payer لتمويل newAccount، وتخصص space لـ mint account، وتنقل الـ lamports المعفاة من rent، وتُسند الملكية إلى programAddress.

Create account instruction
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.

Initialize mint instruction
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 إلى الحساب.

Send transaction
const result = await client.sendTransaction([
createAccountInstruction,
initializeMintInstruction
]);

بعد تأكيد المعاملة، قم بجلب mint account.

Fetch mint account
const mintAccount = await fetchMint(client.rpc, mint.address);
console.log("Mint Account:", mintAccount);

أنشئ عميل Kit وموّله، ثم أنشئ موقّعاً لاستخدامه كعنوان لـ mint account الجديد. يموّل دافع العميل إنشاء الحساب ويدفع رسوم المعاملة.

Client and mint setup
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.

Mint account size and rent
const space = BigInt(getMintSize());
const rent = await client.rpc.getMinimumBalanceForRentExemption(space).send();

تستدعي التعليمة الأولى System Program. تستخدم التعليمة payer لتمويل newAccount، وتخصص space لـ mint account، وتنقل الـ lamports المعفاة من rent، وتُسند الملكية إلى programAddress.

Create account instruction
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.

Initialize mint instruction
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 إلى الحساب.

Send transaction
const result = await client.sendTransaction([
createAccountInstruction,
initializeMintInstruction
]);

بعد تأكيد المعاملة، قم بجلب mint account.

Fetch mint account
const mintAccount = await fetchMint(client.rpc, mint.address);
console.log("Mint Account:", mintAccount);
Create mint account
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();

Is this page helpful?

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

تعديل الصفحة