¿Qué debemos construir una blockchain?

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

Analizando 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 blockchains se parecen a las casas que, a pesar de su variedad de diseños, decoraciones y designaciones, tienen cimientos, paredes, techos, ventanas y puertas que están conectadas entre sí de ciertas maneras. Y si comprende los principios básicos del diseño de edificios, conoce las propiedades de los materiales utilizados, puede determinar el propósito de una casa en particular. En la actualidad, ha surgido una situación con la cadena de bloques que todos han escuchado sobre ella, pero pocos entienden la arquitectura y los principios del trabajo. Por lo tanto, surge un malentendido sobre qué y cómo tiene sentido usar las tecnologías blockchain.

En este artículo, analizaremos las propiedades y principios comunes a todas las cadenas de bloques. A continuación, observamos las tareas que se pueden resolver con blockchain y, para consolidar el material , construiremos una blockchain pequeña pero real en nuestro sitio virtual.

Entonces, recordemos qué problemas resolvió originalmente la cadena de bloques.

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

Prefiero comenzar a estudiar cualquier tecnología leyendo estándares, ya que todos los artículos y libros sobre el tema en estudio se basan en ellos. Pero actualmente faltan estándares de blockchain; solo se han creado comités en ISO para su desarrollo. Actualmente, cada proyecto público de blockchain tiene su propio Libro Blanco, que es esencialmente una tarea técnica. El primer proyecto blockchain conocido es la red Bitcoin. Vamos al sitio web oficial de la red y vemos cómo empezó todo.

Desafío blockchain


Entonces, la tarea que la cadena de bloques resolvió en la red pionera de Bitcoin es hacer una transferencia de confianza de la propiedad de los activos digitales en un entorno no confiable sin intermediarios. Por ejemplo, en una red de Bitcoin, un activo digital es una moneda digital de bitcoin. Y todas las soluciones técnicas de Bitcoin y otras cadenas de bloques se reducen a resolver este problema.

Problemas de blockchain


Supongamos que cierta organización financiera dice que ha construido una red en todo el mundo con la que puede transferir dinero a cualquier persona. ¿Le creerías a ella? Si esta organización es Visa o MasterCard, lo más probable es que lo crea, pero si, en términos relativos, AnonymousWorldMoney, probablemente no. Por qué Pero debido a que sabemos muy bien cómo los sistemas distribuidos son fabricados por empresas privadas, con qué fines y a qué puede conducir esto. Consideremos con más detalle los problemas de tales sistemas y cómo se pueden resolver utilizando tecnologías blockchain.

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

imagen

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 anonimato de las transacciones por el otro. Es decir es necesario transferir dinero a un destinatario específico para que nadie sepa de esta transacción, excepto los participantes en la transacción. Los bancos tienen números de cuenta y tarjetas bancarias vinculados 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 AnonymousWorldMoney condicional no utiliza datos personales e información de transacciones para sus propios fines?
  2. ¿Cómo asegurarse de que el destinatario recibió exactamente la cantidad que le fue transferida? Relativamente hablando, 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, que dice que el remitente transfirió solo $ 10.
  3. Un problema ambiental no confiable, como el fraude llamado doble gasto. Un participante sin escrúpulos puede gastar su saldo varias veces hasta que el pago se replique en todos los servidores. Por supuesto, nadie canceló el teorema CAP , y finalmente se logrará la coherencia, pero alguien no recibirá dinero por los servicios o bienes prestados. Por lo tanto, si no existe una confianza completa en la organización de pago o en los participantes en las transacciones, entonces es necesario construir una red basada en la criptografía en lugar de la confianza.
  4. El AnonymousWorldMoney condicional tiene un número finito de servidores que pueden no estar disponibles de forma no intencional o por intención maliciosa.
  5. AnonymousWorldMoney tendrá su comisión tangible.
  6. La capacidad de controlar. Durante la operación de Bitcoin, resultó que las personas no solo quieren transferir monedas entre sí, sino también verificar varias condiciones para la transacción, programar escenarios de trabajo, realizar acciones automáticamente según las condiciones, etc.

Cómo blockchain resuelve estos problemas


  1. Los participantes se identifican mediante un par de claves: privadas y públicas, y el algoritmo de firma digital identifica de forma exclusiva al remitente y al destinatario, dejando sus identidades anónimas.
  2. Las transacciones se recopilan en bloques, se calcula el hash del bloque, que se registra en el siguiente bloque. Esta secuencia de escritura de hashes en bloques le dio el nombre de tecnología blockchain, y también hace que sea imposible cambiar / eliminar discretamente bloques o transacciones individuales de bloques. Por lo tanto, si una transacción cae en la cadena de bloques, puede estar seguro de que sus datos permanecerán sin cambios.
  3. El fraude de doble gasto se evita al llegar a un consenso en la red sobre qué datos deben considerarse correctos y cuáles deben descartarse. En la red de Bitcoin, se alcanza un consenso mediante la prueba de PoW (Prueba de trabajo).
  4. La confiabilidad del funcionamiento de la red se logra por el hecho de que la cadena de bloques es pública, donde cada participante puede lanzar su propio nodo, obtener una copia completa de la cadena de bloques y, además, comenzar a verificar independientemente las transacciones para verificar que sean correctas. Cabe señalar que las cadenas de bloques modernas le permiten construir no solo cadenas de bloques públicas (abiertas), sino también privadas (cerradas), así como utilizar esquemas combinados.
  5. No me libraré por completo de la comisión en la cadena de bloques, porque tienes que pagar a las personas que apoyan la red, pero en blockchain la necesidad de la comisión se demuestra de manera tan convincente que no hay dudas sobre su necesidad.
  6. Las cadenas de bloques modernas tienen la capacidad de implementar la lógica empresarial, que se llama contratos inteligentes en la cadena de bloques. La lógica de los contratos inteligentes se implementa en varios idiomas de alto nivel.

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

Arquitectura blockchain


Componentes de blockchain


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

imagen

Ciclo de vida de la transacción


Veamos el ciclo de vida de la transacción y analicemos en partes:

imagen

Tecnología blockchain


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

Identificación


Cada transacción de blockchain debe estar firmada digitalmente. Por lo tanto, para completar la transacción, cada participante debe tener un par de claves: privado / público. A veces un par de llaves se llama billetera, porque Las claves están asociadas de forma exclusiva con la dirección digital única y el saldo del participante. En realidad, las claves y las direcciones son solo 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: Algoritmo de firma digital de curva elíptica (ECDSA). Para su funcionamiento, la clave privada (número de 256 bits) generalmente se toma al azar. El número de opciones clave es 2 a la potencia de 256, por lo que podemos hablar sobre la imposibilidad práctica de hacer coincidir valores de clave privada.

Además, la clave pública se obtiene de la clave privada multiplicando su valor por las coordenadas del punto ubicado en la curva elíptica, como resultado de lo cual se obtienen las coordenadas del nuevo punto de la misma curva. Esta acción garantiza que reciba un par de claves adecuado para la firma digital de transacciones. Finalmente, la dirección de la billetera se calcula únicamente a partir 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 mantenerse en secreto y segura. La clave pública es conocida por todos. Si se pierde la clave privada, el acceso al activo (monedas) no se puede restaurar y el dinero se perderá para siempre. Por lo tanto, la tarea de almacenamiento confiable de claves privadas es extremadamente relevante, porque Este no es un banco donde siempre puede venir con un pasaporte y restaurar su cuenta. Existe toda una industria para la producción de las llamadas billeteras criptográficas frías, similares a las unidades flash:

imagen

o puede usar métodos más confiables, como ejemplo, para eliminar el valor de la clave privada en los tokens:

imagen

Transacciones


Para obtener más información sobre la estructura de la transacción, consulte el artículo Bitcoin en pocas palabras: Transacción . Es importante que comprendamos que cada transacción tiene al menos los siguientes datos:

 From: 0x48C89c341C5960Ca2Bf3732D6D8a0F4f89Cc4368 -    To: 0x367adb7894334678b90fe7882a5b06f7fbc783a -    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 ) a todos los nodos en 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 verificar la validez de las transacciones, los nodos forman bloques a partir de ellas. Además de las transacciones, el hash del bloque anterior, se escribe un número (contador Nonce) en el bloque, y el hash del bloque actual se calcula utilizando el algoritmo SHA-256. Un hash debe tener condiciones de complejidad establecidas. Por ejemplo, en una red Bitcoin, la complejidad del hash cambia automáticamente cada 2 semanas dependiendo de la capacidad de la red, de modo que el bloqueo se genera aproximadamente 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 agrega 1 a Nonce y se repite el cálculo hash. Para seleccionar el hash, se usa el campo Nonce, porque Estos son los únicos datos en el bloque que pueden cambiarse, el resto debe permanecer sin cambios. El hash correcto debe tener un cierto número de ceros al principio, por ejemplo, uno de los hashes reales:

 000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91 

Encontrar con éxito un hash es una prueba del trabajo realizado (Prueba de trabajo, PoW) para redes Bitcoin o Ethereum. El proceso de encontrar hashes se llama minería, por analogía con la minería de oro. El nombre determina con precisión la esencia del proceso, porque hay una simple enumeración de opciones, y si alguien encontró un hash adecuado, entonces esta es realmente buena suerte. Así es como encontrar una pepita de oro real en toneladas de gangue. La recompensa por el bloqueo ahora es de 12.5 BTC y si multiplica $ 3900 por el tipo de cambio actual de bitcoin, obtendrá más de un kilogramo de oro puro. ¡Hay algo por lo que luchar!

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

imagen

La cadena de bloques comienza con un bloque que aún no tiene un hash del bloque anterior. Solo hay uno de esos bloques en la cadena de bloques y tiene su propio nombre Genesis block. Los bloques restantes tienen la misma estructura y solo difieren en el número de transacciones. Las transacciones reales y los bloques que se crean 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 aproximadamente 200 bytes, el máximo en un bloque puede ser de aproximadamente 6,000 transacciones. A partir de aquí, por cierto, es el rendimiento de Bitcoin, del que todos se ríen: se genera un bloque aproximadamente cada 10 minutos * 60 segundos = 600 segundos, lo que da un rendimiento formal de aproximadamente 10 TPS. Aunque en realidad, esto no es rendimiento, sino un algoritmo de trabajo implementado conscientemente. Ethereum acaba de hacer el tiempo de generación de bloque de 15 segundos para la competencia. y la productividad despegó formalmente. Por lo tanto, en blockchains que usan PoW como consenso, generalmente no tiene sentido comparar el rendimiento, porque depende directamente de la complejidad de calcular el caché, que puede asignarse a cualquiera.

Tenedores


¿Y qué sucede si, por ejemplo, varios nodos encuentran hashes que cumplen con las condiciones de complejidad, pero tienen diferentes significados (en otras palabras, llegan a un consenso diferente) y escriben bloques en la cadena de bloques? Veamos cómo la cadena de bloques se protege de esta situación. En este caso, se produce la llamada bifurcación ('bifurcación'), y la cadena de bloques tiene dos versiones de la cadena:

imagen

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

imagen

Algunos de estos bloques se encontrarán antes y se enviarán 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:

imagen

Al mismo tiempo, puede surgir una situación cuando la transacción del participante se realizó solo en uno de los bloques de la bifurcación, que se canceló. Por lo tanto, para asegurarse de que la transacción deseada se registre en la cadena de bloques, hay 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 una red Bitcoin, el mínimo es de 2 bloques, el máximo es de 6.

La misma imagen con una bifurcación de bloques también se observará con el llamado ataque del 51%; esto es cuando un grupo de mineros tratará de hacer crecer una cadena de bloques alternativa, buscando cancelar la cadena con sus transacciones fraudulentas. Aunque en la actualidad, en lugar de fraude, es más rentable gastar su poder en la minería honesta.

Consenso


Para escribir un bloque en la cadena de bloques, la red debe llegar a un consenso. Recordemos la tarea de lograr el consenso en las redes de comunicación informática. El problema se formula como la tarea de los generales bizantinos BFT ( tolerancia a fallas bizantinas ). Omitiendo una descripción pictórica de los problemas del ejército bizantino, el problema puede formularse 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 conscientemente? Los algoritmos existentes para resolver el problema BFT muestran que la red puede funcionar correctamente si los estafadores son inferiores a 1/3. ¿Por qué no se aplicó el consenso BFT en la red Bitcoin? ¿Por qué usar PoW? Hay varias razones:

  • BFT funciona bien con un pequeño conjunto fijo de nodos, y en la cadena de bloques pública, el número de nodos es impredecible y, además, los nodos pueden activarse y desactivarse arbitrariamente.
  • Es necesario motivar a las personas a lanzar nodos de blockchain. Para hacer esto, las personas deben recibir recompensas. En BFT, formalmente no hay nada por lo que recibir una recompensa, pero lo que es una recompensa en PoW es comprensible para todos en un nivel intuitivo: para la electricidad consumida por el procesador en el proceso de encontrar el hash de bloque.

Además de PoW, hay varios problemas de consenso más que se usan en blockchains modernos, por ejemplo:


Detengámonos en el consenso de PoS, porque Es PoS y sus variantes los más utilizados en blockchains privados. ¿Por qué en privado? Por un lado, las características de PoS son mejores que 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 tanto, para neutralizar esto, todos los participantes en la cadena de bloques deben ser conocidos.

El consenso de PoS se basa en la elección de un nodo que puede escribir un bloque con transacciones en la cadena de bloques dependiendo de la cantidad de fondos en la cuenta, o más bien, no en la cuenta, sino en la promesa, es decir. cuanto más dinero tenga en la promesa, más probable será que la red elija su nodo para registrar el bloque. El depósito no será devuelto si la unidad no es válida. Por lo tanto, se implementa la protección contra el fraude. Las siguientes variaciones de PoS están disponibles:

  • El PoS delegado de consenso (DPoS) divide a los participantes en "votación" y "validación". Los titulares de monedas (participantes con derecho a voto) delegan su derecho a verificar y registrar transacciones en la cadena de bloques a otros participantes. Por lo tanto, los validadores hacen todo el trabajo de computación y son recompensados ​​por esto, y la presencia de los participantes en la votación 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 una mejor oportunidad de verificar los bloques. T.O. puede obtener una comisión por las transacciones, mientras no participa en la verificación de la transacción y bloquea la minería.

Todavía hay un cierto consenso que aún no se ha generalizado, simplemente lo enumeraré aquí para obtener información, y se puede encontrar una descripción general de los algoritmos de consenso, por ejemplo, en el artículo: Algoritmos de consenso en Blockchain .

  • PoET (Prueba de tiempo transcurrido)
  • PoC (Prueba de capacidad)
  • PoB (Prueba de quemadura)
  • PoWeight (prueba de peso)
  • PoA (Prueba de actividad) - PoW + PoS
  • PoI (Prueba de Importans)

Fiabilidad y modelos de implementación de blockchain


Blockchain público

La estabilidad de Public u otro nombre para Blockchain sin permiso se logra por el hecho de que todos pueden conectarse y ver información o incluso conectar su propio nodo, y la confianza se basa en el consenso PoW.

Blockchain privado

Cadena de bloques autorizada privada o privada . En estas cadenas de bloques, solo un cierto grupo de participantes (organizaciones o personas) tiene acceso a la información. Dichas cadenas de bloques son construidas por organizaciones para aumentar el beneficio o la eficiencia en general. Su fiabilidad está garantizada por los objetivos comunes de los participantes y los algoritmos de consenso de PoS y BFT.

Consorcio Blockchain

Hay consorcios o blockchain con permiso público . Estas son cadenas de bloques que todos pueden conectarse para ver, pero un participante puede agregar información o conectar su sitio solo con el permiso de otros participantes. Dichas cadenas de bloques son creadas por organizaciones para aumentar la confianza de los clientes o consumidores de productos o de la sociedad en general. Aquí, la fiabilidad 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. En esencia, un contrato inteligente es una transacción en la que el código del programa se coloca para su ejecución. Los contratos inteligentes en la red Ethereum se ejecutan en EVM (Ethereum Virtual Machine). Para comenzar la ejecución de un contrato inteligente, debe ser lanzado explícitamente por otra transacción, o se deben cumplir las condiciones previas para la ejecución. Los resultados de la implementación del contrato inteligente también se registran en la cadena de bloques. Es posible obtener datos desde fuera de la cadena de bloques, pero extremadamente limitado.

¿Qué lógica de negocios se puede implementar usando un contrato inteligente? De hecho, no hay tantos, por ejemplo, verificando las condiciones de acuerdo con los datos de la cadena de bloques, cambiando los propietarios de los activos digitales en función de estas condiciones, escribiendo datos en el 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 el tema de los tokens para ICO. Por ejemplo, implementé un contrato inteligente para el lanzamiento de un modesto 500 millones de AlexToken. El enlace en Etherscan es

Código fuente de contrato inteligente de solidez
 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 (ie 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 representación binaria de cómo lo 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 en las que se construyen las blockchains modernas y cómo se relacionan entre sí. Ahora formulemos qué tareas se pueden resolver usando blockchain y qué soluciones serán, en el mejor de los casos, ineficientes. Entonces, el uso de una cadena de bloques no es necesario 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 solo un miembro posee o entrega el valor.

¿Cuál es el futuro de blockchain? Ahora solo podemos especular sobre las posibles formas de desarrollar 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 rango específico de tareas;
  • Blockchain se convertirá en un protocolo generalizado como HTTP para Internet;
  • ¡Blockchain se convertirá en la base del nuevo sistema financiero y político del planeta!

En la siguiente parte, veremos qué blockchains existen actualmente y por qué se usan en varias industrias.

¡Es solo el comienzo!

Los tres artículos:


¿Qué debemos construir una blockchain?
Blockchain: ¿qué debemos construir un caso?
Blockchain: ¿qué debemos construir PoC?

Source: https://habr.com/ru/post/443282/


All Articles