使用函数选择器交互合约:区块哈希获取及代码报错求助
问题解答
一、如何获取区块哈希
获取区块哈希可通过ethers.js的Provider对象实现,常见场景如下:
- 获取最新区块的哈希:
const latestBlock = await provider.getBlock('latest'); console.log("最新区块哈希:", latestBlock.hash); - 获取指定区块号的哈希:
const blockNumber = 12345678; // 替换为目标区块号 const targetBlock = await provider.getBlock(blockNumber); console.log("指定区块哈希:", targetBlock.hash);
二、代码错误排查
你遇到的The method eth_sendTransaction does not exist/is not available错误,核心问题是误用了调用方法:
- 问题根源:
wallet.call()会通过签名者发起调用,底层触发的是需要上链的eth_sendTransaction方法,但你的需求是静态调用合约(仅读取数据,无需上链),此时应该用provider.call()——它调用的是只读的eth_callRPC方法,不会触发交易发送。 - 修正后的代码:
require('dotenv').config(); require('events').EventEmitter.defaultMaxListeners = 0 const { ethers } = require('ethers'); // Provider and contract address const provider = new ethers.providers.JsonRpcProvider('https://polygon-mumbai.infura.io/v3/7d803b173d114ba8a1bffafff7ff541a'); const wallet = new ethers.Wallet(process.env.KEY, provider) const contractAddress = '0x57C98f1f2BC34A0054CBc1257fcc9333c1b6730c'; // Function selector const functionSelector = '0x838ad0ee'; // Call the contract const send = async () => { try { // 替换为provider.call()实现静态调用 const result = await provider.call({ to: contractAddress, data: functionSelector }); console.log("Result:", result); } catch (error) { console.error("Error:", error); } } send() - 额外说明:如果你的函数选择器对应链上写操作(需要修改合约状态),则需使用
wallet.sendTransaction()方法,示例如下:const result = await wallet.sendTransaction({ to: contractAddress, data: functionSelector }); await result.wait(); // 等待交易上链确认 console.log("交易哈希:", result.hash);
内容的提问来源于stack exchange,提问作者Osemu Aimiosior
相关产品推荐
相关产品推荐

