Kaj naj zgradimo blockchain?

Celotna zgodovina človeštva je neprekinjen proces osvoboditve verig in ustvarjanja novih, še močnejših. (Anonimni avtor)

Ob analizi številnih projektov blockchain (Bitshares, Hyperledger, Exonum, Ethereum, Bitcoin itd.) razumem, da so s tehničnega vidika vsi zgrajeni na istih načelih. Blockchaini spominjajo na hiše, ki imajo kljub vsej pestrosti zasnov, dekorjev in namembnosti temelje, stene, streho, okna, vrata, ki so med seboj povezani na določene načine. In če razumete osnovna načela gradbenega načrtovanja in poznate lastnosti uporabljenih materialov, potem lahko določite predvideni namen določene hiše. Trenutno je prišlo do situacije z blockchainom, da so vsi slišali zanj, vendar le malo ljudi razume arhitekturo in načela delovanja. Zato prihaja do nerazumevanja, zakaj in kako je smiselno uporabljati tehnologije blockchain.

V tem članku bomo analizirali lastnosti in principe, ki so skupni vsem verigam blokov. Nato si poglejmo težave, ki jih je mogoče rešiti z uporabo verige blokov, in za okrepitev materiala zgradimo majhno, a pravo verigo blokov na našem virtualnem mestu!

Torej, spomnimo se, katere težave je blockchain prvotno rešil.

Prepričan sem, da bo marsikdo rekel o porazdeljeni, decentralizirani, javni in nespremenljivi bazi podatkov. Toda zakaj je bilo vse to potrebno?

Raje začnem študirati katero koli tehnologijo z branjem standardov, saj vsi članki in knjige na obravnavano temo temeljijo na njih. Vendar trenutno ni standardov blockchain; ISO je samo ustvaril odborov za njihov razvoj. Trenutno ima vsak javni projekt blockchain svoj dokument bele knjige, ki je v bistvu tehnična specifikacija. Prvi javno znan projekt blockchain je omrežje Bitcoin. Pojdite na uradno spletno stran omrežja in poglej kjer se je vse začelo.

Blockchain izziv

Torej, naloga, ki jo je blockchain rešil v pionirskem omrežju Bitcoin, je izvesti zaupanja vreden prenos lastništva digitalnih sredstev (sredstev) v nezaupnem okolju brez posrednikov. Na primer, v omrežju Bitcoin je digitalno sredstvo digitalni kovanec bitcoin. In vse tehnične rešitve Bitcoina in drugih verig blokov se spustijo na rešitev tega problema.

Težave, ki jih rešuje blockchain

Recimo, da določena finančna organizacija pravi, da je zgradila mrežo po vsem svetu, s pomočjo katere je mogoče nakazati denar kateri koli osebi. Ji boste verjeli? Če je ta organizacija Visa ali MasterCard, ji boste najverjetneje verjeli, če pa, relativno gledano, AnonymousWorldMoney, verjetno ne. Zakaj? Ampak zato, ker dobro vemo, kako distribuirane sisteme delajo zasebna podjetja, za kakšne namene in kaj lahko to privede. Oglejmo si podrobneje težave takšnih sistemov in kako jih je mogoče rešiti z uporabo tehnologij blockchain.

Recimo, da so v pogojnem AnonymousWorldMoney strežniki z bazami podatkov in dobro je, če jih je več v različnih podatkovnih centrih. Ko pošiljatelj nakaže denar, se registrira transakcija, ki se replicira na vse strežnike in denar doseže prejemnika.

Kaj naj zgradimo blockchain?

V idealnem svetu ta shema deluje odlično, v našem pa se pojavljajo naslednje težave:

  1. Problem identifikacije udeležencev na eni strani in potreba po anonimnosti transakcij na drugi strani. Tisti. denar morate nakazati določenemu prejemniku in tako, da za to transakcijo ne ve nihče razen udeležencev transakcije. Banke imajo številke računov in bančne kartice, povezane z določeno fizično ali pravno osebo, bančna tajnost pa varuje podatke o transakcijah. In kdo jamči, da pogojni AnonymousWorldMoney osebnih podatkov in informacij o transakcijah ne uporablja za lastne namene?
  2. Kako zagotoviti, da je prejemnik prejel natanko tak znesek, ki mu je bil nakazan? Relativno gledano je pošiljatelj nakazal 100 dolarjev, prejemnik pa je prejel 10 dolarjev. Pošiljatelj pride v pisarno AnonymousWorldMoney s potrdilom in uslužbenec pokaže svojo različico, kjer piše, da je pošiljatelj nakazal le 10 dolarjev.
  3. Težava nezaupljivega okolja, na primer prevara, imenovana dvojna poraba. Brezobzirni udeleženec lahko večkrat porabi svoje stanje, dokler se plačilo ne ponovi na vseh strežnikih. CAP izrek, seveda, nihče ni preklical, in dogovor bo na koncu dosežen, vendar nekdo ne bo prejel denarja za opravljene storitve ali blago. Če torej ni popolnega zaupanja v plačilno organizacijo ali udeležence v transakcijah, je treba zgraditi omrežje, ki ne temelji na zaupanju, temveč na kriptografiji.
  4. Pogojni AnonymousWorldMoney ima končno število strežnikov, ki lahko postanejo nedosegljivi nenamerno ali zaradi zlonamernega namena.
  5. AnonymousWorldMoney bo prevzel lastno materialno provizijo.
  6. Možnost nadzora. Med delovanjem Bitcoina se je izkazalo, da ljudje ne želijo samo prenašati kovancev drug drugemu, ampak tudi preverjati različne pogoje za transakcijo, programirati scenarije dela, samodejno izvajati dejanja glede na pogoje itd.

Kako blockchain rešuje te težave

  1. Identifikacija udeležencev poteka s parom ključev: zasebnim in javnim, algoritem digitalnega podpisa pa enolično identificira pošiljatelja in prejemnika, tako da njuni identiteti ostaneta anonimni.
  2. Transakcije se zbirajo v bloke, zgoščenost bloka se izračuna in zapiše v naslednji blok. To zaporedje zapisovanja zgoščenih vrednosti v bloke daje tehnologiji blockchain ime, poleg tega pa onemogoča neopazno spreminjanje/brisanje blokov ali posameznih transakcij iz blokov. Če je torej transakcija vključena v verigo blokov, ste lahko prepričani, da bodo njeni podatki ostali nespremenjeni.
  3. Goljufije z dvojno porabo se preprečijo z doseganjem omrežnega soglasja o tem, katere podatke je treba šteti za veljavne in katere zavreči. V omrežju Bitcoin je soglasje doseženo z dokazom o delu (PoW).
  4. Zanesljivost omrežja je dosežena z dejstvom, da je veriga blokov javna, kjer lahko vsak udeleženec zažene svoje vozlišče, prejme popolno kopijo verige blokov in poleg tega samostojno začne preverjati pravilnost transakcij. Treba je opozoriti, da sodobne verige blokov omogočajo gradnjo ne le javnih (odprtih), ampak tudi zasebnih (zaprtih) verig blokov, pa tudi uporabo kombiniranih shem.
  5. Blockchain se ne bo popolnoma znebil provizij, saj... morate plačati ljudem, ki podpirajo omrežje, vendar je v blockchainu potreba po proviziji dokazana tako prepričljivo, da ni dvoma o njeni nujnosti.
  6. Sodobne verige blokov imajo možnost implementacije poslovne logike, ki se v verigi blokov imenuje pametne pogodbe. Logika pametnih pogodb je implementirana v različnih jezikih na visoki ravni.

Nato bomo te rešitve podrobneje obravnavali.

Blockchain arhitektura

Komponente verige blokov

Vsak udeleženec lahko zažene svoje lastno vozlišče s polno kopijo verige blokov (polno vozlišče). Pokličejo se polna vozlišča, ki lahko beležijo transakcije v verigi blokov vozlišča soglasja (priča) ali rudarji (rudar). Pokličejo se polna vozlišča, ki samo preverjajo pravilnost transakcij revizijska vozlišča (revizija). Lahke stranke (lahki odjemalci) ne shranjujejo polnih kopij verige blokov, ampak komunicirajo z omrežjem z uporabo polnih vozlišč.
Večina uporabnikov za izvajanje transakcij uporablja lahke odjemalce ali spletne denarnice. Vsa vozlišča so med seboj povezana. S tem naborom elementov postane omrežna arhitektura bolj stabilna:

Kaj naj zgradimo blockchain?

Življenjski cikel transakcije

Oglejmo si življenjski cikel transakcije in ga razdelimo po delih:

Kaj naj zgradimo blockchain?

Blockchain tehnologije

Oglejmo si podrobneje tehnične rešitve in njihove povezave med seboj.

Identifikacija

Vsaka transakcija blockchain mora biti digitalno podpisana. Zato mora imeti vsak udeleženec za dokončanje transakcije par ključev: zasebno / javno. Včasih se par ključev imenuje denarnica, ker ključi so edinstveno povezani z edinstvenim digitalnim naslovom in stanjem udeleženca. V resnici so ključi in naslovi le nizi številk v različnih številskih sistemih. Primeri ključev in naslovov denarnice:

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

Za ustvarjanje digitalnega podpisa v verigah blokov se uporablja algoritem, ki temelji na eliptičnih krivuljah: Elliptic Curve Digital Signature Algorithm (ECDSA). Da deluje, se zasebni ključ (256-bitna številka) običajno vzame naključno. Število ključnih možnosti je 2 na potenco 256, tako da lahko govorimo o praktični nemožnosti ujemanja vrednosti zasebnih ključev.

Nato se javni ključ pridobi iz zasebnega tako, da se njegova vrednost pomnoži s koordinatami točke na eliptični krivulji, kar povzroči koordinate nove točke na isti krivulji. To dejanje zagotavlja, da pridobite par ključev, primeren za digitalno podpisovanje transakcij. Nazadnje je naslov denarnice edinstveno izpeljan iz javnega ključa.

Obstaja veliko člankov s podrobnostmi o kriptografiji, ki se uporablja v blockchainu, na primer: Bitcoin na kratko – kriptografija

Zasebni ključ mora biti strogo zaupen in varovan. Javni ključ je znan vsem. Če se zasebni ključ izgubi, dostopa do sredstva (kovancev) ni mogoče obnoviti in denar bo za vedno izgubljen. Zato je naloga varnega shranjevanja zasebnih ključev izjemno pomembna, saj To ni banka, kamor lahko vedno pridete s svojim potnim listom in obnovite svoj račun. Obstaja cela industrija za proizvodnjo tako imenovanih hladnih kripto denarnic, podobnih bliskovnim pogonom:

Kaj naj zgradimo blockchain?

lahko pa uporabite bolj zanesljive metode, na primer vtiskovanje vrednosti zasebnega ključa na žetone:

Kaj naj zgradimo blockchain?

Posel

Več podrobnosti o strukturi transakcije najdete v članku Bitcoin na kratko – Transakcija. Pomembno je, da razumemo, da ima vsaka transakcija vsaj naslednje podatke:

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

Nato je transakcija podpisana z zasebnim ključem in poslana (glejte podrobnosti o delovanju protokola Bitcoin na kratko - protokol) vsem vozliščem v verigi blokov, ki preverjajo veljavnost transakcij. Algoritem za preverjanje transakcije ni trivialen in vključuje dva ducata korakov.

Transakcijski bloki

Po preverjanju veljavnosti transakcij vozlišča iz njih oblikujejo bloke. Poleg transakcij se v blok zapišejo še hash prejšnjega bloka in število (nonce counter), hash trenutnega bloka pa se izračuna z algoritmom SHA-256. Zgoščena vrednost mora imeti določene pogoje kompleksnosti. Na primer, v omrežju Bitcoin se težavnost zgoščene vrednosti samodejno spremeni vsaka 2 tedna, odvisno od moči omrežja, tako da se blok ustvari približno enkrat na vsakih 10 minut. Kompleksnost je določena z naslednjim pogojem: najdeni hash mora biti manjši od vnaprej določenega števila. Če ta pogoj ni izpolnjen, se k Nonce doda 1 in izračun zgoščene vrednosti se ponovi. Za izbiro zgoščene vrednosti se uporablja polje Nonce, ker To so edini podatki v bloku, ki jih je mogoče spremeniti; ostali morajo ostati nespremenjeni. Veljavna zgoščena vrednost mora imeti določeno število začetnih ničel, na primer ena od pravih zgoščenih vrednosti:

000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91

Uspešno iskanje zgoščene vrednosti je dokaz opravljenega dela (Proof-of-Work, PoW) za omrežja Bitcoin ali Ethereum. Postopek iskanja hashov se imenuje rudarjenje, podobno kot pri rudarjenju zlata. Ime precej natančno opredeljuje bistvo procesa, ker obstaja preprosto iskanje možnosti in če kdo najde ustrezen hash, potem je to prava sreča. Kot da bi našli pravo zlato kepo v tonah odpadne kamnine. Nagrada za blok je zdaj 12.5 BTC in če jo pomnožite s trenutnim tečajem Bitcoina 3900 $, dobite več kot kilogram čistega zlata. Za kaj se je treba boriti!

Po uspešnem iskanju hasha se blok in sam najdeni hash zapišeta v blockchain kot naslednji blok. Več podrobnosti o strukturi blokov najdete v članku Bitcoin na kratko-Blockchain, spodaj pa je poenostavljen diagram:

Kaj naj zgradimo blockchain?

Blockchain se začne z blokom, ki še nima zgoščene vrednosti prejšnjega bloka. V verigi blokov je samo en tak blok in ima svoje ime Genesis block. Preostali bloki imajo enako strukturo in se razlikujejo le po številu transakcij. Realne transakcije in bloke, ki se trenutno ustvarjajo v Bitcoinu ali Ethereumu, si lahko ogledate v Block Explorer.

Velikost blokov v Bitcoinu je omejena na 1 MB in z najmanjšo količino informacij v transakciji približno 200 bajtov je lahko največje število transakcij v bloku približno 6000. Od tu mimogrede sledi uspešnost Bitcoina, ki se ji vsi smejijo: blok se ustvari približno enkrat na 10 minut * 60 sekund = 600 sekund, kar daje formalno zmogljivost približno 10 TPS. Čeprav v resnici to ni produktivnost, ampak namerno implementiran algoritem dela. V Ethereumu so zaradi konkurence preprosto nastavili čas generiranja bloka na 15 sekund. in produktivnost je formalno narasla. Zato v verigah blokov, ki uporabljajo PoW kot konsenz, sploh nima smisla primerjati zmogljivosti, ker neposredno je odvisno od kompleksnosti izračuna predpomnilnika, ki se lahko dodeli kateri koli vrednosti.

Vilice

Kaj se zgodi, če je na primer več vozlišč našlo zgoščene vrednosti, ki izpolnjujejo pogoje kompleksnosti, vendar so različne vrednosti (z drugimi besedami, prišli so do različnih soglasij) in zapisalo bloke v verigo blokov? Poglejmo, kako blockchain ščiti pred to situacijo. V tem primeru pride do tako imenovanega forka, blockchain pa ima dve različici verige:

Kaj naj zgradimo blockchain?

Kaj se zgodi potem? Nato del omrežja začne delovati na bloku N+2 iz ene verige, del pa iz druge:

Kaj naj zgradimo blockchain?

Eden od teh blokov bo prej najden in poslan v verigo blokov, nato pa bo morala veriga blokov v skladu s pravili preklopiti na daljšo verigo in preklicati vse transakcije iz alternativnega bloka:

Kaj naj zgradimo blockchain?

Hkrati lahko pride do situacije, ko je bila transakcija udeleženca le v enem od blokov fork, ki je bil preklican. Zato, da bi bili prepričani, da je želena transakcija zabeležena v verigi blokov, obstaja splošno priporočilo - preden zaupate transakciji, počakajte, da se naslednjih nekaj blokov doda v verigo blokov. Priporočila o tem, koliko blokov je treba počakati za različne verige blokov, se razlikujejo. Na primer, za omrežje Bitcoin je najmanj 2 bloka, največ 6.

Enako sliko z vilicami blokov bomo opazili med tako imenovanim 51-odstotnim napadom - to je, ko skupina rudarjev poskuša razviti alternativno verigo blokov in s svojimi goljufivimi transakcijami poskuša preklicati verigo. Čeprav je trenutno namesto goljufije bolj donosno porabiti svojo moč za pošteno rudarjenje.

Soglasje

Za snemanje bloka v verigi blokov mora omrežje doseči soglasje. Spomnimo se naloge doseganja soglasja v računalniških komunikacijskih omrežjih. Problem je formuliran kot naloga bizantinskih generalov BFT (Bizantinska toleranca napak). Če izpustimo slikovit opis težav bizantinske vojske, lahko problem formuliramo takole: kako naj omrežna vozlišča pridejo do skupnega rezultata, če jih lahko nekatera omrežna vozlišča namerno popačijo. Obstoječi algoritmi za reševanje problema BFT kažejo, da lahko omrežje deluje pravilno, če je goljufov manj kot 1/3. Zakaj soglasje BFT ni bilo uporabljeno za omrežje Bitcoin? Zakaj je bilo treba uporabiti PoW? Razlogov je več:

  • BFT dobro deluje z majhnim fiksnim naborom vozlišč, vendar je v javni verigi blokov število vozlišč nepredvidljivo, poleg tega pa se vozlišča lahko vklopijo in izklopijo naključno.
  • Ljudi je treba motivirati za lansiranje vozlišč blockchain. Za to je treba ljudi nagraditi. V BFT formalno ni ničesar, za kar bi prejeli nagrado, toda za kaj je nagrada v PoW, je vsakomur jasno na intuitivni ravni: za elektriko, ki jo porabi procesor v procesu iskanja zgoščene vrednosti bloka.

Poleg PoW obstaja več drugih soglasij, ki se uporabljajo v sodobnih verigah blokov, na primer:

  • PoS (Proof-of-Stake) – na blockchainu Hyperledger
  • DPoS (Delegated Proof-of-Stake) – na blockchainu BitShares
  • Spremembe BFT: SBFT (poenostavljeni BFT) in PBFT (praktični BFT), na primer v verigi blokov Exonum

Posvetimo se malo o soglasju o PoS, ker ... Prav PoS in njegove različice so najbolj razširjene v zasebnih verigah blokov. Zakaj zasebno? Po eni strani so lastnosti PoS boljše v primerjavi s PoW, ker Za dosego soglasja je potrebnih manj računalniških virov, kar pomeni, da se poveča hitrost zapisovanja podatkov v verigo blokov. Toda po drugi strani ima PoS več možnosti za goljufije, zato je za nevtralizacijo tega treba poznati vse udeležence v blockchainu.

PoS konsenz temelji na izbiri vozlišča, ki lahko zapiše blok s transakcijami v blockchain glede na količino sredstev na računu, oziroma ne na računu, temveč v zavarovanju, tj. Več sredstev kot imate kot zavarovanje, večja je verjetnost, da bo omrežje izbralo vaše vozlišče za pisanje bloka. Polog ne bo vrnjen, če je blokada neveljavna. To zagotavlja zaščito pred goljufijami. Obstajajo naslednje različice PoS:

  • Soglasje Delegiranih PoS (DPoS) deli udeležence na "volivce" in "validatorje". Imetniki kovancev (udeleženci z glasovalno pravico) svojo moč za preverjanje in beleženje transakcij v verigi blokov prenesejo na druge udeležence. Tako validatorji opravijo vse računsko delo in za to prejmejo nagrado, prisotnost udeležencev glasovanja pa zagotavlja poštenost validatorjev, saj kadarkoli jih je mogoče spremeniti.
  • Soglasje LPoS (Leased Proof-of-Stake) vam omogoča, da svoja sredstva zakupite drugim vozliščem, tako da imajo boljšo možnost potrditve blokov. to. Za transakcije lahko prejmete provizijo, ne da bi sodelovali pri dejanskem preverjanju transakcije in blokirate rudarjenje.

Obstajajo tudi številna soglasja, ki še niso postala razširjena; tukaj jih bom samo informativno navedel, pregled samih soglasnih algoritmov pa lahko najdete na primer v članku: Algoritmi soglasja v verigi blokov.

  • PoET (dokaz pretečenega časa)
  • PoC (dokaz zmogljivosti)
  • PoB (Proof-of-Burn)
  • PoWeight (dokaz teže)
  • PoA (Proof-of-Activity) – PoW + PoS
  • PoI (Proof-of-Importans)

Zanesljivost in modeli uvajanja blokovnih verig

Javna veriga blokov

Stabilnost javno ali drugo ime Blokovna veriga brez dovoljenj To se doseže tako, da se lahko kdorkoli poveže in si ogleda informacije ali celo poveže svoje vozlišče, zaupanje pa je zgrajeno na soglasju PoW.

Zasebna veriga blokov

Zasebno ali Zasebna veriga blokov z dovoljenjem. V teh verigah blokov ima dostop do informacij le določena skupina udeležencev (organizacije ali ljudje). Takšne verige blokov gradijo organizacije s ciljem povečati splošno korist ali učinkovitost. Njihovo zanesljivost zagotavljajo skupni cilji udeležencev ter konsenzni algoritmi PoS in BFT.

Blockchain konzorcij

Na voljo Konzorcij ali Javna dovoljena veriga blokov. To so verige blokov, na katere se lahko kdorkoli poveže za ogled, vendar lahko udeleženec dodaja informacije ali poveže svoje vozlišče samo z dovoljenjem drugih udeležencev. Takšne verige blokov gradijo organizacije, da bi povečale zaupanje s strani strank ali potrošnikov izdelkov ali družbe kot celote. Tu je zanesljivost dosežena tudi s prisotnostjo zaupanja med udeleženci in enakimi konsenznimi algoritmi PoS in BFT.

Pametne pogodbe

Blokovne verige, uvedene po Bitcoinu, so tako ali drugače dodale možnost izvajanja pametnih pogodb. V bistvu je pametna pogodba transakcija, v katero je nameščena programska koda za izvedbo. Pametne pogodbe v omrežju Ethereum se izvajajo v EVM (Ethereum Virtual Machine). Za začetek izvajanja pametne pogodbe mora biti izrecno zagnana z drugo transakcijo ali pa morajo biti izpolnjeni predpogoji za izvedbo. Rezultati izvedbe pametne pogodbe bodo zabeleženi tudi v blockchainu. Prejemanje podatkov izven verige blokov je možno, vendar zelo omejeno.

Kakšno poslovno logiko je mogoče implementirati s pametno pogodbo? Pravzaprav ni veliko, na primer preverjanje pogojev z uporabo podatkov iz verige blokov, spreminjanje lastnikov digitalnih sredstev glede na te pogoje, beleženje podatkov v trajni shrambi znotraj verige blokov. Logika je implementirana v posebnem visokonivojskem jeziku Solidity.

Klasičen primer funkcionalnosti, ki se izvaja s pomočjo pametnih pogodb, je izdaja žetonov za ICO. Na primer, implementiral sem pametno pogodbo za izdajo skromnih 500 AlexToken. Avtor: povezava v Etherscan je

izvorna koda pametne pogodbe v jeziku 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;
}

in binarno predstavitev, kot jo vidi omrežje

60806040526000600355600060045533600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560146101000a81548160ff021916908360028111156200006f57fe5b0217905550620001036b019d971e4fe8401e74000000600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200024a6401000000000262000b1d179091906401000000009004565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620001986b019d971e4fe8401e740000006001546200024a6401000000000262000b1d179091906401000000009004565b6001819055506b033b2e3c9fd0803ce8000000600481905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6b019d971e4fe8401e740000006040518082815260200191505060405180910390a362000267565b600081830190508281101515156200025e57fe5b80905092915050565b611cb880620002776000396000f300608060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146104c7578063095ea7b31461055757806318160ddd146105bc57806323b872dd146105e7578063313ce5671461066c578063355274ea146106a3578063518ab2a8146106ce57806366188463146106f957806370a082311461075e57806389311e6f146107b55780638da5cb5b146107cc578063903a3ef61461082357806395d89b411461083a578063a9059cbb146108ca578063bf5839031461092f578063c7876ea41461095a578063cbcb317114610985578063d73dd623146109b0578063dd62ed3e14610a15578063f2fde38b14610a8c575b60008060008060006001600281111561012757fe5b600560149054906101000a900460ff16600281111561014257fe5b14151561014e57600080fd5b60003411151561015d57600080fd5b600060045411151561016e57600080fd5b3494506101a7670de0b6b3a764000061019968056bc75e2d6310000088610acf90919063ffffffff16565b610b0790919063ffffffff16565b9350600092506b033b2e3c9fd0803ce80000006101cf85600354610b1d90919063ffffffff16565b111561024c576101f66003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b915061022e670de0b6b3a764000061022068056bc75e2d6310000085610b0790919063ffffffff16565b610acf90919063ffffffff16565b90506102438186610b3990919063ffffffff16565b92508094508193505b61026184600354610b1d90919063ffffffff16565b6003819055506102886003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b6004819055506000831115610344573373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156102dd573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b610395846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a361045184600154610b1d90919063ffffffff16565b600181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156104bf573d6000803e3d6000fd5b505050505050005b3480156104d357600080fd5b506104dc610b52565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b506105d1610c7d565b6040518082815260200191505060405180910390f35b3480156105f357600080fd5b50610652600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c87565b604051808215151515815260200191505060405180910390f35b34801561067857600080fd5b50610681611041565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3480156106af57600080fd5b506106b8611046565b6040518082815260200191505060405180910390f35b3480156106da57600080fd5b506106e3611056565b6040518082815260200191505060405180910390f35b34801561070557600080fd5b50610744600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061105c565b604051808215151515815260200191505060405180910390f35b34801561076a57600080fd5b5061079f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ed565b6040518082815260200191505060405180910390f35b3480156107c157600080fd5b506107ca611335565b005b3480156107d857600080fd5b506107e16113eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082f57600080fd5b50610838611411565b005b34801561084657600080fd5b5061084f6114ab565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088f578082015181840152602081019050610874565b50505050905090810190601f1680156108bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d657600080fd5b50610915600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b604051808215151515815260200191505060405180910390f35b34801561093b57600080fd5b50610944611703565b6040518082815260200191505060405180910390f35b34801561096657600080fd5b5061096f611709565b6040518082815260200191505060405180910390f35b34801561099157600080fd5b5061099a611716565b6040518082815260200191505060405180910390f35b3480156109bc57600080fd5b506109fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611726565b604051808215151515815260200191505060405180910390f35b348015610a2157600080fd5b50610a76600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611922565b6040518082815260200191505060405180910390f35b348015610a9857600080fd5b50610acd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a9565b005b600080831415610ae25760009050610b01565b8183029050818382811515610af357fe5b04141515610afd57fe5b8090505b92915050565b60008183811515610b1457fe5b04905092915050565b60008183019050828110151515610b3057fe5b80905092915050565b6000828211151515610b4757fe5b818303905092915050565b6040805190810160405280600981526020017f416c6578546f6b656e000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610cc457600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d1157600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d9c57600080fd5b610ded826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e80826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5182600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60035481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561116d576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611201565b6111808382610b3990919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561139157600080fd5b60028081111561139d57fe5b600560149054906101000a900460ff1660028111156113b857fe5b141515156113c557600080fd5b6001600560146101000a81548160ff021916908360028111156113e457fe5b0217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561146d57600080fd5b60028081111561147957fe5b600560149054906101000a900460ff16600281111561149457fe5b141515156114a157600080fd5b6114a9611b01565b565b6040805190810160405280600381526020017f414c54000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561152157600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561156e57600080fd5b6115bf826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611652826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60045481565b68056bc75e2d6310000081565b6b019d971e4fe8401e7400000081565b60006117b782600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a0557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611a4157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600560146101000a81548160ff02191690836002811115611b2057fe5b021790555060006004541115611c0a57611ba5600454600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611c89573d6000803e3d6000fd5b505600a165627a7a723058205bbef016cc7699572f944871cb6f05e69915ada3a92a1d9f03a3fb434aac0c2b0029

Več podrobnosti o pametnih pogodbah najdete v članku: Kaj so pametne pogodbe v Ethereumu.

Zaključek

Našteli smo tehnologije, na katerih so zgrajene sodobne verige blokov in kako so med seboj povezane. Zdaj pa oblikujmo, katere težave je mogoče rešiti z uporabo blockchaina in katere bodo v najboljšem primeru neučinkovite. Torej uporaba blockchaina ni potrebna, če:

  • Transakcije se izvajajo v zaupanja vrednem okolju;
  • Prisotnost komisije posrednikov ne poslabša življenja udeležencev;
  • Udeleženci nimajo lastnine, ki bi jo lahko predstavili kot digitalna sredstva;
  • V digitalnih sredstvih ni distribucije, tj. vrednost je v lasti ali dobavi samo enega udeleženca.

Kakšna je prihodnost blockchaina? Zdaj lahko samo špekuliramo o možnih poteh za razvoj tehnologij blockchain:

  • Blockchain bo postal enaka skupna tehnologija baze podatkov kot na primer SQL ali NoSQL za reševanje svojega posebnega obsega problemov;
  • Blockchain bo postal široko razširjen protokol, kot je HTTP za internet;
  • Blockchain bo postal osnova za nov finančni in politični sistem na planetu!

V naslednjem delu si bomo ogledali, katere verige blokov trenutno obstajajo in zakaj se uporabljajo v različnih panogah.

To je šele začetek!

Vir: www.habr.com

Kupite zanesljivo gostovanje za strani z DDoS zaščito, VPS VDS strežniki 🔥 Kupite zanesljivo spletno gostovanje z zaščito DDoS, VPS VDS strežniki | ProHoster