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;
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;
Podemos criar o contrato chamando a função contract
e entregando **CrowdSource**
. Use a chave para abri-lo.
Chamamos a variável manager, pois é o crowdsourcer
e 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;
}
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.sende
r é 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 MinimumContribution
aqui.
O processo de aprovação
A função approvals é chamada quando um colaborador paga payable
um valor mínimo ao contrato.
function contribute() public payable{
require(msg.value > MinimumContribution);
approvals.push(msg.sender);
}
A função require
qualquer pessoa que não tenha acrescentado valor à minimumContribution
e 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;
}
-
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)