如何用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
相关产品推荐
相关产品推荐

