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

يُضمّن بروتوكول روما مفسّر 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:

```
عنوان Ethereum (H160) → PDA = findProgramAddress([address], ROME_EVM_PROGRAM)
```

يمتلك هذا الـ 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 → سولانا مباشرةً                                  | نشر أبسط، زمن وصول أقل     |

## ما التالي

* [بداية سريعة](/ar/albda/quickstart.md) — انشر عقدك الأول
* [نموذج التنفيذ](/ar/almfahym-alasasyh/execution-model.md) — تعمّق في التنفيذ الذري مقابل التنفيذ التكراري
* [ميزانية الحوسبة](/ar/almfahym-alasasyh/compute-budget.md) — فهم تكاليف CU والتحسين


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.rome.builders/ar/albda/architecture.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
