Reite die Welle von Web 3.0

Der Entwickler Christoph Verdo spricht ĂŒber den Online-Kurs 'Mastering Web 3.0 with Waves', den er kĂŒrzlich abgeschlossen hat.

Reite die Welle von Web 3.0

ErzĂ€hlen Sie ein wenig ĂŒber sich. Was hat Ihr Interesse an diesem Kurs geweckt?

Ich beschÀftige mich seit etwa 15 Jahren mit Webentwicklung, hauptsÀchlich als Freiberufler.

WĂ€hrend ich eine langfristige Registrierungs-Webanwendung fĂŒr EntwicklungslĂ€nder im Auftrag einer Bankengruppe entwickelte, stieß ich auf die Herausforderung, die Blockchain-Zertifizierung zu integrieren. Zu diesem Zeitpunkt wusste ich nicht viel ĂŒber Blockchain-Zertifizierung, obwohl ich mich bereits fĂŒr Krypto-Technologien interessiert hatte – hauptsĂ€chlich als Investor.

Letztendlich wurde diese Funktion nicht umgesetzt, aber als ich darĂŒber nachdachte, dass Organisationen und Banken an einer solchen Lösung fĂŒr ihre Anwendungen interessiert sind, begann ich, mich mit diesem Thema zu beschĂ€ftigen, und startete bald das Projekt Signature Chain.

Ich entwickelte die Beta-Version, die bereits im Hauptnetz verfĂŒgbar ist. Zu diesem Zeitpunkt gab es [Programmiersprache Waves] Ride noch nicht, und ich machte alles auf die einfachste Art, indem ich Transaktionen mit eingebettetem JSON durchfĂŒhrte. Aber das Hauptziel war, nach dem Start von Ride erweiterte Funktionen hinzuzufĂŒgen. Und das ist der Hauptgrund, warum ich mich dem Kurs angeschlossen habe: die nĂ€chste Entwicklungsstufe des Projekts sah vor, eine dezentrale Anwendung (dApp) zu erstellen.

Welche Aspekte des Kurses empfanden Sie als am einfachsten und welche als am schwierigsten?

Am einfachsten war, dass wir genĂŒgend Zeit fĂŒr alle Aufgaben hatten. Der Sinn des Kurses besteht darin, etwas zu lernen und nicht gegeneinander zu konkurrieren. Die ErklĂ€rungen waren sehr zugĂ€nglich, und die Illustrationen waren einfach, aber umfassend. Das half, verschiedene Themen zu visualisieren und zu verstehen.

Bei der Bearbeitung der Aufgaben wurden wir angeregt, unabhÀngig zu denken und manchmal selbststÀndig etwas zu lernen. Das ist der beste Weg, um etwas zu lernen und die Ideen, die im Unterricht behandelt wurden, zu verstehen.

Einige Male verstand ich den theoretischen Teil nicht vollstĂ€ndig, bis ich anfing, Code zu schreiben und die Aufgabe auszufĂŒhren. Uns war es nicht erlaubt, 'copy/paste' zu machen; den gesamten Code mussten wir selbst schreiben, und das half ebenfalls, alles besser zu verstehen.

Am schwierigsten war es, dass die Fragen in der Aufgabe mit mehreren Antwortmöglichkeiten nicht immer klar waren. Mein Englisch ist nicht perfekt, und die Fragen wurden von jemandem verfasst, der kein Muttersprachler ist, daher gab es manchmal MissverstÀndnisse.

Vielleicht könnte der Teil des Kurses, der sich mit Orakeln und NFTs beschĂ€ftigt, ausfĂŒhrlicher sein. Aber in jedem Fall ist das Hauptziel des Kurses, Entwickler zu interessieren. Um alle Aspekte vollstĂ€ndig zu verstehen, muss man natĂŒrlich etwas Zeit damit verbringen, zu experimentieren und zu praktizieren.

ErzĂ€hlen Sie uns mehr ĂŒber die Lösung, an der Sie wĂ€hrend des gesamten Kurses gearbeitet haben – 'Coupon Bazaar'? Kann man auch Codebeispiele sehen?

Ja, wir haben an 'Coupon Bazaar' gearbeitet, das ist ein Marktplatz, auf dem Menschen Gutscheine verkaufen und kaufen, die das Recht geben, Waren und Dienstleistungen zu einem niedrigeren Preis zu erwerben. Jeder Gutschein wird als digitaler Vermögenswert dargestellt, der einen speziellen Rabatt vom Anbieter vorsieht.

Reite die Welle von Web 3.0

Es war notwendig, mehrere Komponenten der Anwendung zu entwickeln. Zuerst musste ein System zur Registrierung der Anbieter und zur Verwaltung der Gutscheine geschaffen werden. Dann benötigten wir eine Verifizierungsfunktion und die Möglichkeit, Gutscheine durch die Benutzer zu suchen.

Reite die Welle von Web 3.0

WĂ€hrend des Kurses haben wir auch mehrere neue Funktionen hinzugefĂŒgt, darunter ein Abstimmungssystem und eine Funktion, die es ermöglicht, Anbieter zu verifizieren und auf die schwarze Liste zu setzen.

Zuerst haben wir den Unterschied zwischen Smart Assets, Smart Accounts und dApp-Konten sowie die Grundlagen der Arbeit mit den Verifizierungsfunktionen studiert. Die Verifizierungsfunktionen ermöglichen es, das standardmĂ€ĂŸig festgelegte Verhalten des Kontos zu Ă€ndern. StandardmĂ€ĂŸig ĂŒberprĂŒfen sie die Signaturen von Transaktionen, die Verifizierungsfunktion ermöglicht es, andere „Regeln“ festzulegen.

{#- STDLIB_VERSION 3 -#}
{#- CONTENT_TYPE DAPP -#}
{#- SCRIPT_TYPE ACCOUNT -#}
let ownerPublicKey = base58'H8ndsHjBha6oJBQQx33zqbP5wi8sQP7hwgjzWUv3q95M'
@Verifier(tx)
func verify() = {
    match tx {
        case: SetScriptTransaction => sigVerify(tx.bodyBytes, tx.proofs[0], ownerPublicKey)
        case d: DataTransaction => true
        case _ => false
    }
}

Dann haben wir begonnen, Gutscheine hinzuzufĂŒgen. Wir haben eine der wichtigsten Funktionen der dApp genutzt, die es ermöglicht, beliebige Daten in Form von „SchlĂŒssel-Wert“-Paaren in die Blockchain zu schreiben – eine Datentransaktion. Wir haben sie mit einer neuen Transaktion, invokeScript, kombiniert, die verwendet wird, um eine aufrufbare Funktion in der dApp von außerhalb der Blockchain aufzurufen.

Die Art der Datentransaktionen, die wir wĂ€hrend des Kurses verwendet haben, besteht darin, Gutscheine auf dem Marktplatz hinzuzufĂŒgen:

letdatajson = {
    "title":        "t-shirt mit , stimme 1",
    "coupon_price": 10000000,
    "old_price":    1000000000,
    "new_price":    100000000,
    "address":      "Universum",
    "description":  "Ich möchte, dass du Liebe machst, nicht Krieg. Ich weiß, du hast das schon einmal gehört.",
    "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)
})

FĂŒr die Verarbeitung dieser Daten mit der Funktion addItem und die Entwicklung der Kauf- und anderer Optionen haben wir eine aufrufbare Funktion verwendet, die der Benutzer außerhalb der Blockchain aufrufen kann. Dadurch kann sie verschiedene Aufgaben ausfĂŒhren, wie zum Beispiel die Initiierung von Geldtransfers, das Schreiben oder Aktualisieren von Daten im dApp-Datenspeicher usw.

Hier ist ein Beispiel fĂŒr die aufrufbare 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("Kaufbetrag kann nicht geringer sein als der Artikelpreis")
    elseif( getValueItemSupplier(item) !=NONE ) thenthrow("Ein Artikel existiert bereits")
    else{
        WriteSet([
           DataEntry(getKeyItemSupplier(item), supplierAddress),
           DataEntry(getKeyItemPrice(item), price),
           DataEntry(getKeyItemData(item), data)
        ])
    }
}

SpĂ€ter haben wir ein Abstimmungssystem entwickelt, das es ermöglicht, Stimmen fĂŒr die Förderung oder Löschung bestimmter Produkte abzugeben. Um Einflussnahme von außen auf den Abstimmungsprozess zu verhindern, verwendet es das ‚Commit-Reveal‘-Schema.

Die Phase «commit» wird verwendet, um verschlĂŒsselte Stimmen mithilfe einer Hash-Funktion und „Salz“ zu sammeln.

Die Phase «reveal» wird verwendet, um verschlĂŒsselte Stimmen zu sammeln und deren Hashes zu vergleichen.

Hier ist ein Beispiel fĂŒr die aufrufbare Funktion, die hier verwendet wird:

@Callable(i)
funcvoteCommit(item: String, hash: String) = {
    letuser = toBase58String(i.caller.bytes)
    letcommits = getValueCommitsCount(item)
    letstatus = getValueItemStatus(item)
    if( commits >=VOTERS) thenthrow("maximale Anzahl von WĂ€hlern erreicht")
    elseif(getValueCommit(item, user) !=NONE) thenthrow("Benutzer hat bereits teilgenommen")
    elseif(getKeyItemSupplier(item) ==NONE) thenthrow("Artikel existiert nicht")
    elseif(status !=NONE && status !=VOTING) thenthrow("Abstimmung ist nicht möglich")
    else{
        WriteSet([
           DataEntry(getKeyCommit(item, user), hash),
           DataEntry(getKeyCommitsCount(item), commits +1),
           DataEntry(getKeyItemStatus(item),if(commits ==VOTERS) thenREVEAL elseVOTING)
        ])
    }
}
>

Was haben Sie sonst noch aus dem Kurs gelernt?

Der Kurs umfasste auch die Tokenisierung und nicht-fungible Token (NFT) – Token, die etwas Einzigartiges darstellen und daher nicht austauschbar sind.

Die letzte Sitzung war den Orakeln gewidmet. Da die Blockchain keine Daten aus der externen Welt ĂŒbernehmen kann, benötigen wir Orakel, um diese Daten dorthin zu senden.

FĂŒr unseren Marktplatz waren Orakel erforderlich, um Lieferanten zu verifizieren und gegebenenfalls auf die schwarze Liste zu setzen, die beispielsweise einen verkauften Gutschein nicht akzeptiert haben.

Hier ist ein Beispiel:

funcgetExtValueItemWhiteListStatus(item:String) = {
    item +"_verifier_status"
}
 
letverifier = "3Mx9qgMyMhHt7WUZr6PsaXNfmydxMG7YMxv"
letVERIFIED = "verifiziert"
letBLACKLISTED = "schwarzliste"
@Callable(i)
funcsetstatus(supplier: String, status: String) = {
    letaccount = toBase58String(i.caller.bytes)
    if( account !=verifier ) thenthrow("nur der Oracle-Verifier kann die Whitelist verwalten")
    elseif( status !=VERIFIED && status !=BLACKLISTED) thenthrow("falscher Status")
    else{
        WriteSet([
           DataEntry(getExtValueItemWhiteListStatus(supplier), status)
        ])
    }
}

Was war fĂŒr Sie am nĂŒtzlichsten?

Der nĂŒtzlichste Teil waren die Aufgaben. Dank dieser wurde der Stoff der Vorlesungen verstĂ€ndlicher, und das gerade erworbene Wissen wurde durch Ausprobieren gefestigt. Auch die praktische Arbeit mit IDE, Explorern und Orakeln.

Wie planen Sie, das Gelernte praktisch anzuwenden?

Von Anfang an erwartete ich, dass der Kurs mein Projekt auf ein neues Level heben wĂŒrde. Die Idee war, nun den Code zu schreiben sign-web.app in RIDE. Die bestehende Version verfĂŒgt bereits ĂŒber Funktionen zur Zertifizierung von Dokumenten, aber dank RIDE wird sie erheblich verbessert werden können. Die neue Version wird flexibler und verstĂ€ndlicher sein und mehr Funktionen bieten, einschließlich der Zertifizierung von E-Mails, Vereinbarungen zwischen mehreren Parteien usw.

Der Kurs hat auch DenkanstĂ¶ĂŸe gegeben, und ich habe viele neue Ideen entwickelt. Ich bin mir sicher, dass sich die Ergebnisse auch in Zukunft zeigen werden.

Quelle: habr.com

60GB SSD 8Gb DDR4