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

