¿Cómo configurar 'temas' para la función getPastLogs ()?

Señor, quiero leer el registro de eventos pasados ​​usando getPastLogs(), pero obtuve el registro completo. Espero poder filtrar algunos registros. Encuentro que puedo configurar los 'temas' en getPastLogs(), pero siempre falla. ¿Cómo debo configurar los 'temas' en getPastLogs()?

A continuación se muestra mi contrato:

pragma solidity ^0.4.25;
contract ReadLogPOC
{
    uint gi_sum;
    event adduintevent(uint indexed p_data,uint p_sum);    


    function adduint(uint p_1) external returns(uint){
        gi_sum = 10 + p_1;
        emit adduintevent(p_1,gi_sum);
        return gi_sum;
    }
    function getsum() external returns(uint){
        return gi_sum;
    }    
}

Uso Node.js, este código muestra todo el registro de eventos pasado. Mi código es:

var abi = [{"constant":false,"inputs":[{"name":"p_1","type":"uint256"}],"name":"adduint","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"getsum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"p_data","type":"uint256"},{"indexed":false,"name":"p_sum","type":"uint256"}],"name":"adduintevent","type":"event"}];
var address = "0x61fab6aa9f16369e8e051688ceca7e01a61b9780";
var readlogpocContract = new web3.eth.Contract(abi,'0x61fab6aa9f16369e8e051688ceca7e01a61b9780'); 

web3.eth.getPastLogs(
  {
    address: '0x61fab6aa9f16369e8e051688ceca7e01a61b9780',
    fromBlock: "0x1",
    toBlock: "latest"
      }
).then(console.log).catch(e => console.log(e));

Si ejecuto "readlogpoc.adduint.sendTransaction(8,{from: "0x3d626b8fae039078fe5c33964e035c5a9d47b2e9", gas:900000}" en geth, y luego establezco temas como este:

web3.eth.getPastLogs(
  {
    address: '0x61fab6aa9f16369e8e051688ceca7e01a61b9780',
    fromBlock: "0x1",
    toBlock: "latest",
    topics:[web3.utils.sha3("adduintevent(uint,uint)"),web3.utils.sha3("0x8")]
      }
).then(console.log).catch(e => console.log(e));

la salida es []

¿Cómo se deben configurar los temas? Mi entorno: la versión Web3 es ^1.0.0-beta.36 La versión del nodo es v10.5.0 la versión geth es Versión: 1.8.11-stable Plataforma: Ubuntu 16.04.4 LTS

Gracias~~

Respuestas (4)

Alternativamente, puede especificar el nombre de su evento directamente de la siguiente manera:

  contractInstance.getPastEvents('adduintevent', {
                  filter: {yourIndexedParameter: _value},
                  fromBlock: 0,
                  toBlock: 'latest'
              }, (error, events) => { 
                  if (!error){
                   console.log(events)
               }
                })

el problema esta en la linea:

topics:[web3.utils.sha3("adduintevent(uint,uint)"),web3.utils.sha3("0x8")]

debería ser:

topics:[web3.utils.sha3("adduintevent(uint256,uint256)")]

espero que esto ayude

Estos temas pueden mostrar todos los registros de eventos adicionales. Si llamo a la función 'adduint' con el parámetro uint 8. ¿Cómo muestro solo este registro de eventos?
hago una prueba Si los temas son :[web3.utils.sha3("adduntevent(uint256,uint256)")],"0x00000000000000000000000000000000000000000000000000000000000000008"), el resultado es correcto.
¿Cómo convertir uint 8 a "0x000000000000000000000000000000000000000000000000000000000000000008" usando Node.js?
Solo necesita convertir el número 8 a hexadecimal y luego presionarlo para completar una palabra de 32 bytes. Si esta respuesta le ayudó a resolver el problema, acéptela haciendo clic en la marca de verificación.

También tenga en cuenta que deberá ejecutar un nodo de archivo ya que GETH solo mantiene el estado mundial de los últimos 1024 (en caso de una reorganización en cadena) y elimina el resto a menos que su nodo se esté ejecutando en modo de archivo () --gcmode archive.

¡Lo tengo! El ejemplo se muestra a continuación, pero el parámetro de entrada es uint 10:

const Web3 = require('web3');
const ethereumUri = 'http://192.168.2.17:8545';
let web3 = new Web3();
web3.setProvider(new web3.providers.HttpProvider(ethereumUri));

var abi = [{"constant":false,"inputs":[{"name":"p_1","type":"uint256"}],"name":"adduint","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"getsum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"p_data","type":"uint256"},{"indexed":false,"name":"p_sum","type":"uint256"}],"name":"adduintevent","type":"event"}];
var address = "0x61fab6aa9f16369e8e051688ceca7e01a61b9780";
var readlogpocContract = new web3.eth.Contract(abi,'0x61fab6aa9f16369e8e051688ceca7e01a61b9780');  //新版本C要大寫:new web3.eth.Contract

var a = 10
console.log(a); //output :10
var b = web3.utils.toHex(a);  //output :0xa
console.log(b); //output :0xa
var c = web3.utils.padLeft(b, 64);
console.log(c);  //output :0x000000000000000000000000000000000000000000000000000000000000000a
var d = web3.utils.toDecimal(c)
console.log(d); //output :10

web3.eth.getPastLogs(
  {
    address: '0x61fab6aa9f16369e8e051688ceca7e01a61b9780',
    fromBlock: "0x1",
    toBlock: "latest",
    topics:[web3.utils.sha3("adduintevent(uint256,uint256)"),c]   // the second parameter is variable c
   }
).then(console.log).catch(e => console.log(e));