وثائق سولاناتطوير البرامج

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

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

ما هي البناءات المتحقق منها؟

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

تتضمن عملية التحقق مقارنة تجزئة البرنامج على السلسلة مع تجزئة البرنامج المبني محليًا من كود المصدر. هذا يضمن عدم وجود تناقضات بين النسختين.

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

تم تصميم خط أنابيب البناءات المتحقق منها والحفاظ عليه بواسطة Ellipsis Labs وOtterSec. لمزيد من التفاصيل، اتبع الدليل في مستودع البناءات المتحقق منها الأصلي وكذلك عملية التحقق من البناء مباشرة في مجموعة أدوات Anza، بمجرد دعمها هناك.

كيف يعمل ذلك؟

تتم عملية التحقق من خلال مقارنة التجزئة (hash) للبرنامج الموجود على السلسلة مع التجزئة للبرنامج المبني محليًا من الكود المصدري. تقوم ببناء برنامجك في بيئة متحكم بها باستخدام واجهة سطر أوامر سولانا للتحقق ودوكر. هذا يضمن أن عملية البناء محددة ومتسقة عبر الأنظمة المختلفة. بمجرد أن يكون لديك الملف التنفيذي، يمكنك نشره على شبكة سولانا. أثناء عملية البناء سيتم إنشاء PDA لـ برنامج التحقق. يحتوي هذا الـ PDA على جميع البيانات اللازمة للتحقق من البرنامج. يحتوي الـ PDA على عنوان البرنامج، ورابط git، وتجزئة الالتزام (commit hash) والوسائط المستخدمة لبناء البرنامج.

باستخدام البيانات الموجودة في الـ PDA، يمكن للجميع تشغيل أمر برنامج التحقق محليًا والتحقق مما إذا كان البرنامج قد تم بناؤه من الكود المصدري المقدم. ثم يمكن للجميع التحقق بأنفسهم بشكل كامل دون الحاجة للثقة أو يمكنهم تشغيل واجهة برمجة التطبيقات الخاصة بالتحقق التي تديرها OtterSec لتوفير نقطة وصول سهلة للمستخدمين للتحقق من التحقق. يمكنك بالفعل رؤية هذه استدعاءات واجهة برمجة التطبيقات التي يتم استخدامها في مستكشف سولانا و SolanaFM، من بين أماكن أخرى.

لماذا يجب أن أستخدم البناءات المتحقق منها؟

استخدام البناءات المتحقق منها يوفر الفوائد التالية:

  • الأمان: ضمان أن البرنامج الذي يعمل على السلسلة يطابق الكود المصدري، مما يمنع التعديلات الخبيثة.

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

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

  • قابلية الاكتشاف: عندما توفر نسخة موثقة من برنامجك، يمكن للجميع العثور على الكود المصدري، والوثائق، وبرنامج SDK أو IDL الخاص بك، كما يمكنهم أيضًا التواصل معك بسهولة عبر GitHub في حالة وجود مشكلة.

كيف أنشئ إصدارات موثقة؟

لإنشاء إصدارات موثقة، ستحتاج إلى اتباع هذه الخطوات:

الملخص:

  • قم بإيداع الكود الخاص بك في مستودع عام
  • قم ببناء إصدار موثق في دوكر
  • قم بنشر الإصدار الموثق
  • تحقق من البرنامج المنشور مقابل واجهة برمجة التطبيقات العامة

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

تثبيت دوكر وكارجو

قم بتثبيت الأدوات الضرورية وتأكد من تثبيت دوكر وكارجو. يوفر دوكر بيئة بناء متحكم بها لضمان الاتساق، ويستخدم كارجو لإدارة حزم Rust.

  • دوكر: اتبع الخطوات على موقع دوكر لتثبيت دوكر لمنصتك. بمجرد التثبيت، تأكد من تشغيل خدمة دوكر باتباع هذا الدليل.
  • كارجو: إذا لم يكن لديك كارجو مثبتًا بالفعل، يمكنك تثبيته عن طريق تشغيل الأمر التالي:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

تثبيت واجهة سطر أوامر التحقق من سولانا

واجهة سطر أوامر التحقق من سولانا هي الأداة الرئيسية المستخدمة للتحقق من الإصدارات. يتم صيانة واجهة سطر أوامر التحقق من سولانا حاليًا بواسطة Ellipsis Labs ويمكن تثبيتها باستخدام كارجو.

يمكنك تثبيتها عن طريق تشغيل:

cargo install solana-verify

إذا كنت بحاجة إلى إصدار محدد من واجهة سطر الأوامر، يمكنك تثبيت الإصدار باستخدام:

cargo install solana-verify --version $VERSION

إذا رغبت في ذلك، يمكنك تثبيت إصدار مباشرة من التزام محدد:

cargo install solana-verify --git https://github.com/Ellipsis-Labs/solana-verifiable-build --rev 13a1db2

تجهيز المشروع

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

إذا كان برنامجك في مجلد فرعي ولديك مساحة عمل rust، فأنت بحاجة إلى إنشاء ملف Cargo.toml لمساحة العمل في الدليل الجذر للمستودع الخاص بك.

يمكنك استخدام مثال Cargo.toml هذا كإعداد مسبق:

Cargo.toml
[workspace]
members = ["program/programs/*"]
resolver = "2"
[profile.release]
overflow-checks = true
lto = "fat"
codegen-units = 1
[profile.release.build-override]
opt-level = 3
incremental = false
codegen-units = 1

تأكد من أن برنامجك موجود في مصفوفة workspace/members وأن Cargo.toml الخاص ببرنامجك يحتوي على اسم lib الصحيح المُكوَّن.

المهم هو lib name وليس اسم الحزمة!

شيء مثل هذا:

waffle/Cargo.toml
[package]
name = "waffle"
version = "0.1.0"
edition = "2021"
[lib]
name = "waffle"
crate-type = ["cdylib", "lib"]
[dependencies]
solana-program = "2.1.0"

في هذا المستودع يمكنك رؤية مثال على مساحة عمل تحتوي على برنامج في مجلد فرعي. لاحظ أيضًا أنه عندما يكون البرنامج في مجلد فرعي، ستحتاج لاحقًا إلى إضافة هذا المجلد كـ --mount-path إلى أمر verify-from-repo.

في هذا المستودع يمكنك العثور على مثال Anchor. وفي هذا المستودع يمكنك العثور على مثال Rust الأصلي.

مع وجود ملف Cargo.toml هذا في مكانه، يمكنك بعد ذلك تشغيل cargo generate-lockfile لإنشاء ملف قفل والمتابعة إلى بناء برنامجك.

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

لبناء برنامج سولانا الخاص بك بشكل قابل للتحقق، انتقل إلى الدليل الذي يحتوي على ملف Cargo.toml الخاص بمساحة العمل وقم بتشغيل:

solana-verify build

سيقوم هذا بنسخ بيئتك إلى حاوية دوكر وبنائها بطريقة محددة.

تأكد من أنك تنشر البناء المُتحقق منه فعليًا ولا تستبدله عن طريق الخطأ بـ anchor build أو cargo build-sbf لأن هذه على الأرجح لن تؤدي إلى نفس الهاش وبالتالي سيفشل التحقق الخاص بك.

للمشاريع التي تحتوي على برامج متعددة، يمكنك بناء برنامج محدد باستخدام اسم المكتبة (وليس اسم الحزمة):

solana-verify build --library-name $PROGRAM_LIB_NAME

تضمن هذه العملية عمليات بناء حتمية وقد تستغرق بعض الوقت، خاصة على أنظمة معينة (مثل أجهزة M1 MacBook) لأنها تعمل داخل حاوية دوكر. للحصول على عمليات بناء أسرع، يُنصح باستخدام جهاز لينكس يعمل بهندسة x86.

بمجرد اكتمال عملية البناء، يمكنك استرداد تجزئة الملف التنفيذي باستخدام الأمر التالي:

solana-verify get-executable-hash target/deploy/$PROGRAM_LIB_NAME.so

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

بمجرد بناء برنامجك والحصول على التجزئة الخاصة به، يمكنك نشره على شبكة سولانا. يُنصح باستخدام حل متعدد التوقيعات أو حوكمة مثل بروتوكول Squads للنشر الآمن، ولكن يمكنك أيضًا النشر مباشرة باستخدام:

solana program deploy -u $NETWORK_URL target/deploy/$PROGRAM_LIB_NAME.so --program-id $PROGRAM_ID --with-compute-unit-price 50000 --max-sign-attempts 100 --use-rpc

رسوم منخفضة الأولوية مناسبة حاليًا يمكنك طلبها من مزود rpc الخاص بك على سبيل المثال Quicknode.

للتحقق من أن البرنامج المنشور يطابق الملف التنفيذي المبني، قم بتشغيل:

solana-verify get-program-hash -u $NETWORK_URL $PROGRAM_ID

قد يكون لديك إصدارات مختلفة منشورة على مختلف مجموعات سولانا (أي devnet، testnet، mainnet). تأكد من استخدام عنوان URL الصحيح للشبكة لمجموعة سولانا المطلوبة التي تريد التحقق من البرنامج مقابلها. سيعمل التحقق عن بُعد فقط على الشبكة الرئيسية.

التحقق مقابل المستودعات

للتحقق من برنامج مقابل مستودعه العام، استخدم:

solana-verify verify-from-repo -u $NETWORK_URL --program-id $PROGRAM_ID https://github.com/$REPO_PATH --commit-hash $COMMIT_HASH --library-name $PROGRAM_LIB_NAME --mount-path $MOUNT_PATH

بينما تقوم بتشغيل البناء المُتحقق منه في دليل برنامجك، عند تشغيل verify-from-repo تحتاج إلى إضافة علامة --mount-path. سيكون هذا المسار إلى المجلد الذي يحتوي على Cargo.toml الذي يحتوي على اسم مكتبة برنامجك.

يقارن هذا الأمر بين هاش البرنامج على السلسلة وهاش الملف التنفيذي المبني من المصدر في هاش الالتزام المحدد.

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

إذا كنت تريد قفل التحقق على إصدار معين، يمكنك إضافة علامة --commit-hash إلى الأمر.

التحقق مقابل واجهة برمجة التطبيقات العامة

بعد رفع PDA التحقق الخاص بك على الشبكة باستخدام verify-from-repo، قدّم مهمة تحقق عن بُعد إلى OtterSec API:

solana-verify remote submit-job --program-id <program-id> --uploader <address>

--uploader هو العنوان الذي رفع PDA التحقق، وهو عادةً صلاحية ترقية برنامجك. إذا كان برنامجك يخضع لسيطرة multisig، تابع في قسم التحقق عبر multisig من هذا الدليل أدناه.

تم إيقاف العلامة القديمة --remote في verify-from-repo. قم برفع PDA الخاص بك أولاً، ثم شغّل remote submit-job.

يُقدّم هذا الأمر مهمة إلى OtterSec API. يمكنك التحقق من حالة المهمة باستخدام:

solana-verify remote get-job --job-id <job-id>

بمجرد اكتمال التحقق بنجاح، وقد يستغرق ذلك بعض الوقت، ستتمكن من رؤية برنامجك كبرنامج تم التحقق منه في OtterSec API للبرامج الفردية وفي مستكشف سولانا، SolanaFM، SolScan وفي نهاية المطاف على الموقع المجتمعي SolanaVerify.org الذي يديره 0xDeep و OtterSec verified programs API وأخيراً في لوحة تحكم Dune للبرامج الموثقة مما يُسهم في بناء نظام بيئي أكثر صحةً لسولانا.

كيفية التحقق من برنامجك عندما يكون خاضعاً لسيطرة Multisig مثل Squads

لكي يعمل التحقق عن بُعد، تحتاج إلى كتابة بيانات التحقق في PDA موقّع من قِبَل صلاحية البرنامج. إذا كان برنامجك يخضع لسيطرة multisig، يمكنك تصدير معاملة كتابة PDA هذه وتقديمها عبر Squads Protocol أو أي حل multisig آخر من اختيارك.

1. بناء البرنامج القابل للتحقق

ابدأ ببناء البرنامج:

solana-verify build

سيقوم هذا بإنشاء بناء قابل للتحقق باستخدام حاوية Docker مع إصدار سولانا المحدد في ملف Cargo.lock.

2. نشر البرنامج

solana config set --url "PayedMainnetRPCAddress" // the public endpoint will be rate limited too much
solana program deploy target/deploy/verify_squads.so

في بقية هذا الدليل الخاص بالتوقيع المتعدد، سنستخدم معرّف برنامج نموذجي هو 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD.

3. الالتزام بالمستودع والتحقق منه

بمجرد الانتهاء من ذلك، نلتزم بالمشروع على GitHub. إليك مثالاً: https://github.com/solana-developers/verify-squads

اختياري: تحقق مما إذا كان بإمكانك التحقق محلياً أولاً (يستخدم هذا الأمر معرّف البرنامج النموذجي 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD):

solana-verify verify-from-repo https://github.com/solana-developers/verify-squads --program-id 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD

فقط للتأكد من صحة المعاملات التي أدخلتها.

4. نقل صلاحية البرنامج إلى التوقيع المتعدد

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

5. تصدير معاملة PDA

عندما تمتلك صلاحية البرنامج محلياً، سيُطلب منك رفع بيانات البناء على السلسلة عند استخدام الأمر solana-verify verify-from-repo.

نظراً لأنك لا تستطيع فعل ذلك عند استخدام التوقيع المتعدد، فأنت بحاجة إلى تصدير معاملة PDA يدوياً ثم تشغيل المعاملة عبر Squads.

solana-verify export-pda-tx https://github.com/solana-developers/verify-squads --program-id 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD --uploader <your program authority> --encoding base58 --compute-unit-price 0

سيُعيد هذا معاملة بترميز base58. إذا كنت تريد معاملة مُرمَّزة بـ base64 للاستخدام في أداة فحص المعاملات، يمكنك استخدام --encoding base64.

P6vBfcPaaXb8fZoT3NBAYEcdtEj7tubA1k2gBxmFKZ3UWF5YyrmDMFTvLKALCJoUuRsPAjMckudYruCu3eeWQtuDrFbEMLxLFutnKXac974fnkMivcwUdY66VLjbxQT6ATmcy7F4hBtz1G4P1h6iBJLhb8WtrtgY3i4qq45MUEb7RjuMEfUFXKrNgPdGxkz5xvMHq3dxKRcpmEK5k2DkeW6SUQYBVe19Ga3B9GyhTX8k3CMt9JCEah13WyRnQd8GjoK6sTEvGJym6xDNvmd8yiJYSNcaYwEJsjHEUf4Yh6kAC7ki2KRvVAr3NVe1gjqK9McrwSQjtUatvydTG8Zovcr7PPUEMf3yPMgKXjZLB2QpkH63yTTYdNAnWFuv9E6b6nYRqye5XcNi436yKw5U14fXh65yK34bgYLi9328UT1huJELsJU9BRGnGUmb6GWp6c2WL5BhnzgNTSnt9TXFfEgUMzhvKzpVBxLP44hwqqBdyUhHFysCF37531PnmiESq8x1xou23xJ6FcQbc199754MkqQd7tX9CUznGzAEqHGkzn3VBoJnojsKtgYmiTYbdRsT1CU18MbYEE7WvGAvXyxxbpNzbAcc94HrnM6cqRGmwhEBroPfFghTdmzg9D

6. إرسال المعاملة عبر Squads

انتقل إلى منشئ المعاملات في Squads واستورد المعاملة المُرمَّزة بـ base58. تأكد من أن المعاملة في المحاكاة تحتوي فقط على استدعاء لبرنامج التحقق osec وبرنامج ميزانية الحاسوب ولا شيء آخر!

7. إرسال مهمة التحقق عن بُعد

بمجرد نجاح المعاملة إلى Squads، يمكنك إرسال المهمة عن بُعد:

solana-verify remote submit-job --program-id 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD
--uploader <your program authority>

هذا هو كل شيء! لقد تحققت من برنامجك مقارنةً بمستودع عام وأرسلت مهمة عن بُعد إلى واجهة OtterSec API. يجب أن تتمكن الآن من رؤيتها في مستكشف سولانا وأماكن أخرى.

8. تحديث البرنامج (اختياري)

عندما تقوم بتحديث برنامجك، تحتاج إلى تصدير معاملة PDA جديدة وإرسالها من خلال Squads مرة أخرى.

إجراء تحديث للبرنامج:

solana-verify build
solana program write-buffer target/deploy/verify_squads.so --with-compute-unit-price 50000 --max-sign-attempts 50

ثم انقل صلاحية ذلك المخزن المؤقت إلى المتعدد التوقيع أو أنشئ المخزن المؤقت مباشرةً بصلاحية المتعدد التوقيع.

solana program set-buffer-authority Fu3k79g53ZozAj47uq1tXrFy4QbQYh7y745DDsxjtyLR --new-buffer-authority 3JG6ULvZVCrkKtSSskKNJGe8RNZGFe8Ruev9KUhxzK5K

9. تصدير وإرسال معاملة PDA الجديدة

لا تنسَ حفظ تغييراتك على GitHub. قم بتصدير معاملة ترقية PDA مرة أخرى:

solana-verify export-pda-tx https://github.com/solana-developers/verify-squads --program-id 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD --uploader 3JG6ULvZVCrkKtSSskKNJGe8RNZGFe8Ruev9KUhxzK5K

أرسل المعاملة من خلال Squads مرة أخرى.

يمكنك الاطلاع على مثال للمعاملة هنا.

ثم أرسل لإجراء بناء آخر عن بُعد:

solana-verify remote submit-job --program-id 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD --uploader 3JG6ULvZVCrkKtSSskKNJGe8RNZGFe8Ruev9KUhxzK5K

يجب أن ينتج عن ذلك شيء كالتالي:

Verification request sent with request id: b63339d2-163e-49ac-b55d-3454c1c2b5b3
Verification in progress... ⏳ [00:18:02] ✅ Process completed. (Done in 18
minutes) Program 6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD has been verified.
The provided GitHub build matches the onchain hash. On Chain Hash:
96f8c3d9400258f7759408d1f6f8435b4a24d9b52f5a0340d97907e567cb8773 Executable
Hash: 96f8c3d9400258f7759408d1f6f8435b4a24d9b52f5a0340d97907e567cb8773 Repo URL:
https://github.com/Woody4618/verify-squads/tree/0fb0a2e30c15c51732c0ad5e837975a6f7bbc7ed
Check the verification status at:
https://verify.osec.io/status/6XBGfP17P3KQAKoJb2s5M5fR4aFTXzPeuC1af2GYkvhD Job
url: https://verify.osec.io/job/b63339d2-163e-49ac-b55d-3454c1c2b5b3

تهانينا، لقد تحققت من برنامجك بعد ترقية متعدد التوقيع!

التحقق من صورة Docker

يمكنك أيضاً التحقق من برنامجك مقارنةً بصورة Docker عن طريق تشغيل الأمر التالي:

solana-verify verify-from-image -e
examples/hello_world/target/deploy/hello_world.so -i
ellipsislabs/hello_world_verifiable_build:latest -p
2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn

يقوم هذا الأمر بتحميل الصورة المخزنة في ellipsislabs/hello_world_verifiable_build:latest، والتحقق من أن تجزئة مسار الملف التنفيذي في الحاوية مطابقة لتجزئة البرنامج الموجود على السلسلة المُمرَّر إلى الأمر. نظراً لأن البناء قد تم رفعه بالفعل إلى صورة، فلا حاجة لإعادة بناء كاملة للملف التنفيذي والتي قد تستغرق وقتاً طويلاً.

يمكن العثور على ملف Dockerfile الذي ينشئ الصورة ellipsislabs/hello_world_verifiable_build:latest في مستودع Ellipsis Labs /examples/hello_world.

فيما يلي المخرجات المتوقعة:

Verifying image: "ellipsislabs/hello_world_verifiable_build:latest", on network
"https://api.mainnet.solana.com" against program ID
2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn Executable path in container:
"examples/hello_world/target/deploy/hello_world.so"
Executable hash:
08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760 Program hash:
08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760 Executable
matches onchain program data ✅

مثال على بناء تم التحقق منه

إليك مثالاً على التحقق من برنامج نموذجي بالمعرّف FWEYpBAf9WsemQiNbAewhyESfR38GBBHLrCaU3MpEKWv باستخدام الكود المصدري من هذا المستودع:

solana-verify verify-from-repo https://github.com/solana-developers/verified-program --url YOUR-RPC-URL --program-id FWEYpBAf9WsemQiNbAewhyESfR38GBBHLrCaU3MpEKWv --mount-path waffle --library-name waffle --commit-hash 5b82b86f02afbde330dff3e1847bed2d42069f4e

بشكل افتراضي، يأخذ أمر verify-from-repo آخر commit على الفرع الرئيسي. يمكنك أيضاً تحديد commit معين في حال أردت الاستمرار في العمل على المستودع باستخدام المعامل commit-hash: --commit-hash 5b82b86f02afbde330dff3e1847bed2d42069f4e

عند المطالبة، أجب بنعم لرفع PDA التحقق الخاص بك على السلسلة. ثم أرسل مهمة تحقق عن بُعد إلى واجهة OtterSec API:

solana-verify remote submit-job --program-id FWEYpBAf9WsemQiNbAewhyESfR38GBBHLrCaU3MpEKWv --uploader <your-upgrade-authority>

البرامج الشائعة التي تم التحقق منها بالفعل

Phoenix

solana-verify verify-from-repo -um --program-id PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY https://github.com/Ellipsis-Labs/phoenix-v1

المخرجات النهائية:

Executable Program Hash from repo: 6877a5b732b3494b828a324ec846d526d962223959534dbaf4209e0da3b2d6a9
Onchain Program Hash: 6877a5b732b3494b828a324ec846d526d962223959534dbaf4209e0da3b2d6a9
Program hash matches ✅

Squads V3

solana-verify verify-from-repo https://github.com/Squads-Protocol/squads-mpl --commit-hash c95b7673d616c377a349ca424261872dfcf8b19d --program-id SMPLecH534NA9acpos4G6x7uf3LWbCAwZQE9e8ZekMu -um --library-name squads_mpl --bpf

لاحظ أننا احتجنا إلى تحديد library-name لأن مستودع Squads يتضمن برامج متعددة. نستخدم العلامة --bpf لأن squads_mpl قد تم التحقق منه مسبقاً باستخدام Anchor.

المخرجات النهائية:

Executable Program Hash from repo: 72da599d9ee14b2a03a23ccfa6f06d53eea4a00825ad2191929cbd78fb69205c
Onchain Program Hash: 72da599d9ee14b2a03a23ccfa6f06d53eea4a00825ad2191929cbd78fb69205c
Program hash matches ✅

Drift V2

solana-verify verify-from-repo -um --program-id dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH https://github.com/drift-labs/protocol-v2 --commit-hash 110d3ff4f8ba07c178d69f9bfc7b30194fac56d6 --library-name drift

المخرجات النهائية:

Executable Program Hash from repo: e31d58edeabc3c30bf6f2aa60bfaa5e492b41ec203e9006404b463e5adee5828
Onchain Program Hash: e31d58edeabc3c30bf6f2aa60bfaa5e492b41ec203e9006404b463e5adee5828
Program hash matches ✅

Marginfi V2

solana-verify verify-from-repo -um --program-id MFv2hWf31Z9kbCa1snEPYctwafyhdvnV7FZnsebVacA https://github.com/mrgnlabs/marginfi-v2 --commit-hash d33e649e415c354cc2a1e3c49131725552d69ba0 --library-name marginfi -- --features mainnet-beta

المخرجات النهائية:

Executable Program Hash from repo: 890d68f48f96991016222b1fcbc2cc81b8ef2dcbf280c44fe378c523c108fad5
Onchain Program Hash: 890d68f48f96991016222b1fcbc2cc81b8ef2dcbf280c44fe378c523c108fad5
Program hash matches ✅

الأسئلة الشائعة

التحقق لديّ يفشل. ماذا يجب أن أفعل؟

تحقق من هذه المشكلات الشائعة:

  • موقّع خاطئ: تأكد من أن موقّعك هو صلاحية ترقية البرنامج عن طريق تشغيل solana program show YourProgramId
  • لا يوجد PDA على السلسلة: شغّل solana-verify verify-from-repo -um واختر نعم عند المطالبة. بدون رفع الـ PDA، لا تستطيع واجهة برمجة التطبيقات استرداد بيانات التحقق الخاصة بك.
  • عدم تطابق بيانات PDA: حدّث الـ PDA الخاص بك إذا أعدت نشر برنامجك. يجب أن تتطابق بيانات الـ PDA مع برنامجك المنشور.
  • تجزئة commit خاطئة: أنشئ الـ PDA الخاص بك باستخدام تجزئة الـ commit الدقيقة التي نشرتها
  • اختلافات بيئة البناء: استخدم Docker مع solana-verify عند إنشاء الـ PDA

تجزئة البناء المحلي لديّ لا تتطابق مع التجزئة على السلسلة. لماذا؟

يعني هذا عادةً:

  • أنت تستخدم إصدارات مختلفة من سلسلة أدوات Rust/Solana
  • تم تحديث تبعياتك بين عمليات البناء
  • لم تقم بالبناء داخل حاوية Docker
  • قمت بسحب commit خاطئ

أصلح هذا عن طريق البناء باستخدام solana-verify build في Docker باستخدام الـ commit الدقيق الذي قمت بنشره.

كم من الوقت سيستغرق التحقق من برنامجي؟

توقع هذه الأطر الزمنية بناءً على حجم برنامجك:

  • البرامج البسيطة: من 1 إلى 5 دقائق
  • البرامج المعقدة: من 5 إلى 15 دقيقة
  • البرامج الكبيرة جداً: حتى 30 دقيقة

تابع تقدمك باستخدام نقطة نهاية حالة المهمة.

برنامجي غير قابل للتغيير (لا توجد صلاحية ترقية). كيف يمكنني التحقق منه؟

إذا كان برنامجك لا يملك صلاحية ترقية أو تم جعله غير قابل للتغيير قبل أن تتمكن من إنشاء PDA، فلدينا عنوان مُدرج في القائمة البيضاء لهذه الحالة. تواصل معنا على contact@osec.io، وسنساعدك في التحقق من برنامجك.

ما هو الـ PDA ولماذا يهم؟

يتيح حساب PDA (الحساب المشتق من البرنامج) الخاص بك التحقق بدون ثقة:

  • التخزين على السلسلة: قم بتخزين بيانات التحقق الخاصة بك (رابط المستودع، ورمز الالتزام، ومعاملات البناء) على السلسلة في PDA مملوك لبرنامج Otter Verify (verifycLy8mB96wd9wqq3WDXQwM4oU6r42Th37Db9fC)
  • الربط التشفيري: يتم اشتقاق PDA الخاص بك من عنوان برنامجك، مما يُنشئ رابطًا ثابتًا ببيانات التحقق الخاصة بك
  • الثقة اللامركزية: يمكن لأي شخص قراءة PDA الخاص بك والتحقق من برنامجك بشكل مستقل

لماذا يجب عليّ إنشاء PDA قبل استخدام واجهة برمجة التطبيقات؟

تعمل واجهة برمجة التطبيقات فقط مع PDAs الموجودة على السلسلة، وذلك لأن:

  • بدون ثقة: ترفض واجهة برمجة التطبيقات البيانات العشوائية - فهي تستخدم فقط ما قامت سلطة الترقية الخاصة بك بتخزينه على السلسلة
  • أبسط: فقط قدّم الموقّع و program_id؛ وستجلب واجهة برمجة التطبيقات كل شيء آخر من PDA الخاص بك
  • مقاوم للتلاعب: ينشئ PDA الخاص بك سجلًا ثابتًا يمكن لأي شخص التحقق منه بشكل مستقل
  • إثبات الملكية: يجب أن يكون الموقّع هو سلطة الترقية، مما يثبت تشفيريًا أنك تتحكم في البرنامج

كم مرة يجب أن أتحقق من برنامجي؟

قم بالتحقق من برنامجك:

  • بعد كل نشر أو ترقية
  • عند تحديث مستودع المصدر الخاص بك
  • لا داعي للقلق بشأن إعادة التحقق في غير ذلك - تقوم واجهة برمجة التطبيقات تلقائيًا بإعادة التحقق من جميع البرامج كل 24 ساعة

ماذا يحدث عند ترقية برنامجي؟

اتبع هذه الخطوات بعد الترقية:

  1. تكتشف واجهة برمجة التطبيقات الترقية الخاصة بك وتلغي التحقق من برنامجك.
  2. قم بتحديث PDA الخاص بك ببيانات التحقق الجديدة:
solana-verify verify-from-repo -um \
--program-id YourProgramId... \
https://github.com/your-org/your-program
  1. أرسل طلب تحقق جديدًا باستخدام سلطة الترقية الخاصة بك
  2. ستتحقق واجهة برمجة التطبيقات من إصدارك الجديد مقابل PDA المحدّث

مهم: قم دائمًا بتحديث PDA الخاص بك باستخدام سلطة الترقية مع رمز الالتزام الجديد للبرنامج المُرقَّى.

هل يمكنني الوثوق بنتائج التحقق؟

نعم - تم تصميم النظام ليكون غير موثوق مركزياً وقابلاً للتحقق بشكل مستقل:

ما الذي يجعله جديراً بالثقة:

  • PDA على السلسلة: تُخزَّن بيانات التحقق الخاصة بك على السلسلة، وليست خاضعة لسيطرة أي جهة مركزية
  • إثبات صلاحية الترقية: فقط جهة ترقية برنامجك يمكنها إنشاء/تحديث PDA
  • التحقق المستقل: يمكن لأي شخص التحقق عن طريق قراءة PDA الخاص بك وتشغيل solana-verify محلياً
  • إعادة التحقق المستمرة: تُعيد واجهة API التحقق تلقائياً من جميع البرامج كل 24 ساعة

افهم هذه القيود:

  • التحقق يُؤكد تطابق الكود المصدري مع النسخة المُنشورة - وليس أن الكود آمن
  • راجع الكود دائماً قبل التفاعل مع البرامج
  • التحقق ≠ التدقيق، أو الأمان
  • تحقق من المستودع والـ commit في PDA للتأكد من أنه من مصدر موثوق

كيف يمكنني التحقق من برنامج بشكل مستقل؟

تحقق من أي برنامج بنفسك عن طريق قراءة PDA الخاص به على السلسلة وتشغيل التحقق محلياً:

الخطوة الأولى: قراءة PDA على السلسلة

# Install solana-verify if you haven't
cargo install solana-verify
# Get the PDA data
solana-verify list-program-pdas --program-id YourProgramId...

الخطوة الثانية: التحقق محلياً

# Verify using the repository and commit & other arguments from the PDA
solana-verify verify-from-repo \
--program-id YourProgramId... \
https://github.com/your-org/your-program
--commit-hash <commit-hash>
... (other arguments from the PDA)
# Confirm the hash output matches the onchain program hash

هذا يُثبت:

  1. بيانات PDA أصيلة (مُخزَّنة على السلسلة)
  2. الكود المصدري في مستودع PDA يطابق البرنامج المُنشور
  3. لا تحتاج إلى الوثوق بواجهة API - تحقق من كل شيء بنفسك على السلسلة

هل يمكن لشخص آخر التحقق من برنامجي دون إذن؟

نعم، وهذا هو السبب في أننا نشترط أن يكون الموقِّع هو جهة الترقية. نعتبر التحقق صالحاً فقط إذا كان الموقِّع هو جهة الترقية.

ما الذي أحتاجه لإنشاء بناءات قابلة للتحقق؟

قم بتثبيت هذه الأدوات:

  • Docker (للبناءات الحتمية)
  • Cargo (مدير حزم Rust)
  • سولانا Verify CLI: cargo install solana-verify
  • مستودع Git عام يحتوي على الكود المصدري الخاص بك

هل يمكنني التحقق من المستودعات الخاصة؟

لا - يتطلب التحقق الوصول إلى الكود المصدري العام:

  • يخزّن PDA الخاص بك رابط مستودع عام يمكن لأي شخص الوصول إليه
  • يعتمد التحقق غير الموثوق على إمكانية الوصول إلى الكود العام
  • يحتاج المستخدمون إلى قراءة الكود المصدري لفهم ما يفعله برنامجك
  • الهدف الكامل هو السماح للمستخدمين بالتحقق بشكل مستقل من تطابق الكود المصدري مع النشر

المستودعات الخاصة تُخل بنموذج الثقة الأساسي لنظام التحقق.

كيف أتحقق من برنامج يتحكم فيه Squads Multisig؟

اتبع هذه الخطوات للبرامج التي يتحكم فيها multisig:

# 1. Build and deploy normally
solana-verify build
solana program deploy <your-program.so> --program-id YourProgramId...
# 2. Verify locally first - confirm the hash matches
solana-verify verify-from-repo -um \
--program-id YourProgramId... \
https://github.com/your-org/your-program
# 3. Export the PDA creation transaction
solana-verify export-pda-tx \
--program-id YourProgramId... \
https://github.com/your-org/your-program
# 4. Execute the PDA transaction through your Squads Multisig interface
# 5. After multisig execution, trigger remote verification
solana-verify remote submit-job \
--program-id YourProgramId... \
--uploader YourMultisigAddress...

تنبيه مهم: تحقق دائمًا محليًا (الخطوة 2) للتأكد من تطابق هاش البناء قبل تصدير معاملة PDA.

الخاتمة

يضمن استخدام البناءات الموثقة على سولانا سلامة برامجك وموثوقيتها على الشبكة، ويتيح للمطورين العثور على حزم SDK الخاصة بك مباشرةً من Solana Explorer. من خلال الاستفادة من أدوات مثل Solana Verify CLI وDocker، يمكنك الحفاظ على بناءات قابلة للتحقق وآمنة تتوافق مع الكود المصدري الخاص بك. احرص دائمًا على اتخاذ الاحتياطات اللازمة لاستخدام بيئات متسقة، وفكّر في حلول الحوكمة لضمان ترقيات ونشر آمنَين.

الأمان + إخلاء المسؤولية

على الرغم من أن البناءات الموثقة تُعدّ أداة قوية لضمان سلامة برامج سولانا الخاصة بك، إلا أنها ليست موثوقة بالكامل في الإعداد الافتراضي. إذ تُبنى صور Docker وتُستضاف من قِبل مؤسسة سولانا.

كن على دراية بأنك تبني مشروعك داخل صورة Docker محمّلة، وأن إعدادك بالكامل يُنسخ إلى تلك الصورة أثناء البناء، بما قد يشمل معلومات حساسة.

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

علاوة على ذلك، فيما يتعلق بالتحقق عن بُعد، فأنت تثق بـ OtterSec API و مستكشف سولانا إلى حدٍّ معين.

قد يعرض الـ API أو مستكشف سولانا معلومات غير صحيحة في حال تعرّضه للاختراق.

إذا أردت إعداداً لا يتطلب أي ثقة بطرف ثالث، يمكنك تشغيل Verify API بنفسك، أو تشغيل التحقق من البرنامج محلياً باستخدام أمر verify-from-repo مع بيانات التحقق المحفوظة على السلسلة في PDA المشتقة من صلاحية نشر البرنامج و برنامج التحقق.

تم نشر برنامج التحقق من قِبَل فريق OtterSec ولم يتم تجميده بعد، مما يعني إمكانية تحديثه في أي وقت.

لا تتحمل مؤسسة سولانا، ولا OtterSec، ولا فريق Ellipsis Labs أي مسؤولية عن الخسائر أو الأضرار التي قد تنجم عن استخدام خط أنابيب البنيات المُتحقَّق منها.

ملف Security.txt لبرامج سولانا

بالإضافة إلى البنيات المُتحقَّق منها، يمكنك أيضاً إضافة ملف security.txt إلى برنامجك. في المستقبل، وبمجرد تنفيذ ذلك، سيحتوي security.txt على المفتاح العام للمُتحقِّق لتسهيل الوصول إلى بيانات التحقق المخزنة في PDA الخاص بالتحقق. يُشتَق الـ PDA الذي يحتوي على جميع المعلومات اللازمة لبناء البرنامج والتحقق منه من عنوان البرنامج وال pubkey الخاص بالمُتحقِّق. بشكل افتراضي، يكون هذا هو نفس pubkey الذي قام ببناء البرنامج ونشره، غير أنه يمكن أيضاً تحديد pubkey آخر في ملف security.txt.

تتيح ميزة security.txt للمطورين تضمين معلومات الاتصال والأمان مباشرةً داخل عقودهم الذكية على سولانا. مستوحاةً من securitytxt.org، توفر هذه المقاربة طريقة موحّدة تمكّن باحثي الأمن من التواصل مع مشرفي المشاريع، حتى لو كانوا يعرفون عنوان العقد فحسب.

لماذا تستخدم security.txt؟

بالنسبة للعديد من المشاريع، وخاصةً الأصغر حجمًا أو الخاصة منها، قد يكون تحديد المطورين من عنوان العقد وحده أمرًا صعبًا ويستغرق وقتًا طويلًا. إن تضمين ملف security.txt داخل البرنامج يضمن أن يتمكن باحثو الأمن من التواصل بسهولة مع الأشخاص المناسبين، مما قد يحول دون الاستغلال ويضمن الإبلاغ عن الثغرات في الوقت المناسب.

كيفية تطبيق security.txt

لإضافة security.txt إلى برنامج سولانا الخاص بك، اتبع الخطوات التالية:

أضف تبعية solana-security-txt إلى ملف Cargo.toml الخاص بك:

Cargo.toml
[dependencies]
solana-security-txt = "1.1.1"

استخدم الماكرو security_txt! في عقدك لتعريف معلومات الأمان الخاصة بك. يمكنك تضمين تفاصيل الاتصال وعناوين URL للمشروع، وحتى سياسة أمان. إليك مثال على ذلك:

#[cfg(not(feature = "no-entrypoint"))]
use {default_env::default_env, solana_security_txt::security_txt};
#[cfg(not(feature = "no-entrypoint"))]
security_txt! {
name: "MyProject",
project_url: "https://myproject.com",
contacts: "email:security@myproject.com,discord:security#1234",
policy: "https://myproject.com/security-policy",
// Optional Fields
preferred_languages: "en,de",
source_code: "https://github.com/solana-developers/solana-game-preset",
source_revision: "5vJwnLeyjV8uNJSp1zn7VLW8GwiQbcsQbGaVSwRmkE4r",
source_release: "",
encryption: "",
auditors: "Verifier pubkey: 5vJwnLeyjV8uNJSp1zn7VLW8GwiQbcsQbGaVSwRmkE4r",
acknowledgements: "Thank you to our bug bounty hunters!"
}

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

أفضل الممارسات

  • استخدم الروابط: بالنسبة للمعلومات التي قد تتغير (مثل تفاصيل الاتصال)، يُنصح بالإشارة إلى صفحة ويب بدلًا من ترميزها مباشرةً في العقد. وهذا يتجنب الحاجة إلى ترقيات متكررة للبرنامج.

  • التحقق: قبل النشر، تحقق من التنسيق والمحتوى باستخدام أداة query-security-txt، التي يمكنها التحقق من صحة كلٍّ من البرامج على السلسلة والملفات الثنائية المحلية:

query-security-txt target/bpfel-unknown-unknown/release/my_contract.so

من خلال تضمين معلومات الاتصال الأمنية مباشرةً في عقدك، تُسهّل على الباحثين التواصل معك، مما يعزز الأمان والتواصل الفعّال داخل منظومة سولانا.

هذا مثال على شكل security.txt في مستكشف سولانا

مشروع security.txt تتولى صيانته Neodyme Labs

يمكنك التحقق من حالة التوثيق واستعراض البرامج الموثقة على verify.osec.io.

Is this page helpful?

جدول المحتويات

ما هي البناءات المتحقق منها؟كيف يعمل ذلك؟لماذا يجب أن أستخدم البناءات المتحقق منها؟كيف أنشئ إصدارات موثقة؟تثبيت دوكر وكارجوتثبيت واجهة سطر أوامر التحقق من سولاناتجهيز المشروعبناء برامج قابلة للتحققنشر البرامج القابلة للتحققالتحقق مقابل المستودعاتالتحقق مقابل واجهة برمجة التطبيقات العامةكيفية التحقق من برنامجك عندما يكون خاضعاً لسيطرة Multisig مثل Squads1. بناء البرنامج القابل للتحقق2. نشر البرنامج3. الالتزام بالمستودع والتحقق منه4. نقل صلاحية البرنامج إلى التوقيع المتعدد5. تصدير معاملة PDA6. إرسال المعاملة عبر Squads7. إرسال مهمة التحقق عن بُعد8. تحديث البرنامج (اختياري)9. تصدير وإرسال معاملة PDA الجديدةالتحقق من صورة Dockerمثال على بناء تم التحقق منهالبرامج الشائعة التي تم التحقق منها بالفعلPhoenixSquads V3Drift V2Marginfi V2الأسئلة الشائعةالتحقق لديّ يفشل. ماذا يجب أن أفعل؟تجزئة البناء المحلي لديّ لا تتطابق مع التجزئة على السلسلة. لماذا؟كم من الوقت سيستغرق التحقق من برنامجي؟برنامجي غير قابل للتغيير (لا توجد صلاحية ترقية). كيف يمكنني التحقق منه؟ما هو الـ PDA ولماذا يهم؟لماذا يجب عليّ إنشاء PDA قبل استخدام واجهة برمجة التطبيقات؟كم مرة يجب أن أتحقق من برنامجي؟ماذا يحدث عند ترقية برنامجي؟هل يمكنني الوثوق بنتائج التحقق؟كيف يمكنني التحقق من برنامج بشكل مستقل؟هل يمكن لشخص آخر التحقق من برنامجي دون إذن؟ما الذي أحتاجه لإنشاء بناءات قابلة للتحقق؟هل يمكنني التحقق من المستودعات الخاصة؟كيف أتحقق من برنامج يتحكم فيه Squads Multisig؟الخاتمةالأمان + إخلاء المسؤوليةملف Security.txt لبرامج سولانالماذا تستخدم security.txt؟كيفية تطبيق security.txtأفضل الممارسات
تعديل الصفحة