> For the complete documentation index, see [llms.txt](https://docs.rome.builders/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.rome.builders/ar/albda/architecture.md).

# المعمارية

كيف تتكامل مكوّنات Rome معًا — تنفيذ EVM داخل برنامج Solana.

يضمّ Rome مفسّرًا لبايت كود EVM داخل برنامج على السلسلة في Solana. في مسار مفتاح EVM، يرسل المستخدمون معاملات EVM موقّعة إلى Rome Proxy عبر Ethereum JSON-RPC القياسي. ويقدّم الوكيل هذه المعاملات إلى برنامج Rome EVM على Solana. قد تتطلب معاملة EVM واحدة عدة معاملات Solana لكتابة الأجزاء في حسابات الحامل أو لتشغيل تنفيذ تكراري. في مسار مفتاح Solana v1، يقوم الوكيل بتكوين المعاملة. يوقّع محفظة Solana عليها وترسلها مباشرة إلى Solana RPC. لا توجد طبقة تنفيذ منفصلة يجب مزامنتها — حالة EVM *هو* حالة Solana.

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

<figure><img src="https://1717205515-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F671PKS8ZQSNqtoC8PGvz%2Fuploads%2Fgit-blob-4d7d386c95b500079204f3dea2103d9759c5de8f%2Farchitecture.svg?alt=media" alt="EVM wallet and Solana wallet connected to Rome Proxy with its emulator. The Solana cluster holds the Rome EVM program, per-chain state, external-authority PDA, token accounts, Solana programs and holder accounts. Hercules feeds blocks, receipts and logs back to the proxy."><figcaption></figcaption></figure>

## المكوّنات

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

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

* يستقبل معاملات EVM الموقّعة وأجسام EIP-1559 غير الموقّعة كتعليمات Solana. ويخوّل مفتاح Solana جسمًا غير موقّع عبر توقيع دافع رسوم Solana أو تعليمة تحقق Ed25519
* ينفّذ بايت كود Solidity داخل بيئة تشغيل Solana
* يربط كل عنوان Ethereum ‏(H160) بـ PDA للرصيد لكل سلسلة تحتوي على الـ nonce، والرصيد الأصلي، والرمز. وترتبط PDAs منفصلة للتخزين بـ PDA الرصيد. ولكل عنوان أيضًا عنوان مشتق من البرنامج لامتلاك الصلاحية على استدعاءات Solana، ويُسمّى **عنوان PDA للسلطة الخارجية**. هذه الـ PDA مشتركة بين كل سلسلة على البرنامج. وهي تملك حسابات SPL token الخاصة بالعنوان وتوقّع استدعاءاته بين البرامج (CPIs)
* يعرِض precompiles للاستدعاء إلى Solana ‏(CPI، System، Helper، Withdraw) إلى جانب precompiles الخاصة بـ Ethereum. وتضيف عائلة cached ‏SystemCached (`0xff…04`)، SplCached (`0xff…05`)، ASplCached (`0xff…06`) وWithdrawCached (`0xff…0b`). ينشر المصنع أغلفة على هذا المسار المخبأ
* يخزّن حالة EVM (الأرصدة، nonce، الرمز، التخزين) كبيانات حسابات Solana
* يستضيف برنامج Rome EVM واحد عدة معرّفات سلاسل. ويشكّل معرّف السلسلة جزءًا من عناوين PDA الخاصة بالرصيد والتخزين، لا من PDA الصلاحية الخارجية

### Rome Proxy (خادم JSON-RPC)

Rome Proxy هو خادم Ethereum JSON-RPC قياسي. يتصل المستخدمون بـ `https://hadrian.testnet.romeprotocol.xyz/` لـ Hadrian (شبكة الاختبار) و `https://rubicon.mainnet.romeprotocol.xyz/` لـ Rubicon (الشبكة الرئيسية). وهو يترجم استدعاءات واجهة برمجة تطبيقات Ethereum إلى نشاط Solana:

* `eth_sendRawTransaction` → إرسال معاملة Solana v1 واحدة أو أكثر: ذرّي `DoTx`، وقطع الحامل (`TransmitTx`) بالإضافة إلى `DoTxHolder`، أو مراحل تكرارية. يوقّع دافع مجمّع ويدفع SOL. ويتلقى مستلم رسوم مجمّع غاز المستخدم
* `eth_call` → تشغيل مفسّر EVM محليًا في المحاكي على حسابات Solana الحية المقروءة عبر RPC. يشغّل Mollusk برامج Solana التي يتم الوصول إليها عبر CPI. كما يشغّل برنامج Rome EVM عندما يقيس الوكيل وحدات الحوسبة
* `eth_estimateGas` → المحاكاة لتقدير الغاز. وحدة الغاز هي لامبورت واحد من تكلفة Solana. ولا ينخفض التقدير أبدًا عن 21,000
* `eth_getBalance`, `eth_getCode`, `eth_getTransactionCount`, `eth_getStorageAt` → قراءة حسابات Solana الحية عبر المحاكي. `eth_getBlockByNumber`، والإيصالات والسجلات تأتي من Hercules

كما يوفّر امتدادات Rome: `rome_emulateTx`, `rome_emulateRegRollup`, `rome_mintId`, `rome_buildInfo` و `rome_getResources`. تتضمن طرق محفظة Solana `rome_emulateCallAccounts`, `rome_composeUnsignedAtomicV1`, `rome_composeUnsignedIterativeV1`, `rome_submitSignedV1Plan`, `rome_relayUnsignedV1`, `rome_composeExternalDepositV1` و `rome_sendUnsignedTransaction`. كما يوفّر الوكيل أيضًا `rome_solanaTxForEvmTx`.

### Hercules (المفهرس)

يراقب Hercules برنامج Rome EVM على Solana ويعيد بناء كتل متوافقة مع Ethereum في PostgreSQL. وتحتوي هذه على المعاملات والإيصالات والسجلات وتغييرات الحالة. وعلى السلاسل العامة يعمل في وضع محاذاة بالـ slot، بحيث يطابق رقم الكتلة slotًا في Solana ويُنتج نفس الـ slot نفس الكتلة في أي مفهرس. يقدّم الوكيل هذه الكتل إلى المحافظ والمستكشفات.

يفهرس Hercules الكتل المؤكدة. ويعيد التحقق من كل كتلة عند finalized ويعيد تحميلها إذا تغيّر blockhash. الـ [عبر المستكشف](/ar/alttbyqat-ala-rome/via.md) يقرأ بيانات Hercules.

### Precompiles

يطبّق Rome وظائف ecrecover وSHA-256 وRIPEMD-160 وidentity وعمليات منحنى BN254 وblake2f بدلالات Ethereum، باستثناء بيانات الفشل من BN254 وblake2f. ويُرجع استدعاء BN254 أو blake2f الفاشل بيانات الرجوع الخاصة بـ Rome `Error(string)` بيانات الرجوع بدلًا من مخزن مؤقت فارغ. Modexp (`0x05`) معطّل ويُرجع عند الفشل `"تم تعطيل استدعاء big_mod_exp"`. يرفض blake2f أكثر من 1,000,000 جولة، بينما يسمح Ethereum بذلك.

تتجه precompiles غير الخاصة بـ EVM إلى داخل Solana: **CpiProgram** (`0xFF…08`، وCPI اعتباطي)، **النظام** (`0xFF…07`، واستخراج PDA ومساعدات base58)، **HelperProgram** (`0xFF…09`، وإنشاء ATA/PDA، وتحويلات SPL، والتحويل بين gas وlamports)، و **سحب** (`0x42…16`). عائلة cached هي **SystemCached** (`0xff…04`), **SplCached** (`0xff…05`), **ASplCached** (`0xff…06`، و **WithdrawCached** (`0xff…0b`). تُشغَّل CPIs القديمة فورًا وفقط في المعاملات الذرّية. تُسجَّل CPIs المخبأة أثناء التنفيذ وتُرسل عند الالتزام. وهي ترتدّ مع EVM. ويمكنها العمل في معاملات تكرارية. راجع [عناوين العقود](/ar/almrja/contract-addresses.md) المرجع للجدول الكامل.

## أنماط التنفيذ

ينفّذ Rome معاملة EVM بإحدى طريقتين:

### ذري (VmAt)

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

### تكراري (VmIt)

للعمل الذي يتجاوز ميزانية معاملة واحدة. يُقسَّم التنفيذ عبر عدة معاملات Solana:

1. تشغّل كل خطوة (معاملة Solana) أكبر عدد ممكن من تعليمات EVM البرمجية التي تتسع لها ميزانية الحوسبة — حجم الخطوة متكيف، وليس ثابتًا
2. تُسلسَل حالة VM باستخدام Borsh داخل `StateHolder` حساب بين الخطوات
3. تُقفل الحسابات بقفل TTL لبضع ثوانٍ أثناء التنفيذ

يعود الوكيل إلى التنفيذ التكراري عندما لا تتسع وحدات الحوسبة أو الذاكرة أو عدد التعليمات في معاملة Solana واحدة. وتُحدَّد الجلسة بحد أقصى 160 تكرارًا. ويُرفض CPI في المسار القديم داخل معاملة تكرارية، لأنه لا يمكن تقسيمه عبر المراحل. أما CPIs في المسار cached فمسموح بها.

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

يرتبط كل عنوان Ethereum بشكل حتمي بـ PDA رصيد في Solana مشتق من معرّف السلسلة والعنوان تحت برنامج Rome EVM. ويكون رصيد الغاز الأصلي حقلًا في تلك الـ PDA، إلى جانب nonce ورمز العقد. وتوجد خانات التخزين في PDAs تخزين منفصلة. وتوجد أرصدة SPL في حسابات رموز مملوكة لـ PDA الصلاحية الخارجية المنفصلة. وتُشارك تلك الصلاحية عبر كل سلسلة على البرنامج نفسه.

## طريقتان للدخول

* **مسار مفتاح EVM:** ترسل محفظة معاملة EVM موقّعة بـ secp256k1 إلى Rome Proxy. ويُقدّم الوكيل معاملات Solana.
* **مسار مفتاح Solana:** تخوّل محفظة جسم EIP-1559 غير موقّع بمفتاح Solana الخاص بها. في المسار المباشر v1، يقوم الوكيل بتكوين معاملة Solana. وتوقّعها المحفظة وتقدّمها مباشرة إلى Solana RPC. يستخدم مسار الترحيل الوكيل للإرسال بدلًا من ذلك. أما المسار القديم الأقدم فيجعل المحفظة تبني وتوقّع وتدفع مقابل `DoTxUnsigned` معاملة Solana، ويستخلص البرنامج المرسل من الموقّع في Solana.

يرتبط مفتاح عام في Solana بالعنوان الاصطناعي `keccak256(pubkey)[12:]`، وهي آخر 20 بايت من التجزئة. راجع [كيف يلتقي Solana وEVM على Rome](/ar/almfahym-alasasyh/how-solana-and-evm-meet.md).

## من يوقّع استدعاءً إلى Solana

يوقّع برنامج Rome EVM على CPI باستخدام PDA الصلاحية الخارجية للمتصل المباشر بالـ precompile. ويوقّع العقد بصفته نفسه. ولإنفاق رموز SPL الخاصة بالمستخدم، يحتاج العقد إلى تفويض SPL من ذلك المستخدم. ويمنحه المستخدم بواسطة `HelperProgram.approve_spl(spender, amount, mint)`. ويستخدم استدعاء مباشر من عنوان EVM أو العنوان الاصطناعي الخاص بالمستخدم إلى الـ precompile PDA الصلاحية الخارجية الخاصة بالمستخدم.

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

تُحدَّد معاملات Solana ‏(v1) بحد 4 كيلوبايت، لكن معاملات EVM (خصوصًا نشر العقود) يمكن أن تكون أكبر بكثير. يقسّم Rome المعاملات الكبيرة إلى أجزاء بحجم 3,600 بايت ويكتبها بالتسلسل في **حسابات الحامل** (حتى 80 كيلوبايت). ثم يعيد تجميع كل معاملة وينفّذها على السلسلة. ويدير Rome SDK ذلك بشفافية. وتُحمَّل رسوم توقيع كل جزء على غاز المرسل.

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

لكل سلسلة رمز غاز خاص بها: SOL أو رمز SPL. ومصدر السعر هو Hermes API، أو مجمع Meteora DAMM v1، أو مجمع Meteora DAMM v2، أو سعر ثابت. وهو يوفّر التحويل بين رمز الغاز وSOL لرسوم معاملات Solana الأساسية.

* وحدة غاز واحدة هي لامبورت واحد من تكلفة Solana
* `eth_gasPrice` هو wei رمز الغاز لكل لامبورت
* يدفع المرسل إلى مستلم الرسوم من رصيد الغاز الأصلي لديه. ويدفع دافع الوكيل SOL
* من دون مستلم رسوم، كما في مسار Solana المحفظة الذرّي، لا تُفرض رسوم غاز EVM. وتدفع المحفظة SOL مباشرة
* للرصيد الأصلي 18 خانة عشرية. وهو مدعوم برمز SPL للغاز المحتفَظ به في محفظة برنامج لكل سلسلة

## الحسم النهائي

يستخدم Rome الحسم النهائي في Solana. وينتظر SDK حتى `مؤكَّد`. يعيد Hercules التحقق من كل كتلة مفهرسة عند `مُنهَاة` ويعيد تحميلها إذا تغيّر blockhash.

## ما التالي

* [الشبكات](/ar/alshbkat/networks.md) — اتصل بـ Hadrian (شبكة الاختبار) وRubicon (الشبكة الرئيسية)
* [البدء السريع](/ar/albda/quickstart.md) — انشر عقدك الأول
* [نموذج التنفيذ](/ar/almfahym-alasasyh/execution-model.md) — التنفيذ الذرّي مقابل التنفيذ التكراري بعمق
* [التوافق التشغيلي للرموز](/ar/almfahym-alasasyh/token-interop.md)
* [القيود](/ar/almfahym-alasasyh/constraints.md)
* [استدعِ Solana من EVM](/ar/adlh-almtw-ryn/call-solana-from-evm.md)
* [استدعِ EVM من Solana](/ar/adlh-almtw-ryn/call-evm-from-solana.md)
* [مرجع البرنامج المسبق](/ar/almrja/precompiles.md)
* [كيف يلتقي Solana وEVM على Rome](/ar/almfahym-alasasyh/how-solana-and-evm-meet.md)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

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

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

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

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
