اختبار الخاصية لتشفير Base58Check الخاص بنا باستخدام أوراكل خارجي

مؤخرًا ، كتبنا برنامج تشفير Base58Check لتشغيل مفتاح Bitcoin الخاص ومولد العناوين العامة. نظرًا لكوننا مطورين مجتهدين ، فقد أضفنا اختبار وحدة للتأكد من أن برنامج التشفير لدينا يعمل كما توقعنا.

لكن هل كان ذلك كافياً؟

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

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

Oracles واختبار الممتلكات

تم تنفيذ خوارزمية تشفير

Base58Ch e ck عدة مرات بواسطة العديد من المطورين المختلفين. ألن يكون رائعًا إذا تمكنا من التحقق تلقائيًا من تنفيذنا مقابل تنفيذها؟

نستطيع!

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

لحسن الحظ ، لدينا أوراكل مثالي في شكل أدوات CLI الخاصة بـ Bitcoin Explorer. يتم شحن Bitcoin Explorer مع أداة base58check-encode والتي تقوم Base58Check بتشفير أي سلسلة Base16 مع بايت إصدار معين:

بالنظر إلى هذه الوسيطة ، يمكننا اختبار تنفيذنا بدقة وإيجاز باستخدام خاصية واحدة. الخاصية الأساسية المطلوبة لحلنا هي أنه يجب أن يتطابق مع إخراج bx base58check-encode لجميع المدخلات الصالحة.

يعد اختبار الملكية أمرًا بسيطًا من حيث المفهوم ، ولكنه أكثر صعوبة من الناحية العملية.

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

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

لتبليل أقدامنا ، دعنا نكتب اختبار خاصية بسيطًا باستخدام StreamData الذي يتحقق من الخاصية الترابطية لوظيفة الإضافة Kernel. + / 2 :

تحدد الكلمة الرئيسية property اختبار الملكية الجديد مع وصف قصير للممتلكات قيد الاختبار.

تتيح لنا كتلة التحقق من الكل تحديد المدخلات التي تم إنشاؤها تلقائيًا وكتلة الوظائف التي ستستخدم هذه المدخلات لعمل تأكيدات حول ممتلكاتنا.

ببساطة ، نقول لـ StreamData إننا نريد ثلاثة أعداد صحيحة عشوائية: a و b و c . لكل مجموعة من a و b و c ، نريد التحقق من أن (a + b) + c يساوي a + (b + c) .

يقوم StreamData بهذا عن طريق إنشاء العديد من المجموعات العشوائية (مائة بشكل افتراضي) من a و b و c والتحقق منها في مقابل التأكيدات. في حالة فشل أي تأكيد ، سيحاول StreamData “تقليص” مجموعة الإدخال ( a و b و c ، في هذه الحالة) إلى أبسط حالة اختبار لرسوب ممكن وتقديمها إلينا.

الحمد لله ، الإضافة ترابطية ، واختبارنا ناجح!

استشارة Oracle

دعنا الآن نزيل عجلات التدريب ونكتب اختبار خاصية لتشفير Base58Check الخاص بنا مقابل أوراكلنا الخارجي.

أولاً ، سنحدد قالب اختبار جديد:

ضمن الاختبار الذي أجريناه ، سننشئ متغيرين عشوائيين ، المفتاح و <الرمز> الإصدار :

نُخبر StreamData أن المفتاح يمكن أن يكون أي ملف ثنائي غير فارغ ، ويمكن أن يكون هذا الإصدار أي بايت.

الآن بعد أن أصبح لدينا مجموعة بيانات الاختبار الخاصة بنا ، سنحتاج إلى الحصول على نتيجة تشفير key بإصدار باستخدام تطبيقنا الخاص لخوارزمية التشفير Base58Check:

بعد ذلك ، سنستخدم System.cmd Elixir لاستدعاء bx base58check-encode ، مروراً بسلسلة المشفرة باستخدام Base16 و البايت لدينا :

كل ما تبقى الآن هو التحقق من أن النتيجة تطابق إخراج أوراكل :

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

ولكن لحسن الحظ ، اجتاز تطبيقنا لخوارزمية ترميز Base58Check الاختبار:

الأفكار النهائية

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

إذا كنت مهتمًا بالاختبار المستند إلى الملكية ، فأوصيك بمراجعة اختبار فريد هيبرت PropEr ، ومقالات Hillel Wayne حول اختبار الفرضيات باستخدام وظائف أوراكل واختبار الملكية باستخدام العقود.

أخيرًا ، إذا كنت مهتمًا بتطوير Bitcoin ، فأنا أشجعك على التحقق من إتقان عمل Andreas Antonopoulos.

تم النشر في الأصل على www.petecorey.com في 12 فبراير 2018.