الكتابة إلى الشبكة
في القسم السابق، تعلمت كيفية قراءة البيانات من شبكة سولانا. الآن ستتعلم كيفية كتابة البيانات إليها. تتضمن الكتابة إلى شبكة سولانا إرسال معاملات تحتوي على تعليمة واحدة أو أكثر.
تحدد البرامج (العقود الذكية) المنطق التجاري لما تفعله كل تعليمة. عندما تقدم معاملة، ينفذ نظام تشغيل سولانا كل تعليمة بالتسلسل وبشكل ذري (مما يعني إما أن تنجح جميع التعليمات أو تفشل المعاملة بأكملها).
يغطي هذا القسم الأمثلة التالية:
- تحويل SOL بين الحسابات
- إنشاء رمز جديد
توضح هذه الأمثلة كيفية بناء وإرسال المعاملات لاستدعاء برامج سولانا. لمزيد من التفاصيل، راجع صفحات المعاملات والتعليمات و الرسوم على سولانا.
تحويل SOL
في هذا المثال، ستتعلم كيفية تحويل SOL بين حسابين.
في سولانا، يمتلك كل حساب برنامجًا محددًا كمالك له. فقط البرنامج المالك يمكنه خصم رصيد SOL (لامبورت) للحساب.
System Program هو المالك لجميع حسابات "المحفظة". لتحويل SOL، يجب عليك استدعاء تعليمة transfer الخاصة بـ System Program.
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}`);
إنشاء Connection
للتعامل مع إرسال المعاملات وجلب بيانات الحساب.
في هذا المثال، نقوم بالاتصال بمصادق الاختبار المحلي الذي يعمل على
localhost:8899
.
const connection = new Connection("http://localhost:8899", "confirmed");
توليد أزواج مفاتيح جديدة لاستخدامها كحسابات المرسل والمستلم.
يتضمن Keypair
ما يلي:
- مفتاح عام يعمل كعنوان الحساب
- مفتاح خاص يستخدم لتوقيع المعاملات
const sender = new Keypair();const receiver = new Keypair();
قبل أن نتمكن من تحويل SOL، يجب أن يكون لدى حساب المرسل بعض رصيد SOL.
على الشبكات غير الشبكة الرئيسية، يمكنك استخدام طريقة requestAirdrop
للحصول على
SOL للاختبار.
const signature = await connection.requestAirdrop(sender.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");
تقوم طريقة SystemProgram.transfer()
بإنشاء تعليمات تحول عملة SOL من حساب
fromPubkey
إلى حساب toPubkey
بمقدار
lamports
المحدد.
const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: receiver.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});
قم بإنشاء معاملة وإضافة التعليمات إلى المعاملة.
في هذا المثال، نقوم بإنشاء معاملة بتعليمات واحدة. ومع ذلك، يمكنك إضافة تعليمات متعددة إلى معاملة واحدة.
const transaction = new Transaction().add(transferInstruction);
قم بتوقيع وإرسال المعاملة إلى الشبكة.
يلزم وجود keypair المرسل في مصفوفة الموقعين للتصريح بتحويل عملة SOL من حسابهم.
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[sender]);
توقيع المعاملة هو معرف فريد يمكن استخدامه للبحث عن المعاملة في مستكشف سولانا.
إنشاء رمز
في هذا المثال، ستتعلم كيفية إنشاء رمز جديد على سولانا باستخدام برنامج Token Extensions. يتطلب ذلك تعليمتين:
- استدعاء System Program لإنشاء حساب جديد.
- استدعاء برنامج Token Extensions لتهيئة هذا الحساب كعملية سك.
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 SOLconst signature = await connection.requestAirdrop(wallet.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");// Generate keypair to use as address of mint accountconst mint = new Keypair();// Calculate lamports required for rent exemptionconst rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);// Instruction to create new account with space for new mint accountconst createAccountInstruction = SystemProgram.createAccount({fromPubkey: wallet.publicKey,newAccountPubkey: mint.publicKey,space: MINT_SIZE,lamports: rentExemptionLamports,programId: TOKEN_2022_PROGRAM_ID});// Instruction to initialize mint accountconst initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2, // decimalswallet.publicKey, // mint authoritywallet.publicKey, // freeze authorityTOKEN_2022_PROGRAM_ID);// Build transaction with instructions to create new account and initialize mint accountconst transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet, // payermint // mint address keypair]);console.log("Transaction Signature:", `${transactionSignature}`);const mintData = await getMint(connection,mint.publicKey,"confirmed",TOKEN_2022_PROGRAM_ID););
إنشاء رمز على سولانا يتطلب استخدام كل من مكتبتي @solana/web3.js
و
@solana/spl-token
.
- إنشاء اتصال
- إنشاء keypair للدفع مقابل المعاملة
- طلب إيداع جوي لتمويل الـ keypair
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");
قم بإنشاء keypair لحساب mint account.
سيتم استخدام المفتاح العام لهذا الـ keypair كعنوان لحساب الـ mint account.
const mint = new Keypair();
احسب الحد الأدنى من lamport المطلوب لحساب mint account.
تقوم وظيفة getMinimumBalanceForRentExemptMint
بحساب المقدار الدقيق من SOL
(بوحدة lamport) الذي يجب تخصيصه للبيانات على حساب mint account.
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
التعليمة الأولى تستدعي تعليمة createAccount
من System Program لـ:
- تخصيص البايتات المطلوبة لتخزين بيانات mint account
- تحويل وحدات lamport من المحفظة لتمويل الحساب الجديد
- تعيين ملكية الحساب إلى برنامج Token Extensions
(
TOKEN_2022_PROGRAM_ID
)
const createAccountInstruction = SystemProgram.createAccount({fromPubkey: wallet.publicKey,newAccountPubkey: mint.publicKey,space: MINT_SIZE,lamports: rentExemptionLamports,programId: TOKEN_2022_PROGRAM_ID});
التعليمة الثانية تستدعي تعليمة createInitializeMint2Instruction
من
Token Extensions Program لتهيئة حساب mint account بالبيانات
التالية:
- خانتان عشريتان
- المحفظة كسلطة إصدار وسلطة تجميد
const initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2,wallet.publicKey,wallet.publicKey,TOKEN_2022_PROGRAM_ID);
أضف كلا التعليمات إلى معاملة واحدة.
من خلال دمج كلا التعليمات في معاملة واحدة، فإنك تضمن أن إنشاء الحساب وتهيئته يحدثان بشكل ذري. إما أن تنجح كلتا التعليمتين، أو لا تنجح أي منهما.
هذا النهج شائع عند بناء معاملات سولانا أكثر تعقيدًا، حيث يضمن تنفيذ جميع التعليمات معًا.
const transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);
قم بالتوقيع وإرسال المعاملة. مطلوب توقيعان:
- المحفظة توقع كدافع لرسوم المعاملة وإنشاء الحساب
- العملة توقع للتصريح باستخدام عنوانها للحساب الجديد
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet,mint]);
يمكن استخدام توقيع المعاملة المُرجع لفحص المعاملة على مستكشف سولانا.
Is this page helpful?