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