
Olá a todos!
Recentemente, a Waves Labs Uma competição para desenvolvedores que coincidirá com o lançamento da testnet da extensão da linguagem de contratos inteligentes RIDE para aplicativos descentralizados, Ride4Dapps!
Escolhemos o caso DAO porque Planos para desenvolver um aplicativo descentralizado (dApp) com funcionalidades sociais: votação, arrecadação de fundos, gestão de fundos fiduciários, etc.
Começamos com um exemplo simples em e - exemplo com .
Vamos analisar este exemplo, testar as hipóteses e considerar algumas peculiaridades:
Vamos supor que temos Alice - Proprietária do dApp
Boob e Cooper são sócios da Alice e cofundadores da Alice-BC DAO.
Neli é uma empresária que precisa de financiamento.
Banco — um banco que distribui fichas
Etapa 1. Inicialização dos saldos
Para receber tokens na rede de testes Waves, você precisa entrar em contato com e especifique o endereço para o qual os tokens devem ser enviados.
O endereço pode ser encontrado no IDE, acessando os detalhes da conta.
Selecionamos o Banco 10 WAVES. Em seguida, verificamos se eles chegaram por meio do explorador de blocos e transações:
Agora vamos distribuir os tokens do banco para os participantes restantes. (Observação: 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 possam realizar transações.)
1 ONDA = 100000000 unidades (wavelets), visto que os valores só podem ser inteiros.
0.01 WAVES (Taxa de Transação) = 1000000
Banco -> [3 ONDAS] -> Alice, via TransferTransaction (Tipo: 4).
Verificamos se o env.SEED a partir do qual as transações são assinadas corresponde ao nosso banco:


Se você não tiver uma frase mnemônica correspondente, basta alternar para ela na guia Contas e verificar novamente.
Em seguida, criamos, anunciamos e assinamos uma transação para transferir 3 WAVES para Alice.
Você também pode encontrar os dados de Alice através da variável env.accounts. A numeração começa em 0, então Alice é env.accounts[1].

broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))O resultado também pode ser visualizado no navegador; um link para ele será retornado para nós imediatamente após a execução. .
Garantimos que o saldo de Alice seja reabastecido por 3 ONDAS, e o saldo bancário seja 10 - 3 - 0.01 = 0.699.


Enviamos 3 ONDAS para Boob e Cooper, e 0.2 ONDAS para Neli, Xena e Mark, da mesma forma.
(Observações: Cometemos um erro em um caractere e enviamos 0.02 WAVES para Neli. Tenha cuidado!)
broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))Após repor os saldos de todos os participantes, observamos o seguinte:

Etapa 2: Crie uma conta de dApp
Concordamos que Alice seria a criadora e proprietária do aplicativo descentralizado.
Em Contas, vá para instalar como SEED e verifique se env.SEED corresponde a Alice.
Vamos tentar instalar o script mais simples possível (contrato) na conta da Alice.
Os contratos inteligentes em Waves são predicados que impedem ou permitem que um determinado tipo de transação de saída ocorra sob certas condições. Nesse caso, a condição é SEMPRE. O código do contrato é verdadeiro. Chamamos deploy().

A taxa para a transação setScript é de 1400000/100000000 = 0.014 WAVES. Alice tem 2.986 WAVES restantes em seu saldo.
Vamos agora tentar instalar uma lógica de contrato inteligente mais complexa na conta de Alice, conforme descrito em
Ride4Dapps Agora inclui 2 novos tipos de anotação:
- @Callable(i) — recebe como parâmetro i a conta que chamou/assinou a transação. O resultado desta função determina a alteração no estado do dApp da conta. Outras contas podem criar transações e executar funções com esta anotação, alterando o estado do dApp da conta.
- @Verificador(tx) — Um verificador de transações com o parâmetro de transação tx. Corresponde à lógica de predicado do RIDE. Esta expressão pode ser usada para habilitar ou desabilitar alterações adicionais na lógica do contrato inteligente em uma conta dApp.
Vamos fazer dApp conta como uma carteira comum para todos os participantes.

Para verificar qual contrato está atualmente ativo em uma conta, você pode copiar o código base64 do contrato inteligente no explorador de blocos e reconhecê-lo usando um descompilador ()



Garantimos que a lógica do contrato inteligente corresponda ao que esperamos.
Alice ainda tem 2.972 ONDAS em seu saldo.
Este aplicativo descentralizado (dApp) monitora a contribuição de cada participante 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 recarregado.
Boob e Cooper depositam 1 WAVES cada um na conta do dApp.

Cometemos um erro e a transação falha. Isso ocorre porque, apesar de termos garantido que estávamos executando a transação em nome de Bob, digitamos o índice incorretamente e especificamos uma conta bancária que não possui um contrato inteligente. É importante observar que há uma taxa para tentativas malsucedidas de iniciar transações. Não pode ser removido! Alice tem 2.972 WAVES restantes em seu saldo. Bob tem 3 WAVES.
Bob enviou 1 WAVES para a conta dApp.
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))
Bob tem 1.99 WAVES restantes. Isso significa que Bob pagou 0.01 WAVES em taxas.

O saldo de Alice era de 2.972 WAVES, agora é de 3.972. Uma transação também foi registrada na conta de Alice, mas nenhuma taxa foi cobrada na conta do dApp (Alice).
Depois que Cooper também adicionou fundos à conta de Alice, o saldo dela passou a ser de 4.972 WAVES.

Você pode descobrir quem possui quantos WAVES na carteira compartilhada na aba Dados do explorador de blocos.
Cooper mudou de ideia sobre deixar 1 WAVES na carteira compartilhada e decidiu sacar metade de suas afinidades. Para isso, ele precisa chamar a função de saque.

No entanto, nos enganamos novamente, pois a função de saque possui parâmetros e assinatura completamente diferentes. Ao desenvolver contratos inteligentes no RIDE4DAPPS, você deve prestar atenção a esse detalhe.

O saldo de Cooper agora é de 2.48 WAVES. Isso se traduz em 3 WAVES - 1 - 0.01 e, em seguida, + 0.5 - 0.01. Consequentemente, cada chamada de depósito e saque custa 0.01 WAVES. Como resultado, as entradas da tabela do proprietário do dApp foram alteradas da seguinte forma.

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

No entanto, o contrato inteligente continha uma verificação para essa situação.
Xena é uma golpista que tentou sacar 1 WAVES da conta geral.

Ela também falhou.
Na próxima seção, analisaremos questões mais complexas relacionadas às imperfeições da conta Alice dApp.
Fonte: habr.com
