Panggil Solana dari EVM

CPI precompile Rome memungkinkan kontrak Solidity memanggil program Solana apa pun secara langsung. Panduan ini membahas mekanismenya.

Prasyarat

  • Rome Solidity SDK terinstal: npm install @rome-protocol/solidity-sdk

  • Sebuah kontrak Rome yang telah di-deploy (lihat Deploy Solidity)

CPI Precompile

CPI precompile di 0xFF00000000000000000000000000000000000008 menyediakan dua fungsi:

import {CpiProgram} from "@rome-protocol/solidity-sdk/contracts/core/Precompiles.sol";

// Memanggil program Solana
CpiProgram.invoke(programId, accounts, instructionData);

// Memanggil dengan penandatanganan PDA (kontrak Anda menandatangani sebagai PDA)
CpiProgram.invoke_signed(programId, accounts, data, seeds);

Contoh Dasar: Transfer SOL

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;

import {SystemProgram, CpiProgram} from "@rome-protocol/solidity-sdk/contracts/core/Precompiles.sol";
import {RomeEVMAccount} from "@rome-protocol/solidity-sdk/contracts/core/RomeEVMAccount.sol";

contract SolTransfer {
    function transferSol(bytes32 recipient, uint64 lamports) external {
        // Dapatkan PDA pengirim
        bytes32 senderPda = RomeEVMAccount.pda(msg.sender);

        // Bangun instruksi transfer System Program
        ICrossProgramInvocation.AccountMeta[] memory accounts = new ICrossProgramInvocation.AccountMeta[](2);
        accounts[0] = ICrossProgramInvocation.AccountMeta(senderPda, true, true);   // pengirim (penandatangan, dapat ditulis)
        accounts[1] = ICrossProgramInvocation.AccountMeta(recipient, false, true);   // penerima (dapat ditulis)

        // Instruksi transfer System Program (varian 2, jumlah u64 little-endian)
        bytes memory data = abi.encodePacked(uint32(2), lamports);

        CpiProgram.invoke(SystemProgram.program_id(), accounts, data);
    }
}

Membaca Data Akun

CPI precompile juga memungkinkan Anda membaca data akun Solana apa pun:

Bekerja dengan SPL Token

Gunakan precompile SPL Token untuk operasi token umum:

Derivasi PDA

Menemukan Program Derived Address dari Solidity:

Konversi Base58

Konversi antara bytes32 dan base58 (format alamat Solana):

Memanggil Program Solana Kustom

Untuk memanggil program Solana arbitrer apa pun:

Batasan Utama

  1. Semua akun harus dideklarasikan di awal. Transaksi Solana harus menyertakan setiap akun yang akan disentuh oleh CPI. Penemuan akun secara dinamis di dalam CPI tidak dimungkinkan.

  2. Batas kedalaman CPI: 4 level. Rome EVM โ†’ target Anda โ†’ panggilan target โ†’ satu level lagi. Rencanakan kedalaman panggilan Anda dengan cermat.

  3. Pubkey Solana adalah bytes32. Semua alamat adalah pubkey Solana 32-byte, bukan alamat Ethereum 20-byte.

  4. Data instruksi adalah byte mentah. Anda perlu mengodekan data instruksi dalam format yang diharapkan program target (biasanya dikodekan Borsh, little-endian).

Berikutnya

Terakhir diperbarui

Apakah ini membantu?