stack.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package ethchain
  2. import (
  3. "fmt"
  4. "math/big"
  5. )
  6. type OpCode int
  7. // Op codes
  8. const (
  9. oSTOP OpCode = iota
  10. oADD
  11. oMUL
  12. oSUB
  13. oDIV
  14. oSDIV
  15. oMOD
  16. oSMOD
  17. oEXP
  18. oNEG
  19. oLT
  20. oLE
  21. oGT
  22. oGE
  23. oEQ
  24. oNOT
  25. oMYADDRESS
  26. oTXSENDER
  27. oTXVALUE
  28. oTXFEE
  29. oTXDATAN
  30. oTXDATA
  31. oBLK_PREVHASH
  32. oBLK_COINBASE
  33. oBLK_TIMESTAMP
  34. oBLK_NUMBER
  35. oBLK_DIFFICULTY
  36. oBASEFEE
  37. oSHA256 OpCode = 32
  38. oRIPEMD160 OpCode = 33
  39. oECMUL OpCode = 34
  40. oECADD OpCode = 35
  41. oECSIGN OpCode = 36
  42. oECRECOVER OpCode = 37
  43. oECVALID OpCode = 38
  44. oSHA3 OpCode = 39
  45. oPUSH OpCode = 48
  46. oPOP OpCode = 49
  47. oDUP OpCode = 50
  48. oSWAP OpCode = 51
  49. oMLOAD OpCode = 52
  50. oMSTORE OpCode = 53
  51. oSLOAD OpCode = 54
  52. oSSTORE OpCode = 55
  53. oJMP OpCode = 56
  54. oJMPI OpCode = 57
  55. oIND OpCode = 58
  56. oEXTRO OpCode = 59
  57. oBALANCE OpCode = 60
  58. oMKTX OpCode = 61
  59. oSUICIDE OpCode = 62
  60. )
  61. // Since the opcodes aren't all in order we can't use a regular slice
  62. var opCodeToString = map[OpCode]string{
  63. oSTOP: "STOP",
  64. oADD: "ADD",
  65. oMUL: "MUL",
  66. oSUB: "SUB",
  67. oDIV: "DIV",
  68. oSDIV: "SDIV",
  69. oMOD: "MOD",
  70. oSMOD: "SMOD",
  71. oEXP: "EXP",
  72. oNEG: "NEG",
  73. oLT: "LT",
  74. oLE: "LE",
  75. oGT: "GT",
  76. oGE: "GE",
  77. oEQ: "EQ",
  78. oNOT: "NOT",
  79. oMYADDRESS: "MYADDRESS",
  80. oTXSENDER: "TXSENDER",
  81. oTXVALUE: "TXVALUE",
  82. oTXFEE: "TXFEE",
  83. oTXDATAN: "TXDATAN",
  84. oTXDATA: "TXDATA",
  85. oBLK_PREVHASH: "BLK_PREVHASH",
  86. oBLK_COINBASE: "BLK_COINBASE",
  87. oBLK_TIMESTAMP: "BLK_TIMESTAMP",
  88. oBLK_NUMBER: "BLK_NUMBER",
  89. oBLK_DIFFICULTY: "BLK_DIFFICULTY",
  90. oBASEFEE: "BASEFEE",
  91. oSHA256: "SHA256",
  92. oRIPEMD160: "RIPEMD160",
  93. oECMUL: "ECMUL",
  94. oECADD: "ECADD",
  95. oECSIGN: "ECSIGN",
  96. oECRECOVER: "ECRECOVER",
  97. oECVALID: "ECVALID",
  98. oSHA3: "SHA3",
  99. oPUSH: "PUSH",
  100. oPOP: "POP",
  101. oDUP: "DUP",
  102. oSWAP: "SWAP",
  103. oMLOAD: "MLOAD",
  104. oMSTORE: "MSTORE",
  105. oSLOAD: "SLOAD",
  106. oSSTORE: "SSTORE",
  107. oJMP: "JMP",
  108. oJMPI: "JMPI",
  109. oIND: "IND",
  110. oEXTRO: "EXTRO",
  111. oBALANCE: "BALANCE",
  112. oMKTX: "MKTX",
  113. oSUICIDE: "SUICIDE",
  114. }
  115. func (o OpCode) String() string {
  116. return opCodeToString[o]
  117. }
  118. type OpType int
  119. const (
  120. tNorm = iota
  121. tData
  122. tExtro
  123. tCrypto
  124. )
  125. type TxCallback func(opType OpType) bool
  126. // Simple push/pop stack mechanism
  127. type Stack struct {
  128. data []*big.Int
  129. }
  130. func NewStack() *Stack {
  131. return &Stack{}
  132. }
  133. func (st *Stack) Pop() *big.Int {
  134. s := len(st.data)
  135. str := st.data[s-1]
  136. st.data = st.data[:s-1]
  137. return str
  138. }
  139. func (st *Stack) Popn() (*big.Int, *big.Int) {
  140. s := len(st.data)
  141. ints := st.data[s-2:]
  142. st.data = st.data[:s-2]
  143. return ints[0], ints[1]
  144. }
  145. func (st *Stack) Push(d *big.Int) {
  146. st.data = append(st.data, d)
  147. }
  148. func (st *Stack) Print() {
  149. fmt.Println(st.data)
  150. }