Ağa Yazma
Önceki bölümde, Solana ağından veri okumayı öğrendiniz. Şimdi ağa nasıl veri yazacağınızı öğreneceksiniz. Solana ağına yazmak, bir veya daha fazla talimat içeren işlemler göndermeyi içerir.
Programlar, her talimatın ne yapacağına dair iş mantığını tanımlar. Bir işlem gönderdiğinizde, Solana çalışma zamanı her talimatı sırayla ve atomik olarak yürütür. Bu bölümdeki örnekler, Solana programlarını çağırmak için işlemlerin nasıl oluşturulacağını ve gönderileceğini göstermektedir, bunlar şunları içerir:
- Hesaplar arasında SOL transferi
- Yeni bir token oluşturma
SOL Transferi
Aşağıdaki örnek, iki hesap arasında SOL transferi yapar. Her hesabın bir sahip programı vardır ve bu program, hesabın SOL bakiyesini düşürebilen tek programdır.
Tüm cüzdan hesapları System Program tarafından sahiplenilir. SOL transfer etmek için, System Program'ın transfer talimatını çağırmanız gerekir.
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}`);
İşlemleri göndermek ve hesap verilerini almak için bir Connection oluşturun.
Bu örnekte, localhost:8899 üzerinde çalışan yerel test validator'a
bağlanıyoruz.
const connection = new Connection("http://localhost:8899", "confirmed");
Gönderen ve alıcı hesaplar olarak kullanmak için yeni anahtar çiftleri oluşturun.
const sender = new Keypair();const receiver = new Keypair();
Gönderen hesaba SOL ekleyin. Ana ağ dışındaki ağlarda, test için SOL almak üzere
requestAirdrop yöntemini kullanabilirsiniz.
const signature = await connection.requestAirdrop(sender.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");
SystemProgram.transfer() yöntemi, belirtilen sayıda
lamports için fromPubkey hesabından
toPubkey hesabına SOL transfer eden bir talimat oluşturur.
const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: receiver.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});
Bir işlem oluşturun ve talimatı işleme ekleyin. Bu örnekte, tek bir talimat içeren bir işlem oluşturuyoruz. Ancak, bir işleme birden fazla talimat ekleyebilirsiniz.
const transaction = new Transaction().add(transferInstruction);
İşlemi imzalayın ve ağa gönderin. Gönderen keypair, kendi hesabından SOL transferini yetkilendirmek için imzalayanlar dizisinde bulunmalıdır.
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[sender]);
İşlem imzası, Solana Explorer'da işlemi aramak için kullanılabilecek benzersiz bir tanımlayıcıdır.
Token oluşturma
Aşağıdaki örnek, Token Extensions Program kullanarak Solana'da yeni bir token oluşturur. Bu işlem iki talimat gerektirir:
- Yeni bir hesap oluşturmak için System Program'ı çağırın.
- Bu hesabı bir Mint olarak başlatmak için Token Extensions Program'ı çağırın.
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););
Bir token oluşturmak, hem @solana/web3.js hem de @solana/spl-token
kütüphanelerini kullanmayı gerektirir. Aşağıdaki örnekteki kod şunları
yapacaktır:
- Bir bağlantı oluşturun
- İşlemi ödemek için bir keypair oluşturun
- Keypair'i fonlamak için bir airdrop isteyin
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 hesabı için bir keypair oluşturun. Açık anahtar, mint hesabının adresi olarak kullanılacaktır.
const mint = new Keypair();
Bir mint hesabı için gereken minimum lamport miktarını hesaplayın.
getMinimumBalanceForRentExemptMint fonksiyonu, bir mint hesabındaki veriler
için kaç lamport tahsis edilmesi gerektiğini hesaplar.
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
İlk talimat, System Program'ın createAccount talimatını çağırarak şunları
yapar:
- Mint verilerini depolamak için gereken bayt sayısını ayırın.
- Yeni hesabı finanse etmek için cüzdandan lamport aktarın.
- Hesabın sahipliğini Token Extensions program'a atayın.
const createAccountInstruction = SystemProgram.createAccount({fromPubkey: wallet.publicKey,newAccountPubkey: mint.publicKey,space: MINT_SIZE,lamports: rentExemptionLamports,programId: TOKEN_2022_PROGRAM_ID});
İkinci talimat, mint hesabını aşağıdaki verilerle başlatmak için
Token Extensions Program'ın
createInitializeMint2Instruction talimatını çağırır:
- 2 ondalık basamak
- Hem mint yetkisi hem de dondurma yetkisi olarak cüzdan
const initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2,wallet.publicKey,wallet.publicKey,TOKEN_2022_PROGRAM_ID);
Her iki talimatı da tek bir işleme ekleyin. Bu, hesap oluşturma ve başlatma işlemlerinin atomik olarak gerçekleşmesini sağlar. (Ya her iki talimat da başarılı olur ya da hiçbiri olmaz.)
Bu yaklaşım, karmaşık Solana işlemleri oluştururken yaygındır, çünkü tüm talimatların birlikte yürütülmesini garanti eder.
const transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);
İşlemi imzalayın ve gönderin. İki imza gereklidir:
- Cüzdan hesabı, işlem ücretleri ve hesap oluşturma için ödeyici olarak imzalar
- Mint hesabı, adresinin yeni hesap için kullanımını yetkilendirmek üzere imzalar
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet,mint]);
Döndürülen işlem imzası, işlemi Solana Explorer'da incelemek için kullanılabilir.
Is this page helpful?