Skip to content
This repository was archived by the owner on Apr 22, 2024. It is now read-only.

Repository files navigation

Web3 ProviderEngine

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

Caution

This package has been deprecated.

This package was originally created for MetaMask, but has been replaced by @metamask/json-rpc-engine, @metamask/eth-json-rpc-middleware, @metamask/eth-json-rpc-provider, and various other packages.

Here is an example of how to create a provider using those packages:

import{providerFromMiddleware}from'@metamask/eth-json-rpc-provider';import{createFetchMiddleware}from'@metamask/eth-json-rpc-middleware';import{valueToBytes,bytesToBase64}from'@metamask/utils';importfetchfrom'cross-fetch';constrpcUrl='[insert RPC URL here]';constfetchMiddleware=createFetchMiddleware({btoa: (stringToEncode)=>bytesToBase64(valueToBytes(stringToEncode)),
fetch,
rpcUrl,});constprovider=providerFromMiddleware(fetchMiddleware);provider.sendAsync({id: 1,jsonrpc: '2.0',method: 'eth_chainId'},(error,response)=>{if(error){console.error(error);}else{console.log(response.result);}});

This example was written with v12.1.0 of @metamask/eth-json-rpc-middleware, v3.0.1 of @metamask/eth-json-rpc-provider, and v8.4.0 of @metamask/utils.

Composable

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.

constProviderEngine=require('web3-provider-engine')constCacheSubprovider=require('web3-provider-engine/subproviders/cache.js')constFixtureSubprovider=require('web3-provider-engine/subproviders/fixture.js')constFilterSubprovider=require('web3-provider-engine/subproviders/filters.js')constVmSubprovider=require('web3-provider-engine/subproviders/vm.js')constHookedWalletSubprovider=require('web3-provider-engine/subproviders/hooked-wallet.js')constNonceSubprovider=require('web3-provider-engine/subproviders/nonce-tracker.js')constRpcSubprovider=require('web3-provider-engine/subproviders/rpc.js')varengine=newProviderEngine()varweb3=newWeb3(engine)// static resultsengine.addProvider(newFixtureSubprovider({web3_clientVersion: 'ProviderEngine/v0.0.0/javascript',net_listening: true,eth_hashrate: '0x00',eth_mining: false,eth_syncing: true,}))// cache layerengine.addProvider(newCacheSubprovider())// filtersengine.addProvider(newFilterSubprovider())// pending nonceengine.addProvider(newNonceSubprovider())// vmengine.addProvider(newVmSubprovider())// id mgmtengine.addProvider(newHookedWalletSubprovider({getAccounts: function(cb){ ... },approveTransaction: function(cb){ ... },signTransaction: function(cb){ ... },}))// data sourceengine.addProvider(newRpcSubprovider({rpcUrl: 'https://testrpc.metamask.io/',}))// log new blocksengine.on('block',function(block){console.log('================================')console.log('BLOCK CHANGED:','#'+block.number.toString('hex'),'0x'+block.hash.toString('hex'))console.log('================================')})// network connectivity errorengine.on('error',function(err){// report connectivity errorsconsole.error(err.stack)})// start polling for blocksengine.start()

When importing in webpack:

import*asWeb3ProviderEnginefrom'web3-provider-engine';import*asRpcSourcefrom'web3-provider-engine/subproviders/rpc';import*asHookedWalletSubproviderfrom'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)

Running tests

yarn test

About

A JavaScript library for composing Ethereum provider objects using middleware modules

Resources

Code of conduct

Security policy

Stars

601 stars

Watchers

21 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages