eth-indexer
v0.1.12
Published
High performance Ethereum smart contract event indexing for fast local retrieval
Downloads
23
Readme
High Performance Ethereum Indexer
Syncs events from Ethereum and indexes them for fast retrieval. This is useful and often essential for production Dapps.
- Support for 6 different persistence stores
- Includes "single-node friendly" stores such as flat-file JSON
- Comprehensive error retry logic when communicating with Ethereum node
- Maximum throughput via JSON RPC using batched parallel fetching
Todo
- [x] Keep track of blockNumbers in persistence for fast-resume
- [x] Benchmark documentation
- [x] Support going forward syncing for Ethereum
- [x] NPM package
- [ ] Improved failsafes for data consistency
- [ ] Split up stores into separate dependencies
Supported Indexing Stores and Benchmarks
The following indexing implementations have been benchmarked on an Ethereum blockchain section with a relatively large number of events (EtherDelta exchange blocks 4800000
- 5002718
) on a single 8-core 2017 Macbook Pro:
|Store Name |Store ID |Events Per Second |Blocks Per Second |
|-------------------|---------------|------------------|------------------|
|Local Memory |memory
|4072.7/s |464.5/s |
|Redis |redis
|2049.55/s |235.25/s |
|Local Flat File |file
|1798.75/s |201.75/s |
|MongoDB |mongodb
|795.5/s |94.6/s |
|Elasticsearch |elasticsearch
|452.25/s |57.1/s |
|LevelDB |level
|207.35/s |26.95/s |
Install Dependencies
yarn install
Testing & Linting
yarn test
yarn lint
Integration tests (requires synced ethereum node at localhost:8545):
yarn test:integration
Example: Sync trading and balance events from decentralized trading contract: EtherDelta
Contract address: https://etherscan.io/address/0x8d12a197cb00d4747a1fe03395095ce2a5cc6819
See examples/etherdelta/sync.js
.
Define which events to index on which keys:
const indexing = {
events: {
Withdraw: {
keys: ['user'],
},
Trade: {
keys: ['tokenGive', 'tokenGet', 'get', 'give'],
},
},
};
Then create a store:
const store = new LevelStore(indexing, '/tmp/etherdelta.db');
Now boot up the indexer:
const indexer = new Indexer(store, EtherdeltaABI, '0x8d12a197cb00d4747a1fe03395095ce2a5cc6819');
await indexer.syncAll({
fromBlock: 4906764,
});
Once indexing is complete events can be retrieved as follows:
const events = await store.get('Withdraw', 'user', '0x13d8d38421eb02973f3f923a71a27917bd483190');
Directory Structure
package.json
- Configure dependenciesdist/*
- Files generated by babelsrc
- All source codesrc/*/__tests__
- Unit testsintegration/__tests__
- Integration tests