Tengo un evento de la siguiente manera:
event LogNewObject(address sender, bytes32 indexed id, bytes32 sub_states_types, bytes32 sub_states_values, address owner);
Y este evento se usa en la siguiente función:
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;
}
Quiero obtener los registros como remix como muestra la siguiente imagen:
Sin embargo, cuando uso el siguiente código para obtener registros de eventos:
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');
}
});
Recibo el siguiente error:
TypeError: contractInstance.LogNewObject no es una función
¿Cómo puedo llamar event LogNewObject
para obtener el resultado, como la salida de registros de remezcla como muestra la imagen de arriba?
NOTA: modifiqué mis comandos de acuerdo con la respuesta del usuario "oktapodia". el primer spep ahora está libre de errores, sin embargo, recibo otro error de la siguiente manera:
> 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
Y si uso el siguiente formato, recibo nuevamente el error anterior:
> 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 :
También usé el comando como usuario "oktapodia" se explica en su respuesta. Sin embargo, recibo un nuevo error de la siguiente manera: "Error de tipo: no se puede leer la propiedad 'LogNewObject' de undefined"
Nota importante: aquí está mi código de contrato inteligente :
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;
}
}
Y para invocar function newObject
usando el siguiente comando:
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)
});
Parece que está utilizando la versión 1.0 de web3 con la nueva sintaxis ( doc aquí )
cambiar contractInstance.LogNewObject
acontractInstance.events.LogNewObject
La respuesta es demasiado larga para agregarla en un solo comentario.
Debido a que lo está ejecutando directamente en su terminal y no desde un archivo, en NodeJS el punto y coma no es obligatorio y su terminal lo interpreta .on
como una nueva línea en un nuevo ámbito y no como una función enlazada contractInstance.events.LogNewObject
, el siguiente ejemplo debería funcionar directamente desde tu terminal, pero no realmente hermoso :)
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
, todavía tiene el event LogNewObject
en su contrato inteligente y su ABI es el último?addNewObject
argumentos, por favor? Voy a verificar localmente (en texto, por favor;))"LogNewObject"
? No está addNewObject
en mi contrato. tenemos solo function newObject
y event LogNewObject
.newObject
Lo sientonewObject
el parámetro? sus parámetros son function newObject(bytes32 _id, uint256 number_of_sub_states, bytes32[10] sub_states_types, bytes32[10] sub_states_values, address _owner)
Gracias.function newObject
a mi pregunta. Espero que esto sea lo que esperas. ¿Piensas cómo obtener una salida como remix
?No puede usar un get como ese con la API web3, de acuerdo con el documento y usar el emisor de eventos o una devolución de llamada:
ejemplo:
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'
}
Preguntador