Rafał prostuje Bitcoina: Mnemonik

in bitcoin •  2 years ago

 
Nie, nie Johny ;]

Na początek strzał z wiki: Mnemotechnika, mnemonika (gr. mneme: pamięć) – ogólna nazwa sposobów ułatwiających zapamiętanie, przechowywanie i przypominanie sobie informacji. 


Każdy użytkownik portfela HD dostaje na starcie do zapisanie 12-24 „magicznych” słów, które ma sobie zapisać w bezpiecznym miejscu. Zapewne też każdy użytkownik zastanawiał się, po co to jest, co to robi i jak to faktycznie działa.

 
Chcę w tym tekście przybliżyć działanie mnemonika, jego powstawanie i rolę w portfelu HD.

 
Musimy jednak zacząć od portfela HD :]

HD to skrót od „hierarchical deterministic” czyli po naszemu hierarchiczny deterministyczny. Dwa trudne słowa mówiące nam wprost, że portfel HD ma strukturę hierarchiczną (jak katalogi, podkatalogi i pliki na dysku) oraz jest deterministyczny – można go odtworzyć w takiej samej formie wielokrotnie.
Zasady generowania adresów i portfeli w standardzie HD opisuje BIP32 (wszystkie linki na końcu), oraz BIPy 43 i 44. Natomiast użycie mnemonika do generowania klucza głównego portfela HD znajdziemy w BIP39.
Klucz główny portfela ma aż 512 bitów i umożliwia wygenerowanie wszystkich kolejnych portfeli i adresów w portfelach (tak tak, portfel HD umożliwia zakładanie wielu portfeli w wielu walutach). 


Czym więc jest mnemonik? 

Jest to sposób zapisania seeda* z którego generowany jest klucz główny portfela.   
*seed jest często tłumaczony jako „ziarno” ale nadal nic nam to nie mówi. Generalnie jest to losowa liczba na podstawie której deterministycznie (w powtarzalny sposób) generuje się/oblicza kolejne potrzebne zmienne. Coś jak punkt startowy. 


Zgodnie ze standardem opisanym w BIP39 seed musi mieć konkretna długość- 128, 160, 192, 224 lub 256 bitów. Długość seeda określa nam jakość entropii (losowości) jaką użyliśmy do jego wygenerowania. Długość seeda w bitach ma oczywiście swoje odzwierciedlenie w długości mnemonika jaki musimy sobie zapisać, będzie to odpowiednio 12,15,18,21 lub 24 słowa. 

Ktoś, kto ma kalkulator w głowie już widzi, że coś nie pasuje. 128 bitów podzielone przez 12 słów daje 10,(6) a mówimy tu ciągle o bitach – czyli powinna wyjść liczba całkowita.   I właściwie wychodzi, dzięki sumie kontrolnej. Mnemonik składa się ze słów które są pobierane z ustalonej listy (również podanej w BIP39), Słów tych jest dokładnie 2048 czyli numer słowa możemy zapisać za pomocą 11 bitowej liczby (2^11=2048). Czyli 12 słów daje nam 132bity danych. Potrzebujemy „tylko” 128, zostają więc nadmiarowe 4 bity. Te ostatnie bity są sumą kontrolną, używaną do sprawdzenia czy poprawnie wpisaliśmy mnemonik (suma kontrolna to pierwsze bity wyniku SHA256 z seeda).
 

 Jak więc powstaje mnemonik? 

Losujemy/generujemy liczbę o odpowiedniej długości, dodajemy sumę kontrolną, dzielimy powstałą liczbę na paczki po 11 bitów i dopieramy kolejne słowa ze słownika. Voila! Gotowe.
Ale mamy jeszcze dwa kroki do wykonania, jeden wcześniej a drugi później. 

Najpierw: skąd wziąć tą pierwszą „liczbę seeda”? Od tego właściwie zależy wszystko, bowiem jeżeli użyjemy „słabej entropii” (czyli zdarzeń, ciągów znaków które mogą być odgadnięte czy obliczone) to bezpieczeństwo naszego portfela jest niewielkie, a może się wręcz zdarzyć że ktoś wygeneruje identyczny ciąg (np. jeżeli użyjemy fragmentu Biblii, jakiegoś wiersza itp.).
Portfele sprzętowe (np. Trezor) robią tak, że biorą część danych z urządzenia a część z komputera na którym następuje inicjalizacja. Strona bitadderss.org używa ruchów myszką i wprowadzonych z klawiatury znaków. Użytkownik linuxa może pobrać odpowiednią ilość bitów z /dev/random. Jednak jedyną naprawdę skuteczną metodą generowania są losowe zdarzenia w świecie realnym: rzut monetą, rzut kością, karty z potasowanej talii. 

No to czas na kryptoreklamę: jakiś czas temu, pod wpływem apki na androidzie generującej adresy na podstawie talii kart, napisałem program który generuje użytkownikowi mnemonika wybranej długości na podstawie kilku kolejnych kart z dwóch potasowanych talii. Program do pobrania z mojego githuba :) 

 

No dobrze, mamy superlosowy seed, robimy z niego mnemonika. Co się dzieje dalej? Przecież klucz główny portfela HD ma 512 bitów, a tu mamy zwykle 128.
BIP39 opisuje to bardzo prosto: bierzemy wszystkie słowa (w formie tekstu, nie jako ciąg liczb) i 2048 razy robimy SHA512. Dopiero ostatni wynik haszowania jest kluczem głównym portfela HD, z którego dzięki kryptovoodo są generowane kolejne portfele, klucze, adresy...

Wszystko niby fajnie, ale co z kompatybilnością? Czy każdy portfel używa tej samej metody?
Odpowiedź brzmi: niestety NIE.
Na szczęście dla nas, praktycznie wszystkie portfele przy imporcie mają możliwość zaznaczenia/wybrania standardu jakim ma się kierować w drodze od mnemonika do klucza głównego i później ścieżki generowania portfeli. Gdyby nie to, skazani bylibyśmy na używanie jednego programu.
Jak dobrze, że mamy BIPy ;]
 

Mam nadzieję, że udało mi się w przystępny sposób opisać powstawanie i rolę mnemoników w portfelach.   Jeżeli czegoś brakuje, proszę o komentarz :)
 

Wszystkie BIPy: https://github.com/bitcoin/bips 

Mój generator mnemoników: https://github.com/Rav3nPL/SeedGenerator  
 

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

Checks out, @rav3npl. Damn cryptos :^). I want to see more folks like You on this channel.
Currently I am curating inteviews with blockchain people and also steemians.
So question: Who would you like to see approached in a life conversation?

Congratulations @rav3npl! You have completed some achievement on Steemit and have been rewarded with new badge(s) :

Award for the number of upvotes received

Click on any badge to view your own Board of Honor on SteemitBoard.
For more information about SteemitBoard, click here

If you no longer want to receive notifications, reply to this comment with the word STOP

By upvoting this notification, you can help all Steemit users. Learn how here!