Mike Hearn jest programistą Bitcoin i współautorem kilku BIP, czyli dokumentów opisujących proponowane rozwiązania techniczne. Pracował nad biblioteką bitcoinj oraz metodami sprawdzania połączeń, wybierania potrzebnych transakcji i komunikacji podczas płacenia. Jego wkład łatwiej zrozumieć, śledząc drogę od portfela w telefonie do sklepu oczekującego na zapłatę.
Twórca portfela Bitcoin nie musi samodzielnie pisać całego kodu komunikacji. Może użyć biblioteki: zbioru gotowych funkcji, na których zbuduje aplikację. Jedną z takich bibliotek jest bitcoinj. Jej plik AUTHORS wymienia nazwisko Mike Hearn wśród wielu współtwórców i odsyła do historii zmian w Git. Pozwala to odnaleźć konkretne wkłady w rozwój. Nie oznacza jednak, że Hearn sam napisał wszystkie funkcje lub obecnie kieruje całym projektem. [1]
bitcoinj to biblioteka w języku Java, która umożliwia obsługę portfela oraz wysyłanie i odbieranie transakcji bez lokalnej instalacji Bitcoin Core. Dla telefonu przydatny jest tryb SPV, czyli Simplified Payment Verification: korzysta z nagłówków bloków i transakcji istotnych dla portfela zamiast w pełni sprawdzać każdą transakcję. Oszczędza to transfer danych i zasoby urządzenia. Dokumentacja opisuje też eksperymentalną pełną weryfikację. To różne tryby; lżejsze działanie nie jest po prostu identyczną kontrolą wszystkich reguł wykonaną szybciej. [2]
Wyobraźmy sobie laptop budzący się z uśpienia. Połączenie z innym węzłem może wyglądać na otwarte, choć już nie działa. BIP 31 Hearna pozwala wysłać ping z nonce, tutaj liczbą rozpoznającą konkretne zapytanie. Drugi węzeł odsyła tę samą liczbę w komunikacie pong. Dla wersji protokołu powyżej 60000 umożliwia to powiązanie odpowiedzi z zapytaniem i pomiar czasu reakcji. Sprawdzamy komunikację: sama odpowiedź nie dowodzi uczciwości węzła ani ważności płatności. [3]
Po co telefon ma pobierać transakcje, które go nie dotyczą? Hearn i Matt Corallo opisali w BIP 37 filtr Bloom, czyli niewielką strukturę wybierającą możliwe dopasowania. filterload ustawia filtr, filteradd dodaje element, a filterclear usuwa filtr. Może on przepuścić niepowiązaną transakcję; to wynik fałszywie dodatni. Dokładniejszy filtr ogranicza transfer, lecz może ułatwić drugiemu węzłowi powiązanie transakcji z adresem IP portfela. Oszczędność danych nie oznacza więc automatycznej ochrony prywatności. [4]
Telefon musi ustalić, czy odebrana transakcja rzeczywiście należy do danego bloku. Komunikat merkleblock z BIP 37 dostarcza danych do dowodu Merkle: kilka odcisków danych, czyli hashy, pozwala sprawdzić powiązanie transakcji ze wspólnym odciskiem zapisanym w nagłówku bloku. Nie trzeba pobierać całego bloku. Dowód nie wyklucza jednak, że drugi węzeł zataił inne transakcje. SPV nie zastępuje też pełnego sprawdzenia ich ważności. Dokumentacja bitcoinj wyjaśnia zagrożenie, gdy napastnik kontroluje wszystkie połączenia portfela i wybiera, co mu pokaże. [4] [5]
Przy zakupie trzeba znać kwotę i odbiorcę. Gavin Andresen i Hearn opracowali w tym celu BIP 70, który wprowadza PaymentRequest. Wiadomość zawiera szczegóły płatności: wyjścia określające, gdzie transakcja ma przypisać środki, kwotę i ewentualny termin ważności żądania. Certyfikaty X.509 mogą uwierzytelnić sprzedawcę, podobnie jak serwery internetowe. Protokół dopuszcza jednak również pki_type none, czyli żądanie bez tego uwierzytelnienia. Sam format prośby o zapłatę nie dowodzi więc potwierdzonej tożsamości sklepu. [6]
Jeżeli żądanie wskazuje serwer płatniczy, po zatwierdzeniu operacji portfel wysyła do niego wiadomość Payment. Odpowiedź PaymentACK może informować, że sklep przyjął płatność do przetworzenia. To użyteczne dla klienta, ale pozostaje oświadczeniem serwera sprzedawcy, a nie dowodem potwierdzenia transakcji w bloku. Podobnie refund_to jedynie wskazuje, dokąd sklep może wysłać zwrot; samo pole nie oddaje pieniędzy. Aplikacja musi rozróżniać komunikaty dotyczące płatności od rzeczywistego przepływu środków. [6]
Stary poradnik może sugerować, że opisany sposób działa wszędzie. Rejestr oznacza BIP 70 jako Deployed, czyli wdrożony. Tymczasem informacje o wydaniu Bitcoin Core 0.20.0 opisują całkowite usunięcie jego obsługi z tego programu. Nie ma w tym sprzeczności: historycznie używana specyfikacja nie musi być obsługiwana przez każdego dzisiejszego klienta. Praca Hearna pomaga zrozumieć rozwój portfeli; praktyczne użycie wymaga też sprawdzenia możliwości konkretnego programu i jego wersji. [6] [7]
Pełniejszy obraz uzyskasz, czytając to hasło razem z Jeff Garzik, Gloria Zhao, Merkle Tree. Do tego hasła prowadzą również odsyłacze z Jeff Garzik, Gloria Zhao.