الاستدعاء عبر البرامج (Cross-Program Invocation أو CPI) هو عندما يستدعي برنامج تعليمة على برنامج آخر أثناء التنفيذ. تتيح CPIs قابلية التركيب: يمكن استدعاء تعليمات أي برنامج بواسطة أي برنامج آخر على الشبكة.
مثال على الاستدعاء عبر البرامج
CPIs بدون موقعي PDA
استخدام دالة invoke، Anchor CpiContext، أمثلة Rust الأصلية، أمثلة CPI لتحويل SOL.
CPIs مع موقعي PDA
استخدام invoke_signed مع بذور الموقع، Anchor CpiContext مع PDA، أمثلة توقيع PDA بلغة Rust الأصلية.
تنفيذ CPI والصلاحيات
تدفق تنفيذ CPI من 11 خطوة، قواعد توسيع الصلاحيات، إعادة الدخول، التحقق من الحساب.
نموذج تكلفة CPI ومزامنة البيانات
صيغة تكلفة CPI، تكاليف التسلسل، مزامنة بيانات الحساب، توقيع PDA، إرجاع البيانات.
حقائق أساسية
- دالتان:
invoke(بدون توقيع PDA) وinvoke_signed(مع توقيع PDA). - توسيع الصلاحيات: صلاحيات الحساب (الموقع، القابل للكتابة) تمتد من المستدعي إلى المستدعى. لا يمكن للمستدعى تصعيد الصلاحيات بما يتجاوز ما مرره المستدعي.
- ميزانية حوسبة مشتركة: استهلاك CU للمستدعى يقلل من الميزانية المتبقية للمستدعي.
- إعادة الدخول: يُسمح بالتكرار الذاتي المباشر (A->A->A). إعادة الدخول غير
المباشرة غير مسموحة (A->B->A يُرجع
ReentrancyNotAllowed).
الحدود
| الحد | القيمة | المصدر |
|---|---|---|
| أقصى عمق لمكدس التعليمات | 5 (9 مع SIMD-0268) | MAX_INSTRUCTION_STACK_DEPTH، MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 |
| تكلفة استدعاء CPI | 1,000 CUs (946 مع SIMD-0339) | DEFAULT_INVOCATION_COST، INVOKE_UNITS_COST_SIMD_0339 |
| أقصى عدد موقعي PDA لكل CPI | 16 | MAX_SIGNERS |
| أقصى حجم لبيانات تعليمة CPI | 10 KiB (10,240 بايت) | MAX_INSTRUCTION_DATA_LEN |
| أقصى حجم للبيانات المُرجعة | 1,024 بايت | MAX_RETURN_DATA |
| أقصى عدد معلومات حساب CPI | 128 (255 مع SIMD-0339)* | MAX_CPI_ACCOUNT_INFOS، MAX_CPI_ACCOUNT_INFOS_SIMD_0339 |
| تكلفة تسلسل CPI | 1 CU لكل 250 بايت | cpi_bytes_per_unit |
| أقصى إعادة تخصيص لبيانات الحساب لكل CPI | 10,240 بايت (10 KiB) | MAX_PERMITTED_DATA_INCREASE |
invoke مقابل invoke_signed
توفر سولانا دالتين لإجراء استدعاءات البرامج المتقاطعة (CPIs):
| الدالة | حالة الاستخدام | توقيع PDA |
|---|---|---|
invoke | استدعاءات البرامج المتقاطعة حيث قام جميع الموقعين المطلوبين بالفعل بتوقيع المعاملة الأصلية | لا |
invoke_signed | استدعاءات البرامج المتقاطعة حيث يحتاج البرنامج المستدعي إلى التوقيع نيابة عن PDA يمتلكه | نعم، عبر بذور الموقع |
في الأساس، تقوم invoke ببساطة باستدعاء invoke_signed مع مصفوفة بذور
موقع فارغة. استخدم invoke عندما لا تحتاج إلى توقيع PDA، واستخدم
invoke_signed عندما يجب على البرنامج تفويض إجراء نيابة عن PDA.
تؤدي كلتا الدالتين في النهاية إلى تشغيل نفس استدعاء النظام
(sol_invoke_signed_rust)
وتتدفقان عبر نفس مسار وقت التشغيل
(cpi_common).
الفرق الوحيد هو ما إذا تم توفير بذور الموقع. عند توفير البذور، يشتق وقت التشغيل
مفاتيح PDA العامة ويضيفها إلى مجموعة الموقعين الصالحين قبل التحقق من الامتيازات.
Is this page helpful?