Wie bekomme ich "Ereignisprotokolle" ähnlich wie "Remix"?

Ich habe folgende Veranstaltung:

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

Und dieses Ereignis wird in der folgenden Funktion verwendet:

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;
    }

Ich möchte die Protokolle wie einen Remix erhalten , wie das folgende Bild zeigt:

Geben Sie hier die Bildbeschreibung ein

Wenn ich jedoch folgenden Code verwende, um Ereignisprotokolle abzurufen:

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');
          }
        });

Ich erhalte folgenden Fehler:

TypeError: contractInstance.LogNewObject ist keine Funktion

Wie kann ich anrufen event LogNewObject, um das Ergebnis wie die Ausgabe von Remix-Protokollen zu erhalten, wie das obige Bild zeigt?

HINWEIS: Ich habe meine Befehle gemäß der Antwort von Benutzer "oktapodia" geändert. Der erste Spep ist jetzt fehlerfrei, ich erhalte jedoch einen weiteren Fehler wie folgt:

> 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

Und wenn ich das folgende Format verwende, erhalte ich wieder den vorherigen Fehler:

> 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 :

Geben Sie hier die Bildbeschreibung ein

Ich habe den Befehl auch verwendet, da der Benutzer "oktapodia" in seiner Antwort erklärt. Ich erhalte jedoch einen neuen Fehler wie folgt: "TypeError: Cannot read property 'LogNewObject' of undefined"

Geben Sie hier die Bildbeschreibung ein

Wichtiger Hinweis: Hier ist mein Smart Contract Code :

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;
    }

}

Und zum Aufrufen function newObjectmit folgendem Befehl:

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)
});

Antworten (3)

Sieht so aus, als ob Sie die Version 1.0 von web3 mit der neuen Syntax verwenden ( doc hier )

Wechseln Sie contractInstance.LogNewObjectzucontractInstance.events.LogNewObject

Danke schön. Ich erhalte jedoch einen anderen Fehler. Ich habe es in meiner Frage erklärt. Danke.

Die Antwort ist zu lang, um sie in einem einzigen Kommentar hinzuzufügen.

Da Sie es direkt in Ihrem Terminal und nicht aus einer Datei ausführen, ist das Semikolon in NodeJS kein Muss und Ihr Terminal interpretiert das .onals eine neue Zeile in einem neuen Bereich und nicht als eine Funktionsbindung an contractInstance.events.LogNewObject, das folgende Beispiel sollte direkt funktionieren dein Terminal, aber nicht wirklich schön :)

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);
Ich erhalte einen weiteren Fehler: "TypeError: Cannot read property 'LogNewObject' of undefined". Ich habe seinen Screenshot in meine Frage eingefügt. Danke noch einmal.
Sind Sie sicher, dass Sie immer noch verwenden web3@^1.0, Sie haben immer noch das event LogNewObjectin Ihrem Smart Contract und Ihr ABI ist das neueste?
Ja, ich habe die Web3-Version und hier ist die Ausgabe: "web3.version '1.0.0-beta.34'". Und ich führe meinen Vertrag auch erfolgreich mit Remix und Command Line Web3js aus, ich meine, sein abi hat sich nicht geändert.
Bist du dir in dem Fall sicher? oder die Vertragsadresse?
Ja, ich habe gerade eine Transaktion durchgeführt. Sie können das Ergebnis hier sehen: ibb.co/kDyfM7
Ich habe meiner Frage den Code meines Smart Contracts hinzugefügt.
Können Sie addNewObjectbitte auch die Argumente hinzufügen? Ich werde vor Ort nachsehen (bitte im Text ;) )
Meinst du "LogNewObject"? Es steht nicht addNewObjectin meinem Vertrag. wir haben nur function newObjectund event LogNewObject.
newObjectVerzeihung
Wo genau sollte ich newObjectParameter hinzufügen? Seine Parameter sind function newObject(bytes32 _id, uint256 number_of_sub_states, bytes32[10] sub_states_types, bytes32[10] sub_states_values, address _owner)Danke.
Ich meine den zweiten Befehl, den Sie eingegeben haben, ibb.co/kDyfM7. Ich möchte ihn ehrlich gesagt nicht selbst kopieren ^^
Ich habe hinzugefügt, wie ich function newObjectmeine Frage aufrufe. Ich hoffe, das ist, was Sie erwarten. Denken Sie, wie Sie eine Ausgabe wie erhalten remix?

Laut Dokument können Sie mit der web3-API kein solches Get verwenden und den Ereignisemitter oder einen Rückruf verwenden:

Beispiel:

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'
}
Danke, könnten Sie mir bitte mitteilen, wie Sie Ihren Befehl verwendet haben? Denn wenn ich Ihren Befehl verwende, erhalte ich die Fehlermeldung, dass ich seinen Screenshot in meine Frage eingefügt habe. Danke