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(。
这是我遵循的步骤。也许这对你也有用。
- 安装solc
npm install -g solc
- 编制合同
solcjs --abi contract.sol
。这将在同一文件夹中创建一个contract_sol_contract.abi
文件 - 在
fs.readFileSync()
语句中使用生成的abi文件
您应该检查food3.abi,json文件通常有一个名为abi的属性,这正是这里实际需要的。
const contract = new web3.eth.Contract(CONTRACT_ABI.abi, CONTRACT_ADDRESS);