Menulis ke Jaringan
Pada bagian sebelumnya, Anda telah mempelajari cara membaca data dari jaringan Solana. Sekarang Anda akan belajar cara menulis data ke jaringan tersebut. Menulis ke jaringan Solana melibatkan pengiriman transaksi yang berisi satu atau lebih instruksi.
Program (smart contract) mendefinisikan logika bisnis untuk apa yang dilakukan oleh setiap instruksi. Ketika Anda mengirimkan transaksi, runtime Solana mengeksekusi setiap instruksi secara berurutan dan atomik (artinya semua instruksi berhasil atau seluruh transaksi gagal).
Bagian ini mencakup contoh-contoh berikut:
- Mentransfer SOL antar akun
- Membuat token baru
Contoh-contoh ini menunjukkan cara membangun dan mengirim transaksi untuk memanggil program Solana. Untuk detail lebih lanjut, lihat halaman Transaksi dan Instruksi dan Biaya di Solana.
Transfer SOL
Dalam contoh ini, Anda akan belajar cara mentransfer SOL antara dua akun.
Di Solana, setiap akun memiliki program tertentu sebagai pemiliknya. Hanya program pemilik yang dapat mengurangi saldo SOL (lamport) akun.
System Program adalah pemilik untuk semua akun "dompet". Untuk mentransfer SOL, Anda harus memanggil instruksi transfer dari System Program.
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}`);
Buat Connection
untuk menangani pengiriman transaksi dan pengambilan data
akun.
Dalam contoh ini, kita terhubung ke validator pengujian lokal yang berjalan di
localhost:8899
.
const connection = new Connection("http://localhost:8899", "confirmed");
Hasilkan keypair baru untuk digunakan sebagai akun pengirim dan penerima.
Sebuah Keypair
mencakup:
- Kunci publik yang berfungsi sebagai alamat akun
- Kunci privat yang digunakan untuk menandatangani transaksi
const sender = new Keypair();const receiver = new Keypair();
Sebelum kita dapat mentransfer SOL, akun pengirim perlu memiliki beberapa saldo SOL.
Pada jaringan selain mainnet, Anda dapat menggunakan metode requestAirdrop
untuk mendapatkan SOL untuk pengujian.
const signature = await connection.requestAirdrop(sender.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");
Metode SystemProgram.transfer()
membuat instruksi yang mentransfer SOL dari
akun fromPubkey
ke akun toPubkey
sejumlah
lamports
yang ditentukan.
const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: receiver.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});
Buat transaksi dan tambahkan instruksi ke transaksi tersebut.
Dalam contoh ini, kita membuat transaksi dengan satu instruksi. Namun, Anda dapat menambahkan beberapa instruksi ke dalam satu transaksi.
const transaction = new Transaction().add(transferInstruction);
Tanda tangani dan kirim transaksi ke jaringan.
Keypair pengirim diperlukan dalam array penandatangan untuk mengotorisasi transfer SOL dari akun mereka.
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[sender]);
Tanda tangan transaksi adalah pengenal unik yang dapat digunakan untuk mencari transaksi di Solana Explorer.
Membuat Token
Dalam contoh ini, Anda akan belajar cara membuat token baru di Solana menggunakan Token Extensions Program. Ini memerlukan dua instruksi:
- Memanggil System Program untuk membuat akun baru.
- Memanggil Token Extensions Program untuk menginisialisasi akun tersebut sebagai Mint.
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););
Membuat token di Solana memerlukan penggunaan kedua library @solana/web3.js
dan @solana/spl-token
.
- Buat koneksi
- Buat keypair untuk membayar transaksi
- Minta airdrop untuk mendanai keypair
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");
Buat keypair untuk mint account.
Kunci publik untuk keypair ini akan digunakan sebagai alamat untuk mint account.
const mint = new Keypair();
Hitung jumlah minimum lamport yang diperlukan untuk mint account.
Fungsi getMinimumBalanceForRentExemptMint
menghitung secara tepat berapa
banyak SOL (dalam lamport) yang harus dialokasikan untuk data pada mint account.
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
Instruksi pertama memanggil instruksi createAccount
dari System Program untuk:
- Mengalokasikan byte yang diperlukan untuk menyimpan data mint
- Mentransfer lamport dari dompet untuk mendanai akun baru
- Menetapkan kepemilikan akun ke Token Extensions program
(
TOKEN_2022_PROGRAM_ID
)
const createAccountInstruction = SystemProgram.createAccount({fromPubkey: wallet.publicKey,newAccountPubkey: mint.publicKey,space: MINT_SIZE,lamports: rentExemptionLamports,programId: TOKEN_2022_PROGRAM_ID});
Instruksi kedua memanggil instruksi createInitializeMint2Instruction
dari
Token Extensions Program untuk menginisialisasi mint
account dengan data berikut:
- 2 desimal
- Dompet sebagai otoritas mint dan otoritas pembekuan
const initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2,wallet.publicKey,wallet.publicKey,TOKEN_2022_PROGRAM_ID);
Tambahkan kedua instruksi ke dalam satu transaksi.
Dengan menggabungkan kedua instruksi ke dalam satu transaksi, Anda memastikan bahwa pembuatan akun dan inisialisasi terjadi secara atomik. Kedua instruksi berhasil atau tidak sama sekali.
Pendekatan ini umum digunakan saat membangun transaksi Solana yang lebih kompleks, karena menjamin bahwa semua instruksi dieksekusi bersama.
const transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);
Tanda tangani dan kirim transaksi. Dua tanda tangan diperlukan:
- Wallet menandatangani sebagai pembayar untuk biaya transaksi dan pembuatan akun
- Mint menandatangani untuk mengotorisasi penggunaan alamatnya untuk akun baru
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet,mint]);
Tanda tangan transaksi yang dikembalikan dapat digunakan untuk memeriksa transaksi di Solana Explorer.
Is this page helpful?