我正在做的是生成“虚拟”钱包,从使用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中没有其他错误在等你。

10-05 20:09