vm.go 24 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024
  1. package vm
  2. import (
  3. "fmt"
  4. "math/big"
  5. "github.com/ethereum/go-ethereum/crypto"
  6. "github.com/ethereum/go-ethereum/ethutil"
  7. "github.com/ethereum/go-ethereum/state"
  8. )
  9. type Vm struct {
  10. env Environment
  11. logTy byte
  12. logStr string
  13. err error
  14. // For logging
  15. debug bool
  16. Dbg Debugger
  17. BreakPoints []int64
  18. Stepping bool
  19. Fn string
  20. Recoverable bool
  21. }
  22. func New(env Environment) *Vm {
  23. lt := LogTyPretty
  24. if ethutil.Config.Diff {
  25. lt = LogTyDiff
  26. }
  27. return &Vm{debug: true, env: env, logTy: lt, Recoverable: true}
  28. }
  29. func (self *Vm) Run(me, caller ContextRef, code []byte, value, gas, price *big.Int, callData []byte) (ret []byte, err error) {
  30. self.env.SetDepth(self.env.Depth() + 1)
  31. context := NewContext(caller, me, code, gas, price)
  32. vmlogger.Debugf("(%d) (%x) %x (code=%d) gas: %v (d) %x\n", self.env.Depth(), caller.Address()[:4], context.Address(), len(code), context.Gas, callData)
  33. if self.Recoverable {
  34. // Recover from any require exception
  35. defer func() {
  36. if r := recover(); r != nil {
  37. self.Printf(" %v", r).Endl()
  38. context.UseGas(context.Gas)
  39. ret = context.Return(nil)
  40. err = fmt.Errorf("%v", r)
  41. }
  42. }()
  43. }
  44. if p := Precompiled[string(me.Address())]; p != nil {
  45. return self.RunPrecompiled(p, callData, context)
  46. }
  47. var (
  48. op OpCode
  49. destinations = analyseJumpDests(context.Code)
  50. mem = NewMemory()
  51. stack = NewStack()
  52. pc uint64 = 0
  53. step = 0
  54. prevStep = 0
  55. statedb = self.env.State()
  56. jump = func(from uint64, to *big.Int) {
  57. p := to.Uint64()
  58. nop := context.GetOp(p)
  59. if !destinations.Has(p) {
  60. panic(fmt.Sprintf("invalid jump destination (%v) %v", nop, p))
  61. }
  62. self.Printf(" ~> %v", to)
  63. pc = to.Uint64()
  64. self.Endl()
  65. }
  66. )
  67. // Don't bother with the execution if there's no code.
  68. if len(code) == 0 {
  69. return context.Return(nil), nil
  70. }
  71. for {
  72. prevStep = step
  73. // The base for all big integer arithmetic
  74. base := new(big.Int)
  75. step++
  76. // Get the memory location of pc
  77. op = context.GetOp(pc)
  78. self.Printf("(pc) %-3d -o- %-14s (m) %-4d (s) %-4d ", pc, op.String(), mem.Len(), stack.Len())
  79. if self.Dbg != nil {
  80. //self.Dbg.Step(self, op, mem, stack, context)
  81. }
  82. newMemSize, gas := self.calculateGasAndSize(context, caller, op, statedb, mem, stack)
  83. self.Printf("(g) %-3v (%v)", gas, context.Gas)
  84. if !context.UseGas(gas) {
  85. self.Endl()
  86. tmp := new(big.Int).Set(context.Gas)
  87. context.UseGas(context.Gas)
  88. return context.Return(nil), OOG(gas, tmp)
  89. }
  90. mem.Resize(newMemSize.Uint64())
  91. switch op {
  92. // 0x20 range
  93. case ADD:
  94. x, y := stack.Popn()
  95. self.Printf(" %v + %v", y, x)
  96. base.Add(y, x)
  97. U256(base)
  98. self.Printf(" = %v", base)
  99. // Pop result back on the stack
  100. stack.Push(base)
  101. case SUB:
  102. x, y := stack.Popn()
  103. self.Printf(" %v - %v", y, x)
  104. base.Sub(y, x)
  105. U256(base)
  106. self.Printf(" = %v", base)
  107. // Pop result back on the stack
  108. stack.Push(base)
  109. case MUL:
  110. x, y := stack.Popn()
  111. self.Printf(" %v * %v", y, x)
  112. base.Mul(y, x)
  113. U256(base)
  114. self.Printf(" = %v", base)
  115. // Pop result back on the stack
  116. stack.Push(base)
  117. case DIV:
  118. x, y := stack.Pop(), stack.Pop()
  119. self.Printf(" %v / %v", x, y)
  120. if y.Cmp(ethutil.Big0) != 0 {
  121. base.Div(x, y)
  122. }
  123. U256(base)
  124. self.Printf(" = %v", base)
  125. // Pop result back on the stack
  126. stack.Push(base)
  127. case SDIV:
  128. x, y := S256(stack.Pop()), S256(stack.Pop())
  129. self.Printf(" %v / %v", x, y)
  130. if y.Cmp(ethutil.Big0) == 0 {
  131. base.Set(ethutil.Big0)
  132. } else {
  133. n := new(big.Int)
  134. if new(big.Int).Mul(x, y).Cmp(ethutil.Big0) < 0 {
  135. n.SetInt64(-1)
  136. } else {
  137. n.SetInt64(1)
  138. }
  139. base.Div(x.Abs(x), y.Abs(y)).Mul(base, n)
  140. U256(base)
  141. }
  142. self.Printf(" = %v", base)
  143. stack.Push(base)
  144. case MOD:
  145. x, y := stack.Pop(), stack.Pop()
  146. self.Printf(" %v %% %v", x, y)
  147. if y.Cmp(ethutil.Big0) == 0 {
  148. base.Set(ethutil.Big0)
  149. } else {
  150. base.Mod(x, y)
  151. }
  152. U256(base)
  153. self.Printf(" = %v", base)
  154. stack.Push(base)
  155. case SMOD:
  156. x, y := S256(stack.Pop()), S256(stack.Pop())
  157. self.Printf(" %v %% %v", x, y)
  158. if y.Cmp(ethutil.Big0) == 0 {
  159. base.Set(ethutil.Big0)
  160. } else {
  161. n := new(big.Int)
  162. if x.Cmp(ethutil.Big0) < 0 {
  163. n.SetInt64(-1)
  164. } else {
  165. n.SetInt64(1)
  166. }
  167. base.Mod(x.Abs(x), y.Abs(y)).Mul(base, n)
  168. U256(base)
  169. }
  170. self.Printf(" = %v", base)
  171. stack.Push(base)
  172. case EXP:
  173. x, y := stack.Popn()
  174. self.Printf(" %v ** %v", y, x)
  175. base.Exp(y, x, Pow256)
  176. U256(base)
  177. self.Printf(" = %v", base)
  178. stack.Push(base)
  179. case SIGNEXTEND:
  180. back := stack.Pop().Uint64()
  181. if back < 31 {
  182. bit := uint(back*8 + 7)
  183. num := stack.Pop()
  184. mask := new(big.Int).Lsh(ethutil.Big1, bit)
  185. mask.Sub(mask, ethutil.Big1)
  186. if ethutil.BitTest(num, int(bit)) {
  187. num.Or(num, mask.Not(mask))
  188. } else {
  189. num.And(num, mask)
  190. }
  191. num = U256(num)
  192. self.Printf(" = %v", num)
  193. stack.Push(num)
  194. }
  195. case NOT:
  196. base.Sub(Pow256, stack.Pop()).Sub(base, ethutil.Big1)
  197. // Not needed
  198. base = U256(base)
  199. stack.Push(base)
  200. case LT:
  201. x, y := stack.Popn()
  202. self.Printf(" %v < %v", y, x)
  203. // x < y
  204. if y.Cmp(x) < 0 {
  205. stack.Push(ethutil.BigTrue)
  206. } else {
  207. stack.Push(ethutil.BigFalse)
  208. }
  209. case GT:
  210. x, y := stack.Popn()
  211. self.Printf(" %v > %v", y, x)
  212. // x > y
  213. if y.Cmp(x) > 0 {
  214. stack.Push(ethutil.BigTrue)
  215. } else {
  216. stack.Push(ethutil.BigFalse)
  217. }
  218. case SLT:
  219. y, x := S256(stack.Pop()), S256(stack.Pop())
  220. self.Printf(" %v < %v", y, x)
  221. // x < y
  222. if y.Cmp(S256(x)) < 0 {
  223. stack.Push(ethutil.BigTrue)
  224. } else {
  225. stack.Push(ethutil.BigFalse)
  226. }
  227. case SGT:
  228. y, x := S256(stack.Pop()), S256(stack.Pop())
  229. self.Printf(" %v > %v", y, x)
  230. // x > y
  231. if y.Cmp(x) > 0 {
  232. stack.Push(ethutil.BigTrue)
  233. } else {
  234. stack.Push(ethutil.BigFalse)
  235. }
  236. case EQ:
  237. x, y := stack.Popn()
  238. self.Printf(" %v == %v", y, x)
  239. // x == y
  240. if x.Cmp(y) == 0 {
  241. stack.Push(ethutil.BigTrue)
  242. } else {
  243. stack.Push(ethutil.BigFalse)
  244. }
  245. case ISZERO:
  246. x := stack.Pop()
  247. if x.Cmp(ethutil.BigFalse) > 0 {
  248. stack.Push(ethutil.BigFalse)
  249. } else {
  250. stack.Push(ethutil.BigTrue)
  251. }
  252. // 0x10 range
  253. case AND:
  254. x, y := stack.Popn()
  255. self.Printf(" %v & %v", y, x)
  256. stack.Push(base.And(y, x))
  257. case OR:
  258. x, y := stack.Popn()
  259. self.Printf(" %v | %v", y, x)
  260. stack.Push(base.Or(y, x))
  261. case XOR:
  262. x, y := stack.Popn()
  263. self.Printf(" %v ^ %v", y, x)
  264. stack.Push(base.Xor(y, x))
  265. case BYTE:
  266. val, th := stack.Popn()
  267. if th.Cmp(big.NewInt(32)) < 0 {
  268. byt := big.NewInt(int64(ethutil.LeftPadBytes(val.Bytes(), 32)[th.Int64()]))
  269. base.Set(byt)
  270. } else {
  271. base.Set(ethutil.BigFalse)
  272. }
  273. self.Printf(" => 0x%x", base.Bytes())
  274. stack.Push(base)
  275. case ADDMOD:
  276. x := stack.Pop()
  277. y := stack.Pop()
  278. z := stack.Pop()
  279. add := new(big.Int).Add(x, y)
  280. if len(z.Bytes()) > 0 { // NOT 0x0
  281. base.Mod(add, z)
  282. U256(base)
  283. }
  284. self.Printf(" %v + %v %% %v = %v", x, y, z, base)
  285. stack.Push(base)
  286. case MULMOD:
  287. x := stack.Pop()
  288. y := stack.Pop()
  289. z := stack.Pop()
  290. mul := new(big.Int).Mul(x, y)
  291. if len(z.Bytes()) > 0 { // NOT 0x0
  292. base.Mod(mul, z)
  293. U256(base)
  294. }
  295. self.Printf(" %v + %v %% %v = %v", x, y, z, base)
  296. stack.Push(base)
  297. // 0x20 range
  298. case SHA3:
  299. size, offset := stack.Popn()
  300. data := crypto.Sha3(mem.Get(offset.Int64(), size.Int64()))
  301. stack.Push(ethutil.BigD(data))
  302. self.Printf(" => (%v) %x", size, data)
  303. // 0x30 range
  304. case ADDRESS:
  305. stack.Push(ethutil.BigD(context.Address()))
  306. self.Printf(" => %x", context.Address())
  307. case BALANCE:
  308. addr := stack.Pop().Bytes()
  309. var balance *big.Int
  310. if statedb.GetStateObject(addr) != nil {
  311. balance = statedb.GetBalance(addr)
  312. } else {
  313. balance = base
  314. }
  315. stack.Push(balance)
  316. self.Printf(" => %v (%x)", balance, addr)
  317. case ORIGIN:
  318. origin := self.env.Origin()
  319. stack.Push(ethutil.BigD(origin))
  320. self.Printf(" => %x", origin)
  321. case CALLER:
  322. caller := context.caller.Address()
  323. stack.Push(ethutil.BigD(caller))
  324. self.Printf(" => %x", caller)
  325. case CALLVALUE:
  326. stack.Push(value)
  327. self.Printf(" => %v", value)
  328. case CALLDATALOAD:
  329. var (
  330. offset = stack.Pop()
  331. data = make([]byte, 32)
  332. lenData = big.NewInt(int64(len(callData)))
  333. )
  334. if lenData.Cmp(offset) >= 0 {
  335. length := new(big.Int).Add(offset, ethutil.Big32)
  336. length = ethutil.BigMin(length, lenData)
  337. copy(data, callData[offset.Int64():length.Int64()])
  338. }
  339. self.Printf(" => 0x%x", data)
  340. stack.Push(ethutil.BigD(data))
  341. case CALLDATASIZE:
  342. l := int64(len(callData))
  343. stack.Push(big.NewInt(l))
  344. self.Printf(" => %d", l)
  345. case CALLDATACOPY:
  346. var (
  347. size = uint64(len(callData))
  348. mOff = stack.Pop().Uint64()
  349. cOff = stack.Pop().Uint64()
  350. l = stack.Pop().Uint64()
  351. )
  352. if cOff > size {
  353. cOff = 0
  354. l = 0
  355. } else if cOff+l > size {
  356. l = 0
  357. }
  358. code := callData[cOff : cOff+l]
  359. mem.Set(mOff, l, code)
  360. self.Printf(" => [%v, %v, %v] %x", mOff, cOff, l, callData[cOff:cOff+l])
  361. case CODESIZE, EXTCODESIZE:
  362. var code []byte
  363. if op == EXTCODESIZE {
  364. addr := stack.Pop().Bytes()
  365. code = statedb.GetCode(addr)
  366. } else {
  367. code = context.Code
  368. }
  369. l := big.NewInt(int64(len(code)))
  370. stack.Push(l)
  371. self.Printf(" => %d", l)
  372. case CODECOPY, EXTCODECOPY:
  373. var code []byte
  374. if op == EXTCODECOPY {
  375. code = statedb.GetCode(stack.Pop().Bytes())
  376. } else {
  377. code = context.Code
  378. }
  379. context := NewContext(nil, nil, code, ethutil.Big0, ethutil.Big0)
  380. var (
  381. mOff = stack.Pop().Uint64()
  382. cOff = stack.Pop().Uint64()
  383. l = stack.Pop().Uint64()
  384. )
  385. codeCopy := context.GetCode(cOff, l)
  386. mem.Set(mOff, l, codeCopy)
  387. self.Printf(" => [%v, %v, %v] %x", mOff, cOff, l, codeCopy)
  388. case GASPRICE:
  389. stack.Push(context.Price)
  390. self.Printf(" => %x", context.Price)
  391. // 0x40 range
  392. case BLOCKHASH:
  393. num := stack.Pop()
  394. n := new(big.Int).Sub(self.env.BlockNumber(), ethutil.Big257)
  395. if num.Cmp(n) > 0 && num.Cmp(self.env.BlockNumber()) < 0 {
  396. stack.Push(ethutil.BigD(self.env.GetHash(num.Uint64())))
  397. } else {
  398. stack.Push(ethutil.Big0)
  399. }
  400. self.Printf(" => 0x%x", stack.Peek().Bytes())
  401. case COINBASE:
  402. coinbase := self.env.Coinbase()
  403. stack.Push(ethutil.BigD(coinbase))
  404. self.Printf(" => 0x%x", coinbase)
  405. case TIMESTAMP:
  406. time := self.env.Time()
  407. stack.Push(big.NewInt(time))
  408. self.Printf(" => 0x%x", time)
  409. case NUMBER:
  410. number := self.env.BlockNumber()
  411. stack.Push(U256(number))
  412. self.Printf(" => 0x%x", number.Bytes())
  413. case DIFFICULTY:
  414. difficulty := self.env.Difficulty()
  415. stack.Push(difficulty)
  416. self.Printf(" => 0x%x", difficulty.Bytes())
  417. case GASLIMIT:
  418. self.Printf(" => %v", self.env.GasLimit())
  419. stack.Push(self.env.GasLimit())
  420. // 0x50 range
  421. 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:
  422. a := uint64(op - PUSH1 + 1)
  423. byts := context.GetRangeValue(pc+1, a)
  424. // Push value to stack
  425. stack.Push(ethutil.BigD(byts))
  426. pc += a
  427. step += int(op) - int(PUSH1) + 1
  428. self.Printf(" => 0x%x", byts)
  429. case POP:
  430. stack.Pop()
  431. case DUP1, DUP2, DUP3, DUP4, DUP5, DUP6, DUP7, DUP8, DUP9, DUP10, DUP11, DUP12, DUP13, DUP14, DUP15, DUP16:
  432. n := int(op - DUP1 + 1)
  433. stack.Dupn(n)
  434. self.Printf(" => [%d] 0x%x", n, stack.Peek().Bytes())
  435. case SWAP1, SWAP2, SWAP3, SWAP4, SWAP5, SWAP6, SWAP7, SWAP8, SWAP9, SWAP10, SWAP11, SWAP12, SWAP13, SWAP14, SWAP15, SWAP16:
  436. n := int(op - SWAP1 + 2)
  437. x, y := stack.Swapn(n)
  438. self.Printf(" => [%d] %x [0] %x", n, x.Bytes(), y.Bytes())
  439. case LOG0, LOG1, LOG2, LOG3, LOG4:
  440. n := int(op - LOG0)
  441. topics := make([][]byte, n)
  442. mSize, mStart := stack.Popn()
  443. for i := 0; i < n; i++ {
  444. topics[i] = ethutil.LeftPadBytes(stack.Pop().Bytes(), 32)
  445. }
  446. data := mem.Get(mStart.Int64(), mSize.Int64())
  447. log := &Log{context.Address(), topics, data, self.env.BlockNumber().Uint64()}
  448. self.env.AddLog(log)
  449. self.Printf(" => %v", log)
  450. case MLOAD:
  451. offset := stack.Pop()
  452. val := ethutil.BigD(mem.Get(offset.Int64(), 32))
  453. stack.Push(val)
  454. self.Printf(" => 0x%x", val.Bytes())
  455. case MSTORE: // Store the value at stack top-1 in to memory at location stack top
  456. // Pop value of the stack
  457. val, mStart := stack.Popn()
  458. mem.Set(mStart.Uint64(), 32, ethutil.BigToBytes(val, 256))
  459. self.Printf(" => 0x%x", val)
  460. case MSTORE8:
  461. off := stack.Pop()
  462. val := stack.Pop()
  463. mem.store[off.Int64()] = byte(val.Int64() & 0xff)
  464. self.Printf(" => [%v] 0x%x", off, val)
  465. case SLOAD:
  466. loc := stack.Pop()
  467. val := ethutil.BigD(statedb.GetState(context.Address(), loc.Bytes()))
  468. stack.Push(val)
  469. self.Printf(" {0x%x : 0x%x}", loc.Bytes(), val.Bytes())
  470. case SSTORE:
  471. val, loc := stack.Popn()
  472. statedb.SetState(context.Address(), loc.Bytes(), val)
  473. self.Printf(" {0x%x : 0x%x}", loc.Bytes(), val.Bytes())
  474. case JUMP:
  475. jump(pc, stack.Pop())
  476. continue
  477. case JUMPI:
  478. cond, pos := stack.Popn()
  479. if cond.Cmp(ethutil.BigTrue) >= 0 {
  480. jump(pc, pos)
  481. continue
  482. }
  483. self.Printf(" ~> false")
  484. case JUMPDEST:
  485. case PC:
  486. stack.Push(big.NewInt(int64(pc)))
  487. case MSIZE:
  488. stack.Push(big.NewInt(int64(mem.Len())))
  489. case GAS:
  490. stack.Push(context.Gas)
  491. self.Printf(" => %x", context.Gas)
  492. // 0x60 range
  493. case CREATE:
  494. var (
  495. value = stack.Pop()
  496. size, offset = stack.Popn()
  497. input = mem.Get(offset.Int64(), size.Int64())
  498. gas = new(big.Int).Set(context.Gas)
  499. addr []byte
  500. )
  501. self.Endl()
  502. context.UseGas(context.Gas)
  503. ret, suberr, ref := self.env.Create(context, nil, input, gas, price, value)
  504. if suberr != nil {
  505. stack.Push(ethutil.BigFalse)
  506. self.Printf(" (*) 0x0 %v", suberr)
  507. } else {
  508. // gas < len(ret) * CreateDataGas == NO_CODE
  509. dataGas := big.NewInt(int64(len(ret)))
  510. dataGas.Mul(dataGas, GasCreateByte)
  511. if context.UseGas(dataGas) {
  512. ref.SetCode(ret)
  513. }
  514. addr = ref.Address()
  515. stack.Push(ethutil.BigD(addr))
  516. }
  517. // Debug hook
  518. if self.Dbg != nil {
  519. self.Dbg.SetCode(context.Code)
  520. }
  521. case CALL, CALLCODE:
  522. gas := stack.Pop()
  523. // Pop gas and value of the stack.
  524. value, addr := stack.Popn()
  525. value = U256(value)
  526. // Pop input size and offset
  527. inSize, inOffset := stack.Popn()
  528. // Pop return size and offset
  529. retSize, retOffset := stack.Popn()
  530. address := ethutil.Address(addr.Bytes())
  531. self.Printf(" => %x", address).Endl()
  532. // Get the arguments from the memory
  533. args := mem.Get(inOffset.Int64(), inSize.Int64())
  534. if len(value.Bytes()) > 0 {
  535. gas.Add(gas, GasStipend)
  536. }
  537. var (
  538. ret []byte
  539. err error
  540. )
  541. if op == CALLCODE {
  542. ret, err = self.env.CallCode(context, address, args, gas, price, value)
  543. } else {
  544. ret, err = self.env.Call(context, address, args, gas, price, value)
  545. }
  546. if err != nil {
  547. stack.Push(ethutil.BigFalse)
  548. vmlogger.Debugln(err)
  549. } else {
  550. stack.Push(ethutil.BigTrue)
  551. mem.Set(retOffset.Uint64(), retSize.Uint64(), ret)
  552. }
  553. self.Printf("resume %x (%v)", context.Address(), context.Gas)
  554. // Debug hook
  555. if self.Dbg != nil {
  556. self.Dbg.SetCode(context.Code)
  557. }
  558. case RETURN:
  559. size, offset := stack.Popn()
  560. ret := mem.Get(offset.Int64(), size.Int64())
  561. self.Printf(" => [%v, %v] (%d) 0x%x", offset, size, len(ret), ret).Endl()
  562. return context.Return(ret), nil
  563. case SUICIDE:
  564. receiver := statedb.GetOrNewStateObject(stack.Pop().Bytes())
  565. balance := statedb.GetBalance(context.Address())
  566. self.Printf(" => (%x) %v", receiver.Address()[:4], balance)
  567. receiver.AddBalance(balance)
  568. statedb.Delete(context.Address())
  569. fallthrough
  570. case STOP: // Stop the context
  571. self.Endl()
  572. return context.Return(nil), nil
  573. default:
  574. vmlogger.Debugf("(pc) %-3v Invalid opcode %x\n", pc, op)
  575. panic(fmt.Errorf("Invalid opcode %x", op))
  576. }
  577. pc++
  578. self.Endl()
  579. if self.Dbg != nil {
  580. for _, instrNo := range self.Dbg.BreakPoints() {
  581. if pc == uint64(instrNo) {
  582. self.Stepping = true
  583. if !self.Dbg.BreakHook(prevStep, op, mem, stack, statedb.GetStateObject(context.Address())) {
  584. return nil, nil
  585. }
  586. } else if self.Stepping {
  587. if !self.Dbg.StepHook(prevStep, op, mem, stack, statedb.GetStateObject(context.Address())) {
  588. return nil, nil
  589. }
  590. }
  591. }
  592. }
  593. }
  594. }
  595. type req struct {
  596. stack int
  597. gas *big.Int
  598. }
  599. var _baseCheck = map[OpCode]req{
  600. // Req Stack Gas price
  601. ADD: {2, GasFastestStep},
  602. LT: {2, GasFastestStep},
  603. GT: {2, GasFastestStep},
  604. SLT: {2, GasFastestStep},
  605. SGT: {2, GasFastestStep},
  606. EQ: {2, GasFastestStep},
  607. ISZERO: {1, GasFastestStep},
  608. SUB: {2, GasFastestStep},
  609. AND: {2, GasFastestStep},
  610. OR: {2, GasFastestStep},
  611. XOR: {2, GasFastestStep},
  612. NOT: {1, GasFastestStep},
  613. BYTE: {2, GasFastestStep},
  614. CALLDATALOAD: {1, GasFastestStep},
  615. CALLDATACOPY: {3, GasFastestStep},
  616. MLOAD: {1, GasFastestStep},
  617. MSTORE: {2, GasFastestStep},
  618. MSTORE8: {2, GasFastestStep},
  619. CODECOPY: {3, GasFastestStep},
  620. MUL: {2, GasFastStep},
  621. DIV: {2, GasFastStep},
  622. SDIV: {2, GasFastStep},
  623. MOD: {2, GasFastStep},
  624. SMOD: {2, GasFastStep},
  625. SIGNEXTEND: {2, GasFastStep},
  626. ADDMOD: {3, GasMidStep},
  627. MULMOD: {3, GasMidStep},
  628. JUMP: {1, GasMidStep},
  629. JUMPI: {2, GasSlowStep},
  630. EXP: {2, GasSlowStep},
  631. ADDRESS: {0, GasQuickStep},
  632. ORIGIN: {0, GasQuickStep},
  633. CALLER: {0, GasQuickStep},
  634. CALLVALUE: {0, GasQuickStep},
  635. CODESIZE: {0, GasQuickStep},
  636. GASPRICE: {0, GasQuickStep},
  637. COINBASE: {0, GasQuickStep},
  638. TIMESTAMP: {0, GasQuickStep},
  639. NUMBER: {0, GasQuickStep},
  640. CALLDATASIZE: {0, GasQuickStep},
  641. DIFFICULTY: {0, GasQuickStep},
  642. GASLIMIT: {0, GasQuickStep},
  643. POP: {0, GasQuickStep},
  644. PC: {0, GasQuickStep},
  645. MSIZE: {0, GasQuickStep},
  646. GAS: {0, GasQuickStep},
  647. BLOCKHASH: {1, GasExtStep},
  648. BALANCE: {0, GasExtStep},
  649. EXTCODESIZE: {1, GasExtStep},
  650. EXTCODECOPY: {4, GasExtStep},
  651. SLOAD: {1, GasStorageGet},
  652. SSTORE: {2, Zero},
  653. SHA3: {1, GasSha3Base},
  654. CREATE: {3, GasCreate},
  655. CALL: {7, GasCall},
  656. CALLCODE: {7, GasCall},
  657. JUMPDEST: {0, GasJumpDest},
  658. SUICIDE: {1, Zero},
  659. RETURN: {2, Zero},
  660. }
  661. func baseCheck(op OpCode, stack *Stack, gas *big.Int) {
  662. if r, ok := _baseCheck[op]; ok {
  663. stack.require(r.stack)
  664. gas.Add(gas, r.gas)
  665. }
  666. }
  667. func toWordSize(size *big.Int) *big.Int {
  668. tmp := new(big.Int)
  669. tmp.Add(size, u256(31))
  670. tmp.Div(tmp, u256(32))
  671. return tmp
  672. }
  673. func (self *Vm) calculateGasAndSize(context *Context, caller ContextRef, op OpCode, statedb *state.StateDB, mem *Memory, stack *Stack) (*big.Int, *big.Int) {
  674. var (
  675. gas = new(big.Int)
  676. newMemSize *big.Int = new(big.Int)
  677. )
  678. baseCheck(op, stack, gas)
  679. // Stack Check, memory resize & gas phase
  680. switch op {
  681. 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:
  682. gas.Set(GasFastestStep)
  683. case SWAP1, SWAP2, SWAP3, SWAP4, SWAP5, SWAP6, SWAP7, SWAP8, SWAP9, SWAP10, SWAP11, SWAP12, SWAP13, SWAP14, SWAP15, SWAP16:
  684. n := int(op - SWAP1 + 2)
  685. stack.require(n)
  686. gas.Set(GasFastestStep)
  687. case DUP1, DUP2, DUP3, DUP4, DUP5, DUP6, DUP7, DUP8, DUP9, DUP10, DUP11, DUP12, DUP13, DUP14, DUP15, DUP16:
  688. n := int(op - DUP1 + 1)
  689. stack.require(n)
  690. gas.Set(GasFastestStep)
  691. case LOG0, LOG1, LOG2, LOG3, LOG4:
  692. n := int(op - LOG0)
  693. stack.require(n + 2)
  694. mSize, mStart := stack.Peekn()
  695. gas.Add(gas, GasLogBase)
  696. gas.Add(gas, new(big.Int).Mul(big.NewInt(int64(n)), GasLogTopic))
  697. gas.Add(gas, new(big.Int).Mul(mSize, GasLogByte))
  698. newMemSize = calcMemSize(mStart, mSize)
  699. case EXP:
  700. gas.Add(gas, new(big.Int).Mul(big.NewInt(int64(len(stack.data[stack.Len()-2].Bytes()))), GasExpByte))
  701. case SSTORE:
  702. stack.require(2)
  703. var g *big.Int
  704. y, x := stack.Peekn()
  705. val := statedb.GetState(context.Address(), x.Bytes())
  706. if len(val) == 0 && len(y.Bytes()) > 0 {
  707. // 0 => non 0
  708. g = GasStorageAdd
  709. } else if len(val) > 0 && len(y.Bytes()) == 0 {
  710. statedb.Refund(self.env.Origin(), RefundStorage)
  711. g = GasStorageMod
  712. } else {
  713. // non 0 => non 0 (or 0 => 0)
  714. g = GasStorageMod
  715. }
  716. gas.Set(g)
  717. case MLOAD:
  718. newMemSize = calcMemSize(stack.Peek(), u256(32))
  719. case MSTORE8:
  720. newMemSize = calcMemSize(stack.Peek(), u256(1))
  721. case MSTORE:
  722. newMemSize = calcMemSize(stack.Peek(), u256(32))
  723. case RETURN:
  724. newMemSize = calcMemSize(stack.Peek(), stack.data[stack.Len()-2])
  725. case SHA3:
  726. newMemSize = calcMemSize(stack.Peek(), stack.data[stack.Len()-2])
  727. words := toWordSize(stack.data[stack.Len()-2])
  728. gas.Add(gas, words.Mul(words, GasSha3Word))
  729. case CALLDATACOPY:
  730. newMemSize = calcMemSize(stack.Peek(), stack.data[stack.Len()-3])
  731. words := toWordSize(stack.data[stack.Len()-3])
  732. gas.Add(gas, words.Mul(words, GasCopyWord))
  733. case CODECOPY:
  734. newMemSize = calcMemSize(stack.Peek(), stack.data[stack.Len()-3])
  735. words := toWordSize(stack.data[stack.Len()-3])
  736. gas.Add(gas, words.Mul(words, GasCopyWord))
  737. case EXTCODECOPY:
  738. newMemSize = calcMemSize(stack.data[stack.Len()-2], stack.data[stack.Len()-4])
  739. words := toWordSize(stack.data[stack.Len()-4])
  740. gas.Add(gas, words.Mul(words, GasCopyWord))
  741. case CREATE:
  742. newMemSize = calcMemSize(stack.data[stack.Len()-2], stack.data[stack.Len()-3])
  743. case CALL, CALLCODE:
  744. gas.Add(gas, stack.data[stack.Len()-1])
  745. if op == CALL {
  746. if self.env.State().GetStateObject(stack.data[stack.Len()-2].Bytes()) == nil {
  747. gas.Add(gas, GasCallNewAccount)
  748. }
  749. }
  750. if len(stack.data[stack.Len()-3].Bytes()) > 0 {
  751. gas.Add(gas, GasCallValueTransfer)
  752. }
  753. x := calcMemSize(stack.data[stack.Len()-6], stack.data[stack.Len()-7])
  754. y := calcMemSize(stack.data[stack.Len()-4], stack.data[stack.Len()-5])
  755. newMemSize = ethutil.BigMax(x, y)
  756. }
  757. if newMemSize.Cmp(ethutil.Big0) > 0 {
  758. newMemSizeWords := toWordSize(newMemSize)
  759. newMemSize.Mul(newMemSizeWords, u256(32))
  760. if newMemSize.Cmp(u256(int64(mem.Len()))) > 0 {
  761. oldSize := toWordSize(big.NewInt(int64(mem.Len())))
  762. pow := new(big.Int).Exp(oldSize, ethutil.Big2, Zero)
  763. linCoef := new(big.Int).Mul(oldSize, GasMemWord)
  764. quadCoef := new(big.Int).Div(pow, GasQuadCoeffDenom)
  765. oldTotalFee := new(big.Int).Add(linCoef, quadCoef)
  766. pow.Exp(newMemSizeWords, ethutil.Big2, Zero)
  767. linCoef = new(big.Int).Mul(newMemSizeWords, GasMemWord)
  768. quadCoef = new(big.Int).Div(pow, GasQuadCoeffDenom)
  769. newTotalFee := new(big.Int).Add(linCoef, quadCoef)
  770. gas.Add(gas, new(big.Int).Sub(newTotalFee, oldTotalFee))
  771. }
  772. }
  773. return newMemSize, gas
  774. }
  775. func (self *Vm) RunPrecompiled(p *PrecompiledAccount, callData []byte, context *Context) (ret []byte, err error) {
  776. gas := p.Gas(len(callData))
  777. if context.UseGas(gas) {
  778. ret = p.Call(callData)
  779. self.Printf("NATIVE_FUNC => %x", ret)
  780. self.Endl()
  781. return context.Return(ret), nil
  782. } else {
  783. self.Printf("NATIVE_FUNC => failed").Endl()
  784. tmp := new(big.Int).Set(context.Gas)
  785. panic(OOG(gas, tmp).Error())
  786. }
  787. }
  788. func (self *Vm) Printf(format string, v ...interface{}) VirtualMachine {
  789. if self.debug {
  790. if self.logTy == LogTyPretty {
  791. self.logStr += fmt.Sprintf(format, v...)
  792. }
  793. }
  794. return self
  795. }
  796. func (self *Vm) Endl() VirtualMachine {
  797. if self.debug {
  798. if self.logTy == LogTyPretty {
  799. vmlogger.Debugln(self.logStr)
  800. self.logStr = ""
  801. }
  802. }
  803. return self
  804. }
  805. func (self *Vm) Env() Environment {
  806. return self.env
  807. }