aboutsummaryrefslogtreecommitdiffstats
path: root/stack.go
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-01-16 22:20:41 +0800
committerobscuren <geffobscura@gmail.com>2014-01-16 22:20:41 +0800
commit83396cd836f6d963573295b9304be87bf45f5ad6 (patch)
tree3fbf521946b2820cd715a848f14691efc3004331 /stack.go
parenta80a3eeb238443d4b49deda360015ab315bd14a4 (diff)
downloaddexon-83396cd836f6d963573295b9304be87bf45f5ad6.tar
dexon-83396cd836f6d963573295b9304be87bf45f5ad6.tar.gz
dexon-83396cd836f6d963573295b9304be87bf45f5ad6.tar.bz2
dexon-83396cd836f6d963573295b9304be87bf45f5ad6.tar.lz
dexon-83396cd836f6d963573295b9304be87bf45f5ad6.tar.xz
dexon-83396cd836f6d963573295b9304be87bf45f5ad6.tar.zst
dexon-83396cd836f6d963573295b9304be87bf45f5ad6.zip
Moved stack to its own file. Moved contract processing to block manager
Diffstat (limited to 'stack.go')
-rw-r--r--stack.go164
1 files changed, 164 insertions, 0 deletions
diff --git a/stack.go b/stack.go
new file mode 100644
index 000000000..2b2f075cf
--- /dev/null
+++ b/stack.go
@@ -0,0 +1,164 @@
+package main
+
+import (
+ "fmt"
+ "github.com/ethereum/ethutil-go"
+ "math/big"
+)
+
+type OpCode byte
+
+// Op codes
+const (
+ oSTOP OpCode = 0x00
+ oADD OpCode = 0x01
+ oMUL OpCode = 0x02
+ oSUB OpCode = 0x03
+ oDIV OpCode = 0x04
+ oSDIV OpCode = 0x05
+ oMOD OpCode = 0x06
+ oSMOD OpCode = 0x07
+ oEXP OpCode = 0x08
+ oNEG OpCode = 0x09
+ oLT OpCode = 0x0a
+ oLE OpCode = 0x0b
+ oGT OpCode = 0x0c
+ oGE OpCode = 0x0d
+ oEQ OpCode = 0x0e
+ oNOT OpCode = 0x0f
+ oMYADDRESS OpCode = 0x10
+ oTXSENDER OpCode = 0x11
+ oTXVALUE OpCode = 0x12
+ oTXFEE OpCode = 0x13
+ oTXDATAN OpCode = 0x14
+ oTXDATA OpCode = 0x15
+ oBLK_PREVHASH OpCode = 0x16
+ oBLK_COINBASE OpCode = 0x17
+ oBLK_TIMESTAMP OpCode = 0x18
+ oBLK_NUMBER OpCode = 0x19
+ oBLK_DIFFICULTY OpCode = 0x1a
+ oSHA256 OpCode = 0x20
+ oRIPEMD160 OpCode = 0x21
+ oECMUL OpCode = 0x22
+ oECADD OpCode = 0x23
+ oECSIGN OpCode = 0x24
+ oECRECOVER OpCode = 0x25
+ oECVALID OpCode = 0x26
+ oPUSH OpCode = 0x30
+ oPOP OpCode = 0x31
+ oDUP OpCode = 0x32
+ oDUPN OpCode = 0x33
+ oSWAP OpCode = 0x34
+ oSWAPN OpCode = 0x35
+ oLOAD OpCode = 0x36
+ oSTORE OpCode = 0x37
+ oJMP OpCode = 0x40
+ oJMPI OpCode = 0x41
+ oIND OpCode = 0x42
+ oEXTRO OpCode = 0x50
+ oBALANCE OpCode = 0x51
+ oMKTX OpCode = 0x60
+ oSUICIDE OpCode = 0xff
+)
+
+// Since the opcodes aren't all in order we can't use a regular slice
+var opCodeToString = map[OpCode]string{
+ oSTOP: "STOP",
+ oADD: "ADD",
+ oMUL: "MUL",
+ oSUB: "SUB",
+ oDIV: "DIV",
+ oSDIV: "SDIV",
+ oMOD: "MOD",
+ oSMOD: "SMOD",
+ oEXP: "EXP",
+ oNEG: "NEG",
+ oLT: "LT",
+ oLE: "LE",
+ oGT: "GT",
+ oGE: "GE",
+ oEQ: "EQ",
+ oNOT: "NOT",
+ oMYADDRESS: "MYADDRESS",
+ oTXSENDER: "TXSENDER",
+ oTXVALUE: "TXVALUE",
+ oTXFEE: "TXFEE",
+ oTXDATAN: "TXDATAN",
+ oTXDATA: "TXDATA",
+ oBLK_PREVHASH: "BLK_PREVHASH",
+ oBLK_COINBASE: "BLK_COINBASE",
+ oBLK_TIMESTAMP: "BLK_TIMESTAMP",
+ oBLK_NUMBER: "BLK_NUMBER",
+ oBLK_DIFFICULTY: "BLK_DIFFIFULTY",
+ oSHA256: "SHA256",
+ oRIPEMD160: "RIPEMD160",
+ oECMUL: "ECMUL",
+ oECADD: "ECADD",
+ oECSIGN: "ECSIGN",
+ oECRECOVER: "ECRECOVER",
+ oECVALID: "ECVALID",
+ oPUSH: "PUSH",
+ oPOP: "POP",
+ oDUP: "DUP",
+ oDUPN: "DUPN",
+ oSWAP: "SWAP",
+ oSWAPN: "SWAPN",
+ oLOAD: "LOAD",
+ oSTORE: "STORE",
+ oJMP: "JMP",
+ oJMPI: "JMPI",
+ oIND: "IND",
+ oEXTRO: "EXTRO",
+ oBALANCE: "BALANCE",
+ oMKTX: "MKTX",
+ oSUICIDE: "SUICIDE",
+}
+
+func (o OpCode) String() string {
+ return opCodeToString[o]
+}
+
+type OpType int
+
+const (
+ tNorm = iota
+ tData
+ tExtro
+ tCrypto
+)
+
+type TxCallback func(opType OpType) bool
+
+// Simple push/pop stack mechanism
+type Stack struct {
+ data []string
+}
+
+func NewStack() *Stack {
+ return &Stack{}
+}
+
+func (st *Stack) Pop() string {
+ s := len(st.data)
+
+ str := st.data[s-1]
+ st.data = st.data[:s-1]
+
+ return str
+}
+
+func (st *Stack) Popn() (*big.Int, *big.Int) {
+ s := len(st.data)
+
+ strs := st.data[s-2:]
+ st.data = st.data[:s-2]
+
+ return ethutil.Big(strs[0]), ethutil.Big(strs[1])
+}
+
+func (st *Stack) Push(d string) {
+ st.data = append(st.data, d)
+}
+func (st *Stack) Print() {
+ fmt.Println(st.data)
+}