我正在尝试编写一个比特币地址验证器,我正在尝试使用Python 2和3。
import codecs
from hashlib import sha256
digits58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
def to_bytes(n, length):
s = '%x' % n
s = s.rjust(length*2, '0')
s = codecs.decode(bytes(s, 'UTF-8'), 'hex_codec')
return s
def decode_base58(bc, length):
n = 0
for char in bc:
n = n * 58 + digits58.index(char)
return to_bytes(n, length)
def check_bc(bc):
bcbytes = decode_base58(bc, 25)
return bcbytes[-4:] == sha256(sha256(bcbytes[:-4]).digest()).digest()[:4]
if __name__ == '__main__':
print(check_bc('1111111111111111111114oLvT2'))
此代码应运行并打印True
。相反,它在Python 2中的这一行出错:
s = codecs.decode(bytes(s, 'UTF-8'), 'hex_codec')
错误:
TypeError: str() takes at most 1 argument (2 given)
如果我删除了' UTF-8'部分,它在Python 3中打破了。如果我完全删除对bytes
的调用,则会在Python 3中中断。
答案 0 :(得分:4)
IIUC,您可以直接bytes
来代替encode
:
s = codecs.decode(s.encode("UTF-8"), 'hex_codec')
给出了
dsm@notebook:~/coding$ python2.7 bitcoin.py
True
dsm@notebook:~/coding$ python3.4 bitcoin.py
True