Rust
Pinjaman Kilat Pinocchio

Pinjaman Kilat Pinocchio

14 Graduates

Pinjaman Kilat Pinocchio

Pinjaman Kilat Pinocchio

Pinjaman Kilat Pinocchio

Introspeksi instruksi adalah fitur yang kuat yang memungkinkan program blockchain untuk memeriksa dan menganalisis instruksi lain dalam bundel transaksi yang sama. Ini termasuk instruksi yang belum dijalankan, memberikan program Anda kemampuan untuk "melihat ke depan" dan membuat keputusan berdasarkan apa yang akan terjadi nanti dalam transaksi.

Bayangkan seperti memiliki penglihatan sinar-X untuk transaksi: program Anda dapat melihat melalui seluruh transaksi untuk memahami urutan operasi lengkap sebelum memutuskan bagaimana melanjutkan.

Aplikasi paling menarik dari introspeksi instruksi adalah pinjaman kilat (flash loan). Ini adalah jenis pinjaman unik yang hanya ada dalam batas-batas satu transaksi.

Begini cara kerja pinjaman kilat:

  • Pinjam: Pada awal transaksi, Anda dapat langsung meminjam sejumlah besar modal menggunakan instruksi loan

  • Gunakan: Anda dapat menggunakan modal pinjaman ini untuk perdagangan, arbitrase, atau operasi lain dalam transaksi yang sama

  • Bayar kembali: Sebelum transaksi berakhir, Anda harus membayar kembali pinjaman plus sedikit biaya menggunakan instruksi repay

Wawasan utamanya adalah bahwa pinjaman kilat bergantung pada sifat atomik transaksi blockchain. Jika ada bagian dari transaksi yang gagal (termasuk pembayaran kembali), seluruh transaksi akan dibatalkan seolah-olah tidak pernah terjadi. Ini berarti pemberi pinjaman tidak memiliki risiko sama sekali: mereka mendapatkan pembayaran kembali, atau pinjaman sebenarnya tidak pernah terjadi.

Dalam tantangan ini, Anda akan membuat program pinjaman kilat sederhana yang mendemonstrasikan introspeksi instruksi dalam tindakan. Program akan memeriksa data instruksi dan akun di berbagai instruksi dalam transaksi yang sama untuk memastikan persyaratan pinjaman terpenuhi.

Jika Anda baru mengenal introspeksi instruksi, kami menyarankan untuk memulai dengan Kursus Introspeksi Instruksi untuk memahami konsep dasar yang digunakan dalam program ini.

Installation

Sebelum Anda memulai, pastikan Rust dan Pinocchio sudah terpasang. Kemudian, jalankan perintah berikut di terminal Anda:

# create workspace
cargo new blueshift_pinocchio_flash_loan --lib --edition 2021
cd blueshift_pinocchio_flash_loan

Tambahkan pinocchio, pinocchio-system, dan pinocchio-token:

cargo add pinocchio pinocchio-system pinocchio-token

Deklarasikan tipe crate di Cargo.toml untuk menghasilkan artefak deployment di target/deploy:

toml
[lib]
crate-type = ["lib", "cdylib"]

Anda sekarang siap untuk menulis program flash loan Anda.

Template

Kali ini, kita akan membagi program menjadi modul-modul kecil yang terfokus alih-alih menempatkan semuanya di lib.rs. Struktur folder akan terlihat kurang lebih seperti ini:

text
src
├── instructions
│       ├── helpers.rs
│       ├── loan.rs
│       ├── mod.rs
│       └── repay.rs
├── lib.rs

Catatan: Ingat untuk mengubah ID program menjadi 22222222222222222222222222222222222222222222 karena kami menggunakan ini di balik layar untuk menguji program Anda.

Entrypoint di lib.rs sangat mirip dengan yang kita bahas di Pengantar Kursus Pinocchio.

rust
use pinocchio::{account_info::AccountInfo, entrypoint, program_error::ProgramError, pubkey::Pubkey, ProgramResult};
entrypoint!(process_instruction);

pub mod instructions;
pub use instructions::*;

// 22222222222222222222222222222222222222222222
pub const ID: Pubkey = [
    0x0f, 0x1e, 0x6b, 0x14, 0x21, 0xc0, 0x4a, 0x07, 
    0x04, 0x31, 0x26, 0x5c, 0x19, 0xc5, 0xbb, 0xee, 
    0x19, 0x92, 0xba, 0xe8, 0xaf, 0xd1, 0xcd, 0x07, 
    0x8e, 0xf8, 0xaf, 0x70, 0x47, 0xdc, 0x11, 0xf7, 
];

fn process_instruction(
    _program_id: &Pubkey,
    accounts: &[AccountInfo],
    instruction_data: &[u8],
) -> ProgramResult {
    match instruction_data.split_first() {
        Some((Loan::DISCRIMINATOR, data)) => Loan::try_from((data, accounts))?.process(),
        Some((Repay::DISCRIMINATOR, _)) => Repay::try_from(accounts)?.process(),
        _ => Err(ProgramError::InvalidInstructionData)
    }
}

Helpers

Sebelum mendalami instruksi loan dan repay, mari kita periksa helpers.rs:

rust
#[repr(C, packed)]
pub struct LoanData {
    pub protocol_token_account: [u8; 32],
    pub balance: u64,
}

pub fn get_token_amount(data: &[u8]) -> u64 {
    if !account.is_owned_by(&pinocchio_token::ID) {
        return Err(PinocchioError::InvalidOwner.into());
    }

    if account.data_len().ne(&pinocchio_token::state::TokenAccount::LEN) {
        return Err(PinocchioError::InvalidAccountData.into());
    }
    
    u64::from_le_bytes(data[64..72].try_into().unwrap())
}

File ini cukup sederhana. Ini berisi struct LoanData, yang akan kita gunakan untuk menyimpan data pinjaman sementara dalam sebuah akun sebelum pinjaman dibayar kembali. Ini juga menyediakan fungsi pembantu get_token_amount() untuk membaca jumlah token dari sebuah akun.

Next PagePinjam
ATAU LANGSUNG KE TANTANGAN
Siap mengambil tantangan?
Daftar Isi
Lihat Sumber
Blueshift © 2025Commit: e573eab