Вызов Solana из EVM
Вызывайте программы Solana из Solidity через CPI и вспомогательные пре-компилы Rome.
Предкомпилированные контракты Rome позволяют контрактам Solidity напрямую вызывать программы Solana. В этом руководстве рассматриваются механизмы.
Требования
Интерфейсы Rome Solidity из публичного
rome-solidityрепозитория (публикация в npm ожидается) — интерфейсы предкомпиляции находятся вcontracts/interface.solРазвернутый контракт Rome (см. Развертывание Solidity)
Привяжите каждый интерфейс к его адресу предкомпиляции:
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);Предкомпиляция CpiProgram
CpiProgram (0xFF…08) выполняет CPI (invoke / invoke_signed) а также сокращенные способы чтения состояния (account_info, account_data_at, account_u64_at, account_lamports, pdas_batch_derive):
// Вызов программы Solana
CpiProgram.invoke(programId, accounts, instructionData);
// Вызов с подписью PDA (ваш контракт подписывает как PDA)
CpiProgram.invoke_signed(programId, accounts, data, seeds);Перевод lamports
Для простых переводов SOL/lamports и SPL из PDA вызывающей стороны используйте предкомпиляцию HelperProgram — вручную собирать CPI не требуется:
transfer_spl имеет несколько перегрузок (включая вариант delegate для transferFrom потоков); см. interface.sol. В кэшированном варианте используйте ISplCached (0xff…05) / IAssociatedSplCached (0xff…06) вместо этого — контракт должен последовательно использовать один вариант.
Чтение данных аккаунта
Читайте данные любого аккаунта Solana с помощью сокращенных способов чтения CpiProgram:
Получение PDA
Находите Program Derived Address из Solidity через предкомпиляцию System:
Преобразование Base58
Преобразование между bytes32 и base58 (формат адресов Solana):
Вызов пользовательских программ Solana
Чтобы вызвать любую программу Solana, самостоятельно сформируйте список аккаунтов и данные инструкции:
Ключевые ограничения
Все аккаунты должны быть объявлены заранее. Транзакция Solana должна включать каждый аккаунт, к которому обратится CPI — динамическое обнаружение аккаунтов внутри CPI невозможно.
Ограничение глубины CPI: 4 уровня. Rome EVM → ваша цель → вызов цели → еще один уровень. Планируйте глубину вызовов.
Pubkey Solana — это
bytes32, не 20-байтные адреса Ethereum.Данные инструкции — это необработанные байты в формате, который ожидает целевая программа (обычно Borsh, little-endian).
Что дальше
Вызов EVM из Solana — обратный сценарий: управлять контрактами EVM из кошелька Solana
Совместимость токенов — как взаимодействуют токены ERC-20 и SPL
Ограничения — глубина CPI и другие ограничения
Последнее обновление
Это было полезно?