Le dĂ©veloppeur Christophe Verdo parle du cours en ligne ââ, qu'il a rĂ©cemment suivi.

Parlez-nous un peu de vous. Qu'est-ce qui vous a attiré vers ce cours ?
Je fais du développement web depuis environ 15 ans, principalement en tant que freelance.
En dĂ©veloppant une application web de registre Ă long terme pour les pays en dĂ©veloppement pour le compte d'un groupe bancaire, j'ai Ă©tĂ© confrontĂ© Ă la tĂąche d'intĂ©grer une certification par blockchain. Ă l'Ă©poque, je ne savais pas grand-chose sur la certification blockchain, mĂȘme si je m'intĂ©ressais dĂ©jĂ aux technologies crypto - principalement en tant qu'investisseur.
Finalement, cette fonctionnalité n'a pas été réalisée, mais en réfléchissant au fait que des organisations et des banques seraient intéressées par une telle solution pour leurs applications, je me suis mis à étudier la question et j'ai rapidement lancé le projet .
J'ai dĂ©veloppĂ© sa version bĂȘta, qui est dĂ©jĂ disponible sur le rĂ©seau principal. Ă l'Ă©poque, [le langage de programmation Waves] Ride n'existait pas encore, et je faisais tout de la maniĂšre la plus simple, en utilisant des transactions de transfert avec du 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 principale raison pour laquelle je me suis inscrit au cours : la prochaine Ă©tape du dĂ©veloppement du projet prĂ©voyait la crĂ©ation d'une application dĂ©centralisĂ©e (dApp).
Quels aspects du cours vous ont semblé les plus simples et lesquels les plus difficiles ?
Ce qui Ă©tait le plus simple, c'est que nous avions suffisamment de temps pour toutes les tĂąches. Le sens du cours est d'apprendre quelque chose, et non de rivaliser les uns avec les autres. Les explications Ă©taient trĂšs accessibles, et les illustrations â simples mais complĂštes. Cela a aidĂ© Ă visualiser et Ă comprendre diffĂ©rents sujets.
Lors de l'exĂ©cution des tĂąches, nous Ă©tions encouragĂ©s Ă penser de maniĂšre indĂ©pendante et parfois Ă Ă©tudier quelque chose par nous-mĂȘmes. C'est le meilleur moyen d'apprendre quelque chose et de comprendre les idĂ©es abordĂ©es en cours.
Plusieurs fois, je ne comprenais pas entiĂšrement la partie thĂ©orique jusqu'Ă ce que je commence Ă Ă©crire du code, en rĂ©alisant la tĂąche. Nous n'avions pas le droit de faire du âcopier/collerâ, tout le code devait ĂȘtre Ă©crit par nous-mĂȘmes, et cela aidait Ă©galement Ă mieux comprendre l'ensemble.
La partie la plus difficile était que les questions à choix multiple n'étaient pas toujours claires. Mon anglais n'est pas parfait, et les questions étaient écrites par quelqu'un qui n'est pas un locuteur natif, donc il y avait parfois des malentendus.
Peut-ĂȘtre que la partie du cours consacrĂ©e aux oracles et aux NFT pourrait ĂȘtre plus dĂ©taillĂ©e. Mais, de toute façon, l'objectif principal du cours est d'intĂ©resser les dĂ©veloppeurs. Ensuite, pour comprendre tous ses aspects, il faudra bien sĂ»r consacrer un certain temps Ă expĂ©rimenter et Ă pratiquer.
Parlez-nous davantage de la solution sur laquelle vous avez travaillĂ© tout au long du cours â âCoupon Bazaarâ? Pourrait-on aussi voir des exemples de code?
Oui, nous avons travaillĂ© sur âCoupon Bazaarâ, qui est un marchĂ© oĂč les gens achĂštent et vendent des coupons donnant droit Ă des biens et services Ă un prix rĂ©duit. Chaque coupon est reprĂ©sentĂ© comme un actif numĂ©rique, offrant une rĂ©duction spĂ©ciale de la part du fournisseur.

Nous devions développer plusieurs composants de l'application. Tout d'abord, nous devions créer un systÚme d'enregistrement des fournisseurs et de gestion des coupons. Ensuite, une fonction de vérification et une possibilité de recherche des coupons par les utilisateurs étaient nécessaires.

Au cours du programme, nous avons également ajouté plusieurs nouvelles fonctionnalités, y compris un systÚme de vote et une fonction permettant de vérifier et de mettre sur liste noire les fournisseurs.
D'abord, nous avons étudié la différence entre les actifs intelligents, les comptes intelligents et les comptes d'applications décentralisées (dApp) ainsi que le fonctionnement des fonctions de vérificateur. Les fonctions de vérificateur permettent de modifier le comportement par défaut d'un compte. Par défaut, elles vérifient les signatures des transactions, mais la fonction de vérificateur permet d'établir d'autres « rÚgles ».
{-# 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: DataTransaction=> true
case_ => false
}
}Ensuite, nous avons commencĂ© Ă ajouter des coupons. Nous avons utilisĂ© l'une des fonctionnalitĂ©s clĂ©s de la dApp, qui permet d'enregistrer dans la blockchain des donnĂ©es de tout type sous forme de paires « clĂ©-valeur » â une transaction de donnĂ©es. Nous l'avons combinĂ©e avec une nouvelle transaction, invokeScript, utilisĂ©e pour appeler une fonction invoquĂ©e dans la dApp depuis l'extĂ©rieur de la blockchain.
Le type de transaction de données que nous avons utilisé pendant le cours est l'ajout de coupons sur le marketplace :
letdatajson = {
"title": "t-shirt avec, vote 1",
"coupon_price": 10000000,
"old_price": 1000000000,
"new_price": 100000000,
"address": "Univers",
"description": "Je veux que tu fasses l'amour, pas la guerre, je sais que tu l'as déjà entendu",
"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 la fonction d'achat ainsi que d'autres options, nous avons utilisé une fonction appelable que l'utilisateur peut invoquer en dehors de la blockchain. En conséquence, elle peut effectuer diverses tùches, comme initier un transfert de fonds, enregistrer ou mettre à jour des données dans le stockage de données dApp, etc.
Voici un exemple de fonction appelable 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("le montant d'achat ne peut pas ĂȘtre infĂ©rieur au prix de l'article")
elseif( getValueItemSupplier(item) !=NONE ) thenthrow("un article existe déjà ")
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 permettant de voter pour la promotion ou la suppression de certains produits. Pour Ă©viter toute influence extĂ©rieure sur le processus de vote, il utilise un schĂ©ma âCommit-Revealâ.
La phase « commit » est utilisée pour collecter les votes chiffrés à l'aide d'une fonction de hachage et d'un « sel ».
La phase « reveal » est utilisée pour collecter les votes chiffrés et comparer leurs hachages.
Voici un exemple de fonction appelable 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("nombre maximum de votants atteint")
elseif(getValueCommit(item, user) !=NONE) thenthrow("l'utilisateur a déjà participé")
elseif(getKeyItemSupplier(item) ==NONE) thenthrow("l'article n'existe pas")
elseif(status !=NONE && status !=VOTING) thenthrow("le vote n'est pas 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 dans le cours ?
Le cours incluait Ă©galement la tokenisation et les jetons non fongibles (NFT) â des jetons reprĂ©sentant quelque chose d'unique et donc non interchangeables.
La derniÚre session était consacrée aux oracles. Puisque la blockchain ne peut pas obtenir de données du monde extérieur, nous avons besoin d'oracles pour y envoyer ces données.
Pour notre place de marché, des oracles étaient nécessaires pour vérifier et, si besoin, bloquer 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 était les devoirs. Grùce à eux, le contenu des cours devenait plus compréhensible, et les connaissances récemment acquises étaient ancrées par des méthodes d'essai et d'erreur. Le travail pratique avec , et .
Comment prévoyez-vous d'utiliser ce que vous avez appris dans la pratique ?
Depuis le dĂ©but, je m'attendais Ă ce que le cours aide Ă faire passer mon projet Ă un niveau supĂ©rieur. L'idĂ©e Ă©tait maintenant d'Ă©crire du code dans RIDE. La version existante a dĂ©jĂ des fonctionnalitĂ©s 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, avec davantage de fonctionnalitĂ©s, y compris la certification des courriels, des accords entre plusieurs parties, etc.
Le cours a également nourri ma réflexion, et j'ai eu beaucoup de nouvelles idées. Je suis convaincu que les résultats se manifesteront également à l'avenir.
Source : habr.com
