Use providerUtils.startProviderEngine to minimize the HACK

This commit is contained in:
Jacob Evans 2019-03-14 14:04:27 +01:00
parent 8272c7a74e
commit f9ef942a98
No known key found for this signature in database
GPG Key ID: 2036DA2ADDFB0842
7 changed files with 41 additions and 21 deletions

View File

@ -1,4 +1,13 @@
[ [
{
"version": "4.1.0",
"changes": [
{
"note": "Run Web3ProviderEngine without excess block polling",
"pr": 1695
}
]
},
{ {
"version": "4.0.0", "version": "4.0.0",
"changes": [ "changes": [

View File

@ -3,7 +3,7 @@ import { providerUtils } from '@0x/utils';
import { ZeroExProvider } from 'ethereum-types'; import { ZeroExProvider } from 'ethereum-types';
import * as _ from 'lodash'; import * as _ from 'lodash';
import { BLOCK_POLLING_INTERVAL_MS, ETHEREUM_NODE_URL_BY_NETWORK } from '../constants'; import { ETHEREUM_NODE_URL_BY_NETWORK } from '../constants';
import { Maybe, Network } from '../types'; import { Maybe, Network } from '../types';
export const providerFactory = { export const providerFactory = {
@ -22,9 +22,7 @@ export const providerFactory = {
return undefined; return undefined;
}, },
getFallbackNoSigningProvider: (network: Network): Web3ProviderEngine => { getFallbackNoSigningProvider: (network: Network): Web3ProviderEngine => {
const providerEngine = new Web3ProviderEngine({ const providerEngine = new Web3ProviderEngine();
pollingInterval: BLOCK_POLLING_INTERVAL_MS,
});
// Intercept calls to `eth_accounts` and always return empty // Intercept calls to `eth_accounts` and always return empty
providerEngine.addProvider(new EmptyWalletSubprovider()); providerEngine.addProvider(new EmptyWalletSubprovider());
// Construct an RPC subprovider, all data based requests will be sent via the RPCSubprovider // Construct an RPC subprovider, all data based requests will be sent via the RPCSubprovider
@ -32,9 +30,7 @@ export const providerFactory = {
const rpcUrl = ETHEREUM_NODE_URL_BY_NETWORK[network]; const rpcUrl = ETHEREUM_NODE_URL_BY_NETWORK[network];
providerEngine.addProvider(new RPCSubprovider(rpcUrl)); providerEngine.addProvider(new RPCSubprovider(rpcUrl));
// Start the Provider Engine // Start the Provider Engine
// HACK: Start the provider without unused block polling providerUtils.startProviderEngine(providerEngine);
// providerEngine.start();
(providerEngine as any)._ready.go();
return providerEngine; return providerEngine;
}, },
}; };

View File

@ -13,6 +13,10 @@
{ {
"note": "Fix race-condition bugs due to async event callbacks modifying shared state", "note": "Fix race-condition bugs due to async event callbacks modifying shared state",
"pr": 1718 "pr": 1718
},
{
"note": "Run Web3ProviderEngine without excess block polling",
"pr": 1695
} }
], ],
"timestamp": 1553091633 "timestamp": 1553091633

View File

@ -1,5 +1,6 @@
import { getContractAddressesForNetworkOrThrow } from '@0x/contract-addresses'; import { getContractAddressesForNetworkOrThrow } from '@0x/contract-addresses';
import { RPCSubprovider, Web3ProviderEngine } from '@0x/subproviders'; import { RPCSubprovider, Web3ProviderEngine } from '@0x/subproviders';
import { providerUtils } from '@0x/utils';
import * as _ from 'lodash'; import * as _ from 'lodash';
import { OrderWatcherWebSocketServer } from './order_watcher/order_watcher_web_socket_server'; import { OrderWatcherWebSocketServer } from './order_watcher/order_watcher_web_socket_server';
@ -11,7 +12,7 @@ const provider = new Web3ProviderEngine();
const jsonRpcUrl = process.env.JSON_RPC_URL || DEFAULT_RPC_URL; const jsonRpcUrl = process.env.JSON_RPC_URL || DEFAULT_RPC_URL;
const rpcSubprovider = new RPCSubprovider(jsonRpcUrl); const rpcSubprovider = new RPCSubprovider(jsonRpcUrl);
provider.addProvider(rpcSubprovider); provider.addProvider(rpcSubprovider);
provider.start(); providerUtils.startProviderEngine(provider);
const networkId = process.env.NETWORK_ID !== undefined ? _.parseInt(process.env.NETWORK_ID) : GANACHE_NETWORK_ID; const networkId = process.env.NETWORK_ID !== undefined ? _.parseInt(process.env.NETWORK_ID) : GANACHE_NETWORK_ID;

View File

@ -1,4 +1,13 @@
[ [
{
"version": "4.3.0",
"changes": [
{
"note": "Added `startProviderEngine` to `providerUtils`. Preventing excess block polling",
"pr": 1695
}
]
},
{ {
"timestamp": 1553091633, "timestamp": 1553091633,
"version": "4.2.3", "version": "4.2.3",

View File

@ -8,6 +8,17 @@ import {
import * as _ from 'lodash'; import * as _ from 'lodash';
export const providerUtils = { export const providerUtils = {
/**
* Starts the Web3ProviderEngine without excess block polling
* @param providerEngine The Web3ProviderEngine
*/
startProviderEngine(providerEngine: any): void {
if (providerEngine.start === undefined) {
throw new Error(`Invalid Web3ProviderEngine`);
}
(providerEngine as any)._ready.go();
(providerEngine as any)._running = true;
},
/** /**
* Standardize the supported provider types into our internal provider interface * Standardize the supported provider types into our internal provider interface
* or throw if unsupported provider supplied. * or throw if unsupported provider supplied.

View File

@ -61,7 +61,6 @@ import { errorReporter } from 'ts/utils/error_reporter';
import { fakeTokenRegistry } from 'ts/utils/fake_token_registry'; import { fakeTokenRegistry } from 'ts/utils/fake_token_registry';
import { tokenAddressOverrides } from 'ts/utils/token_address_overrides'; import { tokenAddressOverrides } from 'ts/utils/token_address_overrides';
import { utils } from 'ts/utils/utils'; import { utils } from 'ts/utils/utils';
import FilterSubprovider from 'web3-provider-engine/subproviders/filters';
import MintableArtifacts from '../contracts/Mintable.json'; import MintableArtifacts from '../contracts/Mintable.json';
@ -120,14 +119,11 @@ export class Blockchain {
}; };
const ledgerSubprovider = new LedgerSubprovider(ledgerWalletConfigs); const ledgerSubprovider = new LedgerSubprovider(ledgerWalletConfigs);
provider.addProvider(ledgerSubprovider); provider.addProvider(ledgerSubprovider);
provider.addProvider(new FilterSubprovider());
const rpcSubproviders = _.map(configs.PUBLIC_NODE_URLS_BY_NETWORK_ID[networkIdIfExists], publicNodeUrl => { const rpcSubproviders = _.map(configs.PUBLIC_NODE_URLS_BY_NETWORK_ID[networkIdIfExists], publicNodeUrl => {
return new RPCSubprovider(publicNodeUrl); return new RPCSubprovider(publicNodeUrl);
}); });
provider.addProvider(new RedundantSubprovider(rpcSubproviders)); provider.addProvider(new RedundantSubprovider(rpcSubproviders));
// HACK: Start the provider without unused block polling providerUtils.startProviderEngine(provider);
// provider.start();
(provider as any)._ready.go();
return [provider, ledgerSubprovider]; return [provider, ledgerSubprovider];
} else if (doesInjectedProviderExist && isPublicNodeAvailableForNetworkId) { } else if (doesInjectedProviderExist && isPublicNodeAvailableForNetworkId) {
// We catch all requests involving a users account and send it to the injectedWeb3 // We catch all requests involving a users account and send it to the injectedWeb3
@ -140,14 +136,11 @@ export class Blockchain {
? new MetamaskSubprovider(injectedProviderIfExists) ? new MetamaskSubprovider(injectedProviderIfExists)
: new SignerSubprovider(injectedProviderIfExists); : new SignerSubprovider(injectedProviderIfExists);
provider.addProvider(signerSubprovider); provider.addProvider(signerSubprovider);
provider.addProvider(new FilterSubprovider());
const rpcSubproviders = _.map(publicNodeUrlsIfExistsForNetworkId, publicNodeUrl => { const rpcSubproviders = _.map(publicNodeUrlsIfExistsForNetworkId, publicNodeUrl => {
return new RPCSubprovider(publicNodeUrl); return new RPCSubprovider(publicNodeUrl);
}); });
provider.addProvider(new RedundantSubprovider(rpcSubproviders)); provider.addProvider(new RedundantSubprovider(rpcSubproviders));
// HACK: Start the provider without unused block polling providerUtils.startProviderEngine(provider);
// provider.start();
(provider as any)._ready.go();
return [provider, undefined]; return [provider, undefined];
} else if (doesInjectedProviderExist) { } else if (doesInjectedProviderExist) {
// Since no public node for this network, all requests go to injectedWeb3 instance // Since no public node for this network, all requests go to injectedWeb3 instance
@ -157,15 +150,12 @@ export class Blockchain {
// We do this so that users can still browse the 0x Portal DApp even if they do not have web3 // We do this so that users can still browse the 0x Portal DApp even if they do not have web3
// injected into their browser. // injected into their browser.
const provider = new Web3ProviderEngine(); const provider = new Web3ProviderEngine();
provider.addProvider(new FilterSubprovider());
const networkId = constants.NETWORK_ID_MAINNET; const networkId = constants.NETWORK_ID_MAINNET;
const rpcSubproviders = _.map(configs.PUBLIC_NODE_URLS_BY_NETWORK_ID[networkId], publicNodeUrl => { const rpcSubproviders = _.map(configs.PUBLIC_NODE_URLS_BY_NETWORK_ID[networkId], publicNodeUrl => {
return new RPCSubprovider(publicNodeUrl); return new RPCSubprovider(publicNodeUrl);
}); });
provider.addProvider(new RedundantSubprovider(rpcSubproviders)); provider.addProvider(new RedundantSubprovider(rpcSubproviders));
// HACK: Start the provider without unused block polling providerUtils.startProviderEngine(provider);
// provider.start();
(provider as any)._ready.go();
return [provider, undefined]; return [provider, undefined];
} }
} }