01
Spis treści
02
O autorach 9
O recenzencie 11
Podziękowania 13
Wprowadzenie 15
My, marzyciele 17
Zmiana paradygmatu 18
Społeczność cypherpunku 20
Podsumowanie 24
Gorączka złota
Wydobywanie bitcoina 25
Osiąganie konsensusu 25
Sprzęt do wydobywania 31
Historie start-upów 32
Nowy konsensus 34
Podsumowanie 35
Odniesienia 35
03 04 05 06
Podstawy blockchaina 36
Organizacja transakcji 36
Simple Payment Verification 44
Podziały łańcucha bloków 46
Podsumowanie 47
Odniesienia 48
Rozpakowując
Ethereum 49
Podstawy Ethereum 50
Ethereum Virtual Machine 57
Aplikacje zdecentralizowane 67
Podsumowanie 70
Odniesienia 70
Organizacje zdecentralizowane 71
Jądro Aragona 72
Zarządzanie tożsamością 73
Tutorial DAO 75
Podsumowanie 93
Odniesienia 93
Atak hakerski na The DAO 94
Wprowadzenie 94
Zespół 97
The DAO 98
Najważniejsze punkty ICO 101
Debata 105
07
Podział: ETH i ETC 107
Przyszłość 108
Podsumowanie 109
Tokeny Ethereum
Obliczenia wysokiej wydajności 110
Tokeny i tworzenie wartości 111
Ethereum Computational Market 115
Sieć Golem 122
Framework transakcyjny 126
Supercomputing Organized by Network Mining 131
iEx.ec 143
Podsumowanie 147
Odniesienia 148
08
Blockchain w nauce 149
Kryzys replikacji 150
Badania kliniczne 154
System reputacji 159
Kontrola leków 162
Podsumowanie 165
09
Blockchain w opiece zdrowotnej 166
Model płatnik–świadczeniodawca–pacjent 167
Organizacja 169
Zapobieganie marnowaniu pieniędzy – Capital One, Ark Invest i Gem 173
Podsumowanie 181
Odniesienia 182
11
12
Indeks 270 10
Hyperledger Project 183
Stan obecny 183
Modele decyzyjne. Czy potrzebujesz blockchaina? 189
Błyskawiczne tworzenie prototypów z Hyperledger Composer 192
Podsumowanie 195
Rozwój blockchain w ostatnim czasie 196
Blockchain EOS 197
Chain Core 208
Ethereum Enterprise Alliance 222
Podsumowanie 230
Odniesienia 230
Rewolucje technologiczne i kapitał finansowy 231
Stan branży blockchain 232
Venture capital i ICO 234
Pierwsze oferty monet 234
Giełdy walut cyfrowych 238
Status prawny ICO 238
Technologie regulacyjne – RegChain 242
Nowe idee i firmy z branży blockchain 244
Demokratyzacja możliwości inwestycyjnych 247
Podsumowanie 247
Dodatek. Zakładając konsorcjum opieki zdrowotnej 249
Bibliografia 265
03 Podstawy blockchaina
Walcząc z rzeczywistością, nigdy niczego nie zmienisz. By to uczynić, stwórz nowy model, który sprawi, że obecny stanie się przestarzały. R. Buckminster Fuller
Blockchain jest zdecentralizowaną strukturą danych obdarzoną wewnętrzną spójnością zapewnianą dzięki konsensusowi użytkowników w kwestii obecnego stanu sieci. To technologia, która rozwiązuje problem bizantyjskich generałów (dotyczący komunikacji między nieufającymi sobie stronami) i otwiera nowe perspektywy dla transakcji niewymagających zaufania oraz wymiany informacji. Jeśli internet zdemokratyzował wymianę informacji w ramach modelu peer-to-peer, blockchain czyni to samo, ale w odniesieniu do wartości. Niniejszy rozdział zaczynamy od przyjrzenia się, jak odbywają się transakcje w sieci Bitcoin. Co za tym idzie, omawiamy strukturę bloku oraz transakcji. Następnie przechodzimy do roli portfeli i adresów użytkownika, by później zająć się metodą Simple Payment Verification (SPV) wdrożoną w sieci Bitcoin. SPV pozwala zrozumieć, skąd bierze się szczególna struktura bloku, a co ważniejsze – jak sieć Bitcoin może zachować wydajność, mimo że rozrasta się w szybkim tempie. Nasze rozważania zamykamy tematem soft i hard forków w blockchainie. Prezentujemy następstwa forków w kontekście kompatybilności w przód i w odniesieniu do handlowców oraz użytkowników zaangażowanych w wykonywanie kodu Bitcoin Core.
Organizacja transakcji
Podstawowym celem protokołu Bitcoin jest umożliwienie użytkownikom sieci dokonywania transakcji w sposób zdecentralizowany. Do tej pory, by nakreślić ogólne tło, omawialiśmy niewielkie części protokołu. Teraz połączymy te koncepcje w jeden
model i zajmiemy się łańcuchem bloków. Ostatecznym rezultatem wydobywania jest zwiększanie liczby bloków wraz z rozwojem sieci w czasie. By pojąć, jak przebiegają transakcje między dwoma użytkownikami (Alice i Bobem), musimy najpierw zrozumieć strukturę bloków, w których są one zapisywane. Mówiąc najprościej, blockchain jest zbiorem bloków połączonych ze sobą zgodnie z dwoma głównymi regułami:
■ Wewnętrzna spójność – istnieje kilka zasad determinujących funkcjonowanie bloków, dzięki którym są one wewnętrznie spójne. Przykładowo, każdy blok łańcucha jest połączony z blokiem poprzednim i ma znacznik czasu określający moment jego utworzenia. Te mechanizmy blockchaina sprawiają, że jest on wewnętrznie uporządkowaną strukturą danych przechowującą spójny zapis transakcji.
■ Konsensus dotyczący transakcji – wydobywanie opisane w rozdziale 2 jest tylko jednym ze sposobów weryfikacji transakcji; istnieją także inne metody, nieoparte na obliczaniu skrótów w trybie brute force. Bądź co bądź każda implementacja zakłada schemat osiągania konsensusu dotyczącego transakcji przeprowadzonych w sieci w określonym przedziale czasu. Proces weryfikacji zawsze zakłada użycie jakiegoś rodzaju dowodu pracy lub innej strategii, dzięki której transakcje są gromadzone w puli, a następnie sprawdzane przez użytkowników sieci.
W podstawowym sensie transakcja to struktura danych, którą zapisuje się w bloku. Jak dokładnie to się odbywa? Żeby prześledzić ten proces, spójrzmy na pełną strukturę bloku przedstawioną na ilustracji 3.1. Każdy z bloków ma przynajmniej dwa unikalne elementy: nagłówek bloku zawierający unikalny skrót (nazywany korzeniem Merkle’a; ang. Merkle root), który identyfikuje ten i tylko ten blok, oraz listę transakcji zawierającą nowe transakcje. Zauważmy, że każdy blok zawiera tę samą liczbę transakcji na liście, ale są to transakcje różne. Wynika to stąd, że co dziesięć minut w wyścigu górników wygrywa tylko jeden blok, a pozostałe bloki kandydujące zostają odrzucone, po czym wyścig zaczyna się od początku. W tym uproszczonym modelu istnieją jedynie dwa dodatkowe elementy bloku: rozmiar bloku, który pozostaje stały w obrębie całej sieci, oraz licznik transakcji. My skupiamy się przede wszystkim na nagłówku bloku oraz liście transakcji.
Nagłówek bloku zawiera kilka stałych elementów, takich jak omawiane wcześniej wartość docelowa i nonce. W jego skład wchodzi też numer wersji kodu Bitcoin Core, na której pracował górnik zwycięzca. Unikalną częścią każdego bloku jest także znacznik czasu, który bezbłędnie identyfikuje go w sieci. Nagłówek zawiera również skrót poprzedniego bloku w łańcuchu, a także inny specjalny skrót, który identyfikuje dany blok, zwany korzeniem Merkle’a. Powstawanie korzenia Merkle’a omówimy w dalszej części tego rozdziału.
DOWÓD ŻYCIA. W ostatnim czasie pojawiły się plotki, że Julian Assange, założyciel WikiLeaks, umarł. W odpowiedzi, by udowodnić, że to nieprawda, Assange odbył na Reddicie sesję Ask Me Anything i odczytał skrót ostatniego bloku w blockchainie. Blok został utworzony zaledwie dziesięć minut wcześniej, więc nagranie nie mogło powstać przed tą chwilą, co stało się niezaprzeczalnym dowodem, że Assange żyje. Wówczas po raz pierwszy skrót bloku został wykorzystany w przestrzeni kultury popularnej. Assange określił to dowodem życia.

Ilustracja 3.1. Uproszczona struktura bloku
Nagłówek i lista transakcji to dwa niepowtarzalne elementy każdego bloku. Nagłówek składa się z kilku mniejszych części, z których najbardziej swoistą stanowi korzeń Merkle’a, skrót, który bezbłędnie identyfikuje dany blok. Na nagłówek składa się skrót poprzedniego bloku, nonce użyta do utworzenia obecnego bloku i trudność wydobywania. Są to standardowe elementy związane z wydobywaniem, które omówiliśmy już wcześniej. Każdy blok zawiera także listę transakcji. Oprócz rzeczy-
naprzód jest wdrożenie przez Microsoft w chmurze Azure Blockchain as a Service (BaaS). Aplikacje rozproszone (DApp) oparte na Ethereum są projektowane i publikowane przy wykorzystaniu innych elementów komputera światowego, takich jak Mist.
Podstawy Ethereum
Była połowa 2013 roku, kiedy przeważająca część społeczności skupionej wokół Bitcoina wdała się w romans z ideą rozszerzenia jego zastosowań, tak by stał się czymś więcej niż tylko walutą. Wkrótce nastąpił napływ nowych pomysłów, nad którymi debatowano na internetowych forach. Powszechne przykłady to rejestracja domen, ubezpieczanie aktywów, głosowanie czy internet rzeczy (IoT). Kiedy szum osłabł, poważniejsze analizy pokazały, że budowa protokołu Bitcoin znacząco ogranicza możliwość oparcia na nim aplikacji.
Kluczowym punktem debaty było pytanie, czy w ramach blockchaina powinien być dozwolony pełny język skryptowy, czy też aplikacje powinno się tworzyć za pomocą logiki spoza blockchaina. Debatę wywołały dwa kluczowe zagadnienia:
■ Język skryptowy i OPCODES protokołu Bitcoin zostały zaprojektowane jako bardzo ograniczone funkcjonalnie.
■ Protokół sam w sobie nie był wystarczająco ogólny, a kryptowaluty, takie jak Namecoin i inne, wyspecjalizowały się w konkretnym zadaniu. Główne pytanie, jakie wówczas stawiano, brzmiało: Jak sprawić, by protokół był na tyle ogólny, że będzie cechował się kompatybilnością w przód względem zastosowań, o których obecnie nic nie wiemy?
Ostatecznie wyłoniły się dwie szkoły reprezentujące odmienne poglądy na język skryptowy. Dokument Nakamoto będący przykładem podejścia klasycznego proponował, by język skryptowy był bardzo ograniczony funkcjonalnie. Pozwoliłoby to uniknąć problemów z bezpieczeństwem, jakie niosłaby za sobą obecność w blockchainie kodu wykonywalnego. W pewnym sensie kod wykonywalny blockchaina jest ograniczony do garstki podstawowych operacji aktualizujących stany rozproszone. Drugą szkołę reprezentował Buterin, który pojmował łańcuch bloków jako coś więcej niż tylko rejestr. Stworzył on wizję blockchaina jako platformy obliczeniowej, która może wykonywać dobrze zdefiniowane funkcje za pomocą umów i argumentów. Konstrukcja EVM pozwala na całkowite odizolowanie kodu wykonywalnego i bezpieczne działanie opartych na niej aplikacji. Zacznijmy od zasad budowy Ethereum i stojącej za nim głównej idei.
GŁÓWNA IDEA. W przypadku Ethereum zamiast platformy wspierającej konkretne zastosowania tworzy się platformę wspierającą natywny język programowania, który dzięki swej rozszerzalności pozwala na wdrażanie w jej ramach logiki biznesowej.
Wkrótce wrócimy do rozważenia implikacji tej zasady. Tymczasem pomówmy o innej własności Ethereum, jaką jest konsensus. Koncepcję konsensusu omawialiśmy w poprzednich rozdziałach: w przypadku kryptowalut opartych na dowodzie pracy (PoW) sieć wynagradza górników, którzy rozwiązali kryptograficzną zagadkę, zatwierdzili transakcje i wydobyli nowe bloki. Ethereum zamierza wprowadzić inny algorytm konsensusu, zwany dowodem stawki (PoS). W algorytmie tym podmiot zatwierdzający czy twórca następnego bloku zostaje wybrany w pseudolosowy sposób na podstawie stawki, jaką w sieci ma konto. Im wyższą stawkę ma się w sieci, tym większa szansa na otrzymanie tej roli. Następnie podmiot zatwierdzający zaczyna wykuwanie kolejnego bloku i otrzymuje wynagrodzenie od sieci. W tym przypadku podmiot taki naprawdę wykuwa blok (jak kowal) zamiast go wydobywać, ponieważ w PoS koncept wydobywania opartego na sprzęcie został zastąpiony wirtualną stawką. Do pewnego stopnia przesłanką przechodzenia na PoS są wysokie wymagania energetyczne algorytmów PoW, które stały się powszechną bolączką. Peercoin był pierwszą kryptowalutą, która użyła PoS, ale bardziej znaczące implementacje dokonane w ostatnim czasie dotyczą ShadowCash, Nxt i Qora. Główne różnice między Bitcoinem a Ethereum jako protokołami zostały wyszczególnione na ilustracji 4.1.

Ilustracja 4.1. Porównanie Bitcoina i Ethereum jako platform obliczeniowych
cją i chce odzyskać swoją część etheru przed jej realizacją, może przedstawić i przyjąć propozycję specjalnego typu, dotyczącą utworzenia nowej DAO. Posiadacze tokenów, którzy poparli propozycję, mogą wówczas podzielić DAO i przesunąć swoje środki w etherze do nowej organizacji, doprowadzając do tego, że reszta będzie mogła dysponować jedynie swoim etherem.
Niestety, sposób, w jaki wdrożono narzędzie podziału, przyczynił się do powstania katastrofalnego błędu wielobieżności, który przesądził o podatności The DAO na atak9. Innymi słowy, ktoś mógł rekurencyjnie dzielić The DAO i wypłacać w nieskończoność środki w ETH równe jego początkowej inwestycji jeszcze przed zarejestrowaniem wypłaty w umowie pierwotnej The DAO.
Oto słaby punkt znaleziony w pliku umowy Solidity pod nazwą DAO.sol:
function splitDAO( uint _proposalID, address _newCurator ) noEther onlyTokenholders returns (bool _success) {
// [Added for explanation] The first step moves Ether and assigns new tokens uint fundsToBeMoved = (balances[msg.sender] * p.splitData[0].splitBalance) / p.splitData[0].totalSupply; if (p.splitData[0].newDAO.createTokenProxy.value(fundsToBeMoved)(msg.sender) == false) //
[Added for explanation] This is the line that splits the DAO before updating the funds in the account calling for the split ...
// Burn DAO Tokens
Transfer(msg.sender, 0, balances[msg.sender]); withdrawRewardFor(msg.sender); // be nice, and get his rewards // [Added for explanation] The previous line is key in that it is called before totalSupply and balances[msg.sender] are updated to reflect the new balances after the split has been performed
9 Wielobieżność jest cechą oprogramowania, którego procedura może zostać przerwana podczas wykonywania, a następnie uruchomiona od początku, gdy jednocześnie pozostała część procedury oczekuje w kolejce do wykonania.
totalSupply -= balances[msg.sender]; // [Added for explanation] This happens after the split balances[msg.sender] = 0; // [Added for explanation] This also happens after the split paidOut[msg.sender] = 0; return true; }
Jak widać, The DAO odwołuje się do tablicy balances w celu określenia, ile tokenów DAO może zostać przesuniętych. Wartość p.splitData[0] jest własnością propozycji przedkładanej w The DAO, a nie własnością samej The DAO. Właśnie to, w połączeniu w faktem, że WithdrawRewardFor jest wywoływane, zanim dochodzi do aktualizacji balances[], sprawiło, że atakujący mógł wywoływać fundsToBeMoved w nieskończoność, jako że jego saldo ciągle zwracało pierwotną wartość.
Bliższe przyjrzenie się withdrawRewardFor() ujawnia warunki, które uczyniły to możliwym:
function withdrawRewardFor(address _account) noEther internal returns (bool _success) { if ((balanceOf(_account) * rewardAccount.accumulatedInput()) / totalSupply < paidOut[_account]) throw;
uint reward = (balanceOf(_account) * rewardAccount.accumulatedInput()) / totalSupply - paidOut[_account]; if (!rewardAccount.payOut(_account, reward)) // [Added for explanation] this is the statement that is vulnerable to the recursion attack. We must go deeper. throw; paidOut[_account] += reward; return true; }
Przyjmując, że pierwsza instrukcja przyjmuje wartość „fałsz”, zostaje uruchomiona instrukcja oznaczona jako słaby punkt. Musimy wykonać jeszcze jeden krok, by w pełni zrozumieć, jak haker był w stanie to wykorzystać. Gdy po raz pierwszy wywoływane jest withdrawRewardFor (a więc gdy haker ma jeszcze prawdziwe środki na koncie, które może wypłacić), pierwsza instrukcja prawidłowo przyjmuje wartość „fałsz”, co uruchamia następujący kod:

Ilustracja 10. 3. Model Birch–Brown–Parulava
Model ten pomaga użytkownikowi w rozstrzygnięciu, czy wdrożyć rejestr z uprawnieniami, czy bez uprawnień. Od tego w dużym stopniu zależy decyzja na temat bazowego oprogramowania, na przykład wybór między Ethereum a Quorum.
Następnym modelem decyzyjnym jest IBM. Przedstawiono go na ilustracji 10.4.

Ilustracja 10.4. Diagram decyzyjny IBM określający, kiedy korzystać z blockchaina
Modele decyzyjne. Czy potrzebujesz blockchaina?
W kontekście tego diagramu warto uwypuklić ważną kwestię – w jaki sposób pewne decyzje są związane z określonymi funkcjami blockchaina. Na przykład relacja wynikająca z umowy może być dobrze realizowana w blockchainie za pomocą inteligentnych umów. Diagram może stać się dobrym sprawdzianem wstępnym kompatybilności blockchaina i funkcji, które oferuje, z twoim projektem.
Ostatni rozważany przez nas model decyzyjny, zaproponowany przez Wüsta i Gervaisa w dokumencie zatytułowanym „Czy potrzebujesz blockchaina?”, pokazano na ilustracji 10.5. Naszym zdaniem łączy on koncepcje dwóch poprzednich modeli.

Ilustracja 10.5. Model Wüsta–Gervaisa
Model ten próbuje określić zarówno sposoby wdrażania blockchaina, jak i odpowiedzieć na pytanie, czy w ogóle powinieneś rozważać takie rozwiązanie. Koncepcje przypominają te z poprzednich modeli, ale ścieżka nieco się różni, otwierając dodatkowe możliwości.
Błyskawiczne tworzenie prototypów z Hyperledger Composer
Hyperledger Composer to zestaw abstrakcji aplikacji wysokiego poziomu do modelowania twojego biznesu. Gdy uznasz, że twoja inicjatywa może skorzystać na wpro-