Hola a todos!
Más recientemente, Waves Labs
Elegimos el caso DAO porque
Comenzamos con un ejemplo simple en
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
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:
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:

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].
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.
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.
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:
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().
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
Ride4Dapps ahora incluye 2 nuevos tipos de anotaciones:
- @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.
- @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.
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 (
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.
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 }]}))
A Bob le quedan 1.99 ONDAS. Es decir, Bob pagó 0.01 de comisión por WAVES.
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.
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.
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
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.
Bob también decidió retirar algo de dinero de la billetera compartida, pero cometió un error e intentó retirar 1.5 WAVES.
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.
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