A library to turn an unreliable remote source of Expanse blocks into a reliable stream of blocks. Handles block and log removals on chain reorganization and block and log backfills on skipped blocks.
Usage
Full Example
// blockRetention is how many blocks of history to keep in memory. it defaults to 100 if not supplied;//function getBlockByHashCallbackStyle(hash: string, callback: (error?: Error, block?: Block|null) => void): void {// fetch("http://localhost:9656", {// method: "POST",// headers: new Headers({"Content-Type": "application/json"}),// body: { jsonrpc: "2.0", id: 1, method: "eth_getBlockByHash", params: [hash, false] }// })// .then(response => response.json())// .then(block => callback(undefined, block))// .catch(error => callback(error, undefined));//}//function getLogsCallbackStyle(filterOptions: FilterOptions, callback: (error?: Error, logs?: Log[]) => void): void {// return fetch("http://localhost:9656", {// method: "POST",// headers: new Headers({"Content-Type": "application/json"}),// body: { jsonrpc: "2.0", id: 1, method: "eth_getLogs", params: [filterOptions] }// })// .then(response => response.json())// .then(logs => callback(undefined, logs)// .catch(error => callback(error, undefined));//};// const blockAndLogStreamer = BlockAndLogStreamer.createCallbackStyle(getBlockByHashCallbackStyle, getLogsCallbackStyle, configuration);;;;;;blockAndLogStreamer.reconcileNewBlockgetLatestBlock;// you will get a callback for the block and any logs that match the filter heretriggerBlockMining;triggerBlockMining;triggerBlockMining;blockAndLogStreamer.reconcileNewBlockgetLatestBlock;// you will get a callback for all blocks and logs that match the filter that have been added to the chain since the previous call to reconcileNewBlocktriggerChainReorg;blockAndLogStreamer.reconcileNewBlockgetLatestBlock;// you will get a callback for block/log removals that occurred due to the chain re-org, followed by block/log additionsblockAndLogStreamer.unsubscribeFromOnBlockAddedonBlockAddedSubscriptionToken;blockAndLogStreamer.unsubscribeFromOnBlockRemovedonBlockRemovedSubscriptionToken;blockAndLogStreamer.unsubscribeFromOnLogAddedonLogAddedSubscriptionToken;blockAndLogStreamer.unsubscribeFromOnLogRemovedonLogRemovedSubscriptionToken;blockAndLogStreamer.removeLogFilterlogFilterToken;console.logblockAndLogStreamer.getLatestReconciledBlock;
Signatures
Note: if you have a TypeScript aware editor this will all be available in the tooltip
- Filter/FilterOptions - More details at Parity JSON-RPC Wiki
- Block - More details at Parity JSON-RPC Wiki
- Log - More details at Parity JSON-RPC Wiki
Development
Build
docker build -t blockstream .
or
npm run build
Test
docker run blockstream
or
npm run test