Как получить «журналы событий», похожие на «ремикс»?

У меня есть следующее событие:

event LogNewObject(address sender, bytes32 indexed id, bytes32 sub_states_types, bytes32 sub_states_values, address owner);

И это событие используется в следующей функции:

function newObject(bytes32 _id, uint256 number_of_sub_states, bytes32[10] sub_states_types, bytes32[10] sub_states_values, address _owner) public returns(bool success) {
        require(!isObject(_id));

        uint256 counter=0;
        for(counter; counter < number_of_sub_states; counter++) {

            objectStructs[_id].state.sub_state[sub_states_types[counter]] = sub_states_values[counter];

            emit LogNewObject(msg.sender, _id, bytes32(sub_states_types[counter]), bytes32(sub_states_values[counter]), _owner);

        }

        objectStructs[_id].owner = _owner;
        objectStructs[_id].isObject = true;

        objectList.push(_id);

        return true;
    }

Я хочу получить журналы, такие как ремикс , как показано на следующем рисунке:

введите описание изображения здесь

Однако, когда я использую следующий код для получения журналов событий:

var Ev = contractInstance.LogNewObject({}, {fromBlock: 0, toBlock: 'latest'});
       Ev.get((error, events) => {
       if (!error) {
          function ShowResults(event) {
            console.log('sub_states_types: ' + event.args.sub_states_types);
            console.log('sub_states_values: ' + event.args.sub_states_values);
            }
          events.forEach(ShowResults);
        } else {
        console.log('Error');
          }
        });

Я получаю следующую ошибку:

TypeError: contractInstance.LogNewObject не является функцией

Как я могу позвонить event LogNewObject, чтобы получить результат, такой как вывод журналов ремикса , как показано на рисунке выше?

ПРИМЕЧАНИЕ. Я изменил свои команды в соответствии с ответом пользователя «oktapodia». первый spep теперь свободен от ошибок, однако я получаю еще одну ошибку следующим образом:

> var Ev = contractInstance.events.LogNewObject({}, {fromBlock: 0, toBlock: 'latest'});
undefined
>        Ev.events.get((error, events) => {
...        if (!error) {
.....           function ShowResults(event) {
.......             console.log('sub_states_types: ' + event.args.sub_states_types);
.......             console.log('sub_states_values: ' + event.args.sub_states_values);
.......             }
.....           events.forEach(ShowResults);
.....         } else {
.....         console.log('Error');
.....           }
...         });
TypeError: Cannot read property 'get' of undefined

И если я использую следующий формат, я снова получаю предыдущую ошибку:

> var Ev = contractInstance.events.LogNewObject({}, {fromBlock: 0, toBlock: 'latest'});
undefined
>        Ev.get((error, events) => {
...        if (!error) {
.....           function ShowResults(event) {
.......             console.log('sub_states_types: ' + event.args.sub_states_types);
.......             console.log('sub_states_values: ' + event.args.sub_states_values);
.......             }
.....           events.forEach(ShowResults);
.....         } else {
.....         console.log('Error');
.....           }
...         });
TypeError: Ev.get is not a functionI also used the command proposed by user "oktapodia", however I receive this error :

введите описание изображения здесь

Я также использовал команду, как объясняет пользователь «oktapodia» в своем ответе. Однако я получаю новую ошибку следующим образом: «Ошибка типа: невозможно прочитать свойство« LogNewObject »неопределенного»

введите описание изображения здесь

Важное примечание: вот мой код смарт-контракта :

pragma solidity 0.4.23; 

contract RFID {

    struct StateStruct {
        bytes32 description;
        mapping(bytes32 => bytes32) sub_state;
    }

    struct ObjectStruct {
        StateStruct state;
        address owner; 
        bool isObject;
    }

    mapping(bytes32 => ObjectStruct) objectStructs;
    bytes32[] public objectList;

    event LogNewObject(address sender, bytes32 indexed id, bytes32 sub_states_types, bytes32 sub_states_values, address owner);
    event LogChangeObjectState(address sender, bytes32 indexed id, bytes32 sub_states_types, bytes32 sub_states_values);
    event LogChangeObjectOwner(address sender, bytes32 indexed id, address newOwner);

    function isObject(bytes32 _id) public view returns(bool isIndeed) {
        return objectStructs[_id].isObject;
    }

    function getObjectCount() public view returns(uint count) {
        return objectList.length;
    }

    /*function setArraySize(uint256 _number_of_sub_states) public {

        number_of_sub_states = _number_of_sub_states;

    }

    function getArraySize() view public returns (uint256) {
       return number_of_sub_states;
    }*/

    function newObject(bytes32 _id, uint256 number_of_sub_states, bytes32[10] sub_states_types, bytes32[10] sub_states_values, address _owner) public returns(bool success) {
        require(!isObject(_id));

        uint256 counter=0;
        for(counter; counter < number_of_sub_states; counter++) {

            objectStructs[_id].state.sub_state[sub_states_types[counter]] = sub_states_values[counter];

            emit LogNewObject(msg.sender, _id, bytes32(sub_states_types[counter]), bytes32(sub_states_values[counter]), _owner);

        }

        objectStructs[_id].owner = _owner;
        objectStructs[_id].isObject = true;

        objectList.push(_id);

        return true;
    }

    function changeObjectState(bytes32 _id, uint256 number_of_sub_states, bytes32[10] sub_states_types, bytes32[10] sub_states_values) public returns(bool success) {
        require(isObject(_id));
        uint256 counter=0;
        for(counter; counter < number_of_sub_states; counter++) {

            objectStructs[_id].state.sub_state[sub_states_types[counter]] = sub_states_values[counter];

            emit LogChangeObjectState(msg.sender, _id, bytes32(sub_states_types[counter]), bytes32(sub_states_values[counter]));

        }
        //objectStructs[_id].state = StateStruct(_newState);
        //emit LogChangeObjectState(msg.sender, _id, _newState);
        return true;
    }

    function changeObjectOwner(bytes32 _id, address _newOwner) public returns(bool success) {
        require(isObject(_id));
        objectStructs[_id].owner = _newOwner;
        emit LogChangeObjectOwner(msg.sender, _id, _newOwner);
        return true;
    }

}

И для вызова function newObjectс помощью следующей команды:

contractInstance.methods.newObject(web3.utils.asciiToHex("50"),3,[web3.utils.asciiToHex("location"),web3.utils.asciiToHex("price"),web3.utils.asciiToHex("sold"),web3.utils.asciiToHex(""),web3.utils.asciiToHex(""),web3.utils.asciiToHex(""),web3.utils.asciiToHex(""),web3.utils.asciiToHex(""),web3.utils.asciiToHex(""),web3.utils.asciiToHex("")],[web3.utils.asciiToHex("Paris"),web3.utils.asciiToHex("50"),web3.utils.asciiToHex("No"),web3.utils.asciiToHex(""),web3.utils.asciiToHex(""),web3.utils.asciiToHex(""),web3.utils.asciiToHex(""),web3.utils.asciiToHex(""),web3.utils.asciiToHex(""),web3.utils.asciiToHex("")], '0xE07b6e5a2026CC916A4E2Beb03767ae0ED6af773').send({ from: '0xE07b6e5a2026CC916A4E2Beb03767ae0ED6af773' }, function(error, result) {
    console.log(error);
    console.log(result)
});

Ответы (3)

Похоже, вы используете версию 1.0 web3 с новым синтаксисом ( документ здесь )

Изменить contractInstance.LogNewObjectнаcontractInstance.events.LogNewObject

Спасибо. однако я получаю другую ошибку. Я объяснил это в моем вопросе. Спасибо.

Ответ слишком длинный, чтобы добавить его в один комментарий.

Поскольку вы запускаете его непосредственно в своем терминале, а не из файла, в NodeJS точка с запятой не является обязательной, и ваш терминал интерпретирует .onкак новую строку в новой области, а не как функцию, привязанную к contractInstance.events.LogNewObject, следующий пример должен работать непосредственно из ваш терминал, но не очень красивый :)

contractInstance.events.LogNewObject({
  fromBlock: 0,
}, function(error, event){ console.log(event); }).on('data', function(event){
    console.log(event); // same results as the optional callback above
  }).on('changed', function(event){
    // remove event from local database
  }).on('error', console.error);
Я получаю другую ошибку: "TypeError: Невозможно прочитать свойство "LogNewObject" неопределенного". Я поместил его снимок экрана в свой вопрос. Еще раз спасибо.
Вы уверены, что все еще используете web3@^1.0, у вас все еще есть event LogNewObjectсмарт-контракт и ваш ABI является последним?
Да, я получил версию web3, и вот результат: "web3.version '1.0.0-beta.34'". И я также успешно выполняю свой контракт как с ремиксом, так и с командной строкой web3js, я имею в виду, что его abi не изменился.
Вы уверены в случае? или адрес контракта?
Да, я сделал транзакцию прямо сейчас. Вы можете увидеть результат здесь: ibb.co/kDyfM7
Я добавил код своего смарт-контракта в свой вопрос.
Можете ли вы добавить также addNewObjectаргументы, пожалуйста? Я проверю на месте (в тексте, пожалуйста;))
Вы имеете в виду "LogNewObject"? В addNewObjectмоем контракте нет. у нас есть только function newObjectи event LogNewObject.
newObjectизвини
где именно я должен добавить newObjectпараметр? его параметры - function newObject(bytes32 _id, uint256 number_of_sub_states, bytes32[10] sub_states_types, bytes32[10] sub_states_values, address _owner)Спасибо.
Я имею в виду вторую команду, которую вы ввели, ibb.co/kDyfM7 , я не хочу копировать ее самостоятельно, tbh ^^
Я добавил, как вызывать function newObjectк моему вопросу. Я надеюсь, это то, что вы ожидаете. Как вы думаете, как получить вывод, подобный remix?

Вы не можете использовать такой подход с API web3, согласно документу , и использовать эмиттер событий или обратный вызов:

пример:

contractInstance.events.LogNewObject({
    fromBlock: 0,
}, function(error, event){ console.log(event); }) // callback here
.on('data', function(event){
    console.log(event); // same results as the optional callback above
})
.on('changed', function(event){
    // remove event from local database
})
.on('error', console.error);

// event output example
> {
    returnValues: {
        myIndexedParam: 20,
        myOtherIndexedParam: '0x123456789...',
        myNonIndexParam: 'My String'
    },
    raw: {
        data: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385',
        topics: ['0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7', '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385']
    },
    event: 'MyEvent',
    signature: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7',
    logIndex: 0,
    transactionIndex: 0,
    transactionHash: '0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385',
    blockHash: '0xfd43ade1c09fade1c0d57a7af66ab4ead7c2c2eb7b11a91ffdd57a7af66ab4ead7',
    blockNumber: 1234,
    address: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'
}
Спасибо, не могли бы вы рассказать мне, как вы использовали свою команду? потому что, когда я использую вашу команду, я получаю сообщение об ошибке, что я поместил снимок экрана в свой вопрос. Спасибо