Publiczna sieć blockchain, której przykładem jest choćby Ethereum, składa się z połączonych za pośrednictwem Internetu komputerów. Maszyny te uruchamiają węzły – w ten sposób określa się publicznie dostępne oprogramowanie konkretnego blockchaina, które realizuje logikę jego przetwarzania. Z racji tego, że każdy może uruchomić to oprogramowanie i stać się częścią sieci, a nawet ją współtworzyć, do czego motywują profity z uczestnictwa w takiej sieci, czyli kryptowaluty – staje się ona otwarta, niezależna i zdecentralizowana.
Zamknięte (prywatne) sieci blockchain dostępne są dla określonej grupy uczestników. Charakteryzują się możliwością szerokiej konfiguracji parametrów technicznych i funkcjonalnych, a także wysoką przepustowością transakcji. Znajdują zastosowanie zwłaszcza w rozwiązaniach dla biznesu, gdzie oprócz potrzeb technologicznych konieczne jest także spełnienie wymagań prawnych i formalnych.
W tym artykule przyjrzymy się architekturze prywatnej sieci blockchain opartej o technologię Hyperledger Fabric – uniwersalnego frameworka blockchainowego rozwijanego przez Linux Foundation, będącego jednym z czołowych ekosystemów dla prywatnych rozwiązań blockchain.
Hyperledger Fabric
Wraz z rozwojem otwartych blockchainów i pojawianiem się coraz to nowszych pomysłów na wykorzystanie tej technologii, rosło zapotrzebowanie na technologie z grupy tzw. enterprise blockchain. Podstawowym celem było zachowanie mechanizmów blockchainowych – kryptograficznie zabezpieczona historia operacji na danych oraz przetwarzanie niezmiennego kodu (smart contracty), jednak konieczne były także dodatkowe funkcjonalności i cechy, takie jak możliwość ograniczenia dostępu oraz wysoka wydajność.
Hyperledger Fabric powstał pod koniec 2015, jako początkowa inicjatywa firm IBM, Intel i SAP Ariba i w ciągu paru lat stał się najpopularniejszym produktem z grupy Hyperledger, liczącej obecnie 15 projektów open source dedykowanych tworzeniu rozwiązań opartych o blockchain.
Pojedyncze węzły otwartych sieci blockchain realizują całą logikę danego blockchaina – przetwarzają transakcje, tworzą bloki, uruchamiają smart contracty, komunikują się z innymi węzłami. Ich logika jest zaprogramowana i nie podlega modyfikacji (działa zgodnie z obowiązującym protokołem sieci), skondensowana najczęściej do pojedynczej instancji aplikacji (węzła). Protokół otwartych sieci blockchain jest ściśle określony, dane są transparentne (publicznie widoczne), przetwarzanie i zapis danych kosztuje (górnicy otrzymują zapłatę za tworzenie bloków). Tworzenie aplikacji opartych o otwarte sieci blockchain (aplikacje zdecentralizowane) polega na wykorzystaniu danej sieci np. do przesyłu transakcji kryptowalut lub przetwarzaniu smart contractów.
Hyperledger Fabric daje możliwość zaprojektowania, stworzenia i wykorzystania własnej, niezależnej i prywatnej sieci blockchain. Celem takiej sieci jest umożliwienie wykorzystanie zalet blockchaina w zamkniętym gronie uczestników – poprzez kryptograficznie zabezpieczony rejestr operacji zaufanych użytkowników. Podstawowymi różnicami prywatnych sieci blockchain w stosunku do sieci publicznych są:
- zabezpieczenia kryptograficzne uniemożliwiają dostęp niepowołanym użytkownikom (sieć nie jest publiczna);
- przetwarzanie jest darmowe, ponieważ nie ma konieczności wynagradzania niezależnych “górników” (sieć jest zarządzana i utrzymywana przez twórców);
- dane i operacje są widoczne tylko w gronie uczestników sieci (wewnątrz autoryzowanych użytkowników sieci);
- parametry i cechy sieci są konfigurowalne – począwszy od częstotliwości tworzenia bloków, po kontrolę dostępu, ograniczanie widoczności konkretnych danych lub przetwarzanie logiki smart contractów, zmianę algorytmu konsensusu itp.
Prywatna sieć blockchain stworzona za pomocą Fabrica składa się z modułów, należących do organizacji tworzących sieć. Poszczególne moduły odpowiedzialne są za realizację części logiki blockchaina – są elementami zdekompowanego węzła. Każda z organizacji uruchamia “swój” zestaw takich modułów, które komunikując się ze sobą, kolektywnie tworzą prywatną sieć blockchain.
Architektura prywatnej sieci blockchain w Fabricu
Poprzez dekompozycję węzła na moduły realizujące część jego kompleksowej logiki, otrzymujemy możliwość zarządzania jego poszczególnymi częściami. W praktyce oznacza, to możliwość zmiany pewnych funkcji blockchaina, poprzez zmianę jednego z komponentów pełniącego daną funkcję. Przykładem może być moduł tworzenia bloków w prywatnym blockchainie. Aktualnie Fabric wspiera 3 różne wersje modułu tworzącego bloki: Raft i Kafka i Solo (dla rozwiązań produkcyjnych Raft). Różnią się one np. algorytmem tworzenia bloków lub technologią składowania danych (np. w kolejkach Kafki). W modułowej architekturze blockchaina zbudowanego za pomocą Hyperledger Fabric zmiana sposobu tworzenia bloków (w zależności od potrzeb i specyfiki problemu) wymaga zmiany jedynie odpowiedzialnego za to modułu.
Moduły w Hyperledger Fabric dostarczane są w formie obrazów dockerowych. Obrazy są publiczne i znajdują się w Docker Registry (https://hub.docker.com/r/yeasy/hyperledger-fabric/). Praktyczne tworzenie sieci blockchain sprowadza się do uruchomienia i skonfigurowania zestawu obrazów dockerowych przez każdą z organizacji tworzących tę sieć. Taki zestaw komunikujących się z sobą obrazów dostarczy kolektywnie funkcjonalność pojedynczego węzła sieci blockchain.
Architektura prywatnej sieci może być różna w zależności od wymagań biznesowych, jednak elementy składowe (moduły) takiej sieci są ściśle określone. Oznacza to, że funkcjonalna (minimalistyczna) prywatna sieć blockchain musi składać się kilku określonych komunikujących się z sobą modułów. Zmieniać się może ich ilość (np. na potrzeby load balancingu), a także w pewnych wypadkach przynależność (np. moduł tworzący bloki nie musi być uruchomiony przez każdą organizację).
Zaprojektowana sieć blockchain jest utrzymywana (uruchamiana) przez organizacje tworzące tę sieć. Oznacza to, że członkowie tej sieci muszą uruchamiać własne instancje modułów, które za pośrednictwem sieci (Internetu) komunikują się z modułami pozostałych organizacji. Interakcję z taką siecią prowadzą aplikacje klienckie należące do poszczególnych organizacji. Komunikacja zarówno na poziomie sieci (między modułami), jak i na poziomie klient – sieć, bazuje na złożonych kluczach kryptograficznych, które poprzez odpowiednią konfigurację sieci są akceptowalne.
Uruchomienie podstawowych modułów sieci przez organizację jest niezbędne, aby organizacja mogła być czynnym uczestnikiem tej sieci (np. zatwierdzać transakcje). Wymagana ilość tych modułów (np. peer’ów), które muszą być utrzymywane przez każdą z organizacji, jest skonfigurowana na poziomie całej sieci. Poniżej znajduje się krótki opis podstawowych modułów sieci zbudowanej za pomocą Hyperledger Fabric.
Orderer
To wspomniany już wcześniej moduł odpowiedzialny za produkcję bloków. Jego zadaniem jest tworzenie bloków agregujących transakcje, które następnie stają się trwałą i niezmienną częścią blockchaina. Fabric wspiera aktualnie 3 typy ordererów, przy czym 2 (Kafka, Raft) są z założenia odporone na awarię (przy zachowaniu odpowiedniej redundantności), Solo przeznaczony jest do prototypowania.
Ilość wymaganych modułów orderera w prywatnej sieci blockchain jest zależna od porządanej konfiguracji. Może istnieć jedna instancja modułu orderera globalna dla całej sieci (zarządzana przez którąś z organizacji) lub każda organizacja może utrzymywać własną instancję (odpowiedzialność tworzenia bloków zostaje rozproszona między uruchomione instancje).
Peer
Peer’y posiadają 2 podstawowe funkcjonalności:
- tworzą blockchain – zapisują kryptograficzne zabezpieczone bloki (tworzone przez orderery) i uczestniczą w procesie zatwierdzania nowych transakcji;
- zarządzają smart contractami – pośredniczą między klientem, a niezmiennym oprogramowaniem przetwarzanym przez prywatny blockchain;
Rolą peer’ów jest być warstwą dostępową do blockchaina dla klientów danej organizacji. Za ich pośrednictwem mamy możliwość wyszukania transakcji lub komunikację ze smart contractem. W interesie organizacji jest posiadanie więcej niż jednej instancji peera, ponieważ umożliwia to posiadanie kilku kopii zapasowych samego blockchaina (danych), a także zwiększa efektywność i przepustowość (load balancing).
State database
Każdy z peer’ów posiada przynależną do niego bazę danych stanu. Fabric oferuje obecnie 2 typy modułów: oparty o LevelDB (https://github.com/google/leveldb) lub CouchDB (https://couchdb.apache.org/). Ta druga opcja jest trwałą bazą danych, LevelDB przechowuje dane w pamięci operacyjnej (znikają przy restarcie). Baza danych stanu to baza w modelu klucz wartość i służy do przechowywania danych zapisywanych przez smart contracty. Innymi słowy zamiast odczytywać dane zapisywane przez smart contracty bezpośrednio z bloków i transakcji – wykorzystuje się szybką bazą danych w odpowiedniej dla rozwiązania strukturze i modelu.
Chaincode
Chaincode to smart contract w terminologii Hyperledger Fabric. Prywatna sieć blockchain bez niezmiennych programów realizujących logikę operacji na danych nie ma sensu. Każdy z peer’ów zarządza (i pośredniczy w komunikacji) pojedynczą instancją konkretnego chaincode’u, przy czym w ramach prywatnej sieci blockchain może istnieć wiele różnych chaincode’ów. Aktualnie Fabric wspiera implementacje chaincode’u w 3 technologiach: Go, Javascript i Java. Logika chaincode’u realizuje operacje na bazie danych stanu (State database) – zapisuje, modyfikuje, usuwa dane, przy czym każda operacja rejestrowana jest w blockchainie.
Podsumowanie
Hyperledger Fabric służy tworzeniu prywatnych sieci blockchain opartych o modułową architekturę. Podejście to oferuje szeroką możliwość konfiguracji i dekompozycję poszczególnych odpowiedzialności samego blockchaina (tworzenie bloków, przetwarzanie chaincode’u). Logika węzła nie jest skondensowana do pojedynczej instancji oprogramowania węzła, jak ma to najczęściej miejsce w przypadku blockchainów publicznych. Poszczególne funkcjonalności węzła blockchainowego realizowane są przez moduły dostarczane przez Fabrica jako obrazy dockerowe. Funkcjonująca sieć blockchainowa jest zestawem komunikujących się ze sobą kontenerów dockerowych.
Interakcja z prywatnym blockchainem (klient) możliwia jest tylko dla zaufanych użytkowników (należących do organizacji tworzących tę sieć). Zarządzanie taką siecią, tworzenie użytkowników, określanie widoczności dostępu do danych i wszelkie aspekty związane z demokratyzacją są konfigurowalne.
Prywatna sieć blockchain jest bardzo złożonym rozproszonym systemem informatycznym funkcjonującym w obrębie kilku organizacji (firm, instytucji). Produkcyjne utrzymanie prywatnej sieci wymaga zaawansowanej konfiguracji technologii składowych wykorzystywanych przez Fabrica (np. Kafka, Zookeeper, Node.js, CouchDB, Docker). Niezmienny charakter programów uruchamianych w blockchainie (chaincode’ów) narzuca specyficzny sposób tworzenia takiego oprogramowania, a rozproszona natura całego systemu wyklucza lub bardzo utrudnia powszechne praktyki zarządzania i dostarczania oprogramowania (np. CI). Zarządzanie dostępem do zasobów, poprzez wykorzystanie zaawansowanych mechanizmów kryptograficznych (głównie kryptografii asymetrycznej) jest wyzwaniem zarówno na poziomie projektowania, jak i utrzymania (bezpieczeństwo). Złożoność wynagradzana jest jednak możliwością zapewnienia trwałego, niezmiennego i transparentnego rejestru operacji wewnątrz zamkniętej grupy uczestników, osiągającego wysoką przepustowość transakcji i charakteryzującego się możliwością kompleksowej konfiguracji.