EVM von Solana aus aufrufen
Lassen Sie eine Solana-Wallet EVM-Verträge auf Rome steuern — ohne Ethereum-Schlüssel. Die Wallet signiert, und ihre Transaktion geht an Solana.
Das Gegenstück zu Solana von EVM aus aufrufen: Eine Solana-Wallet (z. B. Phantom) ruft direkt einen beliebigen EVM-Contract auf Rome auf, mit ohne Ethereum-Schlüssel. So Aerarium und Rome DEX ermöglichen es Solana-nativen Nutzern, dieselben Contracts wie EVM-Nutzer zu nutzen.
Der Einmalaufruf-Weg ist die des SDKs submitRomeTxSolanaLane; diese Seite erklärt, was es tut.
Synthetische Adressen
Die EVM-Identität einer Solana-Wallet ist ihre synthetische Adresse — die letzten 20 Bytes des keccak256 ihres 32-Byte-Solana-Public-Keys:
synthetic_evm_address = keccak256(solana_pubkey)[12:]Dies ist der msg.sender wenn die Wallet einen Contract aufruft, und die stabile Identität, unter der ihr Nonce und ihr Speicher liegen. Die Ableitung ist im Protokoll fest verankert, sodass eine Wallet immer derselben Adresse zugeordnet wird.
import { syntheticAddress } from "@rome-protocol/sdk";
const from = syntheticAddress(solanaPubkey); // 0x… 20 BytesDas Synthetic ist nur ein Durchleiter — es hält im Ruhezustand keine Tokens
Das ausgebbare Guthaben eines Solana-nativen Nutzers liegt in seiner Solana-Wallet (als SPL-Token), auf der EVM-Seite 1:1 als ERC20SPL-Wrapper (z. B. wUSDC). Das Synthetic hält im Ruhezustand nichts, sodass der Wert fließt durch es — jeder Schritt von der Solana-Wallet signiert:
Bereitstellung (einmalig). Das externe Auth-PDA eines brandneuen Synthetic existiert nicht, bis
create_pdaausgeführt wird — und die untenstehenden Transfers von diesem PDA signiert werden.submitRomeTxSolanaLanestellt es bei der ersten Verwendung automatisch bereit (oder rufeprovisionSyntheticfür einen expliziten „Aktivieren“-Schritt auf; prüfe mitisSyntheticProvisioned).Finanzierungspfad (Wallet → Synthetic). Verschiebe den Token aus dem ATA der Wallet in den des Synthetic — der
ActivateAtaSchritt, erstellt vonbuildFundLeg. Jetztwrapper.balanceOf(synthetic)liest dieses Guthaben, sodass der Synthetic es als gewöhnlichen ERC-20 ausgibt (transfer/transferFrom) — nicht als nativermsg.value, den er nicht hält.Der/die Aufruf(e) (
DoTxUnsigned). Das Synthetic führt die EVM-Transaktion(en) aus — z. B.approvedann ein Vaultdepositdas zieht übertransferFrom.Sweep-Pfad (Synthetic → Wallet). Nachdem ein withdraw / borrow / claim Tokens im Synthetic landen lässt,
buildSweepLegschiebt sie zurück in das ATA der Wallet des Nutzers (HelperProgram.transfer_spl), sodass das Synthetic netto auf null kommt.
Wie der Aufruf gebaut wird
submitRomeTxSolanaLane erledigt all das. Die Mechanik:
Erstelle eine unsignierte EIP-1559-Transaktion mit
von= der synthetischen Adresse — keine secp256k1-Signatur.Konten ermitteln — rufe
rome_emulateCallAccountsmit demvon,to,Daten, undWert(wenn der Aufruf payable ist). Das Übergeben vonWertist wichtig: Der Proxy emuliert den echten Aufruf, sodass jeder wertabhängige Speicher-Schreibvorgang — z. B. ein neuer Mapping-Slot — angelegt wird und sein Solana-Konto zurückgegeben wird. Lässt du es weg, fehlt dieses Konto, und die Transaktion schlägt fehl mit "instruction modified data of a read-only account."Stelle die Solana-Transaktion zusammen: zwei ComputeBudget Anweisungen (Rome's EVM benötigt ein erhöhtes CU-Limit von ca. 1,35 Mio. und einen großen Heap-Frame von ca. 250 KB — Solanas Standardwerte führen zu einem Fehler) + die
DoTxUnsignedAnweisung (das unsignierte RLP + die ermittelten Konten) + der kettenbezogene Treasury-Wallet (die Ausführung zahlt ihr eine kleine Gebühr; die Ermittlung lässt sie weg, daher hängt das SDK sie an).Die Wallet signiert und sendet ab. Die Solana-Wallet signiert die Solana-Transaktion (Ed25519) und sendet sie an das Solana-RPC — nicht an den Proxy. Die Solana-Runtime überprüft die Signatur; on-chain leitet das Programm
msg.senderdaraus den entsprechenden Wert ab. Die Autorität ist die Solana-Signatur, nicht eine Ethereum-Signatur. (Der Proxy wird nur für die Emulation/Ermittlung in Schritt 2 verwendet.)
Das PDA des Nutzers (["EXTERNAL_AUTHORITY", synthetic_address]) besitzt seine Token-Konten und signiert SPL-CPIs in ihrem Namen — sodass ein Solana-Nutzer vollständig aus Phantom heraus bereitstellen, leihen, tauschen und Liquidität bereitstellen kann.
Referenzimplementierungen
Aerarium — steuert Compound v3 (supply / borrow) aus Phantom heraus über
DoTxUnsigned.Rome DEX — die Solana-Lane handelt und stellt Liquidität im selben Pool wie die EVM-Lane bereit.
Beide sind Solana-nativ, ohne Bridge oder zweite Wallet — die synthetische Adresse macht einen Phantom-Schlüssel zu einem vollwertigen EVM-Konto.
Wie geht es weiter
Solana von EVM aus aufrufen — die andere Richtung, via CPI
Token-Interop — wie Guthaben zwischen EVM und Solana geteilt werden
Zuletzt aktualisiert
War das hilfreich?