Surfer sur la vague du Web 3.0

Le développeur Christophe Verdot partage son expérience en suivant récemment le cours en ligne «Maîtriser le Web 3.0 avec des vagues» .



Quel est votre parcours? Qu'est-ce qui vous a motivé à suivre le cours?

Je suis développeur Web depuis environ 15 ans, travaillant principalement en tant que pigiste.

Travaillant sur le développement d'une application web de registre durable pour les pays émergents, financée par un groupe bancaire, on m'a une fois interrogé sur la possibilité de mettre en place la certification blockchain dans le registre. À cette époque, je ne connaissais pas grand-chose à la certification de la blockchain, même si j'étais dans le crypto depuis un certain temps, principalement du côté des investisseurs.

Nous n'avons pas poursuivi la mise en œuvre de cette fonctionnalité sur cette application spécifique, mais l'idée que les institutions et les banques posaient des questions sur la mise en œuvre de telles technologies dans leurs applications m'a fait faire beaucoup d'études et de recherches sur le sujet, puis lancer la chaîne de signature projet.

J'ai développé une version bêta déjà en ligne sur Mainnet. A cette époque [langage de programmation Waves] Ride n'était pas encore prêt, donc je l'ai développé de la manière la plus simple, en utilisant des transactions de transfert avec JSON attaché. Mais l'objectif principal a toujours été de proposer des fonctionnalités plus avancées une fois que Ride était disponible. Et c'était la principale raison pour laquelle j'ai suivi ce cours, car la prochaine étape prévue pour le projet est de le transformer en une application décentralisée (dApp).

Quels aspects du cours avez-vous trouvé les plus faciles et les plus difficiles?

L'aspect le plus simple était que nous avions beaucoup de temps pour le faire, qu'il s'agissait simplement d'apprendre plutôt que de rivaliser pour être le meilleur. Il était également bien expliqué, avec des illustrations simples mais explicites qui ont beaucoup aidé à visualiser et à comprendre différents sujets.

Dans les défis, nous avons été poussés à réfléchir par nous-mêmes et parfois à faire des recherches, ce qui est la meilleure façon d'apprendre et de mieux comprendre les concepts d'une leçon.

Plusieurs fois, je n'avais pas une compréhension claire de la partie de la conférence jusqu'à ce que je sois entré dans le code et ai relevé le défi. Aucun «copier / coller» n'était autorisé, ce qui nous a obligés à écrire tout le code du défi, et c'était un autre point important pour renforcer la compréhension.

La partie la plus difficile était que parfois les questions à choix multiples dans la partie défi n'étaient pas aussi claires. Je veux dire, mon anglais n'est pas excellent, et les questions ont été écrites par un anglophone non natif, donc il y avait parfois un manque de compréhension.

J'aurais probablement aimé en savoir plus sur les sections oracle et NFT. Mais, dans tous les cas, ce cours vise principalement à impliquer les développeurs, et vous devez absolument passer du temps à jouer avec lui et à vous entraîner plus tard pour vraiment comprendre pleinement tous les aspects et les détails.

Pourriez-vous discuter en détail de la solution sur laquelle vous avez travaillé pendant le cours - «Coupon Bazaar»? Pourriez-vous également fournir des exemples de code?

Nous avons travaillé sur «Coupon Bazaar», qui est essentiellement un marché où les gens achètent et vendent des coupons de réduction pour des biens et services à bas prix. Chaque coupon était représenté par un actif numérique, qui représentait également une remise spéciale offerte par les fournisseurs.



Des travaux ont été nécessaires sur plusieurs composants de l'application. Tout d'abord, il devait permettre aux fournisseurs d'enregistrer et de gérer leurs articles (coupons). Ensuite, une fonctionnalité de confirmation d'achat devait être créée, ainsi qu'une fonctionnalité permettant aux clients de rechercher et d'acheter des coupons.



Plusieurs fonctionnalités supplémentaires ont également été ajoutées au cours, notamment un système de vote et une fonctionnalité de vérification et de mise sur liste noire des fournisseurs.

Nous avons d'abord examiné les différences entre les actifs intelligents, les comptes intelligents et les comptes dApp, et les principes fondamentaux de l'utilisation des fonctions de vérificateur. Les fonctions du vérificateur permettent de modifier le comportement par défaut d'un compte. Par défaut, ils vérifient les signatures des transactions, mais la fonction de vérification vous permet de définir une autre «règle».

{-# 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 éléments. Nous avons utilisé l'une des fonctionnalités les plus importantes pour le développement de dApp qui permet à tout type de données d'être enregistré sur la blockchain sous forme de paires clé-valeur, la transaction de données. Nous l'avons combinée avec une nouvelle transaction, invokeScript, utilisée pour appeler une fonction appelable dans une dApp de l'extérieur.

Un type de transaction de données que nous avons utilisé dans le cours était pour les fournisseurs d'ajouter des articles 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 cette transaction de données via la fonction addItem et développer plus tard un achat et d'autres options, nous sommes passés par la fonction callable, pouvant être appelée par des utilisateurs de l'extérieur. En conséquence, il peut effectuer diverses tâches, telles que lancer un transfert de fonds, écrire ou mettre à jour des données dans le stockage de données de la dApp, etc.

Voici un exemple de fonction appelable. Il est utilisé pour 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) ]) } } 

Nous avons ensuite travaillé sur un système de vote pour permettre aux utilisateurs de voter pour la promotion ou la suppression de certains produits. Il a utilisé un système «Commit-Reveal» pour éviter toute influence extérieure pendant le processus de vote.
L'étape de validation a été utilisée pour collecter des votes chiffrés avec une fonction de hachage et du sel.
L'étape de révélation consiste à collecter les votes décryptés et à comparer leurs hachages.

Voici un exemple de fonction appelable utilisée pour cette fonctionnalité:

 @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 a également abordé la tokenisation et les jetons non fongibles (NFT) - des jetons qui représentent quelque chose d'unique et ne sont donc pas interchangeables.

Le dernier cours s'est concentré sur l'utilisation des oracles. Puisqu'une blockchain ne peut pas accéder aux données du monde extérieur, nous devons utiliser des oracles qui envoient des données du monde réel à la blockchain.

Dans le cadre de notre marché, nous avons utilisé un oracle pour vérifier et, si nécessaire, mettre sur liste noire un fournisseur qui, par exemple, n'a pas accepté un coupon précédemment vendu.

Voici un exemple de code:

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

Quelle (s) partie (s) du cours avez-vous trouvé la plus utile?

La partie la plus utile était les défis. Ils ont rendu les conférences plus claires et solidifié mes connaissances nouvellement acquises par essais et erreurs. Pratiquer avec l' IDE , l' explorateur et les oracles était vraiment utile.

Comment prévoyez-vous d'utiliser ce que vous avez appris au cours?

Dès le début, ce cours était censé aider à faire passer mon projet au niveau supérieur. Donc, l'idée est maintenant de réécrire sign-web.app sur Ride. La version actuelle offre déjà des fonctionnalités de travail pour la certification des documents, mais elle sera certainement améliorée avec une future version Ride. Il permettra plus de flexibilité et de clarté et plus de fonctionnalités, y compris la certification par courrier électronique, l'accord multipartite, etc.

Le cours a également été très révélateur et de nombreuses idées ont commencé à surgir dans ma tête. Je suis sûr que d'autres en sortiront à l'avenir.

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


All Articles