github.com/nnlgsakib/mind-dpos@v0.0.0-20230606105614-f3c8ca06f808/tests/tps/tps.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"github.com/TTCECO/gttc/common"
     6  	"github.com/TTCECO/gttc/core/types"
     7  	"github.com/TTCECO/gttc/crypto"
     8  	"github.com/TTCECO/gttc/rlp"
     9  	"github.com/TTCECO/gttc/rpc"
    10  	"os"
    11  	"strconv"
    12  
    13  	"math/big"
    14  )
    15  
    16  const (
    17  	fromAddress = "0x74883A82Eb05c1EFfF9C40F6101b7D8E7DE52504"
    18  	pKey        = "4dba440cab5a1768a5573ff0eba2700fffcd189c0a98383add184b271be7f3da"
    19  	toAddress   = "0x2a84f498d27805D49a92277eDBe670b83036F14A"
    20  
    21  	defaultCount      = 10000
    22  	defaultPortStart  = 8501
    23  	defaultPortLength = 1
    24  )
    25  
    26  func main() {
    27  
    28  	count := int64(defaultCount)
    29  	if len(os.Args) > 1 {
    30  		argCount, err := strconv.ParseInt(os.Args[1], 10, 64)
    31  		if err == nil {
    32  			count = argCount
    33  		}
    34  	}
    35  	fmt.Println("count : ", count)
    36  
    37  	portStart := defaultPortStart
    38  	if len(os.Args) > 2 {
    39  		argPortStart, err := strconv.ParseInt(os.Args[2], 10, 64)
    40  		if err == nil {
    41  			portStart = int(argPortStart)
    42  		}
    43  	}
    44  	fmt.Println("start port : ", portStart)
    45  
    46  	portLen := defaultPortLength
    47  	if len(os.Args) > 3 {
    48  		argPortLength, err := strconv.ParseInt(os.Args[3], 10, 64)
    49  		if err == nil {
    50  			portLen = int(argPortLength)
    51  		}
    52  	}
    53  	fmt.Println("start Len : ", portLen)
    54  
    55  	cl := []*rpc.Client{}
    56  	for i := 0; i < portLen; i++ {
    57  		client, err := rpc.Dial(fmt.Sprintf("http://localhost:%d", i+portStart))
    58  		if err != nil {
    59  			fmt.Println("rpc.Dial err", err)
    60  			return
    61  		}
    62  		cl = append(cl, client)
    63  	}
    64  
    65  	var result string
    66  	err := cl[0].Call(&result, "eth_getTransactionCount", fromAddress, "latest")
    67  	if err != nil {
    68  		fmt.Println("client.nonce err", err)
    69  		return
    70  	}
    71  	fmt.Printf("nonce : %s\n", result)
    72  	nonce, err := strconv.ParseInt(result[2:], 16, 64)
    73  	if err != nil {
    74  		fmt.Println("nonce parse fail", err)
    75  		return
    76  	}
    77  	fmt.Printf("nonce : %d\n", nonce)
    78  
    79  	err = cl[0].Call(&result, "net_version")
    80  	if err != nil {
    81  		fmt.Println("get chain id fail", err)
    82  		return
    83  	}
    84  	fmt.Printf("chainId: %s\n", result)
    85  	chainID, err := strconv.ParseInt(result, 10, 64)
    86  	if err != nil {
    87  		fmt.Println("parse chain id fail", err)
    88  		return
    89  	}
    90  
    91  	toAddress := common.HexToAddress(toAddress)
    92  	privateKey, err := crypto.HexToECDSA(pKey)
    93  	if err != nil {
    94  
    95  		fmt.Println("create private key err :", err)
    96  		return
    97  	}
    98  
    99  	txDataList := make([][]byte, count, count)
   100  
   101  	for i := nonce; i < nonce+count; i++ {
   102  		tx := types.NewTransaction(uint64(i), toAddress, big.NewInt(1), uint64(100000), big.NewInt(21000000), []byte{})
   103  		signedTx, err := types.SignTx(tx, types.NewEIP155Signer(big.NewInt(chainID)), privateKey)
   104  		data, err := rlp.EncodeToBytes(signedTx)
   105  		if err != nil {
   106  			fmt.Println("rlp Encode fail", err)
   107  			return
   108  		}
   109  		txDataList[i-nonce] = data
   110  	}
   111  
   112  	fmt.Println("tx data is ready")
   113  
   114  	wait := make(chan bool, portLen)
   115  	for i := 0; i < portLen; i++ {
   116  
   117  		go startSendTx(cl, txDataList, i, portLen, wait)
   118  	}
   119  
   120  	for i := 0; i < portLen; i++ {
   121  		<-wait
   122  	}
   123  
   124  	return
   125  }
   126  
   127  func startSendTx(cl []*rpc.Client, txDataList [][]byte, mod int, portLen int, finish chan<- bool) {
   128  	var result string
   129  	for i := range txDataList {
   130  		if i%portLen == mod {
   131  			err := cl[mod].Call(&result, "eth_sendRawTransaction", common.ToHex(txDataList[i]))
   132  			if err != nil {
   133  				fmt.Println("send Transaction fail", err)
   134  				return
   135  			}
   136  
   137  			if i%500 == 0 {
   138  				fmt.Printf("nonce is : %d \n", i)
   139  				fmt.Printf("send Transaction result : %s \n", result)
   140  			}
   141  		}
   142  	}
   143  	finish <- true
   144  }