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))
--- /dev/null
+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})
+}
BytomcliCmd.AddCommand(signMsgCmd)
BytomcliCmd.AddCommand(verifyMsgCmd)
+ BytomcliCmd.AddCommand(decodeProgCmd)
BytomcliCmd.AddCommand(createTransactionFeedCmd)
BytomcliCmd.AddCommand(listTransactionFeedsCmd)
--- /dev/null
+package commands
+
+import (
+ "os"
+
+ "github.com/spf13/cobra"
+
+ "github.com/bytom/util"
+)
+
+var decodeProgCmd = &cobra.Command{
+ Use: "decode-program <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)
+ },
+}