الكتابة إلى الشبكة
في القسم السابق، تعلمت كيفية قراءة البيانات من شبكة Solana. الآن استكشف كيفية كتابة البيانات إليها. تتضمن الكتابة إلى شبكة Solana إرسال معاملات تحتوي على تعليمة واحدة أو أكثر.
تقوم البرامج (العقود الذكية) بمعالجة هذه التعليمات وفقًا لمنطق الأعمال الخاص بها لكل تعليمة على حدة. عندما تقدم معاملة، يقوم نظام تشغيل Solana بتنفيذ كل تعليمة بالتسلسل وبشكل ذري (مما يعني إما أن تنجح جميع التعليمات أو تفشل المعاملة بأكملها).
في هذا القسم، سترى مثالين أساسيين:
- تحويل SOL بين الحسابات
- إنشاء رمز جديد
توضح هذه الأمثلة كيفية بناء وإرسال المعاملات لاستدعاء برامج Solana. لمزيد من التفاصيل، راجع صفحات المعاملات والتعليمات و الرسوم على Solana.
تحويل SOL
في هذا المثال، ستتعلم كيفية تحويل SOL بين حسابين.
على Solana، يمتلك كل حساب برنامجًا محددًا كمالك له. فقط البرنامج المالك يمكنه خصم رصيد SOL (lamport) من الحساب.
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}`);
هذه هي خطوات بناء المعاملات للتفاعل مع أي برنامج على Solana.
إنشاء التعليمات التي تريد استدعاءها.
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] // signer keypair);
إنشاء رمز
في هذا المثال، ستتعلم كيفية إنشاء رمز جديد على Solana باستخدام Token Extensions Program. يتطلب ذلك تعليمتين:
- استدعاء برنامج النظام لإنشاء حساب جديد.
- استدعاء Token Extensions Program لتهيئة هذا الحساب كمنشئ للرمز.
import {Connection,Keypair,SystemProgram,Transaction,sendAndConfirmTransaction,LAMPORTS_PER_SOL} from "@solana/web3.js";import {MINT_SIZE,TOKEN_2022_PROGRAM_ID,createInitializeMint2Instruction,getMinimumBalanceForRentExemptMint} 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("Mint Account:", `${mint.publicKey}`);console.log("Transaction Signature:", `${transactionSignature}`);
إليك تفصيلاً خطوة بخطوة لما يقوم به المثال:
إنشاء اتصال وتمويل المحفظة
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
const mint = new Keypair();
حساب الحد الأدنى من lamports للإعفاء من rent
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
إنشاء تعليمات لإنشاء حساب جديد
- تخصيص المساحة المطلوبة لتخزين بيانات mint
- تحويل lamports من المحفظة لتمويل الحساب الجديد
- تعيين ملكية الحساب إلى برنامج 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});
إنشاء تعليمات لتهيئة حساب Mint
const initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2, // decimalswallet.publicKey, // mint authoritywallet.publicKey, // freeze authorityTOKEN_2022_PROGRAM_ID);
إضافة كلا التعليمات إلى معاملة واحدة
const transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);
إرسال وتأكيد المعاملة مع كلا الموقعين المطلوبين
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet, mint]);
طباعة حساب Mint وتوقيع المعاملة
console.log("Mint Account:", `${mint.publicKey}`);console.log("Transaction Signature:", `${transactionSignature}`);
من خلال دمج كلا التعليمات في معاملة واحدة، فإنك تضمن أن إنشاء الحساب وتهيئته يحدثان بشكل ذري. إما أن تنجح كلتا التعليمتين، أو لا تنجح أي منهما. هذا النهج شائع عند بناء معاملات سولانا أكثر تعقيدًا، حيث يضمن تنفيذ جميع التعليمات معًا.
Is this page helpful?