Di bagian sebelumnya, Anda telah mempelajari cara membaca data dari jaringan Solana dengan mengambil akun. Menulis data ke jaringan Solana memerlukan sebuah transaksi. Sebuah transaksi berisi satu atau lebih instruksi, dan setiap instruksi memanggil sebuah program.
Program mendefinisikan logika bisnis untuk setiap instruksi. Saat Anda mengirim sebuah transaksi, runtime Solana mengeksekusi instruksi-instruksi dalam transaksi tersebut secara berurutan. Transaksi bersifat atomik. Baik semua instruksi dalam transaksi berhasil, atau seluruh transaksi gagal.
Contoh-contoh di bagian ini menunjukkan cara:
- Mentransfer SOL antar akun
- Membuat token mint baru
Transfer SOL
Contoh di bawah ini mentransfer SOL dari satu akun ke akun lain. Hanya program yang ditetapkan sebagai pemilik suatu akun yang dapat mengubah data akun tersebut atau mengurangi lamport dari saldonya. Akun dompet dimiliki oleh System Program, sehingga mentransfer SOL antar akun dompet memerlukan instruksi yang memanggil instruksi transfer milik System Program. Akun sumber juga harus menandatangani transaksi tersebut.
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);
Buat klien Kit untuk validator pengujian lokal. Cuplikan ini menambahkan penanda tangan pembayar, terhubung ke endpoint RPC lokal, mengaktifkan airdrop, dan mendanai pembayar dengan SOL percobaan untuk transfer.
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)));
Buat penanda tangan untuk penerima. Pengirim adalah client.payer, yang dibuat
oleh generatedPayer() dan didanai oleh airdropPayer().
const receiver = await generateKeyPairSigner();
Helper getTransferSolInstruction() membuat instruksi System Program. Instruksi
ini mentransfer SOL dari penanda tangan source ke alamat
destination untuk jumlah amount
lamport yang ditentukan.
const transferInstruction = getTransferSolInstruction({source: client.payer,destination: receiver.address,amount: lamports(10_000_000n)});
Panggil client.sendTransaction() dengan array instruksi. Klien Kit mengubah
instruksi menjadi satu transaksi, menandatangani dengan penanda tangan yang
dilampirkan pada instruksi, mengirim transaksi, dan menunggu konfirmasi.
const result = await client.sendTransaction([transferInstruction]);console.log("Transaction Signature:", result.context.signature);
Setelah transaksi dikonfirmasi, ambil kedua saldo menggunakan client.rpc.
const { value: senderBalance } = await client.rpc.getBalance(client.payer.address).send();const { value: receiverBalance } = await client.rpc.getBalance(receiver.address).send();
Buat token
Contoh di bawah ini membuat mint token baru menggunakan Token Extensions Program. Sebuah mint account adalah akun yang mendefinisikan pengaturan global token, seperti desimal, pasokan, otoritas mint, dan otoritas pembekuan.
Membuat mint account memerlukan dua instruksi:
- Panggil System Program untuk membuat akun baru yang dimiliki oleh Token Extensions Program.
- Panggil Token Extensions Program untuk menginisialisasi akun tersebut sebagai mint.
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);
Buat dan danai klien Kit, lalu buat signer untuk digunakan sebagai alamat mint account baru. Pembayar klien mendanai pembuatan akun dan membayar biaya transaksi.
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();
Hitung ukuran mint account dalam byte, lalu buat permintaan RPC untuk menghitung lamport yang diperlukan guna menyimpan data tersebut di akun. Saldo yang diperlukan ini disebut sebagai rent.
const space = BigInt(getMintSize());const rent = await client.rpc.getMinimumBalanceForRentExemption(space).send();
Instruksi pertama memanggil System Program. Instruksi ini menggunakan
payer untuk mendanai newAccount,
mengalokasikan mint account space, mentransfer rent-exempt
lamports, dan menetapkan kepemilikan ke
programAddress.
const createAccountInstruction = getCreateAccountInstruction({payer: client.payer,newAccount: mint,space,lamports: rent,programAddress: TOKEN_2022_PROGRAM_ADDRESS});
Instruksi kedua memanggil Token Extensions Program. Instruksi ini
menginisialisasi alamat mint dengan nilai
decimals, sebuah
mintAuthority, sebuah
freezeAuthority, dan menentukan
tokenProgram yang memiliki mint account.
const initializeMintInstruction = getInitializeMintInstruction({mint: mint.address,decimals: 2,mintAuthority: client.payer.address,freezeAuthority: client.payer.address,tokenProgram: TOKEN_2022_PROGRAM_ADDRESS});
Kirim kedua instruksi dalam satu transaksi. Instruksi pembuatan akun harus dilakukan sebelum instruksi inisialisasi mint karena mint account harus ada sebelum Token Extensions Program dapat menulis data mint ke akun.
const result = await client.sendTransaction([createAccountInstruction,initializeMintInstruction]);
Setelah transaksi dikonfirmasi, ambil mint account.
const mintAccount = await fetchMint(client.rpc, mint.address);console.log("Mint Account:", mintAccount);
Is this page helpful?