|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bufio"
|
|
|
|
"flag"
|
|
|
|
"fmt"
|
|
|
|
"harmony-benchmark/blockchain"
|
|
|
|
"harmony-benchmark/node"
|
|
|
|
"harmony-benchmark/p2p"
|
|
|
|
"log"
|
|
|
|
"math/rand"
|
|
|
|
"os"
|
|
|
|
"strings"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
func newRandTransaction() blockchain.Transaction {
|
|
|
|
txin := blockchain.TXInput{[]byte{}, rand.Intn(100), string(rand.Uint64())}
|
|
|
|
txout := blockchain.TXOutput{rand.Intn(100), string(rand.Uint64())}
|
|
|
|
tx := blockchain.Transaction{nil, []blockchain.TXInput{txin}, []blockchain.TXOutput{txout}}
|
|
|
|
tx.SetID()
|
|
|
|
|
|
|
|
return tx
|
|
|
|
}
|
|
|
|
|
|
|
|
func getValidators(config string) []p2p.Peer {
|
|
|
|
file, _ := os.Open(config)
|
|
|
|
fscanner := bufio.NewScanner(file)
|
|
|
|
var peerList []p2p.Peer
|
|
|
|
for fscanner.Scan() {
|
|
|
|
p := strings.Split(fscanner.Text(), " ")
|
|
|
|
ip, port, status := p[0], p[1], p[2]
|
|
|
|
if status == "leader" {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
peer := p2p.Peer{Port: port, Ip: ip}
|
|
|
|
peerList = append(peerList, peer)
|
|
|
|
}
|
|
|
|
return peerList
|
|
|
|
}
|
|
|
|
|
|
|
|
func getLeaders(config *[][]string) []p2p.Peer {
|
|
|
|
var peerList []p2p.Peer
|
|
|
|
for _, node := range *config {
|
|
|
|
ip, port, status := node[0], node[1], node[2]
|
|
|
|
if status == "leader" {
|
|
|
|
peerList = append(peerList, p2p.Peer{Ip: ip, Port: port})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return peerList
|
|
|
|
}
|
|
|
|
|
|
|
|
func readConfigFile(configFile string) [][]string {
|
|
|
|
file, _ := os.Open(configFile)
|
|
|
|
fscanner := bufio.NewScanner(file)
|
|
|
|
|
|
|
|
result := [][]string{}
|
|
|
|
for fscanner.Scan() {
|
|
|
|
p := strings.Split(fscanner.Text(), " ")
|
|
|
|
result = append(result, p)
|
|
|
|
}
|
|
|
|
return result
|
|
|
|
}
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
configFile := flag.String("config_file", "local_config.txt", "file containing all ip addresses and config")
|
|
|
|
flag.Parse()
|
|
|
|
config := readConfigFile(*configFile)
|
|
|
|
|
|
|
|
start := time.Now()
|
|
|
|
totalTime := 60.0
|
|
|
|
txs := make([]blockchain.Transaction, 10)
|
|
|
|
leaders := getLeaders(&config)
|
|
|
|
for true {
|
|
|
|
t := time.Now()
|
|
|
|
if t.Sub(start).Seconds() >= totalTime {
|
|
|
|
fmt.Println(int(t.Sub(start)), start, totalTime)
|
|
|
|
break
|
|
|
|
}
|
|
|
|
for i := range txs {
|
|
|
|
txs[i] = newRandTransaction()
|
|
|
|
|
|
|
|
}
|
|
|
|
msg := node.ConstructTransactionListMessage(txs)
|
|
|
|
log.Printf("[Generator] Sending txs to %d leader[s]\n", len(leaders))
|
|
|
|
p2p.BroadcastMessage(leaders, msg)
|
|
|
|
time.Sleep(1 * time.Second) // 10 transactions per second
|
|
|
|
}
|
|
|
|
msg := node.ConstructStopMessage()
|
|
|
|
peers := append(getValidators(*configFile), leaders...)
|
|
|
|
p2p.BroadcastMessage(peers, msg)
|
|
|
|
}
|