Celá historie lidstva je nekonečné osvobozování se od řetězů a vytváření nových, ještě silnějších. (Autor anonymní)
Analýzou mnoha projektů blockchainu (Bitshares, Hyperledger, Exonum, Ethereum, Bitcoin a další) si uvědomuji, že z technického hlediska jsou všechny postaveny na stejných principech. Blockchainy jsou jako domy, které, i když se jejich konstrukce, dekorace a účely liší, mají základ, stěny, střechu, okna, dveře, které jsou mezi sebou propojeny určitými způsoby. A pokud pochopíme základní principy navrhování budov, známe vlastnosti používaných materiálů, můžeme určit cílové určení konkrétního domu. V současné době se kolem blockchainu vytvořila situace, kdy o něm slyšel každý, ale málokdo rozumí jeho architektuře a principům fungování. Proto vzniká nepochopení, proč a jak má smysl používat technologie blockchainu.
V tomto článku si podrobněji probereme obecné vlastnosti a principy, které platí pro všechny blockchainy. Dále se podíváme na úkoly, které lze řešit pomocí blockchainu, a pro upevnění materiálu vytvoříme malý, ale skutečný blockchain na svém virtuálním pozemku!
Takže si připomeňme, jaké problémy blockchain původně vyřešil.
Jsem si jistý, že mnozí řeknou o distribuované, decentralizované, veřejné a neměnné databázi. Ale k čemu to všechno bylo potřeba?
Dávám přednost 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 zkoumaném tématu. Ale standardy blockchainu v současnosti chybí, v ISO byly vytvořeny pouze pro jejich vývoj. V současné době má každý veřejný projekt blockchainu svůj dokument White paper, který vlastně představuje technickou specifikaci. Prvním veřejně známým projektem blockchainu je síť Bitcoin. Přejděme na oficiální web sítě a odkud to všechno začalo.
Úloha blockchainu
Úkolem, který blockchain v síti pionýra Bitcoin vyřešil, je zajištění důvěryhodného převodu vlastnictví digitálních aktiv v nedůvěryhodném prostředí bez prostředníků. Například v síti Bitcoin je digitální aktivum — digitální mince bitcoin. A všechna technická řešení Bitcoin a dalších blockchainů se soustředí na řešení této úlohy.
Problémy, které blockchain řeší
Představte si, že nějaká finanční instituce tvrdí, že vytvořila síť po celém světě, pomocí které lze převádět peníze každému. věřili byste jí? Pokud je tato instituce Visa nebo MasterCard, pravděpodobně byste věřili, ale pokud by to byla například AnonymousWorldMoney, asi ne. Proč? Protože dobře víme, jak soukromé společnosti vytvářejí distribuované systémy, s jakými cíli a k čemu to může vést. Pojďme podrobněji prozkoumat problémy takových systémů a jak je možné je řešit pomocí technologií blockchain.
Představme si, že v hypotetické AnonymousWorldMoney jsou servery s databázemi, a je dobré, pokud jich bude několik v různých datových centrech. Když odesílatel převádí peníze, registruje se transakce, která se replikují na všechny servery, a peníze dorazí k příjemci.

V ideálním světě takový systém skvěle funguje, ale v našem se objevují následující problémy:
- Problém identifikace účastníků na jedné straně a potřeba anonymity transakcí na straně druhé. Totiž, je třeba převést peníze konkrétnímu příjemci a tak, aby o této transakci nikdo nevěděl, kromě účastníků dohody. Banky mají čísla účtů a bankovních karet, které jsou spojeny s konkrétní fyzickou nebo právnickou osobou, a bankovní tajemství chrání informace o transakcích. A kdo zaručuje, že hypotetická AnonymousWorldMoney nepoužívá osobní údaje a informace o transakcích pro své cíle?
- Jak se ujistit, že příjemce dostal přesně tu částku, kterou mu poslali? Tedy, řekněme, odesílatel poslal 100 $, a příjemce dostal 10 $. Odesílatel přijde do kanceláře AnonymousWorldMoney se svou účtenkou, a úředník mu ukáže svou verzi, kde je uvedeno, že odesílatel poslal pouze 10 $.
- Problém nedůvěryhodného prostředí, například podvod, zvaný double-spending. Nepracující účastník může utratit svůj zůstatek několikrát, než se platba replikovala na všechny servery. , samozřejmě, nikdo nezrušil, a konzistence nakonec bude dosažena, ale někdo nedostane peníze za poskytnuté služby nebo zboží. Proto, pokud není úplná důvěra k platební instituci nebo účastníkům obchodů, je třeba budovat síť založenou nikoli na důvěře, ale na kryptografii.
- Podmíněná AnonymousWorldMoney má konečný počet serverů, které mohou být nedostupné neúmyslně nebo zlým úmyslem.
- AnonymousWorldMoney si vezme svou citelnou provizi.
- Možnost správy. Během provozu Bitcoinu se ukázalo, že lidé nechtějí jen převádět mince mezi sebou, ale také kontrolovat různé podmínky přenosu, programovat scénáře činnosti, automaticky vykonávat akce podle stanovených podmínek atd.
Jak blockchain tyto problémy řeší
- Identifikace účastníků se provádí pomocí páru klíčů: soukromého a veřejného, přičemž algoritmus digitálního podpisu jednoznačně identifikuje odesílatele a příjemce, aniž by odhalil jejich identity.
- Transakce jsou shromažďovány do bloků, vypočítává se hash bloku, který je zapsán do následujícího bloku. Toto pořadí zapisování hashů do bloků dalo název technologii blockchain, a také činí nemožným nenápadné změny / mazání bloků nebo jednotlivých transakcí z bloků. Takže pokud transakce vstoupila do blockchainu, lze si být jistý, že její data zůstanou nezměněná.
- Podvod double-spending je zabráněn dosažením konsenzu v síti, která data považovat za platná a která zamítnout. V síti Bitcoin se konsenzus dosahuje prostřednictvím důkazu práce PoW (Proof-of-Work).
- Spolehlivost funkce sítě je zajištěna tím, že blockchain je veřejný, kde každý účastník může spustit svou uzel, získat úplnou kopii blockchainu a navíc začít ověřovat transakce na správnost. Je třeba poznamenat, že moderní blockchainy umožňují vytvářet nejen veřejné (otevřené), ale i soukromé (uzavřené) blockchainy a také využívat kombinované schémata.
- Zcela se nevyhneme provizi v blockchainu, protože je třeba platit lidem, kteří síť podporují, ale v blockchainu je potřeba provize tak přesvědčivě dokázána, že nezůstává žádné pochybnosti o její potřebnosti.
- Moderní blockchainy mají možnost implementovat obchodní logiku, která se v blockchainu nazývá Smart Contracts. Logika smart kontraktů se realizuje v různých jazycích vysoké úrovně.
Dále se podívejme na tato řešení podrobněji.
Architektura blockchainu
Složky blockchainu
Každý účastník může spustit svůj uzel s úplnou kopií blockchainu (full node). Úplné uzly, které mohou zapisovat transakce do blockchainu, se nazývají uzly konsensu (witness) nebo těžaři (miner). Úplné uzly, které pouze ověřují správnost transakcí, se nazývají uzly auditu (audit). Lehkí klienti (light clients) neuchovávají úplné kopie blockchainu, ale komunikují se sítí pomocí úplných uzlů.
Většina uživatelů k provádění transakcí používá právě lehké klienty nebo webové peněženky. Všechny uzly jsou navzájem propojeny. Při takové kombinaci prvků se architektura sítě stává odolnější:

Životní cyklus transakce
Podívejme se na životní cyklus transakce a rozebírejme ho po částech:

Technologie blockchainu
Zaměřme se podrobněji na technická řešení a jejich vzájemné vztahy.
Identifikace
Každá blockchainová transakce musí být podepsána digitálním podpisem. Proto musí mít každý účastník pro provedení transakce pár klíčů: private / public. Někdy se pár klíčů nazývá peněženka (wallet), protože klíče jsou jednoznačně spojeny s jedinečnou digitální adresou a zůstatkem účastníka. Ve skutečnosti jsou klíče a adresy pouze řetězce čísel v různých číslicových soustavách. Příklady klíčů a adresy peněženky:
Soukromý klíč: 0a78194a8a893b8baac7c09b6a4a4b4b161b2f80a126cbb79bde231a4567420f
Veřejný klíč: 0579b478952214d7cddac32ac9dc522c821a4489bc10aac3a81b9d1cd7a92e57ba
Adresa: 0x3814JnJpGnt5tB2GD1qfKP709W3KbRdfb27VPro vytvoření digitálního podpisu v blockchainu se používá algoritmus, který je založen na eliptických křivkách: Elliptic Curve Digital Signature Algorithm (ECDSA). Pro jeho fungování se obvykle náhodně vybere privátní klíč (256bitové číslo). Počet možností klíčů je 2 na 256, a proto lze mluvit o praktické nemožnosti shody hodnot privátních klíčů.
Dále se veřejný klíč získává z privátního klíče vynásobením jeho hodnoty souřadnicemi bodu, který se nachází na eliptické křivce, přičemž se tím získají souřadnice nového bodu na téže křivce. Tento proces zaručuje, že se získá pár klíčů, které jsou vhodné pro digitální podpisy transakcí. A nakonec se adresa peněženky jednoznačně vypočítá z veřejného klíče.
Existuje spousta článků s podrobnostmi o kryptografii používané v blockchainu, například:
Soukromý klíč by měl být přísně tajný a uchováván v bezpečí. Veřejný klíč je znám všem. Ztrátou soukromého klíče se přístup k aktivu (mincím) obnovit nedá a peníze budou navždy ztraceny. Proto je úkol spolehlivého uchovávání soukromých klíčů mimořádně důležitý, protože to není banka, kam byste se mohli vždy přijít s pasem a obnovit účet. Existuje celá průmyslová odvětví výroby tzv. studených kryptopeněženek, které vypadají jako flash disky:

nebo můžete použít bezpečnější způsoby, například vypálit hodnotu soukromého klíče na žetony:

Transakce
Více o struktuře transakce si můžete přečíst v článku . Je pro nás důležité chápat, že každá transakce má alespoň následující údaje:
Od: 0x48C89c341C5960Ca2Bf3732D6D8a0F4f89Cc4368 - digitální adresa odesílatele
Do: 0x367adb7894334678b90aefe7882a5b06f7fbc783a - digitální adresa příjemce
Hodnota: 0.0001 - částka transakce
Hash transakce: 0x617ede331e8a99f46a363b32b239542bb4006e4fa9a2727a6636ffe3eb095cef - hash transakceNásleduje podepsání transakce soukromým klíčem a její rozeslání (viz podrobnosti o fungování protokolu ) všem uzlům v blockchainu, které kontrolují transakce na platnost. Algoritmus pro kontrolu transakce je netriviální a zahrnuje .
Bloky transakcí
Po ověření platnosti transakcí uzly vytvářejí bloky. Kromě transakcí je do bloku zaznamenán hash předchozího bloku, číslo (čítač Nonce) a provádí se výpočet hashe aktuálního bloku podle algoritmu SHA-256. Hash musí splňovat stanovená kritéria obtížnosti. Například v síti Bitcoin se obtížnost hashe automaticky mění každé 2 týdny v závislosti na výkonu sítě tak, aby byl blok generován přibližně každých 10 minut. Obtížnost se určuje následujícím kritériem: nalezený hash musí být menší než předem stanovené číslo. Pokud toto kritérium není splněno, pak se k Nonce přičte 1 a výpočet hashe se opakuje. Pro určení hashe se používá pole Nonce, protože to jsou jediné údaje v bloku, které lze změnit, zatímco ostatní musí zůstat beze změny. Správný hash musí mít určité množství nul na začátku, například jeden z reálných hashů:
000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91Úspěšné nalezení hash je důkazem vykonané práce (Proof-of-Work, PoW) pro sítě Bitcoin nebo Ethereum. Proces hledání hash se nazývá těžba (mining), podobně jako získávání zlata. Název celkem přesně vystihuje podstatu procesu, protože se jedná o jednoduché procházení variant, a pokud někdo najde vhodný hash, je to opravdu štěstí. Je to jako najít skutečný zlatý nuget v tunách bezcenného kamene. Odměna za blok nyní činí 12,5 BTC a pokud ji vynásobíme aktuálním kurzem bitcoinu 3900 $, dostaneme více než kilogram čistého zlata. Je za co bojovat!
Po úspěšném nalezení hash je blok a samotný nalezený hash zaznamenán do blockchainu jako následující blok. Podrobněji o struktuře bloků se můžete podívat v článku , a níže uvádím zjednodušenou schéma:

Blockchain začíná blokem, který ještě nemá hash předchozího bloku. Takový blok v blockchainu existuje pouze jeden a má vlastní název Genesis block. Ostatní bloky mají stejnou strukturu a liší se pouze počtem transakcí. Skutečné transakce a bloky vytvářené v současnosti v Bitcoin nebo Ethereum lze sledovat v .
Velikost bloků v Bitcoin je omezena na 1 MB a při minimálním objemu informací v transakci kolem 200 bajtů může být maximálně v bloku asi 6000 transakcí. Odtud, mimochodem, vyplývá výkon Bitcoin, na který se všichni smějí: blok se generuje přibližně jednou za 10 minut * 60 sek = 600 sek, což dává formální výkon kolem 10 TPS. I když ve skutečnosti — to není výkon, ale záměrně realizovaný algoritmus práce. V Ethereum pro konkurenci jednoduše nastavili dobu generace bloku na 15 sek. a výkon formálně vzrostl. Proto v blockchainech, které používají PoW jako konsensus, vůbec nemá smysl srovnávat výkon, protože přímo závisí na složitosti výpočtu hash, kterou lze nastavit na libovolnou.
Forks
Co se stane, pokud například několik uzlů najde hashe, které splňují podmínky obtížnosti, ale mají různou hodnotu (jinými slovy, dospějí k různým konsensům) a zapíší bloky do blockchainu? Pojďme se podívat, jak se blockchain chrání před touto situací. V takovém případě dochází k tzv. fork (‘vidlici’), a blockchain má dvě verze řetězce:

Co se bude dít dál? Dále část sítě začne pracovat na bloku N+2 z jednoho řetězce, zatímco část z druhého:

Některý z těchto bloků bude nalezen dříve a odeslán do blockchainu, a pak podle pravidel blockchainu dojde k přepnutí na delší řetězec a zrušení všech transakcí z alternativního bloku:

Může nastat situace, kdy transakce účastníka byla pouze v jednom z bloků forku, který byl zrušen. Proto je obecně doporučeno — před tím, než důvěřujete transakci, počkat, až budou přidány další bloky do blockchainu. Doporučení, kolik bloků čekat pro různé blockchainy se liší. Například pro síť Bitcoin je minimum 2 bloky, maximum 6.
Podobný obraz s forkem bloků se objeví také při tzv. 51% útoku — když se skupina těžařů pokouší vybudovat alternativní řetězec bloků, aby anulovala řetězec se svými podvodnými transakcemi. Ačkoli v současnosti je místo podvodů výhodnější investovat své výpočetní kapacity do poctivého mining.
Konsensus
Aby byl blok zapsán do blockchainu, musí síť dospět ke konsensu. Připomeňme si úkol dosáhnout konsensu v počítačových komunikačních sítích. Problém je formulován jako úkol byzantských generálů BFT (). Opouštějíce malebný popis problémů byzantské armády, úkol lze formulovat takto: jak mohou uzly sítě dospět k společnému výsledku, pokud část uzlů sítě může úmyslně zkreslovat informace. Existující algoritmy pro řešení úkolu BFT ukazují, že síť může fungovat správně, pokud jsou podvodníci méně než 1/3. Proč nebyl v síti Bitcoin použit konsensus BFT? Proč bylo nutné použít PoW? Existuje několik důvodů:
- BFT dobře funguje s malým pevným počtem uzlů, zatímco v veřejném blockchainu je počet uzlů nepředvídatelný a navíc se uzly mohou libovolně zapínat a vypínat.
- Je třeba motivovat lidi k spouštění blockchainových uzlů. K tomu musí lidé dostávat odměnu. V BFT není formálně za co dostávat odměnu, zatímco u PoW je všem intuitivně jasné, za co je odměna: za elektrickou energii spotřebovanou procesorem při hledání hash bloku.
Kromě PoW existuje několik dalších konsensů, které se používají v moderních blockchainech, například:
- PoS (Proof-of-Stake) — v blockchainu
- DPoS (Delegated Proof-of-Stake) — v blockchainu
- Modifikace BFT: SBFT (Simplified BFT) a PBFT (Practical BFT), například v blockchainu
Na konsensu PoS se zastavíme na chvíli, protože právě PoS a jeho varianty získaly největší rozšíření v privátních blockchainech. Proč právě v privátních? Na jedné straně má PoS výhodnější vlastnosti ve srovnání s PoW, protože pro dosažení konsensu jsou potřeba menší výpočetní zdroje, což zvyšuje rychlost zapisování dat do blockchainu. Na druhé straně však existuje více možností podvodu, takže aby se tomu zabránilo, musí být všichni účastníci blockchainu známí.
Konsensus PoS spočívá ve výběru uzlu, který může zapsat blok s transakcemi do blockchainu v závislosti na množství prostředků na účtu, spíše řečeno, ne na účtu, ale v zástavě. Tedy čím více prostředků máte v zástavě, tím větší pravděpodobnost má vaše uzel, že bude vybrán pro zápis bloku. Zástava nebude vrácena, pokud se blok ukáže jako neplatný. Tímto způsobem je realizována ochrana proti podvodům. Existují následující varianty PoS:
- Konsensus Delegated PoS (DPoS) rozděluje účastníky na „hlasující“ a „validující“. Držitelé mincí (hlasující účastníci) delegují své právo kontrolovat a zapisovat transakce do blockchainu jiným účastníkům. Tímto způsobem validátoři vykonávají veškerou výpočetní práci a dostávají za to odměnu, přičemž přítomnost hlasujících účastníků zaručuje poctivost validátorů, protože je možné je kdykoli vyměnit.
- Konsensus LPoS (Leased Proof-of-Stake) umožňuje pronajmout své prostředky jiným uzlům, aby měly větší šanci na ověřování bloků. Tímto způsobem můžete získávat provize za transakce, aniž byste se sami podíleli na ověřování transakcí a těžbě bloků.
Existuje také řada konsensů, které dosud nezískaly širší využití, zde je jen vyjmenuji pro informaci, přehled samotných konsensuálních algoritmů si můžete prohlédnout napří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)
Spolehlivost a modely nasazení blockchainů
Veřejný blockchain
Odolnost Public nebo jiný název Permissionless blockchain je dosaženo tím, že se může připojit každý a zobrazit informace nebo dokonce připojit svůj uzel, a důvěra je budována na základě konsensu PoW.
Privátní blockchain
Private nebo Private Permissioned blockchain. V těchto blockchainech má přístup k informacím pouze určitá skupina účastníků (organizací nebo jednotlivců). Tyto blockchainy budují organizace s cílem zvýšit celkový prospěch nebo efektivitu. Jejich spolehlivost je zajištěna společnými cíli účastníků a konsensuálními algoritmy PoS a BFT.
Blockchainový konsorcium
Existují Consortium nebo Public Permissioned blockchain. Toto jsou takové blockchainy, ke kterým se může každý připojit pro zobrazení, ale přidávat informace nebo připojit svůj uzel může účastník pouze se souhlasem ostatních. Tyto blockchainy budují organizace s cílem zvýšit důvěru zákazníků nebo spotřebitelů výrobků nebo společnosti jako celku. Zde je spolehlivost také dosažena přítomností důvěry mezi účastníky a těmi samými algoritmy konsensu PoS a BFT.
Smart Contracts
Do blockchainů implementovaných po Bitcoinu byla do určité míry přidána možnost provádění chytrých kontraktů. V podstatě je chytrý kontrakt transakcí, do které je vložen programový kód pro provádění. Chytré kontrakty v síti Ethereum se provádějí v EVM (Ethereum Virtual Machine). Aby se chytrý kontrakt mohl spustit, je třeba jej jasně vyvolat jinou transakcí, nebo musí být splněny podmínky pro jeho provedení. Výsledky provedení chytrého kontraktu se také zapíší do blockchainu. Získání dat zvenčí blockchainu je možné, ale velmi omezené.
Jakou obchodní logiku lze realizovat pomocí smart kontraktů? Ve skutečnosti jich není mnoho, například kontrola podmínek na základě údajů z blockchainu, změna vlastníků digitálních aktiv v závislosti na těchto podmínkách, zápis dat do trvalého úložiště v blockchainu. Logika je implementována ve speciálním vysokém programovacím jazyce Solidity.
Klasickým příkladem funkcionality, kterou lze realizovat pomocí smart kontraktů, je vydávání tokenů pro konání ICO. Například jsem realizoval smart kontrakt na vydání skromných 500 000 000 AlexToken. Podle se nachází
zdrojový kód smart kontraktu v jazyce 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ární reprezentaci, jak ji vidí síť
60806040526000600355600060045533600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560146101000a81548160ff021916908360028111156200006f57fe5b0217905550620001036b019d971e4fe8401e74000000600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200024a6401000000000262000b1d179091906401000000009004565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620001986b019d971e4fe8401e740000006001546200024a6401000000000262000b1d179091906401000000009004565b6001819055506b033b2e3c9fd0803ce8000000600481905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6b019d971e4fe8401e740000006040518082815260200191505060405180910390a362000267565b600081830190508281101515156200025e57fe5b80905092915050565b611cb880620002776000396000f300608060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146104c7578063095ea7b31461055757806318160ddd146105bc57806323b872dd146105e7578063313ce5671461066c578063355274ea146106a3578063518ab2a8146106ce57806366188463146106f957806370a082311461075e57806389311e6f146107b55780638da5cb5b146107cc578063903a3ef61461082357806395d89b411461083a578063a9059cbb146108ca578063bf5839031461092f578063c7876ea41461095a578063cbcb317114610985578063d73dd623146109b0578063dd62ed3e14610a15578063f2fde38b14610a8c575b60008060008060006001600281111561012757fe5b600560149054906101000a900460ff16600281111561014257fe5b14151561014e57600080fd5b60003411151561015d57600080fd5b600060045411151561016e57600080fd5b3494506101a7670de0b6b3a764000061019968056bc75e2d6310000088610acf90919063ffffffff16565b610b0790919063ffffffff16565b9350600092506b033b2e3c9fd0803ce80000006101cf85600354610b1d90919063ffffffff16565b111561024c576101f66003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b915061022e670de0b6b3a764000061022068056bc75e2d6310000085610b0790919063ffffffff16565b610acf90919063ffffffff16565b90506102438186610b3990919063ffffffff16565b92508094508193505b61026184600354610b1d90919063ffffffff16565b6003819055506102886003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b6004819055506000831115610344573373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156102dd573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b610395846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a361045184600154610b1d90919063ffffffff16565b600181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156104bf573d6000803e3d6000fd5b505050505050005b3480156104d357600080fd5b506104dc610b52565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b506105d1610c7d565b6040518082815260200191505060405180910390f35b3480156105f357600080fd5b50610652600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c87565b604051808215151515815260200191505060405180910390f35b34801561067857600080fd5b50610681611041565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3480156106af57600080fd5b506106b8611046565b6040518082815260200191505060405180910390f35b3480156106da57600080fd5b506106e3611056565b6040518082815260200191505060405180910390f35b34801561070557600080fd5b50610744600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061105c565b604051808215151515815260200191505060405180910390f35b34801561076a57600080fd5b5061079f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ed565b6040518082815260200191505060405180910390f35b3480156107c157600080fd5b506107ca611335565b005b3480156107d857600080fd5b506107e16113eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082f57600080fd5b50610838611411565b005b34801561084657600080fd5b5061084f6114ab565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088f578082015181840152602081019050610874565b50505050905090810190601f1680156108bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d657600080fd5b50610915600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b604051808215151515815260200191505060405180910390f35b34801561093b57600080fd5b50610944611703565b6040518082815260200191505060405180910390f35b34801561096657600080fd5b5061096f611709565b6040518082815260200191505060405180910390f35b34801561099157600080fd5b5061099a611716565b6040518082815260200191505060405180910390f35b3480156109bc57600080fd5b506109fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611726565b604051808215151515815260200191505060405180910390f35b348015610a2157600080fd5b50610a76600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611922565b6040518082815260200191505060405180910390f35b348015610a9857600080fd5b50610acd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a9565b005b600080831415610ae25760009050610b01565b8183029050818382811515610af357fe5b04141515610afd57fe5b8090505b92915050565b60008183811515610b1457fe5b04905092915050565b60008183019050828110151515610b3057fe5b80905092915050565b6000828211151515610b4757fe5b818303905092915050565b6040805190810160405280600981526020017f416c6578546f6b656e000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610cc457600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d1157600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d9c57600080fd5b610ded826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e80826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5182600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60035481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561116d576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611201565b6111808382610b3990919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561139157600080fd5b60028081111561139d57fe5b600560149054906101000a900460ff1660028111156113b857fe5b141515156113c557600080fd5b6001600560146101000a81548160ff021916908360028111156113e457fe5b0217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561146d57600080fd5b60028081111561147957fe5b600560149054906101000a900460ff16600281111561149457fe5b141515156114a157600080fd5b6114a9611b01565b565b6040805190810160405280600381526020017f414c54000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561152157600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561156e57600080fd5b6115bf826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611652826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60045481565b68056bc75e2d6310000081565b6b019d971e4fe8401e7400000081565b60006117b782600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a0557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611a4157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600560146101000a81548160ff02191690836002811115611b2057fe5b021790555060006004541115611c0a57611ba5600454600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611c89573d6000803e3d6000fd5b505600a165627a7a723058205bbef016cc7699572f944871cb6f05e69915ada3a92a1d9f03a3fb434aac0c2b0029Více informací o chytrých kontraktech lze nalézt v článku: .
Závěr
Sepsali jsme technologie, na kterých jsou postaveny moderní blockchaine a jak spolu souvisejí. Nyní si definujme, jaké úkoly lze řešit pomocí blockchainu a u kterých by jeho použití bylo v nejlepším případě neefektivní. Takže použití blockchainu není nezbytné, pokud:
- Transakce probíhají v důvěryhodném prostředí;
- Existence poplatků zprostředkovatelů nezhoršuje život účastníků;
- Účastníci nemají majetek, který by mohl být reprezentován jako digitální aktiva;
- Ve digitálních aktivech není rozptýlenost, t.j. hodnotou vlastní nebo dodává pouze jeden účastník.
Jaká budoucnost čeká blockchain? V současnosti můžeme pouze hádat o možných směrech vývoje blockchainových technologií:
- Blockchain se stane stejně běžnou databázovou technologií, jako například SQL nebo NoSQL pro řešení svého specifického okruhu úloh;
- Blockchain se stane široce rozšířeným protokolem, jako HTTP pro internet;
- Blockchain se stane základem pro nový finanční a politický systém planety!
V další části se podíváme, jaké blockchainy dnes existují a k čemu se používají v různých průmyslech.
To je teprve začátek!
Zdroj: habr.com
