
Olá pessoal!
Mais recentemente, a Waves Labs anunciou uma competição para desenvolvedores dedicados ao lançamento da extensão da linguagem de contrato inteligente RIDE para aplicativos descentralizados Ride4Dapps na rede de teste!
Escolhemos o caso DAO, pois o Ventuary planeja desenvolver o dApp com funções sociais: votação, captação de recursos, gerenciamento de confiança etc.
Começamos com um exemplo simples na sessão de perguntas e respostas e no IDE RIDE - um exemplo com uma carteira comum .
Vamos dar uma olhada neste exemplo, testar hipóteses e considerar algumas esquisitices:
Vamos ter Alice - dApp Owner
Boob e Cooper são parceiros de Alice, co-fundadores do Alice-BC DAO
Neli é um empresário que precisa de financiamento
Banco - um banco que distribui tokens
Etapa 1. Inicialização dos saldos
Para receber tokens na rede de teste de ondas, você precisa entrar em contato com a torneira e especificar o endereço para o qual os tokens devem ser enviados.
O endereço pode ser encontrado no IDE, revelando informações da conta.
Selecione Banco 10 ONDAS. Depois de verificarmos que eles passaram pelo explorador de blocos e transações: browser
Agora vamos distribuir tokens do banco para os outros participantes. (Notas: Todas as transações na rede de ondas não são gratuitas; portanto, é necessário um saldo positivo mínimo para que todos os participantes concluam as transações).
1 ONDAS = 100000000 unidades (wavelets), uma vez que os valores só podem ser inteiros
0,01 WAVES (Taxa de transação) = 1000000
Banco -> [3 ONDAS] -> Alice, via TransferTransaction (Tipo: 4).
Verificamos que o env.SEED do qual as transações são assinadas corresponde ao nosso Banco:


Se você não possui frases iniciais correspondentes, basta alternar para ela na guia Contas e verificar novamente.
Depois disso, criamos, anunciamos e assinamos uma transação sobre a transferência de 3 WAVES Alice.
Você também pode aprender os dados de Alice através da variável env.accounts. A numeração começa em 0, respectivamente Alice é env.accounts [1].

broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))
O resultado também pode ser observado no navegador, o link para ele retornará para nós imediatamente após a transação .
Garantimos que o saldo de Alice seja reabastecido por 3 ONDAS e que 10 - 3 - 0,01 = 0,699 permaneçam no saldo bancário.


Enviamos Boob e Cooper em 3 WAVES, e Neli, Xena e Mark em 0,2 WAVES da mesma maneira.
(Observações: cometemos um erro de caractere único e enviamos Neli 0,02 WAVES. Cuidado!)
broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))
Depois de repor os saldos de todos os participantes, vemos:

Etapa 2. Criando uma conta dApp
Concordamos que o criador e o proprietário do aplicativo descentralizado será Alice.
Em Contas, instale-o como SEED e verifique env.SEED corresponde a Alice.
Vamos tentar instalar na conta Alice o script (contrato) mais simples possível.
Contatos inteligentes no Waves são predicados que proíbem ou permitem que qualquer tipo de transação de saída seja executada sob certas condições. Nesse caso, essa condição é SEMPRE. O código do contrato é verdadeiro. Chamamos deploy ().

Taxa pela transação setScript 1400000/100000000 = 0,014 WAVES. Alice tem 2.986 ONDAS na sua balança.
Vamos tentar agora instalar na conta Alice uma lógica de contrato inteligente mais complexa descrita no exemplo
O Ride4Dapps agora inclui 2 novos tipos de anotações:
- @Callable (i) - assume como parâmetro i, dados sobre qual conta causou / assinou a transação. O resultado desta função determina a alteração no status da conta do dApp. Outras contas podem criar transações e executar funções com esta anotação e alterar o status da conta do dApp.
- @Verifier (tx) - Verificador de transação com o parâmetro transação tx. Corresponde à lógica do predicado do RIDE. É nessa expressão que você pode ativar ou desativar outras alterações na lógica dos contratos inteligentes em uma conta do dApp.
Cuidado! O ponto importante é que, por padrão, o script na conta não é igual a true , mas usa uma comparação de assinaturas e permite que apenas o proprietário da assinatura faça transações.
sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPk)
Sem essa verificação, qualquer pessoa pode fazer transações a partir de uma conta!
Vamos criar uma conta do dApp como uma carteira comum para todos os participantes.

Para verificar qual contrato está ativo atualmente em sua conta, você pode copiar o código base64 do contrato inteligente no navegador de blocos e reconhecê-lo através do descompilador ( por exemplo )



Garantimos que a lógica do contrato inteligente corresponda ao que esperamos.
Alice tem 2.972 ONDAS na sua balança.
Esse dApp controla quanto cada um dos participantes contribui para o fundo comum por meio do mecanismo de transação de dados - DataEntry (currentKey, newAmount) , em que 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 a 1 WAVES cada.

Cometemos um erro e a transação não passa. Como nós, apesar do fato de estarmos convencidos de que estamos realizando uma transação em nome de Bob, cometemos um erro no índice e indicamos uma conta bancária que não possui um contrato inteligente. Vale a pena notar um ponto importante - para tentativas malsucedidas de iniciar transações, a comissão não é retirada! Alice tem 2.972 ONDAS na sua balança. Bob 3 tem 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 WAVES restantes. Ou seja, Bob pagou 0,01 de comissão WAVES

Alice tinha 2,972 WAVES em seu balanço, passou a 3,972. Uma transação também foi registrada na conta de Alice, no entanto, nenhuma comissão foi deduzida da conta dApp (Alice).
Depois que Cooper também reabasteceu a conta de Alice, 4.972 WAVES ficaram no balanço.

Você pode descobrir quantas WAVES na carteira geral pertencem ao explorador de blocos na guia Dados.
Cooper mudou de idéia sobre deixar a quantidade de 1 WAVES em uma carteira comum e decidiu retirar metade das afinidades. Para fazer isso, ele deve chamar a função de retirada.

No entanto, estávamos novamente enganados, uma vez que a função de retirada possui parâmetros completamente diferentes, uma assinatura diferente. Ao criar contratos inteligentes no RIDE4DAPPS, você deve prestar atenção neste momento.

Cooper tem 2,48 WAVES em seu balanço. Consequentemente, 3 ONDAS - 1 - 0,01 e depois + 0,5 - 0,01. Assim, cada chamada para depositar e retirar custa 0,01 WAVES. Como resultado, as entradas na tabela de propriedade do dApps foram alteradas da seguinte maneira.

Bob também decidiu retirar uma certa quantia da carteira total, mas se enganou e tentou extrair 1,5 WAVES.

No entanto, o contrato inteligente tinha um cheque para tal situação.
Xena é uma fraude, ela tentou retirar 1 WAVES da conta geral.

Ela também falhou.
Na próxima parte, consideraremos questões mais complexas associadas à imperfeição da conta dApp Alice.