调用返回哈希值的函数时遭遇AttributeError与UnicodeEncodeError问题排查求助
搞定你的哈希挖矿代码错误
嘿,我来帮你解决遇到的这两个问题,逐个拆解给你看:
先解决当前触发的Unicode编码错误
你现在碰到的UnicodeEncodeError,根源是交易文本里包含了ASCII编码处理不了的字符(比如报错里的\xa3其实是英镑符号£)。你写的SHA256函数用了ascii编码,这玩意儿只能处理0-127范围内的字符,遇到英镑这种超出范围的字符直接就罢工了。
修复超简单,把编码格式换成utf-8就行,它能兼容所有Unicode字符:
def SHA256(text): return sha256(text.encode("utf-8")).hexdigest() # 把ascii替换成utf-8
再说说之前遇到的tuple类型错误
那个AttributeError: 'tuple' object has no attribute 'encode',说白了就是你传给SHA256函数的不是字符串,而是一个元组(tuple)。大概率是这两种情况导致的:
- 你定义
transaction变量时不小心写成了元组,比如多加了个逗号:transaction = ("STUFF HERE",),这就成了元组而非字符串 - 或者之前调用
mine函数时参数传错,导致拼接出来的text变成了元组
排查修复方法:
- 先检查
transaction的定义,确保是纯字符串格式:transaction = "STUFF HERE",别加多余的逗号 - 另外提一句,你现在的
mine函数没有返回值,所以最后newhash会是None,要是需要拿到挖矿结果,记得在函数找到有效哈希后加上return new_hash(或者返回哈希和nonce的组合)
顺便帮你完善挖矿逻辑
现在你的mine函数只是算了一次哈希,根本没实现“挖矿”找符合难度前缀的核心逻辑对吧?我帮你补全一下:
def mine(blockno, transactions, previous_hash, difficulty): prefix = "0" * difficulty # 根据难度生成对应前缀,比如难度3就是"000" nonce = 0 while nonce < MAX_NONCE: # 拼接所有参数为字符串 text = str(blockno) + transactions + previous_hash + str(nonce) new_hash = SHA256(text) # 检查哈希是否符合前缀要求 if new_hash.startswith(prefix): print(f"挖到啦!Nonce值: {nonce}, 哈希值: {new_hash}") return new_hash, nonce nonce += 1 # 如果循环结束都没找到有效哈希,抛出异常提示 raise Exception(f"试了{MAX_NONCE}次都没找到有效哈希,要不调大MAX_NONCE或者降低难度?")
这样运行起来,就能真正根据你设置的难度(比如难度3)找到开头带三个0的有效哈希了。
内容的提问来源于stack exchange,提问作者Compoot
相关产品推荐
相关产品推荐

