Domina la ola de Web 3.0

El desarrollador Christophe Verdo habla sobre el curso en línea ‘Dominando Web 3.0 con Waves’, que recientemente completó.

Domina la ola de Web 3.0

Cuéntame un poco sobre ti. ¿Qué te interesó de este curso?

He estado trabajando en desarrollo web durante aproximadamente 15 años, principalmente como freelancer.

Al desarrollar una aplicación web de registro a largo plazo para países en desarrollo por encargo de un grupo bancario, me encontré con el desafío de integrar en ella la certificación blockchain. En ese momento, no sabía mucho sobre certificación blockchain, aunque ya estaba interesado en las criptotecnologías, principalmente como inversor.

Como resultado, esta función no se implementó, pero reflexionando sobre que organizaciones y bancos están interesados en tal solución para sus aplicaciones, comencé a investigar el tema y pronto lancé el proyecto Signature Chain.

Desarrollé su versión beta, que ya está disponible en la red principal. En ese momento, no existía el lenguaje de programación [Waves] Ride, y lo hacía de la manera más simple, utilizando transacciones de transferencia con JSON incrustado. Pero el objetivo principal era añadir funcionalidades más avanzadas después del lanzamiento de Ride. Y esa es la principal razón por la que me uní al curso: la siguiente etapa de desarrollo del proyecto contemplaba la creación de una aplicación descentralizada (dApp).

¿Qué aspectos del curso te parecieron más fáciles y cuáles más difíciles?

Lo más fácil fue que tuvimos tiempo suficiente para todas las tareas. El sentido del curso es aprender algo, no competir entre nosotros. Las explicaciones eran muy accesibles y las ilustraciones eran simples pero completas. Esto ayudó a visualizar y entender diferentes temas.

Al realizar las tareas, nos empujaron a pensar de manera independiente y a veces estudiar algo por nuestra cuenta. Esta es la mejor manera de aprender algo y entender las ideas consideradas en las clases.

Vez tras vez no entendía completamente la parte teórica hasta que comenzaba a escribir código, realizando la tarea. No se nos permitía hacer ‘copy/paste’, todo el código debía ser escrito por nosotros mismos, y eso también ayudaba a entender mejor todo.

Lo más difícil fue que las preguntas en el cuestionario de opción múltiple no siempre eran claras. Mi inglés no es perfecto, y las preguntas estaban redactadas por alguien que no es nativo, por lo que a veces había malentendidos.

Quizás la parte del curso dedicada a oráculos y NFT podría ser más detallada. Sin embargo, en cualquier caso, el objetivo principal del curso es captar el interés de los desarrolladores. Luego, para comprender todos sus aspectos, será necesario dedicar tiempo a experimentar y practicar.

¿Puedes contarme más sobre la solución en la que trabajaste durante todo el curso – ‘Coupon Bazaar’? ¿Podríamos ver ejemplos de código también?

Sí, trabajamos en ‘Coupon Bazaar’, que es un mercado donde las personas compran y venden cupones que ofrecen descuentos para productos y servicios. Cada cupón se representa como un activo digital que otorga un descuento especial del proveedor.

Domina la ola de Web 3.0

Era necesario desarrollar varios componentes de la aplicación. Primero, había que crear un sistema para registrar proveedores y administrar cupones. Luego, se necesitaba una función de verificación y la posibilidad de que los usuarios buscaran cupones.

Domina la ola de Web 3.0

Durante el curso, también añadimos algunas nuevas funciones, incluyendo un sistema de votación y una función que permite verificar y blacklistear a los proveedores.

Primero, estudiamos la diferencia entre activos inteligentes, cuentas inteligentes y cuentas de dApp, así como el funcionamiento de las funciones de verificación. Las funciones de verificación permiten alterar el comportamiento predeterminado de la cuenta. Por defecto, verifican las firmas de las transacciones, pero la función de verificación permite establecer otras "reglas".

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

Luego comenzamos a añadir cupones. Utilizamos una de las funciones más importantes de dApp, que permite registrar en la blockchain datos de cualquier tipo en forma de pares "clave-valor" – una transacción de datos. La combinamos con una nueva transacción, invokeScript, que se utiliza para llamar a la función invocada en dApp desde fuera de la blockchain.

El tipo de transacciones de datos que utilizamos durante el curso fue la adición de cupones al mercado:

letdatajson = {
    "title":        "camiseta con , vota 1",
    "coupon_price": 10000000,
    "old_price":    1000000000,
    "new_price":    100000000,
    "address":      "Universo",
    "description":  "Quiero que hagas el amor, no la guerra, sé que lo has oído antes",
    "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 que el usuario puede llamar desde fuera de la blockchain. Como resultado, puede realizar diversas tareas, como iniciar la transferencia de fondos, registrar o actualizar datos en el almacenamiento de datos de la dApp, etc.

Aquí hay un ejemplo de la función invocable 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("la cantidad de compra no puede ser menor que el precio del artículo")
    elseif( getValueItemSupplier(item) !=NONE ) thenthrow("el artículo ya existe")
    else{
        WriteSet([
           DataEntry(getKeyItemSupplier(item), supplierAddress),
           DataEntry(getKeyItemPrice(item), price),
           DataEntry(getKeyItemData(item), data)
        ])
    }
}

Más tarde desarrollamos un sistema de votación que permite emitir votos para promover o eliminar ciertos productos. Para evitar la influencia externa en el proceso de votación, utiliza un esquema de ‘Commit-Reveal’.

La fase 'commit' se utiliza para recopilar votos encriptados mediante una función hash y ‘sal’.

La fase 'reveal' se utiliza para recopilar los votos encriptados y comparar sus hashes.

Aquí hay un ejemplo de la función invocable utilizada aquí:

@Callable(i)
funcvoteCommit(item: String, hash: String) = {
    letuser = toBase58String(i.caller.bytes)
    letcommits = getValueCommitsCount(item)
    letstatus = getValueItemStatus(item)
    if( commits >=VOTERS) thenthrow("se alcanzó el número máximo de votantes")
    elseif(getValueCommit(item, user) !=NONE) thenthrow("el usuario ya ha participado")
    elseif(getKeyItemSupplier(item) ==NONE) thenthrow("el artículo no existe")
    elseif(status !=NONE && status !=VOTING) thenthrow("no es posible votar")
    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 intercambiables.

La última clase estuvo dedicada a los oráculos. Dado que la blockchain no puede recibir datos del mundo exterior, necesitamos oráculos para enviarle estos datos.

Para nuestro marketplace, los oráculos eran necesarios para verificar y, si era necesario, poner en la lista negra a un proveedor que, por ejemplo, no aceptó un cupón vendido.

Aquí hay un ejemplo:

funcgetExtValueItemWhiteListStatus(item:String) = {
    item +"_verifier_status"
}
 
letverifier = "3Mx9qgMyMhHt7WUZr6PsaXNfmydxMG7YMxv"
letVERIFIED = "verificado"
letBLACKLISTED = "lista_negra"
@Callable(i)
funcsetstatus(supplier: String, status: String) = {
    letaccount = toBase58String(i.caller.bytes)
    if( account !=verifier ) thenthrow("solo el verificador de oráculos puede gestionar la lista blanca")
    elseif( status !=VERIFIED && status !=BLACKLISTED) thenthrow("estado incorrecto")
    else{
        WriteSet([
           DataEntry(getExtValueItemWhiteListStatus(supplier), status)
        ])
    }
}

¿Qué fue lo más útil para usted?

La parte más útil fueron las tareas. Gracias a ellas, el material de las conferencias se volvía más comprensible, y los conocimientos adquiridos se consolidaban a través de la práctica y los errores. También fue muy útil trabajar con IDE, explorador y oráculos.

¿Cómo planea utilizar lo que ha aprendido en la práctica?

Desde el principio, esperaba que el curso ayudara a llevar mi proyecto a un nuevo nivel. La idea era ahora escribir código sign-web.app en RIDE. La versión existente ya tiene funciones de certificación de documentos, pero, gracias a RIDE, se puede mejorar significativamente. La nueva versión será más flexible y comprensible, tendrá más funciones, incluyendo la certificación de correos electrónicos, acuerdos entre varias partes, etc.

El curso también me hizo reflexionar, y tengo muchas nuevas ideas. Estoy seguro de que los resultados se manifestarán en el futuro.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster