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


Hola a todos!


Más recientemente, Waves Labs anunció una competencia para desarrolladores dedicada 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, ya que Ventuary planea desarrollar dApp con funciones sociales: votación, recaudación de fondos, gestión de fideicomisos, etc.


Comenzamos con un ejemplo simple en la sesión de preguntas y respuestas y en RIDE IDE , un ejemplo con una billetera común .


Veamos este ejemplo, pruebe hipótesis y consideremos algunas rarezas:


Déjanos tener a Alice - Dueña 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 ponerse en contacto con faucet y especificar la dirección a la que deben enviarse los tokens.


La dirección se puede encontrar en el IDE revelando información de la cuenta.


Seleccione Bank 10 WAVES. Después de verificar que llegaron a través del bloque y el explorador de transacciones: navegador


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


1 ONDAS = 100000000 unidades (wavelets), ya que las cantidades solo pueden ser enteras
0.01 ONDAS (tarifa de transacción) = 1000000

Banco -> [3 ONDAS] -> Alice, a través de TransferTransaction (Tipo: 4).


Verificamos que el SEE env de donde se firman las transacciones corresponde a nuestro Banco:




Si no tiene frases iniciales coincidentes, simplemente cámbielas en la pestaña Cuentas y verifique nuevamente.


Después de eso, creamos, anunciamos y firmamos una transacción en la transferencia de 3 WAVES Alice.
También puede aprender los datos de Alice a través de la variable env.accounts. La numeración comienza desde 0, respectivamente Alice es env.accounts [1].



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

El resultado también se puede observar en el navegador, el enlace volverá a nosotros inmediatamente después de la transacción .


Nos aseguramos de que el saldo de Alice se reponga con 3 ONDAS, y que 10 - 3 - 0.01 = 0.699 permanezcan en el saldo bancario.




Enviamos a Boob y Cooper en 3 WAVES, y Neli, Xena y Mark en 0.2 WAVES de la misma manera.
(Notas: cometimos un error de un solo carácter y enviamos 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:



Etapa 2. Crear una cuenta dApp


Acordamos que la creadora y propietaria de la aplicación descentralizada será Alice.
En Cuentas, ve a instalarlo como SEED y comprueba env.SEED coincide con Alice.


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



Tarifa por transacción de setScript 1400000/100000000 = 0.014 ONDAS. Alice tiene 2.986 ONDAS en su saldo.


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


Ride4Dapps ahora incluye 2 nuevos tipos de anotaciones:
  1. @Callable (i) : toma como parámetro i, datos sobre qué cuenta causó / firmó la transacción. El resultado de esta función determina el cambio en el estado de la cuenta dApp. Otras cuentas pueden crear transacciones y realizar funciones con esta anotación y cambiar el estado de la cuenta dApp.
  2. @Verifier (tx) : verificador de transacciones con el parámetro de transacción tx. Corresponde a la lógica del predicado de RIDE. Es en esta expresión que puede habilitar o deshabilitar más cambios en la lógica de los contratos inteligentes en una cuenta dApp.
    Ten cuidado El punto importante es que, por defecto, el script en la cuenta no es igual a verdadero , sino que utiliza una comparación de firma y permite que solo el propietario de la firma realice transacciones.
     sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPk) 


    Sin dicha verificación, ¡cualquiera puede realizar transacciones desde una cuenta!

Hagamos que la cuenta dApp sea ​​una billetera común para todos los participantes.



Para verificar qué contrato está actualmente activo en su cuenta, puede copiar el código base64 del contrato inteligente en el navegador de bloques y reconocerlo a través del descompilador ( por ejemplo )





Nos aseguramos de que la lógica del contrato inteligente coincida con lo que esperamos.
Alice tiene 2.972 ONDAS en su saldo.


Este dApp realiza un seguimiento de cuánto contribuye cada uno de los participantes al fondo común a través del mecanismo de transacción de datos: DataEntry (currentKey, newAmount) , 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 hacen sus depósitos en la cuenta dApp a 1 ONDA cada uno.



Cometemos un error y la transacción no pasa. Dado que, a pesar del hecho de que estábamos convencidos de que estamos haciendo una transacción en nombre de Bob, cometimos un error en el índice e indicamos una cuenta bancaria que no tiene un contrato inteligente. Aquí vale la pena señalar un punto importante: para los intentos fallidos de iniciar transacciones, ¡la comisión no se retira! Alice tiene 2.972 ONDAS en su saldo. Bob 3 tiene 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 }]})) 


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



Alice tenía 2.972 ONDAS en su balance, se convirtió en 3.972. También se registró una transacción en la cuenta de Alice, sin embargo, no se dedujo ninguna comisión de la cuenta dApp (Alice).
Después de que Cooper también reabasteció la cuenta de Alice, 4.972 WAVES se convirtieron en el balance.



Puede averiguar a cuántas ONDAS en la billetera general pertenecen en el explorador de bloques en la pestaña Datos.


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



Sin embargo, nuevamente nos equivocamos, ya que la función de retiro tiene parámetros completamente diferentes, una firma diferente. Al diseñar contratos inteligentes en RIDE4DAPPS, debe prestar atención a este momento.



Cooper tiene 2,48 ONDAS 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 ONDAS. Como resultado, las entradas en la tabla de propiedad dApps han cambiado de la siguiente manera.



Bob también decidió retirar una cierta cantidad de la billetera total, pero se equivocó y trató de extraer 1.5 ONDAS.



Sin embargo, el contrato inteligente tenía un cheque para tal situación.


Xena es una estafadora, trató de retirar 1 WAVES de la cuenta general.



Ella también falló.


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

Source: https://habr.com/ru/post/447790/


All Articles