From 9ec666e9694665f4844f1d6441717d37bf006c34 Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 3 Sep 2019 09:44:29 +0200 Subject: [PATCH] fix sending non state changing call --- remix-lib/src/execution/execution-context.js | 18 ++++ remix-lib/src/execution/txRunner.js | 105 ++++++++++--------- 2 files changed, 76 insertions(+), 47 deletions(-) diff --git a/remix-lib/src/execution/execution-context.js b/remix-lib/src/execution/execution-context.js index 3985978c35..e6ff2138ad 100644 --- a/remix-lib/src/execution/execution-context.js +++ b/remix-lib/src/execution/execution-context.js @@ -56,6 +56,24 @@ class StateManagerCommonStorageDump extends StateManager { }) }) } + + getStateRoot (cb) { + let checkpoint = this._checkpointCount + this._checkpointCount = 0 + super.getStateRoot((err, stateRoot) => { + this._checkpointCount = checkpoint + cb(err, stateRoot) + }) + } + + setStateRoot (stateRoot, cb) { + let checkpoint = this._checkpointCount + this._checkpointCount = 0 + super.setStateRoot(stateRoot, (err) => { + this._checkpointCount = checkpoint + cb(err) + }) + } } function createVm (hardfork) { diff --git a/remix-lib/src/execution/txRunner.js b/remix-lib/src/execution/txRunner.js index a8911981b8..6816c60db4 100644 --- a/remix-lib/src/execution/txRunner.js +++ b/remix-lib/src/execution/txRunner.js @@ -101,59 +101,70 @@ class TxRunner { return callback('Invalid account selected') } - var tx = new EthJSTX({ - timestamp: timestamp, - nonce: new BN(account.nonce++), - gasPrice: new BN(1), - gasLimit: gasLimit, - to: to, - value: new BN(value, 10), - data: Buffer.from(data.slice(2), 'hex') - }) - tx.sign(account.privateKey) + executionContext.vm().stateManager.getAccount(Buffer.from(from.replace('0x', ''), 'hex'), (err, res) => { + if (err) { + callback('Account not found') + } else { + var tx = new EthJSTX({ + timestamp: timestamp, + nonce: new BN(res.nonce), + gasPrice: new BN(1), + gasLimit: gasLimit, + to: to, + value: new BN(value, 10), + data: Buffer.from(data.slice(2), 'hex') + }) + tx.sign(account.privateKey) - const coinbases = ['0x0e9281e9c6a0808672eaba6bd1220e144c9bb07a', '0x8945a1288dc78a6d8952a92c77aee6730b414778', '0x94d76e24f818426ae84aa404140e8d5f60e10e7e'] - const difficulties = [new BN('69762765929000', 10), new BN('70762765929000', 10), new BN('71762765929000', 10)] - var block = new EthJSBlock({ - header: { - timestamp: timestamp || (new Date().getTime() / 1000 | 0), - number: self.blockNumber, - coinbase: coinbases[self.blockNumber % coinbases.length], - difficulty: difficulties[self.blockNumber % difficulties.length], - gasLimit: new BN(gasLimit, 10).imuln(2) - }, - transactions: [tx], - uncleHeaders: [] + const coinbases = ['0x0e9281e9c6a0808672eaba6bd1220e144c9bb07a', '0x8945a1288dc78a6d8952a92c77aee6730b414778', '0x94d76e24f818426ae84aa404140e8d5f60e10e7e'] + const difficulties = [new BN('69762765929000', 10), new BN('70762765929000', 10), new BN('71762765929000', 10)] + var block = new EthJSBlock({ + header: { + timestamp: timestamp || (new Date().getTime() / 1000 | 0), + number: self.blockNumber, + coinbase: coinbases[self.blockNumber % coinbases.length], + difficulty: difficulties[self.blockNumber % difficulties.length], + gasLimit: new BN(gasLimit, 10).imuln(2) + }, + transactions: [tx], + uncleHeaders: [] + }) + if (!useCall) { + ++self.blockNumber + this.runBlockInVm(tx, block, callback) + } else { + executionContext.vm().stateManager.checkpoint(() => { + this.runBlockInVm(tx, block, (err, result) => { + executionContext.vm().stateManager.revert(() => { + callback(err, result) + }) + }) + }) + } + } }) - if (!useCall) { - ++self.blockNumber - } else { - executionContext.vm().stateManager.checkpoint(() => { }) - } + } - executionContext.checkpointAndCommit(() => { - executionContext.vm().runBlock({ block: block, generate: true, skipBlockValidation: true, skipBalance: false }, function (err, results) { - err = err ? err.message : err - if (err) { - return callback(err) - } - let result = results.results[0] - if (useCall) { - executionContext.vm().stateManager.revert(function () { }) - } - if (result) { - result.status = '0x' + result.vm.exception.toString(16) - } + runBlockInVm (tx, block, callback) { + executionContext.vm().runBlock({ block: block, generate: true, skipBlockValidation: true, skipBalance: false }, function (err, results) { + err = err ? err.message : err + if (err) { + return callback(err) + } + let result = results.results[0] - executionContext.addBlock(block) - executionContext.trackTx('0x' + tx.hash().toString('hex'), block) + if (result) { + result.status = '0x' + result.vm.exception.toString(16) + } - callback(err, { - result: result, - transactionHash: ethJSUtil.bufferToHex(Buffer.from(tx.hash())) - }) + executionContext.addBlock(block) + executionContext.trackTx('0x' + tx.hash().toString('hex'), block) + + callback(err, { + result: result, + transactionHash: ethJSUtil.bufferToHex(Buffer.from(tx.hash())) }) - }, 1) + }) } runInNode (from, to, data, value, gasLimit, useCall, confirmCb, gasEstimationForceSend, promptCb, callback) {