WEB3DEV

Cover image for Crie um Contrato Inteligente de Crowdfunding usando o Solidity
Panegali
Panegali

Posted on

Crie um Contrato Inteligente de Crowdfunding usando o Solidity

Contratos inteligentes são aplicativos resilientes e altamente seguros implantados na blockchain.

Vamos construir um contrato de campanha inteligente usado para projetos de crowdsource (é um modelo de terceirização aberto e compartilhado, cujo propósito é reunir diferentes pessoas em torno da realização de uma tarefa ou da solução de um problema) e acompanhar o hábito de gastos do crowdsourcer (o beneficiário do crowdsource).

PRÉ-REQUISITO

  • Remix
  • Pouco ou nenhum conhecimento de Solidity

ESTUDO DE CASO

Antes de começarmos, vamos fazer um estudo de caso do Kickstarter. O Kickstarter é um site de crowdsourcing onde qualquer pessoa pode deixar sua ideia para que as pessoas façam crowdsourcing para facilitar a conclusão do seu projeto.

Embora seja uma bela ideia, encontraríamos problemas na Web3 se construíssemos esse tipo de contrato usando a tecnologia blockchain.

QUESTÕES

  • Quem sanciona a liberação dos fundos dentro do pool?
  • E se o proprietário enganar todo mundo e fugir com todos os fundos após o crowdsourcing?
  • Como verificamos o projeto para verificar se o crowdsourcer está progredindo?

Embora isso possa parecer uma grande tarefa, criaremos um contrato inteligente que leva tudo isso em consideração e garante que os fundos do colaborador sejam utilizados com base no contrato.

Como?

Primeiro, dê uma olhada neste diagrama do que pretendemos construir.

O administrador chama um contrato para solicitar fundos e todos os contribuintes se reúnem para fazer um crowdsourcing. Após o crowdsourcing, o gerente faz uma solicitação de gastos que deve ser aprovada por mais de 50% dos colaboradores. Mas e se o gerente fizer uma solicitação para sua carteira.

Como podemos remediar tal instância?

A conta do fornecedor é preenchida na estrutura ao fazer uma solicitação de gastos e, uma vez aprovada, é enviada para esse fornecedor e não para o gerente.

A responsabilidade e a segurança dos fundos dos contribuintes são garantidas.

Usaremos o Remix IDE para escrever nosso contrato inteligente, então clique aqui para começar.

//SPDX-License-Identifier: MIT
   pragma solidity ^0.4.17;
Enter fullscreen mode Exit fullscreen mode

A primeira linha nos diz a licença com a qual estamos trabalhando, licença gratuita MIT. Se não tivermos isso, nosso código gerará um erro.

Pragma solidity nos diz a versão em que estamos trabalhando; observe que esta versão deve corresponder ao nosso compilador ou obteremos um sinal de erro.

Neste artigo, usaremos a versão 0.4.17.

contract CrowdSource{
    address public manager;
    uint public MinimumContribution;
    address[] public approvals;
Enter fullscreen mode Exit fullscreen mode

Podemos criar o contrato chamando a função contracte entregando **CrowdSource**. Use a chave para abri-lo.

Chamamos a variável manager, pois é o crowdsourcere o chamador do contrato.

Uint é uma variável sem sinal semelhante a uint256; tornamos essa função pública porque queremos que qualquer pessoa a chame ao contribuir com o arquivo MinimumContribution.

Criamos outra função chamada address approvals, mas com [ ], todos que fizeram o MinimumContribution estarão salvos na lista de aprovações. Nós devemos remover isto logo, pois é caro e consome muito gás para operar.

function campaign(uint minimum)public{
       manager = msg.sender;
       MinimumContribution = minimum;
     }
Enter fullscreen mode Exit fullscreen mode

A função constructor

A Constructor ou function de campanha é a primeira função a ser executada, pois queremos garantir que apenas o gerente possa chamar o contrato.

Observe que tornamos public a visualização do chamador do contrato.

msg.sender é uma variável universal que atribuímos ao gerente manager = msg.sender; sempre que o contrato é chamado, então quem chama o contrato é o gerente.

Chamamos (uint minimum)public{ que é um número inteiro sem sinal para a quantia de dinheiro necessária para se tornar um contribuinte; podemos ter um mínimo diferente ou criar um valor estático.

Então podemos chamar a função MinimumContribution = minimum; então quem quer que contribua para o contrato é adicionado uint public MinimumContributionaqui.

O processo de aprovação

A função approvals é chamada quando um colaborador paga payableum valor mínimo ao contrato.

function contribute() public payable{
       require(msg.value > MinimumContribution);
       approvals.push(msg.sender);
     }
Enter fullscreen mode Exit fullscreen mode

A função require qualquer pessoa que não tenha acrescentado valor à minimumContributione empurra um colaborador para a lista de aprovações.

A seguir, apresentamos a função payable e a variável approval e veremos por que elas desempenham um papel significativo no contrato inteligente.

Solicitando fundos

Os contribuintes podem enviar fundos para o nosso contrato, mas não podem retirar dinheiro da função request, levando-nos a criar um arquivo struct. Struct é uma coleção de pares valor-chave que possuem tipos diferentes.

contract CrowdSource{
     struct request{
       string description;
       uint value;
       address recipiant;
       bool complete;
   }

Enter fullscreen mode Exit fullscreen mode
  • Descrição: string: a finalidade da solicitação.
  • Valor: Uint: a quantidade de dinheiro necessária.
  • Destinatário: address: o endereço do fornecedor.

Criamos uma struct como uma solicitação que os colaboradores aprovam antes de enviá-la ao fornecedor, que também é um tipo de struct.

Struct não é uma instância, mas uma definição de um tipo que podemos usar várias vezes no projeto.

Testando o contrato

Testaremos o contrato diretamente no IDE.

Executar um teste no Remix é simples. Podemos ver as transações DEPLOY AND RUN no lado esquerdo.

  • Ambiente

Existem cerca de quatro ambientes diferentes, mas na maioria das vezes usaremos apenas dois javascript VM (London) e Injected Web3.

  • Conta
  • O Remix oferece 15 contas gratuitas que podemos usar para implantar contratos e testar nossa implantação.

  • Gas Limit (Limite de gás): O limite de gás replica as taxas reais de gás ao implantar um contrato. Cada implantação ou alteração no contrato nos custará uma taxa de gás e revisaremos a taxa de gás posteriormente.
  • Value (Valor): O valor é o fundo que colocamos no contrato ao implantá-lo. Wei é a menor unidade, enquanto ether é a unidade mais alta da moeda usada na Ethereum.
  • Contract (Contrato): O nome do contrato, que neste caso é new.sol. .sol é um formato de arquivo para contratos do Solidity.
  • Deploy (Implantar): Implanta o contrato na rede blockchain para que possamos interagir com a rede.

Compile o contrato e clique em Deploy, um contrato será criado abaixo.

Clique no botão suspenso à esquerda e veja a implantação completa.

Em nosso contrato, temos a campanha que lê uint256, que é um inteiro sem sinal; essa é a parte que colocamos nossa contribuição no contrato, então quem coloca algum dinheiro é adicionado ao contrato.

Vamos testar.

Colocaremos 100wei no espaço de entrada da campanha, mas lembre-se de alterar a conta acima, para não tornarmos o gerente de contrato um contribuinte.

Use outra conta e digite 100wei.

Clique na campanha (campaign) e observe um painel à direita que fica verde, significa que os recursos foram enviados para o contrato.

O número 1 é o contrato implantado pelo gerente; observe que o endereço começa com 0X746.. enquanto o número 2 é o novo contribuinte do contrato.

O número 3 nos diz que um contribuinte aderiu ao contrato.

Conclusão

Criamos um contrato inteligente de financiamento coletivo que permite aos usuários financiar juntos e podemos implantar esse contrato na rede blockchain.

Recursos (em inglês)


Artigo escrito por Scofield Idehen e traduzido por Marcelo Panegali.

Top comments (0)