我正在做的是生成“虚拟”钱包,从使用secrets.randbits(128)
生成的原始熵中检索助记密码和钱包-生成有效的bip39密钥对。
我得到的错误是沿着这些行:
ValueError: 125 bits provided; expected: (128, 160, 192, 224, 256)
它的范围从122到127位不等。对于连续多个错误,通常说相同的位数,即
125 bits provided
3次,然后切换到122 bits provided
2次,然后进行第六次尝试。我正在使用btclib –完整功能是
def create_passphrase():
memo = bip39.mnemonic_from_raw_entropy(secrets.randbits(128) , 'en')
print(mnemo)
return mnemo
抱歉,如果我缺少明显的内容。
最佳答案
这是btclib中的错误。
函数bip39.mnemonic_from_raw_entropy()
调用bip39.entropy_from_raw_entropy()
,后者调用entropy.str_from_entropy()
。
当使用整数作为其entropy.str_from_entropy()
参数调用entr
时,它将尝试将该整数转换为表示位here的字符串:
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中没有其他错误在等你。