الانغماس في التنمية على Ethereum. الجزء 5: Oraclelize

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



IPFS


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

لماذا استخدام IPFS بالاقتران مع Ethereum؟


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

  • رابط الملف هو تجزئة فريد للمحتويات المحددة للملف ، لذلك إذا وضعنا هذا التجزئة على blockchain ، يمكننا التأكد من أن الملف الذي تم استلامه منه هو الملف الذي تمت إضافته في الأصل ، لا يمكن استبدال الملف
  • يؤمن النظام الموزع عدم توفر خادم معين (بسبب الحظر أو لأسباب أخرى)
  • يتم الجمع بين رابط الملف وتأكيد التجزئة في سطر واحد ، مما يعني أنه يمكنك الكتابة أقل إلى blockchain وحفظ الغاز

من بين أوجه القصور ، يمكن للمرء أن يذكر أنه نظرًا لعدم وجود خادم مركزي ، فمن الضروري للوصول إلى الملفات "توزيع" ملف واحد على الأقل. ولكن إذا كان لديك ملف معين ، فإن الاتصال بالموزعين أمر سهل - ابدأ برنامج ipfs daemon وأضف الملف عبر ipfs add .

التكنولوجيا مناسبة جدًا لأيديولوجية اللامركزية ، لذلك ، بالنظر إلى Oraclelize الآن ، سنواجه غالبًا استخدام IPFS في آليات أوراكل مختلفة.

أوراكلز


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

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

Oraclelize ليست فقط خدمة Ethereum ، يتم توفير وظائف مماثلة لسلسلة blockchains أخرى ، ولكننا سنصف فقط الحزمة مع Ethereum.

الشروع في العمل


كل ما يلزم للبدء هو إضافة أحد ملفات oraclizeAPI من المستودع إلى المشروع. تحتاج فقط إلى اختيار الإصدار المناسب لإصدار المترجم (solc): oraclizeAPI_0.5.sol للإصدارات التي تبدأ من 0.4.18 أو oraclizeAPI_0.4.sol للإصدارات من 0.4.1 أو oraclizeAPI_pre0.4.sol لكل شيء أقدم ، الدعم تم إيقاف هذا الإصدار بالفعل. إذا كنت تستخدم الكمأة ، فلا تنس إعادة تسمية الملف باستخدامOraclize - فهو يتطلب تطابق اسم الملف والعقد.

بتضمين الملف المناسب في مشروعك ، فإنك ترث العقد من استخدام usingOraclize . ويمكنك البدء في استخدام Oracle ، التي تتلخص في شيئين رئيسيين: إرسال طلب باستخدام مساعد oraclize_query ، ثم معالجة النتيجة في وظيفة __callback . قد يبدو أبسط عقد ذكي (للحصول على سعر البث الحالي بالدولار) كما يلي:

 pragma solidity 0.4.23; import "./usingOraclize.sol"; contract ExampleContract is usingOraclize { string public ETHUSD; event updatedPrice(string price); event newOraclizeQuery(string description); function ExampleContract() payable { updatePrice(); } function __callback(bytes32 myid, string result) { require (msg.sender == oraclize_cbAddress()); ETHUSD = result; updatedPrice(result); } function updatePrice() payable { if (oraclize_getPrice("URL") > this.balance) { newOraclizeQuery("Oraclize query was NOT sent, please add some ETH to cover for the query fee"); } else { newOraclizeQuery("Oraclize query was sent, standing by for the answer.."); oraclize_query("URL", "json(https://api.coinmarketcap.com/v1/ticker/ethereum/?convert=USD).0.price_usd"); } } } 

الوظيفة التي ترسل الطلب هي updatePrice . يمكنك أن ترى أولاً أن هناك oraclize_getPrice(“URL”) أن oraclize_getPrice(“URL”) أكبر من الرصيد الحالي للعقد. وذلك لأنه يجب دفع مكالمة oraclize_query ، ويتم حساب السعر على أنه مجموع العمولة الثابتة ودفع الغاز لاستدعاء رد الاتصال. “URL” هو أحد أنواع مصادر البيانات ، وفي هذه الحالة هو طلب بسيط عبر https ، ثم سننظر في خيارات أخرى. يمكن تحليل الإجابات حسب الطلب مقدمًا مثل json (كما في المثال) وعدة طرق أخرى (سننظر في المزيد). يتم إرجاع خط __callback في __callback . في البداية ، تم التحقق من أن المكالمة مرت من عنوان موثوق به أوراكل

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

استخدم السعر


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

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


كما ترى ، فإن سعر طلب عنوان URL هو عدة سنتات. هل هو كثير أم قليل؟ للقيام بذلك ، دعنا نفكر في تكلفة الجزء الثاني - رسوم غاز رد الاتصال.
يعمل هذا وفقًا للمخطط التالي: يتم تحويل كمية الأثير اللازمة لدفع مبلغ ثابت من الغاز بسعر ثابت مقدمًا بناءً على طلب العقد. يجب أن يكون هذا المبلغ كافيًا لإجراء معاودة الاتصال ، ويجب أن يكون السعر مناسبًا للسوق ، وإلا فلن تتم المعاملة أو ستعلق لفترة طويلة جدًا. في الوقت نفسه ، من الواضح أنه ليس من الممكن دائمًا معرفة كمية الغاز مقدمًا ، لذلك يجب أن يكون المجلس أيضًا في الاحتياطي (لا يتم إرجاع الاحتياطي). القيم الافتراضية هي حد 200 ألف غاز بسعر 20 جيجاوات. هذا يكفي لاستدعاء متوسط ​​مع عدة إدخالات ونوع من المنطق. وسعر 20 غيغاواط ، على الرغم من أنه قد يبدو كبيرًا جدًا في الوقت الحالي (في وقت الكتابة ، كان المتوسط ​​4 غيغاواط) ، ولكن في وقت تدفق المعاملات ، يمكن أن يقفز سعر السوق فجأة ويكون أعلى ، لذلك بشكل عام هذه القيم قريبة من القيم الفعلية المستخدمة. لذلك ، مع هذه القيم وسعر الهواء في المنطقة 500 دولار ، ستقترب مدفوعات الغاز من دولارين ، لذا يمكننا القول أن العمولة الثابتة تأخذ جزءًا صغيرًا.

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

يمكن تعيين سعر الغاز بواسطة وظيفة منفصلة - oraclize_setCustomGasPrice(< wei>) . بعد المكالمة ، يتم حفظ السعر واستخدامه في جميع الطلبات اللاحقة.
يمكن تعيين الحد في استعلام oraclize_query ، oraclize_query باستخدام الوسيطة الأخيرة ، على سبيل المثال مثل هذا:

 oraclize_query("URL", "<>", 50000); 

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

بالمناسبة ، حصلت oraclize مؤخرًا على معلومات يمكنك دفعها مقابل الطلبات خارج blockchain ، والتي ستسمح لك بعدم إنفاق الحد الأقصى أو إعادة الرصيد (ولا يأتي الدفع من العقد). لم نضطر إلى استخدام هذا حتى الآن ، ولكن عروض oraclize للاتصال بهم على info@oraclize.it ، إذا كان هذا الخيار مثيرًا للاهتمام. لذلك ، ضع في اعتبارك.

كيف يعمل


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


مصادر البيانات


بالإضافة إلى URL النظر فيه ، يوفر oraclize 4 خيارات إضافية (التي رأيتها في قسم التسعير): IPFS و IPFS random computation . دعونا نفكر في كل واحد منهم.

1. URL


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

 oraclize_query("URL", "json(https://api.coinmarketcap.com/v1/ticker/ethereum/?convert=USD).0.price_usd"); 

هذا هو الحصول على سعر الأثير ، وبما أن api توفر سلسلة json مع مجموعة بيانات ، يتم تغليف الطلب في محلل json وإرجاع الحقل الذي نحتاجه فقط. في هذه الحالة ، يكون الأمر GET ، لكن عنوان URL المصدر يدعم أيضًا طلبات POST. يتم تحديد نوع الطلب تلقائيًا بواسطة وسيطة إضافية. إذا كان هناك json صالح في هذا المثال:

 oraclize_query("URL", "json(https://shapeshift.io/sendamount).success.deposit", '{"pair":"eth_btc","amount":"1","withdrawal":"1AAcCo21EUc1jbocjssSQDzLna9Vem2UN5"}') 

ثم تتم معالجة الطلب على أنه POST (يتم وصف واجهة برمجة التطبيقات المستخدمة هنا ، إذا كانت مهتمة)

2. ولفرام ألفا


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

 oraclize_query(“WolframAlpha”, “president of Russia”) 

سيعود Vladimir Putin ، ويطلب

 oraclize_query(“WolframAlpha”, “solve x^2-4”) 

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

3. IPFS


كما قد تخمن ، فإنه يسمح لك باسترداد محتويات ملف في IPFS باستخدام تجزئة متعددة. مهلة تلقي المحتوى هي 20 ثانية.

 oraclize_query(“IPFS”, “QmTL5xNq9PPmwvM1RhxuhiYqoTJcmnaztMz6PQpGxmALkP”) 

سيعود Hello, Habr! (إذا كان الملف بهذا المحتوى لا يزال متاحًا)

4. عشوائي


يعمل إنشاء الأرقام العشوائية بنفس الطريقة التي تعمل بها المصادر الأخرى ، ولكن إذا كنت تستخدم oraclize_query ، oraclize_query الأمر وقتًا طويلاً في إعداد الحجج. لتجنب ذلك ، يمكنك استخدام oraclize_newRandomDSQuery(delay, nbytes, customGasLimit) المساعد oraclize_newRandomDSQuery(delay, nbytes, customGasLimit) ، فقط تعيين تأخير التنفيذ (بالثواني) ، عدد وحدات البايت التي تم إنشاؤها وحد الغاز لاستدعاء __callback .
هناك عدة أمور يجب وضعها في الاعتبار عند استخدام random :

  • للتأكد من أن الرقم عشوائي بالفعل ، يتم استخدام نوع خاص من التحقق - Ledger ، والذي يمكن إجراؤه على blockchain (على عكس أي شخص آخر ، ولكن أكثر من ذلك لاحقًا). هذا يعني أنه في مُنشئ العقد الذكي ، تحتاج إلى تعيين طريقة التحقق هذه بواسطة الوظيفة:

     oraclize_setProof(proofType_Ledger); 

    وفي بداية الاستدعاء يجب أن يكون هناك شيك بنفسه:

      function __callback(bytes32 _queryId, string _result, bytes _proof) { require (oraclize_randomDS_proofVerify__returnCode(_queryId, _result, _proof) == 0) ); <...> 

    يتطلب هذا التحقق شبكة حقيقية ولن يعمل على ganache ، لذا يمكنك إجراء إزالة مؤقتة لهذا الخط مؤقتًا للاختبار المحلي. بالمناسبة ، الوسيطة الثالثة لـ __callback هنا هي المعلمة _proof الاختيارية. وهي مطلوبة دائمًا عند استخدام أحد أنواع التأكيد.
  • إذا كنت تستخدم رقمًا عشوائيًا للحظات حرجة ، على سبيل المثال ، لتحديد الفائز في اليانصيب ، يمكنك تسجيل إدخال المستخدم قبل إرسال newRandomDSQuery. وإلا ، قد يحدث هذا الموقف: orclize calls _callback وتكون المعاملة مرئية للجميع في القائمة المعلقة. إلى جانب هذا ، الرقم العشوائي نفسه مرئي. إذا كان بإمكان المستخدمين الاستمرار ، تقريبًا ، في المراهنة ، فسيكون بإمكانهم تحديد سعر أعلى للغاز ودفع سعرهم قبل تنفيذ _callback ، مع العلم مسبقًا أنه سيفوز.


5. الحساب


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

  • اكتب الجواب الذي تريد إرجاعه مع السطر الأخير في stdout
  • يجب ألا تزيد الإجابة عن 2500 حرف
  • يجب ألا يستغرق التهيئة والتنفيذ أكثر من 5 دقائق كإجمالي

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

ملف Dockerfile:

 FROM ubuntu:16.04 MAINTAINER "info@rubyruby.ru" CMD echo "$ARG0 $ARG1 $ARG2 $ARG3" 

متغيرات البيئة ARG0 ، ARG1 ، إلخ. - هذه هي المعلمات التي تم تمريرها مع الطلب.
قم بإضافة ملف إرساء إلى الأرشيف ، وابدأ تشغيل خادم ipfs وأضف هذا الأرشيف هناك

 $ zip concatenation.zip Dockerfile $ ipfs daemon & $ ipfs add concatenation.zip QmWbnw4BBFDsh7yTXhZaTGQnPVCNY9ZDuPBoSwB9A4JNJD 

نستخدم التجزئة الناتجة لإرسال الطلب عبر oraclize_query في العقد الذكي:

 oraclize_query("computation", ["QmVAS9TNKGqV49WTEWv55aMCTNyfd4qcGFFfgyz7BYHLdD", "s1", "s2", "s3", "s4"]); 

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

إذا انتظرت اكتمال الطلب ، فسوف __callback النتيجة s1 s2 s3 s4 .

المساعدون المحللون والاستعلامات الفرعية


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

1. محلل JSON


لقد رأيت هذه الطريقة في المثال الأول ، حيث تم إرجاع السعر فقط من النتيجة التي تم إرجاعها بواسطة coinmarketcap:

 json(https://api.coinmarketcap.com/v1/ticker/ethereum/?convert=USD).0.price_usd 

حالة الاستخدام واضحة للغاية ، على سبيل المثال:

 [ { "id": "ethereum", "name": "Ethereum", "symbol": "ETH", "rank": "2", "price_usd": "462.857", "price_btc": "0.0621573", "24h_volume_usd": "1993200000.0", "market_cap_usd": "46656433775.0", "available_supply": "100800968.0", "total_supply": "100800968.0", "max_supply": null, "percent_change_1h": "-0.5", "percent_change_24h": "-3.02", "percent_change_7d": "5.93", "last_updated": "1532064934" } ] 

نظرًا لأن هذه مصفوفة ، فإننا نأخذ العنصر 0 ، ومنه - حقل price_usd

2. XML


يشبه الاستخدام JSON ، على سبيل المثال:

 xml(https://informer.kovalut.ru/webmaster/getxml.php?kod=7701).Exchange_Rates.Central_Bank_RF.USD.New.Exch_Rate 

3. HTML


يمكنك تحليل XHTML باستخدام XPath. على سبيل المثال ، احصل على سقف سوقي باستخدام etherscan:

 html(https://etherscan.io/).xpath(string(//*[contains(@href, '/stat/supply')]/font)) 

MARKET CAP OF $46.148 BillionB

4. مساعد ثنائي


يسمح لك بقص القطع من البيانات الأولية باستخدام وظيفة الشريحة (الإزاحة ، الطول). أي ، على سبيل المثال ، لدينا ملف يحتوي على محتويات "abc":

 echo "abc" > example.bin 

ضعه على IPFS:

 $ ipfs add example.bin added Qme4u9HfFqYUhH4i34ZFBKi1ZsW7z4MYHtLxScQGndhgKE 

قص الآن حرف واحد من الوسط:

 binary(Qme4u9HfFqYUhH4i34ZFBKi1ZsW7z4MYHtLxScQGndhgKE).slice(1, 1) 

في الجواب نحصل b

كما لاحظت ، في حالة المساعد الثنائي ، لم يكن مصدر IP هو الذي تم استخدامه ، ولكن IPFS. في الواقع ، يمكن تطبيق المحللون على أي مصادر ، لنفترض أنه ليس من الضروري تطبيق JSON على ما يعرض عنوان URL ، يمكنك إضافة هذا المحتوى إلى الملف:

 { "one":"1", "two":"2" } 

إضافته إلى IPFS:

 $ ipfs add test.json added QmZinLwAq5fy4imz8ZNgupWeNFTneUqHjPiTPX9tuR7Vxp 

ثم قم بتفكيكها على النحو التالي:

 json(QmZinLwAq5fy4imz8ZNgupWeNFTneUqHjPiTPX9tuR7Vxp).one 

نحصل على 1

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

 [WolframAlpha] add ${[IPFS] json(QmZinLwAq5fy4imz8ZNgupWeNFTneUqHjPiTPX9tuR7Vxp).one} to ${[IPFS] json(QmZinLwAq5fy4imz8ZNgupWeNFTneUqHjPiTPX9tuR7Vxp).two} 

نحصل على 3
يتكون الطلب على النحو التالي: حدد مصدر البيانات nested ، ثم لكل اسم قم بإضافة اسم المصدر أمامه بين قوسين معقوفين ، بالإضافة إلى تأطير جميع الاستعلامات الفرعية في ${..} .

الاختبار


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

للتحقق المحلي بالاقتران مع عقد ذكي ، يمكنك استخدام إصدار خاص من Remix IDE يدعم أو يلغي الطلبات.

وللتحقق محليًا باستخدام ganache ، ستحتاج إلى جسر ethereum ، والذي سينشر أو يلغي العقود الذكية على testnet الخاص بك. للاختبار ، قم أولاً بإضافة السطر التالي إلى مُنشئ العقد الخاص بك:

 OAR = OraclizeAddrResolverI(0x6f485C8BF6fc43eA212E93BBF8ce046C7f1cb475); 

اركض

 ganache-cli 

ثم

 node bridge --dev 

انتظر حتى تنتهي العقود ويمكنك الاختبار. في إخراج node bridge يمكنك رؤية الطلبات المرسلة والاستجابات المستلمة.

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

 mapping(bytes32=>bool) validIds; 

في وقت الطلب ، ضع علامة على المعرف المرسل على أنه true :

 bytes32 queryId = oraclize_query(<...>); validIds[queryId] = true; 

ثم في __callback تحقق من أن الطلب الذي يحمل هذا المعرف لم تتم معالجته بعد:

 function __callback(bytes32 myid, string result) { require(validIds[myid] != bytes32(0)); require(msg.sender == oraclize_cbAddress()); validIds[myid] = bytes32(0); <...> 

يعد ذلك ضروريًا لأنه يمكن استدعاء __callback على طلب واحد أكثر من مرة بسبب خصوصيات آليات Oraclelize.

المصادقة


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

الآلية الأكثر استخدامًا ، على الأقل من قبلنا ، هي TLSNotary مع التخزين في IPFS. يعد التخزين في IPFS أكثر كفاءة لأن __callback لا يعيد الأدلة نفسها (ربما في منطقة 4-5 كيلوبايت) ، ولكن أصغر بكثير متعدد التجزئة. لتحديد هذا النوع ، أضف سطرًا في المُنشئ:

 oraclize_setProof(proofType_TLSNotary | proofStorage_IPFS); 

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

اقرأ المزيد هنا .

الخلاصة


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

إذا كنت مهتمًا ببعض موضوعات التطوير على Ethereum التي لم يتم الكشف عنها بعد في هذه المقالات - اكتب في التعليقات ، فربما نغطيها في ما يلي.

الانغماس في التنمية على Ethereum:
الجزء الأول: مقدمة
الجزء 2: Web3.js والغاز
الجزء 3: تطبيق المستخدم
الجزء 4: النشر والتصحيح في الكمأة ، الغاناش ، إينفورا

Source: https://habr.com/ru/post/ar417681/


All Articles