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

في القسم السابق، تعلمت كيفية قراءة البيانات من شبكة سولانا. الآن ستتعلم كيفية الكتابة عليها. تتضمن الكتابة على شبكة سولانا إرسال معاملات تحتوي على تعليمة واحدة أو أكثر.

تحدد البرامج المنطق التجاري لما تفعله كل تعليمة. عندما تقدم معاملة، يقوم نظام تشغيل سولانا بتنفيذ كل تعليمة بالتسلسل وبشكل ذري. توضح الأمثلة في هذا القسم كيفية بناء وإرسال المعاملات لاستدعاء برامج سولانا، وتشمل:

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

تحويل SOL

المثال أدناه يقوم بتحويل SOL بين حسابين. كل حساب له برنامج مالك، وهو البرنامج الوحيد الذي يمكنه خصم رصيد SOL من الحساب.

جميع حسابات المحفظة مملوكة من قبل System Program. لتحويل SOL، يجب عليك استدعاء تعليمة transfer الخاصة بـ System Program.

Transfer SOL
import {
LAMPORTS_PER_SOL,
SystemProgram,
Transaction,
sendAndConfirmTransaction,
Keypair,
Connection
} from "@solana/web3.js";
const connection = new Connection("http://localhost:8899", "confirmed");
const sender = new Keypair();
const receiver = new Keypair();
const signature = await connection.requestAirdrop(
sender.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");
const transferInstruction = SystemProgram.transfer({
fromPubkey: sender.publicKey,
toPubkey: receiver.publicKey,
lamports: 0.01 * LAMPORTS_PER_SOL
});
const transaction = new Transaction().add(transferInstruction);
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[sender]
);
console.log("Transaction Signature:", `${transactionSignature}`);
const senderBalance = await connection.getBalance(sender.publicKey);
const receiverBalance = await connection.getBalance(receiver.publicKey);
console.log("Sender Balance:", `${senderBalance}`);
console.log("Receiver Balance:", `${receiverBalance}`);
Console
Click to execute the code.

إنشاء Connection للتعامل مع إرسال المعاملات وجلب بيانات الحساب.

في هذا المثال، نحن نتصل بـ validator الاختبار المحلي الذي يعمل على localhost:8899.

Connection
const connection = new Connection("http://localhost:8899", "confirmed");

إنشاء أزواج مفاتيح جديدة لاستخدامها كحسابات المرسل والمستلم.

Generate keypairs
const sender = new Keypair();
const receiver = new Keypair();

إضافة SOL إلى حساب المرسل. على الشبكات غير الشبكة الرئيسية، يمكنك استخدام طريقة requestAirdrop للحصول على SOL للاختبار.

Airdrop
const signature = await connection.requestAirdrop(
sender.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");

طريقة SystemProgram.transfer() تنشئ تعليمة تقوم بتحويل SOL من حساب fromPubkey إلى حساب toPubkey للعدد المحدد من lamports.

Transfer instruction
const transferInstruction = SystemProgram.transfer({
fromPubkey: sender.publicKey,
toPubkey: receiver.publicKey,
lamports: 0.01 * LAMPORTS_PER_SOL
});

إنشاء معاملة وإضافة التعليمات إلى المعاملة. في هذا المثال، نقوم بإنشاء معاملة بتعليمة واحدة. ومع ذلك، يمكنك إضافة تعليمات متعددة إلى معاملة واحدة.

Transaction
const transaction = new Transaction().add(transferInstruction);

قم بتوقيع وإرسال المعاملة إلى الشبكة. يجب توفير keypair المرسل في مصفوفة الموقعين للتصريح بتحويل SOL من حسابه.

Send transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[sender]
);

توقيع المعاملة هو معرف فريد يمكن استخدامه للبحث عن المعاملة على مستكشف سولانا.

إنشاء Connection للتعامل مع إرسال المعاملات وجلب بيانات الحساب.

في هذا المثال، نحن نتصل بـ validator الاختبار المحلي الذي يعمل على localhost:8899.

Connection
const connection = new Connection("http://localhost:8899", "confirmed");

إنشاء أزواج مفاتيح جديدة لاستخدامها كحسابات المرسل والمستلم.

Generate keypairs
const sender = new Keypair();
const receiver = new Keypair();

إضافة SOL إلى حساب المرسل. على الشبكات غير الشبكة الرئيسية، يمكنك استخدام طريقة requestAirdrop للحصول على SOL للاختبار.

Airdrop
const signature = await connection.requestAirdrop(
sender.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");

طريقة SystemProgram.transfer() تنشئ تعليمة تقوم بتحويل SOL من حساب fromPubkey إلى حساب toPubkey للعدد المحدد من lamports.

Transfer instruction
const transferInstruction = SystemProgram.transfer({
fromPubkey: sender.publicKey,
toPubkey: receiver.publicKey,
lamports: 0.01 * LAMPORTS_PER_SOL
});

إنشاء معاملة وإضافة التعليمات إلى المعاملة. في هذا المثال، نقوم بإنشاء معاملة بتعليمة واحدة. ومع ذلك، يمكنك إضافة تعليمات متعددة إلى معاملة واحدة.

Transaction
const transaction = new Transaction().add(transferInstruction);

قم بتوقيع وإرسال المعاملة إلى الشبكة. يجب توفير keypair المرسل في مصفوفة الموقعين للتصريح بتحويل SOL من حسابه.

Send transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[sender]
);

توقيع المعاملة هو معرف فريد يمكن استخدامه للبحث عن المعاملة على مستكشف سولانا.

Transfer SOL
import {
LAMPORTS_PER_SOL,
SystemProgram,
Transaction,
sendAndConfirmTransaction,
Keypair,
Connection
} from "@solana/web3.js";
const connection = new Connection("http://localhost:8899", "confirmed");

إنشاء رمز

المثال أدناه ينشئ رمزًا جديدًا على سولانا باستخدام Token Extensions Program. يتطلب ذلك تعليمتين:

  1. استدعاء System Program لإنشاء حساب جديد.
  2. استدعاء Token Extensions Program لتهيئة ذلك الحساب كـ Mint.
Create mint account
import {
Connection,
Keypair,
SystemProgram,
Transaction,
sendAndConfirmTransaction,
LAMPORTS_PER_SOL
} from "@solana/web3.js";
import {
MINT_SIZE,
TOKEN_2022_PROGRAM_ID,
createInitializeMint2Instruction,
getMinimumBalanceForRentExemptMint,
getMint
} from "@solana/spl-token";
const connection = new Connection("http://localhost:8899", "confirmed");
const wallet = new Keypair();
// Fund the wallet with SOL
const signature = await connection.requestAirdrop(
wallet.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");
// Generate keypair to use as address of mint account
const mint = new Keypair();
// Calculate lamports required for rent exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);
// Instruction to create new account with space for new mint account
const createAccountInstruction = SystemProgram.createAccount({
fromPubkey: wallet.publicKey,
newAccountPubkey: mint.publicKey,
space: MINT_SIZE,
lamports: rentExemptionLamports,
programId: TOKEN_2022_PROGRAM_ID
});
// Instruction to initialize mint account
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2, // decimals
wallet.publicKey, // mint authority
wallet.publicKey, // freeze authority
TOKEN_2022_PROGRAM_ID
);
// Build transaction with instructions to create new account and initialize mint account
const transaction = new Transaction().add(
createAccountInstruction,
initializeMintInstruction
);
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet, // payer
mint // mint address keypair
]
);
console.log("Transaction Signature:", `${transactionSignature}`);
const mintData = await getMint(
connection,
mint.publicKey,
"confirmed",
TOKEN_2022_PROGRAM_ID
);
);
Console
Click to execute the code.

إنشاء رمز يتطلب استخدام كل من مكتبتي @solana/web3.js و @solana/spl-token. سيقوم الكود في المثال أدناه بما يلي:

  • إنشاء اتصال
  • توليد زوج مفاتيح لدفع تكلفة المعاملة
  • طلب إسقاط جوي لتمويل زوج المفاتيح
Connection & wallet setup
const connection = new Connection("http://localhost:8899", "confirmed");
const wallet = new Keypair();
const signature = await connection.requestAirdrop(
wallet.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");

توليد زوج مفاتيح لحساب mint. سيتم استخدام المفتاح العام كعنوان لحساب mint.

Mint keypair
const mint = new Keypair();

حساب الحد الأدنى من وحدات lamport المطلوبة لحساب mint. تقوم وظيفة getMinimumBalanceForRentExemptMint بحساب عدد وحدات lamport التي يجب تخصيصها للبيانات في حساب mint.

Rent exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

التعليمة الأولى تستدعي تعليمة createAccount الخاصة بـ System Program لـ:

  1. تخصيص عدد البايتات اللازمة لتخزين بيانات العملة.
  2. تحويل لامبورتس من المحفظة لتمويل الحساب الجديد.
  3. تعيين ملكية الحساب إلى برنامج Token Extensions.
Create account instruction
const createAccountInstruction = SystemProgram.createAccount({
fromPubkey: wallet.publicKey,
newAccountPubkey: mint.publicKey,
space: MINT_SIZE,
lamports: rentExemptionLamports,
programId: TOKEN_2022_PROGRAM_ID
});

التعليمة الثانية تستدعي تعليمة createInitializeMint2Instruction الخاصة بـ Token Extensions Program لتهيئة حساب العملة بالبيانات التالية:

  • منزلتان عشريتان
  • المحفظة كسلطة إصدار وسلطة تجميد
Initialize mint instruction
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2,
wallet.publicKey,
wallet.publicKey,
TOKEN_2022_PROGRAM_ID
);

أضف كلتا التعليمتين إلى معاملة واحدة. هذا يضمن أن إنشاء الحساب وتهيئته يحدثان بشكل ذري. (إما أن تنجح كلتا التعليمتين، أو لا تنجح أي منهما.)

هذا النهج شائع عند بناء معاملات سولانا المعقدة، حيث يضمن تنفيذ جميع التعليمات معًا.

Transaction
const transaction = new Transaction().add(
createAccountInstruction,
initializeMintInstruction
);

قم بتوقيع وإرسال المعاملة. مطلوب توقيعان:

  • حساب المحفظة يوقع كدافع لـ رسوم المعاملة وإنشاء الحساب
  • حساب العملة يوقع للتصريح باستخدام عنوانه للحساب الجديد
Send transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet,
mint
]
);

يمكن استخدام توقيع المعاملة المُرجع لفحص المعاملة على مستكشف سولانا.

إنشاء رمز يتطلب استخدام كل من مكتبتي @solana/web3.js و @solana/spl-token. سيقوم الكود في المثال أدناه بما يلي:

  • إنشاء اتصال
  • توليد زوج مفاتيح لدفع تكلفة المعاملة
  • طلب إسقاط جوي لتمويل زوج المفاتيح
Connection & wallet setup
const connection = new Connection("http://localhost:8899", "confirmed");
const wallet = new Keypair();
const signature = await connection.requestAirdrop(
wallet.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");

توليد زوج مفاتيح لحساب mint. سيتم استخدام المفتاح العام كعنوان لحساب mint.

Mint keypair
const mint = new Keypair();

حساب الحد الأدنى من وحدات lamport المطلوبة لحساب mint. تقوم وظيفة getMinimumBalanceForRentExemptMint بحساب عدد وحدات lamport التي يجب تخصيصها للبيانات في حساب mint.

Rent exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

التعليمة الأولى تستدعي تعليمة createAccount الخاصة بـ System Program لـ:

  1. تخصيص عدد البايتات اللازمة لتخزين بيانات العملة.
  2. تحويل لامبورتس من المحفظة لتمويل الحساب الجديد.
  3. تعيين ملكية الحساب إلى برنامج Token Extensions.
Create account instruction
const createAccountInstruction = SystemProgram.createAccount({
fromPubkey: wallet.publicKey,
newAccountPubkey: mint.publicKey,
space: MINT_SIZE,
lamports: rentExemptionLamports,
programId: TOKEN_2022_PROGRAM_ID
});

التعليمة الثانية تستدعي تعليمة createInitializeMint2Instruction الخاصة بـ Token Extensions Program لتهيئة حساب العملة بالبيانات التالية:

  • منزلتان عشريتان
  • المحفظة كسلطة إصدار وسلطة تجميد
Initialize mint instruction
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2,
wallet.publicKey,
wallet.publicKey,
TOKEN_2022_PROGRAM_ID
);

أضف كلتا التعليمتين إلى معاملة واحدة. هذا يضمن أن إنشاء الحساب وتهيئته يحدثان بشكل ذري. (إما أن تنجح كلتا التعليمتين، أو لا تنجح أي منهما.)

هذا النهج شائع عند بناء معاملات سولانا المعقدة، حيث يضمن تنفيذ جميع التعليمات معًا.

Transaction
const transaction = new Transaction().add(
createAccountInstruction,
initializeMintInstruction
);

قم بتوقيع وإرسال المعاملة. مطلوب توقيعان:

  • حساب المحفظة يوقع كدافع لـ رسوم المعاملة وإنشاء الحساب
  • حساب العملة يوقع للتصريح باستخدام عنوانه للحساب الجديد
Send transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet,
mint
]
);

يمكن استخدام توقيع المعاملة المُرجع لفحص المعاملة على مستكشف سولانا.

Create mint account
import {
Connection,
Keypair,
SystemProgram,
Transaction,
sendAndConfirmTransaction,
LAMPORTS_PER_SOL
} from "@solana/web3.js";
import {
MINT_SIZE,
TOKEN_2022_PROGRAM_ID,
createInitializeMint2Instruction,
getMinimumBalanceForRentExemptMint,
getMint
} from "@solana/spl-token";
const connection = new Connection("http://localhost:8899", "confirmed");
const wallet = new Keypair();
const signature = await connection.requestAirdrop(
wallet.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");

Is this page helpful?

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

تعديل الصفحة

تدار بواسطة

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