core, core/vm, cmd/disasm: unify procedures for disassembling evm code (#3530)
This commit is contained in:
committed by
Felix Lange
parent
5c8fe28b72
commit
37511ec520
@ -18,43 +18,25 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/ethereum/go-ethereum/core/vm"
|
||||
"github.com/ethereum/go-ethereum/core/asm"
|
||||
)
|
||||
|
||||
func main() {
|
||||
code, err := ioutil.ReadAll(os.Stdin)
|
||||
in, err := ioutil.ReadAll(os.Stdin)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
code, err = hex.DecodeString(strings.TrimSpace(string(code[:])))
|
||||
code := strings.TrimSpace(string(in[:]))
|
||||
fmt.Printf("%v\n", code)
|
||||
err = asm.PrintDisassembled(code)
|
||||
if err != nil {
|
||||
fmt.Printf("Error: %v\n", err)
|
||||
return
|
||||
}
|
||||
fmt.Printf("%x\n", code)
|
||||
|
||||
for pc := uint64(0); pc < uint64(len(code)); pc++ {
|
||||
op := vm.OpCode(code[pc])
|
||||
|
||||
switch op {
|
||||
case vm.PUSH1, vm.PUSH2, vm.PUSH3, vm.PUSH4, vm.PUSH5, vm.PUSH6, vm.PUSH7, vm.PUSH8, vm.PUSH9, vm.PUSH10, vm.PUSH11, vm.PUSH12, vm.PUSH13, vm.PUSH14, vm.PUSH15, vm.PUSH16, vm.PUSH17, vm.PUSH18, vm.PUSH19, vm.PUSH20, vm.PUSH21, vm.PUSH22, vm.PUSH23, vm.PUSH24, vm.PUSH25, vm.PUSH26, vm.PUSH27, vm.PUSH28, vm.PUSH29, vm.PUSH30, vm.PUSH31, vm.PUSH32:
|
||||
a := uint64(op) - uint64(vm.PUSH1) + 1
|
||||
u := pc + 1 + a
|
||||
if uint64(len(code)) <= pc || uint64(len(code)) < u {
|
||||
fmt.Printf("Error: incomplete push instruction at %v\n", pc)
|
||||
return
|
||||
}
|
||||
fmt.Printf("%-5d %v => %x\n", pc, op, code[pc+1:u])
|
||||
pc += a
|
||||
default:
|
||||
fmt.Printf("%-5d %v\n", pc, op)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user