Solana von EVM aus aufrufen
Rufe Solana-Programme aus Solidity über Roms CPI und Hilfs-Precompiles auf.
Romes Precompiles ermöglichen es Solidity-Contracts, Solana-Programme direkt aufzurufen. Dieser Leitfaden erklärt die Mechanik.
Voraussetzungen
Die Rome-Solidity-Interfaces aus dem öffentlichen
rome-solidityRepo (von GitHub installiert, nicht über npm — siehe Solidity bereitstellen) — die Precompile-Interfaces befinden sich incontracts/interface.solEin bereitgestellter Rome-Contract (siehe Solidity bereitstellen)
Binde jedes Interface an seine Precompile-Adresse:
import {ICrossProgramInvocation, ISystemProgram, IHelperProgram}
from "@rome-protocol/rome-solidity/contracts/interface.sol";
ICrossProgramInvocation constant CpiProgram = ICrossProgramInvocation(0xFF00000000000000000000000000000000000008);
ISystemProgram constant SystemProgram = ISystemProgram(0xFF00000000000000000000000000000000000007);
IHelperProgram constant Helper = IHelperProgram(0xFF00000000000000000000000000000000000009);Das CpiProgram-Precompile
CpiProgram (0xFF…08) führt CPI aus (aufrufen / invoke_signed) plus Cross-State-Lese-Abkürzungen (account_info, account_data_at, account_u64_at, account_lamports, pdas_batch_derive):
// Rufe ein Solana-Programm auf
CpiProgram.invoke(programId, accounts, instructionData);
// Aufruf mit PDA-Signatur: Das PDA der externen Autorität deines Contracts signiert, plus ein
// gesalzenes Unter-PDA pro Eintrag in `salts` (Rome leitet ["EXTERNAL_AUTHORITY", contract, salt] ab)
CpiProgram.invoke_signed(programId, accounts, data, salts);Lamports übertragen
Für einfache Lamport- und SPL-Überweisungen verwende das HelperProgram-Precompile — kein manuell gebautes CPI nötig. Ein Contract, der es aufruft, verhält sich als selbst: Die untenstehenden Überweisungen bewegen die eigenen Lamports und Tokens des Contracts (sein External-Authority-PDA signiert), nicht die des Nutzers. Damit ein Contract die SPL-Tokens eines Nutzers in ein von ihm kontrolliertes Token-Konto ziehen und wissen kann, wem sie gehören, erteilt der Nutzer eine SPL-Delegation. Ein ERC-20 transfer oder transferFrom an einen Contract schreibt nur das Escrow-Ledger des Wrappers gut und gibt dem Contract kein Token-Konto, aus dem er ausgeben könnte — siehe Integrieren Sie ein Solana-Programm.
transfer_spl hat mehrere Überladungen (einschließlich einer Delegate-Variante für transferFrom Flows); siehe interface.sol. Auf dem gecachten Pfad verwende ISplCached (0xff…05) / IAssociatedSplCached (0xff…06) stattdessen — ein Contract verwendet konsequent nur einen Pfad, und nur der Legacy-Pfad kann aufrufen ein benutzerdefiniertes Programm (siehe Integrieren Sie ein Solana-Programm).
Kontodaten lesen
Lies die Daten beliebiger Solana-Konten über die Lese-Abkürzungen von CpiProgram:
PDA-Ableitung
Finde Program Derived Addresses aus Solidity über das System-Precompile:
Base58-Umwandlung
Konvertiere zwischen bytes32 und Base58 (Solanas Adressformat):
Benutzerdefinierte Solana-Programme aufrufen
Um ein beliebiges Solana-Programm aufzurufen, erstelle die Kontoliste und die Instruktionsdaten selbst:
Wichtige Einschränkungen
Alle Konten müssen im Voraus deklariert werden. Die Solana-Transaktion muss jedes Konto enthalten, das das CPI berühren wird — dynamische Kontenermittlung innerhalb des CPI ist nicht möglich.
CPI-Tiefe begrenzt: 4 Ebenen. Rome EVM → dein Ziel → der Aufruf des Ziels → noch einer. Plane deine Aufruftiefe.
Solana-Pubkeys sind
bytes32, keine 20-Byte-Ethereum-Adressen.Instruktionsdaten sind rohe Bytes im Format, das das Zielprogramm erwartet (typischerweise Borsh, Little-Endian).
Was kommt als Nächstes
Sieh es in einer realen App — cardo sendet CPI-Aufrufe direkt aus der Wallet des Nutzers an das Precompile, ohne Adapter-Contract; rome-dex (Dual-Lane-AMM) macht dasselbe und hat außerdem einen treuhandlosen Router-Contract; aerarium ist eine Lending-App, die keine Solana-Programme aus Solidity aufruft.
Integrieren Sie ein Solana-Programm — die Solana-Identität des Nutzers, das Signieren als sie, die Ein-Pfad-Regel und die Kontobereitstellung für ein echtes Programm auf der anderen Seite
Precompile-Referenz — jeder Selector auf jedem Precompile
Call EVM from Solana — das Gegenteil: EVM-Contracts von einer Solana-Wallet aus steuern
Token-Interop — wie ERC-20- und SPL-Tokens zusammenarbeiten
Beschränkungen — CPI-Tiefe und andere Grenzen
Zuletzt aktualisiert
War das hilfreich?