
Olá a todos!
Recentemente, a Waves Labs lançou um concurso para desenvolvedores em homenagem ao lançamento da testnet da extensão da linguagem de contratos inteligentes RIDE para aplicações descentralizadas Ride4Dapps!
Escolhemos o caso DAO porque planeja desenvolver um dApp com funções sociais: votação, arrecadação de fundos, gerenciamento fiduciário, etc.
Começamos com um exemplo simples em e no — exemplo de um .
Vamos analisar este exemplo, testar hipóteses e considerar algumas peculiaridades:
Suponha que temos Alice — Proprietária do dApp
Boob e Cooper — parceiros de Alice, cofundadores do DAO Alice-BC
Neli — proprietário de um negócio que precisa de financiamento
Banco — instituição financeira que distribui tokens
Etapa 1. Inicialização dos saldos
Para obter tokens na testnet Waves, é necessário acessar o e indicar o endereço para o qual enviar os tokens.
O endereço pode ser encontrado na IDE, abrindo os dados da conta.
Atribuímos 10 WAVES ao Banco. Depois, verificamos se eles foram recebidos através do explorador de blocos e transações:
Agora vamos distribuir tokens do banco para os demais participantes. (Notas: Todas as transações na rede Waves não são gratuitas, portanto é necessário um saldo positivo mínimo para todos os participantes realizarem transações).
1 WAVES = 100000000 unidades (wavelets), uma vez que os valores devem ser apenas inteiros.
0.01 WAVES (Taxa de Transação) = 1000000
Banco -> [3 WAVES] -> Alice, através de TransferTransaction (Tipo: 4).
Verificamos se env.SEED, que assina as transações, corresponde ao nosso Banco:


Se você não tiver a frase seed correspondente, basta alternar para ela na aba Contas e verificar novamente.
Após isso, criamos, anunciamos e assinamos a transação de transferência de 3 WAVES para Alice.
Os dados de Alice podem ser obtidos também através da variável env.accounts. A numeração começa em 0, portanto Alice é env.accounts[1].

broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))O resultado também pode ser observado no explorador, o link para ele nos será retornado imediatamente após a execução .
Verificamos que o saldo de Alice aumentou em 3 WAVES e que o saldo do banco ficou em 10 — 3 — 0.01 = 0.699.


Enviamos 3 WAVES para Boob e Cooper, e 0.2 WAVES para Neli, Xena e Mark da mesma forma.
(Notas: Cometemos um erro de um dígito e enviamos a Neli 0.02 WAVES. Tenha cuidado!)
broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))Após creditar os saldos de todos os participantes, vemos:

Etapa 2. Criação da conta do dApp
Nós concordamos que Alice será a criadora e proprietária do aplicativo descentralizado.
Em Accounts, configuramos ela como SEED e verificamos se env.SEED corresponde a Alice.
Vamos tentar instalar na conta de Alice o script (contrato) mais simples possível.
Os contratos inteligentes na Waves são predições que proíbem ou permitem a execução de um determinado tipo de transação de saída sob certas condições. Neste caso, a condição é ALWAYS. O código do contrato é true. Chamamos deploy().

A taxa pela transação setScript é 1400000/100000000 = 0.014 WAVES. Alice ainda tem 2.986 WAVES no saldo.
Agora vamos tentar instalar na conta de Alice uma lógica de contrato inteligente mais complexa, descrita no
Ride4Dapps agora inclui 2 novos tipos de anotações:
- @Callable(i) — aceita como parâmetro i, que contém dados sobre qual conta chamou/assinou a transação. É o resultado dessa função que determina a alteração do estado da conta dApp. Outras contas podem criar transações e executar funções com essa anotação e alterar o estado da conta dApp.
- @Verifier(tx) — Verificador de transação com o parâmetro tx da transação. Corresponde à lógica das predições no RIDE. É nesta expressão que se pode permitir ou proibir futuras alterações na lógica dos contratos inteligentes na conta dApp.
Vamos fazer dApp a conta como uma carteira compartilhada para todos os participantes.

Para verificar qual contrato está ativo na conta, você pode copiar o código base64 do contrato inteligente no explorador de blocos e reconhecê-lo através do decompilador ()



Certifique-se de que a lógica do contrato inteligente corresponde ao que esperamos.
Alice ainda tem 2.972 WAVES no saldo.
Este dApp rastreia quanto cada participante contribui para o fundo comum através do mecanismo data transaction — DataEntry(currentKey, newAmount), onde currentKey é a conta que chama a função deposit, e newAmount é o valor do saldo depositado.
Boob e Cooper depositam 1 WAVES cada um na conta dApp.

Fazemos um erro e a transação não é concluída. Apesar de termos verificado que estamos fazendo a transação em nome de Bob, erramos no índice e indicamos a conta Bank, que não tem contrato inteligente. É importante notar que por tentativas malsucedidas de iniciar transações, a taxa não é cobrada! Alice ainda tem 2.972 WAVES. 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. Ou seja, Bob pagou 0.01 WAVES de taxa.

Alice tinha 2.972 WAVES, agora tem 3.972. Na conta de Alice também está registrada uma transação, porém nenhuma taxa foi cobrada da conta dApp (Alice).
Após Cooper também recarregar a conta, Alice passou a ter 4.972 WAVES.

Para saber quanto cada um possui na carteira compartilhada, é possível consultar o explorador de blocos na aba Dados.
Cooper mudou de ideia sobre deixar 1 WAVES na carteira compartilhada e decidiu retirar metade dos fundos. Para isso, ele deve chamar a função withdraw.

No entanto, nós erramos novamente, pois a função withdraw tem outros parâmetros, outra assinatura. Ao projetar contratos inteligentes na RIDE4DAPPS, é preciso prestar atenção a este detalhe.

Cooper agora tem 2.48 WAVES. Assim, 3 WAVES — 1 — 0.01, e depois + 0.5 — 0.01. Portanto, cada chamada de deposit e withdraw custa 0.01 WAVES. No final, a tabela de proprietários de dApps mudou da seguinte forma.

Bob também decidiu retirar uma quantia da carteira compartilhada, mas errou e tentou retirar 1.5 WAVES.

No entanto, no contrato inteligente havia uma verificação para essa situação.
Xena é uma fraudadora, tentou retirar 1 WAVES da conta compartilhada.

Ela também não obteve sucesso.
Na próxima parte, discutiremos aspectos mais complexos relacionados à imperfeição da conta dApp de Alice.
Fonte: habr.com
