You need to enable JavaScript to run this app. Django REST View调用Web3合约方法报hex字符串格式错误问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

Django REST View调用Web3合约方法报hex字符串格式错误问题咨询

问题原因及解决方案

核心根因

报错提示中的异常值"'0x6e...32'"外层额外包裹了一层单引号,不符合web3要求的0x开头纯十六进制字符串格式,该问题和你使用Infura还是Etherscan节点没有关联,完全是参数传递过程中的格式异常导致。

触发差异说明

你直接在web3s.py内部调用firstMethod时,传入的是没有多余包裹的纯十六进制字符串,所以校验通过可以正常运行;从Django REST框架视图传入参数时,参数被额外加了一层引号,所以触发报错。常见的参数污染场景包括:

  • 前端传参时误对地址字段做了二次字符串转义,导致多了一层引号
  • 从request.data中取参数时没有做格式清洗,直接将带引号的字符串传入方法
  • 测试接口时在请求参数中手动写了两层引号,比如JSON参数误写为"address": "'0x6e...32'"而非正确的"address": "0x6e...32"
  • DRF序列化器对地址字段的反序列化逻辑异常,自动追加了多余引号

排查与修复方案

  1. 先在方法入口增加参数打印,确认异常参数来源:
def firstMethod(Address1,publicKey,privateKey,GasPrice = default_GasPrice ) :
    # 新增参数校验打印,确认入参格式
    print(f"Address1值:{Address1},类型:{type(Address1)}")
    print(f"publicKey值:{publicKey},类型:{type(publicKey)}")
    print(f"privateKey值:{privateKey},类型:{type(privateKey)}")

    Address1 = web3.toChecksumAddress(Address1) 
    publicKey = web3.toChecksumAddress(publicKey) 
    # 原有逻辑
  1. 确认参数存在多余引号后,增加通用的十六进制字符串清洗逻辑:
def clean_hex_param(raw_str: str) -> str:
    # 去除首尾空白字符、多余的单/双引号
    return raw_str.strip().strip("'").strip('"')

def firstMethod(Address1,publicKey,privateKey,GasPrice = default_GasPrice ) :
    # 先清洗参数再做后续处理
    Address1 = clean_hex_param(Address1)
    publicKey = clean_hex_param(publicKey)
    privateKey = clean_hex_param(privateKey)

    Address1 = web3.toChecksumAddress(Address1) 
    publicKey = web3.toChecksumAddress(publicKey) 
    # 原有逻辑
  1. 同步排查DRF侧的参数传递链路:如果使用了序列化器,检查地址字段的反序列化规则;如果是直接从请求对象取参,确认取参逻辑没有额外转义。

内容的提问来源于stack exchange,提问作者vahidodin moghimi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 11:24:03