Przejdź do głównej zawartości

Tworzenie własnego portfela Bitcoin SV - HD Wallet (Część 1)

W tradycyjnym podejściu jakie opisywałem (tu, tu, i tu) mógłbyś tworzyć wiele niezależnych kluczy prywatnych, każdy generowany osobno i losowo. Problem z takim modelem polega na tym, że każdy klucz trzeba osobno zapisać, zabezpieczyć - później odczytać i odzyskać - co szybko staje się niepraktyczne. Poprzednie przykłady opierały się na zarządzaniu jednym kluczem prywatnym/jednym adresem; wysyłaliśmy transakcję a reszta wracała dokładnie na ten sam adres. Teraz podejdźmy do tego tak jak pisał o tym sam Satoshi Nakamoto – jedna transakcja, jeden adres = większa prywatność.

Nowoczesne portfele kryptowalutowe nie generują pojedynczych losowych kluczy prywatnych. Zamiast tego używają struktury deterministycznej, która pozwala z jednego „sekretu głównego” odtworzyć nieskończoną liczbę adresów.

HD WALLET BSV

Ten model nazywa się HD wallet (Hierarchical Deterministic Wallet).

Na początku zaczniemy od entropii czyli czystych, losowych bitów. Następnie ta entropia będzie przekształcona w tzw. mnemonic phrase (12 lub 24 słowa). Mnemonic nie jest dodatkową warstwą bezpieczeństwa, lecz jedynie ludzką reprezentacją tej samej informacji i pozwala użytkownikowi łatwo zapisać i odtworzyć portfel.

Z tego mnemonica stworzony będzie jeden główny materiał kryptograficzny (seed), który działa jak „korzeń” całego systemu. Nie przechowuje on pojedynczych adresów, tylko umożliwia ich deterministyczne odtworzenie.

Następnie z tego jednego seeda zbudujemy całe drzewo kluczy. Oznacza to, że będziesz mógł generować dowolną liczbę adresów, ale nie w sposób losowy - każdy adres wyniknie matematycznie z tego samego źródła i konkretnej ścieżki w strukturze (tzw. derivation path).

W praktyce oznacza to, że:
•    masz jeden sekret (mnemonic), 
•    z niego wynika cały portfel, 
•    możesz tworzyć nieskończoną liczbę adresów, 
•    każdy adres jest niezależny kryptograficznie od pozostałych, 
•    wszystkie można odtworzyć w dowolnym momencie, mając tylko ten jeden seed. 

To połączenie wygody i bezpieczeństwa bo nie musisz zarządzać setkami kluczy, a jednocześnie każdy nowy adres zwiększa prywatność, bo nie musisz używać w kółko tego samego.


Ten wpis podzielę jednak na kilka części, bo jeszcze nie wiem jak potoczy się tworzenie całego portfela, no i nie chcę też robić ściany tekstu do czytania. No to zaczynamy 😊

Import bibliotek

import secrets
from bsv.hd import mnemonic_from_entropy, seed_from_mnemonic, master_xprv_from_seed
from bsv.hd import bip44_derive_xprvs_from_mnemonic
from bsv.constants import BIP44_DERIVATION_PATH
  • import secrets - generator kryptograficznie bezpiecznej losowości z Pythona; to właściwy wybór do materiału wejściowego dla portfela, bo nie jest przewidywalny jak random,
  • mnemonic_from_entropy, seed_from_mnemonic, master_xprv_from_seed - funkcje do pracy z HD walletami,
  • bip44_derive_xprvs_from_mnemonic - funkcja do wyprowadzania wielu kluczy prywatnych w schemacie BIP44, do tworzenia kolejnych kont/adresów z jednego mnemonic.
  • BIP44_DERIVATION_PATH - domyślna ścieżka derivation

Losowość, mnemonic i seed

entropy = secrets.token_hex(32)
print(entropy)

mnemonic: str = mnemonic_from_entropy(entropy)
print(mnemonic)

BIP44_DERIVATION_PATH = "m/44'/236'/0'"

print("Mnemonic:", type(mnemonic))
seed = seed_from_mnemonic(mnemonic, lang='en')
print("Seed:", seed.hex())

  • entropy = secrets.token_hex(32) - entropia to punkt wyjścia do wygenerowania mnemonica. Jeśli jest dobra, cały portfel jest bezpieczniejszy. My generujemy 32 bajty losowości i zapisujemy je jako 64 znaki hex; to jest bardzo mocny, kryptograficzny punkt startowy dla całego portfela.
  • mnemonic: str = mnemonic_from_entropy(entropy) - mnemonic to zestaw słów, który można łatwo zapisać i odtworzyć. Zamiast trzymać surowy ciąg znaków hex, dostajesz format przyjazny człowiekowi
  • BIP44_DERIVATION_PATH = "m/44'/236'/0'" - ta ścieżka mówi, jak mają być wyprowadzane kolejne klucze: 44' oznacza standard BIP44, 236' to identyfikator monety dla BSV, 0' to konto numer 0. Dzięki temu portfel generuje klucze według przewidywalnej i zgodnej ze standardem struktury. Ta linia sama w sobie nie jest tajna. To tylko reguła, według której generujesz klucze.
  • seed = seed_from_mnemonic(mnemonic, lang='en') - to bardziej techniczna postać sekretu, z której potem tworzy się klucze nadrzędne i całe drzewo kluczy. Seed jest fundamentem dla dalszej derivacji. To z niego powstają wszystkie kolejne klucze. Seed jest tak samo wrażliwy jak mnemonic. Nie należy go wypisywać ani zapisywać w niezaszyfrowanej formie.
Teraz uruchamiamy kod i wyświetlamy po kolei, co tam się zrobilo:
Wydruk kodu

Mamy:
  1.  entropię
  2.  zamienioną na mnemonic
  3.  klasę mnemonica
  4.  seed w formie hex
Kod wykonaj sobie kilkakrotnie i obserwuj wyniki, później zapisz do zmiennej entropię (nie generuj już secrets) i pracuj tylko na jednej zmiennej - entropy = "ab34f1....."

Klucze potomne

liczba_adresów = 10 # Liczba adresów do wygenerowania

keys_from_mnemonic_by_bip44 = bip44_derive_xprvs_from_mnemonic(
    mnemonic, 0, liczba_adresów, path=BIP44_DERIVATION_PATH, change=0
) # Generowanie 10 adresów
print
("Wyświetl klucze potomne") for i, key in enumerate(keys_from_mnemonic_by_bip44): # Pętla z 10 adresów print(f"Indeks {i} | Adres: {key.address()} | Klucz prywatny: {key.private_key().wif()}") print(keys_from_mnemonic_by_bip44[0].address()) # Dostęp po numerze indeksu print(keys_from_mnemonic_by_bip44[1].address()) print(keys_from_mnemonic_by_bip44[2].address())
W tym fragmencie kodu generujemy 10 adresów na podstawie mnemonic seed przy użyciu standardu BIP44. Funkcja bip44_derive_xprvs_from_mnemonic() tworzy klucze potomne, które mogą być używane jako kolejne adresy portfela. Następnie wyświetlamy dla każdego klucza jego indeks, adres oraz odpowiadający mu klucz prywatny w formacie WIF. Na końcu dodatkowo pokazuję dostęp do adresów trzech pierwszych wygenerowanych kluczy, na podstawie ich indeksu.

Wykonanie kodu

Na dziś to tyle 😉
Mamy już za sobą podstawy tworzenia oraz derywacji kluczy w Pythonie, co jest jednym z najważniejszych elementów działania portfeli kryptowalutowych.

W kolejnych częściach będziemy rozwijać nasz własny portfel krypto krok po kroku - dodamy nowe funkcje, bezpieczeństwo oraz obsługę adresów i transakcji. A do tego czasu zapraszam do poprzednich wpisów związanych z Pythonem; znajdziesz tam sporo przydatnej wiedzy, która pomoże lepiej zrozumieć kolejne etapy projektu.

Cześć!

 **Gwarantuję Ci niezmienność moich treści**

Hash artykułu:

ID transakcji: sprawdź OP_RETURN i porównaj jego hash

Komentarze

Popularne posty

Status w życiu: confirmed. Dobra, super, a co dalej?

Discord kontra Forum – dlaczego Twój mózg tęskni za phpBB

Cyfrowy minimalizm - mniej pingów, więcej spokoju