البرامج
على سولانا، تُسمى "العقود الذكية" برامج. البرامج يتم نشرها على السلسلة في حسابات تحتوي على الملف الثنائي القابل للتنفيذ المُجمّع للبرنامج. يتفاعل المستخدمون مع البرامج عن طريق إرسال معاملات تحتوي على تعليمات تخبر البرنامج بما يجب فعله.
النقاط الرئيسية
- البرامج هي حسابات تحتوي على رمز قابل للتنفيذ، منظم في وظائف تسمى تعليمات.
- بينما البرامج بلا حالة، يمكنها أن تتضمن تعليمات تقوم بإنشاء وتحديث حسابات أخرى لتخزين البيانات.
- سلطة الترقية يمكنها تحديث البرامج. بمجرد إزالة هذه السلطة، يصبح البرنامج غير قابل للتعديل.
- يمكن للمستخدمين التحقق من أن بيانات حساب البرنامج على السلسلة تطابق الشفرة المصدرية العامة من خلال عمليات البناء القابلة للتحقق.
كتابة برامج سولانا
تُكتب برامج سولانا بشكل أساسي بلغة البرمجة Rust، مع نهجين شائعين للتطوير:
-
Anchor: إطار عمل مصمم لتطوير برامج سولانا. يوفر طريقة أسرع وأبسط لكتابة البرامج، باستخدام وحدات ماكرو Rust لتقليل الشيفرة المتكررة. للمبتدئين، يُنصح بالبدء بإطار عمل Anchor.
-
Rust الأصلي: يتضمن هذا النهج كتابة برامج سولانا بلغة Rust دون الاستفادة من أي أطر عمل. يوفر مرونة أكبر ولكنه يأتي مع زيادة في التعقيد.
تحديث برامج سولانا
لمعرفة المزيد حول نشر وترقية البرامج، راجع صفحة نشر البرامج.
يمكن تعديل البرامج مباشرة بواسطة حساب معين كـ "سلطة الترقية"، والذي عادة ما يكون الحساب الذي قام بنشر البرنامج في الأصل. إذا تم إلغاء سلطة الترقية وتعيينها إلى null، يصبح البرنامج غير قابل للتعديل ولا يمكن تحديثه بعد ذلك.
البرامج القابلة للتحقق
تتيح عمليات البناء القابلة للتحقق لأي شخص التحقق مما إذا كان كود البرنامج على السلسلة يتطابق مع كود المصدر العام الخاص به، مما يجعل من الممكن اكتشاف التناقضات بين المصدر والإصدارات المنشورة.
قدم مجتمع مطوري سولانا أدوات لدعم عمليات البناء القابلة للتحقق، مما يمكن كلاً من المطورين والمستخدمين من التحقق من أن البرامج على السلسلة تعكس بدقة كود المصدر المشترك علنًا.
-
البحث عن البرامج المتحقق منها: للتحقق بسرعة من البرامج المتحقق منها، يمكن للمستخدمين البحث عن عنوان البرنامج على مستكشف سولانا. شاهد مثالاً على برنامج متحقق منه هنا.
-
أدوات التحقق: تمكن واجهة سطر أوامر البناء القابل للتحقق من سولانا من Ellipsis Labs المستخدمين من التحقق بشكل مستقل من البرامج على السلسلة مقابل كود المصدر المنشور.
-
دعم عمليات البناء القابلة للتحقق في Anchor: يوفر Anchor دعمًا مدمجًا لعمليات البناء القابلة للتحقق. يمكن العثور على التفاصيل في وثائق Anchor.
مرشح حزم بيركلي (BPF)
تستخدم سولانا LLVM (آلة افتراضية منخفضة المستوى) لتجميع البرامج إلى ملفات ELF (تنسيق قابل للتنفيذ والربط). تحتوي هذه الملفات على إصدار سولانا المخصص من شفرة بايت eBPF، المسماة "تنسيق بايت كود سولانا" (sBPF). يحتوي ملف ELF على الشفرة الثنائية للبرنامج ويتم تخزينه على السلسلة في حساب قابل للتنفيذ عند نشر البرنامج.
البرامج المدمجة
برامج التحميل
كل برنامج مملوك بواسطة برنامج آخر، وهو برنامج التحميل الخاص به. حاليًا، توجد خمسة برامج تحميل:
برنامج التحميل | معرف البرنامج | ملاحظات | رابط التعليمات |
---|---|---|---|
native | NativeLoader1111111111111111111111111111111 | يمتلك برامج التحميل الأربعة الأخرى | — |
v1 | BPFLoader1111111111111111111111111111111111 | تم تعطيل تعليمات الإدارة، لكن البرامج لا تزال قيد التنفيذ | — |
v2 | BPFLoader2111111111111111111111111111111111 | تم تعطيل تعليمات الإدارة، لكن البرامج لا تزال قيد التنفيذ | التعليمات |
v3 | BPFLoaderUpgradeab1e11111111111111111111111 | يجري التخلص منه تدريجيًا | التعليمات |
v4 | LoaderV411111111111111111111111111111111111 | من المتوقع أن يصبح v4 برنامج التحميل القياسي | التعليمات |
هذه المحمّلات ضرورية لإنشاء وإدارة البرامج المخصصة:
- نشر برنامج جديد أو مخزن مؤقت
- إغلاق برنامج أو مخزن مؤقت
- إعادة نشر / ترقية برنامج موجود
- نقل السلطة على برنامج
- إنهاء برنامج
يدعم Loader-v3 و loader-v4 إجراء تعديلات على البرامج بعد نشرها الأولي. يتم تنظيم الإذن للقيام بذلك من خلال سلطة البرنامج لأن ملكية الحساب لكل برنامج تكون مع المحمّل.
البرامج المُسبقة التجميع
برنامج Ed25519
البرنامج | معرّف البرنامج | الوصف | التعليمات |
---|---|---|---|
برنامج Ed25519 | Ed25519SigVerify111111111111111111111111111 | يتحقق من توقيعات ed25519. إذا فشل أي توقيع، يتم إرجاع خطأ. | التعليمات |
يعالج برنامج ed25519 تعليمة واحدة. أول u8
هو عدد التوقيعات المراد التحقق منها،
متبوعًا ببايت واحد للحشو. بعد ذلك، يتم تسلسل البنية التالية، واحدة لكل توقيع يجب
التحقق منه.
struct Ed25519SignatureOffsets {signature_offset: u16, // offset to ed25519 signature of 64 bytessignature_instruction_index: u16, // instruction index to find signaturepublic_key_offset: u16, // offset to public key of 32 bytespublic_key_instruction_index: u16, // instruction index to find public keymessage_data_offset: u16, // offset to start of message datamessage_data_size: u16, // size of message datamessage_instruction_index: u16, // index of instruction data to get message data}
الشفرة الزائفة لعملية التحقق من التوقيع:
process_instruction() {for i in 0..count {// i'th index values referenced:instructions = &transaction.message().instructionsinstruction_index = ed25519_signature_instruction_index != u16::MAX ? ed25519_signature_instruction_index : current_instruction;signature = instructions[instruction_index].data[ed25519_signature_offset..ed25519_signature_offset + 64]instruction_index = ed25519_pubkey_instruction_index != u16::MAX ? ed25519_pubkey_instruction_index : current_instruction;pubkey = instructions[instruction_index].data[ed25519_pubkey_offset..ed25519_pubkey_offset + 32]instruction_index = ed25519_message_instruction_index != u16::MAX ? ed25519_message_instruction_index : current_instruction;message = instructions[instruction_index].data[ed25519_message_data_offset..ed25519_message_data_offset + ed25519_message_data_size]if pubkey.verify(signature, message) != Success {return Error}}return Success}
برنامج Secp256k1
البرنامج | معرّف البرنامج | الوصف | التعليمات |
---|---|---|---|
برنامج Secp256k1 | KeccakSecp256k11111111111111111111111111111 | يتحقق من عمليات استرداد المفتاح العام secp256k1 (ecrecover). | التعليمات |
يعالج برنامج secp256k1 تعليمة تأخذ كبايت أول عدد البنى التالية المتسلسلة في بيانات التعليمة:
struct Secp256k1SignatureOffsets {secp_signature_offset: u16, // offset to [signature,recovery_id] of 64+1 bytessecp_signature_instruction_index: u8, // instruction index to find signaturesecp_pubkey_offset: u16, // offset to ethereum_address pubkey of 20 bytessecp_pubkey_instruction_index: u8, // instruction index to find pubkeysecp_message_data_offset: u16, // offset to start of message datasecp_message_data_size: u16, // size of message datasecp_message_instruction_index: u8, // instruction index to find message data}
الشفرة الزائفة لعملية التحقق من الاسترداد:
process_instruction() {for i in 0..count {// i'th index values referenced:instructions = &transaction.message().instructionssignature = instructions[secp_signature_instruction_index].data[secp_signature_offset..secp_signature_offset + 64]recovery_id = instructions[secp_signature_instruction_index].data[secp_signature_offset + 64]ref_eth_pubkey = instructions[secp_pubkey_instruction_index].data[secp_pubkey_offset..secp_pubkey_offset + 20]message_hash = keccak256(instructions[secp_message_instruction_index].data[secp_message_data_offset..secp_message_data_offset + secp_message_data_size])pubkey = ecrecover(signature, recovery_id, message_hash)eth_pubkey = keccak256(pubkey[1..])[12..]if eth_pubkey != ref_eth_pubkey {return Error}}return Success}
هذا يسمح للمستخدم بتحديد أي بيانات تعليمات في المعاملة لبيانات التوقيع والرسالة. من خلال تحديد متغير نظام تعليمات خاص، يمكن للمستخدم أيضًا استلام بيانات من المعاملة نفسها.
ستحسب تكلفة المعاملة عدد التوقيعات المراد التحقق منها مضروبًا في مضاعف تكلفة التحقق من التوقيع.
برنامج Secp256r1
البرنامج | معرف البرنامج | الوصف | التعليمات |
---|---|---|---|
برنامج Secp256r1 | Secp256r1SigVerify1111111111111111111111111 | يتحقق من صحة ما يصل إلى 8 توقيعات secp256r1. يأخذ التوقيع والمفتاح العام والرسالة. يعيد خطأ في حالة فشل أي منها. | التعليمات |
يعالج برنامج secp256r1 تعليمة. البايت الأول u8
هو عدد التوقيعات المراد التحقق
منها، يليه بايت واحد للحشو. بعد ذلك، يتم تسلسل البنية التالية، واحدة لكل توقيع
للتحقق:
struct Secp256r1SignatureOffsets {signature_offset: u16, // offset to compact secp256r1 signature of 64 bytessignature_instruction_index: u16, // instruction index to find signaturepublic_key_offset: u16, // offset to compressed public key of 33 bytespublic_key_instruction_index: u16, // instruction index to find public keymessage_data_offset: u16, // offset to start of message datamessage_data_size: u16, // size of message datamessage_instruction_index: u16, // index of instruction data to get message data}
الشفرة الزائفة للتحقق من التوقيع:
process_instruction() {if data.len() < SIGNATURE_OFFSETS_START {return Error}num_signatures = data[0] as usizeif num_signatures == 0 || num_signatures > 8 {return Error}expected_data_size = num_signatures * SIGNATURE_OFFSETS_SERIALIZED_SIZE + SIGNATURE_OFFSETS_STARTif data.len() < expected_data_size {return Error}for i in 0..num_signatures {offsets = parse_signature_offsets(data, i)signature = get_data_slice(data, instruction_datas, offsets.signature_instruction_index, offsets.signature_offset, SIGNATURE_SERIALIZED_SIZE)if s > half_curve_order {return Error}pubkey = get_data_slice(data, instruction_datas, offsets.public_key_instruction_index, offsets.public_key_offset, COMPRESSED_PUBKEY_SERIALIZED_SIZE)message = get_data_slice(data, instruction_datas, offsets.message_instruction_index, offsets.message_data_offset, offsets.message_data_size)if !verify_signature(signature, pubkey, message) {return Error}}return Success}
ملاحظة: يتم فرض قيم S المنخفضة لجميع التوقيعات لتجنب قابلية التلاعب العرضي بالتوقيع.
البرامج الأساسية
يتضمن تكوين شبكة سولانا قائمة من البرامج الخاصة التي توفر وظائف أساسية للشبكة. تاريخيًا، كان يشار إليها باسم "البرامج الأصلية" وكانت توزع مع كود validator.
البرنامج | معرف البرنامج | الوصف | التعليمات |
---|---|---|---|
System Program | 11111111111111111111111111111111 | إنشاء حسابات جديدة، وتخصيص بيانات الحساب، وتعيين الحسابات للبرامج المالكة، ونقل lamport من الحسابات المملوكة لـ System Program، ودفع رسوم المعاملات. | SystemInstruction |
برنامج التصويت | Vote111111111111111111111111111111111111111 | إنشاء وإدارة الحسابات التي تتتبع حالة تصويت validator والمكافآت. | VoteInstruction |
برنامج الحصة | Stake11111111111111111111111111111111111111 | إنشاء وإدارة الحسابات التي تمثل الحصة والمكافآت للتفويضات إلى validators. | StakeInstruction |
برنامج التكوين | Config1111111111111111111111111111111111111 | إضافة بيانات التكوين إلى السلسلة، متبوعة بقائمة المفاتيح العامة المسموح لها بتعديلها. على عكس البرامج الأخرى، لا يحدد برنامج التكوين أي تعليمات فردية. لديه تعليمة ضمنية واحدة فقط: "تخزين". بيانات التعليمات الخاصة به هي مجموعة من المفاتيح التي تتحكم في الوصول إلى الحساب والبيانات المراد تخزينها بداخله. | ConfigInstruction |
برنامج ميزانية الحوسبة | ComputeBudget111111111111111111111111111111 | تعيين حدود وأسعار وحدات الحوسبة للمعاملات، مما يسمح للمستخدمين بالتحكم في موارد الحوسبة ورسوم الأولوية. | ComputeBudgetInstruction |
برنامج جدول بحث العناوين | AddressLookupTab1e1111111111111111111111111 | إدارة جداول بحث العناوين، والتي تسمح للمعاملات بالإشارة إلى حسابات أكثر مما يمكن أن يتناسب في قائمة حسابات المعاملة. | ProgramInstruction |
برنامج إثبات ZK ElGamal | ZkE1Gama1Proof11111111111111111111111111111 | يوفر التحقق من إثبات المعرفة الصفرية للبيانات المشفرة بـ ElGamal. | — |
Is this page helpful?