Ride the Web 3.0 Wave

Le développeur Christophe Verdot parle du cours en ligne « Maîtriser le Web 3.0 avec des vagues », qu'il a récemment suivi.



Parlez un peu de vous. Qu'est-ce qui vous a intéressé dans ce cours?

Je suis impliqué dans le développement web depuis environ 15 ans, principalement en tant que pigiste.

En développant une application web de registre à long terme pour les pays en développement commandée par un groupe bancaire, j'ai été confronté à la tâche d'y intégrer la certification blockchain. À cette époque, je ne connaissais pas grand-chose à la certification de la blockchain, même si j'étais déjà intéressé par les technologies de cryptographie - principalement en tant qu'investisseur.

En conséquence, cette fonction n'a pas été implémentée, mais, pensant que les organisations et les banques étaient intéressées par une telle solution pour leurs applications, j'ai commencé à étudier la question et j'ai rapidement lancé le projet Signature Chain .

J'ai développé sa version bêta, déjà disponible sur le réseau principal. Il n'y avait pas de [langage de programmation Waves] Ride à l'époque, et j'ai tout fait de la manière la plus simple en utilisant des transactions de traduction avec JSON intégré. Mais l'objectif principal était d'ajouter des fonctionnalités plus avancées après le lancement de Ride. Et c'est la raison principale pour laquelle j'ai rejoint le cours: la prochaine étape dans le développement du projet impliquait la création d'une application décentralisée (dApp).

Quels aspects du cours vous ont semblé les plus simples et lesquels ont été les plus difficiles?

La chose la plus simple était que nous avions assez de temps pour toutes les tâches. Le sens du cours est d'apprendre quelque chose et de ne pas se faire concurrence. Les explications étaient très accessibles, et les illustrations étaient simples mais complètes. Cela a aidé à visualiser et à comprendre différents sujets.

Lors de la réalisation des devoirs, nous avons été poussés à penser de manière indépendante et parfois à étudier quelque chose par nous-mêmes. C'est la meilleure façon d'apprendre quelque chose et de comprendre les idées discutées en classe.

Plusieurs fois, je n'ai pas complètement compris la partie théorique jusqu'à ce que je commence à écrire du code tout en terminant la tâche. Nous n'étions pas autorisés à faire du «copier / coller», tout le code devait être écrit par nous-mêmes, et cela a également aidé à mieux comprendre tout.

La partie la plus difficile était que les questions du devoir avec plusieurs réponses n'étaient pas toujours claires. Mon anglais n'est pas parfait, et les questions ont été écrites par une personne qui n'est pas native, il y a donc parfois eu un malentendu.

Peut-être que la partie oracle et NFT du cours pourrait être plus détaillée. Mais, en tout cas, l'objectif principal du cours est d'intéresser les développeurs. Ensuite, pour bien comprendre tous ses aspects, il faudra bien sûr passer du temps à expérimenter et à pratiquer.

Parlez-nous de la solution sur laquelle vous avez travaillé tout au long du cours - «Coupon Bazaar»? Puis-je également voir des exemples de code?

Oui, nous avons travaillé sur «Coupon Bazaar», c'est un marché où les gens vendent et achètent des coupons leur donnant le droit d'acheter des biens et des services à un prix inférieur. Chaque coupon est représenté par un actif numérique, qui offre une remise spéciale du fournisseur.



Il a fallu développer plusieurs composants applicatifs. Premièrement, il était nécessaire de créer un système d'enregistrement des fournisseurs et de gestion des coupons. Ensuite, nous avions besoin d'une fonction de vérification et de la possibilité de rechercher des coupons par les utilisateurs.



Pendant le cours, nous avons également ajouté plusieurs nouvelles fonctionnalités, y compris un système de vote et une fonctionnalité qui nous permet de vérifier et de mettre sur liste noire les fournisseurs.

Tout d'abord, nous avons examiné la différence entre les actifs intelligents, les comptes intelligents et les comptes dApp et les bases de l'utilisation des fonctions du vérificateur. Les fonctionnalités du vérificateur vous permettent de modifier le comportement du compte par défaut. Par défaut, ils vérifient les signatures de transaction, mais la fonction de vérification vous permet de définir d'autres "règles".

{-# 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 } } 

Ensuite, nous avons commencé à ajouter des coupons. Nous avons utilisé l'une des fonctions les plus importantes de dApp, qui nous permet d'écrire des données de tout type dans la blockchain sous la forme de paires clé-valeur - une transaction de données. Nous l'avons combiné avec une nouvelle transaction, invokeScript, utilisée pour appeler la fonction appelée dans dApp depuis l'extérieur de la blockchain.

Le type de transaction de données que nous avons utilisé pendant le cours consistait à ajouter des coupons sur le marché:

 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) }) 

Pour traiter ces données avec la fonction addItem et développer une fonction d'achat et d'autres options, nous avons utilisé une fonction appelée que l'utilisateur peut appeler depuis l'extérieur de la blockchain. En conséquence, il peut effectuer diverses tâches, par exemple, initier un transfert de fonds, écrire ou mettre à jour des données dans un entrepôt de données dApp, etc.

Voici un exemple de la fonction appelée utilisée dans la fonction 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) ]) } } 

Plus tard, nous avons développé un système de vote qui nous permet de voter sur la promotion ou le retrait de certains produits. Afin de prévenir les influences extérieures sur le processus de vote, elle utilise le système «Commit-Reveal».

La phase de validation est utilisée pour collecter des votes chiffrés à l'aide d'une fonction de hachage et d'un sel.

La phase de «révélation» est utilisée pour collecter les votes cryptés et comparer leurs hachages.

Voici un exemple de la fonction appelée utilisée ici:

 @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) ]) } } > 

Qu'avez-vous appris d'autre du cours?

Le cours comprenait également la tokenisation et les jetons non fongibles (NFT) - des jetons représentant quelque chose d'unique et donc pas interchangeables.

La dernière leçon portait sur les oracles. Étant donné que la blockchain ne peut pas recevoir de données du monde extérieur, nous avons besoin d'oracles pour lui envoyer ces données.

Pour notre marché, des oracles étaient nécessaires pour vérifier et, si nécessaire, mettre sur liste noire un fournisseur qui, par exemple, n'a pas accepté un coupon vendu.

Voici un exemple:

 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) ]) } } 

Qu'est-ce qui vous a été le plus utile?

La partie la plus utile est les affectations. Grâce à eux, le matériel de cours est devenu plus clair et les connaissances qui viennent d'être acquises ont été consolidées par essais et erreurs. Un travail pratique avec IDE , explorer et oracles a été très utile.

Comment prévoyez-vous d'utiliser ce que vous avez appris dans la pratique?

Dès le début, je m'attendais à ce que le cours aide à amener mon projet à un nouveau niveau. L'idée était d'écrire du code sign-web.app sur RIDE maintenant. La version existante a déjà les fonctions de certification de documents, mais grâce à RIDE, elle peut être considérablement améliorée. La nouvelle version sera plus flexible et compréhensible, elle aura plus de fonctions, y compris la certification des emails, des accords entre plusieurs parties, etc.

Le cours a également fourni matière à réflexion et j'ai eu beaucoup de nouvelles idées. Je suis sûr que les résultats se manifesteront à l'avenir.

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


All Articles