core/vm, rpc: added disasm to `ext_` RPC
This commit is contained in:
parent
f7415c0bbc
commit
7381be8edb
|
@ -0,0 +1,21 @@
|
||||||
|
package vm
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func Disasm(code []byte) []string {
|
||||||
|
var out []string
|
||||||
|
for pc := uint64(0); pc < uint64(len(code)); pc++ {
|
||||||
|
op := OpCode(code[pc])
|
||||||
|
out = append(out, op.String())
|
||||||
|
|
||||||
|
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:
|
||||||
|
a := uint64(op) - uint64(PUSH1) + 1
|
||||||
|
out = append(out, fmt.Sprintf("0x%x", code[pc+1:pc+1+a]))
|
||||||
|
|
||||||
|
pc += a
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return out
|
||||||
|
}
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"math/big"
|
"math/big"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
"github.com/ethereum/go-ethereum/core/vm"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
"github.com/ethereum/go-ethereum/logger"
|
"github.com/ethereum/go-ethereum/logger"
|
||||||
"github.com/ethereum/go-ethereum/logger/glog"
|
"github.com/ethereum/go-ethereum/logger/glog"
|
||||||
|
@ -344,7 +345,6 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
|
||||||
return NewNotImplementedError(req.Method)
|
return NewNotImplementedError(req.Method)
|
||||||
|
|
||||||
case "eth_compileSolidity":
|
case "eth_compileSolidity":
|
||||||
|
|
||||||
solc, _ := api.xeth().Solc()
|
solc, _ := api.xeth().Solc()
|
||||||
if solc == nil {
|
if solc == nil {
|
||||||
return NewNotAvailableError(req.Method, "solc (solidity compiler) not found")
|
return NewNotAvailableError(req.Method, "solc (solidity compiler) not found")
|
||||||
|
@ -562,6 +562,13 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
|
||||||
|
|
||||||
case "eth_hashrate":
|
case "eth_hashrate":
|
||||||
*reply = newHexNum(api.xeth().HashRate())
|
*reply = newHexNum(api.xeth().HashRate())
|
||||||
|
case "ext_disasm":
|
||||||
|
args := new(SourceArgs)
|
||||||
|
if err := json.Unmarshal(req.Params, &args); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
*reply = vm.Disasm(common.FromHex(args.Source))
|
||||||
|
|
||||||
// case "eth_register":
|
// case "eth_register":
|
||||||
// // Placeholder for actual type
|
// // Placeholder for actual type
|
||||||
|
|
Loading…
Reference in New Issue