adv

《Mastering Bitcoin》中的错误代码可能会导致你的比特币丢失

Bug 比特币
pigsrollaroundinthem (39396)发表于 2018年01月30日 11时02分 星期二
来自比特币实验部门
匿名读者 写道 "著名的《Mastering Bitcoin》(《精通比特币》)一书中有段Python代码有误(key-to-address-ecc-example.py),这段代码被广为流传。这个错误有极高的概率会根据一个正确的私钥生成一个错误的压缩公钥,从而产生一个错误的比特币收款地址,如果使用这个地址会导致比特币资金丢失。这段有BUG的代码从此书中的第一版中就已存在,最新的第二版本依旧存在这个BUG代码,当然,广为流传的中译版本中也自然存在。 下面是那段错误的代码及其修正:https://github.com/bitcoinbook/bitcoinbook/pull/483/files 

BUG的产生是encode函数没有保留前导字符零所致,下面是BUG演示,可见丢失了一个前导零的公钥产生了一个错误的比特币地址:

这其实并不是encode函数的错,一个正常的未添加前缀字符("02"或"03")的压缩公钥长度应该是32字节(64个字符),encode函数会将10进制公钥转换成16进制字符串的形式,一旦当转换后的字符串长度不足64个字符的时候(极有可能出现的情况),encode函数并不会自动添加前导字符零以确保压缩公钥的长度为64个字符。zfill(64)的作用就是确保公钥为64个字符,不足的话进行补零。 以上演示数据可通过著名的比特币在线地址生成器进行查验:https://www.bitaddress.org

现已推送了一个合并请求(Pull Request)并提供了一段重现此BUG的代码,详细信息: https://github.com/bitcoinbook/bitcoinbook/pull/483"