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.
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.
#[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.
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.
$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.
#[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.
pub system_program: Program<'info, System>,
Selanjutnya, tambahkan logika CPI dalam instruksi delete untuk mentransfer SOL
dari akun vault kembali ke akun pengguna.
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.
$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.
$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.
Menurunkan Vault PDA
Pertama, tambahkan derivasi vault PDA:
const [vaultPda, vaultBump] = PublicKey.findProgramAddressSync([Buffer.from("vault"), wallet.publicKey.toBuffer()],program.programId);
Mengubah Update Test
Kemudian, perbarui instruksi pembaruan untuk menyertakan
vaultAccount
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
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:
$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 CPI
Delete 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?