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

关于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:26:55