ركوب الويب 3.0 الموجة

يتحدث المطور كريستوف فيردوت عن الدورة التدريبية عبر الإنترنت " Mastering Web 3.0 with Waves " ، والتي اجتازها مؤخرًا.



أخبر قليلا عن نفسك. ما يهمك في هذه الدورة؟

لقد شاركت في تطوير شبكة الإنترنت لمدة 15 عامًا تقريبًا ، بشكل رئيسي كصحفي مستقل.

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

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

لقد قمت بتطوير إصدار بيتا الخاص به ، والذي يتوفر بالفعل على الشبكة الرئيسية. لم يكن هناك [لغة برمجة Waves] Ride في ذلك الوقت ، وفعلت كل شيء بأبسط الطرق باستخدام معاملات الترجمة مع JSON المدمجة. ولكن الهدف الرئيسي كان لإضافة المزيد من الوظائف المتقدمة بعد إطلاق Ride. وهذا هو السبب الرئيسي للانضمام إلى الدورة التدريبية: المرحلة التالية في تطوير المشروع تتضمن إنشاء تطبيق لامركزي (dApp).

ما هي جوانب الدورة التي بدت أكثر بساطة بالنسبة لك والتي كانت الأصعب؟

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

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

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

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

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

أخبرنا المزيد عن الحل الذي عملت عليه طوال الدورة - "كوبون بازار"؟ هل يمكنني أيضًا مشاهدة أمثلة التعليمات البرمجية؟

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



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



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

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

{-# STDLIB_VERSION 3 #-} {-# CONTENT_TYPE DAPP #-} {-# SCRIPT_TYPE ACCOUNT #-} letownerPublicKey = base58'H8ndsHjBha6oJBQQx33zqbP5wi8sQP7hwgjzWUv3q95M' @Verifier(tx) funcverify() = { matchtx { cases: SetScriptTransaction=>sigVerify(tx.bodyBytes, tx.proofs[0], ownerPublicKey) cased: DataTransaction=>true case_ =>false } } 

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

كان نوع معاملة البيانات التي استخدمناها أثناء الدورة التدريبية يضيف قسائم إلى السوق:

 letdatajson = { "title": "t-shirt with , vote 1", "coupon_price": 10000000, "old_price": 1000000000, "new_price": 100000000, "address": "Universe", "description": "I want you to make love, not war, i know you've heard it before", "image": "https://bit.ly/2EXTghg" } it('add item', asyncfunction(){ letts = invokeScript({ dApp: dappAddress, call:{ function:"addItem", args:[ { type:"string", value: datajson.title }, { type:"integer", value: datajson.coupon_price }, { type:"string", value: JSON.stringify(datajson) } ]}, payment: [] }, accountSupplierSeed) lettx = awaitbroadcast(ts) awaitwaitForTx(tx.id) }) 

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

فيما يلي مثال للدالة التي تم استخدامها في وظيفة addItem:

 @Callable(i) funcaddItem(title: String, price: Int, data: String) = { letsupplierAddress = toBase58String(i.caller.bytes) letitem = getKeyItem(supplierAddress, title) if( price <= 0) thenthrow("purchase amount cannot be less than item price") elseif( getValueItemSupplier(item) !=NONE ) thenthrow("an item is already exist") else{ WriteSet([ DataEntry(getKeyItemSupplier(item), supplierAddress), DataEntry(getKeyItemPrice(item), price), DataEntry(getKeyItemData(item), data) ]) } } 

في وقت لاحق ، قمنا بتطوير نظام التصويت الذي يسمح لنا بالتصويت على الترويج أو إزالة بعض المنتجات. من أجل منع التأثيرات الخارجية على عملية التصويت ، تستخدم برنامج "Commit-Reveal".

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

تُستخدم مرحلة "كشف" لجمع الأصوات المشفرة ومقارنة تجزئاتها.

فيما يلي مثال للدالة المسماة المستخدمة هنا:

 @Callable(i) funcvoteCommit(item: String, hash: String) = { letuser = toBase58String(i.caller.bytes) letcommits = getValueCommitsCount(item) letstatus = getValueItemStatus(item) if( commits >=VOTERS) thenthrow("reached max num of voters") elseif(getValueCommit(item, user) !=NONE) thenthrow("user has already participated") elseif(getKeyItemSupplier(item) ==NONE) thenthrow("item does not exist") elseif(status !=NONE && status !=VOTING) thenthrow("voting is not possible") else{ WriteSet([ DataEntry(getKeyCommit(item, user), hash), DataEntry(getKeyCommitsCount(item), commits +1), DataEntry(getKeyItemStatus(item),if(commits ==VOTERS) thenREVEAL elseVOTING) ]) } } > 

ماذا تعلمت من الدورة؟

تضمنت الدورة التدريبية أيضًا الرموز المميزة والأيقونات غير القابلة للفطريات (NFT) - الرموز المميزة التي تمثل شيئًا فريدًا وبالتالي لا يمكن تبديلها.

كان الدرس الأخير حول الأوراكل. نظرًا لعدم تمكن blockchain من تلقي البيانات من العالم الخارجي ، فإننا نحتاج إلى oracles لإرسال هذه البيانات إليها.

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

هنا مثال:

 funcgetExtValueItemWhiteListStatus(item:String) = { item +"_verifier_status" } letverifier = "3Mx9qgMyMhHt7WUZr6PsaXNfmydxMG7YMxv" letVERIFIED = "verified" letBLACKLISTED = "blacklist" @Callable(i) funcsetstatus(supplier: String, status: String) = { letaccount = toBase58String(i.caller.bytes) if( account !=verifier ) thenthrow("only oracle verifier are able to manage whitelist") elseif( status !=VERIFIED && status !=BLACKLISTED) thenthrow("wrong status") else{ WriteSet([ DataEntry(getExtValueItemWhiteListStatus(supplier), status) ]) } } 

ما هو أكثر فائدة لك؟

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

كيف تخطط لاستخدام ما تعلمته في الممارسة؟

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

كما قدمت الدورة الطعام للتفكير ، وكان لدي العديد من الأفكار الجديدة. أنا متأكد من أن النتائج ستظهر في المستقبل.

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


All Articles