github.com/sixexorg/magnetic-ring@v0.0.0-20191119090307-31705a21e419/cmd/cmd_tx.go (about)

     1  package cmd
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"fmt"
     7  	"github.com/urfave/cli"
     8  	"github.com/sixexorg/magnetic-ring/account"
     9  	"github.com/sixexorg/magnetic-ring/common"
    10  	pasw "github.com/sixexorg/magnetic-ring/common/password"
    11  	"github.com/sixexorg/magnetic-ring/common/sink"
    12  	"github.com/sixexorg/magnetic-ring/config"
    13  	"github.com/sixexorg/magnetic-ring/core/mainchain/types"
    14  	orgtypes "github.com/sixexorg/magnetic-ring/core/orgchain/types"
    15  	"github.com/sixexorg/magnetic-ring/gomobile/walletutil"
    16  	httpcli "github.com/sixexorg/magnetic-ring/http/cli"
    17  	"github.com/sixexorg/magnetic-ring/http/req"
    18  	"github.com/sixexorg/magnetic-ring/signer/mainchain/signature"
    19  	orgsignature "github.com/sixexorg/magnetic-ring/signer/orgchain/signature"
    20  )
    21  
    22  var (
    23  	SignCommand = cli.Command{
    24  		Action:      cli.ShowSubcommandHelp,
    25  		Name:        "tx",
    26  		Usage:       "about transaction",
    27  		ArgsUsage:   "[arguments...]",
    28  		Description: `transaction actions`,
    29  		Subcommands: []cli.Command{
    30  			{
    31  				Action:    signRawTransaction,
    32  				Name:      "sign",
    33  				Usage:     "sign a transaction",
    34  				ArgsUsage: "[sub-command options]",
    35  				Flags: []cli.Flag{
    36  					cli.StringFlag{
    37  						Name:  "account,a",
    38  						Value: "",
    39  						Usage: "sign transaction with account",
    40  					},
    41  				},
    42  				Description: ` Add a new account to keystore.`,
    43  			},
    44  			{
    45  				Action:    signOrgRawTransaction,
    46  				Name:      "orgsign",
    47  				Usage:     "sign an org transaction",
    48  				ArgsUsage: "[sub-command options]",
    49  				Flags: []cli.Flag{
    50  					cli.StringFlag{
    51  						Name:  "account,a",
    52  						Value: "",
    53  						Usage: "sign transaction with account",
    54  					},
    55  				},
    56  				Description: ` Add a new account to keystore.`,
    57  			},
    58  			{
    59  				Action:    pushTransaction,
    60  				Name:      "pushtx",
    61  				Usage:     "push a transaction to block chain network",
    62  				ArgsUsage: "[sub-command options]",
    63  				Flags:     []cli.Flag{
    64  					//cli.StringFlag{
    65  					//	Name:  "account,a",
    66  					//	Value: "",
    67  					//	Usage: "sign transaction with account",
    68  					//},
    69  				},
    70  				Description: ` Add a new account to keystore.`,
    71  			},
    72  			{
    73  				Action:    createMsgTx,
    74  				Name:      "createmsgtx",
    75  				Usage:     "createmsgtx -a=addr -orgaddr=orgaddr",
    76  				ArgsUsage: "[sub-command options]",
    77  				Flags:     []cli.Flag{
    78  					cli.StringFlag{
    79  						Name:  "account,a",
    80  						Value: "",
    81  						Usage: "who create this tx",
    82  					},
    83  					cli.StringFlag{
    84  						Name:  "orgaddr",
    85  						Value: "",
    86  						Usage: "which org to create this tx",
    87  					},
    88  					cli.StringFlag{
    89  						Name:  "pubk",
    90  						Value: "",
    91  						Usage: "your account pubk",
    92  					},
    93  					cli.StringFlag{
    94  						Name:  "to",
    95  						Value: "",
    96  						Usage: "point an address you want to tell hims",
    97  					},
    98  					cli.StringFlag{
    99  						Name:  "msg",
   100  						Value: "",
   101  						Usage: "message,can be a word,a sentence or a hash",
   102  					},
   103  				},
   104  				Description: "create a tx for sending msg or hash to chain",
   105  			},
   106  		},
   107  	}
   108  )
   109  
   110  func signRawTransaction(ctx *cli.Context) {
   111  	password, err := pasw.GetPassword()
   112  	if err != nil {
   113  		fmt.Printf("input password error:%v\n", err)
   114  		return
   115  	}
   116  
   117  	mgr, err := account.NewManager()
   118  	if err != nil {
   119  		fmt.Printf("create wallet error:%v\n", err)
   120  		return
   121  	}
   122  
   123  	acctaddressstr := ctx.String("account")
   124  
   125  	comaddress, err := common.ToAddress(acctaddressstr)
   126  	if err != nil {
   127  		fmt.Printf("toaddress error=%v\n",err)
   128  		return
   129  	}
   130  
   131  	passwordstr := string(password)
   132  
   133  	rawTx := ctx.Args().First()
   134  	txbuf, err := common.Hex2Bytes(rawTx)
   135  	if err != nil {
   136  		fmt.Printf("hex2bytes error =%v\n", err)
   137  		return
   138  	}
   139  	buff := bytes.NewBuffer(txbuf)
   140  	tx := &types.Transaction{}
   141  	sk := sink.NewZeroCopySource(buff.Bytes())
   142  	err = tx.Deserialization(sk)
   143  	if err != nil {
   144  		fmt.Printf("can not deserialize data to transaction,err=%v\n", err)
   145  		return
   146  	}
   147  
   148  	err = signature.SignTransaction(mgr, comaddress, tx, passwordstr)
   149  	if err != nil {
   150  		fmt.Printf("sign transaction error=%v\n", err)
   151  		return
   152  	}
   153  
   154  	b, e := tx.VerifySignature()
   155  	if e != nil {
   156  		fmt.Printf("error=%v\n", e)
   157  		return
   158  	}
   159  
   160  	fmt.Printf("b=%t\n", b)
   161  
   162  	serbufer := new(bytes.Buffer)
   163  	err = tx.Serialize(serbufer)
   164  
   165  	if err != nil {
   166  		fmt.Printf("Serialize transaction error=%v\n", err)
   167  		return
   168  	}
   169  
   170  	outbuf := serbufer.Bytes()
   171  
   172  	returnstr := common.Bytes2Hex(outbuf)
   173  
   174  	reverse, err := common.Hex2Bytes(returnstr)
   175  	if err != nil {
   176  		fmt.Printf("hex2bytes error =%v\n", err)
   177  		return
   178  	}
   179  
   180  	txrev := new(types.Transaction)
   181  
   182  	source := sink.NewZeroCopySource(reverse)
   183  	err = txrev.Deserialization(source)
   184  	if err != nil {
   185  		fmt.Printf("transaction Deserialization error=", err)
   186  		return
   187  	}
   188  
   189  	b2, e2 := txrev.VerifySignature()
   190  	if e2 != nil {
   191  		fmt.Printf("e2=%v\n", e2)
   192  		return
   193  	}
   194  
   195  	fmt.Printf("b2=%v\n", b2)
   196  
   197  	fmt.Printf("%s\n", returnstr)
   198  
   199  }
   200  
   201  func pushTransaction(ctx *cli.Context) {
   202  	baseurl := fmt.Sprintf("http://127.0.0.1:%d", config.GlobalConfig.SysCfg.HttpPort)
   203  	rawTx := ctx.Args().First()
   204  	ra, err := common.Hex2Bytes(rawTx)
   205  	if err != nil {
   206  		fmt.Printf("hex2bytes error =%v\n", err)
   207  		return
   208  	}
   209  	req := req.ReqSendTx{
   210  		Raw: ra,
   211  	}
   212  	fullurl := fmt.Sprintf("%s/block/sendtx", baseurl)
   213  	resp, err := httpcli.HttpSend(fullurl, req)
   214  	if err != nil {
   215  		fmt.Printf("push transaction to net work error:=%v\n", err)
   216  		return
   217  	}
   218  	fmt.Printf("%s\n", resp)
   219  }
   220  
   221  
   222  func getNonceInLeague(orgid,account string) (string,error){
   223  	baseurl := fmt.Sprintf("http://127.0.0.1:%d", config.GlobalConfig.SysCfg.HttpPort)
   224  
   225  
   226  	req := req.ReqUngetBonus{
   227  		OrgId:orgid,
   228  		Account:account,
   229  	}
   230  	fullurl := fmt.Sprintf("%s/orgapi/getleaguenonce", baseurl)
   231  	return httpcli.HttpSend(fullurl, req)
   232  	//if err != nil {
   233  	//	//fmt.Printf("push transaction to net work error:=%v\n", err)
   234  	//	return resp,err
   235  	//}
   236  	//fmt.Printf("%s\n", resp)
   237  }
   238  
   239  
   240  func createMsgTx(ctx *cli.Context) {
   241  
   242  	//orgid := ctx.String("orgaddr")
   243  	//account := ctx.String("account")
   244  
   245  	pubkstr := ctx.String("pubk")
   246  	tostr := ctx.String("to")
   247  	msgstr := ctx.String("msg")
   248  	//feestr := ctx.Int64("fee")
   249  
   250  	//resp,err := getNonceInLeague(orgid,account)
   251  	//if err != nil {
   252  	//	fmt.Printf("push transaction to net work error:=%v\n", err)
   253  	//	return
   254  	//}
   255  	//
   256  	type Noncer struct {
   257  		Nonce uint64 `json:"nonce"`
   258  	}
   259  	nc := new(Noncer)
   260  	nc.Nonce=1
   261  	//
   262  	//err = json.Unmarshal([]byte(resp),nc)
   263  	//if err != nil {
   264  	//	fmt.Printf("decode nonce error:=%v\n", err)
   265  	//	return
   266  	//}
   267  
   268  
   269  	txhash := walletutil.PushMsg(pubkstr,tostr,msgstr,10000000000,int64(nc.Nonce+1))
   270  
   271  	fmt.Printf("%s\n", txhash)
   272  }
   273  
   274  func createMsgTx2(ctx *cli.Context) {
   275  
   276  	orgid := ctx.String("orgaddr")
   277  	account := ctx.String("account")
   278  
   279  	pubkstr := ctx.String("pubk")
   280  	tostr := ctx.String("to")
   281  	msgstr := ctx.String("msg")
   282  	//feestr := ctx.Int64("fee")
   283  
   284  	resp,err := getNonceInLeague(orgid,account)
   285  	if err != nil {
   286  		fmt.Printf("push transaction to net work error:=%v\n", err)
   287  		return
   288  	}
   289  
   290  	type Noncer struct {
   291  		Nonce uint64 `json:"nonce"`
   292  	}
   293  	nc := new(Noncer)
   294  
   295  	err = json.Unmarshal([]byte(resp),nc)
   296  	if err != nil {
   297  		fmt.Printf("decode nonce error:=%v\n", err)
   298  		return
   299  	}
   300  
   301  
   302  	txhash := walletutil.PushMsg(pubkstr,tostr,msgstr,10000000000,int64(nc.Nonce+1))
   303  
   304  	fmt.Printf("%s\n", txhash)
   305  }
   306  
   307  
   308  func signOrgRawTransaction(ctx *cli.Context) {
   309  	password, err := pasw.GetPassword()
   310  	if err != nil {
   311  		fmt.Printf("input password error:%v\n", err)
   312  		return
   313  	}
   314  
   315  	mgr, err := account.NewManager()
   316  	if err != nil {
   317  		fmt.Printf("create wallet error:%v\n", err)
   318  		return
   319  	}
   320  
   321  	acctaddressstr := ctx.String("account")
   322  
   323  	comaddress, err := common.ToAddress(acctaddressstr)
   324  	if err != nil {
   325  		fmt.Printf("toaddress error=%v\n",err)
   326  		return
   327  	}
   328  
   329  	passwordstr := string(password)
   330  
   331  	rawTx := ctx.Args().First()
   332  	txbuf, err := common.Hex2Bytes(rawTx)
   333  	if err != nil {
   334  		fmt.Printf("hex2bytes error =%v\n", err)
   335  		return
   336  	}
   337  	buff := bytes.NewBuffer(txbuf)
   338  	tx := &orgtypes.Transaction{}
   339  	sk := sink.NewZeroCopySource(buff.Bytes())
   340  	err = tx.Deserialization(sk)
   341  	if err != nil {
   342  		fmt.Printf("can not deserialize data to transaction,err=%v\n", err)
   343  		return
   344  	}
   345  
   346  	err = orgsignature.SignTransaction(mgr, comaddress, tx, passwordstr)
   347  	if err != nil {
   348  		fmt.Printf("sign transaction error 777 =%v\n", err)
   349  		return
   350  	}
   351  
   352  	_, e := tx.VerifySignature()
   353  	if e != nil {
   354  		fmt.Printf("error=%v\n", e)
   355  		return
   356  	}
   357  
   358  	//fmt.Printf("verify signature err=%t\n",b)
   359  
   360  	serbufer := new(bytes.Buffer)
   361  	err = tx.Serialize(serbufer)
   362  
   363  	if err != nil {
   364  		fmt.Printf("Serialize transaction error=%v\n", err)
   365  		return
   366  	}
   367  
   368  	outbuf := serbufer.Bytes()
   369  
   370  	returnstr := common.Bytes2Hex(outbuf)
   371  
   372  	reverse, err := common.Hex2Bytes(returnstr)
   373  	if err != nil {
   374  		fmt.Printf("hex2bytes error =%v\n", err)
   375  		return
   376  	}
   377  
   378  	txrev := new(orgtypes.Transaction)
   379  
   380  	source := sink.NewZeroCopySource(reverse)
   381  	err = txrev.Deserialization(source)
   382  	if err != nil {
   383  		fmt.Printf("transaction Deserialization error=", err)
   384  		return
   385  	}
   386  
   387  	_, e2 := txrev.VerifySignature()
   388  	if e2 != nil {
   389  		fmt.Printf("e2=%v\n", e2)
   390  		return
   391  	}
   392  
   393  	//fmt.Printf("b2=%v\n", b2)
   394  
   395  	fmt.Printf("%s\n", returnstr)
   396  
   397  }