SegWit – Czym jest to Ulepszenie Bitcoina?


Jeśli interesowałeś się Bitcoinem w przeszłości z pewnością nie mogłeś przegapić pełnowymiarowej wojny o zwiększenie rozmiaru bloku. Dwie strony atakowały się każdego dnia, a cała sytuacja doprowadziła w końcu do rozłamu sieci – hard fork, który doprowadził do powstania kryptowaluty Bitcoin Cash. Po drugiej stronie znajdował się jednak oryginalny Bitcoin, którego twórcy wymyślili o wiele bardziej eleganckie rozwiązanie.

To był SegWit. Oprócz zwiększenia przepustowości transakcji rozwiązało to także inny poważny problem – zmienności transakcji.

Luka w systemie czyli Transaction Malleability

Połączenie tych dwóch słów można by z grubsza przetłumaczyć na język polski jako „zmienność transakcji”. Nawet jeśli to tylko przybliżone tłumaczenie, to odpowiada problemowi. By to zrozumieć, musimy mieć pobieżne pojęcie o tym, jak działa Bitcoin i transakcje.

Jak działał system przed wprowadzeniem Segregated Witness (SegWit)?

Sieć składa się z dwóch elementów – Górników i Nodów (węzłów). Węzeł to część sieci, która może być uruchomiona przez każdego. W swojej najprostszej formie Węzeł jest komputerem, którego jedynym zadaniem jest weryfikacja transakcji. Aby to zrobić, potrzebujesz dysku z kopią blockchaina i połączenia z internetem. Wysyłając transakcję, użytkownik po wysyła ją do węzła.

Następnie transakcja jest przekazywana do pozostałych węzłów w celu weryfikacji. Gdy zrobi to ponad połowa sieci, transakcja staje się ważna i przechodzi do mempoola – listy oczekujących. Drugą połowę równania stanowią górnicy. Ich zadaniem jest ochrona i zabezpieczanie bloków. Górnik pobiera transakcje z mempoola i umieszcza je w bloku. Trzeba poświęcić dużo energii i mocy obliczeniowej, żeby znaleźć kod bloku i go zabezpieczyć. Jego zamknięcie powoduje połączenie z blockchainem i potwierdzenie zapisanych tam transakcji.

Jak działa transakcja

Każda transakcja składa się z trzech części. adres docelowy (lub klucz publiczny odbiorcy), liczbę wysłanych jednostek oraz klucz prywatny nadawcy. Klucz publiczny służy jako adres odbiorcy. Z kolei klucz prywatny jest jak hasło do naszego adresu, który daje nam dostęp i pozwala na wysyłanie pieniędzy. Jest to w istocie podpis. Razem składają się one na identyfikator transakcji.

Cały koszyk przechodzi następnie przez funkcję haszującą, która przekształca dane w kod. Charakteryzuje się to dwiema kluczowymi właściwościami – te same dane zawsze dadzą ten sam hash, a na podstawie hasha nie da się określić oryginalnych danych. Ścieżkę transakcji opisaliśmy już powyżej. Kiedy wysyłamy wiadomość, najpierw wędruje ona do węzłów. Jeśli jest ważna, zostaje wpisana na listę oczekujących na potwierdzenie – tzw. mempool. Po ustawieniu się w kolejce (w zależności od wielkości opłat), górnicy pobierają ją i umieszczają płatność w bloku. Na tym kończył się proces.

Zmienność transakcji

Transaction Malleability była elementem, który umożliwił atak, dzięki któremu można było ukraść bitcoiny. Jak to osiągnięto?

Wyjaśniliśmy powyżej, że transakcja to koszyk danych, które są następnie zamaskowane w kod. Hash jest zawsze ściśle określony – wystarczy zmienić jeden znak, a będzie zupełnie inny. Podobnie, nie da się wstecznie rozszyfrować z czego składał się dany hash.

Wysyłając transakcję, możemy sprawdzić ID/hash transakcji, pod którym możemy znaleźć wprowadzone przez nas dane. System Bitcoin pozwalał jednak na jedną nieprzyjemną rzecz. Atakujący był w stanie łatwo zmodyfikować klucz prywatny niepotwierdzonej transakcji tak, że z perspektywy systemu transakcja była nadal ważna, ale jej hash był zupełnie inny. Jako przykład możemy podać dwie liczby – 3 i 03.

Z matematycznego punktu widzenia są one tą samą liczbą – zawsze 3. Jednak algorytm haszujący bierze każdy znak i zmienia wynikowy hasz. Transakcja z innym hashem unieważni oryginalne dane płatności, ale dzięki poprawności matematycznej będą one nadal ważne. Dla nadawcy będzie to wyglądało na odrzucenie (nie może jej znaleźć), ale transakcja nadal jest w mempoolu i czeka na potwierdzenie.

To otwierało drogę do ataków hackerskich

Wzywa on atakującego do zmiany wpisu i poinformowania nadawcy, że transakcja została odrzucona i do wysłania nowej. Jeśli nadawca to zrobi, w rzeczywistości tworzy dodatkową transakcję. Ponieważ płatności nie podlegają zwrotowi, po potwierdzeniu obu płatności nic nie może z tym zrobić.

Wdrożenie SegWit-a

Rozwiązanie jest zaskakująco proste. Wymyślił ją Pieter Wuille, a polega ona na oddzieleniu klucza prywatnego od reszty danych – segregated witness, w skrócie SegWit. Podczas gdy oryginalna transakcja i identyfikator transakcji składają się z klucza prywatnego, klucza publicznego i reszty danych, SegWit przenosi wrażliwe dane do łańcucha bocznego. Identyfikator Transakcji składa się więc wyłącznie z danych niezmiennych. Rozwiązuje to problem opisany w punkcie dotyczącym zmienności transakcji. Atakujący nie może już nadpisać transakcji i oszukać nadawcy, ponieważ nie można już zmienić identyfikatora transakcji.

Problem ze skalowalnością, który rozwiązał SegWit

Skalowalność to zdolność do obsłużenia większej liczby użytkowników – w przypadku Bitcoina jest to większa przepustowość transakcji. Niezależnie od tego jak spojrzymy na problem, podstawowa warstwa Bitcoina jest w tym względzie bardzo powolna. Może przetwarzać około 4,5 transakcji na sekundę. Choć nie jest to właściwe porównanie (nie są te same systemy i zastosowania), Visa może obsłużyć 1700 w tym samym czasie. SegWit częściowo rozwiązuje także ten problem.

Więcej przestrzeni w blokach

Jeśli spojrzymy na obrazek ponownie, od razu wszystko stanie się jasne. Dane usunięte z bloku zajmowały do 60% miejsca w każdej transakcji. Poprzez rozdzielenie go na sidechain, podwoiła się przestrzeń przeznaczona na transakcje. Na samym początku wspomnieliśmy też, jak elegancki jest SegWit. Najważniejszym faktem jest to, że jest to „soft fork”.

Inne warstwy Bitcoina

W swojej podstawowej warstwie, Bitcoin nigdy nie będzie wystarczająco szybki, by przyjąć się na świecie jako środek płatniczy. Z technicznego punktu widzenia jest to po prostu niemożliwe. W zasadzie nie jest to możliwe bez naruszania podstawowych zasad, takich jak decentralizacja i bezpieczeństwo.

Rozwiązaniem są dodatkowe warstwy. Potrzebują one jednak bezbłędnego systemu, na którym mogą się oprzeć. Zmienność transakcji była problemem, który uniemożliwiał powstanie podobnych aplikacji. Po jego usunięciu otworzyło to drzwi na przykład dla systemu Lightning Network, który jest już bardzo podobny do systemu Visy.

Zasada działania Lightning Network

Przypomina to bilety do pubu w zamian za porftel. Wypijam kufel bez płacenia, oni podpisują bilet, a ponieważ właściciel pubu ma mój portfel, nie musi się martwić o oszustwo. Na koniec dnia rozliczamy się – on dostaje pieniądze, a ja portfel z resztą pieniędzy. Możemy też się nie rozliczać, a jedynie zapisywać „kto jest komu ile winien”. Dostaję piwo za 20 (jestem ci winien 20), sprzedaję mu chleb za 50 (jest mi winien 30). Każdy z nas może dokonywać tysięcy takich transakcji na sekundę. Wszystko to w najbezpieczniejszej sieci na świecie.

Tylko dlaczego miałoby to czemuś służyć? Wyobrażasz sobie, że Visa wykonuje 1700 transakcji na sekundę, a na koniec dnia okazuje się, że wszystkie są nieważne? Towary zostały wysłane, każdy otrzymał jakąś usługę, ale realistycznie rzecz biorąc, nikt za nic nie zapłacił. To byłby chaos. W lightning network i sieci blockchain nie ma takiej możliwości.

Realia i praktyczne zastosowanie

Dziś Bitcoin używa trzech formatów:

  • Legacy – zaczyna się od cyfry 1 i jest najdroższe
  • SegWit – zaczyna się od cyfry 3
  • Native SegWit – zaczyna się od bc1 i jest najtańszy

Wszystkie są ze sobą kompatybilne i swobodnie możemy przesyłać pomiędzy nimi jednostki. Wiąże się to jednak z dużą różnicą w wysokości opłat.

Zamiana „rozmiaru” transakcji na „ciężar” transakcji

Można tłumaczyć to jako wagę transakcji, która zaczęła być używana zamiast zwykłego rozmiaru danych. Ma to daleko idące konsekwencje, zwłaszcza jeśli chodzi o opłaty wnoszone jedynie z tytułu wagi.

Waga jest obliczana jako: Podstawowa Wielkość Transakcji x 3 + Całkowita Wielkość Transakcji.

W przypadku starszych adresów/transakcji o rozmiarze np. 1000 waga wynikowa wyniosłaby 4000, ponieważ transakcja składa się na początku i na końcu z tych samych danych. Jeśli jednak użyjemy SegWit, podstawowa transakcja zostanie oczyszczona z danych „witness” i dzięki temu będzie „ważyć” o wiele mniej – opłaty będą o wiele mniejsze.

Używając SegWit i adresów Native SegWit możemy zmniejszyć opłaty nawet o 50%.

Jedynym problemem może być to, że nie każdy portfel obsługuje adresy segwit. Jaka jest rada? Chroń się przed takimi portfelami.

Aktualizacja o nazwie SegWit2X była w planach już od jakiegoś czasu. Miała ona zwiększyć rozmiar bloku z 1MB do 2MB – jednak oznaczałoby to hard fork. Ostatecznie zmiana nie została wprowadzona.

Zasadniczo jest to takie samo rozwiązanie jak Bitcoin Cash. Była jednak jedna różnica. SegWit2X miał przenieść całą społeczność do nowego łańcucha (dobrowolnie i za ich zgodą), podczas gdy zwolennicy Bitcoin Cash odseparowali się w złości.

Czy warto używać SegWit i Native SegWit?

Nie ma sensu używać dziś żadnego innego typu adresu – dlatego zawsze wybieraj Native SegWit.

Recent Content