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!

Recentemente, a Waves Labs anunciado 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 Ventuário 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 Sessões de perguntas e respostas e IDEIA DE CAVALGADA - exemplo com bolsa comum.

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 torneira 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: revisor

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:
Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (carteira multiusuário)

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].
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 visualizado no navegador; um link para ele será retornado para nós imediatamente após a execução. transações.

Garantimos que o saldo de Alice seja reabastecido por 3 ONDAS, e o saldo bancário seja 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, 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:
Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (carteira multiusuário)

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().

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

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 exemplo

Ride4Dapps Agora inclui 2 novos tipos de anotação:

  1. @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.
  2. @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.
Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (carteira multiusuário)

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 (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 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.
Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (carteira multiusuário)

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 }]}))

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

Bob tem 1.99 WAVES restantes. Isso significa que Bob pagou 0.01 WAVES em taxas.

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

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.

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

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.

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

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.

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

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.

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

Bob também decidiu sacar uma quantia 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)

No entanto, o contrato inteligente continha uma verificação para essa situação.

Xena é uma golpista que tentou sacar 1 WAVES da conta geral.

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

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

Compre hospedagem confiável para sites com proteção DDoS, servidores VPS VDS 🔥 Compre hospedagem de sites confiável com proteção contra DDoS, servidores VPS/VDS | ProHoster