Olá a todos!
Mais recentemente, Waves Labs
Escolhemos o caso DAO porque
Começamos com um exemplo simples em
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
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:
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:

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].
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
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.
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:
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().
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
Ride4Dapps agora inclui dois novos tipos de anotação:
- @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.
- @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.
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 (
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.
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 }]}))
Bob tem 1.99 ONDAS restantes. Ou seja, Bob pagou 0.01 comissão WAVES
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.
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.
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
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.
Bob também decidiu sacar algum dinheiro da carteira compartilhada, mas cometeu um erro e tentou sacar 1.5 WAVES.
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.
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