Package Exports
- ethereumjs-blockstream
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (ethereumjs-blockstream) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
A library to turn an unreliable remote source of Ethereum 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
const configuration = { blockRetention: 100 };
function getBlockByHash(hash: string): Promise<Block|null> {
return fetch("http://localhost:8545", {
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());
}
//function getBlockByHashCallbackStyle(hash: string, callback: (error?: Error, block?: Block|null) => void): void {
// fetch("http://localhost:8545", {
// 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 getLogs(filterOptions: FilterOptions): Promise<Log[]> {
return fetch("http://localhost:8545", {
method: "POST",
headers: new Headers({"Content-Type": "application/json"}),
body: { jsonrpc: "2.0", id: 1, method: "eth_getLogs", params: [filterOptions] }
}).then(response => response.json());
}
//function getLogsCallbackStyle(filterOptions: FilterOptions, callback: (error?: Error, logs?: Log[]) => void): void {
// return fetch("http://localhost:8545", {
// 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));
//}
function getLatestBlock(): Promise<Block> {
return fetch("http://localhost:8545", {
method: "POST",
headers: new Headers({"Content-Type": "application/json"}),
body: { jsonrpc: "2.0", id: 1, method: "eth_getBlockByNumber", params: ["latest", false] }
}).then(response => response.json());
}
const blockAndLogStreamer = new BlockAndLogStreamer(getBlockByHash, getLogs, configuration);
// const blockAndLogStreamer = BlockAndLogStreamer.createCallbackStyle(getBlockByHashCallbackStyle, getLogsCallbackStyle, configuration);
const onBlockAddedSubscriptionToken = blockAndLogStreamer.subscribeToOnBlockAdded(block => console.log(block));
const onLogAddedSubscriptionToken = blockAndLogStreamer.subscribeToOnLogAdded(log => console.log(log));
const onBlockRemovedSubscriptionToken = blockAndLogStreamer.subscribeToOnBlockRemoved(block => console.log(block));
const onLogRemovedSubscriptionToken = blockAndLogStreamer.subscribeToOnLogRemoved(log => console.log(log));
const logFilterToken = blockAndLogStreamer.addLogFilter({address: "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", topics: ["0xbadf00dbadf00dbadf00dbadf00dbadf00dbadf00dbadf00dbadf00dbaadf00d"]});
blockAndLogStreamer.reconcileNewBlock(getLatestBlock());
// you will get a callback for the block and any logs that match the filter here
triggerBlockMining();
triggerBlockMining();
triggerBlockMining();
blockAndLogStreamer.reconcileNewBlock(getLatestBlock());
// 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 reconcileNewBlock
triggerChainReorg();
blockAndLogStreamer.reconcileNewBlock(getLatestBlock());
// you will get a callback for block/log removals that occurred due to the chain re-org, followed by block/log additions
blockAndLogStreamer.unsubscribeFromOnBlockAdded(onBlockAddedSubscriptionToken);
blockAndLogStreamer.unsubscribeFromOnBlockRemoved(onBlockRemovedSubscriptionToken);
blockAndLogStreamer.unsubscribeFromOnLogAdded(onLogAddedSubscriptionToken);
blockAndLogStreamer.unsubscribeFromOnLogRemoved(onLogRemovedSubscriptionToken);
blockAndLogStreamer.removeLogFilter(logFilterToken);
console.log(blockAndLogStreamer.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 buildTest
docker run blockstreamor
npm run test