Koncepcja przelewu samego w sobie – czy to bankowego, czy w sieci Bitcoin – wydaje się być nieskomplikowana. Mamy nadawcę, odbiorcę, kwotę przelewu i w sumie na tym możnaby zakończyć opis procesu transakcji. Jednak po spodem dzieje się dużo ciekawych rzeczy, które mają na celu zapewnienie jej poprawności. Zobaczmy jak wygląda koncepcja transakcji w sieci Bitcoin 🙂
Czym różni się klasyczny przelew od tego w świecie Bitcoina
Na początku należałoby wskazać kilka cech odróżniających klasyczny przelew bankowy od tego, który można wykonać Bitcoinami:
Kilka wejść, kilka wyjść
Pojedyńcza transakcja może zawierać kilka kont źródłowych oraz kilka kont docelowych.
Trzeba wydać wszystko
Każdy przelew zakłada, że wydajemy z konta wszystkie środki. W praktyce, korzystając z dowolnej aplikacji, z naszego punktu widzenia jedynie wybrana kwota przechodzi na konto odbiorcy. Tak naprawdę, z punktu widzenia protokołu jest to transakcja z jednym wejściem i dwoma wyjściami. Pierwsze wyjście to konto odbiorcy, zaś drugie to adres naszego konta, na które wraca reszta środków.
Nie ma tytułu, nie ma adresu, nie ma niczego
Do transakcji Bitcoinowej nie da się dodać żadnych dodatkowych informacji takich jak tytuł przelewu, czy adres odbiorcy. Wysyłamy konkretną kwotę pod konkretny adres. Reszta pozostaje tajemnicą.
Za to jest podatek
Nie ma nic za darmo 🙂 Wykonując przelew jesteśmy zobligowani do zapłacenia podatku na rzecz komputerów (tzw. kopalnie), które będą potwierdzać naszą transakcję. W sumie to nie jesteśmy zobligowani, ale bez uiszczenia podatku trafiamy na koniec kolejki i możemy czekać na realizację przelewu nawet kilka miesięcy.
Przelew w sumie doszedł, ale z pewnym prawdopodobieństwiem
Blok z potwierdzonymi transakcjami tworzony jest średnio co 10 minut. Tyle może zająć informacja zwrotna o akceptacji przelewu – jeśli będziemy mieć szczęście i zapłacimy podatek 🙂 Istnieje jednak prawdopodobieństwo, że powstanie alternatywny blok transakcji, w którym nasza nie będzie uwzględniona. Dlatego przyjmuje się, że w przypadku większych kwot dla pewności należy poczekać, aż powstanie 5 bloków następujących po bloku, w którym znajduje się nasza transakcja.
Anonimowo, ale jawnie
Brak konieczności podawania danych osobowych pozwala na wykonywanie zupełnie anonimowych transakcji. Jednak w momencie, w którym przyznamy się do adresu naszego konta, można wyśledzić każdego pojedyńczego satoshi (grosz w świecie Bitcoina), który do nas trafił i gdzie powędrował.
Jak to wszystko wygląda z punktu widzenia klienta?
W poprzednich wpisach niniejszego cyklu doszliśmy do momentu, w którym wykorzystując protokół komunikacji z siecią Bitcoin potrafimy nawiązać połączenie, przedstawić się oraz wygenerować własny adres konta Bitcoinowego. Czas najwyższy pójść krok dalej i ogłosić sieci zawarcie transakcji. Zanim to nastąpi, trochę informacji:
Technikalia stojące za przelewem
Do tej pory w komunikacji z siecią Bitcoin wykorzystywaliśmy pakiety danych, zwanych wiadomościami. Nasz klient potrafi wysłać wiadomość typu “version”, która służy do przedstawienia się sieci i zainicjowanie połączenia. W przypadku przelewu będzie podobnie. Wykonanie transakcji to nic innego jak wysłanie w eter wiadomości o nazwie “tx” zawierającej niezbędne informacje o wykonywanej transakcji. Oto co będziemy potrzebować, aby taką wiadomość skonstruować i jednocześnie co wymaga sieć, aby uznać transakcję za godną rozważenia (dla uproszczenia implementacji, założymy, że będziemy budować transakcje, których środki będą wychodzić z pojedyńczego konta oraz na pojedyńcze konto trafiać):
- Adres konta, z którego wykonujemy przelew oraz odpowiadający mu klucz prywatny;
- Identyfikator ostatniej transakcji, dzięki której na koncie nadawcy znalazły się środki;
- Jeżeli transakcja nie ma być wykonana natychmiastowo, to data planowanego przelewu;
- Adres odbiorcy;
- Kwota transakcji;
- Kwota podatku, jaki chcemy zapłacić;
- Specjalnie skonstruowany skrypt podpisujący transakcję.
Te wszystkie informacje o tym, jak wygląda koncepcja transakcji w sieci Bitcoin, potrzebne są do skonstruowania wiadomości “tx” odpowiadającej ogłoszeniu przelewu w sieci. W kolejnych wpisach skupimy się na szczegółowej budowie pakietu oraz zaimplementujemy możliwość wykonywania transakcji rozszerzając dotychczas powstałego mini klienta w języku C#.