Kann ich vergangene Vertragsereignisse über rpc abrufen, wenn ich geth --fast verwende?

Oder mit anderen Worten, werden geth --fastdie Ereignisprotokolle heruntergeladen?

Antworten (1)

Ja. Aber Sie werden das nicht debug.traceTransaction(...)für den Teil der Blockchain bekommen, der schnell synchronisiert wird.

Hier ist die Chaindata-Größe aus meiner schnell synchronisierten Blockchain:

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

Und hier ist die Chaindata-Größe aus meiner nicht schnell synchronisierten Blockchain:

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

Überprüfen, ob ich die Ereignisse aus der schnell synchronisierten Kette abrufen kann, indem ich ein frühes Ereignis zur Erstellung des DAO-Tokens abrufe :

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
...

Aber das debug.traceTransaction(...)schlägt fehl:

> 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
Vielen Dank! Aber wie hängen Ereignisse und debug.traceTransaction() zusammen? Was sind die Folgen für mich, wenn debug.traceTransaction() nicht funktioniert, wenn ich nur Ereignisse abrufen möchte?
Ich habe die debug.traceTransaction(...)Informationen nur hinzugefügt, um zu zeigen, was in Ihren Daten fehlt, wenn Sie eine schnelle Synchronisierung ausführen. Und auch um zu demonstrieren, dass Ereignisse extrahiert werden können, während die debug.traceTransaction(...)für dasselbe Ereignis fehlschlagen – wenn die Daten schnell synchronisiert werden.
Ereignisse, die vor dem --fast sync aufgetreten sind, erfordern, dass der Knoten den betreffenden Block erneut ausführt. Wenn beispielsweise ein Ereignis in Block 100 aufgetreten ist und ich mit --fast syncing in Block 200 beginne, weiß der Knoten, dass das Ereignis in Block 100 aufgetreten ist, kann aber nicht auf die Protokolle zugreifen, bis er Block 100 ausführt. Wenn Sie 50 Ereignisse eingegeben haben 50 Blöcke vor einer schnellen Synchronisierung, die Sie überprüfen müssen, muss der Knoten 50 Blöcke ausführen.
Hallo, ich habe ein ähnliches Ziel: Können Sie raten, wie Sie alle Transfer-Ereignisse in einem bestimmten Block mit json rpc abrufen können? Ich stelle mir vor, ich muss eth_getLogs verwenden, aber ich weiß nicht, was die Parameter wären. Vielen Dank