البنية المعمارية

يُضمّن بروتوكول روما مفسّر bytecode لـ EVM داخل برنامج على السلسلة في سولانا. تشرح هذه الصفحة كيفية ترابط المكوّنات معًا.

نظرة عامة على النظام

┌─────────────────────────────────────────────────────────────────┐
│                        طبقة المستخدم                             │
│   MetaMask / ethers.js / Hardhat / Foundry                      │
│   (Ethereum JSON-RPC القياسي)                                   │
└──────────────────────┬──────────────────────────────────────────┘

            ┌──────────┴──────────┐
            ▼                     ▼
   ┌────────────────┐    ┌────────────────┐
   │  Rome Proxy    │    │   OP-Geth      │
   │  (:9090)       │    │   (:8545)      │
   │  JSON-RPC      │    │   EVM RPC      │
   └───────┬────────┘    └───────┬────────┘
           │                     │
           │              ┌──────┴──────┐
           │              │    Rhea     │  (يُرحِّل معاملات geth إلى سولانا)
           │              └──────┬──────┘
           │                     │
           └──────────┬──────────┘

   ┌──────────────────────────────────────────────────────────────┐
   │                    وقت تشغيل سولانا                            │
   │                                                              │
   │   ┌──────────────────────────────────────────────────┐       │
   │   │              برنامج Rome EVM                     │       │
   │   │                                                   │       │
   │   │   مفسّر Bytecode لـ EVM (نسخة مشتقة من SputnikVM) │       │
   │   │   تعيين الحسابات: H160 → Solana PDA              │       │
   │   │   Precompiles: ecrecover, BN254, SPL, CPI, إلخ.   │       │
   │   └───────────────────────┬───────────────────────────┘       │
   │                           │ CPI                               │
   │   ┌───────────┬───────────┼───────────┬───────────┐          │
   │   │رمز SPL    │ Jupiter   │ Kamino    │ Meteora   │  ...     │
   │   └───────────┴───────────┴───────────┴───────────┘          │
   └──────────────────────────────────────────────────────────────┘

                      │ يفهرس الأحداث
               ┌──────┴──────┐
               │  Hercules   │  (فهرس كتل → Engine API → OP-Geth)
               └─────────────┘

المكونات

برنامج Rome EVM (على السلسلة)

جوهر Rome — برنامج BPF على سولانا يحتوي على مفسّر كامل لـ EVM bytecode (نسخة مشتقة من SputnikVM). وهو:

  • يستقبل معاملات EVM المُسلسلة من تعليمات سولانا

  • ينفّذ bytecode الخاص بـ Solidity داخل وقت تشغيل سولانا

  • يربط عناوين Ethereum (H160) بـ Solana PDAs

  • يوفّر واجهات precompile لـ CPI وSPL Token وSystem Program

  • يدير حالة EVM (تخزين العقود، الأرصدة، nonce) كبيانات حسابات سولانا

Rome Proxy (خادم JSON-RPC)

خادم Ethereum JSON-RPC قياسي على المنفذ 9090 يترجم استدعاءات Ethereum API إلى معاملات سولانا:

  • eth_sendRawTransaction → تسلسل معاملة EVM → إرسال تعليمات إلى سولانا

  • eth_call → محاكاة تنفيذ EVM خارج السلسلة (عبر محاكي Mollusk SVM)

  • eth_estimateGas → محاكاة التنفيذ لتقدير gas

  • eth_getBalance, eth_getCode, إلخ. → القراءة من بيانات حسابات سولانا

امتدادات Rome: rome_emulateTx, rome_emulateRegRollup, rome_mintId, rome_buildInfo, rome_getResources.

OP-Geth (طبقة RPC اختيارية لـ EVM)

عميل Go-Ethereum معدّل يوفّر توافقًا كاملًا مع Ethereum RPC. في وضع op-geth:

  1. يرسل المستخدمون المعاملات إلى OP-Geth (:8545)

  2. تقوم Rhea بتمرير المعاملات إلى Rome Proxy → سولانا

  3. يفهرس Hercules أحداث سولانا ويغذي كتل EVM إلى OP-Geth عبر Engine API (:8551)

في وضع الحالة الواحدة، يتصل المستخدمون مباشرةً بـ Rome Proxy (:9090)، متجاوزين OP-Geth بالكامل.

Hercules (المفهرس)

يراقب برنامج Rome EVM على سولانا ويُنتج بيانات كتل متوافقة مع EVM:

  • يرصد أحداث برنامج Rome على سولانا

  • يعيد بناء كتل EVM مع إيصالات المعاملات والسجلات وتغييرات الحالة

  • يُغذي الكتل إلى OP-Geth عبر Engine API لتحقيق توافق قياسي مع مستكشفات الكتل

  • مدعوم بواسطة PostgreSQL

Rhea (جسر الـ Mempool)

يجسر الـ mempool الخاص بـ OP-Geth مع سولانا:

  • يقرأ المعاملات المعلّقة من mempool الخاص بـ OP-Geth

  • يلفّها كتعليمات سولانا تستهدف برنامج Rome EVM

  • يرسلها إلى سولانا للتنفيذ

أوضاع التنفيذ

يدعم Rome وضعين لتنفيذ معاملات EVM:

التنفيذ الذرّي (VmAt)

معاملة سولانا واحدة. تُنفَّذ معاملة EVM بالكامل ضمن ميزانية الحوسبة لمعاملة سولانا واحدة (~1.4 مليون وحدة حوسبة). يُستخدم لمعظم العمليات — التحويلات، استدعاءات العقود البسيطة، المبادلات.

التنفيذ التكراري (VmIt)

للعمليات كثيفة الحوسبة التي تتجاوز ميزانية معاملة واحدة. يتم تقسيم تنفيذ EVM عبر عدة معاملات سولانا:

  1. تنفّذ كل خطوة حوالي 500 عملية EVM opcode

  2. تُسلسَل حالة VM باستخدام Borsh إلى StateHolder حساب بين الخطوات

  3. تُقفل الحسابات باستخدام TTL لمدة 3-4 ثوانٍ أثناء التنفيذ

  4. يُستخدم للعمليات الثقيلة مثل BN254 pairing (التحقق من إثبات ZK)

تعيين الحسابات

كل عنوان Ethereum (20 بايت) يُطابق PDA في سولانا (32 بايت) مشتقًا من برنامج Rome EVM:

يمتلك هذا الـ PDA ما يخص الحساب من:

  • رصيد ETH/الرمز (كحسابات رموز SPL)

  • Bytecode العقد (مخزّن في بيانات حسابات سولانا)

  • خانات تخزين العقد (مخزّنة في بيانات حسابات سولانا)

  • nonce

حسابات الحامل

تُقيَّد معاملات سولانا بـ 1,232 بايت. يمكن أن تكون معاملات EVM (خاصة نشر العقود) أكبر بكثير. يعالج Rome هذا باستخدام حسابات الحامل:

  1. تُقسَّم معاملات EVM الكبيرة إلى أجزاء

  2. تُرحَّل الأجزاء بالتتابع إلى حساب حامل (الحد الأقصى 80 كيلوبايت)

  3. بعد كتابة جميع الأجزاء، تُجمَّع المعاملة الكاملة وتُنفَّذ

  4. تتم إدارة ذلك بشفافية بواسطة Rome SDK

الغاز والتسعير

كل تطبيق (chain ID) على Rome لديه رمز gas خاص به — أي رمز SPL. يستخدم تسعير الغاز مجمعات Meteora DAMM V1 للتحويل بين رمز الغاز وSOL لرسوم معاملات سولانا الأساسية.

أوضاع النشر

الوضع
تدفق البيانات
حالة الاستخدام

وضع OP-Geth

المستخدمون → OP-Geth → Rhea → Proxy → سولانا؛ ويعود Hercules للفهرسة

توافق كامل مع Ethereum RPC

وضع الحالة الواحدة

المستخدمون → Proxy → سولانا مباشرةً

نشر أبسط، زمن وصول أقل

ما التالي

آخر تحديث

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