A JavaScript library for composing Ethereum provider objects using middleware modules.
Switch branches/tags
9xx AddInflightCacheSubprovider FixCacheIdentifier2 FixCacheTests IsomorphicFetch ValidationsSubprovider blockTagRenameTest blockTracker-optional-start contentTypeHeader feature/getaccounts-payload fixFilterIndices getStorageFix greenkeeper/browserify-14.4.0 greenkeeper/browserify-16.2.3 greenkeeper/browserify-pin-16.2.2 greenkeeper/clone-2.1.2 greenkeeper/clone-pin-2.1.1 greenkeeper/cross-fetch-2.2.2 greenkeeper/cross-fetch-pin-2.2.1 greenkeeper/eth-block-tracker-4.0.0 greenkeeper/eth-block-tracker-4.0.1 greenkeeper/eth-block-tracker-4.0.2 greenkeeper/eth-block-tracker-4.0.3 greenkeeper/eth-block-tracker-pin-1.0.11 greenkeeper/eth-sig-util-2.0.0 greenkeeper/eth-sig-util-2.0.1 greenkeeper/eth-sig-util-2.0.2 greenkeeper/eth-sig-util-2.1.0 greenkeeper/ethereumjs-block-2.0.0 greenkeeper/ethereumjs-block-2.0.1 greenkeeper/ethereumjs-tx-1.3.5 greenkeeper/ethereumjs-tx-1.3.6 greenkeeper/ethereumjs-tx-1.3.7 greenkeeper/ethereumjs-tx-pin-1.3.4 greenkeeper/ethereumjs-util-5.1.2 greenkeeper/ethereumjs-util-6.0.0 greenkeeper/ethereumjs-util-pin-5.1.1 greenkeeper/ethereumjs-vm-2.4.0 greenkeeper/ethereumjs-vm-pin-2.3.5 greenkeeper/ethjs-0.4.0 greenkeeper/readable-stream-2.2.10 greenkeeper/readable-stream-3.0.1 greenkeeper/readable-stream-3.0.2 greenkeeper/readable-stream-3.0.3 greenkeeper/readable-stream-3.0.4 greenkeeper/readable-stream-3.0.5 greenkeeper/readable-stream-3.0.6 greenkeeper/semaphore-1.0.5 greenkeeper/solc-0.4.10 greenkeeper/solc-0.4.11 greenkeeper/ws-5.2.2 greenkeeper/ws-6.0.0 greenkeeper/ws-6.1.0 greenkeeper/ws-pin-5.2.1 greenkeeper/xhr-2.4.1 greenkeeper/xhr-pin-2.4.0 hooked-wallet-bubbling master processTransaction-include-payload ukstv/master
Nothing to show
Clone or download
Latest commit 77a3b99 Oct 4, 2018


Web3 ProviderEngine

Greenkeeper badge

Web3 ProviderEngine is a tool for composing your own web3 providers.


Built to be modular - works via a stack of 'sub-providers' which are like normal web3 providers but only handle a subset of rpc methods.

The subproviders can emit new rpc requests in order to handle their own; e.g. eth_call may trigger eth_getAccountBalance, eth_getCode, and others. The provider engine also handles caching of rpc request results.

const ProviderEngine = require('web3-provider-engine')
const CacheSubprovider = require('web3-provider-engine/subproviders/cache.js')
const FixtureSubprovider = require('web3-provider-engine/subproviders/fixture.js')
const FilterSubprovider = require('web3-provider-engine/subproviders/filters.js')
const VmSubprovider = require('web3-provider-engine/subproviders/vm.js')
const HookedWalletSubprovider = require('web3-provider-engine/subproviders/hooked-wallet.js')
const NonceSubprovider = require('web3-provider-engine/subproviders/nonce-tracker.js')
const RpcSubprovider = require('web3-provider-engine/subproviders/rpc.js')

var engine = new ProviderEngine()
var web3 = new Web3(engine)

// static results
engine.addProvider(new FixtureSubprovider({
  web3_clientVersion: 'ProviderEngine/v0.0.0/javascript',
  net_listening: true,
  eth_hashrate: '0x00',
  eth_mining: false,
  eth_syncing: true,

// cache layer
engine.addProvider(new CacheSubprovider())

// filters
engine.addProvider(new FilterSubprovider())

// pending nonce
engine.addProvider(new NonceSubprovider())

// vm
engine.addProvider(new VmSubprovider())

// id mgmt
engine.addProvider(new HookedWalletSubprovider({
  getAccounts: function(cb){ ... },
  approveTransaction: function(cb){ ... },
  signTransaction: function(cb){ ... },

// data source
engine.addProvider(new RpcSubprovider({
  rpcUrl: 'https://testrpc.metamask.io/',

// log new blocks
engine.on('block', function(block){
  console.log('BLOCK CHANGED:', '#'+block.number.toString('hex'), '0x'+block.hash.toString('hex'))

// network connectivity error
engine.on('error', function(err){
  // report connectivity errors

// start polling for blocks

When importing in webpack:

import * as Web3ProviderEngine  from 'web3-provider-engine';
import * as RpcSource  from 'web3-provider-engine/subproviders/rpc';
import * as HookedWalletSubprovider from 'web3-provider-engine/subproviders/hooked-wallet';

Built For Zero-Clients

The Ethereum JSON RPC was not designed to have one node service many clients. However a smaller, lighter subset of the JSON RPC can be used to provide the blockchain data that an Ethereum 'zero-client' node would need to function. We handle as many types of requests locally as possible, and just let data lookups fallback to some data source ( hosted rpc, blockchain api, etc ). Categorically, we don’t want / can’t have the following types of RPC calls go to the network:

  • id mgmt + tx signing (requires private data)
  • filters (requires a stateful data api)
  • vm (expensive, hard to scale)

Change Log

  • default dataProvider for zero is Infura mainnet REST api
  • websocket support
  • subscriptions support
  • remove solc subprovider
  • removed dist from git (but published in npm module)
  • es5 builds in dist/es5
  • zero + ProviderEngine bundles are es5
  • web3 subprovider renamed to provider subprovider
  • error if provider subprovider is missing a proper provider
  • removed need to supply getAccounts hook
  • fixed hooked-wallet-ethtx message signing
  • fixed hooked-wallet default txParams
  • zero.js - replaced http subprovider with fetch provider (includes polyfill for node).
  • renamed HookedWalletSubprovider personalRecoverSigner to recoverPersonalSignature
  • pollingShouldUnref option now defaults to false

Current RPC method support:

  • web3_clientVersion
  • net_version
  • net_listening
  • net_peerCount
  • eth_protocolVersion
  • eth_hashrate
  • eth_mining
  • eth_syncing
  • eth_newBlockFilter
  • eth_newPendingTransactionFilter
  • eth_newFilter
  • eth_uninstallFilter
  • eth_getFilterLogs
  • eth_getFilterChanges
accounts manager
  • eth_call
  • eth_estimateGas
db source
  • db_putString
  • db_getString
  • db_putHex
  • db_getHex
  • eth_getCompilers
  • eth_compileLLL
  • eth_compileSerpent
  • eth_compileSolidity
shh gateway
  • shh_version
  • shh_post
  • shh_newIdentity
  • shh_hasIdentity
  • shh_newGroup
  • shh_addToGroup
data source ( fallback to rpc )
  • eth_gasPrice
  • eth_blockNumber
  • eth_getBalance
  • eth_getBlockByHash
  • eth_getBlockByNumber
  • eth_getBlockTransactionCountByHash
  • eth_getBlockTransactionCountByNumber
  • eth_getCode
  • eth_getStorageAt
  • eth_getTransactionByBlockHashAndIndex
  • eth_getTransactionByBlockNumberAndIndex
  • eth_getTransactionByHash
  • eth_getTransactionCount
  • eth_getTransactionReceipt
  • eth_getUncleByBlockHashAndIndex
  • eth_getUncleByBlockNumberAndIndex
  • eth_getUncleCountByBlockHash
  • eth_getUncleCountByBlockNumber
  • eth_sendRawTransaction
  • eth_getLogs ( not used in web3.js )
( not supported )
  • eth_getWork
  • eth_submitWork
  • eth_submitHashrate ( not used in web3.js )