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

如何用web3.py生成智能合约collectFromTiles所需的v、r、s

使用web3.py生成Polygon链合约签名(v/r/s)步骤大纲
  • 初始化Web3连接
    连接到Polygon网络节点,代码示例:

    from web3 import Web3
    w3 = Web3(Web3.HTTPProvider("你的Polygon节点URL"))
    
  • 定义EIP-712规范的Typed Data结构
    按照合约要求的签名数据格式,构造包含domain、types、value的字典:

    typed_data = {
        "domain": {
            "name": "合约名称",  # 需与合约中EIP712Domain的name一致
            "version": "合约版本",  # 需与合约中EIP712Domain的version一致
            "chainId": 137,  # Polygon主网链ID,测试网根据实际调整
            "verifyingContract": "0x068adc06faff086ee9ef826c0b83e7710e223c3d"  # 目标合约地址
        },
        "types": {
            "CollectFromTilesPermit": [  # 结构体名称需与合约中定义的一致
                {"name": "user", "type": "address"},
                {"name": "nonce", "type": "uint256"}
            ]
        },
        "primaryType": "CollectFromTilesPermit",
        "value": {
            "user": "用户钱包地址",
            "nonce": 0  # 后续从合约获取实际值
        }
    }
    
  • 获取用户当前nonce
    调用合约的nonce方法获取用户对应的nonce值,更新到typed_data的value中:

    contract_address = "0x068adc06faff086ee9ef826c0b83e7710e223c3d"
    contract_abi = [{"constant": True, "inputs": [{"name": "", "type": "address"}], "name": "nonce", "outputs": [{"name": "", "type": "uint256"}], "payable": False, "stateMutability": "view", "type": "function"}]
    contract = w3.eth.contract(address=contract_address, abi=contract_abi)
    user_address = "用户钱包地址"
    typed_data["value"]["nonce"] = contract.functions.nonce(user_address).call()
    
  • 生成签名(v/r/s)
    使用用户私钥对Typed Data进行签名,提取签名组件:

    user_private_key = "用户钱包私钥"
    signed_message = w3.eth.account.sign_typed_data(
        private_key=user_private_key,
        domain=typed_data["domain"],
        types=typed_data["types"],
        message=typed_data["value"]
    )
    # 提取v、r、s
    v = signed_message.v
    r = signed_message.r
    s = signed_message.s
    
  • 签名验证(可选)
    验证生成的签名是否正确,确保后续交易不会因签名失败被合约拒绝:

    recovered_address = w3.eth.account.recover_typed_data(
        domain=typed_data["domain"],
        types=typed_data["types"],
        message=typed_data["value"],
        vrs=(v, r, s)
    )
    assert recovered_address.lower() == user_address.lower(), "签名验证失败"
    

内容的提问来源于stack exchange,提问作者Bui Tuan Huy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:45:42