Què hem de construir una cadena de blocs?

Tota la història de la humanitat és un procés continu de desfer-se de cadenes i crear-ne de noves, encara més fortes. (Autor anònim)

Analitzant nombrosos projectes blockchain (Bitshares, Hyperledger, Exonum, Ethereum, Bitcoin, etc.), entenc que des del punt de vista tècnic, tots estan construïts sobre els mateixos principis. Les cadenes de bloc recorden les cases que, malgrat tota la varietat de dissenys, decoracions i finalitats, tenen fonaments, parets, sostre, finestres, portes connectades entre si de determinades maneres. I si enteneu els principis bàsics del disseny d'edificis i coneixeu les propietats dels materials utilitzats, podeu determinar el propòsit previst d'una casa en particular. Actualment, s'ha produït una situació amb blockchain de la qual tothom n'ha sentit a parlar, però poca gent entén l'arquitectura i els principis de funcionament. Per tant, hi ha un malentès sobre per què i com té sentit utilitzar tecnologies blockchain.

En aquest article analitzarem les propietats i principis comuns a totes les cadenes de blocs. A continuació, mirem els problemes que es poden resoldre amb la cadena de blocs i per reforçar el material, construïm una cadena de blocs petita però real al nostre lloc virtual!

Per tant, recordem quins problemes van resoldre inicialment la cadena de blocs.

Estic segur que molts diran sobre una base de dades distribuïda, descentralitzada, pública i immutable. Però per què era necessari tot això?

Prefereixo començar a estudiar qualsevol tecnologia llegint els estàndards, ja que tots els articles i llibres sobre el tema que s'estudien es basen en ells. Però actualment no hi ha estàndards de blockchain; ISO només ha creat comitès pel seu desenvolupament. Actualment, cada projecte de blockchain públic té el seu propi document de Llibre blanc, que és essencialment una especificació tècnica. El primer projecte de cadena de blocs conegut públicament és la xarxa Bitcoin. Aneu al lloc web oficial de la xarxa i mira on va començar tot.

Repte Blockchain

Per tant, la tasca que blockchain va resoldre a la xarxa pionera de Bitcoin és dur a terme una transferència de propietat de confiança dels actius digitals (actius) en un entorn no fiable sense intermediaris. Per exemple, a la xarxa Bitcoin, un actiu digital són les monedes digitals bitcoin. I totes les solucions tècniques de Bitcoin i altres blockchains es redueixen a resoldre aquest problema.

Problemes que resol la cadena de blocs

Suposem que una determinada organització financera diu que ha creat una xarxa arreu del món amb l'ajuda de la qual és possible transferir diners a qualsevol persona. La creuràs? Si aquesta organització és Visa o MasterCard, el més probable és que s'ho cregui, però si, relativament parlant, AnonymousWorldMoney, probablement no ho farà. Per què? Però perquè sabem molt bé com es fan els sistemes distribuïts per empreses privades, amb quines finalitats i en què pot comportar això. Mirem més de prop els problemes d'aquests sistemes i com es poden resoldre mitjançant tecnologies blockchain.

Diguem que en el condicional AnonymousWorldMoney hi ha servidors amb bases de dades, i és bo que n'hi hagi diversos en diferents centres de dades. Quan el remitent transfereix diners, es registra una transacció, que es replica a tots els servidors i els diners arriben al destinatari.

Què hem de construir una cadena de blocs?

En un món ideal, aquest esquema funciona molt bé, però en el nostre sorgeixen els següents problemes:

  1. El problema d'identificar els participants, d'una banda, i la necessitat de l'anonimat de les transaccions, de l'altra. Aquells. heu de transferir diners a un destinatari específic i de tal manera que ningú sàpiga d'aquesta transacció excepte els participants de la transacció. Els bancs tenen números de compte i targetes bancàries vinculades a una persona física o jurídica concreta, i el secret bancari protegeix la informació de les transaccions. I qui garanteix que l'AnonymousWorldMoney condicional no utilitzi les dades personals i la informació de transaccions per a les seves pròpies finalitats?
  2. Com assegurar-se que el destinatari va rebre exactament l'import que se li va transferir? Relativament parlant, el remitent va transferir 100 dòlars i el destinatari va rebre 10 dòlars. El remitent arriba a l'oficina d'AnonymousWorldMoney amb el seu rebut, i el secretari mostra la seva versió, on està escrit que el remitent va transferir només 10 dòlars.
  3. El problema d'un entorn no fiable, per exemple, una estafa anomenada doble despesa. Un participant sense escrúpols pot gastar el seu saldo diverses vegades fins que el pagament es replica a tots els servidors. Teorema CAP, per descomptat, ningú cancel·larà, i finalment s'aconseguirà l'acord, però algú no rebrà diners per serveis o béns prestats. Per tant, si no hi ha una confiança total en l'organització de pagament o els participants en les transaccions, cal construir una xarxa basada no en la confiança, sinó en la criptografia.
  4. Condicional AnonymousWorldMoney té un nombre finit de servidors que poden no estar disponibles sense voler o per intenció maliciosa.
  5. AnonymousWorldMoney agafarà la seva pròpia comissió tangible.
  6. Possibilitat de control. Durant el funcionament de Bitcoin, va resultar que la gent no només vol transferir monedes entre si, sinó també comprovar diverses condicions per a la transacció, programar escenaris de treball, realitzar accions automàticament en funció de les condicions, etc.

Com la cadena de blocs resol aquests problemes

  1. La identificació dels participants es realitza mitjançant un parell de claus: privada i pública, i l'algoritme de signatura digital identifica de manera única l'emissor i el destinatari, deixant les seves identitats anònimes.
  2. Les transaccions es recullen en blocs, el hash del bloc es calcula i s'escriu al bloc següent. Aquesta seqüència d'enregistrament de hashes en blocs dóna nom a la tecnologia blockchain i també fa impossible canviar/suprimir de manera imperceptible blocs o transaccions individuals dels blocs. Així, si una transacció s'inclou a la cadena de blocs, podeu estar segur que les seves dades romandran sense canvis.
  3. El frau de doble despesa s'evita si s'aconsegueix un consens de xarxa sobre quines dades considerar vàlides i quines descartar. A la xarxa Bitcoin, el consens s'aconsegueix mitjançant la prova de treball (PoW).
  4. La fiabilitat de la xarxa s'aconsegueix pel fet que la cadena de blocs és pública, on cada participant pot executar el seu propi node, rebre una còpia completa de la cadena de blocs i, a més, començar de manera independent a comprovar la correcció de les transaccions. Cal tenir en compte que les cadenes de blocs modernes permeten construir no només cadenes de blocs públiques (obertes) sinó també privades (tancades), així com l'ús d'esquemes combinats.
  5. La cadena de blocs no s'eliminarà completament de les comissions, perquè... has de pagar a les persones que donen suport a la xarxa, però en la cadena de blocs la necessitat d'una comissió està demostrada de manera tan convincent que no hi ha cap dubte sobre la seva necessitat.
  6. Les cadenes de blocs modernes tenen la capacitat d'implementar la lògica empresarial, que a la cadena de blocs s'anomena contractes intel·ligents. La lògica dels contractes intel·ligents s'implementa en diversos llenguatges d'alt nivell.

A continuació, analitzarem aquestes solucions amb més detall.

Arquitectura Blockchain

Components de Blockchain

Cada participant pot llançar el seu propi node amb una còpia completa de la cadena de blocs (node ​​complet). S'anomenen nodes complets que poden registrar transaccions a la cadena de blocs nodes de consens (testimoni) o miners (miner). S'anomenen nodes complets que només comproven la correcció de les transaccions nodes d'auditoria (auditoria). Clients lleugers (clients lleugers) no emmagatzemen còpies completes de la cadena de blocs, sinó que interactuen amb la xarxa mitjançant nodes complets.
La majoria dels usuaris utilitzen clients lleugers o carteres web per fer transaccions. Tots els nodes estan connectats entre si. Amb aquest conjunt d'elements, l'arquitectura de xarxa es torna més estable:

Què hem de construir una cadena de blocs?

Cicle de vida de la transacció

Mirem el cicle de vida de la transacció i desglossem-lo peça per peça:

Què hem de construir una cadena de blocs?

Tecnologies Blockchain

Anem a detenir-nos amb més detall en les solucions tècniques i les seves connexions entre elles.

Identificació

Cada transacció de cadena de blocs ha d'estar signada digitalment. Per tant, per completar una transacció, cada participant ha de tenir un parell de claus: privat / públic. De vegades un parell de claus s'anomena cartera, perquè les claus s'associen de manera única amb l'adreça digital i el saldo únics del participant. En realitat, les claus i les adreces són només cadenes de números en diferents sistemes numèrics. Exemples de claus i adreces de cartera:

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

Per crear una signatura digital en blockchains, s'utilitza un algorisme basat en corbes el·líptiques: Elliptic Curve Digital Signature Algorithm (ECDSA). Perquè funcioni, la clau privada (número de 256 bits) es pren normalment de manera aleatòria. El nombre d'opcions de clau és de 2 a la potència de 256, de manera que podem parlar de la impossibilitat pràctica de fer coincidir els valors de les claus privades.

A continuació, la clau pública s'obté de la privada multiplicant el seu valor per les coordenades d'un punt situat a la corba el·líptica, donant com a resultat les coordenades d'un nou punt de la mateixa corba. Aquesta acció garanteix que obtingueu un parell de claus adequat per a la signatura digital de transaccions. Finalment, l'adreça de la cartera es deriva exclusivament de la clau pública.

Hi ha molts articles amb detalls sobre la criptografia utilitzada en blockchain, per exemple: Bitcoin en poques paraules: criptografia

La clau privada ha de ser estrictament confidencial i mantenir-se segura. La clau pública és coneguda per tothom. Si es perd la clau privada, l'accés a l'actiu (monedes) no es pot restaurar i els diners es perdran per sempre. Per tant, la tasca d'emmagatzemar de manera segura les claus privades és extremadament rellevant, perquè Aquest no és un banc on sempre podeu venir amb el vostre passaport i restaurar el vostre compte. Hi ha tota una indústria per a la producció de les anomenades moneders criptogràfics en fred, similars a les unitats flash:

Què hem de construir una cadena de blocs?

o podeu utilitzar mètodes més fiables, per exemple, estampar el valor de la clau privada als testimonis:

Què hem de construir una cadena de blocs?

Transaccions

Podeu trobar més detalls sobre l'estructura de la transacció a l'article Bitcoin en poques paraules - Transacció. És important que entenem que cada transacció té almenys les dades següents:

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

A continuació, la transacció es signa amb una clau privada i s'envia (vegeu els detalls sobre el funcionament del protocol Bitcoin en poques paraules-Protocol) a tots els nodes de la cadena de blocs que comproven la validesa de les transaccions. L'algoritme de verificació de transaccions no és trivial i inclou dues dotzenes de passos.

Blocs de transaccions

Després de comprovar la validesa de les transaccions, els nodes formen blocs a partir d'elles. A més de les transaccions, el hash del bloc anterior i un número (comptador Nonce) s'escriuen al bloc, i el hash del bloc actual es calcula mitjançant l'algorisme SHA-256. El hash ha de tenir unes condicions de complexitat establertes. Per exemple, a la xarxa Bitcoin, la dificultat del hash es canvia automàticament cada 2 setmanes en funció de la potència de la xarxa, de manera que es genera un bloc aproximadament cada 10 minuts. La complexitat ve determinada per la condició següent: el hash trobat ha de ser inferior a un nombre predeterminat. Si aquesta condició no es compleix, s'afegeix 1 al Nonce i es repeteix el treball de càlcul del hash. Per seleccionar un hash, s'utilitza el camp Nonce, perquè Aquestes són les úniques dades del bloc que es poden modificar; la resta ha de romandre sense canvis. Un hash vàlid ha de tenir un cert nombre de zeros inicials, com ara un dels hash reals:

000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91

Trobar amb èxit un hash és una prova del treball realitzat (Proof-of-Work, PoW) per a les xarxes Bitcoin o Ethereum. El procés de trobar hash s'anomena mineria, similar a la mineria d'or. El nom defineix amb força precisió l'essència del procés, perquè hi ha una simple cerca d'opcions, i si algú troba un hash adequat, això és realment sort. És com trobar una autèntica pepita d'or en tones de roques residuals. La recompensa del bloc és ara 12.5 BTC i si la multipliqueu per la taxa actual de Bitcoin de 3900 dòlars, obtindreu més d'un quilo d'or pur. Hi ha per què lluitar!

Després de trobar amb èxit un hash, el bloc i el hash trobat s'escriuen a la cadena de blocs com el següent bloc. Podeu trobar més detalls sobre l'estructura dels blocs a l'article Bitcoin en poques paraules-Blockchain, i a continuació es mostra un diagrama simplificat:

Què hem de construir una cadena de blocs?

La cadena de blocs comença amb un bloc que encara no té el hash del bloc anterior. Només hi ha un d'aquests blocs a la cadena de blocs i té el seu propi nom Genesis block. Els blocs restants tenen la mateixa estructura i només es diferencien pel nombre de transaccions. Les transaccions reals i els blocs que s'estan creant actualment a Bitcoin o Ethereum es poden veure a Explorador de blocs.

La mida dels blocs en Bitcoin està limitada a 1 MB i amb una quantitat mínima d'informació en una transacció d'uns 200 bytes, el nombre màxim de transaccions en un bloc pot ser d'uns 6000. A partir d'aquí, per cert, segueix el rendiment de Bitcoin, del qual tothom es riu: es genera un bloc aproximadament una vegada cada 10 minuts * 60 segons = 600 segons, la qual cosa dóna un rendiment formal d'uns 10 TPS. Tot i que, de fet, això no és productivitat, sinó un algorisme de treball implementat deliberadament. A Ethereum, per competir, simplement van fer que el temps de generació de blocs fos de 15 segons. i la productivitat es va disparar formalment. Per tant, a les cadenes de blocs que utilitzen PoW com a consens, no té cap sentit comparar el rendiment, perquè depèn directament de la complexitat del càlcul de la memòria cau, que es pot assignar a qualsevol valor.

Forquilles

Què passa si, per exemple, diversos nodes troben hash que compleixen les condicions de complexitat, però tenen un valor diferent (és a dir, van arribar a diferents consensos) i van escriure blocs a la cadena de blocs? Vegem com la cadena de blocs protegeix contra aquesta situació. En aquest cas, es produeix l'anomenada bifurcació i la cadena de blocs té dues versions de la cadena:

Què hem de construir una cadena de blocs?

Què passa després? A continuació, una part de la xarxa comença a treballar al bloc N+2 d'una cadena i una part d'una altra:

Què hem de construir una cadena de blocs?

Un d'aquests blocs es trobarà abans i s'enviarà a la cadena de blocs, i després, segons les regles, la cadena de blocs haurà de canviar a una cadena més llarga i cancel·lar totes les transaccions del bloc alternatiu:

Què hem de construir una cadena de blocs?

Al mateix temps, pot sorgir una situació quan la transacció d'un participant només es trobava en un dels blocs de bifurcació, que es va cancel·lar. Per tant, per assegurar-vos que la transacció desitjada es registra a la cadena de blocs, hi ha una recomanació general: abans de confiar en la transacció, hauríeu d'esperar fins que s'afegeixin els següents blocs a la cadena de blocs. Les recomanacions sobre quants blocs cal esperar per a diferents blockchains varien. Per exemple, per a la xarxa Bitcoin el mínim és de 2 blocs, el màxim és de 6.

La mateixa imatge amb les bifurcacions de blocs s'observarà durant l'anomenat atac del 51%: és quan un grup de miners intenta fer créixer una cadena de blocs alternativa, buscant cancel·lar la cadena amb les seves transaccions fraudulentes. Encara que actualment, en comptes de frau, és més rendible gastar el teu poder en mineria honesta.

Consens

Per gravar un bloc a la cadena de blocs, la xarxa ha d'arribar a un consens. Recordem la tasca d'aconseguir consens a les xarxes de comunicació informàtica. El problema es formula com a tasca dels generals bizantins BFT (Tolerància a les falles bizantines). Ometint la descripció pintoresca dels problemes de l'exèrcit bizantí, el problema es pot formular de la següent manera: com poden els nodes de xarxa arribar a un resultat comú si alguns nodes de xarxa poden distorsionar-los deliberadament? Els algorismes existents per resoldre el problema de BFT mostren que la xarxa pot funcionar correctament si hi ha menys d'1/3 dels estafadors. Per què no s'ha aplicat el consens BFT a la xarxa Bitcoin? Per què va ser necessari utilitzar PoW? Hi ha diversos motius:

  • BFT funciona bé amb un petit conjunt fix de nodes, però en una cadena de blocs pública el nombre de nodes és impredictible i, a més, els nodes es poden activar i apagar aleatòriament.
  • Cal motivar la gent per llançar nodes blockchain. Per fer-ho, la gent ha de ser recompensada. A BFT formalment no hi ha res per rebre una recompensa, però el que és la recompensa a PoW és clar per a tothom a nivell intuïtiu: per l'electricitat que consumeix el processador en el procés de trobar el hash de bloc.

A més de PoW, hi ha diversos altres consensos que s'utilitzen a les cadenes de blocs modernes, per exemple:

  • PoS (Proof-of-Stake): a la cadena de blocs Hyperledger
  • DPoS (Delegated Proof-of-Stake): a la cadena de blocs BitShares
  • Modificacions de BFT: SBFT (BFT simplificat) i PBFT (BFT pràctica), per exemple en blockchain Exònum

Ens detenem una mica en el consens PoS, perquè... És PoS i les seves varietats les que estan més esteses a les blockchains privades. Per què en privat? D'una banda, les característiques de PoS són millors en comparació amb PoW, perquè per aconseguir consens, es necessiten menys recursos informàtics, la qual cosa significa que augmenta la velocitat d'escriptura de dades a la cadena de blocs. Però, d'altra banda, el PoS té més oportunitats de frau, de manera que per neutralitzar-ho, cal conèixer tots els participants de la cadena de blocs.

El consens PoS es basa en la selecció d'un node que pot escriure un bloc amb transaccions a la cadena de blocs en funció de la quantitat de fons del compte, o més aviat, no al compte, sinó a la garantia, és a dir. Com més fons tingueu com a garantia, més probabilitat és que la xarxa triï el vostre node per escriure un bloc. El dipòsit no es retornarà si el bloc no és vàlid. Això proporciona protecció contra el frau. Hi ha les següents variacions de PoS:

  • El consens de Delegated PoS (DPoS) divideix els participants en "votants" i "validadors". Els titulars de monedes (participants amb vot) deleguen el seu poder per verificar i registrar transaccions a la cadena de blocs a altres participants. Així, els validadors fan tot el treball computacional i reben una recompensa per això, i la presència dels votants garanteix l'honestedat dels validadors, perquè es poden canviar en qualsevol moment.
  • El consens LPoS (Leased Proof-of-Stake) us permet llogar els vostres fons a altres nodes perquè tinguin més possibilitats de validar blocs. Això. Podeu rebre una comissió per transaccions sense participar en la verificació de la transacció real i la mineria de bloqueig.

Hi ha una sèrie d'altres consensos que encara no s'utilitzen àmpliament, només els enumeraré aquí per obtenir informació i es pot trobar una visió general dels propis algorismes de consens, per exemple, a l'article: Algoritmes de consens en Blockchain.

  • PoET (Prova de temps transcorregut)
  • PoC (prova de capacitat)
  • PoB (prova de cremada)
  • PoWeight (prova de pes)
  • PoA (Prova d'activitat) - PoW + PoS
  • PoI (prova d'importància)

Models de fiabilitat i desplegament de blockchains

Blockchain pública

Resiliència Públic o un altre nom Blockchain sense permís Això s'aconsegueix permetent a qualsevol persona connectar-se i veure informació o fins i tot connectar el seu propi node, i la confiança es basa en el consens PoW.

Blockchain privada

Privat o Blockchain privat permès. En aquestes cadenes de blocs, només un determinat grup de participants (organitzacions o persones) tenen accés a la informació. Aquestes cadenes de bloc són construïdes per organitzacions amb l'objectiu d'augmentar el benefici o l'eficiència generals. La seva fiabilitat està assegurada pels objectius comuns dels participants i els algorismes de consens PoS i BFT.

Consorci Blockchain

Hi Consorci o Blockchain amb permís públic. Es tracta de cadenes de blocs a les quals qualsevol pot connectar-se per veure'ls, però un participant pot afegir informació o connectar el seu node només amb el permís d'altres participants. Aquestes cadenes de blocs les construeixen les organitzacions per tal d'augmentar la confiança per part dels clients o consumidors de productes o de la societat en general. Aquí, la fiabilitat també s'aconsegueix mitjançant la presència de confiança entre els participants i els mateixos algorismes de consens PoS i BFT.

Contractes intel·ligents

Les cadenes de blocs implementades després de Bitcoin han afegit, en un grau o un altre, la capacitat d'executar contractes intel·ligents. Essencialment, un contracte intel·ligent és una transacció en la qual es col·loca el codi del programa per a l'execució. Els contractes intel·ligents a la xarxa Ethereum s'executen a l'EVM (Ethereum Virtual Machine). Per començar a executar un contracte intel·ligent, s'ha de llançar explícitament per una altra transacció o s'han de complir les condicions prèvies per a l'execució. Els resultats de l'execució del contracte intel·ligent també es registraran a la cadena de blocs. És possible rebre dades des de fora de la cadena de blocs, però molt limitat.

Quina lògica empresarial es pot implementar mitjançant un contracte intel·ligent? De fet, no hi ha gaire, per exemple, comprovar les condicions utilitzant dades de la cadena de blocs, canviar els propietaris dels actius digitals en funció d'aquestes condicions, registrar dades en un emmagatzematge permanent dins de la cadena de blocs. La lògica s'implementa en un llenguatge especial d'alt nivell Solidity.

Un exemple clàssic de funcionalitat que s'implementa mitjançant contractes intel·ligents és l'emissió de fitxes per a ICO. Per exemple, vaig implementar un contracte intel·ligent per emetre un modest AlexToken de 500. Per enllaç a Etherscan és

codi font del contracte intel·ligent en llenguatge 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;
}

i la representació binària tal com la veu la xarxa

60806040526000600355600060045533600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560146101000a81548160ff021916908360028111156200006f57fe5b0217905550620001036b019d971e4fe8401e74000000600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200024a6401000000000262000b1d179091906401000000009004565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620001986b019d971e4fe8401e740000006001546200024a6401000000000262000b1d179091906401000000009004565b6001819055506b033b2e3c9fd0803ce8000000600481905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6b019d971e4fe8401e740000006040518082815260200191505060405180910390a362000267565b600081830190508281101515156200025e57fe5b80905092915050565b611cb880620002776000396000f300608060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146104c7578063095ea7b31461055757806318160ddd146105bc57806323b872dd146105e7578063313ce5671461066c578063355274ea146106a3578063518ab2a8146106ce57806366188463146106f957806370a082311461075e57806389311e6f146107b55780638da5cb5b146107cc578063903a3ef61461082357806395d89b411461083a578063a9059cbb146108ca578063bf5839031461092f578063c7876ea41461095a578063cbcb317114610985578063d73dd623146109b0578063dd62ed3e14610a15578063f2fde38b14610a8c575b60008060008060006001600281111561012757fe5b600560149054906101000a900460ff16600281111561014257fe5b14151561014e57600080fd5b60003411151561015d57600080fd5b600060045411151561016e57600080fd5b3494506101a7670de0b6b3a764000061019968056bc75e2d6310000088610acf90919063ffffffff16565b610b0790919063ffffffff16565b9350600092506b033b2e3c9fd0803ce80000006101cf85600354610b1d90919063ffffffff16565b111561024c576101f66003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b915061022e670de0b6b3a764000061022068056bc75e2d6310000085610b0790919063ffffffff16565b610acf90919063ffffffff16565b90506102438186610b3990919063ffffffff16565b92508094508193505b61026184600354610b1d90919063ffffffff16565b6003819055506102886003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b6004819055506000831115610344573373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156102dd573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b610395846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a361045184600154610b1d90919063ffffffff16565b600181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156104bf573d6000803e3d6000fd5b505050505050005b3480156104d357600080fd5b506104dc610b52565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b506105d1610c7d565b6040518082815260200191505060405180910390f35b3480156105f357600080fd5b50610652600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c87565b604051808215151515815260200191505060405180910390f35b34801561067857600080fd5b50610681611041565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3480156106af57600080fd5b506106b8611046565b6040518082815260200191505060405180910390f35b3480156106da57600080fd5b506106e3611056565b6040518082815260200191505060405180910390f35b34801561070557600080fd5b50610744600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061105c565b604051808215151515815260200191505060405180910390f35b34801561076a57600080fd5b5061079f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ed565b6040518082815260200191505060405180910390f35b3480156107c157600080fd5b506107ca611335565b005b3480156107d857600080fd5b506107e16113eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082f57600080fd5b50610838611411565b005b34801561084657600080fd5b5061084f6114ab565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088f578082015181840152602081019050610874565b50505050905090810190601f1680156108bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d657600080fd5b50610915600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b604051808215151515815260200191505060405180910390f35b34801561093b57600080fd5b50610944611703565b6040518082815260200191505060405180910390f35b34801561096657600080fd5b5061096f611709565b6040518082815260200191505060405180910390f35b34801561099157600080fd5b5061099a611716565b6040518082815260200191505060405180910390f35b3480156109bc57600080fd5b506109fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611726565b604051808215151515815260200191505060405180910390f35b348015610a2157600080fd5b50610a76600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611922565b6040518082815260200191505060405180910390f35b348015610a9857600080fd5b50610acd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a9565b005b600080831415610ae25760009050610b01565b8183029050818382811515610af357fe5b04141515610afd57fe5b8090505b92915050565b60008183811515610b1457fe5b04905092915050565b60008183019050828110151515610b3057fe5b80905092915050565b6000828211151515610b4757fe5b818303905092915050565b6040805190810160405280600981526020017f416c6578546f6b656e000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610cc457600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d1157600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d9c57600080fd5b610ded826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e80826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5182600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60035481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561116d576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611201565b6111808382610b3990919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561139157600080fd5b60028081111561139d57fe5b600560149054906101000a900460ff1660028111156113b857fe5b141515156113c557600080fd5b6001600560146101000a81548160ff021916908360028111156113e457fe5b0217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561146d57600080fd5b60028081111561147957fe5b600560149054906101000a900460ff16600281111561149457fe5b141515156114a157600080fd5b6114a9611b01565b565b6040805190810160405280600381526020017f414c54000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561152157600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561156e57600080fd5b6115bf826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611652826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60045481565b68056bc75e2d6310000081565b6b019d971e4fe8401e7400000081565b60006117b782600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a0557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611a4157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600560146101000a81548160ff02191690836002811115611b2057fe5b021790555060006004541115611c0a57611ba5600454600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611c89573d6000803e3d6000fd5b505600a165627a7a723058205bbef016cc7699572f944871cb6f05e69915ada3a92a1d9f03a3fb434aac0c2b0029

Podeu trobar més detalls sobre els contractes intel·ligents a l'article: Què són els contractes intel·ligents a Ethereum.

Conclusió

Hem enumerat les tecnologies sobre les quals es construeixen les cadenes de blocs modernes i com estan connectades entre si. Ara formulem quins problemes es poden resoldre amb blockchain i quines solucions seran, en el millor dels casos, ineficaces. Per tant, utilitzar blockchain no és necessari si:

  • Les transaccions es realitzen en un entorn de confiança;
  • La presència d'una comissió d'intermediaris no empitjora la vida dels participants;
  • Els participants no tenen propietats que es puguin representar com a actius digitals;
  • No hi ha distribució en actius digitals, és a dir. el valor és propietat o el subministra només un participant.

Què depara el futur per a blockchain? Ara només podem especular sobre possibles maneres de desenvolupar tecnologies blockchain:

  • Blockchain es convertirà en la mateixa tecnologia de bases de dades comuna que, per exemple, SQL o NoSQL per resoldre el seu ventall específic de problemes;
  • Blockchain es convertirà en un protocol generalitzat, com HTTP ho és per a Internet;
  • Blockchain es convertirà en la base d'un nou sistema financer i polític al planeta!

A la següent part veurem quines cadenes de blocs existeixen actualment i per què s'utilitzen en diferents indústries.

Això és només el principi!

Font: www.habr.com

Afegeix comentari