From 8eb91e89bf62fd835d5e59bd01ac54e0df7c22ed Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Thu, 17 Nov 2016 14:05:12 -0800 Subject: [PATCH] Increment tx ids to avoid collisions Fixes #791 It was possible for two requests to have the same ID, causing a crash and loss of StreamProvider connection. This new id generation strategy creates a random ID, and increments it for each request. In case the id generator is included from two different processes, I'm initializing the counter at a random number, and rolling it over a large number when it gets too big. --- CHANGELOG.md | 2 ++ app/scripts/lib/idStore.js | 2 +- app/scripts/lib/inpage-provider.js | 11 +---------- app/scripts/lib/random-id.js | 9 +++++++++ 4 files changed, 13 insertions(+), 11 deletions(-) create mode 100644 app/scripts/lib/random-id.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d75538f5..177545214 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Current Master +- Fix bug that would cause MetaMask to occasionally lose its StreamProvider connection and drop requests. + ## 2.13.8 2016-11-16 - Show a warning when a transaction fails during simulation. diff --git a/app/scripts/lib/idStore.js b/app/scripts/lib/idStore.js index 65b8c7029..ccd5efe69 100644 --- a/app/scripts/lib/idStore.js +++ b/app/scripts/lib/idStore.js @@ -7,7 +7,7 @@ const EthQuery = require('eth-query') const KeyStore = require('eth-lightwallet').keystore const clone = require('clone') const extend = require('xtend') -const createId = require('web3-provider-engine/util/random-id') +const createId = require('./random-id') const ethBinToOps = require('eth-bin-to-ops') const autoFaucet = require('./auto-faucet') const messageManager = require('./message-manager') diff --git a/app/scripts/lib/inpage-provider.js b/app/scripts/lib/inpage-provider.js index 052a8f5fe..f1ba2e0ed 100644 --- a/app/scripts/lib/inpage-provider.js +++ b/app/scripts/lib/inpage-provider.js @@ -2,6 +2,7 @@ const Streams = require('mississippi') const StreamProvider = require('web3-stream-provider') const ObjectMultiplex = require('./obj-multiplex') const RemoteStore = require('./remote-store.js').RemoteStore +const createRandomId = require('./random-id') module.exports = MetamaskInpageProvider @@ -119,16 +120,6 @@ function remoteStoreWithLocalStorageCache (storageKey) { return store } -function createRandomId(){ - const extraDigits = 3 - // 13 time digits - const datePart = new Date().getTime() * Math.pow(10, extraDigits) - // 3 random digits - const extraPart = Math.floor(Math.random() * Math.pow(10, extraDigits)) - // 16 digits - return datePart + extraPart -} - function eachJsonMessage(payload, transformFn){ if (Array.isArray(payload)) { return payload.map(transformFn) diff --git a/app/scripts/lib/random-id.js b/app/scripts/lib/random-id.js new file mode 100644 index 000000000..3c5ae5600 --- /dev/null +++ b/app/scripts/lib/random-id.js @@ -0,0 +1,9 @@ +const MAX = 1000000000 + +let idCounter = Math.round( Math.random() * MAX ) +function createRandomId() { + idCounter = idCounter % MAX + return idCounter++ +} + +module.exports = createRandomId