错误:实例化合约对象时必须提供合约的json接口


const Web3 = require('web3');
const web3 = new Web3('http://foodchain-node1.etherhost.org:22001');
const CONTRACT_ADDRESS = "0xA4fafbE0ea4823e262b4916EF93CC5A6306A5DBc";
async function eventQuery(){
'use strict';
var fs = require('fs');
var data = fs.readFileSync('food3.abi', 'utf-8');
//console.log(data);
//console.log(typeof JSON.parse(data).interface)
const CONTRACT_ABI = JSON.parse(data);
const contract = new web3.eth.Contract(CONTRACT_ABI, CONTRACT_ADDRESS);
const START_BLOCK = 7700000;
const END_BLOCK = 7701000;
contract.getPastEvents("FoodSection",
{                               
fromBlock: START_BLOCK,     
toBlock: END_BLOCK     
})                              
.then(events => console.log(events))
.catch((err) => console.error(err));
}
eventQuery();

我创建了这个代码,每次运行它时,它都会返回错误"错误:实例化合约对象时必须提供合约的json接口"我猜这与"food3.abi"文件的json解析有关,但我不知道如何更正。有人能告诉我我的错误是什么以及如何改正吗?

我试着运行您的示例,但没有得到错误,所以您的food3.abi文件可能有问题(例如,如果您从可能错过[]的地方复制粘贴ABI(。

这是我遵循的步骤。也许这对你也有用。

  1. 安装solcnpm install -g solc
  2. 编制合同solcjs --abi contract.sol。这将在同一文件夹中创建一个contract_sol_contract.abi文件
  3. fs.readFileSync()语句中使用生成的abi文件

您应该检查food3.abi,json文件通常有一个名为abi的属性,这正是这里实际需要的。

const contract = new web3.eth.Contract(CONTRACT_ABI.abi, CONTRACT_ADDRESS);

最新更新