Прежде всего, мои настройки.
Некоторая справочная и контекстная информация
У меня есть простой умный контракт, как показано ниже:
pragma solidity ^0.5.7;
contract CommerceChain {
// ------------------------------------------------------
// generic object events
event onNewCategory(uint productId);
// ------------------------------------------------------
// Blockchain variables
address owner;
mapping (uint => Category) categoryMapping;
uint[] categoryIndex;
struct Category {
uint id;
uint name;
uint description;
}
// ------------------------------------------------------
// Function modifier
modifier isOwner(){
require(msg.sender == owner, "You are not the owner");
_;
}
modifier notExistsCategory(uint id) {
require(categoryMapping[id].id != id, "Category already exists");
_;
}
// ------------------------------------------------------
// Default methods
constructor() public payable {
owner = msg.sender;
}
function() external payable {
}
function addCategory(uint id, uint _name, uint _description) public isOwner notExistsCategory(id) {
categoryMapping[id] = Category(id, _name, _description);
categoryIndex.push(id);
emit onNewCategory(id);
}
}
это часть более крупного контракта
1. Для начала я получаю экземпляр контракта по:
const Web3 = require('web3);
const web3 = new Web3(new Web3.providers.WebsocketProvider(_config.provider.url));
//assuming the contract already exists
let contract = new web3.eth.Contract(abi, address, {
data: '0x' + byteCode,
gas: gasLimit,
gasPrice: gasPrice
});
2. затем я подписываюсь на событие контракта по:
(я до сих пор не проверял 3 способа подписки на событие)
Метод 1 из eth event
contract.events.onNewCategory({
fromBlock: 0
},(error, event) => {
if (error) {
console.log(error);
}
if (event) {
console.log(event);
}
}).on('data', (event) => {
console.log(event); // same results as the optional callback above
}).on('changed', (event) => {
console.log(event);
}).on('error', (error) => {
console.error(error);
});
Метод 2 из все события
contract.events.allEvents({
fromBlock: 0
}, (error, event) => {
if (error) {
console.error(error);
}
if (event) {
console.log(event);
}
});
Метод 3 из eth подписок
const web3 = _web3Helper.getWeb3Instance();
let eventName = eventType.toString();
const eventJsonInterface = web3.utils._.find(contract._jsonInterface, o => o.name === eventName && o.type === 'event');
subscribedEvents[eventName] = web3.eth.subscribe('logs', {
address: config.wallet.address
}, (error, result) => {
if (!error) {
const eventObj = web3.eth.abi.decodeLog(eventJsonInterface.inputs, result.data, result.topics.slice(1));
callback(eventObj);
}
}).on("data", (log) => {
console.log(log);
}).on("changed", (log) => {
console.log(log);
});
3. тогда я звоню:
contract.methods.addCategory(1, 2, 3).send({from: walletAddress}, callback)
добавить категорию в контракт.
Проблема:
TL; DR * * тысяча восемьдесят одна
function addCategory(uint id, uint name, uint description);
event onNewCategory(uint id);
Я вижу, что транзакция обрабатывается, в remix.ethereum.org и при тестировании с локальным хостом Ganache RPC, и я получаю квитанцию о транзакции.
Однако событие для транзакции никогда не возникает, никогда! Из-за обратных вызовов событий не выдается никаких ошибок.
Почему мое мероприятие никогда не срабатывает?