Önceki bölümde, hesapları sorgulayarak Solana ağından veri okumayı öğrendiniz. Solana ağına veri yazmak için bir işlem gereklidir. Bir işlem, bir veya daha fazla talimat içerir ve her talimat bir programı çağırır.
Programlar, her talimat için iş mantığını tanımlar. Bir işlem gönderdiğinizde, Solana çalışma zamanı işlemin talimatlarını sırayla yürütür. İşlemler atomiktir. Ya işlemdeki her talimat başarıyla tamamlanır ya da işlemin tamamı başarısız olur.
Bu bölümdeki örnekler şunları göstermektedir:
- Hesaplar arasında SOL transferi
- Yeni bir token mint oluşturma
SOL Transferi
Aşağıdaki örnek, bir hesaptan diğerine SOL transferi yapar. Yalnızca bir hesabın sahibi olarak atanan program, hesabın verilerini değiştirebilir veya bakiyesinden lamport düşebilir. Cüzdan hesapları System Program tarafından sahiplenilir; bu nedenle cüzdan hesapları arasında SOL transferi yapmak, System Program'ın transfer talimatını çağıran bir talimat gerektirir. Kaynak hesabın ayrıca işlemi imzalaması gerekir.
import { createClient, generateKeyPairSigner, lamports } from "@solana/kit";import { solanaRpc, rpcAirdrop } from "@solana/kit-plugin-rpc";import { generatedPayer, airdropPayer } from "@solana/kit-plugin-signer";import { getTransferSolInstruction } from "@solana-program/system";const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "http://localhost:8899",rpcSubscriptionsUrl: "ws://localhost:8900"})).use(rpcAirdrop()).use(airdropPayer(lamports(1_000_000_000n)));const receiver = await generateKeyPairSigner();const transferInstruction = getTransferSolInstruction({source: client.payer,destination: receiver.address,amount: lamports(10_000_000n)});const result = await client.sendTransaction([transferInstruction]);console.log("Transaction Signature:", result.context.signature);const { value: senderBalance } = await client.rpc.getBalance(client.payer.address).send();const { value: receiverBalance } = await client.rpc.getBalance(receiver.address).send();console.log("Sender Balance:", senderBalance);console.log("Receiver Balance:", receiverBalance);
Yerel test validator için bir Kit istemcisi oluşturun. Bu kod parçacığı bir ödeyici imzalayıcı ekler, yerel RPC uç noktasına bağlanır, airdrop'ları etkinleştirir ve transfer için test SOL ile ödeyiciyi fonlar.
const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "http://localhost:8899",rpcSubscriptionsUrl: "ws://localhost:8900"})).use(rpcAirdrop()).use(airdropPayer(lamports(1_000_000_000n)));
Alıcı için bir imzalayıcı oluşturun. Gönderen, client.payer'dir; bu,
generatedPayer() tarafından oluşturulmuş ve airdropPayer() tarafından
fonlanmıştır.
const receiver = await generateKeyPairSigner();
getTransferSolInstruction() yardımcısı bir System Program talimatı oluşturur.
Talimat, SOL'u source imzalayıcısından
destination adresine, belirtilen
amount miktarda lamport olarak aktarır.
const transferInstruction = getTransferSolInstruction({source: client.payer,destination: receiver.address,amount: lamports(10_000_000n)});
client.sendTransaction()'i bir talimat dizisiyle çağırın. Kit istemcisi
talimatları tek bir işleme dönüştürür, talimatlara eklenmiş imzalayıcılarla
imzalar, işlemi gönderir ve onayı bekler.
const result = await client.sendTransaction([transferInstruction]);console.log("Transaction Signature:", result.context.signature);
İşlem onaylandıktan sonra, client.rpc kullanarak her iki bakiyeyi de getirin.
const { value: senderBalance } = await client.rpc.getBalance(client.payer.address).send();const { value: receiverBalance } = await client.rpc.getBalance(receiver.address).send();
Token oluşturma
Aşağıdaki örnek, Token Extensions Program kullanarak yeni bir token mint oluşturur. Bir mint account, ondalık basamaklar, arz, mint yetkisi ve dondurma yetkisi gibi bir tokenın genel ayarlarını tanımlayan hesaptır.
Bir mint account oluşturmak iki talimat gerektirir:
- Token Extensions Program'a ait yeni bir hesap oluşturmak için System Program'ı çağırın.
- Bu hesabı mint olarak başlatmak için Token Extensions Program'ı çağırın.
import { createClient, generateKeyPairSigner, lamports } from "@solana/kit";import { solanaRpc, rpcAirdrop } from "@solana/kit-plugin-rpc";import { generatedPayer, airdropPayer } from "@solana/kit-plugin-signer";import { getCreateAccountInstruction } from "@solana-program/system";import {fetchMint,getInitializeMintInstruction,getMintSize,TOKEN_2022_PROGRAM_ADDRESS} from "@solana-program/token-2022";const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "http://localhost:8899",rpcSubscriptionsUrl: "ws://localhost:8900"})).use(rpcAirdrop()).use(airdropPayer(lamports(1_000_000_000n)));const mint = await generateKeyPairSigner();const space = BigInt(getMintSize());const rent = await client.rpc.getMinimumBalanceForRentExemption(space).send();const createAccountInstruction = getCreateAccountInstruction({payer: client.payer,newAccount: mint,space,lamports: rent,programAddress: TOKEN_2022_PROGRAM_ADDRESS});const initializeMintInstruction = getInitializeMintInstruction({mint: mint.address,decimals: 2,mintAuthority: client.payer.address,freezeAuthority: client.payer.address,tokenProgram: TOKEN_2022_PROGRAM_ADDRESS});const result = await client.sendTransaction([createAccountInstruction,initializeMintInstruction]);console.log("Mint Address:", mint.address);console.log("Transaction Signature:", result.context.signature);const mintAccount = await fetchMint(client.rpc, mint.address);console.log("Mint Account:", mintAccount);
Bir Kit istemcisi oluşturup fonlayın, ardından yeni mint account'un adresi olarak kullanılacak bir imzalayıcı oluşturun. İstemci ödeyicisi, hesap oluşturma işlemini fonlar ve işlem ücretini öder.
const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "http://localhost:8899",rpcSubscriptionsUrl: "ws://localhost:8900"})).use(rpcAirdrop()).use(airdropPayer(lamports(1_000_000_000n)));const mint = await generateKeyPairSigner();
Mint account boyutunu bayt cinsinden hesaplayın, ardından bu verileri hesapta depolamak için gereken lamport miktarını hesaplamak üzere bir RPC isteği gönderin. Bu gerekli bakiye rent olarak adlandırılır.
const space = BigInt(getMintSize());const rent = await client.rpc.getMinimumBalanceForRentExemption(space).send();
İlk talimat System Program'ı çağırır. Talimat, bir payer'ı
kullanarak newAccount'u fonlar, mint account
space alanı tahsis eder, rent-exempt
lamports miktarını aktarır ve sahipliği
programAddress'e atar.
const createAccountInstruction = getCreateAccountInstruction({payer: client.payer,newAccount: mint,space,lamports: rent,programAddress: TOKEN_2022_PROGRAM_ADDRESS});
İkinci talimat Token Extensions Program'ı çağırır. Talimat,
mint adresini bir decimals
değeriyle, bir mintAuthority ile, bir
freezeAuthority ile başlatır ve mint account'a
sahip olan tokenProgram'ı belirtir.
const initializeMintInstruction = getInitializeMintInstruction({mint: mint.address,decimals: 2,mintAuthority: client.payer.address,freezeAuthority: client.payer.address,tokenProgram: TOKEN_2022_PROGRAM_ADDRESS});
Her iki talimatı tek bir işlemde gönderin. Hesap oluşturma talimatı, mint başlatma talimatından önce gelmelidir; çünkü Token Extensions Program mint verilerini hesaba yazabilmek için mint account'un önceden var olması gerekir.
const result = await client.sendTransaction([createAccountInstruction,initializeMintInstruction]);
İşlem onaylandıktan sonra mint account'u getirin.
const mintAccount = await fetchMint(client.rpc, mint.address);console.log("Mint Account:", mintAccount);
Bu örnekler, yerel test için tek kullanımlık bir keypair oluşturmak amacıyla
generatedPayer() kullanır. Üretim uygulamaları hiçbir zaman kodda ham özel
anahtarlar barındırmamalıdır — imzalamayı bir anahtar yönetim arka ucuna
devredin. Bkz. Üretimde
İmzalama.
Is this page helpful?