Сэр, я хочу прочитать журнал прошлых событий с помощью getPastLogs(), но у меня есть весь журнал. Надеюсь, я смогу отфильтровать какой-нибудь журнал. Я обнаружил, что могу настроить «темы» в getPastLogs(), но это всегда терпит неудачу. Как настроить «темы» в getPastLogs()?
Ниже мой договор:
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;
}
}
Я использую Node.js, этот код показывает весь журнал прошлых событий. Мой код:
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));
Если я запускаю "readlogpoc.adduint.sendTransaction(8,{from: "0x3d626b8fae039078fe5c33964e035c5a9d47b2e9", gas:900000}" в geth, а затем устанавливаю такие темы:
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));
вывод []
Как настроить темы? Моя среда: Версия Web3: ^1.0.0-beta.36 Версия узла: v10.5.0 Версия geth: Версия: 1.8.11-стабильная Платформа: Ubuntu 16.04.4 LTS
Спасибо~~
Кроме того, вы можете указать имя вашего события напрямую следующим образом:
contractInstance.getPastEvents('adduintevent', {
filter: {yourIndexedParameter: _value},
fromBlock: 0,
toBlock: 'latest'
}, (error, events) => {
if (!error){
console.log(events)
}
})
проблемы в строке:
topics:[web3.utils.sha3("adduintevent(uint,uint)"),web3.utils.sha3("0x8")]
должен быть:
topics:[web3.utils.sha3("adduintevent(uint256,uint256)")]
надеюсь это поможет
Также обратите внимание, что вам нужно будет запустить архивный узел, так как GETH сохраняет мировое состояние только за последние 1024 (в случае цепной реорганизации) и обрезает остальную его часть, если только ваш узел не работает в архивном режиме ( ) --gcmode archive
.
Я понял! Пример ниже, но входной параметр 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));
黃智祥
黃智祥
黃智祥
Хайме