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

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

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

| الوضع         | الحد الأقصى لـ CU           | ملاحظات                           |
| ------------- | --------------------------- | --------------------------------- |
| ذري (VmAt)    | \~1,400,000 CU              | معاملة سولانا واحدة               |
| تكراري (VmIt) | غير محدود (متعدد المعاملات) | حوالي \~500 opcode لكل خطوة تكرار |

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

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

### عمليات EVM

| العملية                       | CU التقريبية         | ملاحظات                         |
| ----------------------------- | -------------------- | ------------------------------- |
| التحقق من التوقيع (ecrecover) | \~5,000 CU           | secp256k1 عبر نداء نظام سولانا  |
| تحويل بسيط                    | \~50,000-100,000 CU  | تحديثات الرصيد فقط              |
| تحويل ERC-20                  | \~100,000-150,000 CU | يتضمن استدعاء precompile لـ SPL |
| نشر عقد (صغير)                | \~200,000-400,000 CU | يعتمد على حجم bytecode          |
| كتابة التخزين (SSTORE)        | \~5,000-20,000 CU    | وصول بارد مقابل وصول ساخن       |

### عمليات CPI

| العملية                                  | CU التقريبية | ملاحظات                                |
| ---------------------------------------- | ------------ | -------------------------------------- |
| الحد الأدنى للتحميل الزائد لخطاف التحويل | 100,000 CU   | لكل تحويل                              |
| خطاف فرعي أصلي                           | 50,000 CU    | لكل خطاف سولانا أصلي                   |
| خطاف فرعي EVM                            | 200,000 CU   | لكل خطاف EVM                           |
| تحويل EVM موصى به مع الخطافات            | 800,000 CU   | ميزانية آمنة للتحويلات المزودة بخطافات |

### عمليات Precompile

| Precompile      | CU التقريبية     |
| --------------- | ---------------- |
| ecrecover       | \~3,000-5,000 CU |
| SHA-256         | \~1,000 CU       |
| BN254 ecAdd     | \~10,000 CU      |
| BN254 ecMul     | \~40,000 CU      |
| BN254 ecPairing | \~200,000+ CU    |

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

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

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

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

// بعد ذلك: حوالي ~150K 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. قلّل عدد الحسابات

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

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

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

```javascript
// hardhat.config.js
solidity: {
  version: "0.8.28",
  settings: {
    optimizer: { enabled: true, runs: 200 },
  },
}
```

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

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

```bash
cast estimate --rpc-url http://localhost:9090 \
  0xCONTRACT "myFunction(uint256)" 42
```

أو عبر ethers.js:

```javascript
const gas = await contract.myFunction.estimateGas(42);
console.log("الغاز المقدر:", gas.toString());
```

## ما التالي

* [القيود](/ar/almfahym-alasasyh/constraints.md) — القائمة الكاملة للحدود والقيود
* [دليل تحسين CU](https://github.com/rome-protocol/docs/blob/main/developer-guides/cu-optimization.md) — دليل تحسين مفصل


---

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