Kaj nam stane zgraditi blockchain?

Vsa zgodovina človeštva je nenehno osvobajanje od verig in ustvarjanje novih, še močnejših. (Anonimni avtor)

Sanaliziranjem številnih blockchain projektov (Bitshares, Hyperledger, Exonum, Ethereum, Bitcoin itd.) razumem, da so vsi zgrajeni na osnovi istih načel. Blokchaini spominjajo na hiše, ki imajo ob vsem raznolikem oblikovanju, dekoraciji in namenu temelj, stene, strehe, okna in vrata, ki so med seboj povezana na določene načine. Če razumemo osnovna načela oblikovanja stavb in poznamo lastnosti uporabljenih materialov, lahko določimo namen določene hiše. Trenutno imamo pri blockchainu situacijo, da je o njem slišal vsak, a le redki razumejo njegovo arhitekturo in načela delovanja. Tako nastaja nejasnost, zakaj in kako ima smisel uporabljati tehnologije blockchain.

V tem članku bomo obravnavali skupne lastnosti in načela vseh blockchainov. Nato bomo pogledali naloge, ki jih lahko rešujemo s pomočjo blockchaina in za utrditev snovi zgradili majhen, a prav realen blockchain na svojem virtualnem praksu!

Torej, poglejmo, katere težave je blockchain sprva rešil.

Prepričan sem, da bodo mnogi omenili distribuirano, decentralizirano, javno in nespremenljivo bazo podatkov. Ampak zakaj je bilo to vse potrebno?

Raje začnem študiranje katere koli tehnologije s prebiranjem standardov, saj so ti osnova za vse članke in knjige na obravnavano temo. A trenutni standardi blockchaina ne obstajajo, v ISO so bila ustvarjena le komiteta za njihovo pripravo. Trenutno ima vsak javni blockchain projekt svoj dokument White paper, ki je v bistvu tehnična specifikacija. Prvi znani blockchain projekt je omrežje Bitcoin. Poglejmo na uradno spletno stran omrežja in si oglejmo kako se je vse začelo.

Naloga blockchaina

Torej, naloga, ki jo je blockchain rešil v pionirskem omrežju Bitcoin, je bila zaupna prenos lastništva nad digitalnimi aktivnimi sredstvi (assets) v nezaupljivem okolju brez posrednikov. Na primer, v omrežju Bitcoin je digitalni aktiv - digitalne kovance bitcoin. Vse tehnične rešitve Bitcoin in drugih blockchainov so usmerjene v reševanje te naloge.

Težave, ki jih rešuje blockchain

Recimo, neka finančna organizacija trdi, da je zgradila mrežo po vsem svetu, s katero lahko prenaša denar vsakomur. Bi ji verjeli? Če je ta organizacija Visa ali MasterCard, bi verjetno, če pa je, recimo, AnonymousWorldMoney, verjetno ne. Zakaj? Zato, ker dobro razumemo, kako zasebna podjetja ustvarjajo decentralizirane sisteme, kakšni so njihovi cilji in kam to lahko pripelje. Oglejmo si podrobneje težave takšnih sistemov in kako jih lahko rešimo z uporabo tehnologij blockchain.

Recimo, da v pričakovani AnonymousWorldMoney stojijo strežniki z bazami podatkov, in dobro, če jih bo več v različnih podatkovnih centrih. Ko pošiljatelj prenese denar, se zabeleži transakcija, ki se replicira na vse strežnike, in denar pride do prejemnika.

Kaj nam stane zgraditi blockchain?

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

  1. Težava identifikacije udeležencev z ene strani in potreba po anonimnosti transakcij z druge. To pomeni, da je treba prenesti denar določenemu prejemniku in tako, da o tej transakciji nihče ne ve, razen udeležencev posla. Banke imajo številke računov in bančnih kartic, povezanih z določeno fizično ali pravno osebo, bančna tajnost pa ščiti informacije o transakcijah. Kdo pa jamči, da predpostavljena AnonymousWorldMoney ne uporablja osebnih podatkov in informacij o transakcijah v svoje namene?
  2. Kako zagotoviti, da je prejemnik prejel natančno tisto vsoto, ki mu je bila prenesena? Recimo, pošiljatelj je prenesel 100 $, prejemnik pa je prejel 10 $. Pošiljatelj pride v pisarno AnonymousWorldMoney s svojim potrdilom, uslužbenec pa pokaže svojo različico, kjer je zabeleženo, da je pošiljatelj prenesel le 10 $.
  3. Težava nezanesljivega okolja, na primer, prevara, znana kot double-spending. Nepošten udeleženec lahko porabi svoj saldo večkrat, preden se plačilo replicira na vse strežnike. CAP teorema, seveda, ni bila odpravljena in dosedanja skladnost bo v končni fazi dosežena, toda nekdo ne bo prejel denarja za opravljene storitve ali blago. Zato, če ni popolnega zaupanja v plačilno organizacijo ali udeležence transakcij, je treba zgraditi mrežo, ki temelji ne na zaupanju, ampak na kriptografiji.
  4. Pogoji AnonymousWorldMoney imajo omejeno število strežnikov, ki lahko postanejo nedostopni nenamerno ali z zlo namero.
  5. AnonymousWorldMoney bo zaračunal svoj očiten provizijo.
  6. Možnost upravljanja. Med uporabo Bitcoin-a se je izkazalo, da ljudje želijo ne le prenašati kovance med seboj, ampak tudi preverjati različne pogoje transakcij, programirati scenarije dela, samodejno izvajati dejanja glede na pogoje itd.

Kako blockchain rešuje te težave

  1. Identifikacija udeležencev se izvede s pomočjo para ključev: privatnega in javnega, algoritem digitalnega podpisa pa nedvoumno identificira pošiljatelja in prejemnika, pri tem pa ohrani njuni identiteti anonimni.
  2. Transakcije se zbirajo v bloke, izračuna se hash bloka, ki se zapiše v naslednji blok. Ta zaporedja zapisovanja hash v blokih je poimenovala tehnologijo blockchain, in prav to onemogoča neopazno spreminjanje / brisanje blokov ali posameznih transakcij iz blokov. Tako, če transakcija pride v blockchain, lahko z gotovostjo rečemo, da bodo njeni podatki ostali nespremenjeni.
  3. Preprečevanje prevare double-spending se doseže s konsenzom v omrežju, o katerih podatkih šteti kot veljavne, in katerih zavreči. V omrežju Bitcoin se konsenzus doseže s proof of work (PoW).
  4. Zanesljivost delovanja omrežja se doseže s tem, da je blockchain javno dostopen, kjer lahko vsak udeleženec zažene svojo vozlišče, pridobi popolno kopijo blockchaina in celo samostojno preverja transakcije glede pravilnosti. Treba je omeniti, da sodobni blockchaini omogočajo gradnjo ne le javnih (odprtih), ampak tudi zasebnih (zaprtih) blockchainov, pa tudi kombinirane sheme.
  5. Popolnoma se ne moremo izogniti proviziji v blockchainu, saj moramo plačati ljudem, ki podpirajo omrežje, vendar je v blockchainu potreba po proviziji tako prepričljivo dokazana, da ne ostane dvoma o njeni potrebi.
  6. Sodobni blockchaini omogočajo izvajanje poslovne logike, ki jo v blockchainu imenujemo pametne pogodbe. Logika pametnih pogodb se izvaja v različnih visokoh kakovostnih jezikih.

Nato bomo podrobneje obravnavali te rešitve.

Arhitektura blockchaina

Komponente blockchaina

Vsak udeleženec lahko zažene svojo vozlišče s polno kopijo blockchaina (full node). Polna vozlišča, ki lahko zapisujejo transakcije v blockchain, se imenujejo vozlišča soglasja (witness) ali rudarji (miner). Polna vozlišča, ki le preverjajo pravilnost transakcij, se imenujejo vozlišča revizije (audit). Lahki odjemalci (light clients) ne shranjujejo polnih kopij blockchaina, temveč komunicirajo s omrežjem, pri čemer uporabljajo polna vozlišča.
Večina uporabnikov za izvajanje transakcij uporablja prav lahke odjemalce ali spletne denarnice. Vsa vozlišča so povezana med seboj. S takim sklopom elementov postane arhitektura omrežja bolj odporna:

Kaj nam stane zgraditi blockchain?

Življenjska doba transakcije

Poglejmo življenjsko dobo transakcije in jo razčlenimo na dele:

Kaj nam stane zgraditi blockchain?

Tehnologije blockchaina

Osredotočimo se natančneje na tehnične rešitve in njihove povezave med seboj.

Identifikacija

Vsaka blockchain transakcija mora biti podpisana z digitalnim podpisom. Zato mora vsak udeleženec za izvedbo transakcije imeti par ključev: private / public. Par ključev se včasih imenuje denarnica (wallet), saj sta ključa nedvoumno povezana z edinstvenim digitalnim naslovom in saldom udeleženca. V resnici so ključi in naslovi preprosto vrstice števil v različnih številskih sistemih. Primeri ključev in naslova denarnice:

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

Za ustvarjanje digitalnega podpisa v blockchainih se uporablja algoritem, temelječ na eliptičnih krivuljah: Elliptic Curve Digital Signature Algorithm (ECDSA). Za njegovo delovanje se običajno naključno izbere 256-bitno število kot privatni ključ. Število možnih ključev znaša 2 na 256, zato lahko rečemo, da je praktično nemogoče najti ujemajoče se vrednosti privatnih ključev.

Nato se javni ključ pridobi iz privatnega s pomnoževanjem njegove vrednosti s koordinatami točke, ki leži na eliptični krivulji, kar privede do koordinat nove točke te iste krivulje. To dejanje zagotavlja pridobitev para ključev, primernega za digitalne podpise transakcij. In končno, naslov denarnice se nedvoumno izračuna iz javnega ključa.

Obstaja veliko člankov z informacijami o kriptografiji, uporabljeni v blockchainu, na primer: Bitcoin v jedru — Kriptografija

Privatni ključ mora ostati strogo povjerljiv i siguran. Javnu ključ poznaju svi. Ako se izgubi privatni ključ, pristup sredstvima (kovanicama) se ne može obnoviti i novac će biti izgubljen zauvijek. Zato je zadatak pouzdane pohrane privatnih ključeva krajnje važan, jer to nije banka gdje se uvijek može doći s osobnom iskaznicom i obnoviti račun. Postoji cijela industrija koja se bavi proizvodnjom, takozvanih, hladnih kripto novčanika, sličnih USB flash diskovima:

Kaj nam stane zgraditi blockchain?

ili se mogu koristiti pouzdaniji načini, kao što je, na primjer, otiskivanje vrijednosti privatnog ključa na tokenima:

Kaj nam stane zgraditi blockchain?

Transakcije

Više o strukturi transakcije možete pročitati u članku Bitcoin u sažetku — Transakcija. Važno je razumjeti da svaka transakcija ima barem sljedeće podatke:

From: 0x48C89c341C5960Ca2Bf3732D6D8a0F4f89Cc4368 - digitalna adresa pošiljatelja
To: 0x367adb7894334678b90аfe7882a5b06f7fbc783a - digitalna adresa primatelja
Value: 0.0001 - iznos transakcije
Transaction Hash: 0x617ede331e8a99f46a363b32b239542bb4006e4fa9a2727a6636ffe3eb095cef - hash transakcije

Nakon toga, transakcija se potpisuje privatnim ključem i prosljeđuje (vidi detalje o radu protokola Bitcoin u sažetku - Protokol) svim čvorovima u blockchainu koji verifikuju transakcije na valjanost. Algoritam provjere transakcije nije trivijalan i uključuje dvadesetak koraka.

Blokovi transakcija

Provjerama valjanosti transakcija, čvorovi formiraju blokove. Osim transakcija, u blok se zapisuje hash prethodnog bloka, broj (brojač Nonce), i vrši se izračunavanje hasha trenutnog bloka prema SHA-256 algoritmu. Hash mora ispunjavati određene uvjete. Na primjer, u Bitcoin mreži, težina hasha automatski se mijenja svaka 2 tjedna, ovisno o snazi mreže, kako bi blok bio generiran otprilike svake 10 minuta. Težina se određuje sljedećim uvjetom: pronađeni hash mora biti manji od prethodno zadanog broja. Ako ovaj uvjet nije ispunit, onda se Nonce povećava za 1, a rad na izračunavanju hasha se ponavlja. Za pronalaženje hasha koristi se polje Nonce, jer su to jedini podaci u bloku koje je moguće promijeniti, dok ostali moraju ostati nepromijenjeni. Ispravan hash mora imati određeni broj nula na početku, na primjer, jedan od stvarnih hash-eva:

000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91

Uspešno iskanje hasha je dokaz opravljenega dela (Proof-of-Work, PoW) za omrežja Bitcoin ali Ethereum. Postopek iskanja hash-ov imenujemo rudarjenje (mining), po analogiji z izkopavanjem zlata. Ime dovolj natančno opredeljuje bistvo postopka, saj gre za preprosto preizkušanje možnosti, in če kdo najde ustrezen hash, je to resnično sreča. Kot da bi našli pravi zlati samorod, ki se skriva med tonami praznih kamnin. Nagrada za blok trenutno znaša 12,5 BTC, in če to pomnožimo s trenutnim tečajem bitcoina 3900 $, dobimo več kot kilogram čistega zlata. Zato se splača boriti!

Po uspešnem iskanju hasha sta blok in sam najden hash zabeležena v blockchainu kot naslednji blok. Več o strukturi blokov lahko preberete v članku Bitcoin v jedrnati obliki - Blockchain, tukaj pa je poenostavljena shema:

Kaj nam stane zgraditi blockchain?

Blockchain se začne z blokom, ki še nima hasha prejšnjega bloka. Tak blok v blockchainu je edini in ima svoje ime Genesis block. Preostali bloki imajo enako strukturo in se razlikujejo le po številu transakcij. Resnične transakcije in bloki, ki nastajajo v tem trenutku v Bitcoin ali Ethereum, lahko spremljate v Block Explorer.

Velikost blokov v Bitcoin je omejena na 1MB, pri minimalnem volumnu informacij v transakciji okoli 200 bajtov pa lahko v bloku največ pomestimo približno 6000 transakcij. Odtod, mimogrede, izhaja tudi produktivnost Bitcoin, nad katero se vsi smejijo: blok se generira približno enkrat na 10 minut * 60 sek = 600 sek, kar daje formalno produktivnost okoli 10 TPS. Čeprav v resnici to ni produktivnost, temveč zavestno implementiran algoritem dela. V Ethereum so za konkurenco preprosto skrajšali čas generiranja bloka na 15 sek, kar je formalno povečalo produktivnost. Zato je v blockchainih, ki uporabljajo PoW kot konsenz, povsem nesmiselno primerjati produktivnost, saj je ta neposredno odvisna od težavnosti izračuna hasha, ki se lahko nastavi na poljuben nivo.

Forki

Kaj se zgodi, če na primer več vozlišč najde hashe, ki izpolnjujejo pogoje težavnosti, vendar so različni po vrednosti (z drugimi besedami, so dosegli različne vsote) in zapišejo bloke v blockchain? Poglejmo, kako se blockchain ščiti pred to situacijo. V tem primeru nastane tako imenovani fork ('vilica'), in blockchain ima dve različici verige:

Kaj nam stane zgraditi blockchain?

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

Kaj nam stane zgraditi blockchain?

Nekateri izmed teh blokov bodo prej najdeni in poslani v blockchain, in po pravilih se mora blockchain preklopiti na daljšo verigo ter preklicati vse transakcije iz alternativnega bloka:

Kaj nam stane zgraditi blockchain?

Pri tem lahko pride do situacije, kjer je bila transakcija udeleženca samo v enem izmed blokov forka, ki je bil preklican. Zato, da bi bili prepričani, da je potrebna transakcija zabeležena v blockchainu, obstaja splošno priporočilo — preden zaupate transakciji, morate počakati, da se naslednji bloki dodajo v blockchain. Priporočila, koliko blokov čakati za različne blockchaine, se razlikujejo. Na primer, za omrežje Bitcoin je minimum 2 bloka, maksimum 6.

Enaka slika s forkom blokov bo opažena tudi pri tako imenovanem napadu 51% — to je, ko skuša skupina rudarjev ustvariti alternativno verigo blokov, da bi dosegla preklic verige s svojimi goljufivimi transakcijami. Čeprav je trenutno bolj dobičkonosno porabiti svoje zmogljivosti za pošteno rudarjenje, namesto goljufanja.

Konsenz

Da bi bil blok zapisan v blockchain, se mora omrežje strinjati. Ponovimo nalogo doseganja konsenza v računalniških komunikacijskih omrežjih. Problem se formulira kot naloga bizantinskih generalov BFT (bizančinska odpornost na napake). Spustimo slikovito opisovanje problemov bizantinske vojske, nalogo lahko formuliramo takole: kako lahko vozlišča omrežja dosežejo skupni rezultat, če lahko del vozlišč omrežja namerno izkrivlja. Obstoječi algoritmi reševanja naloge BFT kažejo, da lahko omrežje deluje pravilno, če je število goljufov manjše od 1/3. Zakaj v omrežju Bitcoin ni bil uporabljen konsenz BFT? Zakaj je bilo treba uporabiti PoW? Obstaja več razlogov:

  • BFT dobro deluje z majhnim fiksnim naborom vozlišč, medtem ko je v javnem blockchainu število vozlišč nepredvidljivo, poleg tega pa se vozlišča lahko poljubno vključejo in izključijo.
  • Ljudje morajo biti motivirani, da zaženejo blockchain vozlišča. Za to morajo ljudje prejemati nagrade. V BFT formalno ni za kaj prejemati nagrade, medtem ko je v PoW vsem jasno, za kaj gre nagrada na intuitivni ravni: za električno energijo, ki jo porabi procesor pri iskanju hash blokov.

Poleg PoW obstaja še nekaj konsensov, ki se uporabljajo v sodobnih blockchainih, na primer:

  • PoS (Proof-of-Stake) — v blockchainu Hyperledger
  • DPoS (Delegated Proof-of-Stake) — v blockchainu BitShares
  • Modifikacije BFT: SBFT (Simplified BFT) in PBFT (Practical BFT), na primer v blockchainu Exonum

Malo se bomo ustavili pri konsensu PoS, saj so se prav PoS in njegove različice najbolj razširile v zasebnih blockchainih. Zakaj ravno v zasebnih? Po eni strani so lastnosti PoS boljše v primerjavi s PoW, saj so za dosego konsensa potrebni manjših računalniških virov, kar pomeni hitrejše zapisovanje podatkov v blockchain. Po drugi strani pa je v PoS več možnosti za goljufije, zato morajo biti vsi udeleženci blockchaina znani.

Konsens PoS 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, t.j. več kot imaš sredstev v zavarovanju, večja je verjetnost, da bo omrežje izbralo tvoje vozlišče za zapis bloka. Zavarovanje se ne povrne, če je blok neveljaven. Tako je zagotovljena zaščita pred goljufijami. Obstajajo naslednje variacije PoS:

  • Konsens Delegated PoS (DPoS) deli udeležence na 'glasovalne' in 'validacijske'. Nosilci kovancev (glasovalni udeleženci) delegirajo svoje pravice za preverjanje in zapisovanje transakcij v blockchain drugim udeležencem. Tako validatori opravijo vse računalniške naloge in za to prejmejo nagrado, medtem ko prisotnost glasovalnih udeležencev zagotavlja poštenost validatorjev, saj jih je mogoče kadarkoli zamenjati.
  • LPoS (Leased Proof-of-Stake) konsenz omogoča, da svoje sredstva oddate v najem drugim vozliščem, da imajo večjo možnost za preverjanje blokov. Tako lahko prejemate provizijo za transakcije, pri čemer ne sodelujete v sami preverjanju transakcij in rudarjenju blokov.

Obstaja še vrsta drugih konsenzov, ki doslej niso dosegli široke uporabe, tukaj jih bom preprosto našteval za informacijo, pregled samih algoritmov konsenza pa lahko pogledate, na primer v članku: Algoritmi Konsenza v Blokchainu.

  • 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)

Zanesljivost in modeli uvajanja blokchainov

Javni blokchain

Trdnost Public ali drugo ime Brez dovoljenja blockchain se doseže s tem, da se lahko vsak priključi in si ogleda informacije ali celo priključi svoje vozlišče, zaupanje pa se gradi na konsenzu PoW.

Zasebni blokchain

Private ili Private Permissioned blockchain. V teh blokchainih ima dostop do informacij le določen krog udeležencev (organizacij ali posameznikov). Ti blokchaini so zgrajeni s strani organizacij z namenom povečanja skupne koristi ali učinkovitosti. Njihovo zanesljivost zagotavljajo skupni cilji udeležencev in algoritmi konsenza PoS in BFT.

Blokchain-konzorcij

Postoje Consortium ili Javni dovoljen blokchain. To so taki blokchaini, kamor se lahko vsak priključi za ogled, vendar lahko udeleženec doda informacije ali priključi svoje vozlišče le s soglasjem drugih udeležencev. Ti blokchaini so zgrajeni s strani organizacij z namenom povečanja zaupanja s strani strank ali potrošnikov izdelkov ali družbe kot celote. Tukaj se zanesljivost prav tako doseže z prisotnostjo zaupanja med udeleženci in enakimi algoritmi konsenza PoS in BFT.

Pametne pogodbe

V blokchainedih sistemih, izvedenih po Bitcoinu, je bila v neki meri dodana možnost izvajanja pametnih pogodb. V bistvu je pametna pogodba transakcija, v kateri je vključen programski koda za izvedbo. Pametne pogodbe v Ethereum omrežju se izvajajo v EVM (Ethereum Virtual Machine). Da bi začeli izvajanje pametne pogodbe, jo je treba izrecno zagnati z drugo transakcijo ali pa morajo biti izpolnjeni predpogoji za njeno izvedbo. Rezultati izvedbe pametne pogodbe se prav tako zapišejo v blokchain.

Katero poslovno logiko je mogoče uresničiti s pametnimi pogodbami? V resnici jih ni veliko, na primer preverjanje pogojev na podlagi podatkov iz blockchaina, sprememba lastnikov digitalnih sredstev glede na te pogoje ter zapis podatkov v trajno shrambo znotraj blockchaina. Logika se izvaja v posebnem visokem jeziku Solidity.

Klasičen primer funkcionalnosti, ki se izvaja s pomočjo pametnih pogodb, je izdaja žetonov za izvedbo ICO. Na primer, uresničil sem pametno pogodbo za izdajo skromnih 500.000.000 AlexToken. Po povezavi v Etherscan se nahaja

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 binarna predstavitev, kot jo vidi mreža

60806040526000600355600060045533600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560146101000a81548160ff021916908360028111156200006f57fe5b0217905550620001036b019d971e4fe8401e74000000600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200024a6401000000000262000b1d179091906401000000009004565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620001986b019d971e4fe8401e740000006001546200024a6401000000000262000b1d179091906401000000009004565b6001819055506b033b2e3c9fd0803ce8000000600481905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6b019d971e4fe8401e740000006040518082815260200191505060405180910390a362000267565b600081830190508281101515156200025e57fe5b80905092915050565b611cb880620002776000396000f300608060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146104c7578063095ea7b31461055757806318160ddd146105bc57806323b872dd146105e7578063313ce5671461066c578063355274ea146106a3578063518ab2a8146106ce57806366188463146106f957806370a082311461075e57806389311e6f146107b55780638da5cb5b146107cc578063903a3ef61461082357806395d89b411461083a578063a9059cbb146108ca578063bf5839031461092f578063c7876ea41461095a578063cbcb317114610985578063d73dd623146109b0578063dd62ed3e14610a15578063f2fde38b14610a8c575b60008060008060006001600281111561012757fe5b600560149054906101000a900460ff16600281111561014257fe5b14151561014e57600080fd5b60003411151561015d57600080fd5b600060045411151561016e57600080fd5b3494506101a7670de0b6b3a764000061019968056bc75e2d6310000088610acf90919063ffffffff16565b610b0790919063ffffffff16565b9350600092506b033b2e3c9fd0803ce80000006101cf85600354610b1d90919063ffffffff16565b111561024c576101f66003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b915061022e670de0b6b3a764000061022068056bc75e2d6310000085610b0790919063ffffffff16565b610acf90919063ffffffff16565b90506102438186610b3990919063ffffffff16565b92508094508193505b61026184600354610b1d90919063ffffffff16565b6003819055506102886003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b6004819055506000831115610344573373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156102dd573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b610395846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a361045184600154610b1d90919063ffffffff16565b600181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156104bf573d6000803e3d6000fd5b505050505050005b3480156104d357600080fd5b506104dc610b52565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b506105d1610c7d565b6040518082815260200191505060405180910390f35b3480156105f357600080fd5b50610652600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c87565b604051808215151515815260200191505060405180910390f35b34801561067857600080fd5b50610681611041565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3480156106af57600080fd5b506106b8611046565b6040518082815260200191505060405180910390f35b3480156106da57600080fd5b506106e3611056565b6040518082815260200191505060405180910390f35b34801561070557600080fd5b50610744600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061105c565b604051808215151515815260200191505060405180910390f35b34801561076a57600080fd5b5061079f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ed565b6040518082815260200191505060405180910390f35b3480156107c157600080fd5b506107ca611335565b005b3480156107d857600080fd5b506107e16113eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082f57600080fd5b50610838611411565b005b34801561084657600080fd5b5061084f6114ab565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088f578082015181840152602081019050610874565b50505050905090810190601f1680156108bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d657600080fd5b50610915600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b604051808215151515815260200191505060405180910390f35b34801561093b57600080fd5b50610944611703565b6040518082815260200191505060405180910390f35b34801561096657600080fd5b5061096f611709565b6040518082815260200191505060405180910390f35b34801561099157600080fd5b5061099a611716565b6040518082815260200191505060405180910390f35b3480156109bc57600080fd5b506109fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611726565b604051808215151515815260200191505060405180910390f35b348015610a2157600080fd5b50610a76600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611922565b6040518082815260200191505060405180910390f35b348015610a9857600080fd5b50610acd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a9565b005b600080831415610ae25760009050610b01565b8183029050818382811515610af357fe5b04141515610afd57fe5b8090505b92915050565b60008183811515610b1457fe5b04905092915050565b60008183019050828110151515610b3057fe5b80905092915050565b6000828211151515610b4757fe5b818303905092915050565b6040805190810160405280600981526020017f416c6578546f6b656e000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610cc457600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d1157600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d9c57600080fd5b610ded826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e80826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5182600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60035481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561116d576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611201565b6111808382610b3990919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561139157600080fd5b60028081111561139d57fe5b600560149054906101000a900460ff1660028111156113b857fe5b141515156113c557600080fd5b6001600560146101000a81548160ff021916908360028111156113e457fe5b0217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561146d57600080fd5b60028081111561147957fe5b600560149054906101000a900460ff16600281111561149457fe5b141515156114a157600080fd5b6114a9611b01565b565b6040805190810160405280600381526020017f414c54000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561152157600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561156e57600080fd5b6115bf826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611652826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60045481565b68056bc75e2d6310000081565b6b019d971e4fe8401e7400000081565b60006117b782600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a0557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611a4157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600560146101000a81548160ff02191690836002811115611b2057fe5b021790555060006004541115611c0a57611ba5600454600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611c89573d6000803e3d6000fd5b505600a165627a7a723058205bbef016cc7699572f944871cb6f05e69915ada3a92a1d9f03a3fb434aac0c2b0029

Več informacij o pametnih pogodbah lahko najdete v članku: Kaj so pametne pogodbe v Ethereum.

Zaključek

Našteli smo tehnologije, na katerih temeljijo sodobne blok verige, in kako so med seboj povezane. Zdaj pa se posvetimo vprašanju, katere naloge lahko rešimo s pomočjo blok verige in katere rešitve so v najboljšem primeru še vedno neučinkovite. Torej, uporaba blok verige ni nujna, če:

  • Transakcije potekajo v zaupanja vrednem okolju;
  • Obstoječe provizije posrednikov ne poslabšajo življenja udeležencev;
  • Udeleženci nimajo lastnine, ki bi jo lahko predstavili v obliki digitalnih sredstev;
  • Ni razpršenosti v digitalnih sredstvih, tj. vrednost obvladuje ali zagotavlja samo en udeleženec.

Kakšna prihodnost čaka blok verigo? Zdaj lahko le domnevamo možne smeri razvoja blok verig tehnologij:

  • Blok veriga bo postala tako običajna tehnologija baz podatkov, kot sta SQL ali NoSQL za reševanje svojega določenega kroga nalog;
  • Blok veriga bo široko sprejet protokol, kot je HTTP za internet;
  • Blok veriga bo temelj nove finančne in politične spletne strukture planete!

V naslednjem delu bomo pogledali, kakšne blok verige trenutno obstajajo in za kaj se uporabljajo v različnih industrijah.

To je šele začetek!

Izvor: habr.com

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