Aprender a escribir contratos inteligentes Waves en RIDE y RIDE4DAPPS. Parte 1 (billetera multiusuario)

Aprender a escribir contratos inteligentes Waves en RIDE y RIDE4DAPPS. Parte 1 (billetera multiusuario)

Hola a todos!

Más recientemente, Waves Labs anunciado competencia para desarrolladores dedicados al lanzamiento de la extensión de lenguaje de contrato inteligente RIDE para aplicaciones descentralizadas Ride4Dapps en la red de prueba.

Elegimos el caso DAO porque ventuario planea desarrollar dApps con funciones sociales: votación, recaudación de fondos, gestión de fideicomisos, etc.
Comenzamos con un ejemplo simple en Sesiones de preguntas y respuestas y PASEO IDE - ejemplo con billetera compartida.

Veamos este ejemplo, probemos hipótesis y observemos algunas rarezas:

Tengamos a Alice - Propietario de dApp
Boob y Cooper son socios de Alice, cofundadores de Alice-BC DAO
Neli es dueña de un negocio que necesita financiamiento
Banco: un banco que distribuye tokens

Etapa 1. Inicialización de saldos

Para recibir tokens en la red de prueba de ondas, debe comunicarse con grifo e indique la dirección a la que enviar tokens.
Puede encontrar la dirección en el IDE abriendo los detalles de su cuenta.
Destacamos el Banco 10 WAVES. Luego comprobamos que llegaron a través del navegador de bloques y transacciones: crítico

Ahora distribuyamos tokens del banco al resto de participantes. (Notas: Todas las transacciones en la red Waves no son gratuitas, por lo que se requiere un saldo positivo mínimo para que todos los participantes realicen transacciones).

1 WAVES = 100000000 unidades (wavelets), ya que las cantidades solo pueden ser números enteros
0.01 WAVES (Tarifa de transacción) = 1000000

Banco -> [3 WAVES] -> Alice, vía TransferTransaction (Tipo: 4).

Comprobamos que el env.SEED desde el que se firman las transacciones coincide con nuestro Banco:
Aprender a escribir contratos inteligentes Waves en RIDE y RIDE4DAPPS. Parte 1 (billetera multiusuario)

Si no tiene una frase inicial coincidente, simplemente cámbiela en la pestaña Cuentas y verifique nuevamente.
Después de esto, creamos, anunciamos y firmamos una transacción para la transferencia de 3 WAVES Alice.
También puede conocer los datos de Alice a través de la variable env.accounts. La numeración comienza desde 0, por lo que Alice es env.accounts[1].
Aprender a escribir contratos inteligentes Waves en RIDE y RIDE4DAPPS. Parte 1 (billetera multiusuario)

broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))

El resultado también se puede observar en el navegador; se nos devolverá un enlace inmediatamente después de la ejecución. transacciones.

Nos aseguramos de que el saldo de Alice se reponga con 3 ONDAS y que el saldo bancario permanezca en 10 - 3 - 0.01 = 0.699.
Aprender a escribir contratos inteligentes Waves en RIDE y RIDE4DAPPS. Parte 1 (billetera multiusuario)

Aprender a escribir contratos inteligentes Waves en RIDE y RIDE4DAPPS. Parte 1 (billetera multiusuario)

A Boob y Cooper le mandamos 3 ONDAS cada uno, y a Neli, Xena y Mark 0.2 ONDAS cada uno de la misma forma.
(Notas: cometimos un error de un carácter y enviamos a Neli 0.02 WAVES. ¡Cuidado!)

broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))

Después de reponer los saldos de todos los participantes, vemos:
Aprender a escribir contratos inteligentes Waves en RIDE y RIDE4DAPPS. Parte 1 (billetera multiusuario)

Etapa 2. Crea una cuenta dApp

Acordamos que Alice sería la creadora y propietaria de la aplicación descentralizada.
Vaya a Cuentas, configúrelo como SEED y verifique que env.SEED coincida con Alice.

Intentemos instalar el script (contrato) más simple posible en la cuenta de Alice.
Los contactos inteligentes en Waves son predicados que prohíben o permiten que se produzca cualquier tipo de transacción saliente bajo ciertas condiciones. En este caso, esta condición es SIEMPRE. El código del contrato es verdadero. Llame a implementar().

Aprender a escribir contratos inteligentes Waves en RIDE y RIDE4DAPPS. Parte 1 (billetera multiusuario)

Tarifa por transacción setScript 1400000/100000000 = 0.014 WAVES. A Alice le quedan 2.986 WAVES en su saldo.

Intentemos ahora instalar una lógica de contrato inteligente más compleja en la cuenta de Alice, descrita en ejemplo

Ride4Dapps ahora incluye 2 nuevos tipos de anotaciones:

  1. @Invocable(i) — toma como parámetro i, datos sobre qué cuenta llamó/firmó la transacción. Es el resultado de esta función el que determina el cambio en el estado de la cuenta dApp. Otras cuentas pueden crear transacciones y ejecutar funciones con esta anotación y cambiar el estado de la cuenta dApp.
  2. @Verificador(tx) — Verificador de transacciones con el parámetro transacción tx. Corresponde a la lógica de predicados de RIDE. Es en esta expresión que puedes permitir o prohibir cambios adicionales en la lógica de los contratos inteligentes en la cuenta dApp.

Hagamos dApp cuenta como una billetera común para todos los participantes.
Aprender a escribir contratos inteligentes Waves en RIDE y RIDE4DAPPS. Parte 1 (billetera multiusuario)

Para verificar qué contrato está actualmente activo en su cuenta, puede copiar el código base64 del contrato inteligente en el explorador de bloques y reconocerlo usando un descompilador (por ejemplo)
Aprender a escribir contratos inteligentes Waves en RIDE y RIDE4DAPPS. Parte 1 (billetera multiusuario)
Aprender a escribir contratos inteligentes Waves en RIDE y RIDE4DAPPS. Parte 1 (billetera multiusuario)
Aprender a escribir contratos inteligentes Waves en RIDE y RIDE4DAPPS. Parte 1 (billetera multiusuario)

Nos aseguramos de que la lógica del contrato inteligente coincida con lo que esperamos.
A Alice le quedan 2.972 WAVES en su saldo.

Esta dApp realiza un seguimiento de cuánto aporta cada participante al fondo común a través de un mecanismo transacción de datos: entrada de datos (clave actual, cantidad nueva), donde currentKey es la cuenta que llama a la función de depósito y newAmount es el valor del saldo reabastecido.

Boob y Cooper realizan sus depósitos en la cuenta dApp con 1 WAVES.
Aprender a escribir contratos inteligentes Waves en RIDE y RIDE4DAPPS. Parte 1 (billetera multiusuario)

Cometemos un error y la transacción no se realiza. Ya que, a pesar de que estábamos convencidos de que estábamos realizando una transacción en nombre de Bob, cometimos un error en el índice e indicamos una cuenta bancaria que no tiene contrato inteligente. Vale la pena señalar un punto importante aquí: se aplica una tarifa por los intentos fallidos de iniciar transacciones. ¡No se puede quitar! A Alice le quedan 2.972 WAVES en su saldo. Bob tiene 3 ONDAS.

Bob envió 1 WAVES a la cuenta dApp.

broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))

Aprender a escribir contratos inteligentes Waves en RIDE y RIDE4DAPPS. Parte 1 (billetera multiusuario)

A Bob le quedan 1.99 ONDAS. Es decir, Bob pagó 0.01 de comisión por WAVES.

Aprender a escribir contratos inteligentes Waves en RIDE y RIDE4DAPPS. Parte 1 (billetera multiusuario)

Alice tenía 2.972 WAVES en su saldo, ahora es 3.972. También se registró una transacción en la cuenta de Alice, pero no se cobró ninguna comisión de la cuenta dApp (Alice).
Después de que Cooper también reponía la cuenta, el saldo de Alice se convirtió en 4.972 WAVES.

Aprender a escribir contratos inteligentes Waves en RIDE y RIDE4DAPPS. Parte 1 (billetera multiusuario)

Puede averiguar quién posee cuántas WAVES en la billetera común en el explorador de bloques en la pestaña Datos.

Cooper cambió de opinión acerca de dejar la cantidad de 1 WAVES en la billetera general y decidió retirar la mitad de la afinidad. Para hacer esto, debe llamar a la función de retiro.

Aprender a escribir contratos inteligentes Waves en RIDE y RIDE4DAPPS. Parte 1 (billetera multiusuario)

Sin embargo, volvimos a equivocarnos, ya que la función de retirada tiene parámetros completamente diferentes y una firma diferente. Cuando diseñas contratos inteligentes en RIDE4DAPPS debes prestar atención a este punto

Aprender a escribir contratos inteligentes Waves en RIDE y RIDE4DAPPS. Parte 1 (billetera multiusuario)

Cooper ahora tiene 2.48 WAVES en su balance. En consecuencia, 3 ONDAS - 1 - 0.01, y luego + 0.5 - 0.01. En consecuencia, cada llamada para depositar y retirar cuesta 0.01 WAVES. Como resultado, las entradas en la tabla de propietarios de dApps cambiaron de la siguiente manera.

Aprender a escribir contratos inteligentes Waves en RIDE y RIDE4DAPPS. Parte 1 (billetera multiusuario)

Bob también decidió retirar algo de dinero de la billetera compartida, pero cometió un error e intentó retirar 1.5 WAVES.

Aprender a escribir contratos inteligentes Waves en RIDE y RIDE4DAPPS. Parte 1 (billetera multiusuario)

Sin embargo, el contrato inteligente tenía un control para esta situación.

Xena es una estafadora, intentó retirar 1 WAVES del total de la cuenta.

Aprender a escribir contratos inteligentes Waves en RIDE y RIDE4DAPPS. Parte 1 (billetera multiusuario)

A ella tampoco le funcionó.

En la siguiente parte, veremos cuestiones más complejas relacionadas con la imperfección de la cuenta Alice dApp.

Fuente: habr.com

Añadir un comentario