Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (carteira multiusuário)

Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (carteira multiusuário)

Olá a todos!

Mais recentemente, Waves Labs anunciado competição para desenvolvedores dedicados ao lançamento da extensão de linguagem de contrato inteligente RIDE para aplicativos descentralizados Ride4Dapps na rede de teste!

Escolhemos o caso DAO porque Ventuário planeja desenvolver dApps com funções sociais: votação, arrecadação de fundos, gestão de confiança, etc.
Começamos com um exemplo simples em Sessões de perguntas e respostas e PASSEIO IDE - exemplo com carteira compartilhada.

Vejamos este exemplo, testemos hipóteses e vejamos algumas curiosidades:

Deixe-nos ter Alice - proprietária do dApp
Boob e Cooper são parceiros de Alice, cofundadores da Alice-BC DAO
Neli é proprietária de uma empresa que precisa de financiamento
Banco - um banco que distribui tokens

Etapa 1. Inicialização de saldos

Para receber tokens na rede de teste de ondas, você precisa entrar em contato torneira e indique o endereço para o qual enviar tokens.
Você pode encontrar o endereço no IDE abrindo os detalhes da sua conta.
Destacamos o Banco 10 WAVES. Em seguida, verificamos se eles chegaram através do navegador de blocos e transações: revisor

Agora vamos distribuir tokens do banco para o restante dos participantes. (Observações: Todas as transações na rede Waves não são gratuitas, portanto é necessário um saldo positivo mínimo para que todos os participantes realizem transações).

1 WAVES = 100000000 unidades (wavelets), pois os valores só podem ser inteiros
0.01 WAVES (taxa de transação) = 1000000

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

Verificamos se o env.SEED a partir do qual as transações são assinadas corresponde ao nosso Banco:
Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (carteira multiusuário)

Se você não tiver uma frase-semente correspondente, basta alternar para ela na guia Contas e verificar novamente.
Após isso, criamos, anunciamos e assinamos uma transação para transferência de 3 WAVES Alice.
Você também pode descobrir os dados de Alice por meio da variável env.accounts. A numeração começa em 0, então Alice é env.accounts[1].
Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (carteira multiusuário)

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

O resultado também pode ser observado no navegador, um link para ele nos será retornado imediatamente após a execução transações.

Garantimos que o saldo de Alice seja reabastecido em 3 WAVES e que o saldo bancário permaneça em 10 - 3 - 0.01 = 0.699.
Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (carteira multiusuário)

Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (carteira multiusuário)

Enviamos 3 ONDAS para Boob e Cooper cada, e Neli, Xena e Mark 0.2 ONDAS cada um da mesma forma.
(Observações: cometemos um erro de um caractere e enviamos WAVES 0.02 para Neli. Tenha cuidado!)

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

Após repor os saldos de todos os participantes, vemos:
Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (carteira multiusuário)

Etapa 2. Crie uma conta dApp

Concordamos que Alice seria a criadora e proprietária do aplicativo descentralizado.
Vá para Contas, defina-o como SEED e verifique se env.SEED corresponde a Alice.

Vamos tentar instalar o script (contrato) mais simples possível na conta de Alice.
Os contatos inteligentes no Waves são predicados que proíbem ou permitem que qualquer tipo de transação de saída ocorra sob certas condições. Neste caso, esta condição é SEMPRE. O código do contrato é verdadeiro. Chame a implantação().

Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (carteira multiusuário)

Taxa por transação setScript 1400000/100000000 = 0.014 WAVES. Alice ainda tem 2.986 WAVES em seu saldo.

Vamos agora tentar instalar uma lógica de contrato inteligente mais complexa na conta Alice, descrita em exemplo

Ride4Dapps agora inclui dois novos tipos de anotação:

  1. @Callable(i) — toma como parâmetro i dados sobre qual conta chamou/assinou a transação. É o resultado desta função que determina a mudança no estado da conta dApp. Outras contas podem criar transações e executar funções com esta anotação e alterar o estado da conta dApp.
  2. @Verificador(tx) — Verificador de transação com o parâmetro transação tx. Corresponde à lógica de predicados do RIDE. É nesta expressão que você pode permitir ou proibir futuras alterações na lógica dos contratos inteligentes na conta dApp.

Vamos fazer dApp conta como uma carteira comum para todos os participantes.
Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (carteira multiusuário)

Para verificar qual contrato está atualmente ativo em sua conta, você pode copiar o código base64 do contrato inteligente no explorador de blocos e reconhecê-lo usando um descompilador (por exemplo)
Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (carteira multiusuário)
Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (carteira multiusuário)
Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (carteira multiusuário)

Garantimos que a lógica do contrato inteligente corresponda ao que esperamos.
Alice ainda tem 2.972 WAVES em seu saldo.

Este dApp monitora quanto cada participante contribui para o fundo comum por meio de um mecanismo transação de dados — DataEntry(currentKey, newAmount), onde currentKey é a conta que chama a função de depósito e newAmount é o valor do saldo reabastecido.

Boob e Cooper fazem seus depósitos na conta dApp com 1 WAVES.
Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (carteira multiusuário)

Cometemos um erro e a transação não é concretizada. Pois, apesar de estarmos convencidos de que estávamos fazendo uma transação em nome de Bob, cometemos um erro no índice e indicamos uma conta bancária que não possui contrato inteligente. Vale a pena observar um ponto importante aqui: há uma taxa para tentativas malsucedidas de iniciar transações não pode ser removido! Alice ainda tem 2.972 WAVES em seu saldo. Bob tem 3 ONDAS.

Bob enviou 1 WAVES para a conta dApp.

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

Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (carteira multiusuário)

Bob tem 1.99 ONDAS restantes. Ou seja, Bob pagou 0.01 comissão WAVES

Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (carteira multiusuário)

Alice tinha 2.972 WAVES em seu saldo, agora são 3.972. Também foi registrada uma transação na conta Alice, mas nenhuma comissão foi cobrada da conta dApp (Alice).
Depois que Cooper também reabasteceu a conta, o saldo de Alice passou a ser 4.972 WAVES.

Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (carteira multiusuário)

Você pode descobrir quem possui quantos WAVES na carteira comum no explorador de blocos na aba Dados.

Cooper mudou de ideia sobre deixar a quantia de 1 WAVES na carteira geral e decidiu sacar metade da afinidade. Para fazer isso, ele deve chamar a função de retirada.

Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (carteira multiusuário)

No entanto, erramos novamente, pois a função de retirada tem parâmetros completamente diferentes e uma assinatura diferente. Ao projetar contratos inteligentes no RIDE4DAPPS você deve prestar atenção a este ponto

Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (carteira multiusuário)

Cooper agora tem 2.48 WAVES em seu balanço. Conseqüentemente, 3 ONDAS - 1 - 0.01 e então + 0.5 - 0.01. Assim, cada chamada para depósito e retirada custa 0.01 WAVES. Como resultado, as entradas na tabela de proprietários de dApps foram alteradas da seguinte forma.

Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (carteira multiusuário)

Bob também decidiu sacar algum dinheiro da carteira compartilhada, mas cometeu um erro e tentou sacar 1.5 WAVES.

Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (carteira multiusuário)

Porém, o contrato inteligente tinha uma verificação para essa situação.

Xena é uma golpista, ela tentou sacar 1 WAVES do total da conta.

Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (carteira multiusuário)

Também não deu certo para ela.

Na próxima parte, veremos questões mais complexas relacionadas à imperfeição da conta Alice dApp.

Fonte: habr.com

Adicionar um comentário