Que debemos construír unha cadea de bloques?

Toda a historia da humanidade é un proceso continuo de desfacerse das cadeas e crear outras novas, aínda máis fortes. (Autor anónimo)

Analizando numerosos proxectos blockchain (Bitshares, Hyperledger, Exonum, Ethereum, Bitcoin, etc.), entendo que desde o punto de vista técnico, todos están construídos sobre os mesmos principios. As cadeas de bloques lembran ás casas que, a pesar de toda a variedade de deseños, decoración e propósitos, teñen unha base, paredes, tellado, fiestras, portas que están conectadas entre si de determinadas formas. E se entendes os principios básicos do deseño de edificios e coñeces as propiedades dos materiais utilizados, podes determinar o propósito previsto dunha casa en particular. Actualmente, xurdiu unha situación coa cadea de bloques da que todos oíron falar del, pero poucas persoas entenden a arquitectura e os principios de funcionamento. Polo tanto, hai un malentendido de por que e como ten sentido usar tecnoloxías blockchain.

Neste artigo analizaremos as propiedades e os principios comúns a todas as cadeas de bloques. A continuación, vexamos os problemas que se poden resolver usando a cadea de bloques e para reforzar o material, imos construír unha cadea de bloques pequena pero real no noso sitio virtual!

Entón, lembremos que problemas solucionou inicialmente a cadea de bloques.

Estou seguro de que moitos dirán sobre unha base de datos distribuída, descentralizada, pública e inmutable. Pero por que era necesario todo isto?

Prefiro comezar a estudar calquera tecnoloxía lendo os estándares, xa que todos os artigos e libros sobre o tema en estudo están baseados neles. Pero actualmente non hai estándares de cadea de bloques; ISO só creou comités para o seu desenvolvemento. Actualmente, cada proxecto público de cadea de bloques ten o seu propio documento de Libro Branco, que é esencialmente unha especificación técnica. O primeiro proxecto de cadea de bloques coñecido publicamente é a rede Bitcoin. Vaia ao sitio web oficial da rede e mirar como comezou todo.

Desafío Blockchain

Entón, a tarefa que resolveu blockchain na rede pioneira de Bitcoin é levar a cabo unha transferencia de propiedade de confianza de activos dixitais (activos) nun ambiente non fiable sen intermediarios. Por exemplo, na rede Bitcoin, un activo dixital son as moedas dixitais bitcoin. E todas as solucións técnicas de Bitcoin e outras cadeas de bloques redúcense a resolver este problema.

Problemas que soluciona blockchain

Supoñamos que unha determinada organización financeira di que construíu unha rede en todo o mundo coa axuda da cal é posible transferir diñeiro a calquera persoa. Vai crer nela? Se esta organización é Visa ou MasterCard, o máis probable é que o creas, pero se, relativamente falando, AnonymousWorldMoney, probablemente non o creerás. Por que? Pero porque sabemos moi ben como se fabrican os sistemas distribuídos por empresas privadas, para que fins e para que isto pode levar. Vexamos máis de cerca os problemas deste tipo de sistemas e como se poden resolver mediante tecnoloxías blockchain.

Digamos que no condicional AnonymousWorldMoney hai servidores con bases de datos, e é bo que haxa varios deles en distintos centros de datos. Cando o remitente transfire diñeiro, rexístrase unha transacción, que se replica en todos os servidores e o diñeiro chega ao destinatario.

Que debemos construír unha cadea de bloques?

Nun mundo ideal, este esquema funciona moi ben, pero no noso xorden os seguintes problemas:

  1. O problema da identificación dos participantes por unha banda e a necesidade do anonimato das transaccións por outra. Eses. cómpre transferir diñeiro a un destinatario específico e de tal xeito que ninguén coñeza esta transacción, excepto os participantes na transacción. Os bancos teñen números de conta e tarxetas bancarias vinculadas a unha persoa física ou xurídica específica, e o segredo bancario protexe a información das transaccións. E quen garante que o AnonymousWorldMoney condicional non utilice datos persoais e información de transaccións para os seus propios fins?
  2. Como asegurarse de que o destinatario recibiu exactamente a cantidade que lle foi transferida? En termos relativos, o remitente transferiu $100 e o destinatario recibiu $10. O remitente acode á oficina de AnonymousWorldMoney co seu recibo e o empregado mostra a súa versión, onde está escrito que o remitente transferiu só 10 dólares.
  3. O problema dun ambiente non fiable, por exemplo, unha estafa chamada dobre gasto. Un participante sen escrúpulos pode gastar o seu saldo varias veces ata que o pago se replique en todos os servidores. Teorema CAP, por suposto, ninguén cancelou, e o acordo finalmente será alcanzado, pero alguén non recibirá diñeiro por servizos ou bens prestados. Polo tanto, se non hai unha confianza total na organización de pago ou os participantes nas transaccións, entón é necesario construír unha rede baseada non na confianza, senón na criptografía.
  4. Condicional AnonymousWorldMoney ten un número finito de servidores que poden non estar dispoñibles sen querer ou por intención maliciosa.
  5. AnonymousWorldMoney levará a súa propia comisión tanxible.
  6. Posibilidade de control. Durante a operación de Bitcoin, resultou que a xente non só quere transferir moedas entre si, senón tamén comprobar varias condicións para a transacción, programar escenarios de traballo, realizar accións automaticamente dependendo das condicións, etc.

Como a cadea de bloques resolve estes problemas

  1. A identificación dos participantes realízase mediante un par de claves: privada e pública, e o algoritmo de sinatura dixital identifica de forma única o remitente e o destinatario, deixando as súas identidades anónimas.
  2. As transaccións recóllense en bloques, calcúlase o hash do bloque e escríbese no seguinte bloque. Esta secuencia de hash de gravación en bloques dálle o seu nome á tecnoloxía blockchain e tamén fai imposible cambiar/eliminar de forma imperceptible bloques ou transaccións individuais dos bloques. Así, se unha transacción está incluída na cadea de bloques, pode estar seguro de que os seus datos permanecerán sen cambios.
  3. A fraude do dobre gasto prevénse chegando a un consenso da rede sobre que datos considerar válidos e cales descartar. Na rede Bitcoin, o consenso conséguese mediante a proba de traballo (PoW).
  4. A fiabilidade da rede conséguese polo feito de que a cadea de bloques é pública, onde cada participante pode executar o seu propio nodo, recibir unha copia completa da cadea de bloques e, ademais, comezar de forma independente a comprobar a corrección das transaccións. Cómpre sinalar que as cadeas de bloques modernas permiten construír non só cadeas de bloques públicas (abertas) senón tamén privadas (pechadas), así como o uso de esquemas combinados.
  5. A cadea de bloques non se librará por completo das comisións, porque... hai que pagar ás persoas que apoian a rede, pero na cadea de bloques a necesidade dunha comisión está demostrada de forma tan convincente que non hai dúbida sobre a súa necesidade.
  6. As cadeas de bloques modernas teñen a capacidade de implementar a lóxica empresarial, que na cadea de bloques chámase contratos intelixentes. A lóxica dos contratos intelixentes está implementada en varios idiomas de alto nivel.

A continuación, consideraremos estas solucións con máis detalle.

Arquitectura blockchain

Compoñentes Blockchain

Cada participante pode lanzar o seu propio nodo cunha copia completa da cadea de bloques (nodo completo). Chámanse nodos completos que poden gravar transaccións na cadea de bloques nodos de consenso (testemuña) ou mineiros (mineiro). Chámanse nodos completos que só verifican a corrección das transaccións nodos de auditoría (auditoría). Clientes lixeiros (clientes lixeiros) non almacenan copias completas da cadea de bloques, senón que interactúan coa rede mediante nodos completos.
A maioría dos usuarios usan clientes lixeiros ou carteiras web para realizar transaccións. Todos os nodos están conectados entre si. Con este conxunto de elementos, a arquitectura de rede faise máis estable:

Que debemos construír unha cadea de bloques?

Ciclo de vida da transacción

Vexamos o ciclo de vida da transacción e desglosámolo peza por peza:

Que debemos construír unha cadea de bloques?

Tecnoloxías Blockchain

Detémonos máis en detalle nas solucións técnicas e as súas conexións entre si.

Identificación

Cada transacción blockchain debe estar asinada dixitalmente. Polo tanto, para completar unha transacción, cada participante debe ter un par de claves: privado/público. Ás veces, un par de chaves chámase carteira, porque as claves están asociadas de forma exclusiva co enderezo dixital único e o saldo do participante. En realidade, as claves e enderezos son só cadeas de números en diferentes sistemas numéricos. Exemplos de claves e enderezos de carteira:

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

Para crear unha sinatura dixital en blockchains utilízase un algoritmo baseado en curvas elípticas: Elliptic Curve Digital Signature Algorithm (ECDSA). Para que funcione, a clave privada (número de 256 bits) adoita tomarse ao azar. O número de opcións de chave é de 2 á potencia de 256, polo que podemos falar da imposibilidade práctica de igualar os valores das claves privadas.

A continuación, a clave pública obtense da privada multiplicando o seu valor polas coordenadas dun punto situado na curva elíptica, dando como resultado as coordenadas dun novo punto da mesma curva. Esta acción garante que obtén un par de claves axeitado para asinar dixitalmente transaccións. Finalmente, o enderezo da carteira deriva exclusivamente da clave pública.

Hai moitos artigos con detalles sobre a criptografía utilizada na cadea de bloques, por exemplo: Bitcoin en poucas palabras - Criptografía

A clave privada debe ser estrictamente confidencial e manterse segura. A chave pública é coñecida por todos. Se se perde a clave privada, o acceso ao activo (moedas) non se pode restaurar e o diñeiro perderase para sempre. Polo tanto, a tarefa de almacenar de forma segura as claves privadas é moi relevante, porque Este non é un banco onde sempre poidas vir co teu pasaporte e restaurar a túa conta. Hai toda unha industria para a produción das chamadas carteiras criptográficas frías, semellantes ás unidades flash:

Que debemos construír unha cadea de bloques?

ou pode usar métodos máis fiables, por exemplo, estampar o valor da clave privada nos tokens:

Que debemos construír unha cadea de bloques?

Transaccións

Podes atopar máis detalles sobre a estrutura da transacción no artigo Bitcoin en poucas palabras - Transacción. É importante que entendamos que cada transacción ten polo menos os seguintes datos:

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

A continuación, a transacción asínase cunha clave privada e envíase (ver detalles sobre o funcionamento do protocolo Bitcoin en poucas palabras-Protocolo) a todos os nós da cadea de bloques que verifican a validez das transaccións. O algoritmo de verificación de transaccións non é trivial e inclúe dúas ducias de pasos.

Bloques de transacción

Despois de comprobar a validez das transaccións, os nós forman bloques a partir delas. Ademais das transaccións, o hash do bloque anterior e un número (contador Nonce) escríbense no bloque e o hash do bloque actual calcúlase mediante o algoritmo SHA-256. O hash debe ter establecidas condicións de complexidade. Por exemplo, na rede Bitcoin, a dificultade do hash cámbiase automaticamente cada 2 semanas dependendo da potencia da rede, polo que se xera un bloque aproximadamente unha vez cada 10 minutos. A complexidade vén determinada pola seguinte condición: o hash atopado debe ser inferior a un número predeterminado. Se non se cumpre esta condición, engádese 1 ao Nonce e repítese o traballo de cálculo do hash. Para seleccionar un hash, úsase o campo Nonce, porque Este é o único dato do bloque que se pode modificar; o resto debe permanecer inalterado. Un hash válido debe ter un determinado número de ceros iniciales, como un dos hash reais:

000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91

Atopar con éxito un hash é unha proba do traballo realizado (Proof-of-Work, PoW) para as redes Bitcoin ou Ethereum. O proceso de atopar hash chámase minería, semellante á extracción de ouro. O nome define con bastante precisión a esencia do proceso, porque hai unha simple busca de opcións, e se alguén atopa un hash axeitado, isto é realmente unha sorte. É como atopar unha auténtica pepita de ouro en toneladas de rocha estéril. A recompensa do bloque agora é de 12.5 BTC e se o multiplicas pola taxa actual de Bitcoin de 3900 dólares, obtén máis dun quilo de ouro puro. Hai algo polo que loitar!

Despois de atopar con éxito un hash, o bloque e o hash atopado son escritos na cadea de bloques como o seguinte bloque. Podes atopar máis detalles sobre a estrutura dos bloques no artigo Bitcoin en poucas palabras: Blockchain, e a continuación móstrase un diagrama simplificado:

Que debemos construír unha cadea de bloques?

A cadea de bloques comeza cun bloque que aínda non ten o hash do bloque anterior. Só hai un bloque deste tipo na cadea de bloques e ten o seu propio nome. Os bloques restantes teñen a mesma estrutura e só difiren no número de transaccións. As transaccións reais e os bloques que se están creando actualmente en Bitcoin ou Ethereum pódense ver en Explorador de bloques.

O tamaño dos bloques en Bitcoin está limitado a 1 MB e cunha cantidade mínima de información nunha transacción duns 200 bytes, o número máximo de transaccións nun bloque pode ser de aproximadamente 6000. A partir de aquí, por certo, segue o rendemento de Bitcoin, do que todos se ri: xérase un bloque aproximadamente unha vez cada 10 minutos * 60 segundos = 600 segundos, o que dá un rendemento formal duns 10 TPS. Aínda que en realidade, isto non é produtividade, senón un algoritmo de traballo implementado deliberadamente. En Ethereum, para competir, simplemente fixeron que o tempo de xeración de bloques fose de 15 segundos. e a produtividade disparouse formalmente. Polo tanto, nas cadeas de bloques que usan PoW como consenso, non ten sentido comparar o rendemento, porque depende directamente da complexidade do cálculo da caché, que se pode asignar a calquera valor.

Garfos

Que pasa se, por exemplo, varios nodos atoparon hash que cumpren as condicións de complexidade, pero teñen un valor diferente (noutras palabras, chegaron a diferentes consensos) e escribiron bloques para a cadea de bloques? Vexamos como o blockchain protexe contra esta situación. Neste caso, prodúcese unha chamada bifurcación e a cadea de bloques ten dúas versións da cadea:

Que debemos construír unha cadea de bloques?

Que pasa despois? A continuación, parte da rede comeza a traballar no bloque N+2 dunha cadea e parte doutra:

Que debemos construír unha cadea de bloques?

Un destes bloques atoparase antes e enviado á cadea de bloques, e despois, segundo as regras, a cadea de bloques terá que cambiar a unha cadea máis longa e cancelar todas as transaccións do bloque alternativo:

Que debemos construír unha cadea de bloques?

Ao mesmo tempo, pode xurdir unha situación cando a transacción dun participante estaba só nun dos bloques de bifurcación, que foi cancelado. Polo tanto, para estar seguro de que a transacción desexada está rexistrada na cadea de bloques, hai unha recomendación xeral: antes de confiar na transacción, debes esperar ata que se engadan os próximos bloques á cadea de bloques. As recomendacións sobre cantos bloques hai que esperar para diferentes cadeas de bloques varían. Por exemplo, para a rede Bitcoin o mínimo é de 2 bloques, o máximo é de 6.

A mesma imaxe con forks de bloques observarase durante o chamado ataque do 51%: é cando un grupo de mineiros intenta facer crecer unha cadea de bloques alternativa, buscando cancelar a cadea coas súas transaccións fraudulentas. Aínda que na actualidade, en lugar de fraude, é máis rendible gastar o seu poder en minería honesta.

Consenso

Para gravar un bloque na cadea de bloques, a rede debe chegar a un consenso. Lembremos a tarefa de conseguir consenso nas redes informáticas de comunicación. O problema formúlase como tarefa dos xenerais bizantinos BFT (Tolerancia á falla bizantina). Omitindo a pintoresca descrición dos problemas do exército bizantino, o problema pódese formular do seguinte xeito: como poden os nodos de rede chegar a un resultado común se algúns deles poden distorsionalos deliberadamente. Os algoritmos existentes para resolver o problema BFT mostran que a rede pode funcionar correctamente se hai menos de 1/3 dos defraudadores. Por que non se aplicou o consenso BFT á rede Bitcoin? Por que foi necesario usar PoW? Hai varias razóns:

  • BFT funciona ben cun pequeno conxunto fixo de nós, pero nunha cadea de bloques pública o número de nós é imprevisible e, ademais, pódense activar e desactivar os nós de forma aleatoria.
  • É necesario motivar a xente a lanzar nodos de cadea de bloques. Para iso, a xente debe ser recompensada. En BFT non hai nada polo que recibir unha recompensa formalmente, pero o que é a recompensa en PoW está claro para todos a nivel intuitivo: pola electricidade que consume o procesador no proceso de atopar o hash do bloque.

Ademais de PoW, hai varios outros consensos que se usan nas cadeas de bloques modernas, por exemplo:

  • PoS (Proof-of-Stake) - na cadea de bloques Hyperledger
  • DPoS (Delegated Proof-of-Stake) - na cadea de bloques BitShares
  • Modificacións de BFT: SBFT (BFT simplificado) e PBFT (BFT práctico), por exemplo en blockchain Exono

Detémonos un pouco no consenso PoS, porque... É PoS e as súas variedades os que están máis estendidos nas cadeas de bloques privadas. Por que en privado? Por unha banda, as características do PoS son mellores en comparación co PoW, porque Para acadar o consenso, son necesarios menos recursos informáticos, o que significa que a velocidade de escritura de datos na cadea de bloques aumenta. Pero, por outra banda, PoS ten máis oportunidades de fraude, polo que para neutralizar isto, todos os participantes na cadea de bloques deben ser coñecidos.

O consenso PoS baséase na selección dun nodo que pode escribir un bloque con transaccións na cadea de bloques dependendo da cantidade de fondos na conta, ou mellor, non na conta, senón na garantía, é dicir. Cantos máis fondos teñas como garantía, máis probable é que a rede elixa o teu nodo para escribir un bloque. O depósito non se devolverá se o bloqueo non é válido. Isto proporciona protección contra a fraude. Existen as seguintes variacións de PoS:

  • O consenso Delegated PoS (DPoS) divide aos participantes en "votantes" e "validadores". Os posuidores de moedas (participantes con voto) delegan o seu poder para verificar e rexistrar transaccións na cadea de bloques a outros participantes. Así, os validadores realizan todo o traballo computacional e reciben unha recompensa por iso, e a presenza dos votantes garante a honestidade dos validadores, porque pódense cambiar en calquera momento.
  • O consenso LPoS (Leased Proof-of-Stake) permítelle arrendar os seus fondos a outros nodos para que teñan unha mellor oportunidade de validar bloques. Iso. Podes recibir unha comisión por transaccións sen participar na verificación real de transaccións e bloquear a minería.

Hai outros consensos que aínda non son moi utilizados, enumerareinos aquí para obter información e pódese atopar unha visión xeral dos propios algoritmos de consenso, por exemplo, no artigo: Algoritmos de consenso en Blockchain.

  • PoET (proba de tempo transcorrido)
  • PoC (proba de capacidade)
  • PoB (proba de queimadura)
  • PoWeight (proba de peso)
  • PoA (proba de actividade) - PoW + PoS
  • PoI (proba de importancia)

Modelos de fiabilidade e implantación de blockchains

Blockchain pública

Sostibilidade público ou outro nome Blockchain sen permisos Isto conséguese ao permitir que calquera persoa se conecte e vexa información ou mesmo conecte o seu propio nodo, e a confianza baséase no consenso PoW.

Blockchain privado

Privado ou Blockchain privado autorizado. Nestas cadeas de bloques, só un determinado grupo de participantes (organizacións ou persoas) teñen acceso á información. Tales cadeas de bloques son construídas por organizacións co obxectivo de aumentar o beneficio ou a eficiencia xeral. A súa fiabilidade está asegurada polos obxectivos comúns dos participantes e os algoritmos de consenso PoS e BFT.

Consorcio Blockchain

Alí Consorcio ou Blockchain con permiso público. Estas son cadeas de bloques ás que calquera pode conectarse para ver, pero un participante pode engadir información ou conectar o seu nodo só co permiso doutros participantes. Tales cadeas de bloques son construídas polas organizacións co fin de aumentar a confianza dos clientes ou consumidores de produtos ou da sociedade no seu conxunto. Aquí, a fiabilidade tamén se consegue pola presenza de confianza entre os participantes e os mesmos algoritmos de consenso PoS e BFT.

Contratos intelixentes

As cadeas de bloques implementadas despois de Bitcoin engadiron, nun ou outro grao, a capacidade de executar contratos intelixentes. Esencialmente, un contrato intelixente é unha transacción na que se coloca o código do programa para a súa execución. Os contratos intelixentes na rede Ethereum execútanse na EVM (Ethereum Virtual Machine). Para comezar a executar un contrato intelixente, debe ser lanzado explícitamente por outra transacción ou cumprir as condicións previas para a execución. Os resultados da execución do contrato intelixente tamén se rexistrarán na cadea de bloques. É posible recibir datos de fóra da cadea de bloques, pero moi limitado.

Que lóxica empresarial se pode implementar mediante un contrato intelixente? De feito, non hai moito, por exemplo, comprobar as condicións usando datos da cadea de bloques, cambiar os propietarios de activos dixitais dependendo destas condicións, gravar datos nun almacenamento permanente dentro da cadea de bloques. A lóxica está implementada nunha linguaxe especial de alto nivel Solidity.

Un exemplo clásico de funcionalidade que se implementa mediante contratos intelixentes é a emisión de tokens para ICO. Por exemplo, implementei un contrato intelixente para emitir un modesto AlexToken de 500. Por ligazón en Etherscan é

código fonte do contrato intelixente na linguaxe Solidity

pragma solidity ^0.4.23;
library SafeMath {
/**
* @dev Multiplies two numbers, throws on overflow.
**/
function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
if (a == 0) {
return 0;
}
c = a * b;
assert(c / a == b);
return c;
}
/**
* @dev Integer division of two numbers, truncating the quotient.
**/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
*/
// uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return a / b;
}
/**
* @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
**/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
/**
* @dev Adds two numbers, throws on overflow.
**/
function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
c = a + b;
assert(c >= a);
return c;
}
}
/**
* @title Ownable
* @dev The Ownable contract has an owner address, and provides basic authorization control
* functions, this simplifies the implementation of "user permissions".
**/
contract Ownable {
address public owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev The Ownable constructor sets the original `owner` of the contract to the sender account.
**/
constructor() public {
owner = msg.sender;
}
/**
* @dev Throws if called by any account other than the owner.
**/
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
**/
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0));
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
}
/**
* @title ERC20Basic interface
* @dev Basic ERC20 interface
**/
contract ERC20Basic {
function totalSupply() public view returns (uint256);
function balanceOf(address who) public view returns (uint256);
function transfer(address to, uint256 value) public returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
}
/**
* @title ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/20
**/
contract ERC20 is ERC20Basic {
function allowance(address owner, address spender) public view returns (uint256);
function transferFrom(address from, address to, uint256 value) public returns (bool);
function approve(address spender, uint256 value) public returns (bool);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
/**
* @title Basic token
* @dev Basic version of StandardToken, with no allowances.
**/
contract BasicToken is ERC20Basic {
using SafeMath for uint256;
mapping(address => uint256) balances;
uint256 totalSupply_;
/**
* @dev total number of tokens in existence
**/
function totalSupply() public view returns (uint256) {
return totalSupply_;
}
/**
* @dev transfer token for a specified address
* @param _to The address to transfer to.
* @param _value The amount to be transferred.
**/
function transfer(address _to, uint256 _value) public returns (bool) {
require(_to != address(0));
require(_value <= balances[msg.sender]);
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
emit Transfer(msg.sender, _to, _value);
return true;
}
/**
* @dev Gets the balance of the specified address.
* @param _owner The address to query the the balance of.
* @return An uint256 representing the amount owned by the passed address.
**/
function balanceOf(address _owner) public view returns (uint256) {
return balances[_owner];
}
}
contract StandardToken is ERC20, BasicToken {
mapping (address => mapping (address => uint256)) internal allowed;
/**
* @dev Transfer tokens from one address to another
* @param _from address The address which you want to send tokens from
* @param _to address The address which you want to transfer to
* @param _value uint256 the amount of tokens to be transferred
**/
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
require(_to != address(0));
require(_value <= balances[_from]);
require(_value <= allowed[_from][msg.sender]);
balances[_from] = balances[_from].sub(_value);
balances[_to] = balances[_to].add(_value);
allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
emit Transfer(_from, _to, _value);
return true;
}
/**
* @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
*
* Beware that changing an allowance with this method brings the risk that someone may use both the old
* and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
* race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
* @param _spender The address which will spend the funds.
* @param _value The amount of tokens to be spent.
**/
function approve(address _spender, uint256 _value) public returns (bool) {
allowed[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
/**
* @dev Function to check the amount of tokens that an owner allowed to a spender.
* @param _owner address The address which owns the funds.
* @param _spender address The address which will spend the funds.
* @return A uint256 specifying the amount of tokens still available for the spender.
**/
function allowance(address _owner, address _spender) public view returns (uint256) {
return allowed[_owner][_spender];
}
/**
* @dev Increase the amount of tokens that an owner allowed to a spender.
*
* approve should be called when allowed[_spender] == 0. To increment
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
* @param _spender The address which will spend the funds.
* @param _addedValue The amount of tokens to increase the allowance by.
**/
function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
/**
* @dev Decrease the amount of tokens that an owner allowed to a spender.
*
* approve should be called when allowed[_spender] == 0. To decrement
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
* @param _spender The address which will spend the funds.
* @param _subtractedValue The amount of tokens to decrease the allowance by.
**/
function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
uint oldValue = allowed[msg.sender][_spender];
if (_subtractedValue > oldValue) {
allowed[msg.sender][_spender] = 0;
} else {
allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
}
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
}
/**
* @title Configurable
* @dev Configurable varriables of the contract
**/
contract Configurable {
uint256 public constant cap = 1000000000*10**18;
uint256 public constant basePrice = 100*10**18; // tokens per 1 ether
uint256 public tokensSold = 0;
uint256 public constant tokenReserve = 500000000*10**18;
uint256 public remainingTokens = 0;
}
/**
* @title CrowdsaleToken 
* @dev Contract to preform crowd sale with token
**/
contract CrowdsaleToken is StandardToken, Configurable, Ownable {
/**
* @dev enum of current crowd sale state
**/
enum Stages {
none,
icoStart, 
icoEnd
}
Stages currentStage;
/**
* @dev constructor of CrowdsaleToken
**/
constructor() public {
currentStage = Stages.none;
balances[owner] = balances[owner].add(tokenReserve);
totalSupply_ = totalSupply_.add(tokenReserve);
remainingTokens = cap;
emit Transfer(address(this), owner, tokenReserve);
}
/**
* @dev fallback function to send ether to for Crowd sale
**/
function () public payable {
require(currentStage == Stages.icoStart);
require(msg.value > 0);
require(remainingTokens > 0);
uint256 weiAmount = msg.value; // Calculate tokens to sell
uint256 tokens = weiAmount.mul(basePrice).div(1 ether);
uint256 returnWei = 0;
if(tokensSold.add(tokens) > cap){
uint256 newTokens = cap.sub(tokensSold);
uint256 newWei = newTokens.div(basePrice).mul(1 ether);
returnWei = weiAmount.sub(newWei);
weiAmount = newWei;
tokens = newTokens;
}
tokensSold = tokensSold.add(tokens); // Increment raised amount
remainingTokens = cap.sub(tokensSold);
if(returnWei > 0){
msg.sender.transfer(returnWei);
emit Transfer(address(this), msg.sender, returnWei);
}
balances[msg.sender] = balances[msg.sender].add(tokens);
emit Transfer(address(this), msg.sender, tokens);
totalSupply_ = totalSupply_.add(tokens);
owner.transfer(weiAmount);// Send money to owner
}
/**
* @dev startIco starts the public ICO
**/
function startIco() public onlyOwner {
require(currentStage != Stages.icoEnd);
currentStage = Stages.icoStart;
}
/**
* @dev endIco closes down the ICO 
**/
function endIco() internal {
currentStage = Stages.icoEnd;
// Transfer any remaining tokens
if(remainingTokens > 0)
balances[owner] = balances[owner].add(remainingTokens);
// transfer any remaining ETH balance in the contract to the owner
owner.transfer(address(this).balance); 
}
/**
* @dev finalizeIco closes down the ICO and sets needed varriables
**/
function finalizeIco() public onlyOwner {
require(currentStage != Stages.icoEnd);
endIco();
}
}
/**
* @title LavevelToken 
* @dev Contract to create the Lavevel Token
**/
contract AlexToken is CrowdsaleToken {
string public constant name = "AlexToken";
string public constant symbol = "ALT";
uint32 public constant decimals = 18;
}

e a representación binaria tal e como a ve a rede

60806040526000600355600060045533600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560146101000a81548160ff021916908360028111156200006f57fe5b0217905550620001036b019d971e4fe8401e74000000600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200024a6401000000000262000b1d179091906401000000009004565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620001986b019d971e4fe8401e740000006001546200024a6401000000000262000b1d179091906401000000009004565b6001819055506b033b2e3c9fd0803ce8000000600481905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6b019d971e4fe8401e740000006040518082815260200191505060405180910390a362000267565b600081830190508281101515156200025e57fe5b80905092915050565b611cb880620002776000396000f300608060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146104c7578063095ea7b31461055757806318160ddd146105bc57806323b872dd146105e7578063313ce5671461066c578063355274ea146106a3578063518ab2a8146106ce57806366188463146106f957806370a082311461075e57806389311e6f146107b55780638da5cb5b146107cc578063903a3ef61461082357806395d89b411461083a578063a9059cbb146108ca578063bf5839031461092f578063c7876ea41461095a578063cbcb317114610985578063d73dd623146109b0578063dd62ed3e14610a15578063f2fde38b14610a8c575b60008060008060006001600281111561012757fe5b600560149054906101000a900460ff16600281111561014257fe5b14151561014e57600080fd5b60003411151561015d57600080fd5b600060045411151561016e57600080fd5b3494506101a7670de0b6b3a764000061019968056bc75e2d6310000088610acf90919063ffffffff16565b610b0790919063ffffffff16565b9350600092506b033b2e3c9fd0803ce80000006101cf85600354610b1d90919063ffffffff16565b111561024c576101f66003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b915061022e670de0b6b3a764000061022068056bc75e2d6310000085610b0790919063ffffffff16565b610acf90919063ffffffff16565b90506102438186610b3990919063ffffffff16565b92508094508193505b61026184600354610b1d90919063ffffffff16565b6003819055506102886003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b6004819055506000831115610344573373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156102dd573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b610395846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a361045184600154610b1d90919063ffffffff16565b600181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156104bf573d6000803e3d6000fd5b505050505050005b3480156104d357600080fd5b506104dc610b52565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b506105d1610c7d565b6040518082815260200191505060405180910390f35b3480156105f357600080fd5b50610652600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c87565b604051808215151515815260200191505060405180910390f35b34801561067857600080fd5b50610681611041565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3480156106af57600080fd5b506106b8611046565b6040518082815260200191505060405180910390f35b3480156106da57600080fd5b506106e3611056565b6040518082815260200191505060405180910390f35b34801561070557600080fd5b50610744600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061105c565b604051808215151515815260200191505060405180910390f35b34801561076a57600080fd5b5061079f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ed565b6040518082815260200191505060405180910390f35b3480156107c157600080fd5b506107ca611335565b005b3480156107d857600080fd5b506107e16113eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082f57600080fd5b50610838611411565b005b34801561084657600080fd5b5061084f6114ab565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088f578082015181840152602081019050610874565b50505050905090810190601f1680156108bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d657600080fd5b50610915600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b604051808215151515815260200191505060405180910390f35b34801561093b57600080fd5b50610944611703565b6040518082815260200191505060405180910390f35b34801561096657600080fd5b5061096f611709565b6040518082815260200191505060405180910390f35b34801561099157600080fd5b5061099a611716565b6040518082815260200191505060405180910390f35b3480156109bc57600080fd5b506109fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611726565b604051808215151515815260200191505060405180910390f35b348015610a2157600080fd5b50610a76600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611922565b6040518082815260200191505060405180910390f35b348015610a9857600080fd5b50610acd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a9565b005b600080831415610ae25760009050610b01565b8183029050818382811515610af357fe5b04141515610afd57fe5b8090505b92915050565b60008183811515610b1457fe5b04905092915050565b60008183019050828110151515610b3057fe5b80905092915050565b6000828211151515610b4757fe5b818303905092915050565b6040805190810160405280600981526020017f416c6578546f6b656e000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610cc457600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d1157600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d9c57600080fd5b610ded826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e80826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5182600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60035481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561116d576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611201565b6111808382610b3990919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561139157600080fd5b60028081111561139d57fe5b600560149054906101000a900460ff1660028111156113b857fe5b141515156113c557600080fd5b6001600560146101000a81548160ff021916908360028111156113e457fe5b0217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561146d57600080fd5b60028081111561147957fe5b600560149054906101000a900460ff16600281111561149457fe5b141515156114a157600080fd5b6114a9611b01565b565b6040805190810160405280600381526020017f414c54000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561152157600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561156e57600080fd5b6115bf826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611652826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60045481565b68056bc75e2d6310000081565b6b019d971e4fe8401e7400000081565b60006117b782600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a0557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611a4157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600560146101000a81548160ff02191690836002811115611b2057fe5b021790555060006004541115611c0a57611ba5600454600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611c89573d6000803e3d6000fd5b505600a165627a7a723058205bbef016cc7699572f944871cb6f05e69915ada3a92a1d9f03a3fb434aac0c2b0029

Podes atopar máis detalles sobre contratos intelixentes no artigo: Que son os contratos intelixentes en Ethereum.

Conclusión

Listamos as tecnoloxías nas que se constrúen as cadeas de bloques modernas e como están conectadas entre si. Agora imos formular cales son os problemas que se poden resolver usando a cadea de bloques e que solucións serán, no mellor dos casos, ineficaces. Polo tanto, usar blockchain non é necesario se:

  • As transaccións realízanse nun ambiente de confianza;
  • A presenza dunha comisión de intermediarios non empeora a vida dos participantes;
  • Os participantes non teñen propiedades que se poidan representar como activos dixitais;
  • Non hai distribución en activos dixitais, é dicir. o valor é propiedade ou proporcionado só por un participante.

Que futuro lle depara a blockchain? Agora só podemos especular sobre posibles formas de desenvolvemento das tecnoloxías blockchain:

  • Blockchain converterase na mesma tecnoloxía de bases de datos común que, por exemplo, SQL ou NoSQL para resolver a súa gama específica de problemas;
  • Blockchain converterase nun protocolo xeneralizado, como HTTP é para Internet;
  • Blockchain converterase na base dun novo sistema financeiro e político no planeta!

Na seguinte parte veremos que blockchains existen actualmente e por que se usan en diferentes industrias.

Este é só o comezo.

Fonte: www.habr.com

Engadir un comentario