Как получить доступ к журналу событий, зная адрес контракта (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?

P.s. Мне не нужно слушать события в режиме реального времени. Мне просто нужно получить все протоколы контракта, основанные на фильтрах, когда мне это нужно.

23 голоса | спросил b1818762 13 MaramSun, 13 Mar 2016 00:10:18 +03002016-03-13T00:10:18+03:0012 2016, 00:10:18

5 ответов


25

Посмотрите web3.eth.filter и смотреть.

Что-то вроде этого:

watch

Обратите внимание на ту часть, что «In Solidity: первая тема - хэш сигнатуры события». Канонические типы, такие как const filter = web3.eth.filter({ fromBlock: 0, toBlock: 'latest', address: contractAddress, topics: [web3.sha3('newtest(string,uint256,string,string,uint256)')] }) filter.watch((error, result) => { // }) , должны использоваться в подписях.

РЕДАКТИРОВАТЬ: комментарий пользователя @ plingamp uint256 теперь включает в себя '0x'.

ответил eth 13 MarpmSun, 13 Mar 2016 19:15:17 +03002016-03-13T19:15:17+03:0007 2016, 19:15:17
9

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

contractAddress = "0x00.."
web3.eth.filter({
  address: contractAddress
  from: 1,
  to: 'latest'
}).get(function (err, result) {
  // callback code here
})
ответил k26dr 18 MaramSat, 18 Mar 2017 02:36:33 +03002017-03-18T02:36:33+03:0002 2017, 02:36:33
4

Вы можете использовать журналы, сгенерированные событиями (активируются вашими контрактными функциями). Как уже упоминалось в предыдущем ответе, вы можете определить фильтр, а затем применить filter.watch(), чтобы получить требуемые данные журнала, или, альтернативно, с помощью подписки (web 1.0).

var sub = web3.eth.subscribe('logs',options); // for example options = {address: '0x123456..',    topics: ['0x12345...']}

//wait for changes

sub.on('data',function(result){
console.log(result);

});

Вы также можете изучить promiseEvents.

NB: подписка основана на сокетах, поэтому, если соединение закрыто, подписка теряется.

ответил Badr Bellaj 16 AM00000010000001331 2016, 01:47:13
2

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

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

пример loadScript

ответил niksmac 13 MaramSun, 13 Mar 2016 04:44:29 +03002016-03-13T04:44:29+03:0004 2016, 04:44:29
0

Если вам нужно фильтровать несколько событий, вы должны передать список в списке. Для следующих двух событий, испущенных в контракте Solidity:

event event1(uint256 indexed anumb)
event event2(uint256 indexed anothernumb)
event event3(uint256 indexed yetanothernumb)

Используйте для фильтрации только событий1 и event2 только:

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
})

Из docs :

  

themes: Array of Strings - массив значений, каждый из которых должен появляться   в записи журнала. Порядок важен, если вы хотите уйти   темы используют нуль, например. [null, '0x00 ...']. Вы также можете передать другой   массив для каждой темы с параметрами для этой темы, например. [ноль,   ['option1', 'option2']]

ответил atomh33ls 21 J000000Saturday18 2018, 00:44:05

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132