Как настроить темы для функции getPastLogs()?

Сэр, я хочу прочитать журнал прошлых событий с помощью getPastLogs(), но у меня есть весь журнал. Надеюсь, я смогу отфильтровать какой-нибудь журнал. Я обнаружил, что могу настроить «темы» в getPastLogs(), но это всегда терпит неудачу. Как настроить «темы» в getPastLogs()?

Ниже мой договор:

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

Я использую Node.js, этот код показывает весь журнал прошлых событий. Мой код:

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

Если я запускаю "readlogpoc.adduint.sendTransaction(8,{from: "0x3d626b8fae039078fe5c33964e035c5a9d47b2e9", gas:900000}" в geth, а затем устанавливаю такие темы:

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

вывод []

Как настроить темы? Моя среда: Версия Web3: ^1.0.0-beta.36 Версия узла: v10.5.0 Версия geth: Версия: 1.8.11-стабильная Платформа: Ubuntu 16.04.4 LTS

Спасибо~~

Ответы (4)

Кроме того, вы можете указать имя вашего события напрямую следующим образом:

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

проблемы в строке:

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

должен быть:

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

надеюсь это поможет

В этом разделе могут отображаться все журналы дополнительных событий. Если я вызываю функцию adduint с параметром uint 8. Как показать только этот журнал событий?
Я делаю тест. Если темы: [web3.utils.sha3("adduintevent(uint256,uint256)")],"0x00000000000000000000000000000000000000000000000000000000000000000008"), результат правильный.
Как преобразовать uint 8 в «0x000000000000000000000000000000000000000000000000000000000000000008» с помощью Node.js?
Вам просто нужно преобразовать число 8 в шестнадцатеричное, а затем добавить его влево, чтобы завершить 32-байтовое слово. Если этот ответ помог вам решить проблему, примите его, нажав на галочку.

Также обратите внимание, что вам нужно будет запустить архивный узел, так как GETH сохраняет мировое состояние только за последние 1024 (в случае цепной реорганизации) и обрезает остальную его часть, если только ваш узел не работает в архивном режиме ( ) --gcmode archive.

Я понял! Пример ниже, но входной параметр 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));