我正在做的是生成“虚拟”钱包,从原始熵中检索助记密码和钱包,这是使用 secrets.randbits(128)
生成的 - 从而产生有效的 bip39 对键。
我得到的错误是这样的:
ValueError: 125 bits provided; expected: (128, 160, 192, 224, 256)
它可以在 122 到 127 位之间变化。通常表示连续多个错误的位数相同,即 3 次 125 位提供
,然后切换到 122 位提供
2 次,然后工作在第6次尝试。
我正在使用 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 中没有其他错误等着咬你。
关于python - 为什么 btclib.mnemonic_from_raw_entropy 声称我传递给它的熵少于 128 位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55211270/