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:

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

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

İş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.

Connection
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
Generate Keypairs
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.

Airdrop
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.

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

Transaction
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.

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

İş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.

Connection
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
Generate Keypairs
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.

Airdrop
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.

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

Transaction
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.

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

Transfer SOL
import {
LAMPORTS_PER_SOL,
SystemProgram,
Transaction,
sendAndConfirmTransaction,
Keypair,
Connection
} from "@solana/web3.js";
const connection = new Connection("http://localhost:8899", "confirmed");

Token oluşturma

Bu örnekte, Token Extensions Program kullanarak Solana'da yeni bir token oluşturmayı öğreneceksiniz. Bu, iki talimat gerektirir:

  1. Yeni bir hesap oluşturmak için System Program'ı çağırın.
  2. Bu hesabı bir Mint olarak başlatmak için Token Extensions Program'ı çağırın.
Create Mint Account
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 SOL
const signature = await connection.requestAirdrop(
wallet.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");
// Generate keypair to use as address of mint account
const mint = new Keypair();
// Calculate lamports required for rent exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);
// Instruction to create new account with space for new mint account
const createAccountInstruction = SystemProgram.createAccount({
fromPubkey: wallet.publicKey,
newAccountPubkey: mint.publicKey,
space: MINT_SIZE,
lamports: rentExemptionLamports,
programId: TOKEN_2022_PROGRAM_ID
});
// Instruction to initialize mint account
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2, // decimals
wallet.publicKey, // mint authority
wallet.publicKey, // freeze authority
TOKEN_2022_PROGRAM_ID
);
// Build transaction with instructions to create new account and initialize mint account
const transaction = new Transaction().add(
createAccountInstruction,
initializeMintInstruction
);
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet, // payer
mint // mint address keypair
]
);
console.log("Transaction Signature:", `${transactionSignature}`);
const mintData = await getMint(
connection,
mint.publicKey,
"confirmed",
TOKEN_2022_PROGRAM_ID
);
);
Console
Click to execute the code.

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
Connection & Wallet Setup
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.

Mint Keypair
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.

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

İlk talimat, System Program'ın createAccount talimatını çağırarak şunları yapar:

  1. Mint verilerini depolamak için gereken baytları tahsis eder
  2. Yeni hesabı finanse etmek için cüzdandan lamport transferi yapar
  3. Hesabın sahipliğini atar Token Extensions programına (TOKEN_2022_PROGRAM_ID)
Create Account Instruction
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
Initialize Mint Instruction
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.

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

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
Connection & Wallet Setup
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.

Mint Keypair
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.

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

İlk talimat, System Program'ın createAccount talimatını çağırarak şunları yapar:

  1. Mint verilerini depolamak için gereken baytları tahsis eder
  2. Yeni hesabı finanse etmek için cüzdandan lamport transferi yapar
  3. Hesabın sahipliğini atar Token Extensions programına (TOKEN_2022_PROGRAM_ID)
Create Account Instruction
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
Initialize Mint Instruction
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.

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

Create Mint Account
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();
const signature = await connection.requestAirdrop(
wallet.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");

Is this page helpful?

İçindekiler

Sayfayı Düzenle