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 }