vm_debug.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922
  1. package vm
  2. import (
  3. "fmt"
  4. "math/big"
  5. "github.com/ethereum/eth-go/ethcrypto"
  6. "github.com/ethereum/eth-go/ethutil"
  7. )
  8. type DebugVm struct {
  9. env Environment
  10. logTy byte
  11. logStr string
  12. err error
  13. // Debugging
  14. Dbg Debugger
  15. BreakPoints []int64
  16. Stepping bool
  17. Fn string
  18. Recoverable bool
  19. depth int
  20. }
  21. func NewDebugVm(env Environment) *DebugVm {
  22. lt := LogTyPretty
  23. if ethutil.Config.Diff {
  24. lt = LogTyDiff
  25. }
  26. return &DebugVm{env: env, logTy: lt, Recoverable: true}
  27. }
  28. func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
  29. self.depth++
  30. var (
  31. op OpCode
  32. mem = &Memory{}
  33. stack = NewStack()
  34. pc = big.NewInt(0)
  35. step = 0
  36. prevStep = 0
  37. state = self.env.State()
  38. require = func(m int) {
  39. if stack.Len() < m {
  40. panic(fmt.Sprintf("%04v (%v) stack err size = %d, required = %d", pc, op, stack.Len(), m))
  41. }
  42. }
  43. jump = func(pos *big.Int) {
  44. p := int(pos.Int64())
  45. self.Printf(" ~> %v", pos)
  46. // Return to start
  47. if p == 0 {
  48. pc = big.NewInt(0)
  49. } else {
  50. nop := OpCode(closure.GetOp(p - 1))
  51. if nop != JUMPDEST {
  52. panic(fmt.Sprintf("JUMP missed JUMPDEST (%v) %v", nop, p))
  53. }
  54. pc = pos
  55. }
  56. self.Endl()
  57. }
  58. )
  59. if self.Recoverable {
  60. // Recover from any require exception
  61. defer func() {
  62. if r := recover(); r != nil {
  63. self.Endl()
  64. ret = closure.Return(nil)
  65. err = fmt.Errorf("%v", r)
  66. }
  67. }()
  68. }
  69. // Debug hook
  70. if self.Dbg != nil {
  71. self.Dbg.SetCode(closure.Code)
  72. }
  73. // Don't bother with the execution if there's no code.
  74. if len(closure.Code) == 0 {
  75. return closure.Return(nil), nil
  76. }
  77. vmlogger.Debugf("(%d) %x gas: %v (d) %x\n", self.depth, closure.Address(), closure.Gas, closure.Args)
  78. for {
  79. prevStep = step
  80. // The base for all big integer arithmetic
  81. base := new(big.Int)
  82. step++
  83. // Get the memory location of pc
  84. op := OpCode(closure.Get(pc).Uint())
  85. // XXX Leave this Println intact. Don't change this to the log system.
  86. // Used for creating diffs between implementations
  87. if self.logTy == LogTyDiff {
  88. switch op {
  89. case STOP, RETURN, SUICIDE:
  90. state.GetStateObject(closure.Address()).EachStorage(func(key string, value *ethutil.Value) {
  91. value.Decode()
  92. fmt.Printf("%x %x\n", new(big.Int).SetBytes([]byte(key)).Bytes(), value.Bytes())
  93. })
  94. }
  95. b := pc.Bytes()
  96. if len(b) == 0 {
  97. b = []byte{0}
  98. }
  99. fmt.Printf("%x %x %x %x\n", closure.Address(), b, []byte{byte(op)}, closure.Gas.Bytes())
  100. }
  101. gas := new(big.Int)
  102. addStepGasUsage := func(amount *big.Int) {
  103. if amount.Cmp(ethutil.Big0) >= 0 {
  104. gas.Add(gas, amount)
  105. }
  106. }
  107. addStepGasUsage(GasStep)
  108. var newMemSize *big.Int = ethutil.Big0
  109. switch op {
  110. case STOP:
  111. gas.Set(ethutil.Big0)
  112. case SUICIDE:
  113. gas.Set(ethutil.Big0)
  114. case SLOAD:
  115. gas.Set(GasSLoad)
  116. case SSTORE:
  117. var mult *big.Int
  118. y, x := stack.Peekn()
  119. val := closure.GetStorage(x)
  120. if val.BigInt().Cmp(ethutil.Big0) == 0 && len(y.Bytes()) > 0 {
  121. mult = ethutil.Big2
  122. } else if val.BigInt().Cmp(ethutil.Big0) != 0 && len(y.Bytes()) == 0 {
  123. mult = ethutil.Big0
  124. } else {
  125. mult = ethutil.Big1
  126. }
  127. gas = new(big.Int).Mul(mult, GasSStore)
  128. case BALANCE:
  129. gas.Set(GasBalance)
  130. case MSTORE:
  131. require(2)
  132. newMemSize = calcMemSize(stack.Peek(), u256(32))
  133. case MLOAD:
  134. require(1)
  135. newMemSize = calcMemSize(stack.Peek(), u256(32))
  136. case MSTORE8:
  137. require(2)
  138. newMemSize = calcMemSize(stack.Peek(), u256(1))
  139. case RETURN:
  140. require(2)
  141. newMemSize = calcMemSize(stack.Peek(), stack.data[stack.Len()-2])
  142. case SHA3:
  143. require(2)
  144. gas.Set(GasSha)
  145. newMemSize = calcMemSize(stack.Peek(), stack.data[stack.Len()-2])
  146. case CALLDATACOPY:
  147. require(2)
  148. newMemSize = calcMemSize(stack.Peek(), stack.data[stack.Len()-3])
  149. case CODECOPY:
  150. require(3)
  151. newMemSize = calcMemSize(stack.Peek(), stack.data[stack.Len()-3])
  152. case EXTCODECOPY:
  153. require(4)
  154. newMemSize = calcMemSize(stack.data[stack.Len()-2], stack.data[stack.Len()-4])
  155. case CALL, CALLCODE:
  156. require(7)
  157. gas.Set(GasCall)
  158. addStepGasUsage(stack.data[stack.Len()-1])
  159. x := calcMemSize(stack.data[stack.Len()-6], stack.data[stack.Len()-7])
  160. y := calcMemSize(stack.data[stack.Len()-4], stack.data[stack.Len()-5])
  161. newMemSize = ethutil.BigMax(x, y)
  162. case CREATE:
  163. require(3)
  164. gas.Set(GasCreate)
  165. newMemSize = calcMemSize(stack.data[stack.Len()-2], stack.data[stack.Len()-3])
  166. }
  167. if newMemSize.Cmp(ethutil.Big0) > 0 {
  168. newMemSize.Add(newMemSize, u256(31))
  169. newMemSize.Div(newMemSize, u256(32))
  170. newMemSize.Mul(newMemSize, u256(32))
  171. if newMemSize.Cmp(u256(int64(mem.Len()))) > 0 {
  172. memGasUsage := new(big.Int).Sub(newMemSize, u256(int64(mem.Len())))
  173. memGasUsage.Mul(GasMemory, memGasUsage)
  174. memGasUsage.Div(memGasUsage, u256(32))
  175. addStepGasUsage(memGasUsage)
  176. }
  177. }
  178. self.Printf("(pc) %-3d -o- %-14s", pc, op.String())
  179. self.Printf(" (g) %-3v (%v)", gas, closure.Gas)
  180. if !closure.UseGas(gas) {
  181. self.Endl()
  182. err := fmt.Errorf("Insufficient gas for %v. req %v has %v", op, gas, closure.Gas)
  183. closure.UseGas(closure.Gas)
  184. return closure.Return(nil), err
  185. }
  186. mem.Resize(newMemSize.Uint64())
  187. switch op {
  188. case LOG:
  189. stack.Print()
  190. mem.Print()
  191. // 0x20 range
  192. case ADD:
  193. require(2)
  194. x, y := stack.Popn()
  195. self.Printf(" %v + %v", y, x)
  196. base.Add(y, x)
  197. U256(base)
  198. self.Printf(" = %v", base)
  199. // Pop result back on the stack
  200. stack.Push(base)
  201. case SUB:
  202. require(2)
  203. x, y := stack.Popn()
  204. self.Printf(" %v - %v", y, x)
  205. base.Sub(y, x)
  206. U256(base)
  207. self.Printf(" = %v", base)
  208. // Pop result back on the stack
  209. stack.Push(base)
  210. case MUL:
  211. require(2)
  212. x, y := stack.Popn()
  213. self.Printf(" %v * %v", y, x)
  214. base.Mul(y, x)
  215. U256(base)
  216. self.Printf(" = %v", base)
  217. // Pop result back on the stack
  218. stack.Push(base)
  219. case DIV:
  220. require(2)
  221. x, y := stack.Pop(), stack.Pop()
  222. self.Printf(" %v / %v", x, y)
  223. if y.Cmp(ethutil.Big0) != 0 {
  224. base.Div(x, y)
  225. }
  226. U256(base)
  227. self.Printf(" = %v", base)
  228. // Pop result back on the stack
  229. stack.Push(base)
  230. case SDIV:
  231. require(2)
  232. x, y := S256(stack.Pop()), S256(stack.Pop())
  233. self.Printf(" %v / %v", x, y)
  234. if y.Cmp(ethutil.Big0) == 0 {
  235. base.Set(ethutil.Big0)
  236. } else {
  237. n := new(big.Int)
  238. if new(big.Int).Mul(x, y).Cmp(ethutil.Big0) < 0 {
  239. n.SetInt64(-1)
  240. } else {
  241. n.SetInt64(1)
  242. }
  243. base.Div(x.Abs(x), y.Abs(y)).Mul(base, n)
  244. U256(base)
  245. }
  246. self.Printf(" = %v", base)
  247. stack.Push(base)
  248. case MOD:
  249. require(2)
  250. x, y := stack.Pop(), stack.Pop()
  251. self.Printf(" %v %% %v", x, y)
  252. if y.Cmp(ethutil.Big0) == 0 {
  253. base.Set(ethutil.Big0)
  254. } else {
  255. base.Mod(x, y)
  256. }
  257. U256(base)
  258. self.Printf(" = %v", base)
  259. stack.Push(base)
  260. case SMOD:
  261. require(2)
  262. x, y := S256(stack.Pop()), S256(stack.Pop())
  263. self.Printf(" %v %% %v", x, y)
  264. if y.Cmp(ethutil.Big0) == 0 {
  265. base.Set(ethutil.Big0)
  266. } else {
  267. n := new(big.Int)
  268. if x.Cmp(ethutil.Big0) < 0 {
  269. n.SetInt64(-1)
  270. } else {
  271. n.SetInt64(1)
  272. }
  273. base.Mod(x.Abs(x), y.Abs(y)).Mul(base, n)
  274. U256(base)
  275. }
  276. self.Printf(" = %v", base)
  277. stack.Push(base)
  278. case EXP:
  279. require(2)
  280. x, y := stack.Popn()
  281. self.Printf(" %v ** %v", y, x)
  282. base.Exp(y, x, Pow256)
  283. U256(base)
  284. self.Printf(" = %v", base)
  285. stack.Push(base)
  286. case NEG:
  287. require(1)
  288. base.Sub(Pow256, stack.Pop())
  289. base = U256(base)
  290. stack.Push(base)
  291. case LT:
  292. require(2)
  293. x, y := stack.Popn()
  294. self.Printf(" %v < %v", y, x)
  295. // x < y
  296. if y.Cmp(x) < 0 {
  297. stack.Push(ethutil.BigTrue)
  298. } else {
  299. stack.Push(ethutil.BigFalse)
  300. }
  301. case GT:
  302. require(2)
  303. x, y := stack.Popn()
  304. self.Printf(" %v > %v", y, x)
  305. // x > y
  306. if y.Cmp(x) > 0 {
  307. stack.Push(ethutil.BigTrue)
  308. } else {
  309. stack.Push(ethutil.BigFalse)
  310. }
  311. case SLT:
  312. require(2)
  313. y, x := S256(stack.Pop()), S256(stack.Pop())
  314. self.Printf(" %v < %v", y, x)
  315. // x < y
  316. if y.Cmp(S256(x)) < 0 {
  317. stack.Push(ethutil.BigTrue)
  318. } else {
  319. stack.Push(ethutil.BigFalse)
  320. }
  321. case SGT:
  322. require(2)
  323. y, x := S256(stack.Pop()), S256(stack.Pop())
  324. self.Printf(" %v > %v", y, x)
  325. // x > y
  326. if y.Cmp(x) > 0 {
  327. stack.Push(ethutil.BigTrue)
  328. } else {
  329. stack.Push(ethutil.BigFalse)
  330. }
  331. case EQ:
  332. require(2)
  333. x, y := stack.Popn()
  334. self.Printf(" %v == %v", y, x)
  335. // x == y
  336. if x.Cmp(y) == 0 {
  337. stack.Push(ethutil.BigTrue)
  338. } else {
  339. stack.Push(ethutil.BigFalse)
  340. }
  341. case NOT:
  342. require(1)
  343. x := stack.Pop()
  344. if x.Cmp(ethutil.BigFalse) > 0 {
  345. stack.Push(ethutil.BigFalse)
  346. } else {
  347. stack.Push(ethutil.BigTrue)
  348. }
  349. // 0x10 range
  350. case AND:
  351. require(2)
  352. x, y := stack.Popn()
  353. self.Printf(" %v & %v", y, x)
  354. stack.Push(base.And(y, x))
  355. case OR:
  356. require(2)
  357. x, y := stack.Popn()
  358. self.Printf(" %v | %v", y, x)
  359. stack.Push(base.Or(y, x))
  360. case XOR:
  361. require(2)
  362. x, y := stack.Popn()
  363. self.Printf(" %v ^ %v", y, x)
  364. stack.Push(base.Xor(y, x))
  365. case BYTE:
  366. require(2)
  367. val, th := stack.Popn()
  368. if th.Cmp(big.NewInt(32)) < 0 {
  369. byt := big.NewInt(int64(ethutil.LeftPadBytes(val.Bytes(), 32)[th.Int64()]))
  370. base.Set(byt)
  371. } else {
  372. base.Set(ethutil.BigFalse)
  373. }
  374. self.Printf(" => 0x%x", base.Bytes())
  375. stack.Push(base)
  376. case ADDMOD:
  377. require(3)
  378. x := stack.Pop()
  379. y := stack.Pop()
  380. z := stack.Pop()
  381. base.Add(x, y)
  382. base.Mod(base, z)
  383. U256(base)
  384. self.Printf(" = %v", base)
  385. stack.Push(base)
  386. case MULMOD:
  387. require(3)
  388. x := stack.Pop()
  389. y := stack.Pop()
  390. z := stack.Pop()
  391. base.Mul(x, y)
  392. base.Mod(base, z)
  393. U256(base)
  394. self.Printf(" = %v", base)
  395. stack.Push(base)
  396. // 0x20 range
  397. case SHA3:
  398. require(2)
  399. size, offset := stack.Popn()
  400. data := ethcrypto.Sha3(mem.Get(offset.Int64(), size.Int64()))
  401. stack.Push(ethutil.BigD(data))
  402. self.Printf(" => %x", data)
  403. // 0x30 range
  404. case ADDRESS:
  405. stack.Push(ethutil.BigD(closure.Address()))
  406. self.Printf(" => %x", closure.Address())
  407. case BALANCE:
  408. require(1)
  409. addr := stack.Pop().Bytes()
  410. balance := state.GetBalance(addr)
  411. stack.Push(balance)
  412. self.Printf(" => %v (%x)", balance, addr)
  413. case ORIGIN:
  414. origin := self.env.Origin()
  415. stack.Push(ethutil.BigD(origin))
  416. self.Printf(" => %x", origin)
  417. case CALLER:
  418. caller := closure.caller.Address()
  419. stack.Push(ethutil.BigD(caller))
  420. self.Printf(" => %x", caller)
  421. case CALLVALUE:
  422. value := closure.exe.value
  423. stack.Push(value)
  424. self.Printf(" => %v", value)
  425. case CALLDATALOAD:
  426. require(1)
  427. var (
  428. offset = stack.Pop()
  429. data = make([]byte, 32)
  430. lenData = big.NewInt(int64(len(closure.Args)))
  431. )
  432. if lenData.Cmp(offset) >= 0 {
  433. length := new(big.Int).Add(offset, ethutil.Big32)
  434. length = ethutil.BigMin(length, lenData)
  435. copy(data, closure.Args[offset.Int64():length.Int64()])
  436. }
  437. self.Printf(" => 0x%x", data)
  438. stack.Push(ethutil.BigD(data))
  439. case CALLDATASIZE:
  440. l := int64(len(closure.Args))
  441. stack.Push(big.NewInt(l))
  442. self.Printf(" => %d", l)
  443. case CALLDATACOPY:
  444. var (
  445. size = int64(len(closure.Args))
  446. mOff = stack.Pop().Int64()
  447. cOff = stack.Pop().Int64()
  448. l = stack.Pop().Int64()
  449. )
  450. if cOff > size {
  451. cOff = 0
  452. l = 0
  453. } else if cOff+l > size {
  454. l = 0
  455. }
  456. code := closure.Args[cOff : cOff+l]
  457. mem.Set(mOff, l, code)
  458. case CODESIZE, EXTCODESIZE:
  459. var code []byte
  460. if op == EXTCODESIZE {
  461. addr := stack.Pop().Bytes()
  462. code = state.GetCode(addr)
  463. } else {
  464. code = closure.Code
  465. }
  466. l := big.NewInt(int64(len(code)))
  467. stack.Push(l)
  468. self.Printf(" => %d", l)
  469. case CODECOPY, EXTCODECOPY:
  470. var code []byte
  471. if op == EXTCODECOPY {
  472. addr := stack.Pop().Bytes()
  473. code = state.GetCode(addr)
  474. } else {
  475. code = closure.Code
  476. }
  477. var (
  478. size = int64(len(code))
  479. mOff = stack.Pop().Int64()
  480. cOff = stack.Pop().Int64()
  481. l = stack.Pop().Int64()
  482. )
  483. if cOff > size {
  484. cOff = 0
  485. l = 0
  486. } else if cOff+l > size {
  487. l = 0
  488. }
  489. codeCopy := code[cOff : cOff+l]
  490. mem.Set(mOff, l, codeCopy)
  491. case GASPRICE:
  492. stack.Push(closure.Price)
  493. self.Printf(" => %v", closure.Price)
  494. // 0x40 range
  495. case PREVHASH:
  496. prevHash := self.env.PrevHash()
  497. stack.Push(ethutil.BigD(prevHash))
  498. self.Printf(" => 0x%x", prevHash)
  499. case COINBASE:
  500. coinbase := self.env.Coinbase()
  501. stack.Push(ethutil.BigD(coinbase))
  502. self.Printf(" => 0x%x", coinbase)
  503. case TIMESTAMP:
  504. time := self.env.Time()
  505. stack.Push(big.NewInt(time))
  506. self.Printf(" => 0x%x", time)
  507. case NUMBER:
  508. number := self.env.BlockNumber()
  509. stack.Push(number)
  510. self.Printf(" => 0x%x", number.Bytes())
  511. case DIFFICULTY:
  512. difficulty := self.env.Difficulty()
  513. stack.Push(difficulty)
  514. self.Printf(" => 0x%x", difficulty.Bytes())
  515. case GASLIMIT:
  516. stack.Push(self.env.GasLimit())
  517. // 0x50 range
  518. case PUSH1, PUSH2, PUSH3, PUSH4, PUSH5, PUSH6, PUSH7, PUSH8, PUSH9, PUSH10, PUSH11, PUSH12, PUSH13, PUSH14, PUSH15, PUSH16, PUSH17, PUSH18, PUSH19, PUSH20, PUSH21, PUSH22, PUSH23, PUSH24, PUSH25, PUSH26, PUSH27, PUSH28, PUSH29, PUSH30, PUSH31, PUSH32:
  519. a := big.NewInt(int64(op) - int64(PUSH1) + 1)
  520. pc.Add(pc, ethutil.Big1)
  521. data := closure.Gets(pc, a)
  522. val := ethutil.BigD(data.Bytes())
  523. // Push value to stack
  524. stack.Push(val)
  525. pc.Add(pc, a.Sub(a, big.NewInt(1)))
  526. step += int(op) - int(PUSH1) + 1
  527. self.Printf(" => 0x%x", data.Bytes())
  528. case POP:
  529. require(1)
  530. stack.Pop()
  531. case DUP1, DUP2, DUP3, DUP4, DUP5, DUP6, DUP7, DUP8, DUP9, DUP10, DUP11, DUP12, DUP13, DUP14, DUP15, DUP16:
  532. n := int(op - DUP1 + 1)
  533. v := stack.Dupn(n)
  534. self.Printf(" => [%d] 0x%x", n, stack.Peek().Bytes())
  535. if OpCode(closure.Get(new(big.Int).Add(pc, ethutil.Big1)).Uint()) == POP && OpCode(closure.Get(new(big.Int).Add(pc, big.NewInt(2))).Uint()) == POP {
  536. fmt.Println(toValue(v))
  537. }
  538. case SWAP1, SWAP2, SWAP3, SWAP4, SWAP5, SWAP6, SWAP7, SWAP8, SWAP9, SWAP10, SWAP11, SWAP12, SWAP13, SWAP14, SWAP15, SWAP16:
  539. n := int(op - SWAP1 + 2)
  540. x, y := stack.Swapn(n)
  541. self.Printf(" => [%d] %x [0] %x", n, x.Bytes(), y.Bytes())
  542. case MLOAD:
  543. require(1)
  544. offset := stack.Pop()
  545. val := ethutil.BigD(mem.Get(offset.Int64(), 32))
  546. stack.Push(val)
  547. self.Printf(" => 0x%x", val.Bytes())
  548. case MSTORE: // Store the value at stack top-1 in to memory at location stack top
  549. require(2)
  550. // Pop value of the stack
  551. val, mStart := stack.Popn()
  552. mem.Set(mStart.Int64(), 32, ethutil.BigToBytes(val, 256))
  553. self.Printf(" => 0x%x", val)
  554. case MSTORE8:
  555. require(2)
  556. off := stack.Pop()
  557. val := stack.Pop()
  558. mem.store[off.Int64()] = byte(val.Int64() & 0xff)
  559. self.Printf(" => [%v] 0x%x", off, val)
  560. case SLOAD:
  561. require(1)
  562. loc := stack.Pop()
  563. val := ethutil.BigD(state.GetState(closure.Address(), loc.Bytes()))
  564. stack.Push(val)
  565. self.Printf(" {0x%x : 0x%x}", loc.Bytes(), val.Bytes())
  566. case SSTORE:
  567. require(2)
  568. val, loc := stack.Popn()
  569. state.SetState(closure.Address(), loc.Bytes(), val)
  570. // Debug sessions are allowed to run without message
  571. if closure.message != nil {
  572. closure.message.AddStorageChange(loc.Bytes())
  573. }
  574. self.Printf(" {0x%x : 0x%x}", loc.Bytes(), val.Bytes())
  575. case JUMP:
  576. require(1)
  577. jump(stack.Pop())
  578. continue
  579. case JUMPI:
  580. require(2)
  581. cond, pos := stack.Popn()
  582. if cond.Cmp(ethutil.BigTrue) >= 0 {
  583. jump(pos)
  584. continue
  585. }
  586. case JUMPDEST:
  587. case PC:
  588. stack.Push(pc)
  589. case MSIZE:
  590. stack.Push(big.NewInt(int64(mem.Len())))
  591. case GAS:
  592. stack.Push(closure.Gas)
  593. // 0x60 range
  594. case CREATE:
  595. require(3)
  596. var (
  597. err error
  598. value = stack.Pop()
  599. size, offset = stack.Popn()
  600. input = mem.Get(offset.Int64(), size.Int64())
  601. gas = new(big.Int).Set(closure.Gas)
  602. // Snapshot the current stack so we are able to
  603. // revert back to it later.
  604. //snapshot = self.env.State().Copy()
  605. )
  606. // Generate a new address
  607. n := state.GetNonce(closure.Address())
  608. addr := ethcrypto.CreateAddress(closure.Address(), n)
  609. state.SetNonce(closure.Address(), n+1)
  610. self.Printf(" (*) %x", addr).Endl()
  611. closure.UseGas(closure.Gas)
  612. msg := NewExecution(self, addr, input, gas, closure.Price, value)
  613. ret, err := msg.Create(closure)
  614. if err != nil {
  615. stack.Push(ethutil.BigFalse)
  616. // Revert the state as it was before.
  617. //self.env.State().Set(snapshot)
  618. self.Printf("CREATE err %v", err)
  619. } else {
  620. msg.object.Code = ret
  621. stack.Push(ethutil.BigD(addr))
  622. }
  623. self.Endl()
  624. // Debug hook
  625. if self.Dbg != nil {
  626. self.Dbg.SetCode(closure.Code)
  627. }
  628. case CALL, CALLCODE:
  629. require(7)
  630. self.Endl()
  631. gas := stack.Pop()
  632. // Pop gas and value of the stack.
  633. value, addr := stack.Popn()
  634. // Pop input size and offset
  635. inSize, inOffset := stack.Popn()
  636. // Pop return size and offset
  637. retSize, retOffset := stack.Popn()
  638. // Get the arguments from the memory
  639. args := mem.Get(inOffset.Int64(), inSize.Int64())
  640. var executeAddr []byte
  641. if op == CALLCODE {
  642. executeAddr = closure.Address()
  643. } else {
  644. executeAddr = addr.Bytes()
  645. }
  646. msg := NewExecution(self, executeAddr, args, gas, closure.Price, value)
  647. ret, err := msg.Exec(addr.Bytes(), closure)
  648. if err != nil {
  649. stack.Push(ethutil.BigFalse)
  650. vmlogger.Debugln(err)
  651. } else {
  652. stack.Push(ethutil.BigTrue)
  653. mem.Set(retOffset.Int64(), retSize.Int64(), ret)
  654. }
  655. self.Printf("resume %x", closure.Address())
  656. // Debug hook
  657. if self.Dbg != nil {
  658. self.Dbg.SetCode(closure.Code)
  659. }
  660. case RETURN:
  661. require(2)
  662. size, offset := stack.Popn()
  663. ret := mem.Get(offset.Int64(), size.Int64())
  664. self.Printf(" => (%d) 0x%x", len(ret), ret).Endl()
  665. return closure.Return(ret), nil
  666. case SUICIDE:
  667. require(1)
  668. receiver := state.GetOrNewStateObject(stack.Pop().Bytes())
  669. receiver.AddAmount(state.GetBalance(closure.Address()))
  670. state.Delete(closure.Address())
  671. fallthrough
  672. case STOP: // Stop the closure
  673. self.Endl()
  674. return closure.Return(nil), nil
  675. default:
  676. vmlogger.Debugf("(pc) %-3v Invalid opcode %x\n", pc, op)
  677. //panic(fmt.Sprintf("Invalid opcode %x", op))
  678. closure.ReturnGas(big.NewInt(1), nil)
  679. return closure.Return(nil), fmt.Errorf("Invalid opcode %x", op)
  680. }
  681. pc.Add(pc, ethutil.Big1)
  682. self.Endl()
  683. if self.Dbg != nil {
  684. for _, instrNo := range self.Dbg.BreakPoints() {
  685. if pc.Cmp(big.NewInt(instrNo)) == 0 {
  686. self.Stepping = true
  687. if !self.Dbg.BreakHook(prevStep, op, mem, stack, state.GetStateObject(closure.Address())) {
  688. return nil, nil
  689. }
  690. } else if self.Stepping {
  691. if !self.Dbg.StepHook(prevStep, op, mem, stack, state.GetStateObject(closure.Address())) {
  692. return nil, nil
  693. }
  694. }
  695. }
  696. }
  697. }
  698. }
  699. func (self *DebugVm) Printf(format string, v ...interface{}) VirtualMachine {
  700. if self.logTy == LogTyPretty {
  701. self.logStr += fmt.Sprintf(format, v...)
  702. }
  703. return self
  704. }
  705. func (self *DebugVm) Endl() VirtualMachine {
  706. if self.logTy == LogTyPretty {
  707. vmlogger.Debugln(self.logStr)
  708. self.logStr = ""
  709. }
  710. return self
  711. }
  712. func (self *DebugVm) Env() Environment {
  713. return self.env
  714. }
  715. func (self *DebugVm) Depth() int {
  716. return self.depth
  717. }