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 anunciou 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 Ventuary 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 sessões de Q&A e no RIDE IDE — exemplo de um carteira compartilhada.

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 faucet 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: explorador

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

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].
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 observado no explorador, o link para ele nos será retornado imediatamente após a execução da transaçã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.
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 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:
Aprendendo a escrever contratos inteligentes Waves em RIDE e RIDE4DAPPS. Parte 1 (Carteira multiusuário)

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

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

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 exemplo

Ride4Dapps agora inclui 2 novos tipos de anotações:

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

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

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

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

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

Bob tem 1.99 WAVES restantes. Ou seja, Bob pagou 0.01 WAVES de taxa.

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

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.

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

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.

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

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.

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

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.

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

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

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

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

Xena é uma fraudadora, tentou retirar 1 WAVES da conta compartilhada.

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

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

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