Cosa ci vuole per costruire una blockchain?

L'intera storia dell'umanità è una continua liberazione dalle catene e la creazione di nuove, ancora più forti. (Autore anonimo)

Analizzando i numerosi progetti blockchain (Bitshares, Hyperledger, Exonum, Ethereum, Bitcoin e altri), comprendo che, dal punto di vista tecnico, sono tutti costruiti secondo gli stessi principi. Le blockchain somigliano a case, che, nonostante la varietà di strutture, decorazioni e funzioni, hanno un fondamento, muri, tetto, finestre e porte, collegati tra loro in modi specifici. E se comprendiamo i principi fondamentali di progettazione degli edifici e conosciamo le proprietà dei materiali utilizzati, possiamo determinare la funzione specifica di una particolare casa. Attualmente, con la blockchain esiste una situazione in cui tutti ne hanno sentito parlare, ma pochi comprendono l'architettura e i principi di funzionamento. Questo porta a fraintendimenti su quando e come abbia senso utilizzare le tecnologie blockchain.

In questo articolo esamineremo le proprietà e i principi comuni a tutte le blockchain. Successivamente, daremo un'occhiata ai problemi che possono essere risolti con la blockchain e, per consolidare il materiale, costruiremo una piccola, ma reale blockchain nel nostro appezzamento virtuale!

Quindi, ricordiamo quali problemi ha inizialmente risolto la blockchain.

Sono sicuro che molti diranno riguardo a database distribuiti, decentralizzati, pubblici e immutabili. Ma a cosa serviva tutto questo?

Preferisco iniziare lo studio di qualsiasi tecnologia leggendo gli standard, poiché sono la base per tutti gli articoli e i libri sull'argomento. Tuttavia, gli standard della blockchain attualmente mancano, in ISO sono stati creati solo comitati per il loro sviluppo. Attualmente, ogni progetto blockchain pubblico ha il proprio documento White paper, che è essenzialmente un capitolato tecnico. Il primo progetto blockchain noto è la rete Bitcoin. Andiamo sul sito ufficiale della rete e vediamo da dove è cominciato tutto.

L'obiettivo della blockchain

Quindi, l'obiettivo che ha risolto la blockchain nella rete pioniera Bitcoin è il trasferimento fidato della proprietà di beni digitali in un ambiente non fidato senza intermediari. Ad esempio, nella rete Bitcoin, il bene digitale è rappresentato dalle monete digitali bitcoin. Tutte le soluzioni tecniche di Bitcoin e di altre blockchain si riassumono nell'affrontare questo problema.

I problemi che risolve la blockchain

Immaginiamo che una certa organizzazione finanziaria affermi di aver costruito una rete in tutto il mondo, tramite la quale è possibile inviare denaro a chiunque. Le credereste? Se questa organizzazione è Visa o MasterCard, probabilmente sì, mentre se fosse, per dire, AnonymousWorldMoney, probabilmente no. Perché? Perché sappiamo molto bene come vengono create le reti distribuite dalle aziende private, con quali scopi e a cosa possono portare. Analizziamo più a fondo i problemi di tali sistemi e come possono essere risolti utilizzando le tecnologie blockchain.

Supponiamo che nella ipotetica AnonymousWorldMoney ci siano server con database e sarebbe già positivo se ce ne fossero alcuni in diversi data center. Quando un mittente invia denaro, viene registrata una transazione che viene replicata a tutti i server e il denaro arriva al destinatario.

Cosa ci vuole per costruire una blockchain?

In un mondo ideale, questo schema funziona perfettamente, mentre nel nostro sorgono i seguenti problemi:

  1. Il problema dell'identificazione dei partecipanti da un lato e la necessità di anonimato delle transazioni dall'altro. Cioè, è necessario trasferire denaro a un destinatario specifico e in modo che di questa transazione non sappia nessuno tranne i partecipanti all'affare. Le banche hanno numeri di conto e carte bancarie legati a specifiche persone fisiche o giuridiche, e il segreto bancario protegge le informazioni sulle transazioni. Ma chi garantisce che la condizionale AnonymousWorldMoney non utilizzi dati personali e informazioni sulle transazioni per i propri scopi?
  2. Come assicurarsi che il destinatario abbia ricevuto esattamente l'importo che gli è stato inviato? Per esempio, il mittente ha inviato $100, ma il destinatario ha ricevuto $10. Il mittente si reca all'ufficio di AnonymousWorldMoney con la propria ricevuta, mentre l'impiegato mostra la propria versione, dove è registrato che il mittente ha inviato solo $10.
  3. Il problema dell'ambiente non fidato, ad esempio, le frodi note come double-spending. Un partecipante malintenzionato può spendere il proprio saldo più volte, prima che il pagamento venga replicato su tutti i server. La teoria CAP, naturalmente, rimane valida, e la coerenza alla fine sarà raggiunta, ma qualcuno non riceverà denaro per i beni o i servizi forniti. Pertanto, se non c'è fiducia totale nell'organizzazione di pagamento o nei partecipanti alle transazioni, è necessario costruire una rete basata non sulla fiducia, ma sulla crittografia.
  4. La condizione di AnonymousWorldMoney comporta un numero finito di server, che possono diventare non disponibili per errore o per malizia.
  5. AnonymousWorldMoney applicherà una commissione tangibile.
  6. Possibilità di gestione. Durante l'uso di Bitcoin, è emerso che le persone desiderano non solo trasferire monete tra di loro, ma anche controllare varie condizioni per il completamento delle transazioni, programmare scenari operativi e eseguire automaticamente azioni in base a determinate condizioni, ecc.

Come la blockchain affronta 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 il mittente e il destinatario, mantenendo le loro identità anonime.
  2. Le transazioni vengono raccolte in blocchi, viene calcolato l'hash del blocco, che viene registrato nel blocco successivo. Questa sequenza di registrazione degli hash nei blocchi ha dato origine al termine tecnologia blockchain, e impedisce la modifica o la rimozione nascosta di blocchi o singole transazioni dai blocchi. Pertanto, se una transazione è entrata nella blockchain, è possibile essere certi che i suoi dati rimarranno invariati.
  3. La frode del double-spending è evitata attraverso il raggiungimento di un consenso nella rete su quali dati considerare corretti e quali scartare. Nella rete Bitcoin, il consenso è raggiunto tramite la prova di lavoro PoW (Proof-of-Work).
  4. L'affidabilità del funzionamento della rete è garantita dal fatto che la blockchain è pubblica, dove ogni partecipante può avviare il proprio nodo, ottenere una copia completa della blockchain e, inoltre, verificare autonomamente le transazioni per la correttezza. Va notato che le moderne blockchain permettono di creare non solo blockchain pubbliche (aperte), ma anche blockchain private (chiuse), oltre a sfruttare schemi misti.
  5. Non è possibile eliminare completamente le commissioni nella blockchain, poiché è necessario pagare le persone che supportano la rete, ma nella blockchain la necessità delle commissioni è dimostrata in modo così convincente che non rimane alcun dubbio sulla loro necessità.
  6. Le moderne blockchain possono implementare logiche di business, che nella blockchain sono chiamate Smart Contracts. La logica degli smart contract è implementata in vari linguaggi di programmazione di alto livello.

Ora esamineremo queste soluzioni più in dettaglio.

Architettura della blockchain

Componenti della blockchain

Ogni partecipante può avviare il proprio nodo con una copia completa della blockchain (full node). I nodi completi che possono registrare transazioni nella blockchain sono chiamati nodi di consenso (witness) o miner (minatori). I nodi completi che verificano solo la correttezza delle transazioni vengono chiamati nodi di audit (audit). I client leggeri (light clients) non memorizzano copie complete della blockchain, ma interagiscono con la rete attraverso nodi completi.
La maggior parte degli utenti utilizza proprio client leggeri o portafogli web per effettuare transazioni. Tutti i nodi sono connessi tra loro. Con questo set di elementi, l'architettura della rete diventa più robusta:

Cosa ci vuole per costruire una blockchain?

Ciclo di vita della transazione

Esaminiamo il ciclo di vita di una transazione e lo analizziamo in parti:

Cosa ci vuole per costruire una blockchain?

Tecnologie della blockchain

Ci soffermeremo sulle soluzioni tecniche e sulle loro interrelazioni.

Identificazione

Chiave privata: 0a78194a8a893b8baac7c09b6a4a4b4b161b2f80a126cbb79bde231a4567420f Chiave pubblica: 0579b478952214d7cddac32ac9dc522c821a4489bc10aac3a81b9d1cd7a92e57ba Indirizzo: 0x3814JnJpGnt5tB2GD1qfKP709W3KbRdfb27V

Per creare una firma digitale nelle blockchain viene utilizzato un algoritmo basato su curve ellittiche: Elliptic Curve Digital Signature Algorithm (ECDSA). Per il suo funzionamento, la chiave privata (numero di 256 bit) è di solito presa in modo casuale. Il numero di possibili chiavi è 2 elevato alla 256, pertanto si può affermare che è praticamente impossibile avere valori di chiavi private coincidenti.

Successivamente, la chiave pubblica viene ottenuta dalla chiave privata moltiplicando il suo valore per le coordinate di un punto sulla curva ellittica, ottenendo così le coordinate di un nuovo punto sulla stessa curva. Questa azione garantisce l'ottenimento di una coppia di chiavi adatta per le firme digitali delle transazioni. Infine, l'indirizzo del portafoglio è calcolato univocamente dalla chiave pubblica.

Esistono molte articoli contenenti dettagli sulla crittografia utilizzata nella blockchain, ad esempio:

Bitcoin in a nutshell — Cryptography Bitcoin in a nutshell — Cryptography

La chiave privata deve rimanere assolutamente segreta e custodita in sicurezza. La chiave pubblica è nota a tutti. In caso di perdita della chiave privata, l'accesso all'asset (monete) non può essere recuperato e il denaro sarà perso per sempre. Pertanto, la questione della conservazione sicura delle chiavi private è di estrema importanza, poiché non è una banca dove si può sempre andare con un documento e ripristinare il conto. Esiste un'intera industria dedicata alla produzione di quelli che vengono chiamati wallet crittografici freddi, simili a chiavette USB:

Cosa ci vuole per costruire una blockchain?

oppure si possono utilizzare metodi più sicuri, ad esempio, incidere il valore della chiave privata su gettoni:

Cosa ci vuole per costruire una blockchain?

Transazioni

Per ulteriori dettagli sulla struttura della transazione, si può consultare l'articolo Bitcoin in a nutshell — Transaction. È importante capire che ogni transazione contiene almeno i seguenti dati:

Da: 0x48C89c341C5960Ca2Bf3732D6D8a0F4f89Cc4368 - indirizzo digitale del mittente
A: 0x367adb7894334678b90aFe7882a5b06f7fbc783a - indirizzo digitale del destinatario
Valore: 0.0001 - importo della transazione
Hash della transazione: 0x617ede331e8a99f46a363b32b239542bb4006e4fa9a2727a6636ffe3eb095cef - hash della transazione

Successivamente, la transazione viene firmata con la chiave privata e inviata (vedi dettagli sul funzionamento del protocollo Bitcoin in a nutshell-Protocol) a tutti i nodi nella blockchain, che verificano la validità delle transazioni. L'algoritmo di verifica della transazione è complesso e comprende una ventina di passaggi.

Blocchi delle transazioni

Verificando la validità delle transazioni, i nodi le aggregano in blocchi. Oltre alle transazioni, nel blocco viene registrato l'hash del blocco precedente, un numero (nonce), e viene calcolato l'hash del blocco attuale utilizzando l'algoritmo SHA-256. L'hash deve soddisfare determinati requisiti di difficoltà. Ad esempio, nella rete Bitcoin, la difficoltà dell'hash cambia automaticamente ogni due settimane in base alla potenza della rete, in modo che il blocco venga generato circa ogni 10 minuti. La difficoltà è determinata dal fatto che l'hash trovato deve essere inferiore a un numero prestabilito. Se questo requisito non è soddisfatto, il nonce viene incrementato di 1 e la ricerca dell'hash viene ripetuta. Per la ricerca dell'hash si utilizza il campo nonce, poiché sono i soli dati nel blocco che possono essere modificati, mentre gli altri devono rimanere invariati. Un hash valido deve avere un certo numero di zeri all'inizio, ad esempio, uno degli hash reali:

000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91

Il successo nella ricerca dell'hash costituisce prova del lavoro svolto (Proof-of-Work, PoW) per le reti Bitcoin o Ethereum. Il processo di ricerca degli hash è chiamato mining, in analogia con l'estrazione dell'oro. Il nome descrive bene la natura del processo, poiché è semplicemente una ricerca di possibilità, e se qualcuno trova un hash adatto, è davvero fortuna. È come trovare un vero nugget d'oro in tonnellate di roccia sterile. La ricompensa per blocco è attualmente di 12.5 BTC e, moltiplicata per il tasso attuale di Bitcoin di $3900, equivale a oltre un chilo d'oro puro. C'è molto per cui combattere!

Dopo il successo nella ricerca dell'hash, il blocco e l'hash trovato vengono registrati nella blockchain nel blocco successivo. Per ulteriori dettagli sulla struttura dei blocchi, si può consultare l'articolo Bitcoin in a nutshell-Blockchain, e qui sotto fornirò uno schema semplificato:

Cosa ci vuole per costruire una blockchain?

La blockchain inizia con un blocco che non ha ancora l'hash del blocco precedente. Questo blocco è unico nella blockchain e viene chiamato Genesis block. Gli altri blocchi hanno una struttura simile e si differenziano solo per il numero di transazioni. Le transazioni reali e i blocchi creati al momento nel Bitcoin o nell'Ethereum possono essere visualizzati in Block Explorer.

La dimensione dei blocchi in Bitcoin è limitata a 1MB e, considerando che il volume minimo di informazioni in una transazione è di circa 200 byte, un blocco può contenere al massimo circa 6000 transazioni. Da qui, tra l'altro, deriva la performance di Bitcoin, su cui tutti ridono: il blocco viene generato circa ogni 10 min * 60 sec = 600 sec, il che porta a una performance formale di circa 10 TPS. Anche se in realtà — questo non è un rendimento, ma un algoritmo di lavoro deliberatamente implementato. In Ethereum, per competere, hanno semplicemente ridotto il tempo di generazione del blocco a 15 sec, e così la performance è formalmente aumentata. Pertanto, nei blockchain che utilizzano PoW come consenso, è assolutamente privo di senso confrontare le performance, poiché essa dipende direttamente dalla difficoltà nel calcolo dell'hash, che può essere definita arbitrariamente.

Fork

E cosa succede se, ad esempio, diversi nodi trovano hash che soddisfano i requisiti di difficoltà, ma diversi per valore (in altre parole, raggiungono diversi consensi) e registrano blocchi nella blockchain? Guardiamo come la blockchain si protegge da questa situazione. In questo caso, si verifica quello che viene chiamato fork ('forchetta'), e la blockchain ha due versioni della catena:

Cosa ci vuole per costruire una blockchain?

Cosa succede dopo? Parte della rete inizia a lavorare sul blocco N+2 di una catena, mentre un'altra parte lavora su quella di un'altra catena:

Cosa ci vuole per costruire una blockchain?

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

Cosa ci vuole per costruire una blockchain?

In questa situazione, può capitare che la transazione di un partecipante fosse presente solo in uno dei blocchi del fork che è stato annullato. Pertanto, per essere certi che la transazione desiderata sia stata registrata nella blockchain, c'è una raccomandazione generale: prima di fidarti di una transazione, è meglio aspettare che i successivi blocchi vengano aggiunti alla blockchain. Le raccomandazioni su quanti blocchi attendere variano tra le diverse blockchain. Ad esempio, per la rete Bitcoin, il minimo è 2 blocchi, e il massimo è 6.

La stessa situazione con il fork dei blocchi si osserverà anche durante quella che viene chiamata attacco del 51%: quando un gruppo di miner cercherà di sviluppare una catena alternativa di blocchi, cercando di annullare la catena con le loro transazioni fraudolente. Anche se attualmente, invece di frode, è più vantaggioso utilizzare le proprie capacità per un mining onesto.

Consenso

Per registrare un blocco nella blockchain, la rete deve raggiungere un consenso. Ricordiamo la questione del raggiungimento del consenso nelle reti di computer. Il problema viene formulato come il problema dei generali bizantini BFT (Byzantine fault tolerance). Sorvolando la vivida descrizione dei problemi dell'esercito bizantino, la questione può essere formulata così: come possono i nodi della rete arrivare a un risultato comune, se alcuni nodi della rete possono deliberatamente distorcerlo? Gli algoritmi attuali per risolvere il problema BFT dimostrano che la rete può funzionare correttamente, se i malevoli sono meno di 1/3. Perché nella rete Bitcoin non è stato applicato il consenso BFT? Perché è stato necessario utilizzare il PoW? Ci sono diverse ragioni:

  • Il BFT funziona bene con un numero limitato di nodi fissi, mentre in una blockchain pubblica il numero di nodi è imprevedibile e, inoltre, i nodi possono accendersi e spegnersi a piacere.
  • È necessario motivare le persone a far funzionare i nodi blockchain. Per fare questo, le persone devono ricevere una ricompensa. Nel BFT non c'è formalmente nulla per cui ricevere una ricompensa, mentre nel PoW è chiaro a livello intuitivo per cosa si riceve la ricompensa: per l'elettricità consumata dalla CPU nel processo di ricerca dell'hash del blocco.

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

  • PoS (Proof-of-Stake) — nella blockchain Hyperledger
  • DPoS (Delegated Proof-of-Stake) — nella blockchain BitShares
  • Modifiche al BFT: SBFT (Simplified BFT) e PBFT (Practical BFT), ad esempio, nella blockchain Exonum

Fermiamoci un momento sul consenso PoS, poiché proprio PoS e le sue varianti hanno ottenuto la maggiore diffusione nelle blockchain private. Perché proprio in quelle private? Da un lato, le caratteristiche del PoS sono migliori rispetto a quelle del PoW, poiché per raggiungere un consenso sono necessarie minori risorse computazionali, il che aumenta la velocità di registrazione dei dati nella blockchain. Dall'altro lato, nel PoS ci sono maggiori possibilità di frode; per neutralizzare questo, tutti i partecipanti alla blockchain devono essere conosciuti.

Il consenso PoS si basa sulla selezione di un nodo che può registrare un blocco con transazioni nella blockchain in base alla quantità di fondi sul suo conto, più precisamente, non sul conto, ma in garanzia. Cioè, più fondi hai in garanzia, maggiore è la probabilità che la rete scelga il tuo nodo per la registrazione del blocco. La garanzia non verrà restituita se il blocco risulta non valido. In questo modo si realizza la protezione contro le frodi. Esistono le seguenti varianti del PoS:

  • Il consenso Delegated PoS (DPoS) separa i partecipanti in "votanti" e "validatori". I detentori di monete (partecipanti votanti) delegano il loro diritto di verificare e registrare transazioni nella blockchain ad altri partecipanti. Così, i validatori svolgono tutto il lavoro computazionale e ricevono una ricompensa, mentre la presenza di partecipanti votanti garantisce l'onestà dei validatori, poiché possono essere sostituiti in qualsiasi momento.
  • Il consenso LPoS (Leased Proof-of-Stake) consente di affittare i propri fondi ad altri nodi, affinché abbiano maggiori possibilità di convalidare i blocchi. In questo modo si possono ottenere commissioni per le transazioni, senza partecipare direttamente alla verifica delle transazioni e al mining dei blocchi.

Esistono anche altri consensi che finora non hanno ottenuto ampia diffusione; qui li elenco semplicemente per informazione, mentre una panoramica degli stessi algoritmi di consenso può essere consultata, ad esempio, nell'articolo: Algoritmi di Consenso nella Blockchain.

  • PoET (Proof-of-Elapsed Time)
  • PoC (Proof-of-Capacity)
  • PoB (Proof-of-Burn)
  • PoWeight (Proof-of-Weight)
  • PoA (Proof-of-Activity) — PoW + PoS
  • PoI (Proof-of-Importance)

Affidabilità e modelli di implementazione delle blockchain

Blockchain pubblico

Affidabilità Pubblico o un altro nome Blockchain senza permessi è raggiunto attraverso la possibilità per chiunque di connettersi e visualizzare le informazioni o persino di collegare il proprio nodo, mentre la fiducia si basa sul consenso PoW.

Blockchain privato

Privato o Blockchain permissioned privato. In queste blockchain, solo un gruppo specifico di partecipanti (organizzazioni o persone) ha accesso alle informazioni. Queste blockchain sono costruite da organizzazioni con l'obiettivo di aumentare il beneficio comune o l'efficienza. La loro affidabilità è garantita dagli obiettivi comuni dei partecipanti e dagli algoritmi di consenso PoS e BFT.

Consorzio blockchain

Esistono Consorzio o Blockchain permissioned pubblico. Queste blockchain possono essere visualizzate da chiunque, ma le informazioni possono essere aggiunte o un nodo collegato solo con il permesso di altri partecipanti. Queste blockchain sono costruite da organizzazioni con l'obiettivo di aumentare la fiducia da parte dei clienti o dei consumatori di prodotti o dell'intera società. Qui l'affidabilità è raggiunta anche attraverso la presenza di fiducia tra i partecipanti e gli stessi algoritmi di consenso PoS e BFT.

Smart Contracts

Nelle blockchain implementate dopo Bitcoin, è stata in qualche modo aggiunta la possibilità di eseguire smart contract. In sostanza, uno smart contract è una transazione che contiene codice programmato per l'esecuzione. Gli smart contract sulla rete Ethereum vengono eseguiti nell'EVM (Ethereum Virtual Machine). Per iniziare l'esecuzione di uno smart contract, deve essere attivato esplicitamente da un'altra transazione, oppure devono essere soddisfatte le condizioni per l'esecuzione. I risultati dell'esecuzione dello smart contract verranno registrati nella blockchain. È possibile ottenere dati dall'esterno della blockchain, ma è estremamente limitato.

Quale logica di business può essere implementata tramite uno smart contract? In realtà, non molto; ad esempio, il controllo delle condizioni basate sui dati della blockchain, il cambiamento dei proprietari di attivi digitali a seconda di queste condizioni, la registrazione di dati in uno storage permanente all'interno della blockchain. La logica viene implementata in un linguaggio di alto livello speciale, Solidity.

Un esempio classico di funzionalità implementata utilizzando smart contract è l'emissione di token per la conduzione di ICO. Ad esempio, ho implementato uno smart contract per l'emissione di 500.000.000 AlexToken. Per il link su Etherscan è in fase di sviluppo

il codice sorgente dello smart contract in 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 lo vede la rete

60806040526000600355600060045533600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560146101000a81548160ff021916908360028111156200006f57fe5b0217905550620001036b019d971e4fe8401e74000000600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200024a6401000000000262000b1d179091906401000000009004565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620001986b019d971e4fe8401e740000006001546200024a6401000000000262000b1d179091906401000000009004565b6001819055506b033b2e3c9fd0803ce8000000600481905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6b019d971e4fe8401e740000006040518082815260200191505060405180910390a362000267565b600081830190508281101515156200025e57fe5b80905092915050565b611cb880620002776000396000f300608060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146104c7578063095ea7b31461055757806318160ddd146105bc57806323b872dd146105e7578063313ce5671461066c578063355274ea146106a3578063518ab2a8146106ce57806366188463146106f957806370a082311461075e57806389311e6f146107b55780638da5cb5b146107cc578063903a3ef61461082357806395d89b411461083a578063a9059cbb146108ca578063bf5839031461092f578063c7876ea41461095a578063cbcb317114610985578063d73dd623146109b0578063dd62ed3e14610a15578063f2fde38b14610a8c575b60008060008060006001600281111561012757fe5b600560149054906101000a900460ff16600281111561014257fe5b14151561014e57600080fd5b60003411151561015d57600080fd5b600060045411151561016e57600080fd5b3494506101a7670de0b6b3a764000061019968056bc75e2d6310000088610acf90919063ffffffff16565b610b0790919063ffffffff16565b9350600092506b033b2e3c9fd0803ce80000006101cf85600354610b1d90919063ffffffff16565b111561024c576101f66003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b915061022e670de0b6b3a764000061022068056bc75e2d6310000085610b0790919063ffffffff16565b610acf90919063ffffffff16565b90506102438186610b3990919063ffffffff16565b92508094508193505b61026184600354610b1d90919063ffffffff16565b6003819055506102886003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b6004819055506000831115610344573373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156102dd573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b610395846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a361045184600154610b1d90919063ffffffff16565b600181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156104bf573d6000803e3d6000fd5b505050505050005b3480156104d357600080fd5b506104dc610b52565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b506105d1610c7d565b6040518082815260200191505060405180910390f35b3480156105f357600080fd5b50610652600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c87565b604051808215151515815260200191505060405180910390f35b34801561067857600080fd5b50610681611041565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3480156106af57600080fd5b506106b8611046565b6040518082815260200191505060405180910390f35b3480156106da57600080fd5b506106e3611056565b6040518082815260200191505060405180910390f35b34801561070557600080fd5b50610744600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061105c565b604051808215151515815260200191505060405180910390f35b34801561076a57600080fd5b5061079f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ed565b6040518082815260200191505060405180910390f35b3480156107c157600080fd5b506107ca611335565b005b3480156107d857600080fd5b506107e16113eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082f57600080fd5b50610838611411565b005b34801561084657600080fd5b5061084f6114ab565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088f578082015181840152602081019050610874565b50505050905090810190601f1680156108bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d657600080fd5b50610915600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b604051808215151515815260200191505060405180910390f35b34801561093b57600080fd5b50610944611703565b6040518082815260200191505060405180910390f35b34801561096657600080fd5b5061096f611709565b6040518082815260200191505060405180910390f35b34801561099157600080fd5b5061099a611716565b6040518082815260200191505060405180910390f35b3480156109bc57600080fd5b506109fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611726565b604051808215151515815260200191505060405180910390f35b348015610a2157600080fd5b50610a76600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611922565b6040518082815260200191505060405180910390f35b348015610a9857600080fd5b50610acd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a9565b005b600080831415610ae25760009050610b01565b8183029050818382811515610af357fe5b04141515610afd57fe5b8090505b92915050565b60008183811515610b1457fe5b04905092915050565b60008183019050828110151515610b3057fe5b80905092915050565b6000828211151515610b4757fe5b818303905092915050565b6040805190810160405280600981526020017f416c6578546f6b656e000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610cc457600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d1157600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d9c57600080fd5b610ded826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e80826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5182600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60035481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561116d576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611201565b6111808382610b3990919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561139157600080fd5b60028081111561139d57fe5b600560149054906101000a900460ff1660028111156113b857fe5b141515156113c557600080fd5b6001600560146101000a81548160ff021916908360028111156113e457fe5b0217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561146d57600080fd5b60028081111561147957fe5b600560149054906101000a900460ff16600281111561149457fe5b141515156114a157600080fd5b6114a9611b01565b565b6040805190810160405280600381526020017f414c54000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561152157600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561156e57600080fd5b6115bf826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611652826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60045481565b68056bc75e2d6310000081565b6b019d971e4fe8401e7400000081565b60006117b782600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a0557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611a4157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600560146101000a81548160ff02191690836002811115611b2057fe5b021790555060006004541115611c0a57611ba5600454600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611c89573d6000803e3d6000fd5b505600a165627a7a723058205bbef016cc7699572f944871cb6f05e69915ada3a92a1d9f03a3fb434aac0c2b0029

Puoi scoprire di più sui contratti smart nell'articolo: Cosa sono i contratti smart in Ethereum.

Conclusione

Abbiamo elencato le tecnologie su cui sono costruiti i moderni blockchain e come sono collegate tra loro. Ora formuliamo quali problemi può risolvere la blockchain e quali soluzioni, al limite, sarebbero inefficaci. Quindi, l'uso della blockchain non è necessario se:

  • Le transazioni avvengono in un ambiente fidato;
  • Le commissioni dei mediatori non peggiorano la vita dei partecipanti;
  • I partecipanti non possiedono beni che possono essere rappresentati come attività digitali;
  • Non c'è distribuzione nelle attività digitali, cioè il valore è detenuto o fornito solo da un singolo partecipante.

Quale futuro attende la blockchain? Al momento possiamo solo ipotizzare i possibili sviluppi delle tecnologie blockchain:

  • La blockchain diventerà una tecnologia di database comune, come SQL o NoSQL, per risolvere un certo insieme di problemi;
  • La blockchain diventerà un protocollo ampiamente utilizzato, come HTTP per Internet;
  • La blockchain diventerà la base per un nuovo sistema finanziario e politico del pianeta!

Nella prossima parte esamineremo quali blockchain esistono attualmente e a cosa vengono applicate in diverse industrie.

Questo è solo l'inizio!

Fonte: habr.com

Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster