البرامج

على سولانا، تُسمى "العقود الذكية" برامج. البرامج يتم نشرها على السلسلة في حسابات تحتوي على الملف الثنائي التنفيذي المُجمّع للبرنامج. يتفاعل المستخدمون مع البرامج عن طريق إرسال معاملات تحتوي على تعليمات تخبر البرنامج بما يجب فعله.

النقاط الرئيسية

  • البرامج هي حسابات تحتوي على رمز قابل للتنفيذ، منظم في وظائف تسمى تعليمات.
  • بينما البرامج لا تحتفظ بحالة، يمكنها أن تتضمن تعليمات تقوم بإنشاء وتحديث حسابات أخرى لتخزين البيانات.
  • سلطة الترقية يمكنها تحديث البرامج. بمجرد إزالة هذه السلطة، يصبح البرنامج غير قابل للتعديل.
  • يمكن للمستخدمين التحقق من أن بيانات حساب البرنامج على السلسلة تطابق الشفرة المصدرية العامة من خلال عمليات بناء قابلة للتحقق.

كتابة برامج سولانا

تُكتب برامج سولانا بشكل أساسي بلغة البرمجة Rust، مع نهجين شائعين للتطوير:

  • Anchor: إطار عمل مصمم لتطوير برامج سولانا. يوفر طريقة أسرع وأبسط لكتابة البرامج، باستخدام وحدات ماكرو Rust لتقليل الشيفرة المتكررة. للمبتدئين، يُنصح بالبدء بإطار عمل Anchor.

  • Rust الأصلية: يتضمن هذا النهج كتابة برامج سولانا بلغة Rust دون الاستفادة من أي أطر عمل. يوفر مرونة أكبر ولكن مع زيادة في التعقيد.

تحديث برامج سولانا

لمعرفة المزيد حول نشر وترقية البرامج، راجع صفحة نشر البرامج.

يمكن تعديل البرامج مباشرة بواسطة حساب مُعين كـ "سلطة الترقية"، والذي عادة ما يكون الحساب الذي قام بنشر البرنامج في الأصل. إذا تم إلغاء سلطة الترقية وتعيينها إلى null، يصبح البرنامج غير قابل للتعديل ولا يمكن تحديثه بعد ذلك.

البرامج القابلة للتحقق

تتيح عمليات البناء القابلة للتحقق لأي شخص التحقق مما إذا كان كود البرنامج على السلسلة يتطابق مع كود المصدر العام الخاص به، مما يجعل من الممكن اكتشاف التناقضات بين المصدر والإصدارات المنشورة.

قدم مجتمع مطوري Solana أدوات لدعم عمليات البناء القابلة للتحقق، مما يمكّن كلاً من المطورين والمستخدمين من التحقق من أن البرامج على السلسلة تعكس بدقة كود المصدر المشترك علنًا.

  • البحث عن البرامج المتحقق منها: للتحقق بسرعة من البرامج المتحقق منها، يمكن للمستخدمين البحث عن عنوان البرنامج على مستكشف Solana. شاهد مثالاً على برنامج متحقق منه هنا.

  • أدوات التحقق: تمكّن واجهة سطر أوامر Solana للبناء القابل للتحقق من Ellipsis Labs المستخدمين من التحقق بشكل مستقل من البرامج على السلسلة مقابل كود المصدر المنشور.

  • دعم عمليات البناء القابلة للتحقق في Anchor: يوفر Anchor دعمًا مدمجًا لعمليات البناء القابلة للتحقق. يمكن العثور على التفاصيل في وثائق Anchor.

مرشح حزم بيركلي (BPF)

تستخدم Solana LLVM (آلة افتراضية منخفضة المستوى) لتجميع البرامج إلى ملفات ELF (تنسيق قابل للتنفيذ والربط). تحتوي هذه الملفات على نسخة Solana المخصصة من شفرة بايت eBPF، تسمى "تنسيق بايت كود Solana" (sBPF). يحتوي ملف ELF على الثنائي الخاص بالبرنامج ويتم تخزينه على السلسلة في حساب قابل للتنفيذ عند نشر البرنامج.

البرامج المدمجة

برامج التحميل

كل برنامج مملوك بواسطة برنامج آخر، وهو برنامج التحميل الخاص به. حاليًا، توجد خمسة برامج تحميل:

برنامج التحميلمعرف البرنامجملاحظاترابط التعليمات
nativeNativeLoader1111111111111111111111111111111يملك برامج التحميل الأربعة الأخرى
v1BPFLoader1111111111111111111111111111111111تم تعطيل تعليمات الإدارة، لكن البرامج لا تزال قيد التنفيذ
v2BPFLoader2111111111111111111111111111111111تم تعطيل تعليمات الإدارة، لكن البرامج لا تزال قيد التنفيذالتعليمات
v3BPFLoaderUpgradeab1e11111111111111111111111يجري التخلص منه تدريجيًاالتعليمات
v4LoaderV411111111111111111111111111111111111من المتوقع أن يصبح v4 برنامج التحميل القياسيالتعليمات

هذه المحمّلات ضرورية لإنشاء وإدارة البرامج المخصصة:

  • نشر برنامج جديد أو مخزن مؤقت
  • إغلاق برنامج أو مخزن مؤقت
  • إعادة نشر / ترقية برنامج موجود
  • نقل السلطة على برنامج
  • إنهاء برنامج

يدعم Loader-v3 و loader-v4 إجراء تعديلات على البرامج بعد نشرها الأولي. يتم تنظيم الإذن للقيام بذلك من خلال سلطة البرنامج لأن ملكية الحساب لكل برنامج تقع مع المحمّل.

البرامج المُعدّة مسبقًا

برنامج Ed25519

البرنامجمعرّف البرنامجالوصفالتعليمات
برنامج Ed25519Ed25519SigVerify111111111111111111111111111يتحقق من توقيعات ed25519. إذا فشل أي توقيع، يتم إرجاع خطأ.التعليمات

يعالج برنامج ed25519 تعليمة. البايت الأول u8 هو عدد التوقيعات المراد التحقق منها، يليه بايت واحد للحشو. بعد ذلك، يتم تسلسل البنية التالية، واحدة لكل توقيع للتحقق.

Ed25519SignatureOffsets
struct Ed25519SignatureOffsets {
signature_offset: u16, // offset to ed25519 signature of 64 bytes
signature_instruction_index: u16, // instruction index to find signature
public_key_offset: u16, // offset to public key of 32 bytes
public_key_instruction_index: u16, // instruction index to find public key
message_data_offset: u16, // offset to start of message data
message_data_size: u16, // size of message data
message_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().instructions
instruction_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

البرنامجمعرّف البرنامجالوصفالتعليمات
برنامج Secp256k1KeccakSecp256k11111111111111111111111111111يتحقق من عمليات استرداد المفتاح العام secp256k1 (ecrecover).التعليمات

يعالج برنامج secp256k1 تعليمة تأخذ كبايت أول عدد البنية التالية المتسلسلة في بيانات التعليمات:

Secp256k1SignatureOffsets
struct Secp256k1SignatureOffsets {
secp_signature_offset: u16, // offset to [signature,recovery_id] of 64+1 bytes
secp_signature_instruction_index: u8, // instruction index to find signature
secp_pubkey_offset: u16, // offset to ethereum_address pubkey of 20 bytes
secp_pubkey_instruction_index: u8, // instruction index to find pubkey
secp_message_data_offset: u16, // offset to start of message data
secp_message_data_size: u16, // size of message data
secp_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().instructions
signature = 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

البرنامجمعرف البرنامجالوصفالتعليمات
برنامج Secp256r1Secp256r1SigVerify1111111111111111111111111يتحقق من صحة ما يصل إلى 8 توقيعات secp256r1. يأخذ التوقيع والمفتاح العام والرسالة. يُرجع خطأ في حالة فشل أي منها.التعليمات

يعالج برنامج secp256r1 تعليمة واحدة. أول u8 هو عدد التوقيعات المراد التحقق منها، متبوعًا ببايت واحد للحشو. بعد ذلك، يتم تسلسل البنية التالية، واحدة لكل توقيع يجب التحقق منه:

Secp256r1SignatureOffsets
struct Secp256r1SignatureOffsets {
signature_offset: u16, // offset to compact secp256r1 signature of 64 bytes
signature_instruction_index: u16, // instruction index to find signature
public_key_offset: u16, // offset to compressed public key of 33 bytes
public_key_instruction_index: u16, // instruction index to find public key
message_data_offset: u16, // offset to start of message data
message_data_size: u16, // size of message data
message_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 usize
if num_signatures == 0 || num_signatures > 8 {
return Error
}
expected_data_size = num_signatures * SIGNATURE_OFFSETS_SERIALIZED_SIZE + SIGNATURE_OFFSETS_START
if 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 المنخفضة لجميع التوقيعات لتجنب قابلية التلاعب العرضي بالتوقيع.

البرامج الأساسية

يتضمن تكوين شبكة Solana قائمة من البرامج الخاصة التي توفر وظائف أساسية للشبكة. تاريخيًا، كان يُشار إليها باسم البرامج "الأصلية" وكانت تُوزع مع شفرة validator.

البرنامجمعرف البرنامجالوصفالتعليمات
برنامج النظام11111111111111111111111111111111إنشاء حسابات جديدة، وتخصيص بيانات الحساب، وتعيين الحسابات للبرامج المالكة، ونقل وحدات lamport من الحسابات المملوكة لبرنامج النظام، ودفع رسوم المعاملات.SystemInstruction
برنامج التصويتVote111111111111111111111111111111111111111إنشاء وإدارة الحسابات التي تتتبع حالة تصويت validator والمكافآت.VoteInstruction
برنامج الحصةStake11111111111111111111111111111111111111إنشاء وإدارة الحسابات التي تمثل الحصص والمكافآت للتفويضات إلى validators.StakeInstruction
برنامج التكوينConfig1111111111111111111111111111111111111إضافة بيانات التكوين إلى السلسلة، متبوعة بقائمة المفاتيح العامة المسموح لها بتعديلها. على عكس البرامج الأخرى، لا يحدد برنامج التكوين أي تعليمات فردية. لديه تعليمة ضمنية واحدة فقط: "تخزين". بيانات التعليمات الخاصة به هي مجموعة من المفاتيح التي تتحكم في الوصول إلى الحساب والبيانات المراد تخزينها بداخله.ConfigInstruction
برنامج ميزانية الحوسبةComputeBudget111111111111111111111111111111تعيين حدود وأسعار وحدات الحوسبة للمعاملات، مما يسمح للمستخدمين بالتحكم في موارد الحوسبة ورسوم الأولوية.ComputeBudgetInstruction
برنامج جدول بحث العناوينAddressLookupTab1e1111111111111111111111111إدارة جداول بحث العناوين، والتي تسمح للمعاملات بالإشارة إلى حسابات أكثر مما يمكن أن يتناسب في قائمة حسابات المعاملة.ProgramInstruction
برنامج إثبات ZK ElGamalZkE1Gama1Proof11111111111111111111111111111يوفر التحقق من إثبات المعرفة الصفرية للبيانات المشفرة بنظام ElGamal.

Is this page helpful?