Wie greife ich auf das Ereignisprotokoll zu, wenn ich die Vertragsadresse (web3) kenne?

Wie kann ich über web3 auf ein Protokoll zugreifen, das in einem der tx des Vertrags gespeichert ist?

Codebeispiel:

event newtest(string indexed name, uint indexed idlevel,string indexed multib, string objmulti, uint objnm);

und

newtest('test',5,'testj','obj2',30);

Nehmen wir an, die Vertragsadresse ist 0x00. Wie erhalte ich alle Protokolle, die in dieser Vertragsadresse mit web3 gespeichert sind?

Ps Ich muss Ereignisse nicht in Echtzeit abhören. Ich muss nur alle Protokolle eines Vertrags abrufen, basierend auf Filtern, wenn ich sie brauche.

Ich denke, dies ist ein Duplikat von ethereum.stackexchange.com/questions/1381/…
Diese Frage fragt nach dem Parsing von Protokollen und geht davon aus, dass Sie bereits den Empfang des TX haben. Stattdessen schaue ich, wie ich die Protokolle abrufen kann, wenn ich nur die Vertragsadresse kenne. Trotzdem danke
Sorry, etwas missverstanden. Sie benötigen diese Antwort, sobald Sie die gesuchte Transaktion gefunden haben. Nun, ich weiß nicht, wie ich das codieren soll, aber ich weiß, wo ich die Antwort finden kann. Die Blockchain-Explorer haben diese Fähigkeit, und hier gibt es einige Open-Source-Beispiele: ethereum.stackexchange.com/questions/404/…
Wie machen wir das in 1.0, jetzt wo der Filter weg ist?

Antworten (5)

Werfen Sie einen Blick auf web3.eth.filter und watch.

Etwas wie das:

const filter = web3.eth.filter({
  fromBlock: 0,
  toBlock: 'latest',
  address: contractAddress,
  topics: [web3.sha3('newtest(string,uint256,string,string,uint256)')]
})

filter.watch((error, result) => {
   //
})

Beachten Sie den Teil "In Solidity: The first topic is the hash of the signature of the event." Kanonische Typen, wie uint256sie in Signaturen verwendet werden müssen.

BEARBEITEN: Der Kommentar von @plingamp web3.sha3enthält jetzt das '0x'.

danke für die antwort, ich wusste nichts über die signatur zum ersten thema, das hat das problem gelöst! Ich habe jedoch festgestellt, dass Sie "0x" vor die Signatur setzen müssen, also "0x"+web3.sha3('newtest(string,uint256,string,string,uint256)')
Als letztes habe ich nachgesehen, wie Protokolldaten analysiert werden, und fand die zuvor verlinkte Frage nützlich ( ethereum.stackexchange.com/questions/1381/… ), aber ich kann das coder.js-Skript nicht über require() importieren, weil ich es mache eine statische Seite, wissen Sie, wie man die decodeParams-Funktion mit web3 verwendet?
Ich bin froh, dass Ihr Problem gelöst ist, und ich werde aktualisieren, um das 0x einzuschließen. Ich habe mir decodeParams nicht viel angesehen, aber es gibt normalerweise Tests in web3.js und sie können helfen, herauszufinden, wie APIs verwendet werden können.
Ich habe nicht genug Ruf, um einen Kommentar zu hinterlassen, aber die Antwort von @eth ist jetzt etwas veraltet. Das '0x' ist web3.sha3()jetzt enthalten. var filter = web3.eth.filter({fromBlock:0, toBlock: 'latest', address: contractAddress, 'topics':[web3.sha3('newtest(string,uint256,string,string,uint256)')]} ); filter.watch(function(error, result) { ... }) Hoffe das hilft.
@plingamp Danke! Antwort aktualisiert. (Nicht sicher, ob die Berechtigungen es Ihnen erlauben, auf „Bearbeiten“ zu klicken, und es könnte eine andere Option zum Ausprobieren sein.)

Verwenden Sie .getstatt .watchmit web3.eth.filter:

contractAddress = "0x00.."
web3.eth.filter({
  address: contractAddress,
  from: 1,
  to: 'latest'
}).get(function (err, result) {
  // callback code here
})
Ich denke, diese Antwort beantwortet die eigentliche Frage, wie man die Ereignisse danach erhält, ohne in Echtzeit zuzuhören. .get erledigt dies, während .watch zum Zuhören in Echtzeit dient.

In web3 1.0 können Sie getPastEvents wie folgt verwenden

 var contractInstance = new web3.eth.Contract(contractAbi, contractAddress);

  contractInstance.getPastEvents('EventName', {
      filter: {id: id},  
      fromBlock: 0,
      toBlock: 'latest'
  }, (error, events) => { 

      if (!error){
        var obj=JSON.parse(JSON.stringify(events));
        var array = Object.keys(obj)

        console.log("returned values",obj[array[0]].returnValues);

      }
      else {
        console.log(error)
      }})
Können Sie Ihre Antwort bearbeiten und bitte mehr erklären? (Ich sehe nicht, wie dies die Frage beantwortet.)
Dies ist in web3.js 1.0 - zu Ihrer Information. Das ist die eth.subscribeFunktion
Ja, das ist veraltet.
Für vergangene Veranstaltungen:contractInstance.getPastEvents('allEvents', {fromBlock: 0, toBlock: 'latest'}, function(e,l){console.log(l)})

Ja, eine Möglichkeit besteht darin, alle Ihre Bedingungen in eine .jsDatei zu schreiben und diese Skripte bei Bedarf in die Konsole zu laden.

loadScript-> Lädt eine JavaScript-Datei und führt sie aus.

loadScript-Beispiel

Vielen Dank für die Antwort, aber das ist nicht das, wonach ich gesucht habe. Ich habe Probleme, Protokolle von einer Vertragsadresse über Web3 abzurufen
web3soll funktionieren. Bitte posten Sie das Code-Snippet, damit die Community Ihnen dabei weiterhelfen kann.

Wenn Sie nach mehreren Ereignissen filtern möchten, müssen Sie eine Liste innerhalb einer Liste übergeben. Für die folgenden zwei Ereignisse, die in einem Solidity-Vertrag ausgegeben werden:

event event1(uint256 indexed anumb)
event event2(uint256 indexed anothernumb)
event event3(uint256 indexed yetanothernumb)

Verwenden Sie Folgendes, um nur nach events1 und event2 zu filtern:

const filter = web3.eth.filter({
  fromBlock: 0,
  toBlock: 'latest',
  address: contractAddress,
  topics: [[web3.sha3('event1(uint256)'),web3.sha3('event2(uint256)')]]
})

filter.get((error, result) => {
   // gets all prior results
})

Aus den Dokumenten :

Themen: Array of Strings - Ein Array von Werten, die jeweils in den Protokolleinträgen erscheinen müssen. Die Reihenfolge ist wichtig, wenn Sie Themen auslassen möchten, verwenden Sie null, zB [null, '0x00...']. Sie können auch ein anderes Array für jedes Thema mit Optionen für dieses Thema übergeben, z. B. [null, ['option1', 'option2']]