pull/7/head
yann300 9 years ago
parent b9cac79586
commit 0d9b667e1b
  1. 4
      package.json
  2. 8
      src/code/codeManager.js
  3. 0
      src/code/codeResolver.js
  4. 0
      src/code/codeUtils.js
  5. 0
      src/code/opcodes.js
  6. 4
      src/debugger.js
  7. 0
      src/helpers/global.js
  8. 19
      src/helpers/init.js
  9. 0
      src/helpers/traceHelper.js
  10. 35
      src/helpers/ui.js
  11. 20
      src/index.js
  12. 0
      src/lib/eventManager.js
  13. 36
      src/memoryPanel.js
  14. 22
      src/trace/traceAnalyser.js
  15. 0
      src/trace/traceCache.js
  16. 14
      src/trace/traceManager.js
  17. 5
      src/trace/traceRetriever.js
  18. 6
      src/trace/traceStepManager.js
  19. 4
      src/txBrowser.js
  20. 0
      src/util/web3Admin.js
  21. 12
      test/index.js

@ -21,13 +21,15 @@
"devDependencies": { "devDependencies": {
"babel-preset-react": "^6.5.0", "babel-preset-react": "^6.5.0",
"babelify": "^7.2.0", "babelify": "^7.2.0",
"mocha": "^2.5.3",
"should": "^9.0.2",
"standard": "^7.0.1", "standard": "^7.0.1",
"standard-reporter": "^1.0.5" "standard-reporter": "^1.0.5"
}, },
"scripts": { "scripts": {
"start_node": "eth --rpccorsdomain \"*\" -j -v 0", "start_node": "eth --rpccorsdomain \"*\" -j -v 0",
"build": "mkdir -p build; browserify -t [ babelify --presets [ react ] ] src/index.js -o build/app.js", "build": "mkdir -p build; browserify -t [ babelify --presets [ react ] ] src/index.js -o build/app.js",
"test" : "standard" "test": "standard && mocha"
}, },
"repository": { "repository": {
"type": "git", "type": "git",

@ -1,8 +1,8 @@
'use strict' 'use strict'
var traceManagerUtil = require('./traceManagerUtil') var traceHelper = require('../helpers/traceHelper')
var codeResolver = require('./codeResolver') var codeResolver = require('./codeResolver')
var util = require('./util') var util = require('../helpers/global')
var EventManager = require('./eventManager') var EventManager = require('../lib/eventManager')
/* /*
resolve contract code referenced by vmtrace in order to be used by asm listview. resolve contract code referenced by vmtrace in order to be used by asm listview.
@ -42,7 +42,7 @@ CodeManager.prototype.resolveStep = function (stepIndex, tx) {
CodeManager.prototype.ensureCodeLoaded = function (address, currentStep, tx) { CodeManager.prototype.ensureCodeLoaded = function (address, currentStep, tx) {
var self = this var self = this
if (address !== this.currentAddress) { if (address !== this.currentAddress) {
if (traceManagerUtil.isContractCreation(address)) { if (traceHelper.isContractCreation(address)) {
this.traceManager.getContractCreationCode(address, function (error, hexCode) { this.traceManager.getContractCreationCode(address, function (error, hexCode) {
// contract creation // contract creation
if (error) { if (error) {

@ -4,8 +4,8 @@ var TxBrowser = require('./txBrowser')
var StepManager = require('./stepManager') var StepManager = require('./stepManager')
var VmDebugger = require('./vmDebugger') var VmDebugger = require('./vmDebugger')
var style = require('./basicStyles') var style = require('./basicStyles')
var util = require('./util') var util = require('./helpers/global')
var EventManager = require('./eventManager') var EventManager = require('./lib/eventManager')
module.exports = React.createClass({ module.exports = React.createClass({
ethDebuggerSelectedItem: -1, ethDebuggerSelectedItem: -1,

@ -0,0 +1,19 @@
'use strict'
var Web3 = require('web3')
var Web3Admin = require('../util/web3Admin')
var TraceManager = require('../trace/traceManager')
var CodeManager = require('../code/codeManager')
module.exports = {
loadContext: function () {
var web3 = new Web3()
web3.setProvider(new web3.providers.HttpProvider('http://localhost:8545'))
Web3Admin.extend(web3)
var traceManager = new TraceManager(web3)
return {
web3: web3,
traceManager: traceManager,
codeManager: new CodeManager(web3, traceManager)
}
}
}

@ -0,0 +1,35 @@
'use strict'
module.exports = {
formatMemory: function (mem, width) {
var ret = ''
if (!mem) {
return ret
}
if (!mem.substr) {
mem = mem.join('') // geth returns an array, eth return raw string
}
for (var k = 0; k < mem.length; k += (width * 2)) {
var memory = mem.substr(k, width * 2)
var content = this.tryConvertAsciiFormat(memory)
ret += '0x' + k.toString(16) + ' ' + content.raw + ' ' + content.ascii + '\n'
}
return ret
},
tryConvertAsciiFormat: function (memorySlot) {
var ret = { ascii: '', raw: '' }
for (var k = 0; k < memorySlot.length; k += 2) {
var raw = memorySlot.substr(k, 2)
var ascii = String.fromCharCode(parseInt(raw, 16))
ascii = ascii.replace(/\W/g, '?')
if (ascii === '') {
ascii = '?'
}
ret.ascii += ascii
ret.raw += ' ' + raw
}
return ret
}
}

@ -1,26 +1,10 @@
'use strict' 'use strict'
var ReactDOM = require('react-dom') var ReactDOM = require('react-dom')
var React = require('react') var React = require('react')
var Web3 = require('web3') var util = require('./helpers/init')
var Web3Admin = require('./web3Admin')
var TraceManager = require('./traceManager')
var CodeManager = require('./codeManager')
function loadContext () {
var web3 = new Web3()
web3.setProvider(new web3.providers.HttpProvider('http://localhost:8545'))
Web3Admin.extend(web3)
var traceManager = new TraceManager(web3)
return {
web3: web3,
traceManager: traceManager,
codeManager: new CodeManager(web3, traceManager)
}
}
var Debugger = require('./debugger') var Debugger = require('./debugger')
ReactDOM.render( ReactDOM.render(
<Debugger context={loadContext()} />, <Debugger context={util.loadContext()} />,
document.getElementById('app') document.getElementById('app')
) )

@ -1,6 +1,7 @@
'use strict' 'use strict'
var React = require('react') var React = require('react')
var BasicPanel = require('./basicPanel') var BasicPanel = require('./basicPanel')
var util = require('./helpers/ui')
module.exports = React.createClass({ module.exports = React.createClass({
contextTypes: { contextTypes: {
@ -33,43 +34,10 @@ module.exports = React.createClass({
console.log(error) console.log(error)
} else if (self.context.root.ethDebuggerSelectedItem === index) { } else if (self.context.root.ethDebuggerSelectedItem === index) {
self.setState({ self.setState({
data: self.formatMemory(memory, 16) data: util.formatMemory(memory, 16)
}) })
} }
}) })
}) })
},
formatMemory: function (mem, width) {
var ret = ''
if (!mem) {
return ret
}
if (!mem.substr) {
mem = mem.join('') // geth returns an array, eth return raw string
}
for (var k = 0; k < mem.length; k += (width * 2)) {
var memory = mem.substr(k, width * 2)
var content = this.tryAsciiFormat(memory)
ret += this.context.web3.toHex(k) + ' ' + content.raw + ' ' + content.ascii + '\n'
}
return ret
},
tryAsciiFormat: function (memorySlot) {
var ret = { ascii: '', raw: '' }
for (var k = 0; k < memorySlot.length; k += 2) {
var raw = memorySlot.substr(k, 2)
var ascii = String.fromCharCode(parseInt(raw, 16))
ascii = ascii.replace(/\W/g, '?')
if (ascii === '') {
ascii = '?'
}
ret.ascii += ascii
ret.raw += ' ' + raw
}
return ret
} }
}) })

@ -1,5 +1,5 @@
'use strict' 'use strict'
var traceManagerUtil = require('./traceManagerUtil') var traceHelper = require('../helpers/traceHelper')
function TraceAnalyser (_cache) { function TraceAnalyser (_cache) {
this.traceCache = _cache this.traceCache = _cache
@ -18,7 +18,7 @@ TraceAnalyser.prototype.analyse = function (trace, tx, callback) {
callStack: callStack.slice(0) callStack: callStack.slice(0)
}) })
if (traceManagerUtil.isContractCreation(tx.to)) { if (traceHelper.isContractCreation(tx.to)) {
this.traceCache.pushContractCreation(tx.to, tx.input) this.traceCache.pushContractCreation(tx.to, tx.input)
} }
@ -45,17 +45,17 @@ TraceAnalyser.prototype.buildMemory = function (index, step) {
} }
TraceAnalyser.prototype.buildStorage = function (index, step, context) { TraceAnalyser.prototype.buildStorage = function (index, step, context) {
if (traceManagerUtil.newContextStorage(step)) { if (traceHelper.newContextStorage(step)) {
var calledAddress = traceManagerUtil.resolveCalledAddress(index, this.trace) var calledAddress = traceHelper.resolveCalledAddress(index, this.trace)
if (calledAddress) { if (calledAddress) {
context.currentStorageAddress = calledAddress context.currentStorageAddress = calledAddress
} else { } else {
console.log('unable to build storage changes. ' + index + ' does not match with a CALL. storage changes will be corrupted') console.log('unable to build storage changes. ' + index + ' does not match with a CALL. storage changes will be corrupted')
} }
this.traceCache.pushStoreChanges(index + 1, context.currentStorageAddress) this.traceCache.pushStoreChanges(index + 1, context.currentStorageAddress)
} else if (traceManagerUtil.isSSTOREInstruction(step)) { } else if (traceHelper.isSSTOREInstruction(step)) {
this.traceCache.pushStoreChanges(index + 1, context.currentStorageAddress, step.stack[step.stack.length - 1], step.stack[step.stack.length - 2]) this.traceCache.pushStoreChanges(index + 1, context.currentStorageAddress, step.stack[step.stack.length - 1], step.stack[step.stack.length - 2])
} else if (traceManagerUtil.isReturnInstruction(step)) { } else if (traceHelper.isReturnInstruction(step)) {
context.currentStorageAddress = context.previousStorageAddress context.currentStorageAddress = context.previousStorageAddress
this.traceCache.pushStoreChanges(index + 1, context.currentStorageAddress) this.traceCache.pushStoreChanges(index + 1, context.currentStorageAddress)
} }
@ -63,14 +63,14 @@ TraceAnalyser.prototype.buildStorage = function (index, step, context) {
} }
TraceAnalyser.prototype.buildDepth = function (index, step, callStack) { TraceAnalyser.prototype.buildDepth = function (index, step, callStack) {
if (traceManagerUtil.isCallInstruction(step) && !traceManagerUtil.isCallToPrecompiledContract(index, this.trace)) { if (traceHelper.isCallInstruction(step) && !traceHelper.isCallToPrecompiledContract(index, this.trace)) {
if (traceManagerUtil.isCreateInstruction(step)) { if (traceHelper.isCreateInstruction(step)) {
var contractToken = traceManagerUtil.contractCreationToken(index) var contractToken = traceHelper.contractCreationToken(index)
callStack.push(contractToken) callStack.push(contractToken)
var lastMemoryChange = this.traceCache.memoryChanges[this.traceCache.memoryChanges.length - 1] var lastMemoryChange = this.traceCache.memoryChanges[this.traceCache.memoryChanges.length - 1]
this.traceCache.pushContractCreationFromMemory(index, contractToken, this.trace, lastMemoryChange) this.traceCache.pushContractCreationFromMemory(index, contractToken, this.trace, lastMemoryChange)
} else { } else {
var newAddress = traceManagerUtil.resolveCalledAddress(index, this.trace) var newAddress = traceHelper.resolveCalledAddress(index, this.trace)
if (newAddress) { if (newAddress) {
callStack.push(newAddress) callStack.push(newAddress)
} else { } else {
@ -81,7 +81,7 @@ TraceAnalyser.prototype.buildDepth = function (index, step, callStack) {
this.traceCache.pushCallStack(index + 1, { this.traceCache.pushCallStack(index + 1, {
callStack: callStack.slice(0) callStack: callStack.slice(0)
}) })
} else if (traceManagerUtil.isReturnInstruction(step)) { } else if (traceHelper.isReturnInstruction(step)) {
callStack.pop() callStack.pop()
this.traceCache.pushCallChanges(step, index + 1) this.traceCache.pushCallChanges(step, index + 1)
this.traceCache.pushCallStack(index + 1, { this.traceCache.pushCallStack(index + 1, {

@ -3,7 +3,7 @@ var TraceAnalyser = require('./traceAnalyser')
var TraceRetriever = require('./traceRetriever') var TraceRetriever = require('./traceRetriever')
var TraceCache = require('./traceCache') var TraceCache = require('./traceCache')
var TraceStepManager = require('./traceStepManager') var TraceStepManager = require('./traceStepManager')
var traceManagerUtil = require('./traceManagerUtil') var traceHelper = require('../helpers/traceHelper')
function TraceManager (_web3) { function TraceManager (_web3) {
this.web3 = _web3 this.web3 = _web3
@ -74,7 +74,7 @@ TraceManager.prototype.getStorageAt = function (stepIndex, tx, callback) {
if (check) { if (check) {
return callback(check, null) return callback(check, null)
} }
var stoChange = traceManagerUtil.findLowerBound(stepIndex, this.traceCache.storageChanges) var stoChange = traceHelper.findLowerBound(stepIndex, this.traceCache.storageChanges)
if (stoChange === undefined) return callback('no storage found', null) if (stoChange === undefined) return callback('no storage found', null)
var self = this var self = this
if (this.traceRetriever.debugStorageAtAvailable()) { if (this.traceRetriever.debugStorageAtAvailable()) {
@ -98,7 +98,7 @@ TraceManager.prototype.getCallDataAt = function (stepIndex, callback) {
if (check) { if (check) {
return callback(check, null) return callback(check, null)
} }
var callDataChange = traceManagerUtil.findLowerBound(stepIndex, this.traceCache.callDataChanges) var callDataChange = traceHelper.findLowerBound(stepIndex, this.traceCache.callDataChanges)
if (callDataChange === undefined) return callback('no calldata found', null) if (callDataChange === undefined) return callback('no calldata found', null)
callback(null, [this.trace[callDataChange].calldata]) callback(null, [this.trace[callDataChange].calldata])
} }
@ -108,7 +108,7 @@ TraceManager.prototype.getCallStackAt = function (stepIndex, callback) {
if (check) { if (check) {
return callback(check, null) return callback(check, null)
} }
var callStackChange = traceManagerUtil.findLowerBound(stepIndex, this.traceCache.callChanges) var callStackChange = traceHelper.findLowerBound(stepIndex, this.traceCache.callChanges)
if (callStackChange === undefined) return callback('no callstack found', null) if (callStackChange === undefined) return callback('no callstack found', null)
callback(null, this.traceCache.callStack[callStackChange].callStack) callback(null, this.traceCache.callStack[callStackChange].callStack)
} }
@ -133,7 +133,7 @@ TraceManager.prototype.getLastCallChangeSince = function (stepIndex, callback) {
if (check) { if (check) {
return callback(check, null) return callback(check, null)
} }
var callChange = traceManagerUtil.findLowerBound(stepIndex, this.traceCache.callChanges) var callChange = traceHelper.findLowerBound(stepIndex, this.traceCache.callChanges)
if (callChange === undefined) { if (callChange === undefined) {
callback(null, 0) callback(null, 0)
} else { } else {
@ -179,7 +179,7 @@ TraceManager.prototype.getMemoryAt = function (stepIndex, callback) {
if (check) { if (check) {
return callback(check, null) return callback(check, null)
} }
var lastChanges = traceManagerUtil.findLowerBound(stepIndex, this.traceCache.memoryChanges) var lastChanges = traceHelper.findLowerBound(stepIndex, this.traceCache.memoryChanges)
if (lastChanges === undefined) return callback('no memory found', null) if (lastChanges === undefined) return callback('no memory found', null)
callback(null, this.trace[lastChanges].memory) callback(null, this.trace[lastChanges].memory)
} }
@ -225,7 +225,7 @@ TraceManager.prototype.getRemainingGas = function (stepIndex, callback) {
} }
TraceManager.prototype.isCreationStep = function (stepIndex) { TraceManager.prototype.isCreationStep = function (stepIndex) {
return traceManagerUtil.isCreateInstruction(stepIndex, this.trace) return traceHelper.isCreateInstruction(stepIndex, this.trace)
} }
// step section // step section

@ -1,5 +1,6 @@
'use strict' 'use strict'
var traceManagerUtil = require('./traceManagerUtil') var traceHelper = require('../helpers/traceHelper')
function TraceRetriever (_web3) { function TraceRetriever (_web3) {
this.web3 = _web3 this.web3 = _web3
this.storages = {} // contains all intial storage (by addresses) this.storages = {} // contains all intial storage (by addresses)
@ -18,7 +19,7 @@ TraceRetriever.prototype.getTrace = function (txHash, callback) {
} }
TraceRetriever.prototype.getStorage = function (tx, address, callback) { TraceRetriever.prototype.getStorage = function (tx, address, callback) {
if (traceManagerUtil.isContractCreation(address)) { if (traceHelper.isContractCreation(address)) {
callback(null, {}) callback(null, {})
} else if (this.storages[address]) { } else if (this.storages[address]) {
callback(null, this.storages[address]) callback(null, this.storages[address])

@ -1,5 +1,5 @@
'use strict' 'use strict'
var traceManagerUtil = require('./traceManagerUtil') var traceHelper = require('../helpers/traceHelper')
function TraceStepManager (_traceAnalyser) { function TraceStepManager (_traceAnalyser) {
this.traceAnalyser = _traceAnalyser this.traceAnalyser = _traceAnalyser
@ -7,12 +7,12 @@ function TraceStepManager (_traceAnalyser) {
TraceStepManager.prototype.isCallInstruction = function (index) { TraceStepManager.prototype.isCallInstruction = function (index) {
var state = this.traceAnalyser.trace[index] var state = this.traceAnalyser.trace[index]
return traceManagerUtil.isCallInstruction(state) return traceHelper.isCallInstruction(state)
} }
TraceStepManager.prototype.isReturnInstruction = function (index) { TraceStepManager.prototype.isReturnInstruction = function (index) {
var state = this.traceAnalyser.trace[index] var state = this.traceAnalyser.trace[index]
return traceManagerUtil.isReturnInstruction(state) return traceHelper.isReturnInstruction(state)
} }
TraceStepManager.prototype.findStepOverBack = function (currentStep) { TraceStepManager.prototype.findStepOverBack = function (currentStep) {

@ -1,7 +1,7 @@
'use strict' 'use strict'
var React = require('react') var React = require('react')
var style = require('./basicStyles') var style = require('./basicStyles')
var traceManagerUtil = require('./traceManagerUtil') var traceHelper = require('./helpers/traceHelper')
module.exports = React.createClass({ module.exports = React.createClass({
contextTypes: { contextTypes: {
@ -31,7 +31,7 @@ module.exports = React.createClass({
} }
if (tx) { if (tx) {
if (!tx.to) { if (!tx.to) {
tx.to = traceManagerUtil.contractCreationToken('0') tx.to = traceHelper.contractCreationToken('0')
} }
this.setState({from: tx.from, to: tx.to, hash: tx.hash}) this.setState({from: tx.from, to: tx.to, hash: tx.hash})
this.props.onNewTxRequested(this.state.blockNumber, parseInt(this.state.txNumber), tx) this.props.onNewTxRequested(this.state.blockNumber, parseInt(this.state.txNumber), tx)

@ -0,0 +1,12 @@
/* global describe it*/
var should = require('should')
var init = require('../src/helpers/init')
describe('index', function () {
describe('loadContext', function () {
it('web3', function () {
var context = init.loadContext()
should.exist(context.web3)
})
})
})
Loading…
Cancel
Save