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:
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 :
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"
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 newObject
mit 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)
});
Sieht so aus, als ob Sie die Version 1.0 von web3 mit der neuen Syntax verwenden ( doc hier )
Wechseln Sie contractInstance.LogNewObject
zucontractInstance.events.LogNewObject
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 .on
als 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);
web3@^1.0
, Sie haben immer noch das event LogNewObject
in Ihrem Smart Contract und Ihr ABI ist das neueste?addNewObject
bitte auch die Argumente hinzufügen? Ich werde vor Ort nachsehen (bitte im Text ;) )"LogNewObject"
? Es steht nicht addNewObject
in meinem Vertrag. wir haben nur function newObject
und event LogNewObject
.newObject
VerzeihungnewObject
Parameter 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.function newObject
meine 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'
}
Fragesteller