البرامج
في سولانا، يُطلق على العقد الذكي اسم برنامج. البرنامج هو حساب بدون حالة يحتوي على رمز قابل للتنفيذ. يتم تنظيم هذا الرمز في وظائف تسمى تعليمات. يتفاعل المستخدمون مع البرنامج عن طريق إرسال معاملة تحتوي على واحدة أو أكثر من التعليمات. يمكن أن تتضمن المعاملة تعليمات من برامج متعددة.
عند نشر برنامج، تستخدم سولانا LLVM لتجميعه إلى تنسيق قابل للتنفيذ والربط (ELF). يحتوي ملف ELF على الشفرة الثنائية للبرنامج بتنسيق بايت كود سولانا (sBPF) ويتم حفظه على السلسلة في حساب قابل للتنفيذ.
sBPF هو إصدار سولانا المخصص من بايت كود eBPF.
كتابة البرامج
تُكتب غالبية البرامج بلغة Rust، مع نهجين شائعين للتطوير:
- Anchor: Anchor هو إطار عمل مصمم للتطوير السريع والسهل على سولانا. يستخدم وحدات ماكرو Rust لتقليل الكود المتكرر—مما يجعله رائعًا للمبتدئين.
- Native Rust: كتابة البرامج بلغة Rust دون الاستفادة من أي أطر عمل. يوفر هذا النهج مرونة أكبر ولكنه يأتي مع زيادة في التعقيد.
تحديث البرامج
لـتعديل برنامج موجود، يجب تعيين حساب كـسلطة الترقية. (عادةً نفس الحساب الذي قام أصلاً بنشر البرنامج.) إذا تم إلغاء سلطة الترقية وتعيينها إلى null، فلن يكون من الممكن تحديث البرنامج بعد ذلك.
التحقق من البرامج
تدعم سولانا عمليات البناء القابلة للتحقق، والتي تسمح للمستخدمين بالتحقق مما إذا كان كود البرنامج على السلسلة يتطابق مع كود المصدر العام الخاص به. يوفر إطار عمل Anchor دعمًا مدمجًا لإنشاء بناء قابل للتحقق.
للتحقق مما إذا كان البرنامج الموجود تم التحقق منه، ابحث عن معرف البرنامج الخاص به على مستكشف سولانا. بدلاً من ذلك، يمكنك استخدام واجهة سطر أوامر البناء القابل للتحقق من سولانا من Ellipsis Labs، للتحقق بشكل مستقل من البرامج على السلسلة.
البرامج المدمجة
System Program
System Program هو الحساب الوحيد الذي يمكنه إنشاء حسابات جديدة. بشكل افتراضي، جميع الحسابات الجديدة مملوكة لـ System Program، على الرغم من أن العديد منها يتم تعيين مالك جديد لها عند الإنشاء. يقوم System Program بأداء الوظائف الرئيسية التالية:
| الوظيفة | الوصف |
|---|---|
| إنشاء حساب جديد | فقط System Program يمكنه إنشاء حسابات جديدة. |
| تخصيص المساحة | يحدد السعة بالبايت لحقل البيانات لكل حساب. |
| تعيين ملكية البرنامج | بمجرد أن ينشئ System Program حسابًا، يمكنه إعادة تعيين مالك البرنامج المحدد إلى حساب برنامج مختلف. هكذا تأخذ البرامج المخصصة ملكية الحسابات الجديدة التي تم إنشاؤها بواسطة System Program. |
| تحويل SOL | ينقل لامبورتس (SOL) من حسابات النظام إلى حسابات أخرى. |
عنوان System Program هو 11111111111111111111111111111111.
برامج التحميل
كل برنامج مملوك لبرنامج آخر - وهو المحمّل الخاص به. تُستخدم المحمّلات لنشر البرامج أو إعادة نشرها أو ترقيتها أو إغلاقها. كما تُستخدم لإنهاء البرنامج ونقل سلطة البرنامج.
هناك حاليًا خمسة برامج تحميل، كما هو موضح في الجدول أدناه.
| المحمّل | معرف البرنامج | ملاحظات | رابط التعليمات |
|---|---|---|---|
| native | NativeLoader1111111111111111111111111111111 | يملك المحمّلات الأربعة الأخرى | — |
| v1 | BPFLoader1111111111111111111111111111111111 | تم تعطيل تعليمات الإدارة، ولكن البرامج لا تزال قيد التنفيذ | — |
| v2 | BPFLoader2111111111111111111111111111111111 | تم تعطيل تعليمات الإدارة، ولكن البرامج لا تزال قيد التنفيذ | التعليمات |
| v3 | BPFLoaderUpgradeab1e11111111111111111111111 | يمكن تحديث البرامج بعد النشر. يتم تخزين برنامج قابل للتنفيذ في حساب بيانات برنامج منفصل | التعليمات |
| v4 | LoaderV411111111111111111111111111111111111 | قيد التطوير (غير مطروح) | التعليمات |
يمكن تعديل البرامج المنشورة باستخدام loader-v3 أو loader-v4 بعد النشر، وفقًا لما تحدده سلطة الترقية الخاصة بها.
عند نشر برنامج جديد، سيتم استخدام أحدث إصدار من المحمّل افتراضيًا.
البرامج المُعدّة مسبقًا
بالإضافة إلى برامج المحمّل، توفر سولانا البرامج المُعدّة مسبقًا التالية.
التحقق من توقيع ed25519
يُستخدم برنامج ed25519 للتحقق من توقيع واحد أو أكثر من توقيعات 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 للتحقق من عمليات استعادة المفتاح العام لـ 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 للتحقق من ما يصل إلى 8 توقيعات 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}
يتم فرض قيم S المنخفضة لجميع التوقيعات لتجنب قابلية التشكيل العرضي للتوقيع.
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}
البرامج الأساسية
توفر البرامج في القائمة أدناه وظائف الشبكة الأساسية.
| البرنامج | معرف البرنامج | الوصف | التعليمات |
|---|---|---|---|
| النظام | 11111111111111111111111111111111 | إنشاء حسابات جديدة، وتخصيص بيانات الحساب، وتعيين الحسابات للبرامج المالكة، ونقل لامبورتس من الحسابات المملوكة لبرنامج النظام، ودفع رسوم المعاملات | SystemInstruction |
| التصويت | Vote111111111111111111111111111111111111111 | إنشاء وإدارة الحسابات التي تتتبع حالة تصويت المدقق والمكافآت | VoteInstruction |
| الحصة | Stake11111111111111111111111111111111111111 | إنشاء وإدارة الحسابات التي تمثل الحصة والمكافآت للتفويضات إلى المدققين | StakeInstruction |
| التكوين | Config1111111111111111111111111111111111111 | إضافة بيانات التكوين إلى السلسلة، متبوعة بقائمة المفاتيح العامة المسموح لها بتعديلها. على عكس البرامج الأخرى، لا يحدد برنامج التكوين أي تعليمات فردية. لديه تعليمة ضمنية واحدة فقط: "تخزين". بيانات التعليمة الخاصة به هي مجموعة من المفاتيح التي تتحكم في الوصول إلى الحساب والبيانات المخزنة بداخله | ConfigInstruction |
| ميزانية الحوسبة | ComputeBudget111111111111111111111111111111 | تعيين حدود وأسعار وحدات الحوسبة للمعاملات، مما يسمح للمستخدمين بالتحكم في موارد الحوسبة ورسوم الأولوية | ComputeBudgetInstruction |
| جدول بحث العناوين | AddressLookupTab1e1111111111111111111111111 | إدارة جداول بحث العناوين، والتي تسمح للمعاملات بالإشارة إلى حسابات أكثر مما يمكن أن يتناسب في قائمة حسابات المعاملة | ProgramInstruction |
| إثبات ZK ElGamal | ZkE1Gama1Proof11111111111111111111111111111 | يوفر التحقق من إثبات المعرفة الصفرية للبيانات المشفرة بـ ElGamal | — |
Is this page helpful?