Cosa dovremmo costruire una blockchain?

L'intera storia dell'umanità è un processo continuo di eliminazione delle catene e di creazione di nuove, ancora più forti. (Autore anonimo)

Analizzando numerosi progetti blockchain (Bitshares, Hyperledger, Exonum, Ethereum, Bitcoin, ecc.), capisco che da un punto di vista tecnico sono tutti costruiti sugli stessi principi. Le blockchain ricordano le case che, nonostante tutta la varietà di design, decorazioni e scopi, hanno fondamenta, muri, tetto, finestre, porte che sono collegate tra loro in certi modi. E se comprendi i principi di base della progettazione edilizia e conosci le proprietà dei materiali utilizzati, puoi determinare lo scopo previsto di una particolare casa. Attualmente, con la blockchain si è creata una situazione di cui tutti ne hanno sentito parlare, ma poche persone ne comprendono l'architettura e i principi di funzionamento. Pertanto, c’è un malinteso sul perché e come abbia senso utilizzare le tecnologie blockchain.

In questo articolo analizzeremo le proprietà e i principi comuni a tutte le blockchain. Successivamente, diamo un'occhiata ai problemi che possono essere risolti utilizzando la blockchain e per rinforzare il materiale, costruiamo una piccola ma vera blockchain sul nostro sito virtuale!

Quindi, ricordiamo quali problemi la blockchain ha inizialmente risolto.

Sono sicuro che molti diranno di un database distribuito, decentralizzato, pubblico e immutabile. Ma perché tutto ciò era necessario?

Preferisco iniziare a studiare qualsiasi tecnologia leggendo gli standard, poiché tutti gli articoli e i libri sull'argomento in studio si basano su di essi. Ma attualmente non esistono standard blockchain; l’ISO ha solo creato comitati per il loro sviluppo. Attualmente, ogni progetto blockchain pubblico ha il proprio documento White Paper, che è essenzialmente una specifica tecnica. Il primo progetto blockchain pubblicamente noto è la rete Bitcoin. Vai al sito ufficiale della rete e guardare dove tutto ha avuto inizio.

Sfida sulla blockchain

Pertanto, il compito che la blockchain ha risolto nella rete pioniera di Bitcoin è quello di effettuare un trasferimento affidabile della proprietà delle risorse digitali (risorse) in un ambiente non affidabile senza intermediari. Ad esempio, nella rete Bitcoin, una risorsa digitale sono le monete digitali bitcoin. E tutte le soluzioni tecniche di Bitcoin e di altre blockchain si riducono a risolvere questo problema.

Problemi che la blockchain risolve

Supponiamo che una certa organizzazione finanziaria affermi di aver costruito una rete in tutto il mondo con l'aiuto della quale è possibile trasferire denaro a qualsiasi persona. Le crederai? Se questa organizzazione è Visa o MasterCard, molto probabilmente ci crederai, ma se, relativamente parlando, AnonymousWorldMoney, probabilmente non ci crederai. Perché? Ma perché sappiamo benissimo come vengono realizzati i sistemi distribuiti dalle aziende private, per quali scopi e cosa questo può comportare. Diamo uno sguardo più da vicino ai problemi di tali sistemi e a come possono essere risolti utilizzando le tecnologie blockchain.

Diciamo che nel condizionale AnonymousWorldMoney ci sono server con database, ed è positivo se ce ne sono molti in diversi data center. Quando il mittente trasferisce denaro, viene registrata una transazione, che viene replicata su tutti i server e il denaro raggiunge il destinatario.

Cosa dovremmo costruire una blockchain?

In un mondo ideale, questo schema funziona alla grande, ma nel nostro sorgono i seguenti problemi:

  1. Il problema dell’identificazione dei partecipanti da un lato e la necessità dell’anonimato delle transazioni dall’altro. Quelli. è necessario trasferire denaro a un destinatario specifico e in modo tale che nessuno sia a conoscenza di questa transazione tranne i partecipanti alla transazione. Le banche hanno numeri di conto e carte bancarie collegati a una specifica persona fisica o giuridica e il segreto bancario protegge le informazioni sulle transazioni. E chi garantisce che il condizionale AnonymousWorldMoney non utilizzi i dati personali e le informazioni sulle transazioni per i propri scopi?
  2. Come assicurarsi che il destinatario abbia ricevuto esattamente l'importo che gli è stato trasferito? Relativamente parlando, il mittente ha trasferito $ 100 e il destinatario ha ricevuto $ 10. Il mittente si presenta all'ufficio di AnonymousWorldMoney con la ricevuta e l'impiegato mostra la sua versione, dove è scritto che il mittente ha trasferito solo 10 dollari.
  3. Il problema di un ambiente non affidabile, ad esempio, una truffa chiamata double-spending. Un partecipante senza scrupoli può spendere il suo saldo più volte finché il pagamento non viene replicato su tutti i server. Teorema del CAP, ovviamente, nessuno ha annullato e alla fine l'accordo verrà raggiunto, ma qualcuno non riceverà denaro per i servizi o i beni forniti. Pertanto, se non c'è completa fiducia nell'organizzazione di pagamento o nei partecipanti alle transazioni, è necessario costruire una rete basata non sulla fiducia, ma sulla crittografia.
  4. AnonymousWorldMoney condizionale ha un numero finito di server che potrebbero diventare non disponibili involontariamente o a causa di intenti dannosi.
  5. AnonymousWorldMoney prenderà la propria commissione tangibile.
  6. Possibilità di controllo. Durante il funzionamento di Bitcoin, si è scoperto che le persone vogliono non solo trasferire monete tra loro, ma anche verificare varie condizioni per la transazione, programmare scenari di lavoro, eseguire automaticamente azioni a seconda delle condizioni, ecc.

Come la blockchain risolve questi problemi

  1. L'identificazione dei partecipanti avviene tramite una coppia di chiavi: privata e pubblica, e l'algoritmo di firma digitale identifica in modo univoco mittente e destinatario, lasciando anonime le loro identità.
  2. Le transazioni vengono raccolte in blocchi, l'hash del blocco viene calcolato e scritto nel blocco successivo. Questa sequenza di registrazione degli hash nei blocchi dà il nome alla tecnologia blockchain e rende anche impossibile modificare/eliminare in modo impercettibile i blocchi o le singole transazioni dai blocchi. Pertanto, se una transazione viene inclusa nella blockchain, puoi essere certo che i suoi dati rimarranno invariati.
  3. Le frodi legate alla doppia spesa vengono prevenute raggiungendo un consenso di rete su quali dati considerare validi e quali scartare. Nella rete Bitcoin, il consenso viene raggiunto tramite la prova del lavoro (PoW).
  4. L'affidabilità della rete è raggiunta dal fatto che la blockchain è pubblica, dove ogni partecipante può gestire il proprio nodo, ricevere una copia completa della blockchain e, inoltre, iniziare autonomamente a verificare la correttezza delle transazioni. Va notato che le blockchain moderne consentono di costruire non solo blockchain pubbliche (aperte) ma anche private (chiuse), nonché l’uso di schemi combinati.
  5. La blockchain non eliminerà completamente le commissioni, perché... devi pagare le persone che supportano la rete, ma nella blockchain la necessità di una commissione è dimostrata in modo così convincente che non ci sono dubbi sulla sua necessità.
  6. Le blockchain moderne hanno la capacità di implementare la logica aziendale, che nella blockchain si chiama Smart Contracts. La logica dei contratti intelligenti è implementata in vari linguaggi di alto livello.

Successivamente considereremo queste soluzioni in modo più dettagliato.

Architettura blockchain

Componenti della blockchain

Ogni partecipante può lanciare il proprio nodo con una copia completa della blockchain (full node). Vengono chiamati i full node che possono registrare transazioni sulla blockchain nodi di consenso (testimone) o minatori (minatore). Vengono chiamati i nodi completi che controllano solo la correttezza delle transazioni nodi di controllo (controllo). Clienti leggeri (client leggeri) non archiviano copie complete della blockchain, ma interagiscono con la rete utilizzando i nodi completi.
La maggior parte degli utenti utilizza client leggeri o portafogli Web per effettuare transazioni. Tutti i nodi sono collegati tra loro. Con questo insieme di elementi l’architettura di rete diventa più stabile:

Cosa dovremmo costruire una blockchain?

Ciclo di vita della transazione

Diamo un'occhiata al ciclo di vita della transazione e analizziamolo pezzo per pezzo:

Cosa dovremmo costruire una blockchain?

Tecnologie blockchain

Soffermiamoci più in dettaglio sulle soluzioni tecniche e sulle loro connessioni tra loro.

identificazione

Ogni transazione blockchain deve essere firmata digitalmente. Pertanto, per completare una transazione, ogni partecipante deve possedere una coppia di chiavi: privata/pubblica. A volte una coppia di chiavi viene chiamata portafoglio, perché le chiavi sono associate in modo univoco all'indirizzo digitale e al saldo univoci del partecipante. In realtà, chiavi e indirizzi sono solo stringhe di numeri in diversi sistemi numerici. Esempi di chiavi e indirizzi di portafoglio:

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

Per creare una firma digitale nelle blockchain viene utilizzato un algoritmo basato su curve ellittiche: Elliptic Curve Digital Signature Algorithm (ECDSA). Affinché funzioni, la chiave privata (numero a 256 bit) viene solitamente presa in modo casuale. Il numero di opzioni chiave è 2 elevato a 256, quindi possiamo parlare dell'impossibilità pratica di far corrispondere i valori delle chiavi private.

Successivamente, la chiave pubblica si ottiene da quella privata moltiplicando il suo valore per le coordinate di un punto situato sulla curva ellittica, ottenendo le coordinate di un nuovo punto sulla stessa curva. Questa azione garantisce di ottenere una coppia di chiavi adatta alla firma digitale delle transazioni. Infine, l'indirizzo del portafoglio è derivato in modo univoco dalla chiave pubblica.

Ci sono molti articoli con dettagli sulla crittografia utilizzata nella blockchain, ad esempio: Bitcoin in poche parole – Crittografia

La chiave privata deve essere strettamente confidenziale e mantenuta sicura. La chiave pubblica è nota a tutti. Se la chiave privata viene persa, l’accesso al bene (monete) non potrà essere ripristinato e il denaro andrà perso per sempre. Pertanto, il compito di archiviare in modo sicuro le chiavi private è estremamente rilevante, perché Questa non è una banca dove puoi sempre venire con il tuo passaporto e ripristinare il tuo account. Esiste un intero settore per la produzione dei cosiddetti portafogli crittografici freddi, simili alle unità flash:

Cosa dovremmo costruire una blockchain?

oppure puoi utilizzare metodi più affidabili, ad esempio stampigliando il valore della chiave privata sui token:

Cosa dovremmo costruire una blockchain?

Operazioni

Maggiori dettagli sulla struttura della transazione possono essere trovati nell'articolo Bitcoin in poche parole – Transazione. Per noi è importante comprendere che ogni transazione contenga almeno i seguenti dati:

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

Successivamente la transazione viene firmata con una chiave privata e inviata (vedi dettagli sul funzionamento del protocollo Bitcoin in breve-Protocollo) a tutti i nodi della blockchain che controllano la validità delle transazioni. L'algoritmo di verifica delle transazioni non è banale e include due dozzine di passi.

Blocchi di transazione

Dopo aver verificato la validità delle transazioni, i nodi ne formano i blocchi. Oltre alle transazioni, nel blocco vengono scritti l'hash del blocco precedente e un numero (contatore Nonce) e l'hash del blocco corrente viene calcolato utilizzando l'algoritmo SHA-256. L'hash deve aver stabilito condizioni di complessità. Ad esempio, nella rete Bitcoin, la difficoltà dell'hash viene modificata automaticamente ogni 2 settimane a seconda della potenza della rete, in modo che venga generato un blocco circa una volta ogni 10 minuti. La complessità è determinata dalla seguente condizione: l'hash trovato deve essere inferiore ad un numero prestabilito. Se questa condizione non è soddisfatta, viene aggiunto 1 al Nonce e il lavoro di calcolo dell'hash viene ripetuto. Per selezionare un hash viene utilizzato il campo Nonce, perché Questo è l'unico dato del blocco che può essere modificato; il resto deve rimanere invariato. Un hash valido deve avere un certo numero di zeri iniziali, come uno degli hash reali:

000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91

Trovare con successo un hash è la prova del lavoro svolto (Proof-of-Work, PoW) per le reti Bitcoin o Ethereum. Il processo di ricerca degli hash è chiamato mining, simile all’estrazione dell’oro. Il nome definisce in modo abbastanza accurato l'essenza del processo, perché c'è una semplice ricerca di opzioni e se qualcuno trova un hash adatto, allora è davvero fortuna. È come trovare una vera pepita d'oro in tonnellate di roccia di scarto. La ricompensa per blocco è ora di 12.5 BTC e se la moltiplichi per l'attuale tasso di Bitcoin di $ 3900, ottieni più di un chilogrammo di oro puro. C'è qualcosa per cui lottare!

Dopo aver trovato con successo un hash, il blocco e l'hash stesso trovato vengono scritti sulla blockchain come blocco successivo. Maggiori dettagli sulla struttura dei blocchi possono essere trovati nell'articolo Bitcoin in breve: Blockchain, e di seguito è riportato un diagramma semplificato:

Cosa dovremmo costruire una blockchain?

La blockchain inizia con un blocco che non ha ancora l’hash del blocco precedente. Esiste un solo blocco di questo tipo nella blockchain e ha il proprio nome blocco Genesis. I restanti blocchi hanno la stessa struttura e differiscono solo per il numero di transazioni. È possibile visualizzare le transazioni reali e i blocchi attualmente creati in Bitcoin o Ethereum Block Explorer.

La dimensione dei blocchi in Bitcoin è limitata a 1 MB e con una quantità minima di informazioni in una transazione di circa 200 byte, il numero massimo di transazioni in un blocco può essere di circa 6000. Da qui, tra l'altro, segue la performance di Bitcoin, di cui tutti ridono: circa una volta ogni 10 minuti * 60 secondi = 600 secondi viene generato un blocco, che dà una prestazione formale di circa 10 TPS. Anche se in realtà questa non è produttività, ma un algoritmo di lavoro deliberatamente implementato. In Ethereum, per concorrenza, hanno semplicemente impostato il tempo di generazione del blocco in 15 secondi. e la produttività è formalmente aumentata vertiginosamente. Pertanto, nelle blockchain che utilizzano PoW come consenso, non ha alcun senso confrontare le prestazioni, perché dipende direttamente dalla complessità del calcolo della cache, a cui può essere assegnato qualsiasi valore.

forchette

Cosa succede se, ad esempio, diversi nodi trovano hash che soddisfano le condizioni di complessità, ma hanno valori diversi (in altre parole, sono arrivati ​​a consensi diversi) e scrivono blocchi sulla blockchain? Vediamo come la blockchain protegge da questa situazione. In questo caso si verifica un cosiddetto fork e la blockchain presenta due versioni della catena:

Cosa dovremmo costruire una blockchain?

Cosa succede dopo? Successivamente, parte della rete inizia a lavorare sul blocco N+2 da una catena e parte da un'altra:

Cosa dovremmo costruire una blockchain?

Uno di questi blocchi verrà trovato prima e inviato alla blockchain, quindi, secondo le regole, la blockchain dovrà passare a una catena più lunga e cancellare tutte le transazioni dal blocco alternativo:

Cosa dovremmo costruire una blockchain?

Allo stesso tempo, potrebbe verificarsi una situazione in cui la transazione di un partecipante si trovava solo in uno dei blocchi fork, che è stato annullato. Pertanto, per essere sicuri che la transazione desiderata venga registrata nella blockchain, esiste una raccomandazione generale: prima di fidarsi della transazione, dovresti attendere fino all'aggiunta dei blocchi successivi alla blockchain. Le raccomandazioni su quanti blocchi attendere per le diverse blockchain variano. Ad esempio, per la rete Bitcoin il minimo è 2 blocchi, il massimo è 6.

La stessa situazione con i fork dei blocchi sarà osservata durante il cosiddetto attacco del 51%: questo è quando un gruppo di minatori tenta di far crescere una catena di blocchi alternativa, cercando di annullare la catena con le proprie transazioni fraudolente. Anche se al momento, invece della frode, è più redditizio spendere il proprio potere in attività minerarie oneste.

Consenso

Per registrare un blocco sulla blockchain, la rete deve raggiungere un consenso. Ricordiamo il compito di raggiungere il consenso nelle reti di comunicazione informatica. Il problema è formulato come compito dei generali bizantini BFT (Tolleranza ai guasti bizantina). Tralasciando la pittoresca descrizione dei problemi dell'esercito bizantino, il problema può essere formulato come segue: come possono i nodi della rete arrivare a un risultato comune se alcuni nodi della rete possono deliberatamente distorcerli. Gli algoritmi esistenti per risolvere il problema del BFT mostrano che la rete può funzionare correttamente se i truffatori sono meno di 1/3. Perché il consenso BFT non è stato applicato alla rete Bitcoin? Perché è stato necessario utilizzare PoW? Ci sono diversi motivi:

  • BFT funziona bene con un piccolo insieme fisso di nodi, ma in una blockchain pubblica il numero di nodi è imprevedibile e, inoltre, i nodi possono essere attivati ​​e disattivati ​​in modo casuale.
  • È necessario motivare le persone a lanciare nodi blockchain. Per fare questo, le persone devono essere premiate. In BFT formalmente non c'è nulla per cui ricevere una ricompensa, ma a cosa serve la ricompensa in PoW è chiaro a tutti a livello intuitivo: per l'elettricità consumata dal processore nel processo di ricerca dell'hash del blocco.

Oltre al PoW, ci sono molti altri consensi utilizzati nelle moderne blockchain, ad esempio:

  • PoS (Proof of Stake) - sulla blockchain Hyperledger
  • DPoS (Delegation Proof-of-Stake) - sulla blockchain BitShares
  • Modifiche del BFT: SBFT (Simplified BFT) e PBFT (Practical BFT), ad esempio in blockchain Esone

Soffermiamoci un po' sul consenso PoS, perché... Sono i PoS e le sue varietà ad essere più diffusi nelle blockchain private. Perché in privato? Da un lato, le caratteristiche del PoS sono migliori rispetto al PoW, perché Per raggiungere il consenso sono necessarie meno risorse informatiche, il che significa che aumenta la velocità di scrittura dei dati sulla blockchain. Ma d’altro canto, il PoS ha maggiori possibilità di frode, quindi per neutralizzarlo è necessario che tutti i partecipanti alla blockchain siano conosciuti.

Il consenso PoS si basa sulla selezione di un nodo che può scrivere un blocco con transazioni sulla blockchain a seconda della quantità di fondi nel conto, o meglio, non nel conto, ma nella garanzia, ad es. Più fondi hai come garanzia, più è probabile che la rete scelga il tuo nodo per scrivere un blocco. La cauzione non verrà restituita se il blocco non è valido. Ciò fornisce protezione contro le frodi. Esistono le seguenti varianti di PoS:

  • Il consenso Delegato PoS (DPoS) divide i partecipanti in “elettori” e “validatori”. I possessori di monete (partecipanti votanti) delegano il loro potere di verificare e registrare le transazioni sulla blockchain ad altri partecipanti. Pertanto, i validatori svolgono tutto il lavoro computazionale e ricevono una ricompensa per questo, e la presenza dei partecipanti al voto garantisce l'onestà dei validatori, perché possono essere modificati in qualsiasi momento.
  • Il consenso LPoS (Leased Proof-of-Stake) ti consente di affittare i tuoi fondi ad altri nodi in modo che abbiano maggiori possibilità di convalidare i blocchi. Quello. Puoi ricevere una commissione per le transazioni senza partecipare alla verifica effettiva della transazione e al block mining.

Esistono numerosi altri consensi che non sono ancora ampiamente utilizzati, li elencherò qui solo per informazione e una panoramica degli algoritmi di consenso stessi può essere trovata, ad esempio, nell'articolo: Algoritmi di consenso nella Blockchain.

  • PoET (prova del tempo trascorso)
  • PoC (prova di capacità)
  • PoB (prova di bruciatura)
  • PoWeight (prova di peso)
  • PoA (prova di attività) – PoW + PoS
  • PoI (prova di importanza)

Affidabilità e modelli di implementazione delle blockchain

Blockchain pubblica

Stabilità Pubblico o un altro nome Blockchain senza autorizzazione Ciò si ottiene consentendo a chiunque di connettersi e visualizzare le informazioni o addirittura di connettere il proprio nodo, e la fiducia si basa sul consenso PoW.

Blockchain privata

Privata o Blockchain con autorizzazione privata. In queste blockchain, solo un certo gruppo di partecipanti (organizzazioni o persone) ha accesso alle informazioni. Tali blockchain sono costruite da organizzazioni con l’obiettivo di aumentare i benefici o l’efficienza complessivi. La loro affidabilità è garantita dagli obiettivi comuni dei partecipanti e dagli algoritmi di consenso PoS e BFT.

Consorzio Blockchain

Ci Consorzio o Blockchain con autorizzazione pubblica. Si tratta di blockchain a cui chiunque può connettersi per visualizzare, ma un partecipante può aggiungere informazioni o connettere il proprio nodo solo con il permesso degli altri partecipanti. Tali blockchain sono costruite dalle organizzazioni al fine di aumentare la fiducia da parte dei clienti o dei consumatori di prodotti o della società nel suo insieme. In questo caso, l’affidabilità è raggiunta anche dalla presenza di fiducia tra i partecipanti e dagli stessi algoritmi di consenso PoS e BFT.

Smart Contract

Le blockchain implementate dopo Bitcoin hanno, in un modo o nell’altro, aggiunto la capacità di eseguire contratti intelligenti. Essenzialmente, uno smart contract è una transazione in cui il codice del programma viene inserito per l'esecuzione. I contratti intelligenti sulla rete Ethereum vengono eseguiti nell'EVM (Ethereum Virtual Machine). Per iniziare l'esecuzione di uno smart contract, questo deve essere esplicitamente avviato da un'altra transazione oppure devono essere soddisfatte le precondizioni per l'esecuzione. Anche i risultati dell’esecuzione dello smart contract verranno registrati nella blockchain. Ricevere dati dall’esterno della blockchain è possibile, ma estremamente limitato.

Quale logica di business può essere implementata utilizzando uno smart contract? In effetti, non c’è molto, ad esempio, controllare le condizioni utilizzando i dati della blockchain, cambiare i proprietari delle risorse digitali in base a queste condizioni, registrare i dati in un archivio permanente all’interno della blockchain. La logica è implementata in uno speciale linguaggio di alto livello Solidity.

Un classico esempio di funzionalità implementata utilizzando i contratti intelligenti è l’emissione di token per ICO. Ad esempio, ho implementato un contratto intelligente per emettere un modesto AlexToken da 500. Di collegamento in Etherscan è

codice sorgente dello smart contract nel linguaggio 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 la rappresentazione binaria come la vede la rete

60806040526000600355600060045533600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560146101000a81548160ff021916908360028111156200006f57fe5b0217905550620001036b019d971e4fe8401e74000000600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200024a6401000000000262000b1d179091906401000000009004565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620001986b019d971e4fe8401e740000006001546200024a6401000000000262000b1d179091906401000000009004565b6001819055506b033b2e3c9fd0803ce8000000600481905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6b019d971e4fe8401e740000006040518082815260200191505060405180910390a362000267565b600081830190508281101515156200025e57fe5b80905092915050565b611cb880620002776000396000f300608060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146104c7578063095ea7b31461055757806318160ddd146105bc57806323b872dd146105e7578063313ce5671461066c578063355274ea146106a3578063518ab2a8146106ce57806366188463146106f957806370a082311461075e57806389311e6f146107b55780638da5cb5b146107cc578063903a3ef61461082357806395d89b411461083a578063a9059cbb146108ca578063bf5839031461092f578063c7876ea41461095a578063cbcb317114610985578063d73dd623146109b0578063dd62ed3e14610a15578063f2fde38b14610a8c575b60008060008060006001600281111561012757fe5b600560149054906101000a900460ff16600281111561014257fe5b14151561014e57600080fd5b60003411151561015d57600080fd5b600060045411151561016e57600080fd5b3494506101a7670de0b6b3a764000061019968056bc75e2d6310000088610acf90919063ffffffff16565b610b0790919063ffffffff16565b9350600092506b033b2e3c9fd0803ce80000006101cf85600354610b1d90919063ffffffff16565b111561024c576101f66003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b915061022e670de0b6b3a764000061022068056bc75e2d6310000085610b0790919063ffffffff16565b610acf90919063ffffffff16565b90506102438186610b3990919063ffffffff16565b92508094508193505b61026184600354610b1d90919063ffffffff16565b6003819055506102886003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b6004819055506000831115610344573373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156102dd573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b610395846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a361045184600154610b1d90919063ffffffff16565b600181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156104bf573d6000803e3d6000fd5b505050505050005b3480156104d357600080fd5b506104dc610b52565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b506105d1610c7d565b6040518082815260200191505060405180910390f35b3480156105f357600080fd5b50610652600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c87565b604051808215151515815260200191505060405180910390f35b34801561067857600080fd5b50610681611041565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3480156106af57600080fd5b506106b8611046565b6040518082815260200191505060405180910390f35b3480156106da57600080fd5b506106e3611056565b6040518082815260200191505060405180910390f35b34801561070557600080fd5b50610744600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061105c565b604051808215151515815260200191505060405180910390f35b34801561076a57600080fd5b5061079f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ed565b6040518082815260200191505060405180910390f35b3480156107c157600080fd5b506107ca611335565b005b3480156107d857600080fd5b506107e16113eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082f57600080fd5b50610838611411565b005b34801561084657600080fd5b5061084f6114ab565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088f578082015181840152602081019050610874565b50505050905090810190601f1680156108bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d657600080fd5b50610915600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b604051808215151515815260200191505060405180910390f35b34801561093b57600080fd5b50610944611703565b6040518082815260200191505060405180910390f35b34801561096657600080fd5b5061096f611709565b6040518082815260200191505060405180910390f35b34801561099157600080fd5b5061099a611716565b6040518082815260200191505060405180910390f35b3480156109bc57600080fd5b506109fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611726565b604051808215151515815260200191505060405180910390f35b348015610a2157600080fd5b50610a76600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611922565b6040518082815260200191505060405180910390f35b348015610a9857600080fd5b50610acd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a9565b005b600080831415610ae25760009050610b01565b8183029050818382811515610af357fe5b04141515610afd57fe5b8090505b92915050565b60008183811515610b1457fe5b04905092915050565b60008183019050828110151515610b3057fe5b80905092915050565b6000828211151515610b4757fe5b818303905092915050565b6040805190810160405280600981526020017f416c6578546f6b656e000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610cc457600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d1157600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d9c57600080fd5b610ded826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e80826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5182600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60035481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561116d576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611201565b6111808382610b3990919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561139157600080fd5b60028081111561139d57fe5b600560149054906101000a900460ff1660028111156113b857fe5b141515156113c557600080fd5b6001600560146101000a81548160ff021916908360028111156113e457fe5b0217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561146d57600080fd5b60028081111561147957fe5b600560149054906101000a900460ff16600281111561149457fe5b141515156114a157600080fd5b6114a9611b01565b565b6040805190810160405280600381526020017f414c54000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561152157600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561156e57600080fd5b6115bf826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611652826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60045481565b68056bc75e2d6310000081565b6b019d971e4fe8401e7400000081565b60006117b782600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a0557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611a4157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600560146101000a81548160ff02191690836002811115611b2057fe5b021790555060006004541115611c0a57611ba5600454600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611c89573d6000803e3d6000fd5b505600a165627a7a723058205bbef016cc7699572f944871cb6f05e69915ada3a92a1d9f03a3fb434aac0c2b0029

Maggiori dettagli sui contratti intelligenti possono essere trovati nell’articolo: Cosa sono i contratti intelligenti su Ethereum.

conclusione

Abbiamo elencato le tecnologie su cui sono costruite le moderne blockchain e come sono collegate tra loro. Ora formuliamo quali problemi possono essere risolti utilizzando la blockchain e quali soluzioni saranno, nella migliore delle ipotesi, inefficaci. Quindi, l’utilizzo della blockchain non è necessario se:

  • Le transazioni vengono effettuate in un ambiente affidabile;
  • La presenza di una commissione di intermediari non peggiora la vita dei partecipanti;
  • I partecipanti non possiedono proprietà che possano essere rappresentate come risorse digitali;
  • Non esiste alcuna distribuzione nelle risorse digitali, ad es. il valore è posseduto o fornito da un solo partecipante.

Cosa riserva il futuro alla blockchain? Ora possiamo solo speculare sulle possibili modalità per lo sviluppo delle tecnologie blockchain:

  • Blockchain diventerà la stessa tecnologia di database comune come, ad esempio, SQL o NoSQL per risolvere la sua gamma specifica di problemi;
  • La Blockchain diventerà un protocollo diffuso, come lo è l’HTTP per Internet;
  • La Blockchain diventerà la base per un nuovo sistema finanziario e politico sul pianeta!

Nella parte successiva vedremo quali blockchain esistono attualmente e perché vengono utilizzate in diversi settori.

Questo è solo l'inizio!

Fonte: habr.com

Aggiungi un commento