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

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

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

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

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

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

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

تم تصميم خط أنابيب البناءات المتحقق منها والحفاظ عليه بواسطة 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 إلى الأمر.

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

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

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

يُنصح باستخدام عنوان RPC مدفوع لأنك قد تواجه حدود معدل استخدام خدمات RPC المجانية. لذا بدلاً من -um يجب عليك استخدام --url yourRpcUrl للحصول على تحقق أكثر موثوقية.

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

الافتراضي هو واجهة برمجة تطبيقات OtterSec.

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

يمكنك أيضًا تشغيل مهمة عن بُعد يدويًا باستخدام:

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

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

سيؤدي هذا إلى إرسال مهمة إلى واجهة برمجة تطبيقات OtterSec ويمكنك بعد ذلك التحقق من حالة المهمة باستخدام:

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

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

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

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

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

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

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

بمجرد الانتهاء من ذلك، نقوم بإرسال المشروع إلى جيثب. إليك مثالاً: 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. يجب أن تكون قادراً على رؤية ذلك في مستكشف سولانا وأماكن أخرى الآن.

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 on-chain 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

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

التحقق من صورة دوكر

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

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 on-chain 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

أخيرًا، يمكنك أيضًا التحقق من البرنامج مباشرة مقابل واجهة برمجة تطبيقات OtterSec:

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

يرسل أمر --remote طلب بناء إلى واجهة برمجة تطبيقات OtterSec، مما يؤدي إلى بناء عن بُعد لبرنامجك. بمجرد اكتمال البناء، يتحقق النظام من أن تجزئة برنامجك على السلسلة تتطابق مع تجزئة ناتج البناء المُنشأ من مستودعك.

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

فينيكس (Phoenix)

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

الناتج النهائي:

Executable Program Hash from repo: 6877a5b732b3494b828a324ec846d526d962223959534dbaf4209e0da3b2d6a9
On-chain 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
On-chain 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
On-chain 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
On-chain Program Hash: 890d68f48f96991016222b1fcbc2cc81b8ef2dcbf280c44fe378c523c108fad5
Program hash matches ✅

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

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

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

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

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

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

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

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

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

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

  • البرامج البسيطة: 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 الخاص به على السلسلة وتشغيل التحقق محلياً:

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

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

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

# 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 on-chain program hash

هذا يثبت:

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

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

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

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

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

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

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

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

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

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

كيف أتحقق من برنامج يتحكم فيه 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) لتأكيد أن hash البناء يطابق قبل تصدير معاملة PDA.

الخاتمة

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

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

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

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

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

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

قد تعرض واجهة برمجة التطبيقات أو مستكشف Solana معلومات غير صحيحة في حالة تعرضها للاختراق.

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

تم نشر برنامج التحقق بواسطة فريق OtterSec وهو غير مجمد بعد، لذا يمكن ترقيته في أي وقت.

مؤسسة Solana وOtterSec وفريق Ellipsis Labs غير مسؤولين عن أي خسائر أو أضرار قد تحدث نتيجة استخدام خط إنتاج الإصدارات المعتمدة.

ملف Security.txt لبرامج Solana

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

تتيح ميزة security.txt للمطورين تضمين معلومات الاتصال والأمان مباشرة داخل عقودهم الذكية على Solana. مستوحاة من 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 في برنامجك، يمكن الاستعلام عنها بسهولة عبر أدوات مثل Solana Explorer، مما يضمن توفر بيانات الاتصال والأمان الخاصة بك لأي شخص يرغب في الإبلاغ عن المشكلات المحتملة.

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

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

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

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

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

هذا مثال على كيفية ظهور security.txt في Solana Explorer

يتم صيانة مشروع security.txt بواسطة Neodyme Labs

يمكنك التحقق من حالة التحقق وتصفح البرامج المعتمدة على verify.osec.io.

Is this page helpful?

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

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

تدار بواسطة

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