You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用返回哈希值的函数时遭遇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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 21:28:12