Интеллектуальное событие web3 не запускается - PullRequest
0 голосов
/ 06 мая 2019

Прежде всего, мои настройки.

  • Система: ArchLinux

  • Ганаш: v2.0.0

  • Плотность: 0,5,8

  • web3: 1.0.0-beta.37 (все, что больше 37, контракт не будет развертываться)

  • Узел: 'последний'


Некоторая справочная и контекстная информация

У меня есть простой умный контракт, как показано ниже:

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, и я получаю квитанцию ​​о транзакции.

Однако событие для транзакции никогда не возникает, никогда! Из-за обратных вызовов событий не выдается никаких ошибок.

Почему мое мероприятие никогда не срабатывает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...