Ereignisse mit bestimmten Werten von indizierten Parametern können nicht gefiltert werden

Ich versuche gerade, einen Smart Contract mit dem Trüffelanzug zu testen (mit 'Trüffeltest'). Mein Vertrag besteht aus einem einfachen ERC20-Token, der das Standard-Transfer-Ereignis enthält:

event Transfer(address indexed from, address indexed to, uint256 value);

Unten ist mein Code, der versucht, alle "Transfer"-Ereignisse zu abonnieren, die nur von Konto[0] zu Konto[1] kommen. Obwohl die 2 Parameter als "indiziert" deklariert sind, scheint der Filter nicht zu funktionieren und ich erhalte alle Übertragungsereignisse, unabhängig vom Absender/Empfänger. Ich habe versucht, den Code auf verschiedene Weise zu ändern, aber bisher scheint nichts zu funktionieren

const EnergyToken = artifacts.require("EnergyToken");
const assert = require('assert');
const truffleAssert = require('truffle-assertions');
const { performance } = require('perf_hooks');

contract("Energy Heavy Load Test", async accounts => {
    const numberOfTransactions = 10;
    let startTime = 0;
    let finishTime = 0;
    let subscription;
    let contract;
    let i = 0;

    console.log(web3.version);

    // Function for rounding numbers
    function round(value, precision) {
        var multiplier = Math.pow(10, precision || 0);
        return Math.round(value * multiplier) / multiplier; 
    }

    // executed before each test
    before(async () => {
        contract = await EnergyToken.at("0x5BbD383bD43aC3896B86207eFe88cf0628ad06F0");
    });

    // Test mining time of 2500 transaction calls on the EnergyToken smart contract's transfer() method 
    it("send " + numberOfTransactions + " transactions of 1 EnergyToken from account 0 to account 1", (done) => {
        // contract.Transfer(function(error, event) { 
        //     i++;
        //     console.log(event)
        //     if(i == 1)
        //         startTime = performance.now();

        //     if (i == numberOfTransactions) {
        //         finishTime = performance.now();
        //         console.log("Transactions confirmed!" + " It took " + round((finishTime - startTime)/1000,2) + " seconds to confirm " + numberOfTransactions + " transactions");
        // .       done();
        //     }
        // });

        // contract.getPastEvents('Transfer', {
        //     filter: { from: accounts[0], to: accounts[1] },
        //     fromBlock: 0,
        //     toBlock: 'latest'
        // }, function(error, result) {
        //     if(error) {
        //         console.log(error, 'error');
        //     } else {
        //         console.log(result, 'result');
        //     }
        // });

        for (let j = 0; j < numberOfTransactions; j++) {
            contract.transfer(accounts[0], 1, { from:accounts[1] });
        }
        console.log("Finished sending " + numberOfTransactions + " transactions from account 1!!" + accounts[1] + " to "  + accounts[0]);
    });

    it("Calculate average gas used by the transfer() function", async () => {
        let result = await contract.transfer(accounts[1], 1);  
        let hash = await result.tx;
        let tx = await web3.eth.getTransactionReceipt(hash);
        let gasUsed = await tx.gasUsed;
        console.log(" Gas used for a 'Transfer' transaction: " + gasUsed);
    });

    it("Calculate average gas used by the approve() function", async () => {       
        let result = await contract.approve(accounts[1], 1000);  
        let hash = await result.tx;
        let tx = await web3.eth.getTransactionReceipt(hash);
        let gasUsed = await tx.gasUsed;
        console.log(" Gas used for an 'Approve' transaction: " + gasUsed);
    }); 

    it("Calculate average gas used by the transferFrom() function", async () => {
        await contract.approve(accounts[1], 100, { from: accounts[0] });  
        let result = await contract.transferFrom(accounts[0], accounts[1], 100, { from: accounts[1] });  
        let hash = await result.tx;
        let tx = await web3.eth.getTransactionReceipt(hash);
        let gasUsed = await tx.gasUsed;
        console.log(" Gas used for an 'Approve' transaction: " + gasUsed);
    });
});

Hinweis: Meine Version von web3 ist 1.2.6

Wenn Ihr "web3 is 1.2.6" ist, wie Sie es sagen, dann sollten Sie zumindest anstelle contract.events.Transfervon contract.Transfer. Die Tatsache, dass Ihr Code ausgeführt wird und sogar Ereignisse abruft, führt mich zu der logischen Schlussfolgerung, dass Ihre Web3-Version 0.x ist. Um dies zu überprüfen, führen Sie bitte console.log(web3.version)Ihr Programm aus. Und nachdem Sie dies überprüft haben, lesen Sie bitte die offizielle Dokumentation dieser spezifischen Version. Nebenbemerkung: Wenn Sie Truffle 4.x verwenden, ist das in Ihren Truffle-Tests verwendete web3 0.x.
@goodvibration Danke für die schnelle Antwort. Meine Truffle-Version ist Truffle v5.1.9 und ich habe den Code ausgeführt, um die Web3-Version zu überprüfen - es ist 1.2.1. Ich habe die Dokumentation früher gelesen und es heißt tatsächlich, dass ich contract.events.Transfer verwenden sollte, aber contract.events gibt aus irgendeinem Grund undefiniert zurück. Deshalb habe ich versucht, den Code ein wenig zu ändern und Vertrag zu verwenden. Transfer Ich habe es geschafft, zumindest einige Ereignisse zurückzubekommen. Bisher kein Glück beim Versuch, sie zu filtern.

Antworten (1)

Ich schlage vor, Sie sollten Ihre web3-Version erneut überprüfen, indem Sie das Terminal npm view web3 versionim Stammverzeichnis Ihres Projekts ausführen. Und dann können Sie die Version im Javascript überprüfen, indem Sie console.log(web3.version);. Wenn es wirklich 1.xx ist, sollten Sie die Ereignisse wie folgt filtern können:

contract.getPastEvents('Transfer', {
    filter: {'from': accounts[0], 'to': accounts[1]},
    fromBlock: 0,
    toBlock: 'latest'
}, function(error, result) {
    if(error) {
        console.log(error, 'error');
    } else {
        console.log(result, 'result');
    }
});

Es ist auch kein normales Verhalten, contract.eventsnull für web3 1.xx zurückzugeben. Hier sind die Dokumente , wie web3 1.xx mit Ereignissen umgeht. Wenn das Problem weiterhin auftritt, posten Sie hier Ihren Smart-Contract-Code, damit wir es testen können.

Danke für die Antwort. Wenn ich npm view web3 ausführe, ist die Version 1.2.6. Wenn ich jedoch console.log (web3.version) in meinem Truffle-Testcode verwende, heißt es 1.2.1 (könnte etwas mit Trüffel zu tun haben). Was contract.events betrifft, bin ich mir nicht sicher, warum es undefiniert zurückgibt. Wenn ich EnergyToken.events ausführe, gibt es die Liste der Ereignisse zurück. Wenn ich jedoch die Vertragsinstanz einer Variablen zuweise mit: let contract = await EnergyToken.at("0x5BbD383bD43aC3896B86207eFe88cf0628ad06F0"); dann ist contract.events undefiniert. Laut Dokumentation sollte dies in beiden Versionen funktionieren, da es sich um 1.xx handelt
Bitte hängen Sie Ihr gesamtes Javascript oder zumindest die Logik an, in der Sie die Instanz definieren. Arbeiten Sie auch lokal oder auf einigen der Testnetze?
Ich habe meinen gesamten Testcode hinzugefügt. Die Ereignisfilterung, die ich zu implementieren versuche, sollte in die erste it()-Klausel aufgenommen werden. Und ja, ich betreibe ein privates Netzwerk von Knoten, die Geth und Truffle für Vertragsbereitstellung/Testen verwenden.
Dies ist meine Trüffeltest-JS-Datei => pastebin.com/xAC44PpX . Bitte überprüfen Sie es sorgfältig und passen Sie es Ihrer Logik an. Leider sieht der oben geteilte Code defekt aus. Ich habe mein Beispiel gerade mit web3 1.2.6 getestet und alles lief reibungslos.