Lo sviluppatore Christophe Verdo parla del corso online ‘’, che ha recentemente completato.

Parlami un po' di te. Cosa ti ha attratto di questo corso?
Lavoro nello sviluppo web da circa 15 anni, principalmente come freelance.
Sviluppando un'applicazione web per il lungo termine per i paesi in via di sviluppo su commissione di un gruppo bancario, ho affrontato la sfida di integrare la certificazione blockchain. In quel momento non sapevo molto sulla certificazione blockchain, anche se ero già interessato alle criptotecnologie, principalmente come investitore.
Alla fine, questa funzione non è stata implementata, ma pensando al fatto che le organizzazioni e le banche potrebbero essere interessate a tale soluzione per le loro applicazioni, ho iniziato a studiare la questione e ho presto avviato il progetto .
Ho sviluppato la sua versione beta, che è già disponibile nella rete principale. All'epoca [linguaggio di programmazione Waves] Ride non esisteva e stavo facendo tutto nel modo più semplice possibile, utilizzando transazioni di trasferimento con JSON incorporato. Ma l'obiettivo principale era aggiungere funzionalità più avanzate dopo il lancio di Ride. E questa è la ragione principale per cui mi sono unito al corso: la fase successiva dello sviluppo del progetto prevedeva la creazione di un'applicazione decentralizzata (dApp).
Quali aspetti del corso ti sono sembrati i più facili e quali i più difficili?
La cosa più semplice è stata che avevamo abbastanza tempo per tutti i compiti. Il senso del corso è quello di imparare qualcosa e non di competere tra di noi. Le spiegazioni erano molto chiare e le illustrazioni semplici ma esaurienti. Questo ha aiutato a visualizzare e comprendere i vari argomenti.
Durante il completamento dei compiti, ci si incoraggiava a pensare in modo indipendente e a studiare autonomamente. Questo è il modo migliore per imparare qualcosa e comprendere le idee trattate durante le lezioni.
Alcune volte non comprendevo completamente la parte teorica finché non iniziavo a scrivere codice per completare il compito. Non era permesso fare 'copia/incolla', tutto il codice doveva essere scritto da noi e questo ha anche aiutato a comprendere meglio tutto.
La parte più difficile è stata che le domande con risposta multipla non erano sempre chiare. Il mio inglese non è perfetto e le domande erano scritte da una persona che non era un madrelingua, quindi a volte si sono verificate incomprensioni.
Forse la parte del corso dedicata agli oracoli e agli NFT potrebbe essere più dettagliata. Ma, in ogni caso, l'obiettivo principale del corso è suscitare interesse nei programmatori. Poi, per comprendere completamente tutti gli aspetti, sarà necessario, ovviamente, investire del tempo per sperimentare e fare pratica.
Puoi parlarci di più della soluzione su cui hai lavorato durante tutto il corso – 'Coupon Bazaar'? Possiamo anche vedere esempi di codice?
Sì, abbiamo lavorato su 'Coupon Bazaar', un marketplace dove le persone possono vendere e acquistare coupon che garantiscono l'acquisto di beni e servizi a un prezzo inferiore. Ogni coupon è rappresentato come un asset digitale che implica uno sconto speciale da parte del fornitore.

Era necessario sviluppare diversi componenti dell'applicazione. Innanzitutto, era necessario creare un sistema per registrare i fornitori e gestire i coupon. Poi, era necessaria una funzione di verifica e la capacità degli utenti di cercare coupon.

Durante il corso abbiamo anche aggiunto alcune nuove funzionalità, tra cui un sistema di voto e una funzione che consente di verificare e aggiungere fornitori a una lista nera.
All'inizio abbiamo studiato la differenza tra smart asset, smart account e dApp account e le basi del funzionamento delle funzioni di verifica. Le funzioni di verifica consentono di modificare il comportamento predefinito dell'account. Di default verificano le firme delle transazioni, ma la funzione di verifica permette di impostare altre "regole".
{-# 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
}
}Poi abbiamo iniziato ad aggiungere i coupon. Abbiamo utilizzato una delle funzioni più importanti della dApp, che consente di registrare nel blockchain dati di qualsiasi tipo come coppie "chiave-valore" – transazione dati. L'abbiamo combinata con una nuova transazione, invokeScript, che è utilizzata per chiamare una funzione invocabile nella dApp dall'esterno del blockchain.
Il tipo di transazione dati che abbiamo utilizzato durante il corso è l'aggiunta di coupon al marketplace:
letdatajson = {
"title": "t-shirt con , vota 1",
"coupon_price": 10000000,
"old_price": 1000000000,
"new_price": 100000000,
"address": "Universo",
"description": "Voglio che tu faccia l'amore, non la guerra, so che l'hai già sentito",
"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)
})Per elaborare questi dati con la funzione addItem e sviluppare la funzione di acquisto e altre opzioni, abbiamo utilizzato una funzione chiamata che l'utente può invocare dall'esterno della blockchain. Di conseguenza, essa può svolgere vari compiti, ad esempio, avviare il trasferimento di fondi, registrare o aggiornare i dati nel database dApp, ecc.
Ecco un esempio di funzione chiamata utilizzata nella funzione addItem:
@Callable(i)
funcaddItem(title: String, price: Int, data: String) = {
letsupplierAddress = toBase58String(i.caller.bytes)
letitem = getKeyItem(supplierAddress, title)
if( price <= 0) thenthrow("l'importo dell'acquisto non può essere inferiore al prezzo dell'oggetto")
elseif( getValueItemSupplier(item) !=NONE ) thenthrow("l'oggetto esiste già")
else{
WriteSet([
DataEntry(getKeyItemSupplier(item), supplierAddress),
DataEntry(getKeyItemPrice(item), price),
DataEntry(getKeyItemData(item), data)
])
}
}In seguito, abbiamo sviluppato un sistema di voto che consente di esprimere voti per promuovere o rimuovere determinati prodotti. Per evitare influenze esterne sul processo di voto, utilizza lo schema 'Commit-Reveal'.
La fase 'commit' è utilizzata per raccogliere voti crittografati tramite una funzione hash e 'sale'.
La fase 'reveal' è usata per raccogliere voti crittografati e confrontare i loro hash.
Ecco un esempio di funzione chiamata utilizzata qui:
@Callable(i)
funcvoteCommit(item: String, hash: String) = {
letuser = toBase58String(i.caller.bytes)
letcommits = getValueCommitsCount(item)
letstatus = getValueItemStatus(item)
if( commits >=VOTERS) thenthrow("raggiunto il numero massimo di elettori")
elseif(getValueCommit(item, user) !=NONE) thenthrow("l'utente ha già partecipato")
elseif(getKeyItemSupplier(item) ==NONE) thenthrow("l'oggetto non esiste")
elseif(status !=NONE && status !=VOTING) thenthrow("il voto non è possibile")
else{
WriteSet([
DataEntry(getKeyCommit(item, user), hash),
DataEntry(getKeyCommitsCount(item), commits +1),
DataEntry(getKeyItemStatus(item),if(commits ==VOTERS) thenREVEAL elseVOTING)
])
}
}
>Cosa altro hai appreso dal corso?
Il corso includeva anche la tokenizzazione e i token non fungibili (NFT) – token che rappresentano qualcosa di unico e quindi non intercambiabile.
L'ultima lezione è stata dedicata agli oracoli. Poiché la blockchain non può ricevere dati dal mondo esterno, abbiamo bisogno di oracoli per inviarvi questi dati.
Per il nostro marketplace, gli oracoli erano necessari per verificare e, se necessario, mettere sulla lista nera un fornitore che, ad esempio, non avesse accettato un coupon venduto.
Ecco un esempio:
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("solo l'oracolo verificatore può gestire la whitelist")
elseif( status !=VERIFIED && status !=BLACKLISTED) thenthrow("stato errato")
else{
WriteSet([
DataEntry(getExtValueItemWhiteListStatus(supplier), status)
])
}
}
Cosa è stato per te più utile?
La parte più utile sono stati i compiti. Grazie a questi, il materiale delle lezioni diventava più chiaro e le conoscenze appena acquisite venivano consolidate attraverso il metodo del tentativo ed errore. Anche il lavoro pratico con , e .
Come prevedi di utilizzare ciò che hai imparato nella pratica?
Fin dall'inizio mi aspettavo che il corso aiutasse a portare il mio progetto a un livello superiore. L'idea era ora di scrivere codice in RIDE. La versione attuale ha già funzioni di certificazione dei documenti, ma grazie a RIDE, potrà essere notevolmente migliorata. La nuova versione sarà più flessibile e comprensibile, con più funzionalità, inclusa la certificazione delle email elettroniche, degli accordi tra più parti, ecc.
Il corso ha anche stimolato la riflessione e mi ha dato molte nuove idee. Sono sicuro che i risultati si manifesteranno anche in futuro.
Fonte: habr.com
