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  }