Hyperledger Besu+Hardhat合约部署及调用报错求助
问题1:部署合约时出现 factory runner does not support sending transactions 错误
错误信息
Error: factory runner does not support sending transactions (operation="sendTransaction", code=UNSUPPORTED_OPERATION, version=6.10.0)
at makeError {
code: 'UNSUPPORTED_OPERATION',
operation: 'sendTransaction',
shortMessage: 'factory runner does not support sending transactions'
}
原因
- 默认部署目标为Hardhat内置测试网络,未连接到本地Hyperledger Besu节点
- 未明确指定部署到配置中的
quickstart网络,导致Hardhat使用内置节点的非交易型运行器
解决方案
指定部署网络
执行部署命令时明确指定quickstart网络:npx hardhat run deploy.js --network quickstart验证Besu节点账户可用性
确保hardhat.config.js中配置的私钥对应的账户已在Besu节点中存在(IBFT 2.0网络需账户为验证者或拥有足够权限)。可通过以下命令检查节点账户:// 在Node.js终端中执行 const web3 = new Web3('http://localhost:8545'); web3.eth.getAccounts().then(console.log);确认配置的私钥对应的地址在返回列表中。
兼容部署脚本(可选)
若仍存在问题,可切换为传统的合约工厂部署方式,替换deploy.js内容:const hre = require("hardhat"); async function main() { const FakeNewsValidator = await hre.ethers.getContractFactory("FakeNewsValidator"); const contract = await FakeNewsValidator.deploy(); await contract.waitForDeployment(); console.log("Contract deployed to:", await contract.getAddress()); } main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); });
问题2:Postman调用接口时出现 AbiError: Parameter decoding error 错误
错误信息
Erro ao acessar o contrato: AbiError: Parameter decoding error: Returned values aren't valid, did it run Out of Gas? You might also see this error if you are not using the correct ABI for the contract you are retrieving data from, requesting data from a block number that does not exist, or querying a node which is not fully synced.
原因
服务端代码server.js错误解析了合约返回值:合约getNewsItem函数仅返回单个布尔值,但代码中尝试以数组形式取result[0]、result[1]、result[2],导致ABI解码失败。
解决方案
修改server.js中返回值处理逻辑,匹配合约的返回结构:
// 替换原错误的解析代码 const result = await contract.methods.getNewsItem(newsId).call(); // 正确解析单个布尔返回值 const newsItem = { isFake: result }; console.log('Informações da notícia recebidas:', newsItem); res.json({ newsItem });
额外检查项:
- 确保
server.js中的contractAddress与实际部署的合约地址完全一致 - 确认ABI与合约编译后的ABI完全匹配(当前提供的ABI是正确的)
内容的提问来源于stack exchange,提问作者Rafael Medrado

