From ce9424af23f1a7b78d8464533359940ed40a27ef Mon Sep 17 00:00:00 2001 From: Iuri Matias Date: Thu, 15 Feb 2018 13:23:34 -0500 Subject: [PATCH] add single execution context --- src/app/debugger/debugger.js | 2 +- src/app/execution/execution-context.js | 4 - src/app/execution/txLogger.js | 2 +- src/execution-context.js | 227 +------------------------ 4 files changed, 4 insertions(+), 231 deletions(-) delete mode 100644 src/app/execution/execution-context.js diff --git a/src/app/debugger/debugger.js b/src/app/debugger/debugger.js index 62029ddc45..1f78525ad6 100644 --- a/src/app/debugger/debugger.js +++ b/src/app/debugger/debugger.js @@ -3,7 +3,7 @@ var remixDebugger = require('remix-debugger') var remixLib = require('remix-lib') var remixCore = require('remix-core') -var executionContext = require('../execution/execution-context') +var executionContext = require('../../execution-context') /** * Manage remix and source highlighting diff --git a/src/app/execution/execution-context.js b/src/app/execution/execution-context.js deleted file mode 100644 index eafad31e9d..0000000000 --- a/src/app/execution/execution-context.js +++ /dev/null @@ -1,4 +0,0 @@ -var remixLib = require('remix-lib') -var executionContext = remixLib.execution.executionContext - -module.exports = executionContext diff --git a/src/app/execution/txLogger.js b/src/app/execution/txLogger.js index 40c39152e2..6e782a7acc 100644 --- a/src/app/execution/txLogger.js +++ b/src/app/execution/txLogger.js @@ -10,7 +10,7 @@ var styles = styleGuide.chooser() var EventManager = remixLib.EventManager var helper = require('../../lib/helper') -var executionContext = require('./execution-context') +var executionContext = require('../../execution-context') var modalDialog = require('../ui/modal-dialog-custom') var typeConversion = require('../../lib/typeConversion') diff --git a/src/execution-context.js b/src/execution-context.js index c4e77bdba6..eafad31e9d 100644 --- a/src/execution-context.js +++ b/src/execution-context.js @@ -1,227 +1,4 @@ -'use strict' - -var Web3 = require('web3') var remixLib = require('remix-lib') -var EventManager = remixLib.EventManager -var EthJSVM = require('ethereumjs-vm') -var ethUtil = require('ethereumjs-util') -var StateManager = require('ethereumjs-vm/lib/stateManager') -var Web3VMProvider = remixLib.vm.Web3VMProvider -var rlp = ethUtil.rlp - -var injectedProvider - -var web3 -if (typeof window.web3 !== 'undefined') { - injectedProvider = window.web3.currentProvider - web3 = new Web3(injectedProvider) -} else { - web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545')) -} - -var blankWeb3 = new Web3() - -/* - extend vm state manager and instanciate VM -*/ - -class StateManagerCommonStorageDump extends StateManager { - constructor (arg) { - super(arg) - this.keyHashes = {} - } - - putContractStorage (address, key, value, cb) { - this.keyHashes[ethUtil.sha3(key).toString('hex')] = ethUtil.bufferToHex(key) - super.putContractStorage(address, key, value, cb) - } - - dumpStorage (address, cb) { - var self = this - this._getStorageTrie(address, function (err, trie) { - if (err) { - return cb(err) - } - var storage = {} - var stream = trie.createReadStream() - stream.on('data', function (val) { - var value = rlp.decode(val.value) - storage['0x' + val.key.toString('hex')] = { - key: self.keyHashes[val.key.toString('hex')], - value: '0x' + value.toString('hex') - } - }) - stream.on('end', function () { - cb(storage) - }) - }) - } -} - -var stateManager = new StateManagerCommonStorageDump({}) -var vm = new EthJSVM({ - enableHomestead: true, - activatePrecompiles: true -}) - -// FIXME: move state manager in EthJSVM ctr -vm.stateManager = stateManager -vm.blockchain = stateManager.blockchain -vm.trie = stateManager.trie -vm.stateManager.checkpoint() - -var web3VM = new Web3VMProvider() -web3VM.setVM(vm) - -var mainNetGenesisHash = '0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3' - -/* - trigger contextChanged, web3EndpointChanged -*/ -function ExecutionContext () { - var self = this - this.event = new EventManager() - - var executionContext = null - - this.init = function (config) { - if (config.get('settings/always-use-vm')) { - executionContext = 'vm' - } else { - executionContext = injectedProvider ? 'injected' : 'vm' - } - } - - this.getProvider = function () { - return executionContext - } - - this.isVM = function () { - return executionContext === 'vm' - } - - this.web3 = function () { - return this.isVM() ? web3VM : web3 - } - - this.detectNetwork = function (callback) { - if (this.isVM()) { - callback(null, { id: '-', name: 'VM' }) - } else { - this.web3().version.getNetwork((err, id) => { - var name = null - if (err) name = 'Unknown' - // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md - else if (id === '1') name = 'Main' - else if (id === '2') name = 'Morden (deprecated)' - else if (id === '3') name = 'Ropsten' - else if (id === '4') name = 'Rinkeby' - else if (id === '42') name = 'Kovan' - else name = 'Custom' - - if (id === '1') { - this.web3().eth.getBlock(0, (error, block) => { - if (error) console.log('cant query first block') - if (block && block.hash !== mainNetGenesisHash) name = 'Custom' - callback(err, { id, name }) - }) - } else { - callback(err, { id, name }) - } - }) - } - } - - this.internalWeb3 = function () { - return web3 - } - - this.blankWeb3 = function () { - return blankWeb3 - } - - this.vm = function () { - return vm - } - - this.setContext = function (context, endPointUrl, confirmCb, infoCb) { - executionContext = context - this.executionContextChange(context, endPointUrl, confirmCb, infoCb) - } - - this.executionContextChange = function (context, endPointUrl, confirmCb, infoCb, cb) { - if (!cb) cb = () => {} - - if (context === 'vm') { - executionContext = context - vm.stateManager.revert(function () { - vm.stateManager.checkpoint() - }) - self.event.trigger('contextChanged', ['vm']) - return cb() - } - - if (context === 'injected') { - if (injectedProvider === undefined) { - var alertMsg = 'No injected Web3 provider found. ' - alertMsg += 'Make sure your provider (e.g. MetaMask) is active and running ' - alertMsg += '(when recently activated you may have to reload the page).' - infoCb(alertMsg) - return cb() - } else { - executionContext = context - web3.setProvider(injectedProvider) - self.event.trigger('contextChanged', ['injected']) - return cb() - } - } - - if (context === 'web3') { - confirmCb(cb) - } - } - - this.currentblockGasLimit = function () { - return this.blockGasLimit - } - - this.blockGasLimitDefault = 4300000 - this.blockGasLimit = this.blockGasLimitDefault - setInterval(() => { - if (this.getProvider() !== 'vm') { - web3.eth.getBlock('latest', (err, block) => { - if (!err) { - // we can't use the blockGasLimit cause the next blocks could have a lower limit : https://github.com/ethereum/remix/issues/506 - this.blockGasLimit = (block && block.gasLimit) ? Math.floor(block.gasLimit - (5 * block.gasLimit) / 1024) : this.blockGasLimitDefault - } else { - this.blockGasLimit = this.blockGasLimitDefault - } - }) - } - }, 15000) - - // TODO: not used here anymore and needs to be moved - function setProviderFromEndpoint (endpoint, context, cb) { - var oldProvider = web3.currentProvider - - if (endpoint === 'ipc') { - web3.setProvider(new web3.providers.IpcProvider()) - } else { - web3.setProvider(new web3.providers.HttpProvider(endpoint)) - } - if (web3.isConnected()) { - executionContext = context - self.event.trigger('contextChanged', ['web3']) - self.event.trigger('web3EndpointChanged') - cb() - } else { - web3.setProvider(oldProvider) - var alertMsg = 'Not possible to connect to the Web3 provider. ' - alertMsg += 'Make sure the provider is running and a connection is open (via IPC or RPC).' - cb(alertMsg) - } - } - this.setProviderFromEndpoint = setProviderFromEndpoint -} +var executionContext = remixLib.execution.executionContext -module.exports = new ExecutionContext() +module.exports = executionContext