البرامج

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

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

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

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

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

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

المحمّلمعرف البرنامجملاحظاترابط التعليمات
nativeNativeLoader1111111111111111111111111111111يملك المحمّلات الأربعة الأخرى
v1BPFLoader1111111111111111111111111111111111تم تعطيل تعليمات الإدارة، ولكن البرامج لا تزال قيد التنفيذ
v2BPFLoader2111111111111111111111111111111111تم تعطيل تعليمات الإدارة، ولكن البرامج لا تزال قيد التنفيذالتعليمات
v3BPFLoaderUpgradeab1e11111111111111111111111يمكن تحديث البرامج بعد النشر. يتم تخزين برنامج قابل للتنفيذ في حساب بيانات برنامج منفصلالتعليمات
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إنشاء حسابات جديدة، وتخصيص بيانات الحساب، وتعيين الحسابات للبرامج المالكة، ونقل لامبورتس من الحسابات المملوكة لبرنامج النظام، ودفع رسوم المعاملاتSystemInstruction
التصويتVote111111111111111111111111111111111111111إنشاء وإدارة الحسابات التي تتتبع حالة تصويت المدقق والمكافآتVoteInstruction
الحصةStake11111111111111111111111111111111111111إنشاء وإدارة الحسابات التي تمثل الحصة والمكافآت للتفويضات إلى المدققينStakeInstruction
التكوينConfig1111111111111111111111111111111111111إضافة بيانات التكوين إلى السلسلة، متبوعة بقائمة المفاتيح العامة المسموح لها بتعديلها. على عكس البرامج الأخرى، لا يحدد برنامج التكوين أي تعليمات فردية. لديه تعليمة ضمنية واحدة فقط: "تخزين". بيانات التعليمة الخاصة به هي مجموعة من المفاتيح التي تتحكم في الوصول إلى الحساب والبيانات المخزنة بداخلهConfigInstruction
ميزانية الحوسبةComputeBudget111111111111111111111111111111تعيين حدود وأسعار وحدات الحوسبة للمعاملات، مما يسمح للمستخدمين بالتحكم في موارد الحوسبة ورسوم الأولويةComputeBudgetInstruction
جدول بحث العناوينAddressLookupTab1e1111111111111111111111111إدارة جداول بحث العناوين، والتي تسمح للمعاملات بالإشارة إلى حسابات أكثر مما يمكن أن يتناسب في قائمة حسابات المعاملةProgramInstruction
إثبات ZK ElGamalZkE1Gama1Proof11111111111111111111111111111يوفر التحقق من إثبات المعرفة الصفرية للبيانات المشفرة بـ ElGamal

Is this page helpful?

تدار بواسطة

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