vm.go 23 KB

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