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.
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 uint256
sie in Signaturen verwendet werden müssen.
BEARBEITEN: Der Kommentar von @plingamp web3.sha3
enthält jetzt das '0x'.
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.Verwenden Sie .get
statt .watch
mit web3.eth.filter
:
contractAddress = "0x00.."
web3.eth.filter({
address: contractAddress,
from: 1,
to: 'latest'
}).get(function (err, result) {
// callback code here
})
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)
}})
eth.subscribe
FunktioncontractInstance.getPastEvents('allEvents', {fromBlock: 0, toBlock: 'latest'}, function(e,l){console.log(l)})
Ja, eine Möglichkeit besteht darin, alle Ihre Bedingungen in eine .js
Datei zu schreiben und diese Skripte bei Bedarf in die Konsole zu laden.
loadScript
-> Lädt eine JavaScript-Datei und führt sie aus.
web3
soll 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']]
Paul S
b1818762
Paul S
Andreas