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
Ich schlage vor, Sie sollten Ihre web3-Version erneut überprüfen, indem Sie das Terminal npm view web3 version
im 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.events
null 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.
gute Stimmung
contract.events.Transfer
voncontract.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 bitteconsole.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.Aleksi Daskalow