vm.go 24 KB

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