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 }