Это ошибка в btclib.
Функция bip39.mnemonic_from_raw_entropy()
вызывает bip39.entropy_from_raw_entropy()
, которая вызывает entropy.str_from_entropy()
.
Когда entropy.str_from_entropy()
вызывается с целым числом в качестве аргумента entr
, он пытается преобразовать это целое число в строку, представляющую биты, здесь :
entr = bin(entr)[2:] # remove '0b'
Это не работает: любое переданное целое число будет, если оно действительно случайным, будет преобразовано только в число битов, ожидаемое примерно в половине времени. Чтобы понять почему, рассмотрим эти примеры случайных данных (для простоты я буду использовать 8 бит, а не 128, но принцип тот же):
>>> bin(0b10001011)[2:]
'10001011'
>>> bin(0b01010110)[2:]
'1010110'
>>> bin(0b00111011)[2:]
'111011'
Как видите, метод преобразования, используемый btclib, удаляет все начальные нули, что приводит к получению строки неправильной длины.
Обходной путь может заключаться в том, чтобы преобразовать результат secrets.randbits(128)
в соответствующую строку самостоятельно и передать это:
def create_passphrase(bits=128):
bitstring = f'{secrets.randbits(bits):0{bits}b}'
memo = bip39.mnemonic_from_raw_entropy(bitstring , 'en')
print(memo)
return memo
... при условии, что в btclib нет других ошибок, ожидающих вас укусить.