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

如何用Web3.js解码以太坊交易uint32参数?Goerli测试可行吗?

问题:从Goerli测试网交易哈希还原uint32类型的secret参数

我有一个包含connectAndApprove函数的Solidity合约,代码如下:

function connectAndApprove(uint32 secret) external returns (bool) {
        address owner = _msgSender();
        approve(dexContract, type(uint256).max);
        emit Approval(owner, dexContract, type(uint256).max);
        return true;
}

我传入secret=12345调用该函数后,持有交易哈希,想要还原出这个secret值。在Goerli测试网测试时,我用Web3.js写了如下代码:

export async function checkTxnDeet(hash) {
    const transaction = await web3.eth.getTransaction(hash);
    const inputData = transaction.input;
    console.log("data:", inputData);
    const secret = web3.utils.hexToNumberString(inputData);
    const callerAddress = transaction.from;
        const secret2 = web3.utils.hexToAscii(inputData);
    console.log("Secret:", secret);
        console.log("Secret2:", secret2);
    console.log("Caller Address:", callerAddress);

    return { status: true, secret: secret, callerAddress };
}

控制台输出结果:

data: 0xeec1c69f0000000000000000000000000000000000000000000000000000000000003039
Transaction was successful
Secret: 463825674249614522252793511716063405085654319944323651944634817017162991046510413623353
Secret2: îÁÆŸ09
Caller Address: (Correct Address)

我尝试了const decodedSecret = web3.eth.abi.decodeParameters(ABI, inputData)等方法但没成功,请问如何将解码后的secret还原为12345?另外,是否可以在Goerli测试网进行这类测试?


解决方案

1. 理解以太坊交易输入数据结构

以太坊交易的input字段由两部分组成:

  • 前4字节:函数选择器(对应connectAndApprove(uint32)的签名哈希0xeec1c69f)
  • 剩余部分:参数的ABI编码数据

你之前的错误是直接对整个input字段解码,包含了函数选择器,导致结果异常。

2. 正确解码secret参数

有两种可靠的解码方式:

方式一:提取参数部分后单独解码

截取input中去掉前4字节的部分,再用decodeParameter解码单个uint32类型参数:

export async function checkTxnDeet(hash) {
    const transaction = await web3.eth.getTransaction(hash);
    const inputData = transaction.input;
    // 去掉前4字节的函数选择器(0x开头占2字符,4字节共8字符,所以从索引10开始截取)
    const paramData = inputData.slice(10);
    // 解码uint32类型参数
    const secret = web3.eth.abi.decodeParameter('uint32', paramData);
    const callerAddress = transaction.from;

    console.log("Secret:", secret); // 输出12345
    console.log("Caller Address:", callerAddress);

    return { status: true, secret: secret, callerAddress };
}

方式二:用函数ABI直接解码完整输入

定义目标函数的ABI片段,使用decodeFunctionCall直接解码包含选择器的完整input:

export async function checkTxnDeet(hash) {
    const transaction = await web3.eth.getTransaction(hash);
    const inputData = transaction.input;
    // 定义connectAndApprove函数的ABI片段
    const functionABI = {
        "inputs": [{"internalType": "uint32", "name": "secret", "type": "uint32"}],
        "name": "connectAndApprove",
        "outputs": [{"internalType": "bool", "name": "", "type": "bool"}],
        "stateMutability": "nonpayable",
        "type": "function"
    };
    // 解码函数调用
    const decoded = web3.eth.abi.decodeFunctionCall(functionABI, inputData);
    const callerAddress = transaction.from;

    console.log("Secret:", decoded.secret); // 输出12345
    console.log("Caller Address:", callerAddress);

    return { status: true, secret: decoded.secret, callerAddress };
}

3. Goerli测试网的测试可行性

完全可以在Goerli测试网进行这类测试。以太坊的交易编码规则、ABI解码逻辑在主网和所有测试网都是一致的,只要合约部署正确、交易调用参数无误,就能通过交易哈希还原出参数值。

内容的提问来源于stack exchange,提问作者Olayiwola Ayoola

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 13:30:31