aboutsummaryrefslogtreecommitdiffstats
path: root/ethvm/asm.go
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-07-25 16:43:35 +0800
committerobscuren <geffobscura@gmail.com>2014-07-25 16:43:35 +0800
commitd761af84c83ae8d9d723e6766abb7950ff59cdf3 (patch)
tree6fe0805649ddf38b2b90e77c5fb2000a4bdab536 /ethvm/asm.go
parent06ec80f39495bdd92878468cf862f52e9748f1ca (diff)
parent54f9ea14e197ad805f24592153f1b9e69f3bc5c3 (diff)
downloaddexon-d761af84c83ae8d9d723e6766abb7950ff59cdf3.tar
dexon-d761af84c83ae8d9d723e6766abb7950ff59cdf3.tar.gz
dexon-d761af84c83ae8d9d723e6766abb7950ff59cdf3.tar.bz2
dexon-d761af84c83ae8d9d723e6766abb7950ff59cdf3.tar.lz
dexon-d761af84c83ae8d9d723e6766abb7950ff59cdf3.tar.xz
dexon-d761af84c83ae8d9d723e6766abb7950ff59cdf3.tar.zst
dexon-d761af84c83ae8d9d723e6766abb7950ff59cdf3.zip
Merge branch 'release/0.6.0'
Diffstat (limited to 'ethvm/asm.go')
-rw-r--r--ethvm/asm.go44
1 files changed, 44 insertions, 0 deletions
diff --git a/ethvm/asm.go b/ethvm/asm.go
new file mode 100644
index 000000000..7ff15a240
--- /dev/null
+++ b/ethvm/asm.go
@@ -0,0 +1,44 @@
+package ethvm
+
+import (
+ "fmt"
+ "github.com/ethereum/eth-go/ethutil"
+ "math/big"
+)
+
+func Disassemble(script []byte) (asm []string) {
+ pc := new(big.Int)
+ for {
+ if pc.Cmp(big.NewInt(int64(len(script)))) >= 0 {
+ return
+ }
+
+ // Get the memory location of pc
+ val := script[pc.Int64()]
+ // Get the opcode (it must be an opcode!)
+ op := OpCode(val)
+
+ asm = append(asm, fmt.Sprintf("%v", op))
+
+ switch op {
+ 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:
+ pc.Add(pc, ethutil.Big1)
+ a := int64(op) - int64(PUSH1) + 1
+ if int(pc.Int64()+a) > len(script) {
+ return nil
+ }
+
+ data := script[pc.Int64() : pc.Int64()+a]
+ if len(data) == 0 {
+ data = []byte{0}
+ }
+ asm = append(asm, fmt.Sprintf("0x%x", data))
+
+ pc.Add(pc, big.NewInt(a-1))
+ }
+
+ pc.Add(pc, ethutil.Big1)
+ }
+
+ return
+}