البرامج

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

عند نشر برنامج، تستخدم سولانا 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.

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

كل برنامج مملوك لبرنامج آخر—محمله. تُستخدم المحملات لنشر البرامج، وإعادة نشرها، وترقيتها أو إغلاقها. كما تُستخدم أيضًا لإنهاء البرنامج ونقل صلاحية البرنامج.

يُشار أحيانًا إلى برامج التحميل باسم 'BPF Loaders'.

يوجد حاليًا خمسة برامج تحميل، كما هو موضح في الجدول أدناه.

المحملمعرف البرنامجملاحظاترابط التعليمات
nativeNativeLoader1111111111111111111111111111111يمتلك المحملات الأربعة الأخرى
v1BPFLoader1111111111111111111111111111111111تعليمات الإدارة معطلة، لكن البرامج لا تزال تعمل
v2BPFLoader2111111111111111111111111111111111تعليمات الإدارة معطلة، لكن البرامج لا تزال تعملالتعليمات
v3BPFLoaderUpgradeab1e11111111111111111111111يمكن تحديث البرامج بعد النشر. يتم تخزين البرنامج القابل للتنفيذ في program account منفصل للبياناتالتعليمات
v4LoaderV411111111111111111111111111111111111قيد التطوير (لم يتم إصداره)التعليمات

البرامج المنشورة باستخدام loader-v3 أو loader-v4 قد تكون قابلة للتعديل بعد النشر، حسب ما تحدده سلطة الترقية الخاصة بها.

عند نشر برنامج جديد، سيتم استخدام أحدث إصدار من المحمل بشكل افتراضي.

البرامج المجمعة مسبقًا

بالإضافة إلى برامج المحمل، توفر سولانا البرامج المجمعة مسبقًا التالية.

التحقق من توقيع ed25519

يُستخدم برنامج ed25519 للتحقق من توقيع واحد أو أكثر من توقيعات 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
}
Signature verification pseudocode
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

يُستخدم برنامج secp256k1 للتحقق من عمليات استرداد المفتاح العام 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
}
Recovery verification pseudocode
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 للتحقق من ما يصل إلى 8 توقيعات 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
}

يتم فرض قيم S المنخفضة لجميع التوقيعات لتجنب قابلية التشكيل العرضي للتوقيع.

Signature verification psuedocode
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
}

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

توفر البرامج في القائمة أدناه وظائف الشبكة الأساسية.

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

Is this page helpful?

تدار بواسطة

© 2026 مؤسسة سولانا.
جميع الحقوق محفوظة.
تواصل معنا