关于web3合约query方法params参数格式及Gnosis多签合约交互的技术问询
关于web3.py中Contract.query的params参数格式及Gnosis多签交互示例
嘿,我来帮你把这个问题理清楚~
一、query方法的params参数格式
params本质是一个按顺序排列的参数列表,里面的元素必须和你要调用的合约函数的参数完全对应:
- 如果合约函数是单参数(比如Gnosis的
getConfirmationCount(uint256 txId)),那params就是[tx_id数值]; - 如果是多参数函数,比如某个自定义函数
foo(address recipient, uint256 amount),那params就要写成[目标地址, 金额数值],顺序不能错; - 参数类型要匹配:比如地址要传字符串格式的
0x...,数值传整数或者web3.utils.toWei处理后的数值,不能传字符串类型的数字。
另外提一句:在web3.py里,现在更常用的是contract.functions.[函数名](参数).call()这种封装写法,比直接用query更直观,不过底层逻辑是相通的。
二、Gnosis多签合约交互的完整示例
结合你的需求,查询交易详情和确认次数的代码可以这样写(补全并修正了你的片段):
import json from web3 import Web3 # 初始化Web3连接(记得替换成你的Infura项目ID) contract_address = '0x...' # 你的Gnosis多签合约地址 web3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/your-infura-project-id')) # 加载合约ABI with open('contract.abi', 'r') as abi_file: abi = json.load(abi_file) contract = web3.eth.contract(address=contract_address, abi=abi) # 示例:查询ID为123的交易详情和确认次数 target_tx_id = 123 try: # 1. 查询交易详情:调用Gnosis标准的transactions(uint256)函数 tx_details = contract.functions.transactions(target_tx_id).call() print("交易详情:") print(f"目标地址: {tx_details[0]}") print(f"交易金额: {web3.fromWei(tx_details[1], 'ether')} ETH") print(f"数据: {tx_details[2]}") print(f"执行状态: {'已执行' if tx_details[3] else '未执行'}") # 2. 查询确认次数:调用getConfirmationCount(uint256)函数 confirm_count = contract.functions.getConfirmationCount(target_tx_id).call() print(f"\n该交易已获得 {confirm_count} 次确认") except Exception as e: print(f"查询出错:{str(e)}")
如果一定要用query方法来实现,代码是这样的:
# 使用query方法查询交易详情 tx_details = contract.query( function_name='transactions', params=[target_tx_id], block_identifier='latest' # 可选,指定查询的区块,默认是latest ) # 使用query方法查询确认次数 confirm_count = contract.query( function_name='getConfirmationCount', params=[target_tx_id] )
几个注意点
- 确保你的ABI文件包含
transactions和getConfirmationCount这两个函数(它们是Gnosis多签合约的标准接口,正常情况下会在ABI里); - 交易ID是从0开始的整数,你可以通过调用
getTransactionCount()函数获取合约的总交易数,来确定有效的tx_id范围; - 如果连接主网失败,检查Infura的URL是否正确(必须带项目ID),或者切换到其他节点提供商。
内容的提问来源于stack exchange,提问作者Kvakes
相关产品推荐
相关产品推荐

