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.
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.
- entropię
- zamienioną na mnemonic
- klasę mnemonica
- seed w formie hex
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())
**Gwarantuję Ci niezmienność moich treści**
Hash artykułu:
ID transakcji: sprawdź OP_RETURN i porównaj jego hash
Komentarze
Prześlij komentarz