Wie richte ich „Themen“ für die Funktion getPastLogs () ein?

Sir, ich möchte das vergangene Ereignisprotokoll mit getPastLogs() lesen, aber ich habe das gesamte Protokoll erhalten. Ich hoffe, ich kann einige Protokolle filtern. Ich finde, ich kann die 'Themen' in getPastLogs() einrichten, aber es schlägt immer fehl. Wie soll ich die „Themen“ in getPastLogs() einrichten?

Nachfolgend mein Vertrag:

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

Ich verwende Node.js, dieser Code zeigt alle vergangenen Ereignisprotokolle. Mein Code ist:

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

Wenn ich "readlogpoc.adduint.sendTransaction(8,{from: "0x3d626b8fae039078fe5c33964e035c5a9d47b2e9", gas:900000}" in Geth ausführe und dann Themen wie diese festlege:

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

die Ausgabe ist []

Wie sollten die Themen aufgestellt werden? Meine Umgebung: Web3-Version ist ^1.0.0-beta.36 Node-Version ist v10.5.0 Geth-Version ist Version: 1.8.11-stable Plattform: Ubuntu 16.04.4 LTS

Danke~~

Antworten (4)

Alternativ können Sie den Namen Ihrer Veranstaltung direkt wie folgt angeben:

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

die probleme liegen in der zeile:

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

es sollte sein:

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

hoffe das hilft

Diese Themen können alle zusätzlichen Ereignisprotokolle anzeigen. Wenn ich die Funktion 'adduint' mit dem Parameter uint 8 aufrufe. Wie zeige ich nur dieses Ereignisprotokoll an?
Ich mache einen Test. Wenn die Themen :[web3.utils.sha3("adduintevent(uint256,uint256)")],"0x0000000000000000000000000000000000000000000000000000000000008") sind, ist das Ergebnis richtig.
Wie konvertiert uint 8 mit Node.js in "0x0000000000000000000000000000000000000000000000000000000000008"?
Sie müssen nur die Zahl 8 in Hex umwandeln und dann mit der linken Seite auffüllen, um ein 32-Byte-Wort zu vervollständigen. Wenn diese Antwort Ihnen geholfen hat, das Problem zu lösen, akzeptieren Sie sie bitte, indem Sie auf das Häkchen klicken.

Beachten Sie auch, dass Sie einen Archivierungsknoten ausführen müssen, da GETH nur den Weltstatus der letzten 1024 (im Falle einer Kettenreorganisation) behält und den Rest davon bereinigt, es sei denn, Ihr Knoten läuft im Archivierungsmodus ( ) --gcmode archive.

Ich habe es! Das Beispiel ist unten, aber der Eingabeparameter ist 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));