pull/7/head
yann300 9 years ago
parent 2176ad1f27
commit b8bed49f7a
  1. 7
      package.json
  2. 13
      src/sticker.js
  3. 5
      src/trace/traceManager.js
  4. 1
      src/trace/traceRetriever.js
  5. 1
      src/txBrowser.js
  6. 7
      test-browser/index.js
  7. 74
      test/codeManager.js
  8. 2
      test/tests.js
  9. 2
      test/trace/contractInvokationTrace.js
  10. 2
      test/trace/contractInvokationTx.js
  11. 335
      test/traceManager.js

@ -21,6 +21,7 @@
"devDependencies": {
"babel-preset-react": "^6.5.0",
"babelify": "^7.2.0",
"nightwatch": "^0.9.4",
"standard": "^7.0.1",
"standard-reporter": "^1.0.5",
"tape": "^4.6.0"
@ -28,7 +29,8 @@
"scripts": {
"start_node": "eth --rpccorsdomain \"*\" -j -v 0",
"build": "mkdir -p build; browserify -t [ babelify --presets [ react ] ] src/index.js -o build/app.js",
"test": "standard && tape ./test/tests.js"
"test": "standard && tape ./test/tests.js",
"serve": "http-server ."
},
"repository": {
"type": "git",
@ -43,7 +45,8 @@
"standard": {
"ignore": [
"node_modules/*",
"build/*"
"build/*",
"test/trace/*"
]
}
}

@ -10,6 +10,7 @@ module.exports = React.createClass({
getInitialState: function () {
return {
vmTraceStep: '',
step: '',
addmemory: '',
gas: '',
@ -22,6 +23,14 @@ module.exports = React.createClass({
<div>
<table>
<tbody>
<tr key='vmtracestep'>
<td>
vmtracestep
</td>
<td>
{this.state.vmTraceStep}
</td>
</tr>
<tr key='step'>
<td>
step
@ -81,6 +90,10 @@ module.exports = React.createClass({
this.context.root.register('indexChanged', this, function (index) {
if (index < 0) return
self.setState({
vmTraceStep: index
})
self.context.traceManager.getCurrentStep(index, function (error, step) {
if (error) {
console.log(error)

@ -32,12 +32,13 @@ TraceManager.prototype.resolveTrace = function (tx, callback) {
self.trace = result.structLogs
self.traceAnalyser.analyse(result.structLogs, tx, function (error, result) {
if (error) {
self.isLoading = false
console.log(error)
callback(false)
} else {
self.isLoading = false
callback(true)
}
self.isLoading = false
})
} else {
console.log(tx.hash + ' is not a contract invokation or contract creation.')
@ -225,7 +226,7 @@ TraceManager.prototype.getRemainingGas = function (stepIndex, callback) {
}
TraceManager.prototype.isCreationStep = function (stepIndex) {
return traceHelper.isCreateInstruction(stepIndex, this.trace)
return traceHelper.isCreateInstruction(this.trace[stepIndex])
}
// step section

@ -14,6 +14,7 @@ TraceRetriever.prototype.getTrace = function (txHash, callback) {
fullStorage: !this.debugStorageAtAvailable()
}
this.web3.debug.traceTransaction(txHash, options, function (error, result) {
console.log(JSON.stringify(result))
callback(error, result)
})
}

@ -29,6 +29,7 @@ module.exports = React.createClass({
} else {
tx = this.context.web3.eth.getTransactionFromBlock(this.state.blockNumber, this.state.txNumber)
}
console.log(JSON.stringify(tx))
if (tx) {
if (!tx.to) {
tx.to = traceHelper.contractCreationToken('0')

@ -0,0 +1,7 @@
module.exports = {
'Page Load': function (browser) {
browser
.url('http://127.0.0.1:8080')
.end()
}
}

@ -0,0 +1,74 @@
'use strict'
var tape = require('tape')
var init = require('../src/helpers/init')
// var traceInvokation = require('./trace/contractInvokationTrace')
var txInvokation = require('./trace/contractInvokationTx')
tape('CodeManager', function (t) {
var codeManager
var context = init.loadContext()
codeManager = context.codeManager
context.traceManager.resolveTrace(txInvokation, function (success) {
if (!success) {
t.fail(' - traceManager.resolveTrace - failed')
} else {
continueTesting(t, codeManager)
}
})
})
function continueTesting (t, codeManager) {
t.test('CodeManager.init', function (st) {
st.end()
})
t.test('CodeManager.resolveStep', function (st) {
st.plan(6)
codeManager.register('indexChanged', this, function (index) {
if (index === undefined || index === null) {
st.fail(index)
} else {
st.ok(index === 6 || index === 0)
}
})
codeManager.register('codeChanged', this, function (code, address, index) {
console.log(address + ' ' + index + ' ' + code)
if (!code) {
st.fail('no codes')
} else {
st.ok(address === '0x0d3a18d64dfe4f927832ab58d6451cecc4e517c5' || address === '(Contract Creation - Step 63)')
if (address === '0x0d3a18d64dfe4f927832ab58d6451cecc4e517c5') {
console.log(address + ' ' + code[25])
st.ok(code[25].indexOf('DUP') !== -1)
} else if (address === '(Contract Creation - Step 63)') {
console.log(address + ' ' + code[25])
st.ok(code[25].indexOf('JUMPDEST') !== -1)
}
}
})
codeManager.resolveStep(0, txInvokation)
codeManager.resolveStep(70, txInvokation)
})
t.test('CodeManager.getInstructionIndex', function (st) {
st.plan(2)
codeManager.getInstructionIndex('0x0d3a18d64dfe4f927832ab58d6451cecc4e517c5', 16, function (error, result) {
console.log(result)
if (error) {
st.fail(error)
} else {
st.ok(result === 25)
}
})
codeManager.getInstructionIndex('(Contract Creation - Step 63)', 70, function (error, result) {
console.log(result)
if (error) {
st.fail(error)
} else {
st.ok(result === 6)
}
})
})
}

@ -1,2 +1,4 @@
'use strict'
require('./index.js')
require('./traceManager.js')
require('./codeManager.js')

File diff suppressed because one or more lines are too long

@ -0,0 +1,2 @@
module.exports =
{'blockHash':'0xd1d34932f8733e0485b7d9bf8500c4046d650f20ed7792508c304304fa7bbfac','blockNumber':89,'from':'0x00101c5bfa3fc8bad02c9f5fd65b069306251915','gas':105967,'gasPrice':'20000000000','hash':'0x20ef65b8b186ca942fcccd634f37074dde49b541c27994fc7596740ef44cfd51','input':'0x60fe47b10000000000000000000000000000000000000000000000000000000000000038','nonce':3,'to':'0x0d3a18d64dfe4f927832ab58d6451cecc4e517c5','transactionIndex':0,'value':'0'}

@ -0,0 +1,335 @@
'use strict'
var TraceManager = require('../src/trace/traceManager')
var tape = require('tape')
var init = require('../src/helpers/init')
var traceHelper = require('../src/helpers/traceHelper')
var traceInvokation = require('./trace/contractInvokationTrace')
var txInvokation = require('./trace/contractInvokationTx')
tape('TraceManager', function (t) {
var traceManager
t.test('TraceManager.init', function (st) {
var context = init.loadContext()
traceManager = new TraceManager(context.web3)
traceManager.traceRetriever = new TestTraceRetriever()
st.end()
})
t.test('TraceManager.resolveTrace', function (st) {
traceManager.resolveTrace(txInvokation, function (success) {
if (!success) {
st.fail(' - traceManager.resolveTrace - failed')
} else {
st.end()
}
})
})
t.test('TraceManager.getLength ', function (st) {
traceManager.getLength(function (error, result) {
if (error) {
st.fail(error)
} else {
st.end()
}
})
})
t.test('TraceManager.inRange ', function (st) {
st.notOk(traceManager.inRange(-1))
st.ok(traceManager.inRange(10))
st.notOk(traceManager.inRange(142))
st.ok(traceManager.inRange(141))
st.end()
})
t.test('TraceManager.getStorageAt', function (st) {
traceManager.getStorageAt(0, txInvokation, function (error, result) {
if (error) {
st.fail(error)
} else {
st.ok(result['0x00'] === '0x2d')
st.end()
}
})
})
t.test('TraceManager.getCallData', function (st) {
traceManager.getCallDataAt(0, function (error, result) {
if (error) {
st.fail(error)
} else {
st.ok(result[0] === '0x60fe47b10000000000000000000000000000000000000000000000000000000000000038')
st.end()
}
})
})
t.test('TraceManager.getCallStackAt', function (st) {
st.plan(3)
traceManager.getCallStackAt(0, function (error, result) {
if (error) {
st.fail(error)
} else {
st.ok(result[0] === '0x0d3a18d64dfe4f927832ab58d6451cecc4e517c5')
}
})
traceManager.getCallStackAt(64, function (error, result) {
if (error) {
st.fail(error)
} else {
st.ok(result.length === 2)
st.ok(result[1] === '(Contract Creation - Step 63)')
}
})
})
t.test('TraceManager.getStackAt', function (st) {
st.plan(3)
traceManager.getStackAt(0, function (error, result) {
console.log(result)
if (error) {
st.fail(error)
} else {
st.ok(result.length === 0)
}
})
traceManager.getStackAt(28, function (error, result) {
console.log(result)
if (error) {
st.fail(error)
} else {
st.ok(result.length === 4)
st.ok(result[3] === '0x60fe47b1')
}
})
})
t.test('TraceManager.getLastCallChangeSince', function (st) {
st.plan(3)
traceManager.getLastCallChangeSince(10, function (error, result) {
console.log(result)
if (error) {
st.fail(error)
} else {
st.ok(result === 0)
}
})
traceManager.getLastCallChangeSince(70, function (error, result) {
console.log(result)
if (error) {
st.fail(error)
} else {
st.ok(result === 64)
}
})
traceManager.getLastCallChangeSince(111, function (error, result) {
console.log(result)
if (error) {
st.fail(error)
} else {
st.ok(result === 109)
}
})
})
t.test('TraceManager.getCurrentCalledAddressAt', function (st) {
st.plan(3)
traceManager.getCurrentCalledAddressAt(10, function (error, result) {
console.log(result)
if (error) {
st.fail(error)
} else {
st.ok(result === '0x0d3a18d64dfe4f927832ab58d6451cecc4e517c5')
}
})
traceManager.getCurrentCalledAddressAt(70, function (error, result) {
console.log(result)
if (error) {
st.fail(error)
} else {
st.ok(result === '(Contract Creation - Step 63)')
}
})
traceManager.getCurrentCalledAddressAt(111, function (error, result) {
console.log(result)
if (error) {
st.fail(error)
} else {
st.ok(result === '0x0d3a18d64dfe4f927832ab58d6451cecc4e517c5')
}
})
})
t.test('TraceManager.getContractCreationCode', function (st) { // contract code has been retrieved from the memory
traceManager.getContractCreationCode('(Contract Creation - Step 63)', function (error, result) {
console.log(result)
if (error) {
st.fail(error)
} else {
st.ok(result === '0x60606040526040516020806045833981016040528080519060200190919050505b806001016000600050819055505b50600a80603b6000396000f360606040526008565b00000000000000000000000000000000000000000000000000000000000000002d')
st.end()
}
})
})
t.test('TraceManager.getMemoryAt', function (st) {
st.plan(3)
traceManager.getMemoryAt(0, function (error, result) {
console.log(result)
if (error) {
st.fail(error)
} else {
st.ok(result.length === 0)
}
})
traceManager.getMemoryAt(34, function (error, result) {
console.log(result)
if (error) {
st.fail(error)
} else {
st.ok(result.length === 3)
st.ok(result[2] === '0000000000000000000000000000000000000000000000000000000000000060')
}
})
})
t.test('TraceManager.getCurrentPC', function (st) {
traceManager.getCurrentPC(13, function (error, result) {
console.log(result)
if (error) {
st.fail(error)
} else {
st.ok(result === '65')
st.end()
}
})
})
t.test('TraceManager.getCurrentStep', function (st) {
traceManager.getCurrentStep(66, function (error, result) {
console.log(result)
if (error) {
st.fail(error)
} else {
st.ok(result === 2)
st.end()
}
})
})
t.test('TraceManager.getMemExpand', function (st) {
traceManager.getMemExpand(2, function (error, result) {
console.log(result)
if (error) {
st.fail(error)
} else {
st.ok(result === '3')
st.end()
}
})
})
t.test('TraceManager.getStepCost', function (st) {
traceManager.getStepCost(34, function (error, result) {
console.log(result)
if (error) {
st.fail(error)
} else {
st.ok(result === '3')
st.end()
}
})
})
t.test('TraceManager.getRemainingGas', function (st) {
traceManager.getRemainingGas(55, function (error, result) {
console.log(result)
if (error) {
st.fail(error)
} else {
st.ok(result === '79306')
st.end()
}
})
})
t.test('TraceManager.findStepOverBack', function (st) {
var result = traceManager.findStepOverBack(116)
console.log(result)
st.ok(result === -1)
st.end()
})
t.test('TraceManager.findStepOverForward', function (st) {
var result = traceManager.findStepOverForward(66)
console.log(result)
st.ok(result === 108)
st.end()
})
t.test('TraceManager.findStepOutBack', function (st) {
var result = traceManager.findStepOutBack(70)
console.log(result)
st.ok(result === 63)
st.end()
})
t.test('TraceManager.findStepOutForward', function (st) {
var result = traceManager.findStepOutForward(15)
console.log(result)
st.ok(result === 142)
st.end()
})
t.test('TraceManager.findNextCall', function (st) {
var result = traceManager.findNextCall(10)
console.log(result)
st.ok(result === 63)
st.end()
})
})
/*
TestTraceRetriever
*/
function TestTraceRetriever () {
this.storages = {} // contains all intial storage (by addresses)
}
TestTraceRetriever.prototype.getTrace = function (txHash, callback) {
console.log(traceInvokation)
callback(null, traceInvokation)
}
/* not used */
TestTraceRetriever.prototype.getStorage = function (tx, address, callback) {
if (traceHelper.isContractCreation(address)) {
callback(null, {})
} else if (this.storages[address]) {
callback(null, this.storages[address])
} else {
/*
return storage
*/
/*
var self = this
this.web3.debug.storageAt(tx.blockNumber.toString(), tx.transactionIndex, address, function (error, result) {
self.storages[address] = result
callback(error, result)
})
*/
}
}
TestTraceRetriever.prototype.debugStorageAtAvailable = function () {
return false // storageAt not available if using geth
}
Loading…
Cancel
Save