Ondas de contratos inteligentes. Primeira experiência

imagem

Em abril de 2018, a equipe Waves apresentou seus contratos inteligentes não completos.

Um pouco mais tarde, quando o hackathon Waves foi anunciado, decidi que era hora de mergulhar em novas tecnologias. Abaixo do corte, você encontrará informações detalhadas sobre o contrato inteligente que conquistou o terceiro lugar no hackathon.

O artigo será útil para os desenvolvedores implementarem seus próprios contratos inteligentes e se familiarizarem com a tecnologia.

Idéia


A idéia do projeto é distribuir automaticamente os salários dos desenvolvedores de software usando o Github, proporcionalmente ao trabalho realizado. A tarefa principal, a tarefa que o contrato inteligente resolve ao mesmo tempo, evita que tenhamos que confiar no programa de distribuição de dinheiro e até permite que o usuário sem habilidades de programação verifique a distribuição correta dos fundos antes de transferir dinheiro

Pilha de tecnologia


Html e JavaScript ( biblioteca Node.js Waves), código aberto no GitHub e demonstração do projeto no Firebase Hosting

O processo


  1. O usuário seleciona o repositório GitHub e determina a quantidade total de salários
  2. O usuário faz um pagamento de 0,01 Waves (aproximadamente 0,02 dólares) para salvar dados no blockchain e criar um contrato inteligente
  3. O usuário verifica a exatidão dos dados e transfere a quantidade de salários para o endereço do contrato inteligente
  4. Os salários são compartilhados entre os desenvolvedores

Desenvolvimento


O melhor ponto de entrada para um desenvolvedor iniciante é o console de demonstração , que contém um bom exemplo e um console para testar o código. Durante o desenvolvimento, é melhor usar uma blockchain de teste , onde você pode obter 10 ondas de teste gratuitas com um clique . Embora o Google ainda não encontre muitos exemplos devido à novidade da tecnologia, os contratos inteligentes estão bem documentados e contêm todas as informações necessárias.

A biblioteca do NodeJs (1.4.0) já funciona bem em navegadores (com exceção da criação do Alias), mas, infelizmente, ainda não é compatível com o Google Functions ou React Native (os desenvolvedores do Waves prometem corrigir isso em breve).

Contrato inteligente


Um contrato inteligente é criado para uma conta e verifica todas as ações dessa conta (com exceção das transferências de dinheiro recebidas):

let signature = base58'${currentWallet.keyPair.publicKey}'; match tx { case tx:TransferTransaction => { let employerAddress = addressFromPublicKey(tx.senderPk); let dateKey = toBase58String(addressFromRecipient(tx.recipient).bytes); let salary = extract(getLong(employerAddress, dateKey)); if((salary == tx.amount) && sigVerify(tx.bodyBytes, tx.proofs[0], signature)) then true else false } case _ => false } 

Análise inteligente de contrato linha por linha


 let signature = base58'${currentWallet.keyPair.publicKey}'; 

Aqui, salvamos a chave pública da carteira (seu JavaScript deve conter a variável currentWallet criada usando o comando Waves.Seed.create ()), para que apenas a conta do contrato inteligente da carteira (Smart Rewarding Project no nosso caso) possa transferir fundos.

 match tx { case tx:TransferTransaction => {some validations} case _ => false } 

Essa é a construção básica de qualquer contrato inteligente da Waves, informando que este contrato proíbe qualquer atividade que não seja a transferência de fundos (TransferTransaction). Portanto, após a criação de um contrato, é impossível alterar dados dos desenvolvedores (DataTransaction) ou alterar o próprio contrato inteligente (SetScript).

 let employerAddress = addressFromPublicKey(tx.senderPk); 

Ele usa o método base addressFromPublicKey da biblioteca interna para obter o endereço do criador da solicitação de sua chave pública.

 let dateKey = toBase58String(addressFromRecipient(tx.recipient).bytes); 

O método base addressFromRecipient obtém o endereço do destinatário dos fundos

 let salary = extract(getLong(employerAddress, dateKey)); 

O método getLong básico nos fornece dados armazenados na blockchain no endereço do criador da solicitação, que é o valor do salário do desenvolvedor. O contrato pode acessar os dados armazenados na blockchain Waves (e NÃO pode acessar os dados localizados em qualquer site ou servidor de terceiros).

 if((salary == tx.amount) && sigVerify(tx.bodyBytes, tx.proofs[0], signature)) then true else false 

É aqui que a verificação da quantidade e assinatura corretas. Verdadeiro significa que a transação será permitida e falso significa que a transação será negada. Assim, durante qualquer transferência de dinheiro desta conta, verifica-se que o dinheiro será enviado apenas para a carteira do desenvolvedor e no valor já armazenado na cadeia de blocos, no formato de um par de chaves de fácil leitura (endereço como chave e valor como valor), o que permite Confie no programa, verifique todos os dados por 5 a 10 segundos antes de transferir os salários.

Demonstração on-line do projeto na blockchain de teste, disponível aqui
Aqui você pode ver o código do projeto.

Espero que o artigo tenha sido informativo e útil para você escrever seu primeiro contrato inteligente.

Source: https://habr.com/ru/post/pt424111/


All Articles