Генерация дочернего биткоин адреса из seed фразы - Python

У меня есть такой код

from bitcoinlib.encoding import *
from bitcoinlib.wallets import *
from bitcoinlib.keys import *
from bitcoinlib.mnemonic import Mnemonic
import bip32utils

mnemon = Mnemonic('english')
seed = mnemon.to_seed('disorder ramp mask bacon degree post panda truck embody build federal impact ecology provide jealous')
print(f'BIP39 Seed: {seed.hex()}\n')

root_key = bip32utils.BIP32Key.fromEntropy(seed)
root_address = root_key.Address()
root_public_hex = root_key.PublicKey().hex()
root_private_wif = root_key.WalletImportFormat()
print('Root key:')
print(f'\tAddress: {root_address}')
print(f'\tPublic : {root_public_hex}')
print(f'\tPrivate: {root_private_wif}\n')

child_key = root_key.ChildKey(0).ChildKey(0)
child_address = child_key.Address()
child_public_hex = child_key.PublicKey().hex()
child_private_wif = child_key.WalletImportFormat()
print('Child key m/0/0:')
print(f'\tAddress: {child_address}')
print(f'\tPublic : {child_public_hex}')
print(f'\tPrivate: {child_private_wif}\n')

я хочу получить свой дочерний адрес из сид фразы но он не генерирует новый адрес каждый раз, как мне это исправить? я не совсем понимаю какой из адресов мне нужен Childe key или root key помогите пожалуйста

вывод в консоль

Root key:
    Address: 14hZ9cvhZuVH6xXobqDgp9b15jWTU6Muaz
    Public : 03e4303c38bfc0c25b5b649dfe2c6bbc4b664638c87e8018ed54a03c19e73126f3
    Private: L5cSWduhKJoo6TS8QWtvLZFHdonSStC2BWFuQc93pxGWNbz24sw6

Child key m/0/0:
    Address: 191ywBKGaPLgFPQu6Yjqkn5vXW3ps7H29x
    Public : 032e9b84b8ac222bbe238ad4fa436aebee10852420010736c2056f50477fce5fe3
    Private: KzYD7MGKXTmVfrx3dpQe7B3FwKFzJz7vDFusnM43PCjKnF5SmRQy

Ответы (1 шт):

Автор решения: artemgh

В программирование даже есть такая проблема как генерация случайных чисел, на самом деле на ПК, сгенерировать их невозможно. Поэтому в дело вступает хитрый алгоритм генерации "псевдослучайных" чисел. Проблема в том, что у него есть такой параметр как seed в переводе "зерно", исходя из названия Вы можете догадаться что оно нужно чтобы на его основе начать генерировать значение, в данном случае у Вас зерно одно и тоже, поэтому выход один и тот же.

Вам следует каждый раз при создании нового адреса, добавлять какие-то слова/символы в эту строку: disorder ramp mask bacon degree post panda truck embody build federal impact ecology provide jealous

Вам надо будет подумать насчёт генерации, лучше конечно брать их из какого-нибудь словаря, но делать это псевдослучайно, либо же каждый раз брать символы из Вашей строки по определенному алгоритму, который зависит от длины строки, теперь когда у Вас будет другой seed Вы получите другое значение.

P.S

На самом деле, как это не грустно, но в bitcoin нет никакой защиты от повторения ключа, кроме как теория вероятности. Поэтому над этим вопросом, стоит поработать, рекомендую к ознакомлению эту статью: Генератор псевдослучайных чисел.

→ Ссылка