Aprende a escribir contratos intelixentes de Waves en RIDE e RIDE4DAPPS. Parte 1 (cartera multiusuario)

Aprende a escribir contratos intelixentes de Waves en RIDE e RIDE4DAPPS. Parte 1 (cartera multiusuario)

Ola a todos!

Máis recentemente, Waves Labs anunciou concurso para desenvolvedores dedicado ao lanzamento da extensión de linguaxe de contrato intelixente RIDE para aplicacións descentralizadas Ride4Dapps na rede de proba!

Escollemos o caso DAO porque Ventuario planea desenvolver dApps con funcións sociais: votación, captación de fondos, xestión de confianza, etc.
Comezamos cun exemplo sinxelo en Sesións de preguntas e respostas e RIDE IDE - exemplo con carteira compartida.

Vexamos este exemplo, probamos hipóteses e vexamos algunhas rarezas:

Teñamos a Alice - propietario de dApp
Boob e Cooper son socios de Alice, cofundadores de Alice-BC DAO
Neli é un empresario que necesita financiamento
Banco: un banco que distribúe fichas

Fase 1. Inicialización de saldos

Para recibir fichas na rede de proba de ondas, debes contactar billa e indique o enderezo ao que enviar os tokens.
Podes atopar o enderezo no IDE abrindo os detalles da túa conta.
Destacamos Banco 10 ONDAS. Despois comprobamos que chegaron a través do navegador de bloqueos e transaccións: revisor

Agora imos distribuír fichas do banco ao resto dos participantes. (Notas: todas as transaccións na rede waves non son gratuítas, polo que é necesario un saldo mínimo positivo para que todos os participantes poidan realizar transaccións).

1 ONDAS = 100000000 unidades (wavelets), xa que as cantidades só poden ser enteiras
0.01 WAVES (Taxa de transacción) = 1000000

Banco -> [3 ONDAS] -> Alice, mediante TransferTransaction (Tipo: 4).

Comprobamos que o env.SEED desde o que se asinan as transaccións coincide co noso Banco:
Aprende a escribir contratos intelixentes de Waves en RIDE e RIDE4DAPPS. Parte 1 (cartera multiusuario)

Se non tes unha frase inicial que coincida, cambia a ela na pestana Contas e verifica de novo.
Despois diso, creamos, anunciamos e asinamos unha transacción para a transferencia de 3 WAVES Alice.
Tamén podes coñecer os datos de Alice a través da variable env.accounts. A numeración comeza a partir de 0, polo que Alice é env.accounts[1].
Aprende a escribir contratos intelixentes de Waves en RIDE e RIDE4DAPPS. Parte 1 (cartera multiusuario)

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

O resultado tamén se pode observar no navegador, unha ligazón a ela devolverase inmediatamente despois da execución transaccións.

Asegurámonos de que o saldo de Alice se repoña en 3 ONDAS e que o saldo bancario permaneza en 10 - 3 - 0.01 = 0.699.
Aprende a escribir contratos intelixentes de Waves en RIDE e RIDE4DAPPS. Parte 1 (cartera multiusuario)

Aprende a escribir contratos intelixentes de Waves en RIDE e RIDE4DAPPS. Parte 1 (cartera multiusuario)

Enviamos a Boob e Cooper 3 ONDAS cada un, e a Neli, Xena e Mark 0.2 ONDAS cada un do mesmo xeito.
(Notas: cometemos un erro dun carácter e enviamos a Neli 0.02 WAVES. Teña coidado!)

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

Despois de repoñer os saldos de todos os participantes, vemos:
Aprende a escribir contratos intelixentes de Waves en RIDE e RIDE4DAPPS. Parte 1 (cartera multiusuario)

Etapa 2. Crear unha conta dApp

Acordamos que Alice sería a creadora e propietaria da aplicación descentralizada.
Vai a Contas, configúrao como SEED e comprobe que env.SEED coincide con Alice.

Tentemos instalar o script (contrato) máis sinxelo posible na conta de Alicia.
Os contactos intelixentes en Waves son predicados que prohiben ou permiten que se produza calquera tipo de transacción de saída en determinadas condicións. Neste caso, esta condición é SEMPRE. O código do contrato é verdadeiro. Chamar a implementación().

Aprende a escribir contratos intelixentes de Waves en RIDE e RIDE4DAPPS. Parte 1 (cartera multiusuario)

Tarifa por transacción setScript 1400000/100000000 = 0.014 WAVES. A Alice lle quedan 2.986 ONDAS no saldo.

Tentemos agora instalar unha lóxica de contrato intelixente máis complexa na conta de Alice, descrita en exemplo

Ride4Dapps agora inclúe dous novos tipos de anotacións:

  1. @Callable(i) — toma como parámetro i, os datos sobre a conta chamada/asinada da transacción. É o resultado desta función o que determina o cambio no estado da conta dApp. Outras contas poden crear transaccións e executar funcións con esta anotación e cambiar o estado da conta dApp.
  2. @Verifier(tx) — Verificador de transaccións co parámetro transacción tx. Corresponde á lóxica do predicado de RIDE. É nesta expresión na que pode permitir ou prohibir novos cambios na lóxica dos contratos intelixentes na conta dApp.

Imos facer dApp conta como unha carteira común para todos os participantes.
Aprende a escribir contratos intelixentes de Waves en RIDE e RIDE4DAPPS. Parte 1 (cartera multiusuario)

Para comprobar que contrato está activo actualmente na túa conta, pode copiar o código base64 do contrato intelixente no explorador de bloques e recoñecelo mediante un descompilador (por exemplo)
Aprende a escribir contratos intelixentes de Waves en RIDE e RIDE4DAPPS. Parte 1 (cartera multiusuario)
Aprende a escribir contratos intelixentes de Waves en RIDE e RIDE4DAPPS. Parte 1 (cartera multiusuario)
Aprende a escribir contratos intelixentes de Waves en RIDE e RIDE4DAPPS. Parte 1 (cartera multiusuario)

Asegurámonos de que a lóxica do contrato intelixente coincida co que esperamos.
A Alice lle quedan 2.972 ONDAS no saldo.

Esta dApp fai un seguimento de canto achega cada participante ao fondo común a través dun mecanismo transacción de datos — DataEntry (CurrentKey, newAmount), onde currentKey é a conta que chama á función de depósito e newAmount é o valor do saldo reabastecido.

Boob e Cooper fan os seus depósitos na conta dApp con 1 WAVES.
Aprende a escribir contratos intelixentes de Waves en RIDE e RIDE4DAPPS. Parte 1 (cartera multiusuario)

Cometemos un erro e a transacción non se realiza. Xa que, a pesar de que estabamos convencidos de que facíamos unha transacción en nome de Bob, cometemos un erro no índice e indicamos unha conta bancaria que non ten un contrato intelixente. Paga a pena sinalar un punto importante aquí: hai unha taxa por intentos infrutuosos de iniciar transaccións non se pode eliminar! A Alice lle quedan 2.972 ONDAS no saldo. Bob ten 3 ONDAS.

Bob enviou 1 WAVES á conta dApp.

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

Aprende a escribir contratos intelixentes de Waves en RIDE e RIDE4DAPPS. Parte 1 (cartera multiusuario)

A Bob quedan 1.99 ONDAS. É dicir, Bob pagou unha comisión de 0.01 WAVES

Aprende a escribir contratos intelixentes de Waves en RIDE e RIDE4DAPPS. Parte 1 (cartera multiusuario)

Alice tiña 2.972 ONDAS no seu saldo, agora son 3.972. Tamén se rexistrou unha transacción na conta de Alice, pero non se cobrou ningunha comisión desde a conta dApp (Alice).
Despois de que Cooper tamén repoñera a conta, o saldo de Alice converteuse en 4.972 WAVES.

Aprende a escribir contratos intelixentes de Waves en RIDE e RIDE4DAPPS. Parte 1 (cartera multiusuario)

Podes descubrir quen é o propietario de cantas WAVES na carteira común no explorador de bloques na pestana Datos.

Cooper cambiou de opinión sobre deixar a cantidade de 1 ONDAS na carteira xeral e decidiu retirar a metade da afinidade. Para iso, debe chamar á función de retirada.

Aprende a escribir contratos intelixentes de Waves en RIDE e RIDE4DAPPS. Parte 1 (cartera multiusuario)

Non obstante, equivocamos de novo, xa que a función de retirada ten parámetros completamente diferentes e unha sinatura diferente. Cando deseñas contratos intelixentes en RIDE4DAPPS debes prestar atención a este punto

Aprende a escribir contratos intelixentes de Waves en RIDE e RIDE4DAPPS. Parte 1 (cartera multiusuario)

Cooper ten agora 2.48 ONDAS no seu balance. En consecuencia, 3 ONDAS - 1 - 0.01, e despois + 0.5 - 0.01. En consecuencia, cada chamada para depositar e retirar custa 0.01 ONDAS. Como resultado, as entradas da táboa de propietarios de dApps cambiaron do seguinte xeito.

Aprende a escribir contratos intelixentes de Waves en RIDE e RIDE4DAPPS. Parte 1 (cartera multiusuario)

Bob tamén decidiu retirar algún diñeiro da carteira compartida, pero cometeu un erro e intentou retirar 1.5 WAVES.

Aprende a escribir contratos intelixentes de Waves en RIDE e RIDE4DAPPS. Parte 1 (cartera multiusuario)

Non obstante, o contrato intelixente tiña un control para esta situación.

Xena é unha estafadora, tentou retirar 1 ONDAS da conta total.

Aprende a escribir contratos intelixentes de Waves en RIDE e RIDE4DAPPS. Parte 1 (cartera multiusuario)

Tampouco lle funcionou.

Na seguinte parte, analizaremos cuestións máis complexas relacionadas coa imperfección da conta de Alice dApp.

Fonte: www.habr.com

Engadir un comentario