Ağa Yazma

Ö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:

  1. Hesaplar arasında SOL transferi
  2. 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.

Transfer SOL
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);
Console
Click to execute the code.

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.

Client setup
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.

Receiver signer
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.

Transfer instruction
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.

Send transaction
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.

Fetch balances
const { value: senderBalance } = await client.rpc
.getBalance(client.payer.address)
.send();
const { value: receiverBalance } = await client.rpc
.getBalance(receiver.address)
.send();

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.

Client setup
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.

Receiver signer
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.

Transfer instruction
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.

Send transaction
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.

Fetch balances
const { value: senderBalance } = await client.rpc
.getBalance(client.payer.address)
.send();
const { value: receiverBalance } = await client.rpc
.getBalance(receiver.address)
.send();
Transfer SOL
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)));

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:

  1. Token Extensions Program'a ait yeni bir hesap oluşturmak için System Program'ı çağırın.
  2. Bu hesabı mint olarak başlatmak için Token Extensions Program'ı çağırın.
Create mint account
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);
Console
Click to execute the code.

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.

Client and mint setup
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.

Mint account size and rent
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.

Create account instruction
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.

Initialize mint instruction
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.

Send transaction
const result = await client.sendTransaction([
createAccountInstruction,
initializeMintInstruction
]);

İşlem onaylandıktan sonra mint account'u getirin.

Fetch mint account
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.

Client and mint setup
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.

Mint account size and rent
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.

Create account instruction
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.

Initialize mint instruction
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.

Send transaction
const result = await client.sendTransaction([
createAccountInstruction,
initializeMintInstruction
]);

İşlem onaylandıktan sonra mint account'u getirin.

Fetch mint account
const mintAccount = await fetchMint(client.rpc, mint.address);
console.log("Mint Account:", mintAccount);
Create mint account
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();

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?

İçindekiler

Sayfayı Düzenle
© 2026 Solana Vakfı. Tüm hakları saklıdır.