O que nos custa construir um blockchain?

Toda a história da humanidade é uma contínua libertação das correntes e a criação de novas, ainda mais fortes. (Autor anônimo)

Analisando vários projetos de blockchain (Bitshares, Hyperledger, Exonum, Ethereum, Bitcoin, entre outros), percebo que, do ponto de vista técnico, todos eles são construídos sobre os mesmos princípios. Os blockchains se assemelham a casas, que apesar da diversidade de estruturas, decorações e finalidades, possuem fundação, paredes, telhado, janelas e portas, que estão interconectadas de maneiras específicas. E se você entender os princípios básicos do design de edifícios e conhecer as propriedades dos materiais usados, pode identificar a finalidade de uma casa específica. Atualmente, existe uma situação com o blockchain em que todos já ouviram falar, mas poucos entendem a arquitetura e os princípios de funcionamento. Por isso, há uma falta de compreensão sobre como e para que vale a pena usar as tecnologias de blockchain.

Neste artigo, analisaremos as propriedades e princípios comuns a todos os blockchains. Depois, veremos as tarefas que podem ser resolvidas com a ajuda da blockchain e, para reforçar o material, construiremos um pequeno, mas verdadeiro blockchain em nosso próprio terreno virtual!

Então, vamos relembrar quais problemas o blockchain inicialmente resolveu.

Tenho certeza de que muitos dirão sobre a base de dados distribuída, descentralizada, pública e imutável. Mas para que tudo isso era necessário?

Prefiro começar o estudo de qualquer tecnologia lendo os padrões, pois é a partir deles que todos os artigos e livros sobre o tema em questão são baseados. Mas os padrões de blockchain, atualmente, estão ausentes; na ISO, foram criados apenas comitês para seu desenvolvimento. No momento, em cada projeto de blockchain público existe seu próprio documento White paper, que é essencialmente um termo de referência técnico. O primeiro projeto de blockchain amplamente conhecido é a rede Bitcoin. Vamos ao site oficial da rede e verificamos como tudo começou.

A Tarefa do Blockchain

Assim, a tarefa que o blockchain resolveu na rede pioneira Bitcoin é a realização de uma transferência confiável de propriedade sobre ativos digitais (assets) em um ambiente não confiável sem intermediários. Por exemplo, na rede Bitcoin, o ativo digital é a moeda digital bitcoin. E todas as soluções técnicas do Bitcoin e de outros blockchains se resumem a resolver essa tarefa.

Problemas que a blockchain resolve

Suponhamos que uma determinada organização financeira afirme ter construído uma rede mundial que permite transferir dinheiro para qualquer pessoa. Você acreditaria nisso? Se essa organização fosse a Visa ou a MasterCard, provavelmente acreditaria, mas se fosse, por exemplo, a AnonymousWorldMoney, talvez não. Por quê? Porque sabemos muito bem como os sistemas distribuídos são feitos por empresas privadas, com quais objetivos, e a que isso pode levar. Vamos analisar em mais detalhes os problemas desses sistemas e como eles podem ser resolvidos utilizando tecnologias de blockchain.

Suponha que na hipotética AnonymousWorldMoney existam servidores com bancos de dados, e seria bom se houvesse vários em diferentes datacenters. Quando o remetente transfere dinheiro, uma transação é registrada, que é replicada em todos os servidores, e o dinheiro chega ao destinatário.

O que nos custa construir um blockchain?

Em um mundo ideal, esse esquema funciona perfeitamente, mas no nosso surgem os seguintes problemas:

  1. O problema da identificação dos participantes de um lado e a necessidade de anonimato das transações do outro. Ou seja, é preciso transferir dinheiro para um destinatário específico de forma que ninguém saiba sobre essa transação, exceto os participantes do negócio. Os bancos têm números de contas e cartões de crédito vinculados a uma pessoa física ou jurídica específica, e o sigilo bancário protege as informações sobre as transações. Mas quem garante que a hipotética AnonymousWorldMoney não utiliza dados pessoais e informações sobre transações para seus próprios fins?
  2. Como garantir que o destinatário recebeu exatamente a quantia que foi transferida? Por exemplo, o remetente transferiu $100, mas o destinatário recebeu $10. O remetente vai ao escritório da AnonymousWorldMoney com seu recibo, e o atendente mostra sua versão, onde está registrado que o remetente transferiu apenas $10.
  3. O problema do ambiente de falta de confiança, como fraudes, chamado de double-spending. Um participante desonesto pode gastar seu saldo várias vezes enquanto o pagamento não é replicado em todos os servidores. O teorema CAP, é claro, continua válido, e a consistência será finalmente alcançada, mas alguém não receberá o dinheiro por serviços ou produtos prestados. Portanto, se não houver total confiança na organização de pagamento ou nos participantes das transações, é necessário construir uma rede baseada não na confiança, mas na criptografia.
  4. A AnonymousWorldMoney tem um número finito de servidores que podem se tornar indisponíveis por descuido ou má intenção.
  5. A AnonymousWorldMoney cobrará uma taxa significativa.
  6. Capacidade de gerenciamento. Durante a operação do Bitcoin, ficou claro que as pessoas desejam não apenas transferir moedas umas para as outras, mas também verificar várias condições de transação, programar cenários de operação, executar automaticamente ações com base em condições, etc.

Como o blockchain resolve esses problemas

  1. A identificação dos participantes é feita por meio de um par de chaves: privada e pública, e o algoritmo de assinatura digital identifica de forma inequívoca o remetente e o destinatário, mantendo suas identidades anônimas.
  2. As transações são agrupadas em blocos, um hash do bloco é calculado e registrado no próximo bloco. Essa sequência de gravação de hashes nos blocos deu origem ao nome da tecnologia blockchain e também torna impossível a alteração/deleção discreta dos blocos ou de transações individuais. Portanto, se uma transação entra no blockchain, pode-se ter certeza de que seus dados permanecerão inalterados.
  3. A fraude de double-spending é evitada por meio do consenso na rede sobre quais dados considerar válidos e quais rejeitar. Na rede Bitcoin, o consenso é alcançado por meio da prova de trabalho PoW (Proof-of-Work).
  4. A confiabilidade do funcionamento da rede é garantida pelo fato de que o blockchain é público, onde cada participante pode executar seu nó, obter uma cópia completa do blockchain e, além disso, pode verificar transações quanto à validade. Cabe observar que blockchains modernos permitem a construção de blockchains tanto públicos (abertos) quanto privados (fechados), além de usar esquemas combinados.
  5. Não é possível eliminar completamente a taxa no blockchain, pois é necessário pagar às pessoas que mantêm a rede, mas a necessidade de taxas no blockchain é comprovada de maneira tão convincente que não restam dúvidas sobre sua necessidade.
  6. Blockchains modernos têm a capacidade de implementar lógica de negócios, que no blockchain é chamada de contratos inteligentes. A lógica dos contratos inteligentes é executada em várias linguagens de alto nível.

A seguir, vamos examinar essas soluções em mais detalhes.

Arquitetura do blockchain

Componentes do blockchain

Cada participante pode iniciar seu próprio nó com uma cópia completa do blockchain (full node). Nós completos que podem registrar transações no blockchain são chamados de nós de consenso (witness) ou mineradores (miner). Nós completos que apenas verificam a correção das transações são chamados de nós de auditoria (audit). Os clientes leves (light clients) não armazenam cópias completas do blockchain, mas interagem com a rede usando nós completos.
A maioria dos usuários realiza transações usando clientes leves ou carteiras web. Todos os nós estão interconectados. Com esse conjunto de elementos, a arquitetura da rede se torna mais robusta:

O que nos custa construir um blockchain?

Ciclo de vida da transação

Vamos analisar o ciclo de vida da transação e dividi-lo em partes:

O que nos custa construir um blockchain?

Tecnologias de blockchain

Vamos nos deter mais nos soluções técnicas e suas interconexões.

Identificação

Cada transação de blockchain deve ser assinada digitalmente. Portanto, para realizar uma transação, cada participante deve ter um par de chaves: privada / pública. Às vezes, o par de chaves é chamado de carteira (wallet), pois as chaves estão diretamente ligadas a um endereço digital único e ao saldo do participante. Na realidade, as chaves e endereços são apenas sequências de números em diferentes sistemas de numeração. Exemplos de chaves e endereços de carteira:

Chave privada: 0a78194a8a893b8baac7c09b6a4a4b4b161b2f80a126cbb79bde231a4567420f
Chave pública: 0579b478952214d7cddac32ac9dc522c821a4489bc10aac3a81b9d1cd7a92e57ba
Endereço: 0x3814JnJpGnt5tB2GD1qfKP709W3KbRdfb27V

Para criar a assinatura digital nos blockchains, utiliza-se um algoritmo baseado em curvas elípticas: Elliptic Curve Digital Signature Algorithm (ECDSA). Para seu funcionamento, a chave privada (um número de 256 bits) é geralmente escolhida aleatoriamente. O número de possibilidades de chaves é de 2 elevado a 256, portanto, é possível afirmar que é praticamente impossível que ocorram colisões de valores de chaves privadas.

Em seguida, a chave pública é gerada a partir da chave privada multiplicando seu valor pelas coordenadas de um ponto que está na curva elíptica, resultando nas coordenadas de um novo ponto dessa mesma curva. Essa ação garante a obtenção de um par de chaves adequado para assinaturas digitais de transações. Por fim, o endereço da carteira é unicamente calculado a partir da chave pública.

Existem muitos artigos com detalhes sobre a criptografia utilizada no blockchain, por exemplo: Bitcoin em resumo — Criptografia

A chave privada deve ser estritamente secreta e armazenada em segurança. A chave pública é conhecida por todos. Se a chave privada for perdida, o acesso ao ativo (moedas) não pode ser recuperado e o dinheiro será perdido para sempre. Portanto, a questão do armazenamento seguro das chaves privadas é extremamente relevante, pois não se trata de um banco, onde você sempre pode aparecer com um documento de identidade e recuperar a conta. Existe toda uma indústria dedicada à produção dos chamados wallets frios, semelhantes a pen drives:

O que nos custa construir um blockchain?

ou você pode usar métodos mais confiáveis, como, por exemplo, gravar o valor da chave privada em fichas:

O que nos custa construir um blockchain?

Transações

Mais detalhes sobre a estrutura da transação podem ser vistos no artigo Bitcoin em poucas palavras — Transação. O importante para nós é entender que cada transação possui pelo menos os seguintes dados:

De: 0x48C89c341C5960Ca2Bf3732D6D8a0F4f89Cc4368 - endereço digital do remetente
Para: 0x367adb7894334678b90aefe7882a5b06f7fbc783a - endereço digital do destinatário
Valor: 0.0001 - valor da transação
Hash da Transação: 0x617ede331e8a99f46a363b32b239542bb4006e4fa9a2727a6636ffe3eb095cef - hash da transação

Em seguida, a transação é assinada pela chave privada e enviada (veja detalhes sobre o funcionamento do protocolo Bitcoin em poucas palavras - Protocolo) para todos os nodes na blockchain, que verificam as transações quanto à validade. O algoritmo de verificação das transações não é trivial e inclui duas dezenas de passos.

Blocos de transações

Após verificar a validade das transações, os nodes as agrupam em blocos. Além das transações, o bloco registra o hash do bloco anterior, um número (contador Nonce), e o hash do bloco atual é calculado usando o algoritmo SHA-256. O hash deve atender a determinados critérios de dificuldade. Por exemplo, na rede Bitcoin, a dificuldade do hash muda automaticamente a cada 2 semanas, dependendo do poder da rede, de forma que o bloco é gerado aproximadamente a cada 10 minutos. A dificuldade é determinada pela seguinte condição: o hash encontrado deve ser menor que um número pré-estabelecido. Se essa condição não for atendida, 1 é adicionado ao Nonce e o processo de cálculo do hash é repetido. O campo Nonce é utilizado para encontrar o hash, pois são os únicos dados no bloco que podem ser alterados, enquanto os outros devem permanecer inalterados. O hash correto deve ter um número específico de zeros no início, por exemplo, um dos hashes reais:

000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91

A localização bem-sucedida do hash é a prova do trabalho realizado (Proof-of-Work, PoW) para redes Bitcoin ou Ethereum. O processo de localização de hashes é chamado de mineração (mining), semelhante à extração de ouro. O nome descreve bem a essência do processo, pois envolve uma simples tentativa e erro, e se alguém encontrar um hash adequado, isso é realmente uma sorte. É como encontrar um verdadeiro pepita de ouro em toneladas de rocha estéril. A recompensa por bloco agora é de 12,5 BTC e, multiplicando pelo preço atual do bitcoin de $3900, resulta em mais de um quilograma de ouro puro. Há motivos para lutar!

Após a localização bem-sucedida do hash, o bloco e o hash encontrado são registrados na blockchain como o próximo bloco. Para mais detalhes sobre a estrutura dos blocos, consulte o artigo Bitcoin em resumo - Blockchain, e abaixo apresento um esquema simplificado:

O que nos custa construir um blockchain?

A blockchain começa com um bloco que ainda não possui o hash do bloco anterior. Esse bloco na blockchain é único e tem o nome de Genesis block. Os outros blocos têm a mesma estrutura e diferem apenas pelo número de transações. As transações reais e os blocos sendo criados atualmente no Bitcoin ou Ethereum podem ser visualizados em Block Explorer.

O tamanho dos blocos no Bitcoin é limitado a 1MB e, com um volume mínimo de informação em uma transação de cerca de 200 bytes, um bloco pode conter até cerca de 6000 transações. Isso, aliás, explica a performance do Bitcoin, da qual todos zombam: um bloco é gerado aproximadamente a cada 10 minutos * 60 segundos = 600 segundos, o que dá uma performance formal de cerca de 10 TPS. Embora na verdade, isso não seja performance, mas um algoritmo de trabalho implementado conscientemente. No Ethereum, para competir, simplesmente reduziram o tempo de geração de bloco para 15 segundos, e a performance formal disparou. Portanto, em blockchains que utilizam PoW como consenso, é totalmente sem sentido comparar a performance, pois ela depende diretamente da dificuldade de cálculo do cache, que pode ser ajustada a qualquer valor.

Forks

E o que acontece se, por exemplo, vários nós encontrarem hashes que atendem às condições de dificuldade, mas que são diferentes em valor (em outras palavras, chegam a consensos diferentes) e gravam blocos na blockchain? Vamos ver como a blockchain se protege contra essa situação. Nesse caso, ocorre o que é chamado de fork (‘garfo’), e a blockchain tem duas versões da cadeia:

O que nos custa construir um blockchain?

O que acontece a seguir? A seguir, parte da rede começa a trabalhar no bloco N+2 de uma cadeia, enquanto parte trabalha na outra:

O que nos custa construir um blockchain?

Algum desses blocos será encontrado primeiro e enviado para a blockchain, e então, de acordo com as regras, a blockchain deve mudar para a cadeia mais longa e cancelar todas as transações do bloco alternativo:

O que nos custa construir um blockchain?

Pode acontecer uma situação em que a transação de um participante estava apenas em um dos blocos do fork, que foi cancelado. Portanto, para ter certeza de que a transação desejada foi gravada na blockchain, há uma recomendação geral — antes de confiar na transação, deve-se esperar que os próximos blocos sejam adicionados à blockchain. As recomendações sobre quantos blocos esperar variam para diferentes blockchains. Por exemplo, para a rede Bitcoin, o mínimo é 2 blocos, o máximo 6.

A mesma situação com o fork de blocos será observada também em um chamado ataque de 51% — onde um grupo de mineradores tenta criar uma cadeia alternativa de blocos, buscando cancelar a cadeia com suas transações fraudulentas. Embora atualmente, em vez de fraudes, seja mais vantajoso usar suas capacidades para mineração honesta.

Consenso

Para gravar um bloco na blockchain, a rede deve chegar a um consenso. Vamos recordar a tarefa de alcançar consenso em redes de computadores. O problema é formulado como o problema dos generais bizantinos BFT (Byzantine fault tolerance). Deixando de lado a descrição pitoresca dos problemas do exército bizantino, a tarefa pode ser formulada da seguinte maneira: como os nós da rede podem chegar a um resultado comum, se parte dos nós da rede pode distorcê-los intencionalmente. Os algoritmos existentes para resolver o problema BFT mostram que a rede pode funcionar corretamente se os fraudulentos forem menos de 1/3. Por que o consenso BFT não foi aplicado na rede Bitcoin? Por que foi necessário usar PoW? Há várias razões:

  • O BFT funciona bem com um pequeno conjunto fixo de nós, mas no blockchain público, o número de nós é imprevisível e, além disso, os nós podem ser ativados ou desativados aleatoriamente.
  • É necessário motivar as pessoas a operarem nós de blockchain. Para isso, as pessoas devem receber recompensas. No BFT, formalmente não há o que receber como recompensa, enquanto no PoW, todos entendem intuitivamente a razão da recompensa: pela eletricidade consumida pelo processador durante a busca do hash do bloco.

Além do PoW, existem vários outros consensos que são usados em blockchains modernos, por exemplo:

  • PoS (Proof-of-Stake) — no blockchain Hyperledger
  • DPoS (Delegated Proof-of-Stake) — no blockchain BitShares
  • Modificações do BFT: SBFT (Simplified BFT) e PBFT (Practical BFT), por exemplo, no blockchain Exonum

Vamos parar um pouco para falar sobre o consenso PoS, pois é este e suas variantes que se tornaram mais populares em blockchains privados. Por que em privados? De um lado, as características do PoS são melhores em comparação ao PoW, pois para alcançar o consenso são necessários menos recursos computacionais, o que aumenta a velocidade de gravação de dados no blockchain. Mas, por outro lado, no PoS há mais possibilidades de fraude, portanto, para neutralizar isso, todos os participantes do blockchain devem ser conhecidos.

O consenso PoS é baseado na escolha de um nó que pode gravar um bloco com transações no blockchain, dependendo da quantidade de fundos em conta, ou melhor, não em conta, mas em garantia. Ou seja, quanto mais fundos você tiver em garantia, maior a probabilidade de a rede escolher seu nó para gravar o bloco. A garantia não será devolvida se o bloco for inválido. Assim, é implementada uma proteção contra fraudes. Existem as seguintes variações de PoS:

  • O consenso Delegated PoS (DPoS) divide os participantes em 'votantes' e 'validadores'. Os detentores de moedas (participantes votantes) delegam seu direito de verificar e gravar transações no blockchain a outros participantes. Assim, os validadores realizam todo o trabalho computacional e são recompensados por isso, enquanto a presença de participantes votantes garante a honestidade dos validadores, uma vez que podem ser substituídos a qualquer momento.
  • O consenso LPoS (Leased Proof-of-Stake) permite que você alugue seus fundos para outros nós, aumentando suas chances de validar blocos. Assim, é possível receber comissões por transações sem participar diretamente da validação das transações e da mineração de blocos.

Existem outros tipos de consenso que ainda não ganharam ampla adoção; aqui estou apenas listando para informação, e uma visão geral dos próprios algoritmos de consenso pode ser encontrada, por exemplo, no artigo: Algoritmos de Consenso no Blockchain.

  • PoET (Proof-of-Elapsed Time)
  • PoC (Proof-of-Capacity)
  • PoB (Proof-of-Burn)
  • PoWeight (Proof-of-Weight)
  • PoA (Proof-of-Activity) — PoW + PoS
  • PoI (Proof-of-Importância)

Confiabilidade e modelos de implementação de blockchains

Blockchain público

Resiliência Público ou outro nome Blockchain sem permissão é alcançada permitindo que qualquer um se conecte e veja informações ou até conecte seu próprio nó, com a confiança construída no consenso PoW.

Blockchain privado

Privado ou Blockchain privado com permissão. Nesses blockchains, apenas um grupo específico de participantes (organizações ou indivíduos) tem acesso à informação. Esses blockchains são construídos por organizações com o objetivo de aumentar o benefício ou a eficiência geral. Sua confiabilidade é garantida pelos objetivos comuns dos participantes e pelos algoritmos de consenso PoS e BFT.

Consórcio de Blockchain

Existem Consórcio ou Blockchain público com permissão. São blockchains aos quais qualquer um pode se conectar para visualizar, mas adicionar informações ou conectar seu próprio nó só pode ser feito com a permissão de outros participantes. Esses blockchains são construídos por organizações com o objetivo de aumentar a confiança de clientes ou consumidores do produto ou da sociedade como um todo. Aqui, a confiabilidade também é alcançada pela presença de confiança entre os participantes e pelos mesmos algoritmos de consenso PoS e BFT.

Contratos Inteligentes

Nos blockchains implementados após o Bitcoin, foi adicionada a capacidade de executar contratos inteligentes em algum grau. Essencialmente, um contrato inteligente é uma transação que contém código programático para execução. Contratos inteligentes na rede Ethereum são executados na EVM (Ethereum Virtual Machine). Para iniciar a execução de um contrato inteligente, ele precisa ser explicitamente iniciado por outra transação, ou deve ocorrer uma condição prévia para sua execução. Os resultados da execução do contrato inteligente também serão registrados no blockchain. Obter dados de fora do blockchain é possível, mas extremamente limitado.

Que lógica de negócios pode ser implementada com um contrato inteligente? Na verdade, não é tanta assim, por exemplo, verificação de condições com base em dados da blockchain, a mudança de proprietários de ativos digitais dependendo dessas condições, e a gravação de dados em um armazenamento permanente dentro da blockchain. A lógica é implementada em uma linguagem de alto nível chamada Solidity.

Um exemplo clássico de funcionalidade que é implementada usando contratos inteligentes é a emissão de tokens para a realização de ICOs. Por exemplo, eu implementei um contrato inteligente para a emissão de modestos 500.000.000 AlexToken. Por link no Etherscan possui

o código fonte do contrato inteligente na linguagem Solidity

pragma solidity ^0.4.23;

library SafeMath {
    /**
     * @dev Multiplies two numbers, throws on overflow.
     **/
    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
        if (a == 0) {
            return 0;
        }
        c = a * b;
        assert(c / a == b);
        return c;
    }
    
    /**
     * @dev Integer division of two numbers, truncating the quotient.
     **/
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
        // uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return a / b;
    }
    
    /**
     * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
     **/
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(b <= a);
        return a - b;
    }
    
    /**
     * @dev Adds two numbers, throws on overflow.
     **/
    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
        c = a + b;
        assert(c >= a);
        return c;
    }
}

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 **/
 
contract Ownable {
    address public owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender account.
     **/
   constructor() public {
      owner = msg.sender;
    }
    
    /**
     * @dev Throws if called by any account other than the owner.
     **/
    modifier onlyOwner() {
      require(msg.sender == owner);
      _;
    }
    
    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     **/
    function transferOwnership(address newOwner) public onlyOwner {
      require(newOwner != address(0));
      emit OwnershipTransferred(owner, newOwner);
      owner = newOwner;
    }
}

/**
 * @title ERC20Basic interface
 * @dev Basic ERC20 interface
 **/
contract ERC20Basic {
    function totalSupply() public view returns (uint256);
    function balanceOf(address who) public view returns (uint256);
    function transfer(address to, uint256 value) public returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
}

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 **/
contract ERC20 is ERC20Basic {
    function allowance(address owner, address spender) public view returns (uint256);
    function transferFrom(address from, address to, uint256 value) public returns (bool);
    function approve(address spender, uint256 value) public returns (bool);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @title Basic token
 * @dev Basic version of StandardToken, with no allowances.
 **/
contract BasicToken is ERC20Basic {
    using SafeMath for uint256;
    mapping(address => uint256) balances;
    uint256 totalSupply_;
    
    /**
     * @dev total number of tokens in existence
     **/
    function totalSupply() public view returns (uint256) {
        return totalSupply_;
    }
    
    /**
     * @dev transfer token for a specified address
     * @param _to The address to transfer to.
     * @param _value The amount to be transferred.
     **/
    function transfer(address _to, uint256 _value) public returns (bool) {
        require(_to != address(0));
        require(_value <= balances[msg.sender]);
        
        balances[msg.sender] = balances[msg.sender].sub(_value);
        balances[_to] = balances[_to].add(_value);
        emit Transfer(msg.sender, _to, _value);
        return true;
    }
    
    /**
     * @dev Gets the balance of the specified address.
     * @param _owner The address to query the the balance of.
     * @return An uint256 representing the amount owned by the passed address.
     **/
    function balanceOf(address _owner) public view returns (uint256) {
        return balances[_owner];
    }
}

contract StandardToken is ERC20, BasicToken {
    mapping (address => mapping (address => uint256)) internal allowed;
    /**
     * @dev Transfer tokens from one address to another
     * @param _from address The address which you want to send tokens from
     * @param _to address The address which you want to transfer to
     * @param _value uint256 the amount of tokens to be transferred
     **/
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
        require(_to != address(0));
        require(_value <= balances[_from]);
        require(_value <= allowed[_from][msg.sender]);
    
        balances[_from] = balances[_from].sub(_value);
        balances[_to] = balances[_to].add(_value);
        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
        
        emit Transfer(_from, _to, _value);
        return true;
    }
    
    /**
     * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
     *
     * Beware that changing an allowance with this method brings the risk that someone may use both the old
     * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
     * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     * @param _spender The address which will spend the funds.
     * @param _value The amount of tokens to be spent.
     **/
    function approve(address _spender, uint256 _value) public returns (bool) {
        allowed[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }
    
    /**
     * @dev Function to check the amount of tokens that an owner allowed to a spender.
     * @param _owner address The address which owns the funds.
     * @param _spender address The address which will spend the funds.
     * @return A uint256 specifying the amount of tokens still available for the spender.
     **/
    function allowance(address _owner, address _spender) public view returns (uint256) {
        return allowed[_owner][_spender];
    }
    
    /**
     * @dev Increase the amount of tokens that an owner allowed to a spender.
     *
     * approve should be called when allowed[_spender] == 0. To increment
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     * @param _spender The address which will spend the funds.
     * @param _addedValue The amount of tokens to increase the allowance by.
     **/
    function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
        allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
        emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }
    
    /**
     * @dev Decrease the amount of tokens that an owner allowed to a spender.
     *
     * approve should be called when allowed[_spender] == 0. To decrement
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     * @param _spender The address which will spend the funds.
     * @param _subtractedValue The amount of tokens to decrease the allowance by.
     **/
    function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
        uint oldValue = allowed[msg.sender][_spender];
        if (_subtractedValue > oldValue) {
            allowed[msg.sender][_spender] = 0;
        } else {
            allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
        }
        emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }
}

/**
 * @title Configurable
 * @dev Configurable varriables of the contract
 **/
contract Configurable {
    uint256 public constant cap = 1000000000*10**18;
    uint256 public constant basePrice = 100*10**18; // tokens per 1 ether
    uint256 public tokensSold = 0;
    
    uint256 public constant tokenReserve = 500000000*10**18;
    uint256 public remainingTokens = 0;
}

/**
 * @title CrowdsaleToken 
 * @dev Contract to preform crowd sale with token
 **/
contract CrowdsaleToken is StandardToken, Configurable, Ownable {
    /**
     * @dev enum of current crowd sale state
     **/
     enum Stages {
        none,
        icoStart, 
        icoEnd
    }
    
    Stages currentStage;
    /**
     * @dev constructor of CrowdsaleToken
     **/
    constructor() public {
        currentStage = Stages.none;
        balances[owner] = balances[owner].add(tokenReserve);
        totalSupply_ = totalSupply_.add(tokenReserve);
        remainingTokens = cap;
        emit Transfer(address(this), owner, tokenReserve);
    }
    
    /**
     * @dev fallback function to send ether to for Crowd sale
     **/
    function () public payable {
        require(currentStage == Stages.icoStart);
        require(msg.value > 0);
        require(remainingTokens > 0);
        
        uint256 weiAmount = msg.value; // Calculate tokens to sell
        uint256 tokens = weiAmount.mul(basePrice).div(1 ether);
        uint256 returnWei = 0;
        
        if(tokensSold.add(tokens) > cap){
            uint256 newTokens = cap.sub(tokensSold);
            uint256 newWei = newTokens.div(basePrice).mul(1 ether);
            returnWei = weiAmount.sub(newWei);
            weiAmount = newWei;
            tokens = newTokens;
        }
        
        tokensSold = tokensSold.add(tokens); // Increment raised amount
        remainingTokens = cap.sub(tokensSold);
        if(returnWei > 0){
            msg.sender.transfer(returnWei);
            emit Transfer(address(this), msg.sender, returnWei);
        }
        
        balances[msg.sender] = balances[msg.sender].add(tokens);
        emit Transfer(address(this), msg.sender, tokens);
        totalSupply_ = totalSupply_.add(tokens);
        owner.transfer(weiAmount);// Send money to owner
    }
    

    /**
     * @dev startIco starts the public ICO
     **/
    function startIco() public onlyOwner {
        require(currentStage != Stages.icoEnd);
        currentStage = Stages.icoStart;
    }
    

    /**
     * @dev endIco closes down the ICO 
     **/
    function endIco() internal {
        currentStage = Stages.icoEnd;
        // Transfer any remaining tokens
        if(remainingTokens > 0)
            balances[owner] = balances[owner].add(remainingTokens);
        // transfer any remaining ETH balance in the contract to the owner
        owner.transfer(address(this).balance); 
    }

    /**
     * @dev finalizeIco closes down the ICO and sets needed varriables
     **/
    function finalizeIco() public onlyOwner {
        require(currentStage != Stages.icoEnd);
        endIco();
    }
    
}
 
/**
 * @title LavevelToken 
 * @dev Contract to create the Lavevel Token
 **/
contract AlexToken is CrowdsaleToken {
    string public constant name = "AlexToken";
    string public constant symbol = "ALT";
    uint32 public constant decimals = 18;
}

e a representação binária, como a rede a vê

60806040526000600355600060045533600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560146101000a81548160ff021916908360028111156200006f57fe5b0217905550620001036b019d971e4fe8401e74000000600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200024a6401000000000262000b1d179091906401000000009004565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620001986b019d971e4fe8401e740000006001546200024a6401000000000262000b1d179091906401000000009004565b6001819055506b033b2e3c9fd0803ce8000000600481905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6b019d971e4fe8401e740000006040518082815260200191505060405180910390a362000267565b600081830190508281101515156200025e57fe5b80905092915050565b611cb880620002776000396000f300608060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146104c7578063095ea7b31461055757806318160ddd146105bc57806323b872dd146105e7578063313ce5671461066c578063355274ea146106a3578063518ab2a8146106ce57806366188463146106f957806370a082311461075e57806389311e6f146107b55780638da5cb5b146107cc578063903a3ef61461082357806395d89b411461083a578063a9059cbb146108ca578063bf5839031461092f578063c7876ea41461095a578063cbcb317114610985578063d73dd623146109b0578063dd62ed3e14610a15578063f2fde38b14610a8c575b60008060008060006001600281111561012757fe5b600560149054906101000a900460ff16600281111561014257fe5b14151561014e57600080fd5b60003411151561015d57600080fd5b600060045411151561016e57600080fd5b3494506101a7670de0b6b3a764000061019968056bc75e2d6310000088610acf90919063ffffffff16565b610b0790919063ffffffff16565b9350600092506b033b2e3c9fd0803ce80000006101cf85600354610b1d90919063ffffffff16565b111561024c576101f66003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b915061022e670de0b6b3a764000061022068056bc75e2d6310000085610b0790919063ffffffff16565b610acf90919063ffffffff16565b90506102438186610b3990919063ffffffff16565b92508094508193505b61026184600354610b1d90919063ffffffff16565b6003819055506102886003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b6004819055506000831115610344573373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156102dd573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b610395846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a361045184600154610b1d90919063ffffffff16565b600181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156104bf573d6000803e3d6000fd5b505050505050005b3480156104d357600080fd5b506104dc610b52565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b506105d1610c7d565b6040518082815260200191505060405180910390f35b3480156105f357600080fd5b50610652600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c87565b604051808215151515815260200191505060405180910390f35b34801561067857600080fd5b50610681611041565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3480156106af57600080fd5b506106b8611046565b6040518082815260200191505060405180910390f35b3480156106da57600080fd5b506106e3611056565b6040518082815260200191505060405180910390f35b34801561070557600080fd5b50610744600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061105c565b604051808215151515815260200191505060405180910390f35b34801561076a57600080fd5b5061079f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ed565b6040518082815260200191505060405180910390f35b3480156107c157600080fd5b506107ca611335565b005b3480156107d857600080fd5b506107e16113eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082f57600080fd5b50610838611411565b005b34801561084657600080fd5b5061084f6114ab565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088f578082015181840152602081019050610874565b50505050905090810190601f1680156108bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d657600080fd5b50610915600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b604051808215151515815260200191505060405180910390f35b34801561093b57600080fd5b50610944611703565b6040518082815260200191505060405180910390f35b34801561096657600080fd5b5061096f611709565b6040518082815260200191505060405180910390f35b34801561099157600080fd5b5061099a611716565b6040518082815260200191505060405180910390f35b3480156109bc57600080fd5b506109fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611726565b604051808215151515815260200191505060405180910390f35b348015610a2157600080fd5b50610a76600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611922565b6040518082815260200191505060405180910390f35b348015610a9857600080fd5b50610acd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a9565b005b600080831415610ae25760009050610b01565b8183029050818382811515610af357fe5b04141515610afd57fe5b8090505b92915050565b60008183811515610b1457fe5b04905092915050565b60008183019050828110151515610b3057fe5b80905092915050565b6000828211151515610b4757fe5b818303905092915050565b6040805190810160405280600981526020017f416c6578546f6b656e000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610cc457600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d1157600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d9c57600080fd5b610ded826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e80826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5182600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60035481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561116d576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611201565b6111808382610b3990919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561139157600080fd5b60028081111561139d57fe5b600560149054906101000a900460ff1660028111156113b857fe5b141515156113c557600080fd5b6001600560146101000a81548160ff021916908360028111156113e457fe5b0217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561146d57600080fd5b60028081111561147957fe5b600560149054906101000a900460ff16600281111561149457fe5b141515156114a157600080fd5b6114a9611b01565b565b6040805190810160405280600381526020017f414c54000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561152157600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561156e57600080fd5b6115bf826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611652826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60045481565b68056bc75e2d6310000081565b6b019d971e4fe8401e7400000081565b60006117b782600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a0557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611a4157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600560146101000a81548160ff02191690836002811115611b2057fe5b021790555060006004541115611c0a57611ba5600454600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611c89573d6000803e3d6000fd5b505600a165627a7a723058205bbef016cc7699572f944871cb6f05e69915ada3a92a1d9f03a3fb434aac0c2b0029

Mais detalhes sobre contratos inteligentes podem ser encontrados no artigo: O que são contratos inteligentes no Ethereum.

Conclusão

Listamos as tecnologias nas quais os blockchains modernos são construídos e como elas estão interconectadas. Agora vamos formular quais problemas podem ser resolvidos com o blockchain e quais soluções, no melhor dos casos, serão ineficazes. Assim, o uso do blockchain não é necessário se:

  • As transações ocorrem em um ambiente de confiança;
  • A presença de taxas de intermediários não prejudica a vida dos participantes;
  • Os participantes não possuem ativos que podem ser representados como ativos digitais;
  • Não há descentralização nos ativos digitais, ou seja, o valor é detido ou fornecido apenas por um participante.

Qual futuro aguarda o blockchain? Neste momento, só podemos especular sobre os possíveis caminhos para o desenvolvimento das tecnologias blockchain:

  • O blockchain se tornará uma tecnologia de banco de dados tão comum quanto SQL ou NoSQL para resolver seu círculo específico de problemas;
  • O blockchain se tornará um protocolo amplamente adotado, assim como o HTTP para a internet;
  • O blockchain se tornará a base para um novo sistema financeiro e político do planeta!

Na próxima parte, veremos quais blockchains existem atualmente e como eles são aplicados em diferentes indústrias.

Isso é apenas o começo!

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