Entwickler Christophe Verdot spricht über den Online-Kurs ' Mastering Web 3.0 with Waves ', den er kürzlich bestanden hat.
Erzähl ein wenig über dich. Was hat Sie an diesem Kurs interessiert?Ich bin seit ungefähr 15 Jahren in der Webentwicklung tätig, hauptsächlich als Freiberufler.
Bei der Entwicklung einer Webanwendung für Langzeitregister für Entwicklungsländer, die von einer Bankengruppe in Auftrag gegeben wurde, stand ich vor der Aufgabe, die Blockchain-Zertifizierung in diese zu integrieren. Zu dieser Zeit wusste ich nicht viel über Blockchain-Zertifizierung, obwohl ich mich bereits für Kryptotechnologien interessierte - hauptsächlich als Investor.
Infolgedessen wurde diese Funktion nicht implementiert, aber da ich dachte, dass Organisationen und Banken an einer solchen Lösung für ihre Anwendungen interessiert sind, begann ich, das Problem zu untersuchen und startete bald das
Signature Chain- Projekt.
Ich habe die Beta-Version entwickelt, die bereits im Hauptnetzwerk verfügbar ist. Zu dieser Zeit gab es keine [Waves-Programmiersprache] Ride, und ich habe alles auf einfachste Weise mithilfe von Übersetzungstransaktionen mit eingebettetem JSON durchgeführt. Das Hauptziel war jedoch, nach dem Start von Ride erweiterte Funktionen hinzuzufügen. Und dies ist der Hauptgrund, warum ich an dem Kurs teilgenommen habe: Die nächste Phase in der Entwicklung des Projekts umfasste die Erstellung einer dezentralen Anwendung (dApp).
Welche Aspekte des Kurses erschienen Ihnen am einfachsten und welche am schwierigsten?Das Einfachste war, dass wir genug Zeit für alle Aufgaben hatten. Die Bedeutung des Kurses ist, etwas zu lernen und nicht miteinander zu konkurrieren. Die Erklärungen waren sehr zugänglich und die Abbildungen waren einfach, aber umfassend. Es half, verschiedene Themen zu visualisieren und zu verstehen.
Bei der Erledigung von Aufgaben wurden wir dazu gedrängt, unabhängig zu denken und manchmal etwas selbst zu lernen. Dies ist der beste Weg, um etwas zu lernen und die im Klassenzimmer diskutierten Ideen zu verstehen.
Mehrmals habe ich den theoretischen Teil nicht vollständig verstanden, bis ich anfing, Code zu schreiben, während ich die Aufgabe erledigte. Wir durften nicht 'kopieren / einfügen', der gesamte Code musste von uns selbst geschrieben werden, und dies half auch, alles besser zu verstehen.
Der schwierigste Teil war, dass die Fragen in der Aufgabe mit mehreren Antworten nicht immer klar waren. Mein Englisch ist nicht perfekt, und die Fragen wurden von einer Person geschrieben, die kein Muttersprachler ist. Daher gab es manchmal ein Missverständnis.
Vielleicht könnte der Orakel- und NFT-Teil des Kurses detaillierter sein. In jedem Fall ist das Hauptziel des Kurses, Entwickler zu interessieren. Um dann alle Aspekte vollständig zu verstehen, muss natürlich einige Zeit mit Experimentieren und Üben verbracht werden.
Erzählen Sie uns mehr über die Lösung, an der Sie während des gesamten Kurses gearbeitet haben - 'Coupon Bazaar'? Kann ich auch Codebeispiele sehen?Ja, wir haben am 'Coupon Bazaar' gearbeitet. Dies ist ein Marktplatz, auf dem Menschen Coupons verkaufen und kaufen, die ihnen das Recht geben, Waren und Dienstleistungen zu einem niedrigeren Preis zu kaufen. Jeder Gutschein wird durch ein digitales Asset dargestellt, das vom Lieferanten einen Sonderrabatt bietet.

Es mussten mehrere Anwendungskomponenten entwickelt werden. Zunächst musste ein System zur Registrierung von Lieferanten und zur Verwaltung von Gutscheinen geschaffen werden. Dann brauchten wir eine Verifizierungsfunktion und die Möglichkeit, nach Gutscheinen von Benutzern zu suchen.

Während des Kurses haben wir auch einige neue Funktionen hinzugefügt, darunter ein Abstimmungssystem und eine Funktion, mit der wir Lieferanten überprüfen und auf die schwarze Liste setzen können.
Zunächst untersuchten wir den Unterschied zwischen Smart Assets, Smart Accounts und dApp Accounts sowie die Grundlagen der Arbeit mit den Funktionen des Verifizierers. Mit den Überprüfungsfunktionen können Sie das Standardkontoverhalten ändern. Standardmäßig überprüfen sie Transaktionssignaturen, aber mit der Überprüfungsfunktion können Sie andere "Regeln" festlegen.
{-# 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 } }
Dann fügten wir Gutscheine hinzu. Wir haben eine der wichtigsten Funktionen von dApp verwendet, mit der wir Daten jeglichen Typs in Form von Schlüssel-Wert-Paaren in die Blockchain schreiben können - eine Datentransaktion. Wir haben es mit einer neuen Transaktion, invokeScript, kombiniert, mit der die aufgerufene Funktion in dApp von außerhalb der Blockchain aufgerufen wird.
Die Art der Datentransaktion, die wir während des Kurses verwendet haben, war das Hinzufügen von Gutscheinen zum Markt:
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) })
Um diese Daten mit der Funktion addItem zu verarbeiten und eine Kauffunktion und andere Optionen zu entwickeln, haben wir eine aufgerufene Funktion verwendet, die der Benutzer von außerhalb der Blockchain aufrufen kann. Infolgedessen kann es verschiedene Aufgaben ausführen, z. B. einen Geldtransfer initiieren, Daten in ein dApp Data Warehouse schreiben oder aktualisieren usw.
Hier ist ein Beispiel für die aufgerufene Funktion, die in der Funktion addItem verwendet wird:
@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) ]) } }
Später haben wir ein Abstimmungssystem entwickelt, mit dem wir über die Werbung oder Entfernung bestimmter Produkte abstimmen können. Um externe Einflüsse auf den Abstimmungsprozess zu vermeiden, verwendet sie das 'Commit-Reveal'-Schema.
Die Festschreibungsphase wird verwendet, um verschlüsselte Stimmen mithilfe einer Hash-Funktion und eines Salt zu sammeln.
Die "Enthüllungs" -Phase wird verwendet, um verschlüsselte Stimmen zu sammeln und ihre Hashes zu vergleichen.
Hier ist ein Beispiel für die hier verwendete aufgerufene Funktion:
@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) ]) } } >
Was haben Sie noch aus dem Kurs gelernt?Der Kurs beinhaltete auch Tokenisierung und nicht fungible Token (NFT) - Token, die etwas Einzigartiges darstellen und daher nicht austauschbar sind.
In der letzten Lektion ging es um Orakel. Da die Blockchain keine Daten von der Außenwelt empfangen kann, benötigen wir Orakel, um diese Daten an sie zu senden.
Für unseren Markt waren Orakel erforderlich, um einen Lieferanten zu überprüfen und gegebenenfalls auf die schwarze Liste zu setzen, der beispielsweise keinen verkauften Gutschein akzeptierte.
Hier ist ein Beispiel:
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) ]) } }
Was war für Sie am nützlichsten?Der nützlichste Teil sind die Aufgaben. Dank ihnen wurde das Vorlesungsmaterial klarer und das gerade gewonnene Wissen wurde durch Versuch und Irrtum gefestigt. Die praktische Arbeit mit
IDE ,
Explorer und
Orakeln war sehr nützlich.
Wie wollen Sie das Gelernte in die Praxis umsetzen?Ich hatte von Anfang an erwartet, dass der Kurs dazu beitragen würde, mein Projekt auf ein neues Niveau zu bringen. Die Idee war, jetzt
sign-web.app Code auf
RIDE zu schreiben. Die vorhandene Version verfügt bereits über die Funktionen der Dokumentenzertifizierung, kann jedoch dank RIDE erheblich verbessert werden. Die neue Version wird flexibler und verständlicher sein, mehr Funktionen haben, einschließlich der Zertifizierung von E-Mails, Vereinbarungen zwischen mehreren Parteien usw.
Der Kurs gab auch Anlass zum Nachdenken und ich hatte viele neue Ideen. Ich bin sicher, dass sich die Ergebnisse in Zukunft manifestieren werden.