استدعِ Solana من EVM

يتيح لك الـ CPI precompile في Rome أن تستدعي عقود Solidity أي برنامج Solana مباشرةً. يشرح هذا الدليل الآلية.

المتطلبات الأساسية

  • تم تثبيت Rome Solidity SDK: npm install @rome-protocol/solidity-sdk

  • عقد Rome مُنشر (انظر نشر Solidity)

الـ CPI Precompile

الـ CPI precompile عند 0xFF00000000000000000000000000000000000008 يوفّر وظيفتين:

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

// استدعاء برنامج Solana
CpiProgram.invoke(programId, accounts, instructionData);

// الاستدعاء مع توقيع PDA (عقدك يوقّع بصفته PDA)
CpiProgram.invoke_signed(programId, accounts, data, seeds);

مثال أساسي: تحويل 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 {
        // الحصول على PDA للمرسِل
        bytes32 senderPda = RomeEVMAccount.pda(msg.sender);

        // بناء تعليمات التحويل لبرنامج النظام
        ICrossProgramInvocation.AccountMeta[] memory accounts = new ICrossProgramInvocation.AccountMeta[](2);
        accounts[0] = ICrossProgramInvocation.AccountMeta(senderPda, true, true);   // المرسِل (موقّع، قابل للكتابة)
        accounts[1] = ICrossProgramInvocation.AccountMeta(recipient, false, true);   // المستلم (قابل للكتابة)

        // تعليمات التحويل لبرنامج النظام (النوع 2، كمية u64 بترتيب little-endian)
        bytes memory data = abi.encodePacked(uint32(2), lamports);

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

قراءة بيانات الحساب

يتيح لك الـ CPI precompile أيضًا قراءة بيانات أي حساب Solana:

العمل مع رموز SPL

استخدم الـ SPL Token precompile لعمليات الرموز الشائعة:

اشتقاق PDA

العثور على عناوين مشتقة من البرنامج من Solidity:

التحويل إلى Base58

التحويل بين bytes32 وbase58 (صيغة عناوين Solana):

استدعاء برامج Solana المخصّصة

لاستدعاء أي برنامج Solana عشوائي:

القيود الرئيسية

  1. يجب التصريح عن جميع الحسابات مسبقًا. يجب أن تتضمن معاملة Solana كل حساب سيلامسه CPI. لا يمكن اكتشاف الحسابات ديناميكيًا داخل CPI.

  2. الحد الأقصى لعمق CPI: 4 مستويات. Rome EVM → الهدف الخاص بك → استدعاء الهدف → مستوى آخر. خطّط لعمق الاستدعاء بعناية.

  3. مفاتيح Solana العامة هي bytes32. جميع العناوين هي مفاتيح Solana عامة بطول 32 بايت، وليست عناوين Ethereum بطول 20 بايت.

  4. بيانات التعليمات هي bytes خام. تحتاج إلى ترميز بيانات التعليمات بالصيغة التي يتوقعها البرنامج المستهدف (عادةً Borsh-encoded وبترتيب little-endian).

ما التالي

آخر تحديث

هل كان هذا مفيدا؟