Cross Program Invocation

Dalam bagian ini, program CRUD dari bagian PDA sebelumnya diperbarui dengan menambahkan Cross Program Invocations (CPI), fitur yang memungkinkan program Solana untuk saling memanggil.

Tutorial ini juga menunjukkan bagaimana program dapat "menandatangani" Program Derived Addresses (PDA) saat melakukan Cross Program Invocations.

Instruksi update dan delete perlu dimodifikasi untuk menangani transfer SOL antara akun dengan memanggil System Program.

Tujuan dari bagian ini termasuk memandu proses implementasi CPI dalam program Solana menggunakan framework Anchor, melanjutkan konsep PDA yang telah dibahas di bagian sebelumnya. Untuk detail lebih lanjut, lihat halaman Cross Program Invocation.

Sebagai referensi, tautan ini mencakup kode final setelah menyelesaikan kedua bagian PDA dan CPI.

Kode awal untuk bagian ini hanya mencakup bagian PDA yang telah diselesaikan.

Memperbarui instruksi update

Pertama, program memerlukan mekanisme "bayar-untuk-memperbarui" sederhana dengan mengubah struct Update dan fungsi update.

Mulailah dengan memperbarui file lib.rs untuk membawa ke dalam scope item dari modul system_program.

lib.rs
use anchor_lang::system_program::{transfer, Transfer};

Selanjutnya, perbarui struct Update untuk menyertakan akun baru bernama vault_account. Akun ini, yang dikontrol oleh program, menerima SOL dari pengguna ketika mereka memperbarui akun pesan mereka.

lib.rs
#[account(
mut,
seeds = [b"vault", user.key().as_ref()],
bump,
)]
pub vault_account: SystemAccount<'info>,

Selanjutnya, tambahkan logika CPI dalam instruksi update untuk mentransfer 0,001 SOL dari akun pengguna ke akun vault.

lib.rs
let transfer_accounts = Transfer {
from: ctx.accounts.user.to_account_info(),
to: ctx.accounts.vault_account.to_account_info(),
};
let cpi_context = CpiContext::new(
ctx.accounts.system_program.to_account_info(),
transfer_accounts,
);
transfer(cpi_context, 1_000_000)?;

Bangun ulang program.

Terminal
$
build

Perbarui Instruksi Delete

Sekarang tambahkan mekanisme "refund on delete" dengan mengubah struct Delete dan fungsi delete.

Pertama, perbarui struct Delete untuk menyertakan vault_account. Ini memungkinkan transfer SOL apa pun di vault kembali ke pengguna ketika mereka menutup akun pesan mereka.

lib.rs
#[account(
mut,
seeds = [b"vault", user.key().as_ref()],
bump,
)]
pub vault_account: SystemAccount<'info>,

Tambahkan juga system_program karena CPI untuk transfer memerlukan pemanggilan System Program.

lib.rs
pub system_program: Program<'info, System>,

Selanjutnya, tambahkan logika CPI dalam instruksi delete untuk mentransfer SOL dari akun vault kembali ke akun pengguna.

lib.rs
let user_key = ctx.accounts.user.key();
let signer_seeds: &[&[&[u8]]] =
&[&[b"vault", user_key.as_ref(), &[ctx.bumps.vault_account]]];
let transfer_accounts = Transfer {
from: ctx.accounts.vault_account.to_account_info(),
to: ctx.accounts.user.to_account_info(),
};
let cpi_context = CpiContext::new(
ctx.accounts.system_program.to_account_info(),
transfer_accounts,
).with_signer(signer_seeds);
transfer(cpi_context, ctx.accounts.vault_account.lamports())?;

Perhatikan bahwa _ctx: Context<Delete> berubah menjadi ctx: Context<Delete> untuk menggunakan context dalam body fungsi.

Bangun ulang program.

Terminal
$
build

Mendeploy Ulang Program

Setelah membuat perubahan ini, deploy ulang program yang telah diperbarui. Ini memastikan program yang dimodifikasi tersedia untuk pengujian. Di Solana, memperbarui program hanya memerlukan deployment program pada ID program yang sama.

Pastikan dompet Playground Anda memiliki SOL devnet. Dapatkan SOL devnet dari Solana Faucet.

Terminal
$
deploy

Memperbarui File Pengujian

Selanjutnya, perbarui file anchor.test.ts untuk menyertakan akun vault baru dalam instruksi. Ini memerlukan derivasi PDA vault dan menyertakannya dalam pemanggilan instruksi update dan delete.

Pertama, tambahkan derivasi vault PDA:

anchor.test.ts
const [vaultPda, vaultBump] = PublicKey.findProgramAddressSync(
[Buffer.from("vault"), wallet.publicKey.toBuffer()],
program.programId
);

Mengubah Update Test

Kemudian, perbarui instruksi pembaruan untuk menyertakan vaultAccount

anchor.test.ts
const transactionSignature = await program.methods
.update(message)
.accounts({
messageAccount: messagePda,
vaultAccount: vaultPda
})
.rpc({ commitment: "confirmed" });

Mengubah Delete Test

Kemudian, perbarui instruksi penghapusan untuk menyertakan vaultAccount

anchor.test.ts
const transactionSignature = await program.methods
.delete()
.accounts({
messageAccount: messagePda,
vaultAccount: vaultPda
})
.rpc({ commitment: "confirmed" });

Menjalankan Ulang Test

Setelah membuat perubahan ini, jalankan tes untuk memastikan semuanya berfungsi sebagaimana yang diharapkan:

Terminal
$
test

Anda kemudian dapat memeriksa tautan SolanaFM untuk melihat detail transaksi, di mana Anda akan menemukan CPI untuk instruksi transfer dalam instruksi update dan delete.

Update CPIUpdate CPI

Delete CPIDelete CPI

Jika Anda mengalami kesalahan, Anda dapat merujuk ke kode final.

Langkah selanjutnya

Selamat telah menyelesaikan panduan Quickstart Solana. Anda telah mendapatkan pengalaman langsung dengan konsep-konsep kunci Solana termasuk:

  • Mengambil dan membaca data dari akun
  • Membangun dan mengirim transaksi
  • Men-deploy dan memperbarui program Solana
  • Bekerja dengan Program Derived Address (PDA)
  • Membuat Cross-Program Invocation (CPI)

Untuk memperdalam pemahaman Anda tentang konsep-konsep ini, lihat dokumentasi Konsep Inti yang memberikan penjelasan rinci tentang topik-topik yang dibahas dalam panduan ini.

Jelajahi contoh lainnya

Jika Anda lebih suka belajar melalui contoh, lihat Program Examples Repository untuk berbagai contoh program.

Solana Playground menawarkan fitur yang memudahkan Anda untuk mengimpor atau melihat proyek menggunakan tautan GitHub mereka. Misalnya, buka tautan Solana Playground untuk melihat proyek Anchor dari repo Github ini.

Klik tombol Import dan masukkan nama proyek untuk menambahkannya ke daftar proyek Anda di Solana Playground. Setelah proyek diimpor, semua perubahan akan tersimpan dan tersinkronisasi secara otomatis.

Is this page helpful?

Daftar Isi

Edit Halaman

Dikelola oleh

© 2026 Yayasan Solana.
Semua hak dilindungi.