aboutsummaryrefslogtreecommitdiffstats
path: root/cmd/monkey/monkey.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/monkey/monkey.go')
-rw-r--r--cmd/monkey/monkey.go284
1 files changed, 0 insertions, 284 deletions
diff --git a/cmd/monkey/monkey.go b/cmd/monkey/monkey.go
deleted file mode 100644
index bbf534952..000000000
--- a/cmd/monkey/monkey.go
+++ /dev/null
@@ -1,284 +0,0 @@
-// Copyright 2018 The dexon-consensus Authors
-// This file is part of the dexon-consensus library.
-//
-// The dexon-consensus 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 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 library. If not, see
-// <http://www.gnu.org/licenses/>.
-
-// A simple monkey that sends random transactions into the network.
-
-package main
-
-import (
- "context"
- "crypto/ecdsa"
- "flag"
- "fmt"
- "math"
- "math/big"
- "math/rand"
- "time"
-
- dexon "github.com/dexon-foundation/dexon"
- "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://127.0.0.1:8545", "JSON RPC endpoint")
-var n = flag.Int("n", 100, "number of random accounts")
-var gambler = flag.Bool("gambler", false, "make this monkey a gambler")
-var batch = flag.Bool("batch", false, "monkeys will send transaction in batch")
-var sleep = flag.Int("sleep", 500, "time in millisecond that monkeys sleep between each transaction")
-var feeder = flag.Bool("feeder", false, "make this monkey a feeder")
-
-type Monkey struct {
- client *ethclient.Client
- source *ecdsa.PrivateKey
- keys []*ecdsa.PrivateKey
- networkID *big.Int
-}
-
-func New(ep string, source *ecdsa.PrivateKey, num int) *Monkey {
- client, err := ethclient.Dial(ep)
- if err != nil {
- panic(err)
- }
-
- var keys []*ecdsa.PrivateKey
-
- for i := 0; i < num; i++ {
- key, err := crypto.GenerateKey()
- if err != nil {
- panic(err)
- }
- keys = append(keys, key)
- }
-
- networkID, err := client.NetworkID(context.Background())
- if err != nil {
- panic(err)
- }
-
- return &Monkey{
- client: client,
- source: source,
- keys: keys,
- networkID: networkID,
- }
-}
-
-type transferContext struct {
- Key *ecdsa.PrivateKey
- ToAddress common.Address
- Amount *big.Int
- Data []byte
- Nonce uint64
- Gas uint64
-}
-
-func (m *Monkey) prepareTx(ctx *transferContext) *types.Transaction {
- if ctx.Nonce == math.MaxUint64 {
- var err error
- address := crypto.PubkeyToAddress(ctx.Key.PublicKey)
- ctx.Nonce, err = m.client.PendingNonceAt(context.Background(), address)
- if err != nil {
- panic(err)
- }
- }
-
- if ctx.Gas == uint64(0) {
- var err error
- ctx.Gas, err = m.client.EstimateGas(context.Background(), dexon.CallMsg{
- Data: ctx.Data,
- })
- if err != nil {
- panic(err)
- }
- }
-
- tx := types.NewTransaction(
- ctx.Nonce,
- ctx.ToAddress,
- ctx.Amount,
- ctx.Gas,
- big.NewInt(1e9),
- ctx.Data)
-
- signer := types.NewEIP155Signer(m.networkID)
- tx, err := types.SignTx(tx, signer, ctx.Key)
- if err != nil {
- panic(err)
- }
-
- return tx
-}
-
-func (m *Monkey) transfer(ctx *transferContext) {
- tx := m.prepareTx(ctx)
-
- err := m.client.SendTransaction(context.Background(), tx)
- if err != nil {
- panic(err)
- }
-}
-
-func (m *Monkey) batchTransfer(ctxs []*transferContext) {
- txs := make([]*types.Transaction, len(ctxs))
- for i, ctx := range ctxs {
- txs[i] = m.prepareTx(ctx)
- }
-
- err := m.client.SendTransactions(context.Background(), txs)
- if err != nil {
- panic(err)
- }
-}
-
-func (m *Monkey) deploy(
- key *ecdsa.PrivateKey, code string, ctors []string, amount *big.Int, nonce uint64) common.Address {
-
- address := crypto.PubkeyToAddress(key.PublicKey)
- if nonce == math.MaxUint64 {
- var err error
- nonce, err = m.client.PendingNonceAt(context.Background(), address)
- if err != nil {
- panic(err)
- }
- }
-
- var input string
- for _, ctor := range ctors {
- input += fmt.Sprintf("%064s", ctor)
- }
- data := common.Hex2Bytes(code + input)
-
- gas, err := m.client.EstimateGas(context.Background(), dexon.CallMsg{
- From: address,
- Data: data,
- })
- if err != nil {
- panic(err)
- }
-
- tx := types.NewContractCreation(
- nonce,
- amount,
- gas,
- big.NewInt(1e9),
- data)
-
- signer := types.NewEIP155Signer(m.networkID)
- tx, err = types.SignTx(tx, signer, key)
- if err != nil {
- panic(err)
- }
-
- fmt.Println("Sending TX", "fullhash", tx.Hash().String())
-
- err = m.client.SendTransaction(context.Background(), tx)
- if err != nil {
- panic(err)
- }
-
- for {
- time.Sleep(500 * time.Millisecond)
- recp, err := m.client.TransactionReceipt(context.Background(), tx.Hash())
- if err != nil {
- if err == dexon.NotFound {
- continue
- }
- panic(err)
- }
- return recp.ContractAddress
- }
-}
-
-func (m *Monkey) Distribute() {
- fmt.Println("Distributing DEX to random accounts ...")
- address := crypto.PubkeyToAddress(m.source.PublicKey)
- nonce, err := m.client.PendingNonceAt(context.Background(), address)
- if err != nil {
- panic(err)
- }
-
- ctxs := make([]*transferContext, len(m.keys))
- for i, key := range m.keys {
- address := crypto.PubkeyToAddress(key.PublicKey)
- amount := new(big.Int)
- amount.SetString("100000000000000000000", 10)
- ctxs[i] = &transferContext{
- Key: m.source,
- ToAddress: address,
- Amount: amount,
- Nonce: nonce,
- Gas: 21000,
- }
- nonce += 1
- }
- m.batchTransfer(ctxs)
- time.Sleep(20 * time.Second)
-}
-
-func (m *Monkey) Crazy() {
- fmt.Println("Performing random transfers ...")
- nonce := uint64(0)
- for {
- ctxs := make([]*transferContext, len(m.keys))
- for i, key := range m.keys {
- to := crypto.PubkeyToAddress(m.keys[rand.Int()%len(m.keys)].PublicKey)
- amount := new(big.Int)
- amount.SetString(fmt.Sprintf("%d000000000000000", rand.Intn(10)+1), 10)
- ctx := &transferContext{
- Key: key,
- ToAddress: to,
- Amount: amount,
- Nonce: nonce,
- Gas: 21000,
- }
- if *batch {
- ctxs[i] = ctx
- } else {
- m.transfer(ctx)
- }
- }
- if *batch {
- m.batchTransfer(ctxs)
- }
- fmt.Printf("Sent %d transactions, nonce = %d\n", len(m.keys), nonce)
-
- nonce += 1
- time.Sleep(time.Duration(*sleep) * time.Millisecond)
- }
-}
-
-func main() {
- flag.Parse()
-
- privKey, err := crypto.LoadECDSA(*key)
- if err != nil {
- panic(err)
- }
-
- m := New(*endpoint, privKey, *n)
- m.Distribute()
- if *gambler {
- m.Gamble()
- } else if *feeder {
- m.Feed()
- } else {
- m.Crazy()
- }
-}