github.com/sixexorg/magnetic-ring@v0.0.0-20191119090307-31705a21e419/gomobile/walletutil/tx.go (about) 1 package walletutil 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "fmt" 7 "github.com/sixexorg/magnetic-ring/account" 8 "github.com/sixexorg/magnetic-ring/common" 9 "github.com/sixexorg/magnetic-ring/common/sink" 10 mainTypes "github.com/sixexorg/magnetic-ring/core/mainchain/types" 11 orgTypes "github.com/sixexorg/magnetic-ring/core/orgchain/types" 12 "github.com/sixexorg/magnetic-ring/crypto" 13 "github.com/sixexorg/magnetic-ring/signer/mainchain/signature" 14 "math/big" 15 ) 16 17 type Resp struct { 18 ErrorMsg string `json:"error_msg"` 19 Data string `json:"data"` 20 } 21 22 func newErrorResp(errmsg string) string { 23 rsp := Resp{errmsg, ""} 24 buf, err := json.Marshal(rsp) 25 if err != nil { 26 } 27 return fmt.Sprintf("%s", buf) 28 } 29 30 func newResp(obj string) string { 31 rsp := Resp{"", obj} 32 buf, err := json.Marshal(rsp) 33 if err != nil { 34 return fmt.Sprintf("{\"error_msg\":\"%s\",\"data\":\"\"}", err.Error()) 35 } 36 return fmt.Sprintf("%s", buf) 37 } 38 39 40 func buildLeagueRaw(tx *mainTypes.Transaction) []byte { 41 var ( 42 orgTp orgTypes.TransactionType 43 orgtx = &orgTypes.Transaction{ 44 Version: orgTypes.TxVersion, 45 TxType: orgTp, 46 TxData: &orgTypes.TxData{ 47 From: tx.TxData.From, 48 TxHash: tx.Hash(), 49 }, 50 } 51 ) 52 switch tx.TxType { 53 case mainTypes.EnergyToLeague: 54 orgTp = orgTypes.EnergyFromMain 55 orgtx.TxData.Energy = tx.TxData.Energy 56 break 57 case mainTypes.JoinLeague: 58 orgTp = orgTypes.Join 59 break 60 } 61 orgtx.TxType = orgTp 62 err := orgtx.ToRaw() 63 if err != nil { 64 return nil 65 } 66 return orgtx.Raw 67 } 68 69 70 func TransferBox(pubk, to, msg string, amount, fee, nonce int64) string { 71 72 fromoutAddr,err := OnePubkAddress(pubk) 73 if err != nil { 74 return newErrorResp(err.Error()) 75 } 76 77 toAddr, _ := common.ToAddress(to) 78 amt := amount 79 feeamt := fee 80 txouts := &common.TxIns{} 81 txout := common.TxIn{ 82 Address: fromoutAddr, 83 Amount: big.NewInt(amt), 84 Nonce: uint64(nonce), 85 } 86 txouts.Tis = append(txouts.Tis, &txout) 87 88 totxins := &common.TxOuts{} 89 totxin := common.TxOut{ 90 Address: toAddr, 91 Amount: big.NewInt(amt), 92 } 93 totxins.Tos = append(totxins.Tos, &totxin) 94 95 msghash, err := common.StringToHash(msg) 96 if err != nil { 97 msghash = common.Hash{} 98 } 99 100 txdata := mainTypes.TxData{ 101 From: fromoutAddr, 102 Froms: txouts, 103 Tos: totxins, 104 Fee: big.NewInt(feeamt), 105 Msg: msghash, 106 } 107 tx, err := mainTypes.NewTransaction(mainTypes.TransferBox, mainTypes.TxVersion, &txdata) 108 if err != nil { 109 return newErrorResp(err.Error()) 110 } 111 112 113 err,tmplttmp := OnePubkTmplt(pubk) 114 if err != nil { 115 return newErrorResp(err.Error()) 116 } 117 118 tx.Templt = tmplttmp 119 120 err = tx.ToRaw() 121 if err != nil { 122 return newErrorResp(err.Error()) 123 } 124 125 outstr := fmt.Sprintf("%x", tx.Raw) 126 result := newResp(outstr) 127 return result 128 } 129 130 131 func TransferEnergy(pubk, to, msg string, amount, fee, nonce int64) string { 132 fromoutAddr,err := OnePubkAddress(pubk) 133 if err != nil { 134 return newErrorResp(err.Error()) 135 } 136 toAddr, _ := common.ToAddress(to) 137 amt := amount 138 feeamt := fee 139 txouts := &common.TxIns{} 140 txout := common.TxIn{ 141 Address: fromoutAddr, 142 Amount: big.NewInt(amt), 143 Nonce: uint64(nonce), 144 } 145 txouts.Tis = append(txouts.Tis, &txout) 146 147 totxins := &common.TxOuts{} 148 totxin := common.TxOut{ 149 Address: toAddr, 150 Amount: big.NewInt(amt), 151 } 152 totxins.Tos = append(totxins.Tos, &totxin) 153 154 msghash, err := common.StringToHash(msg) 155 if err != nil { 156 msghash = common.Hash{} 157 } 158 159 txdata := mainTypes.TxData{ 160 From: fromoutAddr, 161 Froms: txouts, 162 Tos: totxins, 163 Fee: big.NewInt(feeamt), 164 Msg: msghash, 165 } 166 tx, err := mainTypes.NewTransaction(mainTypes.TransferEnergy, mainTypes.TxVersion, &txdata) 167 if err != nil { 168 return newErrorResp(err.Error()) 169 } 170 171 err,tmplttmp := OnePubkTmplt(pubk) 172 if err != nil { 173 return newErrorResp(err.Error()) 174 } 175 176 tx.Templt = tmplttmp 177 178 err = tx.ToRaw() 179 if err != nil { 180 return newErrorResp(err.Error()) 181 } 182 183 return newResp(fmt.Sprintf("%x", tx.Raw)) 184 } 185 186 func CreateLeague(nodeIdstr, pubk, msg string, minbox, metabox, nonce, fee int64, rate int32,len5s string) string { 187 nodeId, err := common.ToAddress(nodeIdstr) 188 if err != nil { 189 return newErrorResp(err.Error()) 190 } 191 192 fromoutAddr,err := OnePubkAddress(pubk) 193 if err != nil { 194 return newErrorResp(err.Error()) 195 } 196 msghash, err := common.StringToHash(msg) 197 if err != nil { 198 msghash = common.Hash{} 199 } 200 201 sbl,b := common.String2Symbol(len5s) 202 fmt.Printf("string2symbol result=%v\n",b) 203 204 tx := &mainTypes.Transaction{ 205 Version: mainTypes.MainTxVersion, 206 TxType: mainTypes.CreateLeague, 207 TxData: &mainTypes.TxData{ 208 From: fromoutAddr, 209 Nonce: uint64(nonce), 210 Fee: big.NewInt(int64(fee)), 211 Rate: uint32(rate), 212 MinBox: uint64(minbox), 213 MetaBox: big.NewInt(int64(metabox)), 214 NodeId: nodeId, 215 Private: false, 216 Msg: msghash, 217 Symbol: sbl, 218 }, 219 } 220 221 222 err,tmplttmp := OnePubkTmplt(pubk) 223 if err != nil { 224 return newErrorResp(err.Error()) 225 } 226 227 tx.Templt = tmplttmp 228 229 err = tx.ToRaw() 230 if err != nil { 231 return newErrorResp(err.Error()) 232 } 233 234 return newResp(fmt.Sprintf("%x", tx.Raw)) 235 } 236 237 238 239 func EnergyToLeague(pubk, leagueId, msg string, quntity, fee, nonce int64) string { 240 leageuAddress, err := common.ToAddress(leagueId) 241 if err != nil { 242 return newErrorResp(err.Error()) 243 } 244 245 fromAddr,err := OnePubkAddress(pubk) 246 if err != nil { 247 return newErrorResp(err.Error()) 248 } 249 msghash, err := common.StringToHash(msg) 250 if err != nil { 251 msghash = common.Hash{} 252 } 253 tx := &mainTypes.Transaction{ 254 Version: mainTypes.TxVersion, 255 TxType: mainTypes.EnergyToLeague, 256 TxData: &mainTypes.TxData{ 257 From: fromAddr, 258 Nonce: uint64(nonce), 259 Fee: big.NewInt(int64(fee)), 260 LeagueId: leageuAddress, 261 Energy: big.NewInt(int64(quntity)), 262 Msg: msghash, 263 }, 264 } 265 266 267 err,tmplttmp := OnePubkTmplt(pubk) 268 if err != nil { 269 return newErrorResp(err.Error()) 270 } 271 272 tx.Templt = tmplttmp 273 274 err = tx.ToRaw() 275 if err != nil { 276 return newErrorResp(err.Error()) 277 } 278 279 return newResp(fmt.Sprintf("%x", tx.Raw)) 280 } 281 282 func JoinLeague(pubk, leagueId, msg string, quntity, fee, nonce, leagueNonce int64) string { 283 leageuAddress, err := common.ToAddress(leagueId) 284 if err != nil { 285 return newErrorResp(err.Error()) 286 } 287 288 fromAddr,err := OnePubkAddress(pubk) 289 if err != nil { 290 return newErrorResp(err.Error()) 291 } 292 msghash, err := common.StringToHash(msg) 293 if err != nil { 294 msghash = common.Hash{} 295 } 296 tx := &mainTypes.Transaction{ 297 Version: mainTypes.TxVersion, 298 TxType: mainTypes.JoinLeague, 299 TxData: &mainTypes.TxData{ 300 From: fromAddr, 301 Nonce: uint64(nonce), 302 LeagueNonce: uint64(leagueNonce), 303 Fee: big.NewInt(fee), 304 LeagueId: leageuAddress, 305 MinBox: uint64(quntity), 306 Msg: msghash, 307 }, 308 } 309 tx.TxData.From = fromAddr 310 tx.TxData.Nonce = uint64(nonce) 311 312 313 err,tmplttmp := OnePubkTmplt(pubk) 314 if err != nil { 315 return newErrorResp(err.Error()) 316 } 317 318 tx.Templt = tmplttmp 319 320 err = tx.ToRaw() 321 if err != nil { 322 return newErrorResp(err.Error()) 323 } 324 325 return newResp(fmt.Sprintf("%x", tx.Raw)) 326 } 327 328 func TransferUt(pubk, to, msg string, quntity, fee, nonce int64) string { 329 txins := &common.TxIns{} 330 fromAddr,err := OnePubkAddress(pubk) 331 if err != nil { 332 return newErrorResp(err.Error()) 333 } 334 335 toAddr, err := common.ToAddress(to) 336 if err != nil { 337 return newErrorResp(err.Error()) 338 } 339 340 txin := common.TxIn{ 341 Address: fromAddr, 342 Amount: big.NewInt(quntity), 343 Nonce: uint64(nonce), 344 } 345 txins.Tis = append(txins.Tis, &txin) 346 347 totxins := &common.TxOuts{} 348 totxin := common.TxOut{ 349 Address: toAddr, 350 Amount: big.NewInt(quntity), 351 } 352 totxins.Tos = append(totxins.Tos, &totxin) 353 354 msghash, err := common.StringToHash(msg) 355 if err != nil { 356 msghash = common.Hash{} 357 } 358 txdata := &orgTypes.TxData{ 359 From: fromAddr, 360 Froms: txins, 361 Tos: totxins, 362 Fee: big.NewInt(fee), 363 Msg: msghash, 364 } 365 tx := &orgTypes.Transaction{ 366 Version: orgTypes.TxVersion, 367 TxType: orgTypes.TransferUT, 368 TxData: txdata, 369 } 370 371 372 err,tmplttmp := OnePubkTmplt(pubk) 373 if err != nil { 374 return newErrorResp(err.Error()) 375 } 376 377 tx.Templt = tmplttmp 378 379 err = tx.ToRaw() 380 if err != nil { 381 return newErrorResp(err.Error()) 382 } 383 384 return newResp(fmt.Sprintf("%x", tx.Raw)) 385 } 386 387 func SignMainTransaction(txhex, accountAddress, privk string) string { 388 389 comaddress, err := common.ToAddress(accountAddress) 390 if err != nil { 391 return newErrorResp(err.Error()) 392 } 393 394 txbuf, err := common.Hex2Bytes(txhex) 395 if err != nil { 396 fmt.Printf("can not deserialize data to transaction,err=%v\n", err) 397 return newErrorResp(err.Error()) 398 } 399 buff := bytes.NewBuffer(txbuf) 400 tx := &mainTypes.Transaction{} 401 sk := sink.NewZeroCopySource(buff.Bytes()) 402 err = tx.Deserialization(sk) 403 if err != nil { 404 fmt.Printf("can not deserialize data to transaction,err=%v\n", err) 405 return newErrorResp(err.Error()) 406 } 407 408 err = signature.SignTransactionWithPrivk(comaddress, tx, privk) 409 if err != nil { 410 fmt.Printf("sign transaction error=%v\n", err) 411 return newErrorResp(err.Error()) 412 } 413 414 b, e := tx.VerifySignature() 415 if e != nil { 416 fmt.Printf("error=%v\n", e) 417 return newErrorResp(err.Error()) 418 } 419 420 fmt.Printf("b=%t\n", b) 421 422 serbufer := new(bytes.Buffer) 423 err = tx.Serialize(serbufer) 424 425 if err != nil { 426 return newErrorResp(err.Error()) 427 } 428 429 outbuf := serbufer.Bytes() 430 431 returnstr := common.Bytes2Hex(outbuf) 432 433 reverse, err := common.Hex2Bytes(returnstr) 434 if err != nil { 435 return newErrorResp(err.Error()) 436 } 437 438 txrev := new(mainTypes.Transaction) 439 440 source := sink.NewZeroCopySource(reverse) 441 err = txrev.Deserialization(source) 442 if err != nil { 443 return newErrorResp(err.Error()) 444 } 445 446 err = tx.ToRaw() 447 if err != nil { 448 return newErrorResp(err.Error()) 449 } 450 451 return newResp(fmt.Sprintf("%x", tx.Raw)) 452 453 } 454 455 func OnePubkTmplt(pubk string) (error,*common.SigTmplt) { 456 pubkhash,err := common.HexToBytes(pubk) 457 if err != nil { 458 return err,nil 459 } 460 461 pbhash := common.PubHash{} 462 copy(pbhash[:],pubkhash[:]) 463 464 return nil,&common.SigTmplt{ 465 []*common.Maus{ 466 &common.Maus{ 467 common.Mau{ 468 1, 469 []common.PubHash{pbhash}, 470 }, 471 }, 472 }, 473 } 474 } 475 476 func OnePubkAddress(pubk string) (common.Address,error) { 477 buf,err := common.Hex2Bytes(pubk) 478 if err != nil { 479 return common.Address{},err 480 } 481 482 publickKey,err := crypto.UnmarshalPubkey(buf) 483 484 mult := account.MultiAccountUnit{1, []crypto.PublicKey{publickKey}} 485 486 muls := make(account.MultiAccountUnits, 1) 487 muls[0] = mult 488 489 fromoutAddr, err := muls.Address() 490 491 if err != nil { 492 return common.Address{},err 493 } 494 return fromoutAddr,nil 495 } 496 497 func BuildLeagueId(txhash string) string { 498 ra,err := common.Hex2Bytes(txhash) 499 if err != nil { 500 return newErrorResp(err.Error()) 501 } 502 503 tx := &mainTypes.Transaction{} 504 source := sink.NewZeroCopySource(ra) 505 err = tx.Deserialization(source) 506 if err != nil { 507 return newErrorResp(err.Error()) 508 } 509 510 leagueId := mainTypes.ToLeagueAddress(tx) 511 return newResp(leagueId.ToString()) 512 513 } 514 515 func PushMsg(pubk, to, msg string, fee, nonce int64) string { 516 txins := &common.TxIns{} 517 fromAddr,err := OnePubkAddress(pubk) 518 if err != nil { 519 return newErrorResp(err.Error()) 520 } 521 522 toAddr, err := common.ToAddress(to) 523 if err != nil { 524 return newErrorResp(err.Error()) 525 } 526 527 //txin := common.TxIn{ 528 // Address: fromAddr, 529 // Amount: big.NewInt(0), 530 // Nonce: uint64(nonce), 531 //} 532 //txins.Tis = append(txins.Tis, &txin) 533 534 totxins := &common.TxOuts{} 535 totxin := common.TxOut{ 536 Address: toAddr, 537 Amount: big.NewInt(0), 538 } 539 totxins.Tos = append(totxins.Tos, &totxin) 540 541 msghash, err := common.StringToHash(msg) 542 if err != nil { 543 msghash = common.Hash{} 544 } 545 txdata := &orgTypes.TxData{ 546 From: fromAddr, 547 Froms: txins, 548 Tos: totxins, 549 Fee: big.NewInt(fee), 550 Msg: msghash, 551 Nonce:uint64(nonce), 552 } 553 tx := &orgTypes.Transaction{ 554 Version: orgTypes.TxVersion, 555 TxType: orgTypes.MSG, 556 TxData: txdata, 557 } 558 559 560 err,tmplttmp := OnePubkTmplt(pubk) 561 if err != nil { 562 return newErrorResp(err.Error()) 563 } 564 565 tx.Templt = tmplttmp 566 567 err = tx.ToRaw() 568 if err != nil { 569 return newErrorResp(err.Error()) 570 } 571 572 return newResp(fmt.Sprintf("%x", tx.Raw)) 573 } 574 575 576 func CreateMsgTx(pubk, to, msg string, fee, nonce int64) string { 577 txins := &common.TxIns{} 578 fromAddr,err := OnePubkAddress(pubk) 579 if err != nil { 580 return newErrorResp(err.Error()) 581 } 582 583 toAddr, err := common.ToAddress(to) 584 if err != nil { 585 return newErrorResp(err.Error()) 586 } 587 588 totxins := &common.TxOuts{} 589 totxin := common.TxOut{ 590 Address: toAddr, 591 Amount: big.NewInt(0), 592 } 593 totxins.Tos = append(totxins.Tos, &totxin) 594 595 msghash, err := common.StringToHash(msg) 596 if err != nil { 597 msghash = common.Hash{} 598 } 599 txdata := &orgTypes.TxData{ 600 From: fromAddr, 601 Froms: txins, 602 Tos: totxins, 603 Fee: big.NewInt(fee), 604 Msg: msghash, 605 Nonce:uint64(nonce), 606 } 607 tx := &orgTypes.Transaction{ 608 Version: orgTypes.TxVersion, 609 TxType: orgTypes.MSG, 610 TxData: txdata, 611 } 612 613 614 err,tmplttmp := OnePubkTmplt(pubk) 615 if err != nil { 616 return newErrorResp(err.Error()) 617 } 618 619 tx.Templt = tmplttmp 620 621 err = tx.ToRaw() 622 if err != nil { 623 return newErrorResp(err.Error()) 624 } 625 626 return fmt.Sprintf("%x", tx.Raw) 627 }