For the complete documentation index, see llms.txt. This page is also available as Markdown.

Panggil EVM dari Solana

Biarkan wallet Solana mengendalikan kontrak EVM di Rome — tanpa kunci Ethereum. Wallet menandatangani, dan transaksinya masuk ke Solana.

Kebalikan dari Panggil Solana dari EVM: sebuah dompet Solana (mis. Phantom) memanggil kontrak EVM apa pun di Rome secara langsung, dengan tanpa kunci Ethereum. Inilah cara Aerarium dan Rome DEX memungkinkan pengguna native Solana berbagi kontrak yang sama dengan pengguna EVM.

Cara satu panggilan adalah submitRomeTxSolanaLane; halaman ini menjelaskan fungsinya.

Alamat sintetis

Identitas EVM dari dompet Solana adalah alamat sintetis — 20 byte terakhir dari keccak256 dari public key Solana 32 byte-nya:

synthetic_evm_address = keccak256(solana_pubkey)[12:]

Ini adalah msg.sender saat dompet memanggil kontrak, dan identitas stabil tempat nonce dan penyimpanannya berada. Derivasinya dipatok dalam protokol, jadi sebuah dompet selalu dipetakan ke alamat yang sama.

import { syntheticAddress } from "@rome-protocol/sdk";
const from = syntheticAddress(solanaPubkey); // 0x… 20 bytes

Sintetis ini hanyalah perantara — ia tidak menyimpan token saat tidak digunakan

Saldo yang dapat dibelanjakan oleh pengguna native Solana berada di dompet Solana (sebagai token SPL), ditampilkan 1:1 di sisi EVM sebagai pembungkus ERC20SPL (mis. wUSDC). Sintetis tidak menyimpan apa pun saat tidak digunakan, jadi nilai mengalir melalui darinya — setiap langkah ditandatangani oleh dompet Solana:

  1. Penyediaan (sekali). PDA otorisasi eksternal dari sintetis yang baru dibuat belum ada sampai create_pda dijalankan — dan transfer di bawah ini ditandatangani oleh PDA itu. submitRomeTxSolanaLane menyediakannya secara otomatis saat pertama kali digunakan (atau panggil provisionSynthetic untuk langkah "Activate" eksplisit; periksa dengan isSyntheticProvisioned).

  2. Langkah pendanaan (dompet → sintetis). Pindahkan token dari ATA dompet ke ATA sintetis — langkah ActivateAta , dibuat oleh buildFundLeg. Sekarang wrapper.balanceOf(synthetic) membaca saldo itu, sehingga sintetis membelanjakannya sebagai ERC-20 biasa (transfer / transferFrom) — bukan sebagai native msg.value, yang tidak dimilikinya.

  3. Panggilan-panggilan (DoTxUnsigned). Sintetis menjalankan transaksi EVM — mis. approve lalu sebuah vault deposit yang menarik melalui transferFrom.

  4. Langkah sweeping (sintetis → dompet). Setelah withdraw / borrow / claim menempatkan token di sintetis, buildSweepLeg mendorongnya kembali ke ATA dompet milik pengguna (HelperProgram.transfer_spl), sehingga saldo bersih sintetis menjadi nol.

Bagaimana panggilan dibuat

submitRomeTxSolanaLane melakukan semua ini. Mekanismenya:

  1. Bangun transaksi EIP-1559 tanpa tanda tangan dengan from = alamat sintetis — tanpa tanda tangan secp256k1.

  2. Temukan akun-akun — panggil rome_emulateCallAccounts dengan from, ke, data, dan nilai (saat panggilan dapat menerima pembayaran). Menyertakan nilai sangat penting: proxy meniru sebenarnya panggilan, jadi setiap penulisan penyimpanan yang bergantung pada nilai — misalnya slot mapping baru — dialokasikan dan akun Solana-nya dikembalikan. Jika dihilangkan, akun itu tidak ada, dan transaksi gagal dengan "instruction modified data of a read-only account."

  3. Susun transaksi Solana: dua ComputeBudget instruksi (EVM Rome memerlukan batas CU yang lebih tinggi ≈1,35 juta dan heap frame besar ≈250 KB — default Solana akan gagal) + DoTxUnsigned instruksi (RLP tanpa tanda tangan + akun yang ditemukan) + dompet perbendaharaan (eksekusi membayarnya biaya kecil; discovery tidak menyertakannya, jadi SDK menambahkannya).

  4. Dompet menandatangani dan mengirimkannya. Sang dompet Solana menandatangani transaksi Solana (Ed25519) dan mengirimkannya ke RPC Solana — bukan ke proxy. Runtime Solana memverifikasi tanda tangan; di on-chain, program menurunkan msg.sender dari penandatangan itu. Otoritasnya adalah tanda tangan Solana, bukan tanda tangan Ethereum. (Proxy hanya digunakan untuk emulasi/discovery pada langkah 2.)

PDA milik pengguna (["EXTERNAL_AUTHORITY", synthetic_address]) memiliki akun token mereka dan menandatangani CPI SPL atas nama mereka — jadi pengguna Solana dapat supply, borrow, swap, dan LP sepenuhnya dari Phantom.

Implementasi referensi

  • Aerarium — menjalankan Compound v3 (supply / borrow) dari Phantom melalui DoTxUnsigned.

  • Rome DEX — jalur Solana memperdagangkan dan menyediakan likuiditas pada pool yang sama dengan jalur EVM.

Keduanya native Solana tanpa bridge atau dompet kedua — alamat sintetis menjadikan satu kunci Phantom sebagai akun EVM kelas utama.

Apa Selanjutnya

Terakhir diperbarui

Apakah ini membantu?