Samolot na Aerofestivalu 2015 w Poznaniu

Protokół Bitcoina od środka: Zanim powiemy Hello World

Bitcoin jako waluta przyszłości z dnia na dzień przyciąga coraz większe zainteresowanie. Już od dłuższego czasu przestaje być tylko zabawką pasjonatów nowych technologii, lecz staje się powszechnie akceptowanym środkiem płatniczym. W chwili obecnej za Bitcoiny można kupić praktycznie wszystko. Płatności tą walutą są nieco bardziej skomplikowane niż przekazywanie klasycznych banknotów z rąk do rąk, dlatego aby zdobyć nieco zaufania do tej wirtualnej waluty, warto poznać zasady, które nią rządzą.

Główną cechą Bitcoina i to co wyróżnia go na tle klasycznych walut jest fakt, że jego sieć oparta jest o model peer-to-peer. Brak centralnego serwera i olbrzymia liczba aktywnych węzłów uniemożliwia wyłączenie sieci Bitcoina poprzez proste wyciągnięcie wtyczki z kontaktu. Oznacza to również, że chcąc się do niej dołączyć, wystarczy, że zainicjujemy połączenie do dowolnego węzła, który się w niej znajduje. Takim węzłem nazywamy komputer, na którym uruchomiona jest oficjalna aplikacja Bitcoin Core lub inna implementująca protokół Bitcoina. Celem takiego węzła jest między innymi propagowanie informacji o zachodzących transakcjach, czy sprawdzanie ich poprawności.

Zdobywamy adres dowolnego węzła sieci Bitcoin

Pierwszy adres, który pozwoli nam na połączenie z siecią Bitcoina można zdobyć na kilka sposobów. Najprostszym z nich jest połączenie się ze specjalnie powstałym w tym celu serwerem DNS, który w wyniku zapytania zwracaja listę kilkunastu losowo wybranych adresów aktualnie aktywnych węzłów sieci. Lista serwerów DNS dostępna jest na tym wiki.

W systemach Windows jak i Linux adresy węzłów można pobrać poleceniem nslookup. Poniżej wynik przykładowego zapytania do serwera o adresie seed.bitcoin.sipa.be.

Przykładowe wywołanie polecenia nslookup na serwerze DNS zwracającym adresy węzłów sieci Bitcoin
Przykładowe wywołanie polecenia nslookup na serwerze DNS zwracającym adresy węzłów sieci Bitcoin

Znamy już sposób na zdobycie adresu aktywnego węzła sieci Bitcoin. Kolejnym krokiem będzie próba połączenia się z tym węzłem. Wcześniej jednak, aby zaakceptował on nasze połączenie, musimy pokazać mu, że mówimy w tym samym języku.

Podstawy komunikacji

Podstawowym portem, na którym pracuje Bitcoin jest 8333. Na tym porcie aplikacja nasłuchuje nadchodzących połączeń z sieci, zaś obsługiwanym protokołem jest TCP.

Standardowy model komunikacji między węzłami odbywa się przy pomocy odpowiednio przygotowanych wiadomości. Każda z nich niesie za sobą określone znaczenie. Może to być ogłoszenie informacji o wykonaniu transakcji, o aktualnie aktywnych węzłach sieci, czy prośba o przysłanie szczegółów danej płatności. Zanim powiemy “Hello World” sieci Bitcoin, musimy poznać podstawowe zasady rządzące protokołem i sposób konstruowania odpowiednich wiadomości.

Nagłówek każdej wiadomości

Każda wiadomość w sieci Bitcoin rozpoczyna się nagłówkiem. Dzieki niemu aplikacja jest w stanie odfiltrowac pakiety nie należące do sieci, rozpoznaje typ przychodzącej wiadomości, wie ile bajtów należy przeczytać, aby zinterpretowac wiadomość oraz dzięki sumie kontrolnej w nim zawartej jest w stanie określić, czy podczas transmisji nie nastąpiło przekłamanie jej treści.

Każdy nagłówek składa się z czterech elementów:

Wiadomość powitalna o nazwie “version”

Do zainicjowania połączenia potrzebne jest zbudowanie wiadomości o nazwie “version”. Taki pakiet jest wizytówką aplikacji, która chce połączyć się z siecią lub jest w niej obecna. Zawiera m.in. numer wersji protokołu, który implementuje, nazwę aplikacji, czy aktualną godzinę, o której pakiet jest wysyłany.

Poniższej znajduje się szczegółowy opis wiadomości typu “version”.


Zanim zajmiemy się tworzeniem powitalnej wiadomości “version”, komentarza wymaga budowa pól reprezentujących adresy węzłów oraz pola “user_agent” zajmującego zmienną liczbę bajtów.

Poniższa tabela opisuje ciąg bajtów reprezentujących adres IP.


Pole “user_agent” zajmuje zmienną liczbę bajtów. W dużym skrócie, na początku znajduje się informacja ile bajtów zajmuje tekst tego pola, następnie tyle bajtów jest zarezerwowanych na znaki w formacie ASCII. Koncepcja byłaby całkiem prosta, gdyby twórcy Bitcoina nie postanowili jej trochę skomplikować poprzez potraktowanie liczby określającej długość tekstu także zmienną liczbą bajtów w zależności od jej wielkości. Koncepcja ta stosowana jest nie tylko przy ciągach znaków tekstowych, ale także przy innych kolekcjach, których wielkość wymaga określenia.

Poniższa tabela przedstawia budowę ciągu bajtów reprezentującego liczbę, którego wielkość zależy od jej wartości.

Co dalej?

Znając postawową koncepcję rządzącą inicjowaniem kontaktu z siecią Bitcoin, możemy przejść z teorii do praktyki i zbudować powitalne pakiety według powyżej opisanych zasad.

O tym w jaki sposób to zrobić i jak sieć zareaguje na “Hello World” w naszym wykonaniu, dowiemy się w następnym wpisie 🙂


Źródła, z których korzystałem przygotowując wpis:
1. https://bitcoin.org/en/developer-documentation
2. https://en.bitcoin.it/wiki/Protocol_documentation

Niniejszy post jest częścią cyklu “Protokół Bitcoina od środka”. Jeżeli zainteresowała Ciebie ta tematyka, zachęcam do zapoznania się również z pozostałymi wpisami:

  1. Zanim powiemy Hello World
  2. Budujemy nagłówek
  3. Łączymy się z siecią
  4. Generujemy adresy kont
  5. Koncepcja transakcji
  6. Jak zdobyć Bitcoiny?
  7. Budowa wiadomości „tx”
  8. Jak autoryzowane są transakcje?
  9. Ogłaszamy transakcję