> 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/almfahym-alasasyh/compute-budget.md).

# ميزانية الحوسبة

تكاليف وحدة الحوسبة (CU) في Solana لعمليات Rome EVM — الميزانيات الذرّية مقابل التكرارية وكيفية تصميم عقود Solidity فعّالة في استخدام CU.

تحتوي كل معاملة في Solana على ميزانية حوسبة تُقاس بوحدات الحوسبة (CU). إن فهم تكاليف CU يساعدك على تصميم عقود Rome بكفاءة.

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

| الوضع         | الحد الأقصى لوحدات CU                                           | ملاحظات                                                                                                 |
| ------------- | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| ذري (VmAt)    | حوالي 1,400,000 CU                                              | معاملة Solana واحدة                                                                                     |
| تكراري (VmIt) | حتى حوالي 1,400,000 CU لكل مرحلة؛ بحد أقصى 160 تكرارًا لكل جلسة | كل مرحلة هي معاملة Solana مستقلة؛ تعليمات برمجية تكيفية/خطوة — تُحزَّم ضمن ميزانية CU الخاصة بكل معاملة |

تملك كل معاملة في Solana ميزانية افتراضية قدرها 200,000 CU، ويمكن توسيعها إلى حوالي 1.4 مليون CU عبر تعليمات ميزانية الحوسبة (تُضاف تلقائيًا بواسطة Rome SDK).

التنفيذ التكراري ليس غير محدود. تنتهي جلسة واحدة بعد 160 تكرارًا، ويخطط المُركِّب التكراري في Rust Rome SDK لما يصل إلى 128 مرحلة كحد أقصى. الخطة التي يوقّعها المحفظة بنفسها تمر عبر `rome_submitSignedV1Plan`، والذي يقبل بحد أقصى 64 معاملة لكل استدعاء. تحتاج معظم الاستدعاءات إلى عدد أقل بكثير. تُرفض استدعاءات CPIs ذات المسار القديم داخل جلسة تكرارية، لذا يجب أن يندرج أي استدعاء ينفذها ضمن الميزانية الذرية. انظر [الاستدعاءات المُرحَّلة والاستدعاءات الطويلة](/ar/adlh-almtw-ryn/call-evm-from-solana.md#relayed-calls-and-long-calls) و [القيود](/ar/almfahym-alasasyh/constraints.md).

## تقديرات تكلفة CU

### عمليات EVM

| العملية                             | CU التقريبي              | ملاحظات                                                                              |
| ----------------------------------- | ------------------------ | ------------------------------------------------------------------------------------ |
| فحص توقيع المعاملة (مسار مفتاح EVM) | حوالي 25,000 CU          | الـ `secp256k1_recover` استدعاء syscall، بنفس تكلفة `ecrecover` الـ precompile أدناه |
| تحويل بسيط                          | حوالي 50,000-100,000 CU  | تحديث الأرصدة فقط                                                                    |
| تحويل ERC-20                        | حوالي 100,000-150,000 CU | يتضمن استدعاء SPL precompile                                                         |
| نشر عقد (صغير)                      | حوالي 200,000-400,000 CU | يعتمد على حجم البايت كود                                                             |
| كتابة إلى التخزين (SSTORE)          | حوالي 5,000-20,000 CU    | الوصول البارد مقابل الدافئ                                                           |

### عمليات Precompile

| البرنامج المسبق | CU التقريبي                                          | ملاحظات                                                                                                                                                                                                                                     |
| --------------- | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ecrecover       | حوالي 25,700 CU                                      |                                                                                                                                                                                                                                             |
| SHA-256         | حوالي 257 CU لكل كلمة بحجم 32 بايت مقاسة             | إضافة إلى تكلفة ثابتة صغيرة. تُسعِّر المنصة SHA-256 وRIPEMD-160 وprecompile الهوية باستخدام رقم مشترك واحد لكل كلمة يبلغ نحو 2,200 CU، وهو مضبوط على RIPEMD-160، الأكثر كلفة من بين الثلاثة، لذا تُحاسَب استدعاءة SHA-256 بأكثر مما تستهلكه |
| BN254 ecAdd     | قريب من 0 CU                                         | أرخص من نسخ 32 بايت                                                                                                                                                                                                                         |
| BN254 ecMul     | حوالي 4,200 CU                                       |                                                                                                                                                                                                                                             |
| BN254 ecPairing | حوالي 22,000 CU بالإضافة إلى حوالي 12,800 CU لكل زوج | فحص من أربعة أزواج يستهلك حوالي 73,000 CU، وهو ضمن معاملة ذرية واحدة بسهولة                                                                                                                                                                 |

تأتي هذه الأرقام من المعايرة الخاصة بالبرنامج نفسه، والتي استخدمت وحدات الحوسبة المقروءة من عقدة Solana على نشر في testnet. لم تُقَس من جديد لهذه الصفحة؛ قِس استدعاءك بنفسك باستخدام `computeUnitsConsumed`.

## تقنيات التحسين

### 1. استخدم Yul للمسارات الساخنة

ينتج مُحسّن Solidity شيفرة معقولة، لكن Yul (التجميع المضمَّن) يمكنه تقليل CU بشكل ملحوظ للعمليات الحرجة:

```solidity
// قبل: حوالي 600 ألف CU
function createPairAccount(bytes32 token0, bytes32 token1) external {
    // عمليات على مستوى Solidity
}

// بعد: حوالي 150 ألف CU (تحسين Yul)
function createPairAccount(bytes32 token0, bytes32 token1) external {
    assembly {
        // معالجة مباشرة للذاكرة، وتخطي عبء ترميز ABI
    }
}
```

### 2. خزّن مشتقات PDA مؤقتًا

استخراج PDA عبر `find_program_address` مكلف. خزّن PDAs المشتقة في تخزين العقد بدلًا من حسابها في كل استدعاء:

```solidity
mapping(address => bytes32) private cachedPdas;

function getPda(address user) internal returns (bytes32) {
    bytes32 cached = cachedPdas[user];
    if (cached != bytes32(0)) return cached;

    bytes32 pda = RomeEVMAccount.pda(user);
    cachedPdas[user] = pda;
    return pda;
}
```

### 3. ثبّت معرّفات البرامج المعروفة

لا تُحمِّل معرّفات البرامج من التخزين — استخدم ثوابت:

```solidity
// مكلف: يقرأ من التخزين
bytes32 splTokenProgram = storage_program_id;

// رخيص: ثابت وقت الترجمة
bytes32 constant SPL_TOKEN_PROGRAM = 0x06ddf6e1d765a193d9cbe146ceeb79ac1cb485ed5f5b37913a8cf5857eff00a9;
```

### 4. قلّل عدد الحسابات

كل حساب في معاملة Solana يضيف عبئًا إضافيًا على CU. قلّل عدد الحسابات عبر:

* تجميع العمليات التي تشترك في الحسابات
* استخدام عدد أقل من الحسابات الوسيطة
* تجنب فحوصات إنشاء ATA الزائدة

### 5. استخدم إعدادات المحسّن

```typescript
// hardhat.config.ts — فعّل المحسّن في ملف تعريف بناء
solidity: {
  profiles: {
    default: { version: "0.8.28" },
    production: {
      version: "0.8.28",
      settings: { optimizer: { enabled: true, runs: 200 } },
    },
  },
}
```

ابنِ باستخدام `npx hardhat compile --build-profile production`.

## قياس استهلاك CU

استخدم `eth_estimateGas` لقياس CU قبل الإرسال:

```bash
cast estimate --rpc-url https://hadrian.testnet.romeprotocol.xyz/ \\
  0xCONTRACT "myFunction(uint256)" 42
```

أو عبر ethers.js:

```javascript
const gas = await contract.myFunction.estimateGas(42);
console.log("Estimated gas:", gas.toString());
```

## ما التالي

* [القيود](/ar/almfahym-alasasyh/constraints.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/almfahym-alasasyh/compute-budget.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.
