У меня есть следующее событие:
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)
});
Похоже, вы используете версию 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);
web3@^1.0
, у вас все еще есть event LogNewObject
смарт-контракт и ваш ABI является последним?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)
Спасибо.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'
}
Спрашивающий