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 (akıllı sözleşme) 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 (yani ya tüm talimatlar başarılı olur ya da tüm işlem başarısız olur).
Bu bölüm aşağıdaki örnekleri kapsar:
- Hesaplar arasında SOL transferi
- Yeni bir token oluşturma
Bu örnekler, Solana programlarını çağırmak için işlemlerin nasıl oluşturulacağını ve gönderileceğini gösterir. Daha fazla ayrıntı için İşlemler ve Talimatlar ve Solana'da Ücretler sayfalarına bakın.
SOL transferi
Bu örnekte, iki hesap arasında SOL transferi yapmayı öğreneceksiniz.
Solana'da, her hesabın sahibi olarak belirli bir program vardır. Yalnızca program sahibi bir hesabın SOL (lamport) bakiyesini düşürebilir.
System Program, tüm "cüzdan" hesaplarının sahibidir. 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 kullanılacak yeni keypair'ler oluşturun.
Bir Keypair
şunları içerir:
- Hesap adresi olarak kullanılan bir açık anahtar
- İşlemleri imzalamak için kullanılan bir özel anahtar
const sender = new Keypair();const receiver = new Keypair();
SOL transferi yapabilmek için, gönderen hesabın SOL bakiyesine sahip olması gerekir.
Ana ağ dışındaki ağlarda, test amaçlı SOL almak için requestAirdrop
yöntemini
kullanabilirsiniz.
const signature = await connection.requestAirdrop(sender.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");
SystemProgram.transfer()
metodu, belirtilen lamports
miktarında SOL'u fromPubkey
hesabından
toPubkey
hesabına aktaran 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 talimati 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, hesaplarından SOL transferini yetkilendirmek için imzalayanlar dizisinde gereklidir.
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
Bu örnekte, Token Extensions Program kullanarak Solana'da yeni bir token oluşturmayı öğreneceksiniz. Bu, 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););
Solana'da bir token oluşturmak, hem @solana/web3.js
hem de @solana/spl-token
kütüphanelerini kullanmayı gerektirir.
- Bir bağlantı oluşturun
- İşlem için ödeme yapacak 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.
Bu keypair'in 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 tam olarak ne kadar SOL'un (lamport cinsinden) 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 baytları tahsis eder
- Yeni hesabı finanse etmek için cüzdandan lamport transferi yapar
- Hesabın sahipliğini atar Token Extensions programına
(
TOKEN_2022_PROGRAM_ID
)
const createAccountInstruction = SystemProgram.createAccount({fromPubkey: wallet.publicKey,newAccountPubkey: mint.publicKey,space: MINT_SIZE,lamports: rentExemptionLamports,programId: TOKEN_2022_PROGRAM_ID});
İkinci talimat, Token Extensions Program'ın
createInitializeMint2Instruction
talimatını çağırarak mint hesabını aşağıdaki
verilerle başlatı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.
Her iki talimatı da tek bir işlemde birleştirerek, hesap oluşturma ve başlatma işlemlerinin atomik olarak gerçekleşmesini sağlarsınız. Ya her iki talimat da başarılı olur ya da hiçbiri olmaz.
Bu yaklaşım, daha 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 işlem ücretleri ve hesap oluşturma için ödeyici olarak imzalar
- Mint yeni hesap için adresinin kullanımını yetkilendirmek için 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?