Celá história lidstva je nepřetržitým zbavováním se řetězů a vytvářením nových, ještě silnějších. (Anonymní autor)
Při analýze mnoha blockchainových projektů (Bitshares, Hyperledger, Exonum, Ethereum, Bitcoin a další) chápu, že z technického hlediska jsou všechny postaveny na stejných principech. Blockchainy připomínají domy, které, ač mají různorodé konstrukce, dekorace a určení, mají společný základ, stěny, střechu, okna a dveře, které jsou vzájemně propojeny určitou formou. Pokud porozumíme základním principům projektování budov a známe vlastnosti použitých materiálů, můžeme určit cílové určení konkrétního domu. V současnosti existuje situace s blockchainem, kdy o něm slyšel každý, ale málokdo chápe jeho architekturu a principy fungování. To vede k nepochopení, proč a jak má smysl používat technologie blockchainu.
V tomto článku se podíváme na obecné vlastnosti a principy, které jsou pro všechny blockchainy společné. Dále se zaměříme na úkoly, které lze řešit pomocí blockchainu, a pro upevnění poznatků vytvoříme malý, ale skutečný blockchain na našem virtuálním pozemku!
Tak si připomeňme, jaké problémy blockchain původně řešil.
Jsem si jistý, že mnozí řeknou o distribuované, decentralizované, veřejné a neměnné databázi. Ale proč to všechno bylo potřebné?
Preferuji začít studium jakékoli technologie čtením standardů, protože právě na nich jsou založeny všechny články a knihy o daném tématu. Ale standardy blockchainu v současnosti chybí, v ISO jsou vytvořeny pouze pro jejich vývoj. V současné době má každý veřejný blockchainový projekt svůj dokument White paper, který je v podstatě technickým zadáním. Prvním veřejně známým blockchainovým projektem je síť Bitcoin. Navštívíme oficiální stránky sítě a jak všechno začalo.
Úkol blockchainu
Úkolem, který blockchain v síti průkopníka Bitcoin vyřešil, je důvěryhodný převod vlastnictví na digitální aktiva (assets) v nedůvěryhodném prostředí bez prostředníků. Například v síti Bitcoin je digitálním aktivem digitální mince bitcoin. A všechna technická řešení Bitcoin a dalších blockchainů se soustředí na řešení tohoto úkolu.
Problémy, které blockchain řeší
Povedzme, že nejaká finančná organizácia tvrdí, že vybudovala sieť po celom svete, pomocou ktorej je možné prevádzať peniaze komukoľvek. Uveríte jej? Ak je táto organizácia Visa alebo MasterCard, pravdepodobne jej uveríte, ale ak je to, povedzme, AnonymousWorldMoney, asi nie. Prečo? Pretože veľmi dobre vieme, ako sa vytvárajú distribuované systémy súkromnými spoločnosťami, s akými cieľmi a k čomu to môže viesť. Pozrime sa podrobnejšie na problémy takýchto systémov a na to, ako ich možno riešiť pomocou technológií blockchain.
Predpokladajme, že v podmienkovej AnonymousWorldMoney sú servery s databázami, a dobre, ak ich bude niekoľko v rôznych dátových centrách. Keď odosielateľ prevádza peniaze, registruje sa transakcia, ktorá sa replikovaný na všetky servery, a peniaze dorazia k príjemcovi.

V ideálnom svete takýto systém funguje dokonale, v našom však vznikajú nasledujúce problémy:
- Problém identifikácie účastníkov z jednej strany a potreba anonymity transakcií z druhej. T.j. treba previesť peniaze konkrétnemu príjemcovi a tak, aby o tejto transakcii nikto nevedel, okrem účastníkov obchodu. Banky majú čísla účtov a bankových kariet, ktoré sú viazané na konkrétne fyzické alebo právnické osoby, a bankové tajomstvo chráni informácie o transakciách. A kto zaručí, že podmienečná AnonymousWorldMoney nevyužíva osobné údaje a informácie o transakciách vo svoj prospech?
- Ako sa uistiť, že príjemca dostal presne tú sumu, ktorú mu poslali? Povedzme, odosielateľ poslal 100 dolárov, a príjemca dostal 10 dolárov. Odosielateľ príde do kancelárie AnonymousWorldMoney so svojím potvrdením, ale úradník ukáže svoju verziu, kde je zapísané, že odosielateľ previedol len 10 dolárov.
- Problém nedôvery, napríklad podvod nazývaný double-spending. Nečestný účastník môže minúť svoj zostatok niekoľkokrát, kým platba nebola replikovaná na všetkých serveroch. , samozrejme, nikto nezrušil, a konzistencia nakoniec bude dosiahnutá, ale niekto nedostane peniaze za poskytnuté služby alebo tovar. Preto, ak neexistuje plná dôvera k platobnej organizácii alebo účastníkom obchodov, je potrebné vybudovať sieť založenú nie na dôvere, ale na kryptografii.
- Podmienečný AnonymousWorldMoney má konečný počet serverov, ktoré môžu neúmyselne alebo zlomyseľne prestať byť dostupné.
- AnonymousWorldMoney si vezme svoju významnú províziu.
- Možnosť riadenia. V priebehu používania Bitcoinu sa zistilo, že ľudia chcú nielen prevádzať mince medzi sebou, ale aj overovať rôzne podmienky transakcie, programovať pracovné scenáre, automaticky vykonávať akcie na základe podmienok a pod.
Ako blockchain rieši tieto problémy
- Identifikácia účastníkov prebieha prostredníctvom kľúčového páru: súkromného a verejného, pričom algoritmus digitálneho podpisu jednoznačne identifikuje odosielateľa a príjemcu, zachovávajúc ich totožnosti anonymné.
- Transakcie sa zhromažďujú do blokov, počíta sa hash bloku, ktorý sa zapíše do nasledujúceho bloku. Takáto sekvencia zapisovania hashov v blokoch dala názov technológii blockchain a zároveň znemožňuje nenápadne meniť alebo odstraňovať bloky či jednotlivé transakcie z blokov. Ak transakcia vstúpila do blockchainu, je možné si byť istý, že jej údaje ostanú nezmenené.
- Podvod double-spending sa zabraňuje dosiahnutím konsenzu v sieti, ktoré údaje považovať za pravdivé a ktoré vyhodiť. V sieti Bitcoin sa konsenzus dosahuje dôkazom vykonania práce PoW (Proof-of-Work).
- Spoľahlivosť fungovania siete je dosahovaná tým, že blockchain je verejný, kde každý účastník môže spustiť svoju uzol, získať úplnú kópiu blockchainu a, čo je ešte dôležitejšie, sám začať overovať transakcie na správnosť. Je potrebné poznamenať, že moderné blockchainy umožňujú budovať nielen verejné (otvorené), ale aj súkromné (uzavreté) blockchainy, ako aj používať kombinované schémy.
- Z komisii v blockchainu sa úplne nezbavíme, pretože je potrebné platiť ľuďom, ktorí podporujú sieť, ale v blockchainu je nevyhnutnosť komisie tak presvedčivo dokázaná, že nezostávajú žiadne pochybnosti o jej nevyhnutnosti.
- Moderné blockchainy majú schopnosť realizovať biznis logiku, ktorá sa v blockchainu nazýva Smart Contracts. Logika smart kontraktov sa realizuje v rôznych vysokých jazykov.
Ďalej si tieto riešenia podrobnejšie preberieme.
Architektúra blockchainu
Súčasti blockchainu
Každý účastník môže spustiť svoju uzol s plnou kópiou blockchainu (full node). Plné uzly, ktoré môžu zapisovať transakcie do blockchainu, sa nazývajú uzly konsenzu (witness) alebo baníci (miner). Plné uzly, ktoré iba overujú správnosť transakcií, sa nazývajú uzly auditu (audit). Ľahké klienty (light clients) neinštalujú plné kópie blockchainu, ale komunikujú so sieťou pomocou plných uzlov.
Väčšina používateľov na uskutočnenie transakcií používa práve ľahké klienty alebo webové peňaženky. Všetky uzly sú navzájom prepojené. Pri takomto usporiadaní sa architektúra siete stáva odolnejšou:

Životný cyklus transakcie
Pozrime sa na životný cyklus transakcie a rozoberme ho na časti:

Technológie blockchainu
Zastavme sa podrobnejšie pri technických riešeniach a ich vzťahoch navzájom.
Identifikácia
Každá blockchain transakcia musí byť podpísaná digitálnym podpisom. Preto pre uskutočnenie transakcie musí mať každý účastník pár kľúčov: private / public. Niekedy sa pár kľúčov nazýva peňaženka (wallet), pretože kľúče sú jednoznačne spojené s jedinečnou digitálnou adresou a zostatkom účastníka. V skutočnosti sú kľúče a adresy len reťazce číslic v rôznych sústavách. Príklady kľúčov a adresy peňaženky:
Privátny kľúč: 0a78194a8a893b8baac7c09b6a4a4b4b161b2f80a126cbb79bde231a4567420f
Verejný kľúč: 0579b478952214d7cddac32ac9dc522c821a4489bc10aac3a81b9d1cd7a92e57ba
Adresa: 0x3814JnJpGnt5tB2GD1qfKP709W3KbRdfb27VNa vytvorenie digitálneho podpisu v blockchainoch sa používa algoritmus založený na eliptických krivkách: Elliptic Curve Digital Signature Algorithm (ECDSA). Pre jeho fungovanie sa privátny kľúč (256-bitové číslo) zvyčajne náhodne vyberá. Počet možností kľúčov predstavuje 2 na 256, takže môžeme hovoriť o praktickej nemožnosti zhodovania hodnôt privátnych kľúčov.
Ďalej, verejný kľúč sa získava z privátneho kľúča vynásobením jeho hodnoty s súradnicami bodu nachádzajúceho sa na eliptickej krivke, pričom sa získajú súradnice nového bodu tej istej krivky. Tento krok zaručuje získanie páru kľúčov, ktoré sú vhodné pre digitálne podpisy transakcií. A nakoniec adresa peňaženky sa jednoznačne vypočíta z verejného kľúča.
Existuje množstvo článkov s podrobnosťami o kryptografii používané v blockchainoch, napríklad:
Súkromný kľúč musí zostať striktne tajný a musí byť v bezpečí. Verejný kľúč pozná každý. Pri strate súkromného kľúča nie je možné obnoviť prístup k aktívu (mince) a peniaze sa navždy stratia. Preto je úloha spoľahlivého uchovávania súkromných kľúčov mimoriadne aktuálna, pretože to nie je banka, do ktorej možno prísť s občianskym preukazom a obnoviť účet. Existuje celá priemyselná odvetvie výroby takzvaných studených krypto peňaženiek, podobných na USB kľúče:

alebo je možné použiť spoľahlivejšie metódy, napríklad vyraziť hodnotu súkromného kľúča na žetónoch:

Transakcie
Viac o štruktúre transakcie si môžete prečítať v článku . Nám však ide o to, že každá transakcia má minimálne nasledujúce údaje:
Od: 0x48C89c341C5960Ca2Bf3732D6D8a0F4f89Cc4368 - digitálna adresa odosielateľa
Do: 0x367adb7894334678b90a fe7882a5b06f7fbc783a - digitálna adresa príjemcu
Hodnota: 0.0001 - suma transakcie
Hash transakcie: 0x617ede331e8a99f46a363b32b239542bb4006e4fa9a2727a6636ffe3eb095cef - hash transakcieĎalej sa transakcia podpisuje súkromným kľúčom a rozosiela sa (pozri podrobnosti o práci protokolu ) všetkým uzlom v blockchaine, ktoré overujú transakcie na platnosť. Algoritmus overovania transakcie nie je triviálny a zahŕňa .
Bloky transakcií
Po overení platnosti transakcií uzly vytvárajú bloky z týchto transakcií. Okrem transakcií sa do bloku zapisuje hash predchádzajúceho bloku, číslo (čítač Nonce) a vykonáva sa výpočtovanie hash súčasného bloku podľa algoritmu SHA-256. Hash musí spĺňať stanovené podmienky náročnosti. Napríklad v sieti Bitcoin sa náročnosť hashu automaticky mení raz za 2 týždne v závislosti od výkonu siete, aby sa blok generoval približne raz za 10 minút. Náročnosť sa určuje nasledujúcou podmienkou: nájdený hash musí byť menší ako vopred stanovené číslo. Ak táto podmienka nie je splnená, k Nonce sa pridá 1 a práca na výpočte hashu sa opakuje. Na hľadanie hashu sa používa pole Nonce, pretože to sú jediné údaje v bloku, ktoré je možné zmeniť, ostatné musia zostať nezmenené. Správny hash by mal mať určité množstvo núl na začiatku, napríklad jeden z reálnych hashov:
000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91Úspešné nájdenie hash-u je dôkazom vykonanej práce (Proof-of-Work, PoW) pre siete Bitcoin alebo Ethereum. Proces hľadania hash-ov sa nazýva mining, podobne ako ťažba zlata. Názov presne vystihuje podstatu procesu, pretože dochádza k jednoduchému preberaniu možností, a ak niekto našiel vhodný hash, je to naozaj šťastie. Je to ako nájsť skutočný zlatý nuget v tonách bezcenných hornín. Odmena za blok je teraz 12,5 BTC, a ak to vynásobíme aktuálnym kurzom bitcoinu $3900, dostaneme viac ako kilogram čistého zlata. Je za čo bojovať!
Po úspešnom nájdení hash-u sa blok a samotný nájdený hash zapíšu do blockchainu ako nasledujúci blok. Podrobnejšie o štruktúre blokov si môžete prečítať v článku , a nižšie uvediem zjednodušenú schému:

Blockchain začína s blokom, ktorý ešte nemá hash predchádzajúceho bloku. Taký blok v blockchaine existuje len jeden a má vlastný názov Genesis block. Ostatné bloky majú rovnakú štruktúru a líšia sa len počtom transakcií. Skutočné transakcie a bloky, ktoré sa vytvárajú v súčasnosti v Bitcoin alebo Ethereum, môžete sledovať v .
Veľkosť blokov v Bitcoin je obmedzená na 1MB a pri minimálnom objeme informácií v transakcii okolo 200 bajtov môže maximálne v bloku byť okolo 6000 transakcií. Odtiaľ pramení aj výkon Bitcoin-u, na ktorý sa všetci smejú: blok sa generuje zhruba raz za 10 minút * 60 sek = 600 sekúnd, čo dáva formálny výkon približne 10 TPS. Aj keď v skutočnosti – to nie je výkon, ale vedome realizovaný algoritmus práce. V Ethereum kvôli konkurencii jednoducho znížili čas generácie bloku na 15 sekúnd a výkon formálne vzrástol. Preto v blockchains, využívajúcich PoW ako konsenzus, je vôbec bez zmyslu porovnávať výkon, pretože priamo závisí od zložitosti výpočtu hash-u, ktorú je možné určiť akúkoľvek.
Forky
A čo sa stane, ak napríklad niekoľko uzlov nájde hashe vyhovujúce podmienkam zložitosti, ale rôzne hodnoty (inými slovami, dospeli k rôznym konsenzom) a zapíšu bloky do blockchainu? Pozrime sa, ako sa blockchain chráni pred touto situáciou. V takom prípade dochádza k takzvanému fork ('vidlici'), a blockchain má dve verzie reťazca:

Čo sa deje ďalej? Ďalej časť siete začne pracovať na bloku N+2 z jednej reťaze, a časť z druhej:

Niektorý z týchto blokov bude nájdený skôr a odoslaný do blockchainu a potom podľa pravidiel blockchainu bude musieť prepnúť na dlhšiu reťaz a zrušiť všetky transakcie z alternatívneho bloku:

Pri tom môže nastať situácia, keď transakcia účastníka bola len v jednom z blokov forku, ktorý bol zrušený. Preto, aby ste si boli istí, že potrebná transakcia bola zapísaná do blockchainu, existuje všeobecná odporúčanie — predtým, ako dôverujete transakcii, počkajte, kým sa do blockchainu nepridajú nasledujúce niekoľko blokov. Odporúčania, koľko blokov čakať pre rôzne blockchainy, sa líšia. Napríklad, pre sieť Bitcoin je minimum 2 bloky, maximum 6.
Podobný obraz s forkom blokov sa bude pozorovať aj pri takzvanej 51% útoku — keď sa skupina minerov snaží vytvoriť alternatívny reťazec blokov a dosiahnuť zrušenie reťazca so svojimi podvodnými transakciami. Aj keď v súčasnosti je namiesto podvodu výhodnejšie využiť svoje výkony na čestný mining.
Konsenzus
Na zapísanie bloku do blockchainu musí sieť dosiahnuť konsenzus. Poďme si pripomenúť úlohu dosiahnuť konsenzus v počítačových komunikačných sieťach. Problém je formulovaný ako úloha byzantských generálov BFT (). Opúšťajúc malebný opis problémov byzantskej armády, úlohu môžeme formulovať takto: ako môžu uzly siete dosiahnuť spoločný výsledok, ak časť uzlov siete môže vedome skresľovať informácie. Existujúce algoritmy na riešenie úlohy BFT ukazujú, že sieť môže fungovať správne, ak sú podvodníci menej ako 1/3. Prečo nebol v sieti Bitcoin použitý konsenzus BFT? Prečo bolo potrebné použiť PoW? Je niekoľko dôvodov:
- BFT dobre funguje s malou pevných sadou uzlov, zatiaľ čo v verejných blockchainoch je počet uzlov nepředvídatelný a navyše sa uzly môžu náhodne zapínať a vypínať.
- Je potrebné motivovať ľudí spustiť blockchain uzly. Na to musia ľudia dostávať odmenu. V BFT nie je formálne dôvod na získanie odmeny, ale odmena v PoW je pre všetkých intuitívne jasná: za elektrinu, ktorú procesor spotrebuje počas hľadania hashu bloku.
Okrem PoW existuje aj niekoľko konsenzusov, ktoré sa používajú v moderných blockchainoch, napríklad:
- PoS (Proof-of-Stake) — v blockchainoch
- DPoS (Delegated Proof-of-Stake) — v blockchainoch
- Modifikácie BFT: SBFT (Simplified BFT) a PBFT (Practical BFT), napríklad v blockchainoch
Trochu sa zastavíme pri konsenze PoS, pretože práve PoS a jeho varianty získali najväčšiu popularitu v privátnych blockchainoch. Prečo práve v privátnych? Na jednej strane má PoS lepšie charakteristiky v porovnaní s PoW, pretože na dosiahnutie konsenzu sú potrebné menšie výpočtové zdroje, čo znamená, že sa zvyšuje rýchlosť zápisu údajov do blockchainu. Na druhej strane, v PoS je viac možností na podvody, a preto na neutralizáciu tohto musia byť všetci účastníci blockchainu známi.
Konsenzus PoS je založený na výbere uzla, ktorý môže zapísať blok s transakciami do blockchainu v závislosti od množstva prostriedkov na účte, presnejšie, nie na účte, ale v záruke. T.j. čím viac máš prostriedkov v záruke, tým je väčšia pravdepodobnosť, že sieť vyberie tvoj uzol na zápis bloku. Záruka sa nevráti, ak je blok neplatný. Týmto spôsobom je implementovaná ochrana pred podvodmi. Existujú nasledujúce variácie PoS:
- Konsenzus Delegated PoS (DPoS) rozdeľuje účastníkov na "hlasujúcich" a "validujúcich". Držitelia mincí (hlasujúci účastníci) delegujú svoje právo kontrolovať a zapisovať transakcie do blockchainu iným účastníkom. Takto validátori vykonávajú celú výpočtovú prácu a dostávajú za to odmenu, zatiaľ čo prítomnosť hlasujúcich účastníkov zaručuje čestnosť validátorov, pretože ich možno kedykoľvek vymeniť.
- Konsenz LPoS (Leased Proof-of-Stake) umožňuje prenájom vašich prostriedkov iným uzlom, aby mali väčšiu šancu na overenie blokov. Takto môžete získať provízie za transakcie, pričom sa sami nezúčastňujete na overovaní transakcií a ťažbe blokov.
Existuje ďalších niekoľko konsenzov, ktoré zatiaľ nezískali široké uplatnenie, tu ich len vymenujem pre informáciu, a prehľad samotných algoritmov konsenzu si môžete pozrieť napríklad v článku: .
- 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)
Spoľahlivosť a modely nasadenia blockchainov
Verejný blockchain
Trvácnosť Public alebo iný názov Blockchain bez povolenia je dosiahnutá tým, že sa každý môže pripojiť a zobraziť informácie alebo dokonca pripojiť svoj uzol, pričom dôvera sa buduje na konsenze PoW.
Súkromný blockchain
Private alebo Súkromný povolený blockchain. V týchto blockchoins má prístup k informáciám len určitá skupina účastníkov (organizácií alebo jednotlivcov). Takéto blockchainy budujú organizácie s cieľom zvýšiť celkový prospech alebo efektivitu. Ich spoľahlivosť je zabezpečená spoločnými cieľmi účastníkov a algoritmami konsenzu PoS a BFT.
Blockchainový konzorcium
Existujú Konzorcium alebo Verejný povolený blockchain. Sú to také blockchiny, ku ktorým sa môže každý pripojiť na prezeranie, ale informácie môže pridať alebo pripojiť svoj uzol účastník iba so súhlasom ostatných účastníkov. Takéto blockchainy budujú organizácie s cieľom zvýšiť dôveru zo strany zákazníkov alebo spotrebiteľov produktov alebo spoločnosti ako celku. Spoľahlivosť sa tiež dosahuje prítomnosťou dôvery medzi účastníkmi a týmito istými algoritmami konsenzu PoS a BFT.
Smart Contracts
Do blockchainov, ktoré boli realizované po Bitcoine, bola do určitej miery pridaná možnosť vykonávania smart kontraktov. V podstate je smart kontrakt transakcia, do ktorej je vložený programový kód na vykonanie. Smart kontrakty v sieti Ethereum sa vykonávajú v EVM (Ethereum Virtual Machine). Aby sa smart kontrakt mohol začať vykonávať, musí byť explicitne spustený inou transakciou, alebo musia byť splnené podmienky na vykonanie. Výsledky vykonania smart kontraktu sa tiež zapíšu do blockchainu. Získavanie údajov zvonka blockchainu je možné, ale mimoriadne obmedzené.
Akú obchodnú logiku je možné realizovať pomocou smart kontraktov? V skutočnosti ich nie je veľa, napríklad kontrola podmienok na základe údajov z blockchainu, zmena vlastníkov digitálnych aktív na základe týchto podmienok, zápis údajov do trvalého úložiska v rámci blockchainu. Logika sa realizuje v špeciálnom programovacom jazyku Solidity.
Klasickým príkladom funkčnosti, ktorú realizujú pomocou smart kontraktov, je vydávanie tokenov na realizáciu ICO. Napríklad som vytvoril smart kontrakt na vydanie skromných 500 000 000 AlexToken. Podľa v stave, ktorý už prešiel hlavným testovaním špeciálnymi tímami hodnotenia kvality. Pred tým, ako je produkt dodávaný širokým masám, sa navyše vykonáva konečná kontrola na svojich zamestnancoch, ktorí sa na vývoji nepodieľali.
zdrojový kód smart kontraktu v jazyku 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;
}a binárne zobrazenie, ako ho vidí sieť
60806040526000600355600060045533600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560146101000a81548160ff021916908360028111156200006f57fe5b0217905550620001036b019d971e4fe8401e74000000600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200024a6401000000000262000b1d179091906401000000009004565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620001986b019d971e4fe8401e740000006001546200024a6401000000000262000b1d179091906401000000009004565b6001819055506b033b2e3c9fd0803ce8000000600481905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6b019d971e4fe8401e740000006040518082815260200191505060405180910390a362000267565b600081830190508281101515156200025e57fe5b80905092915050565b611cb880620002776000396000f300608060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146104c7578063095ea7b31461055757806318160ddd146105bc57806323b872dd146105e7578063313ce5671461066c578063355274ea146106a3578063518ab2a8146106ce57806366188463146106f957806370a082311461075e57806389311e6f146107b55780638da5cb5b146107cc578063903a3ef61461082357806395d89b411461083a578063a9059cbb146108ca578063bf5839031461092f578063c7876ea41461095a578063cbcb317114610985578063d73dd623146109b0578063dd62ed3e14610a15578063f2fde38b14610a8c575b60008060008060006001600281111561012757fe5b600560149054906101000a900460ff16600281111561014257fe5b14151561014e57600080fd5b60003411151561015d57600080fd5b600060045411151561016e57600080fd5b3494506101a7670de0b6b3a764000061019968056bc75e2d6310000088610acf90919063ffffffff16565b610b0790919063ffffffff16565b9350600092506b033b2e3c9fd0803ce80000006101cf85600354610b1d90919063ffffffff16565b111561024c576101f66003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b915061022e670de0b6b3a764000061022068056bc75e2d6310000085610b0790919063ffffffff16565b610acf90919063ffffffff16565b90506102438186610b3990919063ffffffff16565b92508094508193505b61026184600354610b1d90919063ffffffff16565b6003819055506102886003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b6004819055506000831115610344573373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156102dd573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b610395846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a361045184600154610b1d90919063ffffffff16565b600181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156104bf573d6000803e3d6000fd5b505050505050005b3480156104d357600080fd5b506104dc610b52565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b506105d1610c7d565b6040518082815260200191505060405180910390f35b3480156105f357600080fd5b50610652600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c87565b604051808215151515815260200191505060405180910390f35b34801561067857600080fd5b50610681611041565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3480156106af57600080fd5b506106b8611046565b6040518082815260200191505060405180910390f35b3480156106da57600080fd5b506106e3611056565b6040518082815260200191505060405180910390f35b34801561070557600080fd5b50610744600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061105c565b604051808215151515815260200191505060405180910390f35b34801561076a57600080fd5b5061079f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ed565b6040518082815260200191505060405180910390f35b3480156107c157600080fd5b506107ca611335565b005b3480156107d857600080fd5b506107e16113eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082f57600080fd5b50610838611411565b005b34801561084657600080fd5b5061084f6114ab565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088f578082015181840152602081019050610874565b50505050905090810190601f1680156108bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d657600080fd5b50610915600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b604051808215151515815260200191505060405180910390f35b34801561093b57600080fd5b50610944611703565b6040518082815260200191505060405180910390f35b34801561096657600080fd5b5061096f611709565b6040518082815260200191505060405180910390f35b34801561099157600080fd5b5061099a611716565b6040518082815260200191505060405180910390f35b3480156109bc57600080fd5b506109fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611726565b604051808215151515815260200191505060405180910390f35b348015610a2157600080fd5b50610a76600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611922565b6040518082815260200191505060405180910390f35b348015610a9857600080fd5b50610acd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a9565b005b600080831415610ae25760009050610b01565b8183029050818382811515610af357fe5b04141515610afd57fe5b8090505b92915050565b60008183811515610b1457fe5b04905092915050565b60008183019050828110151515610b3057fe5b80905092915050565b6000828211151515610b4757fe5b818303905092915050565b6040805190810160405280600981526020017f416c6578546f6b656e000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610cc457600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d1157600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d9c57600080fd5b610ded826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e80826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5182600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60035481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561116d576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611201565b6111808382610b3990919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561139157600080fd5b60028081111561139d57fe5b600560149054906101000a900460ff1660028111156113b857fe5b141515156113c557600080fd5b6001600560146101000a81548160ff021916908360028111156113e457fe5b0217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561146d57600080fd5b60028081111561147957fe5b600560149054906101000a900460ff16600281111561149457fe5b141515156114a157600080fd5b6114a9611b01565b565b6040805190810160405280600381526020017f414c54000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561152157600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561156e57600080fd5b6115bf826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611652826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60045481565b68056bc75e2d6310000081565b6b019d971e4fe8401e7400000081565b60006117b782600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a0557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611a4157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600560146101000a81548160ff02191690836002811115611b2057fe5b021790555060006004541115611c0a57611ba5600454600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611c89573d6000803e3d6000fd5b505600a165627a7a723058205bbef016cc7699572f944871cb6f05e69915ada3a92a1d9f03a3fb434aac0c2b0029Ďalšie podrobnosti o smart kontraktoch nájdete v článku: .
Záver
Vypísali sme technológie, na ktorých sú postavené moderné blockchainy, a ako sú navzájom prepojené. Teraz si formulujme, aké úlohy je možné riešiť pomocou blockchainu a aké budú, v lepšom prípade, neefektívne. Takže použitie blockchainu nie je nutné, ak:
- Transakcie sa vykonávajú v dôveryhodnom prostredí;
- Prítomnosť provízií prostredníkov nezhoršuje život účastníkov;
- Účastníci nemajú majetok, ktorý by bolo možné reprezentovať ako digitálne aktíva;
- Nie je roztrhnutosť v digitálnych aktívach, t.j. hodnotou disponuje alebo ju dodáva len jeden účastník.
Aká budúcnosť čaká blockchain? Teraz môžeme iba predpokladať možné smerovanie vývoja blockchainových technológií:
- Blockchain sa stane takou bežnou technológiou databáz, ako napríklad SQL alebo NoSQL na riešenie svojho určitého okruhu úloh;
- Blockchain sa stane široko používaným protokolom, ako HTTP pre Internet;
- Blockchain sa stane základom pre nový finančný a politický systém planéty!
V nasledujúcej časti sa pozrieme, aké blockchainy teraz existujú a na čo sa používajú v rôznych priemysloch.
Toto je len začiatok!
Zdroj: habr.com
