¿Qué nos cuesta construir un blockchain?

Toda la historia de la humanidad es una liberación continua de cadenas y la creación de otras aún más fuertes. (Autor anónimo)

Al analizar numerosos proyectos de blockchain (Bitshares, Hyperledger, Exonum, Ethereum, Bitcoin, entre otros), me doy cuenta de que, desde el punto de vista técnico, todos están construidos sobre los mismos principios. Los blockchains son como casas, que, a pesar de la diversidad de construcciones, decoración y propósitos, tienen un fundamento, paredes, techo, ventanas y puertas, que están conectados entre sí de maneras definidas. Y si se comprenden los principios básicos del diseño arquitectónico y se conocen las propiedades de los materiales utilizados, se puede determinar el propósito específico de una casa concreta. Actualmente, existe la situación con blockchain que todos han oído hablar de él, pero pocos entienden su arquitectura y principios de funcionamiento. Por lo tanto, hay una falta de comprensión sobre por qué y cómo tiene sentido utilizar tecnologías blockchain.

En este artículo, analizaremos las propiedades y principios comunes a todos los blockchains. Luego, veremos las tareas que se pueden resolver utilizando blockchain y, para consolidar el material, construiremos un pequeño pero auténtico blockchain en nuestro sitio virtual.

Entonces, recordemos qué problemas resolvió originalmente el blockchain.

Estoy seguro de que muchos mencionarán la base de datos distribuida, descentralizada, pública e inmutable. Pero, ¿por qué era necesaria toda esta tecnología?

Prefiero comenzar el estudio de cualquier tecnología leyendo las normas, ya que sobre ellas se basan todos los artículos y libros sobre el tema investigado. Sin embargo, actualmente no existen normas de blockchain, en ISO solo se han creado comités para su desarrollo. En este momento, en cada proyecto público de blockchain existe su propio documento White paper, que en esencia es un pliego de condiciones técnicas. El primer proyecto de blockchain conocido es la red Bitcoin. Vamos al sitio web oficial de la red y vemos cómo comenzó todo.

La tarea del blockchain

Entonces, la tarea que resolvió el blockchain en la red pionera de Bitcoin es realizar una transferencia de propiedad de activos digitales en un entorno no confiable sin intermediarios. Por ejemplo, en la red Bitcoin, el activo digital son las monedas digitales bitcoin. Todas las soluciones técnicas de Bitcoin y otros blockchains se reducen a resolver esta tarea.

Los problemas que resuelve el blockchain

Supongamos que una organización financiera dice que ha construido una red en todo el mundo, a través de la cual se pueden transferir fondos a cualquier persona. ¿Le creerías? Si esta organización es Visa o MasterCard, probablemente creería, pero si fuera, digamos, AnonymousWorldMoney, tal vez no. ¿Por qué? Porque sabemos muy bien cómo las empresas privadas construyen sistemas distribuidos, con qué fines, y a qué puede llevar esto. Veamos más de cerca los problemas de tales sistemas y cómo pueden ser resueltos utilizando tecnologías blockchain.

Supongamos que en la hipotética AnonymousWorldMoney hay servidores con bases de datos, y sería bueno que hubiera varios en diferentes centros de datos. Cuando el remitente envía dinero, se registra la transacción, que se replica en todos los servidores, y el dinero llega al destinatario.

¿Qué nos cuesta construir un blockchain?

En un mundo ideal, este esquema funcionaría perfectamente; sin embargo, en el nuestro surgen los siguientes problemas:

  1. El problema de la identificación de los participantes por un lado y la necesidad de anonimato en las transacciones por el otro. Es decir, es necesario transferir dinero a un destinatario específico de tal manera que nadie más sepa de esta transacción, excepto los participantes en el acuerdo. Los bancos tienen números de cuentas y tarjetas bancarias vinculados a personas físicas o jurídicas específicas, y el secreto bancario protege la información sobre las transacciones. Pero, ¿quién garantiza que la hipotética AnonymousWorldMoney no utiliza datos personales e información sobre transacciones para sus propios fines?
  2. ¿Cómo asegurarse de que el destinatario recibió exactamente la cantidad que se le envió? Digamos que el remitente transfirió $100, pero el destinatario recibió $10. El remitente llega a la oficina de AnonymousWorldMoney con su recibo, y el empleado muestra su versión donde está registrado que el remitente solo transfirió $10.
  3. El problema de un entorno no confiable, por ejemplo, el fraude conocido como doble gasto. Un participante deshonesto puede gastar su saldo varias veces antes de que el pago se haya replicado en todos los servidores. La teorema CAP, por supuesto, sigue vigente, y la coherencia se logrará eventualmente, pero alguien no recibirá el dinero por los servicios o productos prestados. Por lo tanto, si no hay plena confianza en la organización de pagos o en los participantes de las transacciones, entonces se debe construir una red basada no en la confianza, sino en la criptografía.
  4. La moneda condicional AnonymousWorldMoney tiene un número limitado de servidores que pueden volverse inaccesibles ya sea por accidente o por malicia.
  5. AnonymousWorldMoney cobrará su comisión tangible.
  6. La posibilidad de gestión. Durante el funcionamiento de Bitcoin, se ha descubierto que la gente no solo quiere transferir monedas entre sí, sino también verificar diversas condiciones de las transacciones, programar escenarios de funcionamiento, realizar automáticamente acciones según las condiciones, etc.

Cómo la blockchain resuelve estos problemas

  1. La identificación de los participantes se realiza mediante un par de claves: una privada y una pública, y el algoritmo de firma digital identifica de manera inequívoca al remitente y al destinatario, manteniendo su anonimato.
  2. Las transacciones se agrupan en bloques, se calcula el hash del bloque, que se registra en el siguiente bloque. Esta secuencia de registro de hashes en los bloques es lo que dio nombre a la tecnología blockchain y también hace imposible la modificación o eliminación inadvertida de bloques o transacciones individuales. Por lo tanto, si una transacción entra en la blockchain, se puede estar seguro de que sus datos permanecerán inalterados.
  3. El fraude del double-spending se previene al alcanzar el consenso en la red sobre qué datos considerar válidos y cuáles rechazar. En la red Bitcoin, el consenso se logra mediante la prueba de trabajo PoW (Proof-of-Work).
  4. La fiabilidad del funcionamiento de la red se logra porque la blockchain es pública, donde cada participante puede ejecutar su nodo, obtener una copia completa de la blockchain y, además, verificar las transacciones por sí mismo. Cabe destacar que las blockchains modernas permiten construir no solo blockchains públicas (abiertas), sino también privadas (cerradas), así como utilizar esquemas combinados.
  5. No se puede eliminar completamente la comisión en la blockchain, ya que hay que pagar a las personas que mantienen la red, pero la necesidad de la comisión en la blockchain se demuestra de tal manera que no quedan dudas sobre su necesidad.
  6. Las blockchains modernas tienen la posibilidad de implementar la lógica empresarial, que en la blockchain se llama contratos inteligentes. La lógica de los contratos inteligentes se implementa en varios lenguajes de alto nivel.

A continuación, examinaremos estas soluciones en detalle.

La arquitectura de la blockchain

Componentes de la blockchain

Cada participante puede iniciar su propio nodo con una copia completa de la blockchain (nodo completo). Los nodos completos que pueden registrar transacciones en la blockchain se llaman nodos de consenso (testigos) o mineros (miner). Los nodos completos que solo verifican la validez de las transacciones se llaman nodos de auditoría (audit). Clientes ligeros (light clients) no almacenan copias completas de la blockchain, sino que interactúan con la red utilizando nodos completos.
La mayoría de los usuarios realizan transacciones utilizando precisamente clientes ligeros o billeteras web. Todos los nodos están conectados entre sí. Con este conjunto de elementos, la arquitectura de la red se vuelve más resistente:

¿Qué nos cuesta construir un blockchain?

Ciclo de vida de la transacción

Veamos el ciclo de vida de una transacción y analicémoslo por partes:

¿Qué nos cuesta construir un blockchain?

Tecnologías de blockchain

Profundicemos en las soluciones técnicas y sus interconexiones.

Identificación

Cada transacción en la blockchain debe estar firmada con una firma digital. Por lo tanto, para realizar una transacción, cada participante debe tener un par de claves: privada / pública. A veces, se llama billetera (wallet) al par de claves, ya que las claves están claramente vinculadas a una dirección digital única y al saldo del participante. En la realidad, las claves y las direcciones son simplemente cadenas de números en diferentes sistemas de numeración. Ejemplos de claves y dirección de billetera:

Clave privada: 0a78194a8a893b8baac7c09b6a4a4b4b161b2f80a126cbb79bde231a4567420f
Clave pública: 0579b478952214d7cddac32ac9dc522c821a4489bc10aac3a81b9d1cd7a92e57ba
Dirección: 0x3814JnJpGnt5tB2GD1qfKP709W3KbRdfb27V

Para crear una firma digital en blockchains se utiliza un algoritmo basado en curvas elípticas: Elgorithm de Firma Digital de Curva Elíptica (ECDSA). Para su funcionamiento, la clave privada (número de 256 bits) se toma normalmente de forma aleatoria. El número de combinaciones de claves es 2 elevado a 256, por lo que se puede hablar de la imposibilidad práctica de coincidencia de valores de claves privadas.

A continuación, la clave pública se obtiene de la privada multiplicando su valor por las coordenadas de un punto que se encuentra en la curva elíptica, lo que da como resultado las coordenadas de un nuevo punto de la misma curva. Esta acción garantiza la obtención de un par de claves adecuado para las firmas digitales de las transacciones. Y finalmente, la dirección de la billetera se calcula de manera única a partir de la clave pública.

Hay una gran cantidad de artículos con detalles sobre la criptografía utilizada en blockchain, por ejemplo: Bitcoin en pocas palabras: Criptografía

La clave privada debe mantenerse estrictamente secreta y almacenarse de forma segura. La clave pública es conocida por todos. Si se pierde la clave privada, no será posible recuperar el acceso al activo (monedas) y el dinero se perderá para siempre. Por lo tanto, la tarea de almacenar de forma segura las claves privadas es extremadamente relevante, ya que no es un banco al que siempre se puede acudir con un pasaporte para recuperar la cuenta. Existe toda una industria dedicada a la producción de lo que se conoce como billeteras frías, que son similares a las unidades flash:

¿Qué nos cuesta construir un blockchain?

o se pueden utilizar métodos más seguros, como por ejemplo, grabar el valor de la clave privada en fichas:

¿Qué nos cuesta construir un blockchain?

Transacciones

Puedes consultar más sobre la estructura de la transacción en el artículo Bitcoin en pocas palabras — Transacción. Lo que nos importa entender es que cada transacción tiene al menos los siguientes datos:

De: 0x48C89c341C5960Ca2Bf3732D6D8a0F4f89Cc4368 - dirección digital del remitente
A: 0x367adb7894334678b90аfe7882a5b06f7fbc783a - dirección digital del destinatario
Valor: 0.0001 - monto de la transacción
Hash de la transacción: 0x617ede331e8a99f46a363b32b239542bb4006e4fa9a2727a6636ffe3eb095cef - hash de la transacción

Luego, la transacción se firma con la clave privada y se envía (ver detalles sobre el protocolo Bitcoin en pocas palabras - Protocolo) a todos los nodos en la blockchain, que verifican las transacciones por su validez. El algoritmo para verificar la transacción no es trivial e incluye dos docenas de pasos.

Bloques de transacciones

Al verificar la validez de las transacciones, los nodos las agrupan en bloques. Además de las transacciones, en el bloque se registra el hash del bloque anterior, un número (contador Nonce), y se calcula el hash del bloque actual utilizando el algoritmo SHA-256. El hash debe cumplir con ciertos requisitos de dificultad. Por ejemplo, en la red Bitcoin la dificultad del hash cambia automáticamente cada dos semanas según la potencia de la red, de modo que se genere un bloque aproximadamente cada 10 minutos. La dificultad se determina con la siguiente condición: el hash encontrado debe ser menor que un número predefinido. Si esta condición no se cumple, se suma 1 al Nonce y se repite el trabajo de cálculo del hash. Para encontrar el hash, se utiliza el campo Nonce, ya que estos son los únicos datos en el bloque que se pueden cambiar; los demás deben permanecer inalterados. Un hash correcto debe tener un número determinado de ceros al principio, por ejemplo, uno de los hashes reales es:

000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91

La búsqueda exitosa de un hash es una prueba del trabajo realizado (Proof-of-Work, PoW) para redes como Bitcoin o Ethereum. El proceso de encontrar hashes se denomina minería (mining), de manera similar a la extracción de oro. El nombre define con precisión la esencia del proceso, ya que implica una simple prueba de diferentes opciones, y si alguien encuentra un hash adecuado, realmente es una cuestión de suerte. Es como encontrar un verdadero nugget de oro entre toneladas de mineral sin valor. La recompensa por bloque ahora es de 12.5 BTC y, multiplicada por el precio actual de Bitcoin de $3900, equivale a más de un kilogramo de oro puro. ¡Hay motivos para competir!

Tras la búsqueda exitosa del hash, el bloque y el hash encontrado se registran en el blockchain como el siguiente bloque. Para más detalles sobre la estructura de los bloques, se puede consultar el artículo Bitcoin en resumen - Blockchain, y a continuación presento un esquema simplificado:

¿Qué nos cuesta construir un blockchain?

El blockchain comienza con un bloque que aún no tiene el hash del bloque anterior. Este bloque es único en el blockchain y se llama Genesis block. Los demás bloques tienen una estructura similar y solo varían en el número de transacciones. Las transacciones reales y los bloques que se están creando actualmente en Bitcoin o Ethereum se pueden ver en Block Explorer.

El tamaño de los bloques en Bitcoin está limitado a 1 MB y, con un volumen mínimo de información en una transacción de alrededor de 200 bytes, un bloque puede contener aproximadamente 6000 transacciones. De ahí, por cierto, proviene la percepción de baja eficiencia de Bitcoin, que muchos critican: un bloque se genera aproximadamente cada 10 minutos * 60 segundos = 600 segundos, lo que resulta en una eficiencia formal de alrededor de 10 TPS. Aunque, en realidad, esto no es eficiencia, sino un algoritmo de funcionamiento intencionadamente diseñado. En Ethereum, para competir, simplemente redujeron el tiempo de generación de bloque a 15 segundos, lo que hizo que la eficiencia formal se disparara. Por lo tanto, en los blockchain que utilizan PoW como consenso, no tiene sentido comparar la eficiencia, ya que depende directamente de la dificultad de cálculo del hash, que puede establecerse en cualquier nivel.

Forks

¿Qué sucede si, por ejemplo, varios nodos encuentran hashes que cumplen con las condiciones de dificultad, pero diferentes en valor (en otras palabras, llegan a diferentes consensos) y registran bloques en la blockchain? Veamos cómo se protege la blockchain en esta situación. En este caso, ocurre lo que se llama un fork ('tenedor'), y la blockchain tiene dos versiones de la cadena:

¿Qué nos cuesta construir un blockchain?

¿Qué sucede después? Después, parte de la red comienza a trabajar en el bloque N+2 de una cadena, y parte de la otra:

¿Qué nos cuesta construir un blockchain?

Uno de estos bloques se encontrará antes y se enviará a la blockchain y entonces, según las reglas, la blockchain deberá cambiarse a la cadena más larga y cancelar todas las transacciones del bloque alternativo:

¿Qué nos cuesta construir un blockchain?

Sin embargo, puede darse la situación en la que la transacción de un participante solo estuviera en uno de los bloques del fork, que fue cancelado. Por lo tanto, para estar seguro de que la transacción deseada se registró en la blockchain, hay una recomendación general: antes de confiar en una transacción, se debe esperar a que se agreguen varios bloques más a la blockchain. Las recomendaciones sobre cuántos bloques esperar varían entre diferentes blockchains. Por ejemplo, para la red Bitcoin, el mínimo es de 2 bloques, el máximo 6.

Se observará la misma situación con el fork de bloques en el caso de un ataque del 51%: esto es cuando un grupo de mineros intenta crear una cadena de bloques alternativa, logrando la cancelación de la cadena con sus transacciones fraudulentas. Sin embargo, en la actualidad, en lugar de fraude, es más rentable dedicar su poder a la minería honesta.

Consenso

Para registrar un bloque en la blockchain, la red debe llegar a un consenso. Recordemos la tarea de alcanzar consenso en redes de computadoras. El problema se formula como el problema de los generales bizantinos BFT (Tolerancia a fallos bizantinos). Sin entrar en una descripción pintoresca de los problemas del ejército bizantino, la tarea se puede formular así: ¿cómo pueden las nodos de la red llegar a un resultado común, si parte de los nodos de la red pueden distorsionarlo intencionadamente? Los algoritmos existentes para resolver el problema BFT muestran que la red puede funcionar correctamente si los fraudes son menos del 1/3. ¿Por qué no se aplicó consenso BFT en la red Bitcoin? ¿Por qué se necesitaba usar PoW? Hay varias razones:

  • BFT funciona bien con un conjunto fijo y pequeño de nodos, mientras que en una blockchain pública el número de nodos es impredecible y, además, los nodos pueden encenderse y apagarse aleatoriamente.
  • Es necesario motivar a las personas a iniciar nodos de blockchain. Para ello, las personas deben recibir recompensas. En BFT, no hay una recompensa formal, mientras que en PoW, todos comprenden intuitivamente por qué hay recompensas: por la electricidad consumida por la CPU durante el proceso de encontrar el hash del bloque.

Además de PoW, existen otros consensos utilizados en blockchains modernas, por ejemplo:

  • PoS (Prueba de Participación) — en la blockchain Hyperledger
  • DPoS (Prueba de Participación Delegada) — en la blockchain BitShares
  • Modificaciones de BFT: SBFT (BFT Simplificado) y PBFT (BFT Práctico), por ejemplo, en la blockchain Exonum

Detengámonos un momento en el consenso PoS, ya que PoS y sus variantes han ganado mayor popularidad en blockchains privadas. ¿Por qué específicamente en privadas? Por un lado, las características de PoS son mejores en comparación con PoW, ya que se requieren menores recursos computacionales para alcanzar consenso, lo que significa que se aumenta la velocidad de escritura de datos en la blockchain. Pero, por otro lado, en PoS hay más oportunidades para el fraude, por lo que, para neutralizar esto, todos los participantes de la blockchain deben ser conocidos.

El consenso PoS se basa en la selección de un nodo que puede escribir un bloque con transacciones en la blockchain, dependiendo de la cantidad de fondos en la cuenta, o más precisamente, no en la cuenta, sino en garantía, es decir, cuanto más fondos tengas en garantía, mayor será la probabilidad de que la red elija tu nodo para escribir el bloque. La garantía no se devolverá si el bloque resulta ser inválido. De este modo, se implementa la protección contra el fraude. Existen las siguientes variaciones de PoS:

  • El consenso de PoS Delegado (DPoS) divide a los participantes en "votantes" y "validadores". Los poseedores de monedas (participantes votantes) delegan su derecho a verificar y registrar transacciones en la blockchain a otros participantes. Así, los validadores realizan todo el trabajo computacional y reciben una recompensa a cambio, mientras que la presencia de participantes votantes garantiza la honestidad de los validadores, ya que se les puede reemplazar en cualquier momento.
  • El consenso LPoS (Leased Proof-of-Stake) permite alquilar tus fondos a otros nodos, dándoles más oportunidades para validar bloques. Así, puedes recibir comisiones por transacciones sin participar en la validación de las mismas ni en la minería de bloques.

Existen otros consensos que aún no se han generalizado; aquí simplemente los enumero para información, y puedes ver un análisis de los propios algoritmos de consenso, por ejemplo, en el artículo: Algoritmos de Consenso en 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-Importans)

Confiabilidad y modelos de despliegue de blockchains

Blockchain público

Sostenibilidad Público o otro nombre Blockchain sin permiso se logra porque cualquiera puede conectarse y visualizar información o incluso conectar su nodo, y la confianza se construye sobre el consenso PoW.

Blockchain privado

Privado o Blockchain privado con permiso. En estos blockchains, solo un grupo específico de participantes (organizaciones o personas) tiene acceso a la información. Estas blockchains son construidas por organizaciones con el fin de aumentar el beneficio general o la eficiencia. Su confiabilidad está asegurada por los objetivos comunes de los participantes y los algoritmos de consenso PoS y BFT.

Consorcio de Blockchain

Existen Consorcio o Blockchain público con permiso. Son blockchains a los que cualquiera puede conectarse para ver, pero agregar información o conectar su nodo solo puede hacerse con el permiso de otros participantes. Estas blockchains son creadas por organizaciones para aumentar la confianza de los clientes o consumidores de productos o de la sociedad en general. Aquí, la confiabilidad también se logra gracias a la presencia de confianza entre los participantes y los mismos algoritmos de consenso PoS y BFT.

Smart Contracts

En los blockchains implementados después de Bitcoin, se ha añadido en cierta medida la posibilidad de ejecutar smart contracts. Esencialmente, un smart contract es una transacción que contiene el código programático para su ejecución. Los smart contracts en la red Ethereum se ejecutan en la EVM (Ethereum Virtual Machine). Para iniciar la ejecución de un smart contract, debe ser activado explícitamente por otra transacción, o deben cumplirse las condiciones previas para su ejecución. Los resultados de la ejecución de un smart contract también se registrarán en el blockchain. Obtener datos desde fuera del blockchain es posible, pero extremadamente limitado.

¿Qué lógica empresarial se puede implementar a través de un contrato inteligente? En realidad, no son muchas, como la verificación de condiciones basadas en datos de la cadena de bloques, el cambio de propietarios de activos digitales según esas condiciones, y el registro de datos en un almacenamiento permanente dentro de la cadena de bloques. La lógica se implementa en un lenguaje de alto nivel llamado Solidity.

Un ejemplo clásico de funcionalidad que se implementa utilizando contratos inteligentes es la emisión de tokens para llevar a cabo una ICO. Por ejemplo, he implementado un contrato inteligente para emitir modestos 500,000,000 AlexToken. A través de el enlace en Etherscan se encuentra

el código fuente del contrato inteligente en el lenguaje 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;
}

y la representación binaria, tal como la ve la red

60806040526000600355600060045533600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560146101000a81548160ff021916908360028111156200006f57fe5b0217905550620001036b019d971e4fe8401e74000000600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200024a6401000000000262000b1d179091906401000000009004565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620001986b019d971e4fe8401e740000006001546200024a6401000000000262000b1d179091906401000000009004565b6001819055506b033b2e3c9fd0803ce8000000600481905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6b019d971e4fe8401e740000006040518082815260200191505060405180910390a362000267565b600081830190508281101515156200025e57fe5b80905092915050565b611cb880620002776000396000f300608060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146104c7578063095ea7b31461055757806318160ddd146105bc57806323b872dd146105e7578063313ce5671461066c578063355274ea146106a3578063518ab2a8146106ce57806366188463146106f957806370a082311461075e57806389311e6f146107b55780638da5cb5b146107cc578063903a3ef61461082357806395d89b411461083a578063a9059cbb146108ca578063bf5839031461092f578063c7876ea41461095a578063cbcb317114610985578063d73dd623146109b0578063dd62ed3e14610a15578063f2fde38b14610a8c575b60008060008060006001600281111561012757fe5b600560149054906101000a900460ff16600281111561014257fe5b14151561014e57600080fd5b60003411151561015d57600080fd5b600060045411151561016e57600080fd5b3494506101a7670de0b6b3a764000061019968056bc75e2d6310000088610acf90919063ffffffff16565b610b0790919063ffffffff16565b9350600092506b033b2e3c9fd0803ce80000006101cf85600354610b1d90919063ffffffff16565b111561024c576101f66003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b915061022e670de0b6b3a764000061022068056bc75e2d6310000085610b0790919063ffffffff16565b610acf90919063ffffffff16565b90506102438186610b3990919063ffffffff16565b92508094508193505b61026184600354610b1d90919063ffffffff16565b6003819055506102886003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b6004819055506000831115610344573373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156102dd573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b610395846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a361045184600154610b1d90919063ffffffff16565b600181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156104bf573d6000803e3d6000fd5b505050505050005b3480156104d357600080fd5b506104dc610b52565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b506105d1610c7d565b6040518082815260200191505060405180910390f35b3480156105f357600080fd5b50610652600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c87565b604051808215151515815260200191505060405180910390f35b34801561067857600080fd5b50610681611041565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3480156106af57600080fd5b506106b8611046565b6040518082815260200191505060405180910390f35b3480156106da57600080fd5b506106e3611056565b6040518082815260200191505060405180910390f35b34801561070557600080fd5b50610744600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061105c565b604051808215151515815260200191505060405180910390f35b34801561076a57600080fd5b5061079f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ed565b6040518082815260200191505060405180910390f35b3480156107c157600080fd5b506107ca611335565b005b3480156107d857600080fd5b506107e16113eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082f57600080fd5b50610838611411565b005b34801561084657600080fd5b5061084f6114ab565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088f578082015181840152602081019050610874565b50505050905090810190601f1680156108bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d657600080fd5b50610915600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b604051808215151515815260200191505060405180910390f35b34801561093b57600080fd5b50610944611703565b6040518082815260200191505060405180910390f35b34801561096657600080fd5b5061096f611709565b6040518082815260200191505060405180910390f35b34801561099157600080fd5b5061099a611716565b6040518082815260200191505060405180910390f35b3480156109bc57600080fd5b506109fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611726565b604051808215151515815260200191505060405180910390f35b348015610a2157600080fd5b50610a76600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611922565b6040518082815260200191505060405180910390f35b348015610a9857600080fd5b50610acd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a9565b005b600080831415610ae25760009050610b01565b8183029050818382811515610af357fe5b04141515610afd57fe5b8090505b92915050565b60008183811515610b1457fe5b04905092915050565b60008183019050828110151515610b3057fe5b80905092915050565b6000828211151515610b4757fe5b818303905092915050565b6040805190810160405280600981526020017f416c6578546f6b656e000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610cc457600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d1157600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d9c57600080fd5b610ded826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e80826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5182600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60035481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561116d576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611201565b6111808382610b3990919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561139157600080fd5b60028081111561139d57fe5b600560149054906101000a900460ff1660028111156113b857fe5b141515156113c557600080fd5b6001600560146101000a81548160ff021916908360028111156113e457fe5b0217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561146d57600080fd5b60028081111561147957fe5b600560149054906101000a900460ff16600281111561149457fe5b141515156114a157600080fd5b6114a9611b01565b565b6040805190810160405280600381526020017f414c54000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561152157600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561156e57600080fd5b6115bf826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611652826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60045481565b68056bc75e2d6310000081565b6b019d971e4fe8401e7400000081565b60006117b782600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a0557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611a4157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600560146101000a81548160ff02191690836002811115611b2057fe5b021790555060006004541115611c0a57611ba5600454600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611c89573d6000803e3d6000fd5b505600a165627a7a723058205bbef016cc7699572f944871cb6f05e69915ada3a92a1d9f03a3fb434aac0c2b0029

Más detalles sobre los contratos inteligentes se pueden encontrar en el artículo: ¿Qué son los contratos inteligentes en Ethereum?.

Conclusión

Hemos enumerado las tecnologías en las que se basan las blockchain modernas y cómo están interconectadas. Ahora formularemos qué problemas se pueden resolver con la blockchain y cuáles, en el mejor de los casos, serán ineficaces. Por lo tanto, el uso de blockchain no es necesario si:

  • Las transacciones se realizan en un entorno de confianza;
  • La existencia de comisiones de intermediarios no empeora la vida de los participantes;
  • Los participantes no tienen propiedad que pueda representarse como activos digitales;
  • No hay división en los activos digitales, es decir, el valor es poseído o suministrado solo por un participante.

¿Qué futuro le espera a la blockchain? Actualmente solo podemos suponer posibles caminos de desarrollo de las tecnologías blockchain:

  • La blockchain se convertirá en una tecnología de bases de datos tan común como, por ejemplo, SQL o NoSQL para resolver su conjunto específico de tareas;
  • La blockchain se convertirá en un protocolo ampliamente utilizado, como HTTP para Internet;
  • ¡La blockchain será la base para un nuevo sistema financiero y político del planeta!

En la siguiente parte, veremos qué blockchains existen actualmente y para qué se utilizan en diferentes industrias.

¡Esto es solo el comienzo!

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster