Merge pull request #1278 from ethereum/fixNonStateChangingCalls

Fix sending non state changing call
pull/7/head
yann300 5 years ago committed by GitHub
commit 62dd310fb1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 18
      remix-lib/src/execution/execution-context.js
  2. 105
      remix-lib/src/execution/txRunner.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) {

@ -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) {

Loading…
Cancel
Save