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:

  1. Mentransfer SOL antar akun
  2. 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.

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.

Buat Connection untuk menangani pengiriman transaksi dan pengambilan data akun.

Dalam contoh ini, kita terhubung ke validator pengujian lokal yang berjalan di localhost:8899.

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

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

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

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

Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[sender]
);

Tanda tangan transaksi adalah pengenal unik yang dapat digunakan untuk mencari transaksi di Solana Explorer.

Buat Connection untuk menangani pengiriman transaksi dan pengambilan data akun.

Dalam contoh ini, kita terhubung ke validator pengujian lokal yang berjalan di localhost:8899.

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

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

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

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

Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[sender]
);

Tanda tangan transaksi adalah pengenal unik yang dapat digunakan untuk mencari transaksi di Solana Explorer.

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

Membuat Token

Dalam contoh ini, Anda akan belajar cara membuat token baru di Solana menggunakan Token Extensions Program. Ini memerlukan dua instruksi:

  1. Memanggil System Program untuk membuat akun baru.
  2. Memanggil Token Extensions Program untuk menginisialisasi akun tersebut sebagai Mint.
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.

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
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");

Buat keypair untuk mint account.

Kunci publik untuk keypair ini akan digunakan sebagai alamat untuk mint account.

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

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

Instruksi pertama memanggil instruksi createAccount dari System Program untuk:

  1. Mengalokasikan byte yang diperlukan untuk menyimpan data mint
  2. Mentransfer lamport dari dompet untuk mendanai akun baru
  3. Menetapkan kepemilikan akun ke Token Extensions program (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
});

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
Initialize Mint Instruction
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.

Transaction
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
Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet,
mint
]
);

Tanda tangan transaksi yang dikembalikan dapat digunakan untuk memeriksa transaksi di Solana Explorer.

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
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");

Buat keypair untuk mint account.

Kunci publik untuk keypair ini akan digunakan sebagai alamat untuk mint account.

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

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

Instruksi pertama memanggil instruksi createAccount dari System Program untuk:

  1. Mengalokasikan byte yang diperlukan untuk menyimpan data mint
  2. Mentransfer lamport dari dompet untuk mendanai akun baru
  3. Menetapkan kepemilikan akun ke Token Extensions program (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
});

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
Initialize Mint Instruction
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.

Transaction
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
Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet,
mint
]
);

Tanda tangan transaksi yang dikembalikan dapat digunakan untuk memeriksa transaksi di Solana Explorer.

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?

Daftar Isi

Edit Halaman