Bitcoin地址转RIPEMD160时缩进错误导致输出文件为空问题咨询
问题修复指南
1. IndentationError报错原因
缩进错误是代码运行失败的核心原因,具体错误位置如下:
dec_to_byte函数内部的return (out)缩进层级错误,放在了while循环内部,循环仅执行一次就会提前返回dec = base58_to_dec(addr)、out = dec_to_byte(dec)两行缩进层级错误,应该和内部函数base58_to_dec、dec_to_byte平级,属于decode函数的顶层逻辑- 最后一行
return (out)多了一层缩进,和decode函数的预期返回层级不匹配
2. RIPEMD160.txt为空的原因
- 你在
with代码块中仅将解码后的结果赋值给了addr变量,完全没有调用i.write()方法将结果写入文件,处理后的数据没有持久化存储自然是空文件 - 读取的地址没有去掉末尾的换行符,直接调用
b58decode_check会解码失败,即使写了写入逻辑也会提前报错终止 - 你自定义的
decode函数全程没有被调用,with块中用的是base58库自带的解码方法,自定义逻辑完全没生效
修复后的可运行代码
如果直接使用base58库的自带方法,简化后代码如下:
import base58 with open('addresses.txt', 'r') as f, open('RIPEMD160.txt', 'a') as i: for addr in f: # 去掉地址首尾的空白符、换行符 addr = addr.strip() if not addr: continue # 解码后取2到末尾的字符就是RIPEMD160哈希 # Python2环境下把.hex()替换为.encode('hex')即可 ripemd160 = base58.b58decode_check(addr).hex()[2:] # 写入文件,加换行分隔不同地址的结果 i.write(ripemd160 + '\n')
如果要使用自定义的decode函数,需要先安装导入mpmath库的mpf方法,同时修正所有缩进错误:
from mpmath import mpf import base58 def decode(addr): b58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' def base58_to_dec(addr): dec = 0 for i in range(len(addr)): dec = int(dec * 58 + b58.index(addr[i])) return dec def dec_to_byte(dec): out = '' while dec != 0: remn = mpf(dec % 256) dec = mpf((dec - remn) / 256) temp = hex(int(remn)) if len(temp) == 3: temp = '0' + temp[-1] else: temp = temp[2:] out = temp + out return out dec = base58_to_dec(addr) out = dec_to_byte(dec) return out with open('addresses.txt', 'r') as f, open('RIPEMD160.txt', 'a') as i: for addr in f: addr = addr.strip() if not addr: continue decoded = decode(addr)[2:] i.write(decoded + '\n')
内容的提问来源于stack exchange,提问作者kamburishka
相关产品推荐
相关产品推荐

