عقود Ethereum Oracle: الإعداد والتوجيه

نشرت: 2022-03-11

تعد عقود Ethereum الذكية أكثر من مجرد "الشيء الساخن الجديد". أعتقد أنهم (أو أي شيء مرتبط بهم) على استعداد لتغيير الطريقة التي يتعامل بها البشر مع بعضهم البعض في العصر الجديد القادم للإنترنت. سيحدد الوقت ما إذا كان هذا هو الحال.

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

  • الجزء 1: مقدمة عن التطوير باستخدام الكمأة ، وإعداد المشروع لمزيد من التجارب
  • الجزء 2: الخوض في الكود لفحص أعمق
  • الجزء 3: مناقشة مفاهيمية لوراكي مع العقود الذكية

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

  • احصل على الإعداد لبناء عقود ذكية مع Truffle.
  • بناء مشروع عقد ذكي يخدمنا في الجزأين 2 و 3.
  • قدم بعض المفاهيم المتعلقة بعقود Ethereum الذكية وترميز العقود الذكية.
  • قدم دورة التجميع / التشغيل / التصحيح باستخدام عقود الكمأة والعقود الذكية.

التعريف: Oracle. وسيلة للعقود الذكية للوصول إلى البيانات من العالم خارج blockchain. نوع من العقود الذكية نفسها ، تأخذ oracles البيانات من العالم الخارجي وتضعها في blockchain لاستهلاك العقود الذكية الأخرى.

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

متطلبات البرنامج

  • سيعمل أي نظام تشغيل رئيسي ، على الرغم من أن بعض عمليات التثبيت والإعداد ستكون مختلفة بالطبع على الأنظمة المختلفة. لقد فعلت كل هذا على Ubuntu Linux (16.04). لم أواجه أي مشاكل في إعداد البيئة على Windows. لم أجرب نظام Mac ، على الرغم من أنني أدرك أنه من الشائع القيام بذلك على Mac أيضًا.
  • ليس من الضروري تشغيل عقدة eth كاملة ؛ سوف نستخدم الكمأة ، التي تأتي مع testnet الخاص بها. إذا كنت تعرف القليل عما تفعله ، فيمكنك استخدام أي شبكة اختبار أخرى من اختيارك ؛ تعتبر testnet المحلية لتطوير Truffle هي الأسهل والأكثر سهولة لأغراض هذا البرنامج التعليمي.

متطلبات المعرفة

  • المعرفة الأساسية لكيفية عمل blockchain
  • فهم ما هو العقد الذكي القائم على blockchain
  • ستكون بعض التجارب الأساسية التي تتسم بالمرح مع تطوير العقود الذكية مفيدة ، ولكنها ليست ضرورية إذا كنت ذكيًا وطموحًا. (وأنا أعلم أنك!)

يمكن أن تكون سلسلة المقالات هذه بمثابة مقدمة أولى للعقود الذكية ، لكنها تتطور بسرعة كبيرة إلى مفاهيم أكثر تقدمًا. إذا كان هذا هو أول برنامج تعليمي لعقد eth ذكي ، فاستعد للصعود إلى الارتفاع بسرعة. إذا كنت تشعر بالثقة ، عظيم ؛ إذا لم يكن الأمر كذلك ، فلا تتردد في الحصول على برنامج تعليمي أبسط من نوع "hello world" أو نوعين تحت حزامك أولاً. تحقق من واحدة أو سابقة مقالات Ethereum و Cryptozombies ، للمبتدئين.

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

وصف مثال التطبيق

حالة الاستخدام: يراهن المستخدمون على مباريات الملاكمة.

  • يمكن للمستخدم سحب قائمة من مباريات الملاكمة القادرة على الرهان.
  • يمكن للمستخدم اختيار المباراة والمراهنة على الفائز.
  • يمكن للمستخدم المراهنة على أي مبلغ أعلى من الحد الأدنى المحدد.
  • إذا خسر اختيار المستخدم ، يخسر المستخدم المبلغ الكامل للرهان.
  • إذا فاز اختيار المستخدم ، يحصل المستخدم على جزء من الرهان بناءً على حجم رهانه / الرهان وإجمالي المبلغ الذي يراهن على الخاسر في المباراة ، بعد أن يأخذ المنزل (صاحب العقد) نسبة صغيرة من المكاسب .

ما هي أوراكل Ethereum؟

لا تزال العقود الذكية شيئًا جديدًا ؛ إنهم لم يأخذوا الاتجاه السائد بعد ، ولم يتم حتى الآن صياغة العديد من الجوانب المتعلقة بكيفية عملهم وتوحيدها. سأشرح بإيجاز الدافع وراء فكرة "أوراكل" - والتحلي بالصبر ؛ سوف نتعمق أكثر في الأجزاء اللاحقة.

لا تشبه هندسة عقد blockchain برمجة تطبيق خادم العميل. أحد الاختلافات المهمة هو أن البيانات التي يتفاعل معها العقد ، يجب أن تكون موجودة بالفعل على blockchain. لا يوجد استدعاء للخروج من blockchain. لا يقتصر الأمر على كونه غير مدعوم من قبل اللغة ، بل لا يدعمه نموذج blockchain. يمكن أن يأخذ العقد رهانات على شكل عملة قائمة على Ethereum ، ويخزنها في العقد ، ويحررها إلى عناوين المحفظة الصحيحة وفقًا للصيغة ، عندما يتم الإعلان عن الفائز في المباراة. لكن كيف يعرف العقد الفائز؟ لا يمكنه الاستعلام عن واجهة برمجة تطبيقات REST أو أي شيء من هذا القبيل. يمكنه فقط استخدام البيانات الموجودة بالفعل في blockchain! تواجه العديد من حالات استخدام العقود الذكية مشكلة مماثلة - فهي محدودة للغاية ما لم تتمكن من التفاعل مع العالم خارج blockchain.

إذا كان العقد لا يتفاعل إلا مع البيانات الموجودة على blockchain ، فإن الحل الواضح هو حقن البيانات اللازمة في blockchain. وهذا ما هو أوراكل. أوراكل هو عقد آخر يقوم بحقن البيانات في blockchain ، مما يسمح للعقود الأخرى باستهلاكها. في حين أن هذا قد يثير تساؤلات حول الثقة وعدم الثقة ، فقط تقبل الآن أن هذا هو أوراكل. في الجزء 3 من هذه السلسلة ، سنناقش تلك الفروق الدقيقة. في حالة الاستخدام في مثالنا ، سيكون oracle هو العقد الذي يضخ البيانات في blockchain ، فيما يتعلق (أ) ما هي المطابقات المتاحة و (ب) الفائز بهذه المباريات ، بمجرد تحديده.

إعداد بيئة تطوير Ethereum

للإعداد الأساسي ، سنقوم بتثبيت:

  • جيث (اختياري في الوقت الحالي)
  • الكمأة
  • Ganache CLI (اختياري)
  • بيئة تطوير (اختياري)

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

توضيح عملية عقود أوراكل

تثبيت Geth (اختياري)

لقطة شاشة لتثبيت جيث انقر لرؤية الصورة بالحجم الكامل.

Geth هو Go-ethereum ، وهو برنامج Ethereum الأساسي ؛ في حين أنه ليس ضروريًا لهذا التمرين على الإطلاق ، إلا أنه يتعين على أي مطور إيثريوم محتمل أن يمتلكه ويكون على دراية به. سيكون ذلك ضروريًا إذا كنت ستنشر عقدك الذكي على شبكة Ethereum الحية.

  • http://www.talkcrypto.org/blog/2018/01/23/what-is-geth/
  • https://github.com/ethereum/go-ethereum/wiki/Installation-Instructions-for-Ubuntu
  • https://github.com/ethereum/go-ethereum/wiki/Installation-instructions-for-Windows

تثبيت الكمأة

لقطة شاشة لتركيب الكمأة انقر لرؤية الصورة بالحجم الكامل.

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

  • https://truffleframework.com/docs/truffle/getting-started/installation
  • https://github.com/trufflesuite/truffle
  • https://truffleframework.com/tutorials/how-to-install-truffle-and-testrpc-on-windows-for-blockchain-development

تثبيت Ganache CLI (اختياري)

لقطة شاشة لتثبيت Ganache CLI انقر لرؤية الصورة بالحجم الكامل.

أوصي بتثبيت Ganache CLI لاستخدامه كأداة اختبار أخرى ، على الرغم من أننا لن نستخدمها بالفعل في برنامجنا التعليمي. إنه اختياري.

https://github.com/trufflesuite/ganache-cli

بيئة تطوير Ethereum

سيكون من الممكن القيام بهذا البرنامج التعليمي بأكمله باستخدام أي محرر نصوص بسيط ، مثل Notepad ++ أو gedit أو vi أو أي محرر نصوص أو IDE من اختيارك. أنا شخصياً أستخدم Visual Studio Code بالملحقات التالية:

  • صلابة
  • امتدت الصلابة
  • موضوع رمز المادة

ملاحظة: الامتدادات غير مطلوبة - فهي فقط توفر بيئة تشفير أفضل.

إعداد المدونة

إعداد مشروع

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

إنشاء دليل لإيواء كل التعليمات البرمجية ؛ نسميها أوراكل على سبيل المثال .

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

  • / oracle-example / client
  • / oracle-example / oracle

انتقل إلى مجلد العميل ، لأن هذا هو أول مشروع سنقوم بتطويره. افتح نافذة طرفية (سطر أوامر) في مجلد / oracle-example / client .

قم بتشغيل الأمر truffle init .

لاحظ أنه من بين العديد من الملفات التي تم إنشاؤها ، توجد ملفات truffle -config.js و truffle.js . لا نحتاج إلى كليهما ، لذا احذف ملف truffle-config.js (فقط لتجنب الارتباك والفوضى).

نحتاج إلى تعديل truffle.js حتى نوجه Truffle في الاتجاه الصحيح للاختبار. استبدل محتويات truffle.js بما يلي:

 module.exports = { networks: { development: { host: "localhost", port: 8545, network_id: "*" // Match any network id } } };

https://github.com/jrkosinski/oracle-example/tree/part1-step1/client/truffle.js

لاحظ أن Truffle init أنشأت دليلًا يسمى عمليات الترحيل ( oracle-example / client / migrations ). يجب أن يكون داخل هذا المجلد ملف باسم 1_initial_migration.js .

أضف ملفًا آخر في دليل التهجيرات وقم بتسميته 2_deploy_contracts.js ، بالمحتوى التالي:

 var BoxingBets = artifacts.require("BoxingBets"); module.exports = function(deployer) { deployer.deploy(BoxingBets); };

https://github.com/jrkosinski/oracle-example/tree/part1-step1

إضافة الكود

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

الكود الكامل لهذه الخطوة في العملية متاح على GitHub: https://github.com/jrkosinski/oracle-example/tree/part1-step1

عقود في سوليديتي

يشبه "العقد" في Solidity تقريبًا فئة في اللغات الأخرى الموجهة للكائنات. تمت مقارنة اللغة نفسها مع Golang و JavaScript ، من بين لغات أخرى. بعض تراكيب اللغات الأخرى في Solidity - والتي سيكون لدينا أمثلة عليها لاحقًا - هي المُعدِّلات والمكتبات والواجهات. يتم دعم الميراث (بما في ذلك الميراث المتعدد) للعقود. ملفات عقود Solidity لها امتداد سول.

واجهة أوراكل

أضف هذا الملف إلى مشروعك: /oracle-example/client/contracts/OracleInterface.sol

https://github.com/jrkosinski/oracle-example/tree/part1-step1/client/contracts/OracleInterface.sol

لقطة شاشة لواجهة أوراكل انقر لرؤية الصورة بالحجم الكامل.

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

عقد العميل

أضف هذا الملف إلى مشروعك: /oracle-example/client/contracts/BoxingBets.sol

https://github.com/jrkosinski/oracle-example/tree/part1-step1/client/contracts/BoxingBets.sol

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

ترجمة وتشغيل

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

تجميع وترحيل العقد

افتح Terminal في / oracle-example / client / folder

قم بتجميع الكود باستخدام هذا الأمر:

 truffle compile 
لقطة من تجميع وترحيل العقد انقر لرؤية الصورة بالحجم الكامل.
لقطة الشاشة الثانية لتجميع وترحيل العقد انقر لرؤية الصورة بالحجم الكامل.

البديل: استخدم البرنامج النصي لشل recompile.sh الخاص بي (https://github.com/jrkosinski/oracle-example/tree/part1-step1/client/recompile.sh).

لاحظ أنك سترى الكثير من التحذيرات ، لأن الكود الخاص بنا ليس في شكله النهائي بعد!

افتح وحدة تطوير Truffle:

 truffle develop

الآن ، في وحدة تحكم مطوري Truffle ، انتقل إلى شبكة الاختبار:

 truffle(develop)> migrate

قم بتشغيل العقد

في موجه وحدة التحكم في التطوير ، أدخل سطر التعليمات البرمجية التالي:

 truffle(develop)> BoxingBets.deployed().then(inst => { instance = inst })

الآن ، "المثيل" هو المتغير الذي يشير إلى عقد BoxingBets ويمكن استخدامه لاستدعاء طرقه العامة.

اختبره باستخدام الأمر التالي:

 truffle(develop)> instance.test(3, 4)

لاحظ أننا قمنا بتضمين وظيفة "اختبار" عامة في BoxingBets.sol . إنه يجمع أي رقمين تمررهما إليه ، فقط لإثبات أن العقد ينفذ الكود ، ويمكننا تسميته من وحدة تحكم تطوير Truffle. إذا حصلنا على استجابة عاقلة المظهر (انظر أدناه) ، فإن مهمتنا هنا قد اكتملت (في الوقت الحالي على الأقل).

افصل بين Ethereum Oracle

إذا نجح كل شيء حتى الآن ، فنحن فوق الحدبة. الشيء التالي الذي سنفعله هو فصل عقد أوراكل عن عقد BoxingBets. في الاستخدام الحقيقي ، سيكون عقد oracle منفصلاً عن عقد العميل على blockchain ، لذلك سنحتاج إلى أن نكون قادرين على:

رسم تخطيطي لعمليات عقد الإيثيريوم أوراكل

  • قم بتجسيده عن طريق عنوان blockchain.
  • تغيير عنوان أوراكل ديناميكيًا الذي يستخدمه عقد العميل للإشارة إلى أوراكل.

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

عقد العميل

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

انتقل إلى /oracle-example/client/contracts/OracleInterface.sol . كما أشرنا من قبل ، هذه ليست واجهة حاليًا ، لكننا على وشك أن نجعلها واحدة. استبدل ما يوجد بمحتويات:

https://github.com/jrkosinski/oracle-example/tree/part1-step2/client/contracts/OracleInterface.sol

 pragma solidity ^0.4.17; contract OracleInterface { enum MatchOutcome { Pending, //match has not been fought to decision Underway, //match has started & is underway Draw, //anything other than a clear winner (eg cancelled) Decided //index of participant who is the winner } function getPendingMatches() public view returns (bytes32[]); function getAllMatches() public view returns (bytes32[]); function matchExists(bytes32 _matchId) public view returns (bool); function getMatch(bytes32 _matchId) public view returns ( bytes32 id, string name, string participants, uint8 participantCount, uint date, MatchOutcome outcome, int8 winner); function getMostRecentMatch(bool _pending) public view returns ( bytes32 id, string name, string participants, uint participantCount, uint date, MatchOutcome outcome, int8 winner); function testConnection() public pure returns (bool); function addTestData() public; }

في BoxingBets.sol ، سنستبدل هذا السطر:

 OracleInterface internal boxingOracle = new OracleInterface();

مع هذين السطرين:

 address internal boxingOracleAddr = 0; OracleInterface internal boxingOracle = OracleInterface(boxingOracleAddr);

الآن ما نريده هو طريقة لتعيين عنوان أوراكل ديناميكيًا ووظيفة يمكننا الاتصال بها لمعرفة عنوان أوراكل الحالي. أضف هاتين الوظيفتين إلى BoxingBets.sol :

 /// @notice sets the address of the boxing oracle contract to use /// @dev setting a wrong address may result in false return value, or error /// @param _oracleAddress the address of the boxing oracle /// @return true if connection to the new oracle address was successful function setOracleAddress(address _oracleAddress) external onlyOwner returns (bool) { boxingOracleAddr = _oracleAddress; boxingOracle = OracleInterface(boxingOracleAddr); return boxingOracle.testConnection(); } /// @notice gets the address of the boxing oracle being used /// @return the address of the currently set oracle function getOracleAddress() external view returns (address) { return boxingOracleAddr; }

وأخيرًا ، لاختبار الاتصال بين العميل و oracle ، يمكننا استبدال وظيفة الاختبار في BoxingBets بوظيفة لاختبار اتصال oracle:

 /// @notice for testing; tests that the boxing oracle is callable /// @return true if connection successful function testOracleConnection() public view returns (bool) { return boxingOracle.testConnection(); }

ملك

لاحظ أن تعريف setOracleAddress له مُعدِّل onlyOwner . هذا يقيد هذه الوظيفة من أن يتم استدعاؤها من قبل أي شخص آخر غير مالك العقد ، على الرغم من أن الوظيفة عامة. هذه ليست ميزة لغوية. تم توفير ذلك لنا بموجب عقد Ownable ، الذي تم إلغاؤه من مكتبة OpenZeppelin لعقود Solidity للمرافق العامة. سوف ندخل في تفاصيل ذلك في الجزء 2 ، ولكن من أجل تسهيل استخدام معدِّل onlyOwner هذا ، نحتاج إلى إجراء بعض التغييرات:

انسخ Ownable.sol من https://github.com/jrkosinski/oracle-example/tree/part1-step2/client/contracts/Ownable.sol إلى / oracle-example / client / Contracts / .

أضف إشارة إليه في الجزء العلوي من BoxingBets.sol ، مثل:

 import "./Ownable.sol";

(يمكنك إضافته مباشرة أسفل السطر الذي يستورد OracleInterface.sol .)

قم بتعديل إعلان عقد BoxingBets لجعله يرث من Ownable ، من هذا:

 contract BoxingBets {

الى هذا:

 contract BoxingBets is Ownable {

ويجب أن نكون جاهزين. الكود الكامل موجود هنا في حالة ضياعك: https://github.com/jrkosinski/oracle-example/tree/part1-step2/client/contracts

عقود أوراكل

اقامة

الآن بعد أن حاول عقد BoxingBets الإشارة إلى عقد منفصل تمامًا (أي أوراكل) حسب العنوان ، فإن مهمتنا التالية هي إنشاء عقد أوراكل هذا. لذلك سنقوم الآن بإنشاء مشروع منفصل بالكامل يحتوي على عقد أوراكل. إنه في الأساس نفس الإعداد الذي قمنا به بالفعل لمشروع عقد العميل ؛ أي إعداد Truffle للترجمة والتطوير.

يجب أن يكون لديك بالفعل مجلد يسمى / oracle-example / oracle / والذي أنشأناه في خطوة سابقة (أو إذا لم يكن كذلك ، فابدأ وأنشئ هذا الدليل الفارغ الآن). افتح Terminal في هذا الدليل.

  • قم بتشغيل الأمر truffle init .
  • حذف /oracle-example/oracle/truffle-config.js .
  • قم بتحرير /oracle-example/oracle/truffle.js كما يلي:
 module.exports = { networks: { development: { host: "localhost", port: 8545, network_id: "*" // Match any network id } } };

انظر المثال هنا: https://github.com/jrkosinski/oracle-example/tree/part1-step2/oracle/truffle.js

داخل / oracle-example / oracle / migrations / ، أنشئ ملفًا يسمى 2_deploy_contracts.js بالمحتوى التالي:

 var BoxingOracle = artifacts.require("BoxingOracle"); module.exports = function(deployer) { deployer.deploy(BoxingOracle); };

انظر المثال هنا: https://github.com/jrkosinski/oracle-example/tree/part1-step2/oracle/migrations/2_deploy_contracts.js

كود أوراكل

لهذه الخطوة ، ما عليك سوى نسخ الملفات الثلاثة التالية من https://github.com/jrkosinski/oracle-example/tree/part1-step2/oracle/contracts/ إلى /oracle-example/oracle/contracts/ مجلد:

  • BoxingOracle.sol: عقد أوراكل الرئيسي.
  • Ownable.sol: لوظائف المالك فقط ، كما استخدمنا في عقد العميل بالفعل.
  • DateLib.sol: مكتبة التاريخ. سننظر إليه بمزيد من التعمق في الجزء 2 من هذه السلسلة.

اختبار أوراكل

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

  • جمِّع كلمة أوراكل.
  • تأكد من تشغيل أوراكل.
  • قم بتشغيل بعض الوظائف في وحدة التحكم في Truffle للتأكد من أن oracle يعمل كما هو متوقع.

تجميع وترحيل Oracle

لا يزال في محطة طرفية مفتوحة لـ /oracle-example/oracle/ ، قم بتشغيل الأوامر التالية. مرة أخرى ، هذه الخطوات مماثلة لما فعلناه بالفعل لتجميع عقد العميل وترحيله.

 truffle compile

البديل: استخدم البرنامج النصي لشل recompile.sh الخاص بي (https://github.com/jrkosinski/oracle-example/tree/part1-step2/oracle/recompile.sh).

افتح وحدة تطوير Truffle:

 truffle develop

الانتقال إلى شبكة الاختبار:

 truffle(develop)> migrate

تشغيل واختبار Oracle

لا يزال في وحدة تحكم تطوير Truffle ، أدخل هذا لالتقاط مؤشر قابل للاستخدام لعقد أوراكل:

 truffle(develop)> BoxingOracle.deployed().then(inst => { instance = inst })

الآن يمكننا (ويجب) إجراء مجموعة من الاختبارات على عقد oracle لاختبارها. حاول تشغيل الأوامر التالية ، كل على حدة ، وافحص النتائج.

 truffle(develop)> instance.testConnection() ... truffle(develop)> instance.getAllMatches() ... truffle(develop)> instance.addTestData() ... truffle(develop)> instance.getAllMatches() ...

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

الاختبار والتصحيح

نحن الآن جاهزون للاختبار النهائي: لاختبار أن عقد العميل يمكنه الاتصال بعقد أوراكل الموجود بالفعل على blockchain ، وسحب بياناته واستخدامها. إذا نجح كل هذا ، فسيكون لدينا زوج أوراكل من العميل يمكننا استخدامه لمزيد من التجارب. خطواتنا لإجراء الاختبار الشامل:

  • تجميع وتشغيل عقد أوراكل
  • تجميع وتشغيل عقد العميل
  • الحصول على عنوان عقد أوراكل
  • حدد عنوان oracle في عقد العميل
  • أضف بيانات الاختبار إلى عقد أوراكل
  • اختبار أنه يمكننا استرداد تلك البيانات في عقد العميل

افتح نافذتين طرفية:

  • واحد في / oracle-example / client /
  • والآخر في / oracle-example / oracle /

أقترح أن تبقي / oracle-example / client / واحدًا مفتوحًا على اليسار و / oracle-example / oracle / مفتوحًا على اليمين ، وأن تتابع عن كثب لتجنب الالتباس.

تجميع وتشغيل عقد أوراكل

نفّذ الأوامر التالية في / oracle-example / oracle / terminal:

 bash recompile.sh truffle develop truffle(develop)> migrate truffle(develop)> BoxingOracle.deployed().then(inst => { instance = inst })

تجميع وتشغيل عقد العميل

نفّذ الأوامر التالية في / oracle-example / client / terminal:

 bash recompile.sh truffle develop truffle(develop)> migrate truffle(develop)> BoxingBets.deployed().then(inst => { instance = inst })

احصل على عنوان عقد أوراكل

نفّذ الأمر التالي مع Truffle في / oracle-example / oracle / terminal:

 truffle(develop)> instance.getAddress()

انسخ العنوان وهو ناتج هذه المكالمة ؛ واستخدمه في الخطوة التالية.

قم بتعيين عنوان Oracle في عقد العميل

نفّذ الأمر التالي للكمأة في / oracle-example / client / terminal:

 truffle(develop)> instance.setOracleAddress('<insert address here, single quotes included>')

واختبرها:

 truffle(develop)> instance.testOracleConnection()

إذا كان الناتج true ، فنحن على ما يرام.

اختبار أنه يمكننا استرداد تلك البيانات في عقد العميل

نفّذ الأمر التالي للكمأة في / oracle-example / client / terminal:

 truffle(develop)> instance.getBettableMatches()

يجب أن تُرجع مصفوفة فارغة ، لأنه لم تتم إضافة أي بيانات اختبار إلى جانب أوراكل.

نفّذ الأمر التالي للكمأة في / oracle-example / oracle / terminal لإضافة بيانات الاختبار:

 truffle(develop)> instance.addTestData()

نفّذ الأمر التالي للكمأة في / oracle-example / client / terminal ، لمعرفة ما إذا كان بإمكاننا التقاط بيانات الاختبار المضافة حديثًا من العميل:

 truffle(develop)> instance.getBettableMatches()

الآن ، إذا أخذت عناوين فردية من المصفوفة التي تم إرجاعها بواسطة getBettableMatches() ، وقمت بتوصيلها في getMatch() .

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

اختتام الجزء الأول

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

  • عقد ذكي وظيفي في الغالب أوراكل
  • عميل يمكنه الاتصال والتفاعل مع أوراكل
  • إطار لمزيد من التطوير والتعلم

وهذا ليس سيئًا للغاية بالنسبة لمقال قصير.

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

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

مزيد من الخطوات الاختيارية

التجريب الفردي طريقة جيدة للتعلم. إليك بعض الاقتراحات البسيطة إذا كنت تفكر في طرق لتوسيع هذا البرنامج التعليمي لمزيد من المعرفة (لن يتم تناول أي مما يلي في الجزأين 2 و 3):

  • انشر العقود على Ganache (testrpc سابقًا) وقم بإجراء نفس الاختبارات للتحقق من الوظيفة.
  • انشر العقود من أجل ropsten أو rinkeby testnets وقم بإجراء نفس الاختبارات للتحقق من الوظيفة.
  • قم ببناء واجهة web3js أمامية لأي من oracle أو العميل (أو كليهما).

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