Как получить доступ к журналу событий, зная адрес контракта (web3)?

Как я могу получить доступ к журналу, хранящемуся в одном из 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 Мне не нужно слушать события в реальном времени. Мне просто нужно получить все журналы контракта на основе фильтров, когда мне это нужно.

Я думаю, что это дубликат ethereum.stackexchange.com/questions/1381/…
этот вопрос требует анализа журналов и предполагает, что вы уже получили квитанцию ​​​​tx, вместо этого я ищу, как я могу получить журналы, зная только адрес контракта, в любом случае спасибо
Извините, немного неправильно понял. Вам понадобится этот ответ, как только вы найдете искомую транзакцию. Ну, я не знаю, как это закодировать, но я знаю, где найти ответ. Исследователи блокчейна имеют эту возможность, и здесь есть несколько примеров с открытым исходным кодом: ethereum.stackexchange.com/questions/404/…
Как нам сделать это в версии 1.0, когда фильтра больше нет?

Ответы (5)

Взгляните на 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».

спасибо за ответ, я не знал о подписи в первой теме, это решило проблему! однако я обнаружил, что вам нужно поставить "0x" перед подписью, поэтому "0x"+web3.sha3('newtest(string,uint256,string,string,uint256)')
последнее, что я искал, как анализировать данные журналов, и нашел полезным предыдущий связанный вопрос ( ethereum.stackexchange.com/questions/1381/… ), но я не могу импортировать скрипт coder.js через require (), потому что я делаю статическая страница, знаете ли вы, как использовать функцию decodeParams с web3?
Рад, что ваша проблема решена, и я обновлю, чтобы включить 0x. Я не особо смотрел на decodeParams, но обычно в web3.js есть тесты, и они могут помочь понять, как можно использовать API.
У меня недостаточно репутации, чтобы оставить комментарий, но ответ @eth сейчас немного устарел. '0x' включен в web3.sha3()настоящее время. var filter = web3.eth.filter({fromBlock:0, toBlock: 'последний', адрес: адрес контракта, 'темы': [web3.sha3('newtest(string,uint256,string,string,uint256)')]} ); filter.watch (функция (ошибка, результат) { ... }) Надеюсь, это поможет.
@plingamp Спасибо! Обновил ответ. (Не уверен, что разрешения позволяют вам щелкнуть «редактировать», и это может быть еще один вариант, который стоит попробовать.)

Используйте .getвместо .watchс web3.eth.filter:

contractAddress = "0x00.."
web3.eth.filter({
  address: contractAddress,
  from: 1,
  to: 'latest'
}).get(function (err, result) {
  // callback code here
})
Я думаю, что этот ответ отвечает на актуальный вопрос о том, как получить события после этого факта без прослушивания в режиме реального времени. .get делает это, а .watch предназначен для прослушивания в режиме реального времени.

В 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)
      }})
Можете ли вы отредактировать свой ответ и объяснить больше, пожалуйста? (Я не понимаю, как это отвечает на вопрос.)
это в web3.js 1.0 - к вашему сведению. Это eth.subscribeфункция
Да, это устарело.
По прошедшим мероприятиям:contractInstance.getPastEvents('allEvents', {fromBlock: 0, toBlock: 'latest'}, function(e,l){console.log(l)})

Да, один из способов — записать все ваши условия в .jsфайл и загрузить этот скрипт на консоль, когда вам нужно.

loadScript-> Загружает файл JavaScript и выполняет его.

пример loadScript

Спасибо за ответ, однако это не то, что я искал, у меня проблемы с получением логов с контрактного адреса через web3
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']]