Как я могу получить доступ к журналу, хранящемуся в одном из tx контракта, через web3?
Пример кода:
event newtest(string indexed name, uint indexed idlevel,string indexed multib, string objmulti, uint objnm);
а также
newtest('test',5,'testj','obj2',30);
Допустим, адрес контракта 0x00. Как мне получить все журналы, которые хранятся на этом адресе контракта с помощью web3?
Ps Мне не нужно слушать события в реальном времени. Мне просто нужно получить все журналы контракта на основе фильтров, когда мне это нужно.
Взгляните на web3.eth.filter и watch
.
Что-то вроде этого:
const filter = web3.eth.filter({
fromBlock: 0,
toBlock: 'latest',
address: contractAddress,
topics: [web3.sha3('newtest(string,uint256,string,string,uint256)')]
})
filter.watch((error, result) => {
//
})
Обратите внимание на ту часть, что «В Solidity: первая тема — это хэш подписи события». Канонические типы, например uint256
, должны использоваться в подписях.
РЕДАКТИРОВАТЬ: комментарий @plingamp web3.sha3
теперь включает «0x».
web3.sha3()
настоящее время. var filter = web3.eth.filter({fromBlock:0, toBlock: 'последний', адрес: адрес контракта, 'темы': [web3.sha3('newtest(string,uint256,string,string,uint256)')]} ); filter.watch (функция (ошибка, результат) { ... }) Надеюсь, это поможет.Используйте .get
вместо .watch
с web3.eth.filter
:
contractAddress = "0x00.."
web3.eth.filter({
address: contractAddress,
from: 1,
to: 'latest'
}).get(function (err, result) {
// callback code here
})
В web3 1.0 вы можете использовать getPastEvents следующим образом
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
функцияcontractInstance.getPastEvents('allEvents', {fromBlock: 0, toBlock: 'latest'}, function(e,l){console.log(l)})
Да, один из способов — записать все ваши условия в .js
файл и загрузить этот скрипт на консоль, когда вам нужно.
loadScript
-> Загружает файл JavaScript и выполняет его.
web3
должно работать. пожалуйста, опубликуйте фрагмент кода, чтобы сообщество помогло вам больше в этом.Если вы хотите отфильтровать несколько событий, вы должны передать список в списке. Для следующих двух событий, генерируемых в контракте Solidity:
event event1(uint256 indexed anumb)
event event2(uint256 indexed anothernumb)
event event3(uint256 indexed yetanothernumb)
Используйте следующее, чтобы отфильтровать только события1 и событие2:
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
})
Из документов :
разделы: Массив строк — массив значений, каждое из которых должно отображаться в записях журнала. Порядок важен, если вы хотите пропустить темы, используйте null, например [null, '0x00...']. Вы также можете передать другой массив для каждой темы с параметрами для этой темы, например [null, ['option1', 'option2']]
Пол С
б1818762
Пол С
Эндрю