From 0055f1977d40b36d0126a9f125a55f7d245829cb Mon Sep 17 00:00:00 2001 From: oysheng Date: Wed, 23 May 2018 16:48:31 +0800 Subject: [PATCH] add decode-program api --- api/api.go | 2 ++ api/program.go | 46 +++++++++++++++++++++++++++++++++++++++ cmd/bytomcli/commands/bytomcli.go | 1 + cmd/bytomcli/commands/program.go | 26 ++++++++++++++++++++++ 4 files changed, 75 insertions(+) create mode 100644 api/program.go create mode 100644 cmd/bytomcli/commands/program.go diff --git a/api/api.go b/api/api.go index 10d8bb65..2bd6ced4 100644 --- a/api/api.go +++ b/api/api.go @@ -235,6 +235,8 @@ func (a *API) buildHandler() { m.Handle("/submit-work", jsonHandler(a.submitWork)) m.Handle("/verify-message", jsonHandler(a.verifyMessage)) + m.Handle("/decode-program", jsonHandler(a.decodeProgram)) + m.Handle("/gas-rate", jsonHandler(a.gasRate)) m.Handle("/net-info", jsonHandler(a.getNetInfo)) diff --git a/api/program.go b/api/program.go new file mode 100644 index 00000000..c53ae841 --- /dev/null +++ b/api/program.go @@ -0,0 +1,46 @@ +package api + +import ( + "context" + "encoding/hex" + "fmt" + + "github.com/bytom/consensus/segwit" + "github.com/bytom/protocol/vm" +) + +// DecodeProgResp is response for decode program +type DecodeProgResp struct { + Instructions string `json:"instructions"` +} + +func (a *API) decodeProgram(ctx context.Context, ins struct { + Program string `json:"program"` +}) Response { + prog, err := hex.DecodeString(ins.Program) + if err != nil { + return NewErrorResponse(err) + } + + // if program is P2PKH or P2SH script, convert it into actual executed program + if segwit.IsP2WPKHScript(prog) { + if witnessProg, err := segwit.ConvertP2PKHSigProgram(prog); err == nil { + prog = witnessProg + } + } else if segwit.IsP2WSHScript(prog) { + if witnessProg, err := segwit.ConvertP2SHProgram(prog); err == nil { + prog = witnessProg + } + } + + insts, err := vm.ParseProgram(prog) + if err != nil { + return NewErrorResponse(err) + } + + var result string + for _, inst := range insts { + result = result + fmt.Sprintf("%s %s\n", inst.Op, hex.EncodeToString(inst.Data)) + } + return NewSuccessResponse(DecodeProgResp{Instructions: result}) +} diff --git a/cmd/bytomcli/commands/bytomcli.go b/cmd/bytomcli/commands/bytomcli.go index 7690d7ce..0a280420 100644 --- a/cmd/bytomcli/commands/bytomcli.go +++ b/cmd/bytomcli/commands/bytomcli.go @@ -152,6 +152,7 @@ func AddCommands() { BytomcliCmd.AddCommand(signMsgCmd) BytomcliCmd.AddCommand(verifyMsgCmd) + BytomcliCmd.AddCommand(decodeProgCmd) BytomcliCmd.AddCommand(createTransactionFeedCmd) BytomcliCmd.AddCommand(listTransactionFeedsCmd) diff --git a/cmd/bytomcli/commands/program.go b/cmd/bytomcli/commands/program.go new file mode 100644 index 00000000..6543227d --- /dev/null +++ b/cmd/bytomcli/commands/program.go @@ -0,0 +1,26 @@ +package commands + +import ( + "os" + + "github.com/spf13/cobra" + + "github.com/bytom/util" +) + +var decodeProgCmd = &cobra.Command{ + Use: "decode-program ", + Short: "decode program to instruction and data", + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + var req = struct { + Program string `json:"program"` + }{Program: args[0]} + + data, exitCode := util.ClientCall("/decode-program", &req) + if exitCode != util.Success { + os.Exit(exitCode) + } + printJSON(data) + }, +} -- 2.11.0