¿Qué deberíamos construir una blockchain?

Toda la historia de la humanidad es un proceso continuo de deshacerse de cadenas y crear otras nuevas, aún más fuertes. (Autor anónimo)

Al analizar numerosos proyectos de blockchain (Bitshares, Hyperledger, Exonum, Ethereum, Bitcoin, etc.), entiendo que desde un punto de vista técnico, todos se basan en los mismos principios. Las cadenas de bloques recuerdan a las casas que, a pesar de toda la variedad de diseños, decoración y propósitos, tienen cimientos, paredes, techos, ventanas y puertas que están conectadas entre sí de cierta manera. Y si comprende los principios básicos del diseño de edificios y conoce las propiedades de los materiales utilizados, podrá determinar el propósito previsto de una casa en particular. Actualmente, ha surgido una situación con blockchain de la que todos han oído hablar, pero pocas personas entienden la arquitectura y los principios de funcionamiento. Por lo tanto, existe un malentendido sobre por qué y cómo tiene sentido utilizar tecnologías blockchain.

En este artículo analizaremos las propiedades y principios comunes a todas las blockchains. A continuación, veamos los problemas que se pueden resolver usando blockchain y, para reforzar el material, ¡construyamos una blockchain pequeña pero real en nuestro sitio virtual!

Entonces, recordemos qué problemas resolvió inicialmente blockchain.

Estoy seguro que muchos dirán de una base de datos distribuida, descentralizada, pública e inmutable. Pero ¿por qué era necesario todo esto?

Prefiero empezar a estudiar cualquier tecnología leyendo los estándares, ya que todos los artículos y libros sobre el tema en estudio se basan en ellos. Pero actualmente no existen estándares blockchain; ISO solo ha creado comités para su desarrollo. Actualmente, cada proyecto público de blockchain tiene su propio documento técnico, que es esencialmente una especificación técnica. El primer proyecto blockchain conocido públicamente es la red Bitcoin. Vaya al sitio web oficial de la red y mirar cómo todo empezó.

Desafío de la cadena de bloques

Entonces, la tarea que resolvió blockchain en la red pionera de Bitcoin es llevar a cabo una transferencia confiable de propiedad de activos digitales (activos) en un entorno no confiable y sin intermediarios. Por ejemplo, en la red Bitcoin, un activo digital son las monedas digitales bitcoin. Y todas las soluciones técnicas de Bitcoin y otras cadenas de bloques se reducen a resolver este problema.

Problemas que resuelve blockchain

Supongamos que una determinada organización financiera dice que ha creado una red en todo el mundo mediante la cual es posible transferir dinero a cualquier persona. ¿Le creerás? Si esta organización es Visa o MasterCard, lo más probable es que lo creas, pero si, relativamente hablando, AnonymousWorldMoney, probablemente no lo creerás. ¿Por qué? Sino porque sabemos muy bien cómo las empresas privadas fabrican los sistemas distribuidos, con qué fines y a qué puede conducir esto. Echemos un vistazo más de cerca a los problemas de dichos sistemas y cómo se pueden resolver utilizando tecnologías blockchain.

Digamos que en el AnonymousWorldMoney condicional hay servidores con bases de datos, y es bueno si hay varios de ellos en diferentes centros de datos. Cuando el remitente transfiere dinero, se registra una transacción, que se replica en todos los servidores y el dinero llega al destinatario.

¿Qué deberíamos construir una blockchain?

En un mundo ideal, este esquema funciona muy bien, pero en el nuestro surgen los siguientes problemas:

  1. El problema de identificar a los participantes, por un lado, y la necesidad de mantener el anonimato de las transacciones, por el otro. Aquellos. debe transferir dinero a un destinatario específico y de tal manera que nadie sepa de esta transacción excepto los participantes en la transacción. Los bancos tienen números de cuenta y tarjetas bancarias vinculadas a una persona física o jurídica específica, y el secreto bancario protege la información de las transacciones. ¿Y quién garantiza que el AnonymousWorldMoney condicional no utilice datos personales ni información de transacciones para sus propios fines?
  2. ¿Cómo asegurarse de que el destinatario haya recibido exactamente la cantidad que le fue transferida? En términos relativos, el remitente transfirió $100 y el destinatario recibió $10. El remitente llega a la oficina de AnonymousWorldMoney con su recibo y el empleado muestra su versión, donde está escrito que el remitente transfirió solo $10.
  3. El problema de un entorno que no es de confianza, por ejemplo, una estafa llamada doble gasto. Un participante sin escrúpulos puede gastar su saldo varias veces hasta que el pago se replique en todos los servidores. teorema de la PACPor supuesto, nadie canceló y finalmente se logrará un acuerdo, pero alguien no recibirá dinero por los servicios o bienes proporcionados. Por lo tanto, si no existe una confianza total en la organización de pagos o en los participantes en las transacciones, entonces es necesario construir una red basada no en la confianza, sino en la criptografía.
  4. Condicional AnonymousWorldMoney tiene un número finito de servidores que pueden dejar de estar disponibles sin querer o debido a intenciones maliciosas.
  5. AnonymousWorldMoney se llevará su propia comisión tangible.
  6. Posibilidad de control. Durante la operación de Bitcoin, resultó que las personas no solo quieren transferir monedas entre sí, sino también verificar diversas condiciones para la transacción, programar escenarios de trabajo, realizar acciones automáticamente dependiendo de las condiciones, etc.

Cómo blockchain resuelve estos problemas

  1. La identificación de los participantes se realiza mediante un par de claves: privada y pública, y el algoritmo de firma digital identifica de forma única al remitente y al destinatario, dejando sus identidades anónimas.
  2. Las transacciones se recopilan en bloques, el hash del bloque se calcula y se escribe en el siguiente bloque. Esta secuencia de registro de hashes en bloques da nombre a la tecnología blockchain y también hace que sea imposible cambiar/eliminar bloques o transacciones individuales de forma imperceptible. Por lo tanto, si una transacción se incluye en la cadena de bloques, puede estar seguro de que sus datos permanecerán sin cambios.
  3. El fraude de doble gasto se evita alcanzando un consenso en la red sobre qué datos considerar válidos y cuáles descartar. En la red Bitcoin, el consenso se logra mediante prueba de trabajo (PoW).
  4. La confiabilidad de la red se logra por el hecho de que la cadena de bloques es pública, donde cada participante puede ejecutar su propio nodo, recibir una copia completa de la cadena de bloques y, además, comenzar a verificar de forma independiente la exactitud de las transacciones. Cabe señalar que las cadenas de bloques modernas permiten construir no solo cadenas de bloques públicas (abiertas) sino también privadas (cerradas), así como el uso de esquemas combinados.
  5. El blockchain no eliminará por completo las comisiones, porque... hay que pagar a las personas que apoyan la red, pero en blockchain la necesidad de una comisión está demostrada de manera tan convincente que no hay duda de su necesidad.
  6. Las cadenas de bloques modernas tienen la capacidad de implementar lógica empresarial, que en la cadena de bloques se denomina contratos inteligentes. La lógica de los contratos inteligentes se implementa en varios lenguajes de alto nivel.

A continuación, consideraremos estas soluciones con más detalle.

Arquitectura de cadena de bloques

Componentes de la cadena de bloques

Cada participante puede lanzar su propio nodo con una copia completa de la blockchain (nodo completo). Los nodos completos que pueden registrar transacciones en blockchain se denominan nodos de consenso (testigo) o mineros (minero). Se llaman nodos completos que solo verifican la exactitud de las transacciones. nodos de auditoría (auditoría). Clientes ligeros (clientes ligeros) no almacenan copias completas de la cadena de bloques, sino que interactúan con la red mediante nodos completos.
La mayoría de los usuarios utilizan clientes ligeros o billeteras web para realizar transacciones. Todos los nodos están conectados entre sí. Con este conjunto de elementos, la arquitectura de la red se vuelve más estable:

¿Qué deberíamos construir una blockchain?

Ciclo de vida de la transacción

Veamos el ciclo de vida de la transacción y analicémoslo parte por parte:

¿Qué deberíamos construir una blockchain?

Tecnologías de cadena de bloques

Detengámonos con más detalle en las soluciones técnicas y sus conexiones entre sí.

Identificación

Cada transacción de blockchain debe estar firmada digitalmente. Por lo tanto, para completar una transacción, cada participante debe tener un par de claves: privada/pública. A veces, un par de llaves se llama billetera porque las claves están asociadas de forma única con la dirección digital única y el saldo del participante. En realidad, las claves y las direcciones son sólo cadenas de números en diferentes sistemas numéricos. Ejemplos de claves y direcciones de billetera:

Private key: 0a78194a8a893b8baac7c09b6a4a4b4b161b2f80a126cbb79bde231a4567420f
Public key: 0579b478952214d7cddac32ac9dc522c821a4489bc10aac3a81b9d1cd7a92e57ba
Address: 0x3814JnJpGnt5tB2GD1qfKP709W3KbRdfb27V

Para crear una firma digital en blockchains se utiliza un algoritmo basado en curvas elípticas: Elliptic Curve Digital Signature Algorithm (ECDSA). Para que funcione, la clave privada (número de 256 bits) se suele tomar de forma aleatoria. El número de opciones de clave es 2 elevado a 256, por lo que podemos hablar de la imposibilidad práctica de hacer coincidir los valores de las claves privadas.

A continuación, se obtiene la clave pública de la privada multiplicando su valor por las coordenadas de un punto situado en la curva elíptica, dando como resultado las coordenadas de un nuevo punto en la misma curva. Esta acción garantiza que obtenga un par de claves adecuado para firmar transacciones digitalmente. Finalmente, la dirección de la billetera se deriva de forma única de la clave pública.

Hay muchos artículos con detalles sobre la criptografía utilizada en blockchain, por ejemplo: Bitcoin en pocas palabras – Criptografía

La clave privada debe ser estrictamente confidencial y mantenerse segura. La clave pública es conocida por todos. Si se pierde la clave privada, el acceso al activo (monedas) no se podrá restaurar y el dinero se perderá para siempre. Por lo tanto, la tarea de almacenar de forma segura las claves privadas es sumamente relevante, porque Este no es un banco al que siempre puedes venir con tu pasaporte y restaurar tu cuenta. Existe toda una industria para la producción de las llamadas billeteras criptográficas frías, similares a las unidades flash:

¿Qué deberíamos construir una blockchain?

o puede utilizar métodos más fiables, por ejemplo, estampar el valor de la clave privada en los tokens:

¿Qué deberíamos construir una blockchain?

Transacciones

Se pueden encontrar más detalles sobre la estructura de la transacción en el artículo. Bitcoin en pocas palabras – Transacción. Es importante para nosotros entender que cada transacción tiene al menos los siguientes datos:

From: 0x48C89c341C5960Ca2Bf3732D6D8a0F4f89Cc4368 - цифровой адрес отправителя
To: 0x367adb7894334678b90аfe7882a5b06f7fbc783a - цифровой адрес получателя
Value: 0.0001 - сумма транзакции
Transaction Hash: 0x617ede331e8a99f46a363b32b239542bb4006e4fa9a2727a6636ffe3eb095cef - хэш транзакции

A continuación, la transacción se firma con una clave privada y se envía (ver detalles sobre el funcionamiento del protocolo Bitcoin en pocas palabras: protocolo) a todos los nodos de la cadena de bloques que verifican la validez de las transacciones. El algoritmo de verificación de transacciones no es trivial e incluye dos docenas de pasos.

Bloques de transacciones

Después de comprobar la validez de las transacciones, los nodos forman bloques a partir de ellas. Además de las transacciones, en el bloque se escriben el hash del bloque anterior y un número (contador Nonce), y el hash del bloque actual se calcula utilizando el algoritmo SHA-256. El hash debe tener condiciones de complejidad establecidas. Por ejemplo, en la red Bitcoin, la dificultad del hash cambia automáticamente cada 2 semanas dependiendo de la potencia de la red, de modo que se genera un bloque aproximadamente una vez cada 10 minutos. La complejidad está determinada por la siguiente condición: el hash encontrado debe ser menor que un número predeterminado. Si no se cumple esta condición, se suma 1 al Nonce y se repite el trabajo de calcular el hash. Para seleccionar un hash, se utiliza el campo Nonce, porque Estos son los únicos datos del bloque que se pueden cambiar; el resto debe permanecer sin cambios. Un hash válido debe tener una cierta cantidad de ceros a la izquierda, como uno de los hashes reales:

000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91

Encontrar un hash con éxito es una prueba del trabajo realizado (Prueba de trabajo, PoW) para las redes Bitcoin o Ethereum. El proceso de encontrar hashes se llama minería, similar a la extracción de oro. El nombre define con bastante precisión la esencia del proceso, porque hay una búsqueda simple de opciones, y si alguien encuentra un hash adecuado, entonces es realmente suerte. Es como encontrar una verdadera pepita de oro entre toneladas de roca estéril. La recompensa del bloque ahora es de 12.5 BTC y si la multiplicas por el precio actual de Bitcoin de $3900, obtienes más de un kilogramo de oro puro. ¡Hay algo por lo que luchar!

Después de encontrar con éxito un hash, el bloque y el hash encontrado se escriben en la cadena de bloques como el siguiente bloque. Se pueden encontrar más detalles sobre la estructura de los bloques en el artículo. Bitcoin en pocas palabras: Blockchain, y a continuación se muestra un diagrama simplificado:

¿Qué deberíamos construir una blockchain?

La blockchain comienza con un bloque que aún no tiene el hash del bloque anterior. Solo existe un bloque de este tipo en la cadena de bloques y tiene su propio nombre, bloque Génesis. Los bloques restantes tienen la misma estructura y se diferencian únicamente en el número de transacciones. Las transacciones y bloques reales 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 una cantidad mínima de información en una transacción de unos 200 bytes, el número máximo de transacciones en un bloque puede ser de unas 6000. De aquí, por cierto, sigue el rendimiento de Bitcoin, del que todo el mundo se ríe: un bloque se genera aproximadamente una vez cada 10 minutos * 60 segundos = 600 segundos, lo que da un rendimiento formal de unos 10 TPS. Aunque, de hecho, esto no es productividad, sino un algoritmo de trabajo implementado deliberadamente. En Ethereum, para competir, simplemente hicieron que el tiempo de generación del bloque fuera de 15 segundos. y la productividad se disparó formalmente. Por lo tanto, en blockchains que utilizan PoW como consenso, no tiene ningún sentido comparar el rendimiento, porque Depende directamente de la complejidad del cálculo de la caché, que se puede asignar a cualquier valor.

tenedores

¿Qué sucede si, por ejemplo, varios nodos encuentran hashes que cumplen con las condiciones de complejidad, pero tienen diferentes valores (en otras palabras, llegaron a diferentes consensos) y escriben bloques en la cadena de bloques? Veamos cómo protege blockchain contra esta situación. En este caso, se produce la llamada bifurcación y la cadena de bloques tiene dos versiones de la cadena:

¿Qué deberíamos construir una blockchain?

¿Qué pasa después? A continuación, parte de la red comienza a funcionar en el bloque N+2 de una cadena y parte de otra:

¿Qué deberíamos construir una blockchain?

Uno de estos bloques se encontrará antes y se enviará a la cadena de bloques, y luego, de acuerdo con las reglas, la cadena de bloques tendrá que cambiar a una cadena más larga y cancelar todas las transacciones del bloque alternativo:

¿Qué deberíamos construir una blockchain?

Al mismo tiempo, puede surgir una situación en la que la transacción de un participante se encontraba solo en uno de los bloques de bifurcación, que fue cancelado. Por lo tanto, para asegurarse de que la transacción deseada se registre en la cadena de bloques, existe una recomendación general: antes de confiar en la transacción, debe esperar hasta que se agreguen los siguientes bloques a la cadena de bloques. Las recomendaciones sobre cuántos bloques esperar para diferentes blockchains varían. Por ejemplo, para la red Bitcoin el mínimo es 2 bloques y el máximo es 6.

La misma imagen con las bifurcaciones de bloques se observará durante el llamado ataque del 51%: aquí es cuando un grupo de mineros intenta desarrollar una cadena de bloques alternativa, buscando cancelar la cadena con sus transacciones fraudulentas. Aunque hoy en día, en lugar de fraude, es más rentable gastar el poder en minería honesta.

Consenso

Para registrar un bloque en la cadena de bloques, la red debe llegar a un consenso. Recordemos la tarea de lograr consenso en las redes de comunicación informática. El problema se formula como tarea de los generales bizantinos BFT (Tolerancia de falla bizantina). Omitiendo la descripción pintoresca de los problemas del ejército bizantino, el problema se puede formular de la siguiente manera: ¿cómo pueden los nodos de la red llegar a un resultado común si algunos nodos de la red pueden distorsionarlos deliberadamente? Los algoritmos existentes para resolver el problema BFT muestran que la red puede funcionar correctamente si hay menos de 1/3 de los estafadores. ¿Por qué no se ha aplicado el consenso BFT a la red Bitcoin? ¿Por qué fue necesario utilizar PoW? Hay varias razones:

  • BFT funciona bien con un pequeño conjunto fijo de nodos, pero en una cadena de bloques pública la cantidad de nodos es impredecible y, además, los nodos se pueden activar y desactivar de forma aleatoria.
  • Es necesario motivar a la gente a lanzar nodos blockchain. Para ello, es necesario recompensar a la gente. En BFT formalmente no hay nada por lo que recibir una recompensa, pero para qué sirve la recompensa en PoW está claro para todos en un nivel intuitivo: por la electricidad consumida por el procesador en el proceso de encontrar el hash del bloque.

Además de PoW, existen otros consensos que se utilizan en las cadenas de bloques modernas, por ejemplo:

  • PoS (Prueba de participación): en la cadena de bloques Hyperledger
  • DPoS (Prueba de participación delegada): en blockchain BitShares
  • Modificaciones de BFT: SBFT (Simplified BFT) y PBFT (Practical BFT), por ejemplo en blockchain exón

Detengámonos un poco en el consenso de PoS, porque... Son PoS y sus variedades los más extendidos en las cadenas de bloques privadas. ¿Por qué en privado? Por un lado, las características de PoS son mejores en comparación con PoW, porque Para lograr un consenso, se necesitan menos recursos informáticos, lo que significa que aumenta la velocidad de escritura de datos en la cadena de bloques. Pero, por otro lado, PoS tiene más oportunidades de fraude, por lo que para neutralizar esto, se debe conocer a todos los participantes en la cadena de bloques.

El consenso de PoS se basa en la selección de un nodo que pueda escribir un bloque con transacciones en la cadena de bloques dependiendo de la cantidad de fondos en la cuenta, o mejor dicho, no en la cuenta, sino en la garantía, es decir. Cuantos más fondos tenga como garantía, más probabilidades habrá de que la red elija su nodo para escribir un bloque. El depósito no será devuelto si el bloqueo no es válido. Esto proporciona 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 con derecho a voto) delegan su poder de verificar y registrar transacciones en la cadena de bloques a otros participantes. Por lo tanto, los validadores hacen todo el trabajo computacional y reciben una recompensa por ello, y la presencia de participantes votantes garantiza la honestidad de los validadores, porque se pueden cambiar en cualquier momento.
  • El consenso LPoS (Prueba de participación arrendada) le permite arrendar sus fondos a otros nodos para que tengan más posibilidades de validar bloques. Eso. Puede recibir una comisión por transacciones sin participar en la verificación de transacciones real y en la minería de bloques.

También hay una serie de consensos que aún no se han generalizado; solo los enumeraré aquí para obtener información, y se puede encontrar una descripción general de los algoritmos de consenso en sí, por ejemplo, en el artículo: Algoritmos de consenso en Blockchain.

  • PoET (Prueba de tiempo transcurrido)
  • PoC (Prueba de capacidad)
  • PoB (prueba de grabación)
  • PoWeight (Prueba de peso)
  • PoA (Prueba de actividad) – PoW + PoS
  • PoI (Prueba de importancia)

Modelos de confiabilidad y despliegue de blockchains.

Blockchain pública

Estabilidad Público u otro nombre Cadena de bloques sin permiso Esto se logra permitiendo que cualquiera se conecte y vea información o incluso conecte su propio nodo, y la confianza se basa en el consenso de PoW.

Blockchain privada

Privado o Blockchain privado autorizado. En estas blockchains, sólo un determinado grupo de participantes (organizaciones o personas) tienen acceso a la información. Estas cadenas de bloques son creadas por organizaciones con el objetivo de aumentar el beneficio o la eficiencia general. Su confiabilidad está garantizada por los objetivos comunes de los participantes y los algoritmos de consenso PoS y BFT.

Consorcio blockchain

hay Consorcio o Blockchain con permiso público. Estas son cadenas de bloques a las que cualquiera puede conectarse para ver, pero un participante puede agregar información o conectar su nodo solo con el permiso de otros participantes. Estas cadenas de bloques son construidas por organizaciones para aumentar la confianza por parte de los clientes o consumidores de productos o de la sociedad en su conjunto. Aquí, la confiabilidad también se logra mediante la presencia de confianza entre los participantes y los mismos algoritmos de consenso PoS y BFT.

Contratos Inteligentes

Las cadenas de bloques implementadas después de Bitcoin han agregado, en un grado u otro, la capacidad de ejecutar contratos inteligentes. Básicamente, un contrato inteligente es una transacción en la que se coloca el código del programa para su ejecución. Los contratos inteligentes en la red Ethereum se ejecutan en la EVM (Máquina Virtual Ethereum). Para comenzar a ejecutar un contrato inteligente, debe ser iniciado explícitamente por otra transacción o se deben cumplir las condiciones previas para la ejecución. Los resultados de la ejecución del contrato inteligente también quedarán registrados en la blockchain. Recibir datos desde fuera de la cadena de bloques es posible, pero extremadamente limitado.

¿Qué lógica empresarial se puede implementar mediante un contrato inteligente? De hecho, no hay mucho, por ejemplo, verificar las condiciones utilizando datos de la cadena de bloques, cambiar los propietarios de los activos digitales dependiendo de estas condiciones, registrar datos en un almacenamiento permanente dentro de la cadena de bloques. La lógica se implementa en un lenguaje especial de alto nivel Solidity.

Un ejemplo clásico de funcionalidad que se implementa mediante contratos inteligentes es la emisión de tokens para ICO. Por ejemplo, implementé un contrato inteligente para emitir un modesto AlexToken de 500. Por enlace en Etherscan es

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 como la ve la red

60806040526000600355600060045533600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560146101000a81548160ff021916908360028111156200006f57fe5b0217905550620001036b019d971e4fe8401e74000000600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200024a6401000000000262000b1d179091906401000000009004565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620001986b019d971e4fe8401e740000006001546200024a6401000000000262000b1d179091906401000000009004565b6001819055506b033b2e3c9fd0803ce8000000600481905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6b019d971e4fe8401e740000006040518082815260200191505060405180910390a362000267565b600081830190508281101515156200025e57fe5b80905092915050565b611cb880620002776000396000f300608060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146104c7578063095ea7b31461055757806318160ddd146105bc57806323b872dd146105e7578063313ce5671461066c578063355274ea146106a3578063518ab2a8146106ce57806366188463146106f957806370a082311461075e57806389311e6f146107b55780638da5cb5b146107cc578063903a3ef61461082357806395d89b411461083a578063a9059cbb146108ca578063bf5839031461092f578063c7876ea41461095a578063cbcb317114610985578063d73dd623146109b0578063dd62ed3e14610a15578063f2fde38b14610a8c575b60008060008060006001600281111561012757fe5b600560149054906101000a900460ff16600281111561014257fe5b14151561014e57600080fd5b60003411151561015d57600080fd5b600060045411151561016e57600080fd5b3494506101a7670de0b6b3a764000061019968056bc75e2d6310000088610acf90919063ffffffff16565b610b0790919063ffffffff16565b9350600092506b033b2e3c9fd0803ce80000006101cf85600354610b1d90919063ffffffff16565b111561024c576101f66003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b915061022e670de0b6b3a764000061022068056bc75e2d6310000085610b0790919063ffffffff16565b610acf90919063ffffffff16565b90506102438186610b3990919063ffffffff16565b92508094508193505b61026184600354610b1d90919063ffffffff16565b6003819055506102886003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b6004819055506000831115610344573373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156102dd573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b610395846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a361045184600154610b1d90919063ffffffff16565b600181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156104bf573d6000803e3d6000fd5b505050505050005b3480156104d357600080fd5b506104dc610b52565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b506105d1610c7d565b6040518082815260200191505060405180910390f35b3480156105f357600080fd5b50610652600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c87565b604051808215151515815260200191505060405180910390f35b34801561067857600080fd5b50610681611041565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3480156106af57600080fd5b506106b8611046565b6040518082815260200191505060405180910390f35b3480156106da57600080fd5b506106e3611056565b6040518082815260200191505060405180910390f35b34801561070557600080fd5b50610744600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061105c565b604051808215151515815260200191505060405180910390f35b34801561076a57600080fd5b5061079f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ed565b6040518082815260200191505060405180910390f35b3480156107c157600080fd5b506107ca611335565b005b3480156107d857600080fd5b506107e16113eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082f57600080fd5b50610838611411565b005b34801561084657600080fd5b5061084f6114ab565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088f578082015181840152602081019050610874565b50505050905090810190601f1680156108bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d657600080fd5b50610915600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b604051808215151515815260200191505060405180910390f35b34801561093b57600080fd5b50610944611703565b6040518082815260200191505060405180910390f35b34801561096657600080fd5b5061096f611709565b6040518082815260200191505060405180910390f35b34801561099157600080fd5b5061099a611716565b6040518082815260200191505060405180910390f35b3480156109bc57600080fd5b506109fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611726565b604051808215151515815260200191505060405180910390f35b348015610a2157600080fd5b50610a76600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611922565b6040518082815260200191505060405180910390f35b348015610a9857600080fd5b50610acd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a9565b005b600080831415610ae25760009050610b01565b8183029050818382811515610af357fe5b04141515610afd57fe5b8090505b92915050565b60008183811515610b1457fe5b04905092915050565b60008183019050828110151515610b3057fe5b80905092915050565b6000828211151515610b4757fe5b818303905092915050565b6040805190810160405280600981526020017f416c6578546f6b656e000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610cc457600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d1157600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d9c57600080fd5b610ded826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e80826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5182600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60035481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561116d576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611201565b6111808382610b3990919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561139157600080fd5b60028081111561139d57fe5b600560149054906101000a900460ff1660028111156113b857fe5b141515156113c557600080fd5b6001600560146101000a81548160ff021916908360028111156113e457fe5b0217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561146d57600080fd5b60028081111561147957fe5b600560149054906101000a900460ff16600281111561149457fe5b141515156114a157600080fd5b6114a9611b01565b565b6040805190810160405280600381526020017f414c54000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561152157600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561156e57600080fd5b6115bf826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611652826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60045481565b68056bc75e2d6310000081565b6b019d971e4fe8401e7400000081565b60006117b782600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a0557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611a4157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600560146101000a81548160ff02191690836002811115611b2057fe5b021790555060006004541115611c0a57611ba5600454600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611c89573d6000803e3d6000fd5b505600a165627a7a723058205bbef016cc7699572f944871cb6f05e69915ada3a92a1d9f03a3fb434aac0c2b0029

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

Conclusión

Hemos enumerado las tecnologías sobre las que se construyen las cadenas de bloques modernas y cómo se conectan entre sí. Ahora formulemos qué problemas se pueden resolver utilizando blockchain y qué soluciones serán, en el mejor de los casos, ineficaces. Por lo tanto, no es necesario utilizar blockchain si:

  • Las transacciones se realizan en un entorno confiable;
  • La presencia de una comisión de intermediarios no empeora la vida de los participantes;
  • Los participantes no tienen propiedades que puedan representarse como activos digitales;
  • No hay distribución en activos digitales, es decir. el valor es propiedad o es proporcionado por un solo participante.

¿Qué le depara el futuro a blockchain? Ahora sólo podemos especular sobre posibles vías para el desarrollo de tecnologías blockchain:

  • Blockchain se convertirá en la misma tecnología de base de datos común que, por ejemplo, SQL o NoSQL para resolver su gama específica de problemas;
  • Blockchain se convertirá en un protocolo generalizado, como lo es HTTP para Internet;
  • ¡Blockchain se convertirá en la base de un nuevo sistema financiero y político en el planeta!

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

¡Este es solo el comienzo!

Fuente: habr.com

Añadir un comentario