Escolar Documentos
Profissional Documentos
Cultura Documentos
D ESENVOLVIMENTO DE P LATAFORMA
DE C ROWDFUNDING
D ESCENTRALIZADA U TILIZANDO A
T ECNOLOGIA B LOCKCHAIN
B ELO H ORIZONTE
J UNHO DE 2018
R AMON C ALDEIRA FARIA
D ESENVOLVIMENTO DE P LATAFORMA DE
C ROWDFUNDING D ESCENTRALIZADA
U TILIZANDO A T ECNOLOGIA B LOCKCHAIN
ii
Resumo
Campanhas de crowdfunding coordenadas por plataformas que operam de forma
centralizada oferecem pouca transparência sobre o histórico de suas movimentações
financeiras, o que leva potenciais contribuidores a desistirem de apoiar projetos em
que acreditam, por não confiarem nos níveis de segurança oferecidos por essas plata-
formas. Este trabalho propõe o desenvolvimento de uma plataforma de crowdfunding
descentralizada, focada no modelo de doações, que utiliza a tecnologia blockchain
para oferecer a seus usuários maior transparência a respeito da destinação dos fundos
nela arrecadados. Para isso, foi desenvolvida uma plataforma que implementa duas
modalidades de campanhas de crowdfunding: repasse de criptomoedas a entidades
pré-cadastradas e repasse de criptomoedas a criadores de campanha por meio de um
planejamento dividido em fases, no qual a mudança de uma fase para outra ocorre a
partir do consentimento explícito dos apoiadores, utilizando um sistema de votação. Os
resultados obtidos evidenciam o funcionamento dos contratos inteligentes no contexto
de uma aplicação web que se comunica com uma rede blockchain pública da plataforma
Ethereum.
iii
Abstract
Crowdfunding campaigns coordinated by central entities offer little transparency over
their financial transactions history, which leads potential contributors to give up sup-
porting projects they believe in because they do not trust the security levels offered by
those platforms. This work proposes the development of a decentralized crowdfunding
platform, focused on the donations model, which uses blockchain technology to offer
greater transparency to its users regarding the allocation of the funds raised through
them. Taking that into account, it was developed a platform that implements two types
of crowdfunding campaigns: transfer of crypto-coins to pre-registered entities and
transfer of crypto-coins to campaign owners through a planning divided by phases,
in which the change from one phase to another occurs through explicit consent of
the supporters, by the means of a voting system. The obtained results evidences the
operation of smart contracts in the context of a web application that communicates with
a public blockchain network of the Ethereum platform.
iv
Lista de Figuras
v
Lista de Abreviaturas e Siglas
vi
Sumário
1 – Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Justificativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Estrutura do trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2 – Referencial Teórico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.1 Crowdfunding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.1.1 Modelos sem recompensa . . . . . . . . . . . . . . . . . . . . . . . 5
2.1.1.1 Modelo de doação . . . . . . . . . . . . . . . . . . . . . . 5
2.1.1.2 Modelo de empréstimo sem juros . . . . . . . . . . . . . 5
2.1.2 Modelos não-financeiros . . . . . . . . . . . . . . . . . . . . . . . . 6
2.1.2.1 Modelo de recompensa . . . . . . . . . . . . . . . . . . . 6
2.1.2.2 Modelo de patrocínio . . . . . . . . . . . . . . . . . . . . 6
2.1.2.3 Modelo de compra antecipada . . . . . . . . . . . . . . . 6
2.1.3 Modelos financeiros . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.1.3.1 Modelo de empréstimo com juros . . . . . . . . . . . . . 6
2.1.3.2 Modelo de participação . . . . . . . . . . . . . . . . . . . 7
2.2 Bitcoin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2.1 Blockchain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2.1.1 Funções de hash . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2.1.2 Criptografia assimétrica . . . . . . . . . . . . . . . . . . . 9
2.2.2 Prova de trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.2.3 Scripts de transação . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.3 Ethereum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.3.1 Contratos inteligentes . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.3.1.1 Linguagem Solidity . . . . . . . . . . . . . . . . . . . . . . 12
2.3.1.2 Gas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3.2 Contas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3.2.1 Redes Ethereum . . . . . . . . . . . . . . . . . . . . . . . . 14
2.3.2.2 Carteiras . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.4 Trabalhos relacionados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3 – Metodologia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.1 Levantamento de requisitos do projeto . . . . . . . . . . . . . . . . . . . . 17
3.2 Desenho da interface gráfica da aplicação web . . . . . . . . . . . . . . . . 17
3.3 Projeto do banco de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
vii
3.4 Elaboração dos contratos inteligentes . . . . . . . . . . . . . . . . . . . . . 18
3.5 Verificação dos contratos inteligentes . . . . . . . . . . . . . . . . . . . . . 18
3.6 Integração dos contratos inteligentes à aplicação web . . . . . . . . . . . . 19
5 – Conclusão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Referências . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Apêndices 31
viii
Capítulo 1
Introdução
1.1 Objetivos
O presente trabalho se propõe a utilizar tecnologias baseadas em matemática e cripto-
grafia para reduzir a probabilidade de ocorrência de incidentes relacionados à quebra
1
de confiança entre as partes envolvidas em iniciativas de financiamento coletivo, seja
em movimentações de valores monetários ou seja na execução de regras de negócio
implementadas em software.
Objetivos específicos:
1.2 Justificativa
O desenvolvimento de uma plataforma de crowdfunding descentralizada, baseada na
tecnologia blockchain, agrega transparência ao gerenciamento do dinheiro arrecadado
pelas campanhas. Com a adoção de regras para a destinação dos fundos arrecadados,
regidas por contratos inteligentes, espera-se que os usuários da plataforma tenham
maior sensação de segurança ao contribuir com as causas nela veiculadas, pois não será
necessário confiar em uma entidade central intermediadora e as possíveis destinações
fraudulentas do dinheiro arrecadado por parte dos donos das campanhas terão seus
efeitos limitados pelas regras pré-estabelecidas nos contratos inteligentes.
2
Em seguida, o capítulo de Referencial Teórico apresenta uma classificação de modelos
de crowdfunding, fornece uma visão geral dos conceitos que fundamentam as tecnologias
blockchain e Ethereum e discute trabalhos anteriores que se relacionam com este texto.
Por fim, o capítulo de Conclusão retoma os principais pontos abordados durante o texto
e menciona possíveis desdobramentos futuros.
3
Capítulo 2
Referencial Teórico
Neste capítulo serão apresentados os conceitos que irão servir como base para a com-
preensão do desenvolvimento deste trabalho.
2.1 Crowdfunding
A Internet facilita a cooperação entre as pessoas para atingir seus mais diversos objetivos,
dentre estes, objetivos financeiros que envolvem a arrecadação coletiva de fundos, como
doações, empréstimos e até mesmo comércio de ações.
Neste sentido, o termo Crowdfunding pode ser definido como a prática de financiar um
projeto ou empreendimento, arrecadando dinheiro de um grande número de pessoas
que contribuem, cada uma, com uma quantidade relativamente pequena, geralmente
pela Internet (OXFORD, 2018).
Segundo o trabalho desenvolvido por Gedda et al. (2016), existem atualmente sete
modelos de Crowdfunding operando em plataformas pela Internet: doação, recompensa,
patrocínio, compra antecipada, empréstimo com juros, empréstimo sem juros e partici-
pação.
Como ilustra a Figura 1, estes modelos são classificados pelos autores em três categorias:
sem recompensa, não-financeiros e financeiros.
4
Figura 1 – Modelos de Crowdfunding
Neste modelo as pessoas apenas doam o dinheiro, sem receber nada em troca. Um exem-
plo de plataforma que segue este modelo é a JustGiving, em que é possível encontrar
campanhas de arrecadação de fundos relacionadas a projetos de caridade, tais como
despesas médicas, alimentação de refugiados e despesas com veterinário.
5
2.1.2 Modelos não-financeiros
Nos modelos não-financeiros, o contribuinte tem a expectativa de receber uma recom-
pensa tangível, porém não-financeira, em troca do dinheiro arrecadado. Incluem-se
nessa categoria os modelos de recompensa, patrocínio e compra antecipada.
Este modelo é mais voltado para empresas. Nele, as pessoas trocam suas contribui-
ções financeiras por uma conexão publicamente visível ao projeto. Um exemplo de
plataforma que segue este modelo é a SPONSOR.ME, em que é possível encontrar
campanhas que oferecem divulgação da marca dos doadores em meios eletrônicos ou
físicos, como camisetas, com visibilidade proporcional à quantia doada.
6
2.1.3.2 Modelo de participação
Neste modelo, empresas criam a campanha oferecendo aos contribuintes uma parcela
de participação nos lucros da empresa. Um exemplo de plataforma que segue este
modelo é a CrowdCube.
2.2 Bitcoin
O Bitcoin é um sistema de pagamentos que nasceu com o objetivo de utilizar criptografia
para eliminar a necessidade de organizações intermediárias nas transações de comércio
eletrônico. O trabalho desenvolvido por Nakamoto (2008) resultou na criação de um
mecanismo em que indivíduos participantes de uma rede peer-to-peer podem trocar
criptomoedas diretamente entre si.
Nesta tecnologia, os usuários não possuem moedas propriamente ditas, mas sim um
histórico de transações efetuadas e recebidas registradas em um livro-razão. Neste
sentido, se um usuário possui bitcoins então ele possui transações endereçadas a ele
registradas neste livro.
A Figura 2 ilustra uma situação hipotética em que uma usuária do Bitcoin possui
transações endereçadas a ela no valor de 10 bitcoins e tenta transferir essa quantia para
dois usuários diferentes, referenciando as mesmas transações mais de uma vez.
7
2.2.1 Blockchain
O Blockchain é uma outra criação de Nakamoto (2008), que se baseia na tecnologia de
log seguro para implementar o livro-razão distribuído utilizado pelo Bitcoin.
Segundo Une (2001), um serviço de log seguro tem o papel de assegurar a existência de
determinado documento digital antes de um ponto específico no tempo.
Para verificar se uma transação já foi utilizada, faz-se necessário que todos os partici-
pantes da rede tenham conhecimento sobre as transações já registradas até o momento.
Desta forma, em contraste com o modelo centralizado adotado pelos bancos, as transa-
ções que ocorrem no Blockchain são visíveis publicamente, como ilustra a Figura 3.
Ainda segundo Nakamoto (2008), o Bitcoin é constituído por uma cadeia de assinaturas
8
digitais que envolvem o hash da transação anterior e a chave pública do beneficiário da
transação corrente.
A Figura 4 ilustra este processo, de forma que uma mensagem de texto com tamanho
arbitrário se transforma em um código de tamanho fixo denominado digest ao passar
por um funil que representa a função de hash.
A criptografia assimétrica utiliza uma chave pública para cifrar e uma chave privada
para decifrar uma mensagem. Quando se cifra utilizando a chave privada, está se apli-
cando uma assinatura digital, pois essa mensagem só poderá ser decifrada utilizando a
chave pública correspondente (CANAVAN, 2001).
9
As UTXOs geradas no sistema Bitcoin são matematicamente vinculadas às chaves cripto-
gráficas de quem as possui. Dessa forma, assinaturas digitais podem ser utilizadas para
provar a posse de uma chave privada sem que seja necessário revelá-la, possibilitando
assim o desbloqueio das UTXOs para que sejam utilizadas pelos seus respectivos donos
em novas transações (BARRERA, 2014).
Quando ocorre uma transação no Bitcoin, as UTXOs utilizadas na entrada precisam ser
desbloqueadas e as UTXOs geradas na saída precisam ser bloqueadas. Dessa forma,
quando um usuário transfere bitcoins a alguém, este deve primeiro provar que possui
as UTXOs da entrada, por meio do fornecimento de uma assinatura digital, e então
fornecer a chave pública do destinatário da transação, para que um script seja gerado
para bloquear a nova UTXO, de forma que apenas o possuidor da respectiva chave
privada possa desbloqueá-la.
10
Nakamoto (2008) afirma que o trabalho médio necessário para resolver o desafio é
exponencialmente proporcional ao número de bits zero requeridos pela rede, mas o
resultado pode ser verificado pela simples aplicação do algoritmo de hash, que precisa
ser feita apenas uma única vez.
UTXOs também podem ser desbloqueadas por meio da execução de um script, de forma
que para utilizá-las é preciso fornecer dados que satisfaçam o algoritmo implementado.
11
Entretanto, a linguagem de script implementada no Bitcoin possui limitações. Por meio
dela não é possível, por exemplo, autorizar o gasto de apenas uma fração da quantia
armazenada em uma UTXO (BUTERIN et al., 2014).
2.3 Ethereum
Ethereum é uma tecnologia de livro-razão distribuído, ou DLT (do inglês Distributed
Ledger Technology), que permite a escrita de contratos inteligentes e aplicações descentra-
lizadas por meio de uma máquina virtual distribuída (WIKIPEDIA, 2018; BUTERIN et
al., 2014).
12
Figura 7 – Contrato de custódia
2.3.1.2 Gas
De certa forma, gas é uma medida de complexidade de uma transação. À medida que
o número de operações realizadas por um contrato inteligente aumenta, o custo da
transação também cresce.
2.3.2 Contas
Uma conta no Ethereum pode ser de dois tipos: conta de propriedade externa, do inglês
Externally Owned Account (EOA), ou conta de contrato.
• nonce, um contador usado para garantir que cada transação possa ser processada
apenas uma vez;
• saldo atual da conta;
• código do contrato da conta, se presente;
• armazenamento da conta (vazio por padrão).
13
Contratos no Ethereum são considerados “cidadãos de primeira classe“ (BUTERIN et
al., 2014). Toda vez que uma conta de contrato recebe uma mensagem seu código é
ativado, o que permite a leitura e a escrita no armazenamento interno, o envio de novas
mensagens e a criação de novos contratos.
Uma rede Ethereum pode ser pública ou privada. Dentre as redes públicas, existem
algumas redes de teste e existe a Main Network, que é a principal rede dessa tecnologia e
trafega o maior volume diário de transações.
2.3.2.2 Carteiras
Existem serviços na internet que fornecem acesso remoto a clientes Ethereum que rodam
em infraestruturas de nuvem. Ao usufruir desses serviços, o usuário não precisa se
preocupar com o armazenamento e nem com a sincronização do blockchain. Um exemplo
de tal serviço é o Infura, oferecido pela empresa ConsenSys.
14
2.4 Trabalhos relacionados
A plataforma GiveTrack utiliza o Bitcoin como meio de pagamento do seu serviço de
crowdfunding voltado para arrecadar doações. Ela não impede o mau uso das doações,
mas provê um log seguro e transparente das movimentações feitas com o dinheiro
arrecadado.
Fonte: GiveTrack
15
A Figura 10 ilustra o protocolo implementado pelos contratos inteligentes da plataforma
Alice. Destaca-se o papel do validador, que confere o que será feito com o dinheiro antes
de permitir a efetuação dos pagamentos.
16
Capítulo 3
Metodologia
Optou-se por utilizar a biblioteca de código React para estruturar a interface gráfica, pois
ela provê uma estrutura de código que auxilia na criação de aplicativos web e também
17
auxilia na integração com a biblioteca de componentes gráficos adotada, que será a
Material-UI.
Para que a IDE consiga se comunicar com a rede Ethereum, deve-se utilizar o navegador
Google Chrome e instalar uma extensão chamada Metamask. Essa extensão oferece a
funcionalidade de carteira Ethereum e permite a conexão a redes Ethereum através de
nós remotos que executam sobre uma infraestrutura de nuvem fornecida pelo serviço
Infura.
O desenvolvimento do software será feito na rede de testes Rinkeby, pois, por utilizar
o algoritmo proof-of-authority ao invés do algoritmo proof-of-work, esta rede é menos
suscetível a sofrer ataques de pessoas mal intencionadas.
18
3.6 Integração dos contratos inteligentes à aplicação web
Por fim, com o contrato inteligente publicado na rede Ethereum, a aplicação web pre-
cisa interagir com os métodos implementados nos contratos inteligentes. Para isto, é
utilizada a biblioteca de software web3, que é capaz de comunicar com redes Ethereum
por meio de uma especificação de chamada de procedimento remoto, do inglês Remote
Procedure Call (RPC).
19
Capítulo 4
Fonte: Do autor
20
4.2 Contratos inteligentes
O contrato CampaignFactory se faz necessário para manter a integridade dos contra-
tos de campanha criados pelos usuários da plataforma. Se os usuários criassem os contra-
tos de campanha de forma independente, a plataforma não saberia se estes são legítimos
e, caso a plataforma criasse os contratos inteligentes em nome dos usuários, o custo das
transações recairia sobre os seus mantenedores. O padrão factory resolve esse impasse,
de forma que os usuários executam as operações createEntitiesCampaign ou
createPhasesCampaign , que, por sua vez, criam o contrato inteligente e repassam
os custos da transação para o cliente que iniciou a operação.
No Ethereum, operações que alteram o estado do blockchain não podem retornar valores.
Para contornar este problema, as operações de criação de campanha fazem uso do
evento LogCampaign para notificar o endereço do novo contrato.
A função expire não faz parte da lógica da aplicação. Ela existe apenas para fins
21
Figura 12 – Diagrama de classes dos contratos inteligentes
Fonte: Do autor
Para que o criador de uma campanha consiga usufruir dos fundos arrecadados para
cada uma de suas fases, ele deve realizar pedidos de mudança de fase por meio da
operação requestPhaseChange . Esta ação inicia um processo de votação em que
os doadores que apoiam o resgate dos fundos para a nova fase devem explicitar seus
consentimentos individuais por meio da operação approvePhaseChange .
Para que o pedido de alteração de fase seja aprovado, é necessário que a soma das
contribuições realizadas pelos usuários votantes para a campanha exceda 50% do
montante total arrecadado. Esta estratégia foi adotada para prevenir ataques Sybil,
22
em que um mesmo indivíduo mal intencionado pode criar múltiplas identidades e
atacar uma rede peer-to-peer (DOUCEUR, 2002). Desta forma, para que um dono de
campanha mal intencionado consiga manipular o resultado de uma votação, este deve
ter contribuído com grande parte dos recursos da campanha, o que diminui os impactos
de um possível ataque.
Uma vez que a votação tenha acontecido e o pedido tenha sido aprovado, a fase corrente
pode ser alterada por meio da operação changePhase .
Fonte: Do autor
23
Figura 14 – Tela de confirmação de transação
Fonte: Do autor
Fonte: Do autor
24
A Figura 16 apresenta a tela de doação ethers. O usuário entra com o valor em ether
que deseja contribuir para a campanha e clica no botão Doar, que aciona o contrato
inteligente por intermédio da extensão MetaMask.
Fonte: Do autor
A Figura 17 apresenta o ambiente de testes da IDE Remix. Por meio dessa interface
é possível executar a operação expire , que não se encontra disponível na interface
gráfica da solução proposta.
25
Figura 17 – Expiração de campanhas através da IDE Remix
Fonte: Do autor
Fonte: Do autor
26
de campanha organizada por fases e a destinação dos fundos não gastos pelo criador
da campanha que remanescem nos contratos inteligentes. Na implementação atual, não
existe prazo para o processo de votação se encerrar e, também, o sistema não permite
que os usuários resgatem dinheiro de campanhas bem-sucedidas.
27
Capítulo 5
Conclusão
Com a finalidade de mitigar os riscos de mau uso dos fundos arrecadados por cam-
panhas de crowdfunding, este trabalho propôs o desenvolvimento de uma plataforma
descentralizada, focada no modelo de crowdfunding por doações, que utiliza a tecnologia
blockchain para oferecer a seus usuários maior transparência a respeito da destinação
dos fundos nela arrecadados.
28
Referências
29
ORLICKI, J. I. Programming languages intro. 2018. Disponível em: <https://github.
com/ethereum/wiki/wiki/Programming-languages-intro>. Citado na página 12.
OXFORD. Oxford British And World English Dictionary. [s.n.], 2018. Disponível em:
<https://en.oxforddictionaries.com/definition/crowdfunding>. Citado na página 4.
UNE, M. The security evaluation of time stamping schemes: The present situation and
studies. In: IMES Discussion Papers Series 2001-E-18. [S.l.: s.n.], 2001. p. 100–8630.
Citado na página 8.
30
Apêndices
APÊNDICE A – Documento de
Requisitos
32
1 NECESSIDADES IDENTIFICADAS
A prioridade dos requisitos pode ser classificada como: [E] Essencial - é o requisito
imprescindível, sem o qual o sistema não faz sentido; [I] Importante - é o requisito sem o qual o
sistema entra em funcionamento (poderá ser implantado e usado), mas de forma restrita e não
satisfatória; [D] Desejável - é o requisito que não compromete o funcionamento básico do sistema
(pode funcionar de forma satisfatória sem o requisito, que pode ser deixado para versões
posteriores do sistema, caso não haja tempo hábil para implementá-lo).
Da mesma forma, a complexidade pode ser classificada como: [A] Alta - exige um esforço
significativo e/ou o conhecimento de profissional especialista no assunto (sênior); [M] Média -
exige um esforço grande e/ou o conhecimento de profissional com fluência no assunto (pleno);
[B] Baixa - exige um esforço moderado e/ou um conhecimento básico no assunto (profissional
júnior)>
PARTE (S)
ID NECESSIDADE A SER ATENDIDA PRIORIDADE
ENVOLVIDA (S)
1 Arrecadar fundos E Dono da campanha
2 Usufruir dos fundos arrecadados E Dono da campanha
3 Evitar desperdício de dinheiro I Doador, Dono da
campanha
4 Contribuir com campanhas de E Doador
crowdfunding
contract CampaignFactory {
event LogCampaign(
address _campaign
);
contract EntitiesCampaign {
address public manager;
uint public expiration;
uint public amountRaised;
uint public goal;
mapping(address => bool) public allowedEntities;
mapping(address => uint) private contributions;
36
modifier restricted() {
require(msg.sender == manager);
_;
}
goal = _goal;
manager = _manager;
expiration = block.timestamp + (_days * 1 days);
}
contributions[msg.sender] += msg.value;
amountRaised += msg.value;
}
entity.transfer(value);
}
37
require(amountRaised < goal);
require(contributions[msg.sender] > 0);
// Padrão Checks-Effects-Interactions
uint share = contributions[msg.sender];
contributions[msg.sender] = 0;
msg.sender.transfer(share);
}
contract PhasesCampaign {
address public manager;
uint public expiration;
uint public amountRaised;
uint public netGoal;
uint[] public goals;
uint public currentPhase;
PhaseChangeRequest[] public phaseChangeRequests;
uint private transferPhase;
uint private requestPhase;
mapping(address => uint) private contributions;
struct PhaseChangeRequest {
uint approvalStake;
mapping(address => bool) approvals;
}
modifier restricted() {
require(msg.sender == manager);
_;
38
}
goals = _goals;
manager = _manager;
expiration = block.timestamp + (_days * 1 days);
}
contributions[msg.sender] += msg.value;
amountRaised += msg.value;
}
transferPhase += 1;
msg.sender.transfer(goals[currentPhase]);
}
39
});
requestPhase += 1;
phaseChangeRequests.push(newRequest);
}
request.approvals[msg.sender] = true;
request.approvalStake += contributions[msg.sender];
}
currentPhase += 1;
}
// Padrão Checks-Effects-Interactions
uint share = contributions[msg.sender];
contributions[msg.sender] = 0;
msg.sender.transfer(share);
}
40
// [!] Função utilizada apenas para auxiliar
// na demonstração do funcionamento do contrato
function expire() public {
expiration = 0;
}
}
41