عناوين Program Derived Addresses (PDAs) هي عناوين حسابات بحجم 32 بايت يتم
اشتقاقها بشكل حتمي من معرف برنامج ومجموعة من seeds. يُضمن أنها لا تقع على منحنى
Ed25519، مما يعني عدم وجود مفتاح خاص لها. فقط البرنامج الذي تم استخدام معرفه في
الاشتقاق يمكنه "التوقيع" لـ PDA، ويقوم بذلك من خلال
invoke_signed أثناء استدعاءات البرامج المتقاطعة (CPIs).
Program Derived Address
اشتقاق PDA
خوارزمية الاشتقاق، canonical bump، أمثلة findProgramAddress مع أنواع seeds مختلفة.
حسابات PDA
إنشاء حسابات على عناوين PDA، توقيع invoke_signed، أنماط Anchor.
حقائق أساسية
- حتمي: نفس seeds ومعرف البرنامج ينتجان دائماً نفس العنوان.
- خارج المنحنى: يتم التحقق من أن العنوان المشتق ليس مفتاحاً عاماً صالحاً لـ Ed25519. إذا وقع الـ hash على المنحنى، يفشل الاشتقاق ويتم تجربة bump seed مختلف.
- لا يوجد مفتاح خاص: نظراً لأن العنوان خارج المنحنى، لا يمكن لأحد إنتاج
توقيع تشفيري له. يقوم البرنامج بـ "التوقيع" عبر آلية
invoke_signedالخاصة بوقت التشغيل بدلاً من ذلك.
متى تستخدم PDAs
- عنونة حتمية: اشتق نفس الحساب من نفس seeds في كل مرة.
- توقيع البرنامج: فقط البرنامج المالك يمكنه التوقيع عبر
invoke_signed، مما يمكّن البرامج من العمل كسلطات مستقلة. - حالة محددة للمستخدم: اشتق حسابات لكل مستخدم من seeds مفتاح المستخدم العام
(مثل
["user", user_pubkey]). - لا توجد إدارة keypair: لا يوجد مفتاح خاص لتخزينه أو فقدانه. يتم اشتقاق العنوان بشكل كامل من seeds.
الحدود
| الحد | القيمة | المصدر |
|---|---|---|
| الحد الأقصى للـ seeds | 16 | MAX_SEEDS |
| الحد الأقصى لطول الـ seed | 32 بايت كحد أقصى لكل seed | MAX_SEED_LEN |
| نطاق الـ bump | 0-255 (1 بايت) | يُضاف كعنصر seed نهائي |
تكلفة create_program_address | 1,500 وحدة حسابية | create_program_address_units |
أسوأ تكلفة لـ find_program_address | 1,500 عند الدخول + 1,500 × التكرارات | 1,500 عند الدخول + 1,500 لكل bump فاشل |
| الحد الأقصى لموقعي PDA لكل CPI | 16 | MAX_SIGNERS |
Is this page helpful?