Menulis ke Jaringan

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:

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

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.

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.

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

Buat penanda tangan untuk penerima. Pengirim adalah client.payer, yang dibuat oleh generatedPayer() dan didanai oleh airdropPayer().

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

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

Send transaction
const result = await client.sendTransaction([transferInstruction]);
console.log("Transaction Signature:", result.context.signature);

Setelah transaksi dikonfirmasi, ambil kedua saldo menggunakan client.rpc.

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

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.

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

Buat penanda tangan untuk penerima. Pengirim adalah client.payer, yang dibuat oleh generatedPayer() dan didanai oleh airdropPayer().

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

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

Send transaction
const result = await client.sendTransaction([transferInstruction]);
console.log("Transaction Signature:", result.context.signature);

Setelah transaksi dikonfirmasi, ambil kedua saldo menggunakan client.rpc.

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

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:

  1. Panggil System Program untuk membuat akun baru yang dimiliki oleh Token Extensions Program.
  2. Panggil Token Extensions Program untuk menginisialisasi akun tersebut sebagai mint.
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.

Buat dan danai klien Kit, lalu buat signer untuk digunakan sebagai alamat mint account baru. Pembayar klien mendanai pembuatan akun dan membayar biaya transaksi.

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

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.

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

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

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

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

Setelah transaksi dikonfirmasi, ambil mint account.

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

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

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.

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

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

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

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

Setelah transaksi dikonfirmasi, ambil mint account.

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

Is this page helpful?

Daftar Isi

Edit Halaman
© 2026 Yayasan Solana. Semua hak dilindungi.