Dla odmiany napiszę o tym, co robię w pracy.
Od ponad półtora roku jestem pracownikiem MaidSafe - małej, szkockiej firmy, która pracuje nad stworzeniem całkowicie rozproszonego internetu. Brzmi nieco dziwnie - przecież internet już jest rozproszony, nie? Otóż nie całkiem - każda strona w internecie znajduje się na serwerach jakiejś konkretnej firmy. Wszystkie dane w internecie są pod kontrolą właścicieli serwerów, na których się znajdują, a niekoniecznie właścicieli samych danych. Prowadzi to do sytuacji, w których nasze dane niekoniecznie są wykorzystywane tak, jakbyśmy chcieli (wchodzące od niedawna RODO ma poprawić sytuację, ale nie spodziewałbym się za wiele...).
MaidSafe zamierza zmienić ten stan rzeczy. Scentralizowanym serwerom przeciwstawia SAFE Network - rozproszoną sieć, w której każdy ma pełną kontrolę nad własnymi danymi. Uploadując jakiś plik do sieci, nie wrzucamy go na konkretny serwer - plik jest dzielony na kawałki, szyfrowany i rozprowadzany w kilku kopiach po komputerach użytkowników sieci. Każdy użytkownik udostępnia część swojego dysku, ale kontroluje jedynie swoje dane, reszta jest dla niego nieczytelna dzięki szyfrowaniu. Ponadto, aby zapobiegać spamowi i motywować użytkowników do udostępniania miejsca, SAFE Network ma mieć własną kryptowalutę - Safecoin - nie opartą jednak na blockchainie, jak pozostałe kryptowaluty.
Dobra, dość reklamowania się - do rzeczy.
Architektura rozproszonej sieci generuje wiele wyzwań, nie znanych z tradycyjnego internetu. Przykładowo, załóżmy, że mam w sieci jakiś plik, przechowywany przez kilka komputerów, i wprowadzam w nim jakieś modyfikacje. Potem próbuję ten plik wczytać z sieci. Skąd mogę mieć pewność, że zobaczę to, co zapisałem? Nie ma centralnego serwera - niektóre z komputerów przechowujących mój plik mogły jeszcze nie odebrać wiadomości o modyfikacji. Mogły też zniknąć z sieci, a ich rolę przejęły inne, które w ogóle nie były adresatami wiadomości. Część komputerów może być złośliwa i celowo przesyłać błędne dane - w końcu elementami sieci są komputery zwykłych użytkowników, a wszyscy wiemy, jak częstym zjawiskiem jest trolling. Jeśli zatem komputery - węzły sieci - przesyłają sprzeczne dane, jak ustalić, która wersja jest prawidłowa?
Powyższe to tzw. problem rozproszonego konsensusu, ale nie tylko - potencjalna obecność złośliwych uczestników rozszerza go do tzw. problemu bizantyjskich generałów (nazwanego tak od oryginalnego sformułowania, w którym generałowie musieli niezależnie od siebie podjąć decyzję w sprawie ataku na miasto). Problem ten jest szeroko badany od lat 80. XX wieku i istnieje wiele rozwiązań - jednak to jeszcze nie koniec! W naszym przypadku chcemy mieć pewność, że decyzja zostanie poprawnie podjęta nawet, gdy wiadomości przesyłane między komputerami mogą być dowolnie opóźniane. Wprowadza to element tzw. asynchroniczności - braku założeń w kwestii upływu czasu. Tak postawiony problem opisuje się zwykle skrótem ABFT - od ang. Asynchronous Byzantine Fault Tolerance.
Rozwiązania dla problemu ABFT również istnieją - ale są albo zbyt wolne, albo zbyt złożone, albo opatentowane, albo mają jeszcze inne wady. Postanowiliśmy więc w MaidSafe, korzystając z istniejącego dorobku, spróbować zaprojektować właasny algorytm. PARSEC - Protocol for Asynchronous, Reliable, Secure and Efficient Consensus (Protokół Asynchronicznego, Niezawodnego, Bezpiecznego i Wydajnego Konsensusu) - jest rezultatem tych wysiłków.
PARSEC - wbrew nazwie - nie jest w pełni asynchroniczny. W obecnej postaci zawiera pewne założenia dotyczące opóźnień w dostarczaniu wiadomości, które czynią go nieco mniej wyrafinowanym teoretycznie, natomiast być może bardziej praktycznym. Obecnie wciąż szukamy sposobu, by uzyskać pełną asynchroniczność.
W szczegóły techniczne nie będę się wdawał. Dla zainteresowanych, są szerzej opisane tu oraz tu. W skrócie, połączyliśmy ideę grafu "plotek" (ang. gossip) między komputerami z Asynchronicznym Binarnym Konsensusem (czyli konsensusem ograniczonym do jednej wartości, która może wynosić tylko 0 albo 1) z wykorzystaniem tzw. "concrete coin" (z grubsza chodzi o to, żeby komputery mogły niezależnie wykonać "rzut monetą" i otrzymać losowo 0 albo 1, ale z dużym prawdopodobieństwem wszystkie mają otrzymać taką samą wartość).
Cały temat jest niezmiernie ciekawy i jest w nim jeszcze dużo do odkrycia. Jeśli ktoś jest zainteresowany zrozumieniem sprawy nieco głębiej - zapraszam do przeczytania linków wyżej, artykułu na Medium oraz zajrzenia na forum SAFE Network (wszystko niestety po angielsku). Sam też chętnie odpowiem na pytania, zapraszam do pisania w komentarzach :)