Смогу ли я получить прошлые контрактные события через rpc, если я использую geth --fast?

Или, другими словами, geth --fastзагрузит журналы событий?

Ответы (1)

Да. Но вы не получите debug.traceTransaction(...)часть блокчейна, которая быстро синхронизируется.

Вот размер цепочки данных из моей быстрой синхронизированной цепочки блоков:

Iota:Ethereum bok$ du -hs chaindata/
 16G    chaindata/

А вот размер цепочки данных из моего небыстро синхронизированного блокчейна:

bok@Rasterbator:~/.ethereum$ du -hs chaindata/
79G     chaindata/

Проверка того, что я могу получить события из цепочки быстрой синхронизации, извлекая раннее событие создания токена DAO :

var theDAOABIFragment = [{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"CreatedToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"}],"name":"Transfer","type":"event"}];
var theDAOAddress = "0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413";
var theDAOStartingBlock = 1428757;
var theDAO = web3.eth.contract(theDAOABIFragment).at(theDAOAddress);
var theDAOCreatedTokenEvent = theDAO.CreatedToken({}, {fromBlock: theDAOStartingBlock, toBlock: theDAOStartingBlock + 2000});
console.log("address\tamount\tto\tblockHash\tblockNumber\tevent\tlogIndex\ttransactionHash\ttransactionIndex");
theDAOCreatedTokenEvent.watch(function(error, result){
  console.log(result.address + "\t" + result.args.amount / 1e16 + "\t" + result.args.to + "\t" +
    result.blockHash + "\t" + result.blockNumber + "\t" + result.event + "\t" + result.logIndex + "\t" +
    result.transactionHash + "\t" + result.transactionIndex);

});

0xbb9bc244d798123fde783fcc1c72d3bb8c189413  3   0xb504e60998c6f354a0794abd91d85e8bc8436211  0x031d5bac6154ca7616ac62e966da2b50a0aaa1b3bc24958ed9cb52d8c8fc1e2f  1429038 CreatedToken    3 0xc96b0f95a1e7e8c07cd488a05f20f9e8d4003fe8eea0ec7f7f4bf199af3198e1    9
0xbb9bc244d798123fde783fcc1c72d3bb8c189413  50  0x53024f875bc85709af41d1c65c01fb4cc92d5c1c  0x48cf967fc94c2f808d82906c1a56e3e09abc99bb8279266fbace13963dc30a1f  1429053 CreatedToken    0 0x1e9ec3974b89653961cbd996d4f6cfc2845db977a3385761b99ed459c2464740    1
0xbb9bc244d798123fde783fcc1c72d3bb8c189413  50  0x2680a6fe5957d177a9279450d2c040818a1949a8  0x40d4235ceb2da6c0288016596d7b55223afd4efce70ba3369e915c0d8a5aa0b1  1429085 CreatedToken     0 0xcea9c261931268d55e695449794bc73a1d614b069051cdd437c1db3d2b31ae0a   0
...

Но debug.traceTransaction(...)терпит неудачу:

> debug.traceTransaction("0xc96b0f95a1e7e8c07cd488a05f20f9e8d4003fe8eea0ec7f7f4bf199af3198e1")
Missing trie node 07e43e11d98fc497ae7b888933c409580e593ecbeeed34865f65a4c2c9f4cd98
    at web3.js:3119:20
    at web3.js:6023:15
    at web3.js:4995:36
    at <anonymous>:1:1
Благодарю вас! Но как связаны события и debug.traceTransaction()? Каковы последствия для меня, если debug.traceTransaction() не работает, если я просто хочу получать события?
Я добавил debug.traceTransaction(...)информацию только для того, чтобы показать, чего не будет в ваших данных при быстрой синхронизации. А также чтобы продемонстрировать, что события могут быть извлечены, в то время как debug.traceTransaction(...)для того же события произойдет сбой - когда данные быстро синхронизируются.
События, произошедшие до синхронизации --fast, потребуют от узла повторного запуска рассматриваемого блока. Например, если событие произошло в 100-м блоке, и я запускаю --fast syncing в 200-м блоке, узел будет знать, что событие произошло в 100-м блоке, но не сможет получить доступ к журналам, пока не запустит 100-й блок. Если у вас 50 событий в 50 блоков перед быстрой синхронизацией нужно проверить, узел должен запустить 50 блоков.
Привет, у меня аналогичная цель: не могли бы вы посоветовать, как получить все события Transfer в данном блоке с помощью json rpc? Я предполагаю, что мне нужно использовать eth_getLogs, но я не знаю, какие будут параметры. Спасибо