الكتابة على الشبكة
في القسم السابق، تعلمت كيفية قراءة البيانات من شبكة سولانا. الآن ستتعلم كيفية الكتابة عليها. تتضمن الكتابة على شبكة سولانا إرسال معاملات تحتوي على تعليمة واحدة أو أكثر.
تحدد البرامج المنطق التجاري لما تفعله كل تعليمة. عندما تقدم معاملة، يقوم نظام تشغيل سولانا بتنفيذ كل تعليمة بالتسلسل وبشكل ذري. توضح الأمثلة في هذا القسم كيفية بناء وإرسال المعاملات لاستدعاء برامج سولانا، وتشمل:
- تحويل 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 للتعامل مع إرسال المعاملات وجلب بيانات الحساب.
في هذا المثال، نحن نتصل بـ validator الاختبار المحلي الذي يعمل على
localhost:8899.
const connection = new Connection("http://localhost:8899", "confirmed");
إنشاء أزواج مفاتيح جديدة لاستخدامها كحسابات المرسل والمستلم.
const sender = new Keypair();const receiver = new Keypair();
إضافة 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 Program. يتطلب ذلك تعليمتين:
- استدعاء System Program لإنشاء حساب جديد.
- استدعاء Token Extensions Program لتهيئة ذلك الحساب كـ Mint.
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.
سيقوم الكود في المثال أدناه بما يلي:
- إنشاء اتصال
- توليد زوج مفاتيح لدفع تكلفة المعاملة
- طلب إسقاط جوي لتمويل زوج المفاتيح
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.
const mint = new Keypair();
حساب الحد الأدنى من وحدات lamport المطلوبة لحساب mint. تقوم وظيفة
getMinimumBalanceForRentExemptMint بحساب عدد وحدات lamport التي يجب تخصيصها
للبيانات في حساب mint.
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
التعليمة الأولى تستدعي تعليمة createAccount الخاصة بـ System Program لـ:
- تخصيص عدد البايتات اللازمة لتخزين بيانات العملة.
- تحويل لامبورتس من المحفظة لتمويل الحساب الجديد.
- تعيين ملكية الحساب إلى برنامج Token Extensions.
const createAccountInstruction = SystemProgram.createAccount({fromPubkey: wallet.publicKey,newAccountPubkey: mint.publicKey,space: MINT_SIZE,lamports: rentExemptionLamports,programId: TOKEN_2022_PROGRAM_ID});
التعليمة الثانية تستدعي تعليمة createInitializeMint2Instruction الخاصة بـ
Token Extensions Program لتهيئة حساب العملة بالبيانات
التالية:
- منزلتان عشريتان
- المحفظة كسلطة إصدار وسلطة تجميد
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?