aboutsummaryrefslogtreecommitdiffstats
path: root/cmd
diff options
context:
space:
mode:
authorWei-Ning Huang <w@dexon.org>2018-10-24 16:18:19 +0800
committerWei-Ning Huang <w@dexon.org>2019-03-12 12:19:09 +0800
commit08720a6cc45e2ce975b8284d91b2ebe9e40b46f7 (patch)
tree954bfc9e56ffaa130d8fdeda642f872ea9635959 /cmd
parent8d8d5b2251383bccb7486645560eac9722528596 (diff)
downloaddexon-08720a6cc45e2ce975b8284d91b2ebe9e40b46f7.tar.gz
dexon-08720a6cc45e2ce975b8284d91b2ebe9e40b46f7.tar.zst
dexon-08720a6cc45e2ce975b8284d91b2ebe9e40b46f7.zip
cmd: add a simple monkey tool for stress test
Diffstat (limited to 'cmd')
-rw-r--r--cmd/monkey/monkey.go93
1 files changed, 93 insertions, 0 deletions
diff --git a/cmd/monkey/monkey.go b/cmd/monkey/monkey.go
new file mode 100644
index 000000000..c155e5cf0
--- /dev/null
+++ b/cmd/monkey/monkey.go
@@ -0,0 +1,93 @@
+// Copyright 2018 The dexon-consensus-core Authors
+// This file is part of the dexon-consensus-core library.
+//
+// The dexon-consensus-core library is free software: you can redistribute it
+// and/or modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation, either version 3 of the License,
+// or (at your option) any later version.
+//
+// The dexon-consensus-core library is distributed in the hope that it will be
+// useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
+// General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the dexon-consensus-core library. If not, see
+// <http://www.gnu.org/licenses/>.
+
+// A simple monkey that sends random transactions into the network.
+
+package main
+
+import (
+ "context"
+ "flag"
+ "fmt"
+ "math/big"
+ "math/rand"
+ "time"
+
+ "github.com/dexon-foundation/dexon/common"
+ "github.com/dexon-foundation/dexon/core/types"
+ "github.com/dexon-foundation/dexon/crypto"
+ "github.com/dexon-foundation/dexon/ethclient"
+)
+
+var key = flag.String("key", "", "private key path")
+var endpoint = flag.String("endpoint", "http://localhost:8545", "JSON RPC endpoint")
+var tps = flag.Int("tps", 10, "transactions per second")
+
+func randomAddress() common.Address {
+ x := common.Address{}
+ for i := 0; i < 20; i++ {
+ x[i] = byte(rand.Int31() % 16)
+ }
+ return x
+}
+
+func main() {
+ flag.Parse()
+
+ privKey, err := crypto.LoadECDSA(*key)
+ if err != nil {
+ panic(err)
+ }
+
+ client, err := ethclient.Dial(*endpoint)
+ if err != nil {
+ panic(err)
+ }
+
+ address := crypto.PubkeyToAddress(privKey.PublicKey)
+
+ nonce, err := client.PendingNonceAt(context.Background(), address)
+ if err != nil {
+ panic(err)
+ }
+
+ for {
+ tx := types.NewTransaction(
+ nonce,
+ randomAddress(),
+ big.NewInt(10),
+ uint64(21000),
+ big.NewInt(1e9),
+ nil)
+
+ signer := types.NewEIP155Signer(big.NewInt(237))
+ tx, err = types.SignTx(tx, signer, privKey)
+ if err != nil {
+ panic(err)
+ }
+
+ err := client.SendTransaction(context.Background(), tx)
+ if err != nil {
+ panic(err)
+ }
+
+ fmt.Println("Sending TX", "fullhash", tx.Hash().String())
+
+ nonce++
+ time.Sleep(time.Duration(float32(time.Second) / float32(*tps)))
+ }
+}