El desarrollador Christophe Verdot habla sobre el curso online '' que aprobó recientemente.

Cuéntanos un poco sobre ti. ¿Qué te interesó de este curso?
Llevo unos 15 años haciendo desarrollo web, principalmente como autónomo.
Mientras desarrollaba una aplicación web para un registro a largo plazo para países en desarrollo para un grupo bancario, me enfrenté a la tarea de integrar la certificación blockchain en ella. En ese momento, no sabía mucho sobre la certificación blockchain, aunque ya estaba interesado en las tecnologías criptográficas, principalmente como inversor.
Como resultado, esta función no se implementó, pero, pensando que las organizaciones y los bancos estaban interesados en una solución de este tipo para sus aplicaciones, comencé a estudiar el tema y pronto lancé el proyecto. .
Desarrollé una versión beta, que ya está disponible en la red principal. En ese momento, no existía Ride [lenguaje de programación Waves], así que hice todo de la manera más sencilla, usando transacciones de traducción con JSON anidado. Pero el objetivo principal era agregar funciones más avanzadas después del lanzamiento de Ride. Y esta es la razón principal por la que me uní al curso: la siguiente etapa del desarrollo del proyecto implicó la creación de una aplicación descentralizada (dApp).
¿Qué aspectos del curso le resultaron más fáciles y cuáles fueron los más desafiantes?
Lo más sencillo fue que tuviéramos tiempo suficiente para todas las tareas. El objetivo del curso es aprender algo y no competir entre sí. Las explicaciones fueron muy accesibles y las ilustraciones simples pero completas. Esto ayudó a visualizar y comprender diferentes temas.
Al completar las tareas, se nos animaba a pensar de forma independiente y, a veces, a estudiar algo por nuestra cuenta. Esta es la mejor manera de aprender y comprender las ideas tratadas en clase.
Varias veces no entendí completamente la parte teórica hasta que comencé a escribir código mientras completaba una tarea. No se nos permitía "copiar y pegar", teníamos que escribir todo el código nosotros mismos y esto también nos ayudó a comprender todo mejor.
Lo más difícil fue que las preguntas de la tarea de opción múltiple no siempre eran claras. Mi inglés no es perfecto y las preguntas fueron escritas por un hablante no nativo, por lo que a veces hubo malentendidos.
Quizás la parte del curso dedicada a los oráculos y las NFT podría ser más detallada. Pero, en cualquier caso, el objetivo principal del curso es interesar a los desarrolladores. Luego, para comprender completamente todos sus aspectos, necesitarás, por supuesto, dedicar algo de tiempo a experimentar y practicar.
Cuéntenos más sobre la solución en la que trabajó durante el curso: ¿'Coupon Bazaar'? ¿Puedo ver también algunos ejemplos de código?
Sí, trabajamos en 'Coupon Bazaar', un mercado donde la gente vende y compra cupones que les dan derecho a comprar bienes y servicios a un precio más bajo. Cada cupón está representado por un activo digital que ofrece un descuento especial del proveedor.

Era necesario desarrollar varios componentes de la aplicación. En primer lugar, era necesario crear un sistema de registro de proveedores y gestión de cupones. Entonces necesitábamos una función de verificación y la posibilidad de que los usuarios buscaran cupones.

Durante el curso también agregamos varias funciones nuevas, incluido un sistema de votación y una función que le permite verificar y poner en lista negra a los proveedores.
Primero, aprendimos la diferencia entre activos inteligentes, cuentas inteligentes y cuentas dApp y los conceptos básicos para trabajar con funciones de verificación. Las funciones del verificador le permiten cambiar el comportamiento predeterminado de su cuenta. De forma predeterminada, verifican las firmas de las transacciones, pero la función de verificación le permite establecer otras "reglas".
{-# 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
}
}Luego comenzamos a agregar cupones. Usamos una de las funciones más importantes de la dApp, que le permite registrar datos de cualquier tipo en la cadena de bloques en forma de pares clave-valor: una transacción de datos. Lo combinamos con una nueva transacción, invokeScript, que se utiliza para llamar a una función invocable en una dApp desde fuera de la cadena de bloques.
El tipo de transacción de datos que utilizamos durante el curso fue agregar cupones al mercado:
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)
})Para procesar estos datos con la función addItem y desarrollar la función de compra y otras opciones, utilizamos una función invocable a la que el usuario puede llamar desde fuera de la cadena de bloques. Como resultado, puede realizar diversas tareas, como iniciar la transferencia de fondos, escribir o actualizar datos en el almacén de datos de la dApp, etc.
A continuación se muestra un ejemplo de la función llamada utilizada en la función 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)
])
}
}Posteriormente desarrollamos un sistema de votación que le permite votar para promocionar o eliminar ciertos productos. Para evitar influencias externas en el proceso de votación, utiliza el esquema 'Compromiso-Revelación'.
La fase de "compromiso" se utiliza para recopilar los votos cifrados mediante una función hash y una "sal".
La fase de "revelación" se utiliza para recopilar votos cifrados y comparar sus hashes.
A continuación se muestra un ejemplo de la función llamada que se utiliza aquí:
@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é más aprendiste del curso?
El curso también incluyó tokenización y tokens no fungibles (NFT): tokens que representan algo único y, por lo tanto, no son fungibles.
La última lección estuvo dedicada a los oráculos. Dado que la cadena de bloques no puede recibir datos del mundo exterior, necesitamos oráculos para enviarle estos datos.
Para nuestro mercado, se necesitaban oráculos para verificar y, si fuera necesario, incluir en la lista negra a un proveedor que, por ejemplo, no aceptó un cupón vendido.
He aquí un ejemplo:
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é fue lo más útil para ti?
La parte más útil son las tareas. Gracias a ellos, el material de la conferencia se volvió más claro y los conocimientos recién adquiridos se consolidaron mediante prueba y error. Trabajo práctico con , и .
¿Cómo planeas poner en práctica lo que has aprendido?
Desde el principio esperé que el curso me ayudara a llevar mi proyecto al siguiente nivel. La idea era escribir ahora el código. en PASEO. La versión existente ya cuenta con funciones de certificación de documentos, pero gracias a RIDE se puede mejorar significativamente. La nueva versión será más flexible e intuitiva y tendrá más funciones, incluida la certificación de correos electrónicos, acuerdos multilaterales, etc.
El curso también me hizo pensar y me dio muchas ideas nuevas. Confío en que los resultados seguirán apareciendo en el futuro.
Fuente: habr.com
