diff --git a/cmd/derod/main.go b/cmd/derod/main.go index 46a6c51..778e849 100644 --- a/cmd/derod/main.go +++ b/cmd/derod/main.go @@ -59,7 +59,7 @@ var command_line string = `derod DERO : A secure, private blockchain with smart-contracts Usage: - derod [--help] [--version] [--testnet] [--debug] [--sync-node] [--timeisinsync] [--fastsync] [--socks-proxy=] [--data-dir=] [--p2p-bind=<0.0.0.0:18089>] [--add-exclusive-node=]... [--add-priority-node=]... [--min-peers=<11>] [--rpc-bind=<127.0.0.1:9999>] [--getwork-bind=<0.0.0.0:18089>] [--node-tag=] [--prune-history=<50>] [--integrator-address=
] [--clog-level=1] [--flog-level=1] + derod [--help] [--version] [--testnet] [--debug] [--sync-node] [--timeisinsync] [--fastsync] [--socks-proxy=] [--data-dir=] [--p2p-bind=<0.0.0.0:18089>] [--add-exclusive-node=]... [--add-priority-node=]... [--min-peers=<11>] [--max-peers=<100>] [--rpc-bind=<127.0.0.1:9999>] [--getwork-bind=<0.0.0.0:18089>] [--node-tag=] [--prune-history=<50>] [--integrator-address=
] [--clog-level=1] [--flog-level=1] derod -h | --help derod --version @@ -82,6 +82,8 @@ Options: --sync-node Sync node automatically with the seeds nodes. This option is for rare use. --node-tag= Unique name of node, visible to everyone --integrator-address if this node mines a block,Integrator rewards will be given to address.default is dev's address. + --min-peers=<31> Node will try to maintain atleast this many connections to peers + --max-peers=<101> Node will maintain maximim this many connections to peers and will stop accepting connections --prune-history=<50> prunes blockchain history until the specific topo_height ` @@ -886,7 +888,7 @@ restart_loop: case strings.ToLower(line) == "peer_list": // print peer list p2p.PeerList_Print() - case strings.ToLower(line) == "sync_info": // print active connections + case strings.ToLower(line) == "syncinfo", strings.ToLower(line) == "sync_info": // print active connections p2p.Connection_Print() case strings.ToLower(line) == "bye": fallthrough @@ -1108,7 +1110,7 @@ func usage(w io.Writer) { io.WriteString(w, "\t\033[1mprint_tx\033[0m\tPrint transaction, print_tx \n") io.WriteString(w, "\t\033[1mstatus\033[0m\t\tShow general information\n") io.WriteString(w, "\t\033[1mpeer_list\033[0m\tPrint peer list\n") - io.WriteString(w, "\t\033[1msync_info\033[0m\tPrint information about connected peers and their state\n") + io.WriteString(w, "\t\033[1msyncinfo\033[0m\tPrint information about connected peers and their state\n") io.WriteString(w, "\t\033[1mbye\033[0m\t\tQuit the daemon\n") io.WriteString(w, "\t\033[1mban\033[0m\t\tBan specific ip from making any connections\n") io.WriteString(w, "\t\033[1munban\033[0m\t\tRevoke restrictions on previously banned ips\n") @@ -1146,7 +1148,7 @@ var completer = readline.NewPrefixCompleter( // readline.PcItem("print_tx"), readline.PcItem("setintegratoraddress"), readline.PcItem("status"), - readline.PcItem("sync_info"), + readline.PcItem("syncinfo"), readline.PcItem("version"), readline.PcItem("bye"), readline.PcItem("exit"), diff --git a/cmd/derod/rpc/websocket_getwork_server.go b/cmd/derod/rpc/websocket_getwork_server.go index 535fd90..2d877b5 100644 --- a/cmd/derod/rpc/websocket_getwork_server.go +++ b/cmd/derod/rpc/websocket_getwork_server.go @@ -4,6 +4,7 @@ import ( "flag" "fmt" "net/http" + "os" "time" @@ -65,14 +66,19 @@ type user_session struct { var client_list_mutex sync.Mutex var client_list = map[*websocket.Conn]*user_session{} +var miners_count int + func CountMiners() int { client_list_mutex.Lock() defer client_list_mutex.Unlock() - return len(client_list) + miners_count = len(client_list) + return miners_count } func SendJob() { + defer globals.Recover(1) + var params rpc.GetBlockTemplate_Result // get a block template, and then we will fill the address here as optimization @@ -282,7 +288,32 @@ func Getwork_server() { memPool.Put(b) }) - globals.Cron.AddFunc("@every 2s", SendJob) // if daemon restart automaticaly send job + //globals.Cron.AddFunc("@every 2s", SendJob) // if daemon restart automaticaly send job + go func() { // try to be as optimized as possible to lower hash wastage + sleeptime, _ := time.ParseDuration(os.Getenv("JOB_SEND_TIME_DELAY")) // this will hopefully be never required to change + if sleeptime.Milliseconds() < 40 { + sleeptime = 500 * time.Millisecond + } + logger_getwork.Info("Job will be dispatched every", "time", sleeptime) + old_mini_count := 0 + old_time := time.Now() + old_height := int64(0) + for { + if miners_count > 0 { + current_mini_count := chain.MiniBlocks.Count() + current_height := chain.Get_Height() + if old_mini_count != current_mini_count || old_height != current_height || time.Now().Sub(old_time) > sleeptime { + old_mini_count = current_mini_count + old_height = current_height + SendJob() + old_time = time.Now() + } + } else { + + } + time.Sleep(10 * time.Millisecond) + } + }() if err = svr.Start(); err != nil { logger_getwork.Error(err, "nbio.Start failed.") diff --git a/config/seed_nodes.go b/config/seed_nodes.go index cafa509..3c1a490 100644 --- a/config/seed_nodes.go +++ b/config/seed_nodes.go @@ -25,6 +25,7 @@ var Mainnet_seed_nodes = []string{ "45.82.66.54:8080", "185.107.69.12:11011", "89.38.97.110:11011", + "45.82.66.55:11011", } // some seed node for testnet diff --git a/config/version.go b/config/version.go index 0713e8c..e8ba6b7 100644 --- a/config/version.go +++ b/config/version.go @@ -20,4 +20,4 @@ import "github.com/blang/semver/v4" // right now it has to be manually changed // do we need to include git commitsha?? -var Version = semver.MustParse("3.4.141-62.DEROHE.STARGATE+26022022") +var Version = semver.MustParse("3.4.141-66.DEROHE.STARGATE+26022022") diff --git a/p2p/connection_pool.go b/p2p/connection_pool.go index c1e6d1a..fb0ba6d 100644 --- a/p2p/connection_pool.go +++ b/p2p/connection_pool.go @@ -20,6 +20,7 @@ package p2p * this will also ensure that a single IP is connected only once * */ +import "os" import "fmt" import "net" import "math" @@ -27,6 +28,7 @@ import "sync" import "sort" import "time" import "strings" +import "strconv" import "context" import "sync/atomic" import "runtime/debug" @@ -405,8 +407,12 @@ func broadcast_Block_Coded(cbl *block.Complete_Block, PeerID uint64, first_seen return connections[i].Latency < connections[j].Latency }) + bw_factor, _ := strconv.Atoi(os.Getenv("BW_FACTOR")) + if bw_factor < 1 { + bw_factor = 1 + } + for { // we must send all blocks atleast once, once we are done, break ut - old_count := count for _, v := range connections { select { case <-Exit_Event: @@ -415,16 +421,16 @@ func broadcast_Block_Coded(cbl *block.Complete_Block, PeerID uint64, first_seen } if atomic.LoadUint32(&v.State) != HANDSHAKE_PENDING && PeerID != v.Peer_ID && v.Peer_ID != GetPeerID() { // skip pre-handshake connections - // if the other end is > 50 blocks behind, do not broadcast block to hime + // if the other end is > 2 blocks behind, do not broadcast block to hime // this is an optimisation, since if the other end is syncing // every peer will keep on broadcasting and thus making it more lagging // due to overheads peer_height := atomic.LoadInt64(&v.Height) - if (our_height - peer_height) > 25 { + if (our_height - peer_height) > 2 { continue } - if count > chunk_count { + if count > len(unique_map) && count > bw_factor*chunk_count { // every connected peer shuld get ateleast one chunk goto done } @@ -450,11 +456,6 @@ func broadcast_Block_Coded(cbl *block.Complete_Block, PeerID uint64, first_seen count++ } } - if old_count == count { // exit the loop - break - } - old_count = count - } done: diff --git a/p2p/controller.go b/p2p/controller.go index 4fd1009..6761d74 100644 --- a/p2p/controller.go +++ b/p2p/controller.go @@ -72,6 +72,7 @@ var backoff = map[string]int64{} // if server receives a connection, then it wil var backoff_mutex = sync.Mutex{} var Min_Peers = int64(31) // we need to expose this to be modifieable at runtime without taking daemon offline +var Max_Peers = int64(101) // return true if we should back off else we can connect func shouldwebackoff(ip string) bool { @@ -111,6 +112,14 @@ func P2P_Init(params map[string]interface{}) error { logger.Info("P2P is in turbo mode") } + if os.Getenv("BW_FACTOR") != "" { + bw_factor, _ := strconv.Atoi(os.Getenv("BW_FACTOR")) + if bw_factor <= 0 { + bw_factor = 1 + } + logger.Info("", "BW_FACTOR", bw_factor) + } + // permanently unban any seed nodes if globals.IsMainnet() { for i := range config.Mainnet_seed_nodes { @@ -419,7 +428,21 @@ func maintain_connection_to_peers() { Min_Peers = i } } - logger.Info("Min outgoing peers", "min-peers", Min_Peers) + logger.Info("Min peers", "min-peers", Min_Peers) + } + + if _, ok := globals.Arguments["--max-peers"]; ok && globals.Arguments["--max-peers"] != nil { // user specified a limit, use it if possible + i, err := strconv.ParseInt(globals.Arguments["--max-peers"].(string), 10, 64) + if err != nil { + logger.Error(err, "Error Parsing --max-peers") + } else { + if i < Min_Peers { + logger.Error(fmt.Errorf("--max-peers should be positive and more than --min-peers"), "") + } else { + Max_Peers = i + } + } + logger.Info("Max peers", "max-peers", Max_Peers) } delay := time.NewTicker(200 * time.Millisecond) @@ -481,7 +504,7 @@ func P2P_Server_v2() { in, out := Peer_Direction_Count() - if int64(in+out) > Min_Peers { // do not allow incoming ddos + if int64(in+out) > Max_Peers { // do not allow incoming ddos connection.exit() return } diff --git a/p2p/peer_pool.go b/p2p/peer_pool.go index 1fb369e..c48348f 100644 --- a/p2p/peer_pool.go +++ b/p2p/peer_pool.go @@ -206,6 +206,7 @@ func Peer_SetSuccess(address string) { p.ConnectAfter = 0 p.Whitelist = true p.LastConnected = uint64(time.Now().UTC().Unix()) // set time when last connected + // logger.Infof("Setting peer as white listed") } @@ -316,6 +317,12 @@ func get_peer_list() (peers []Peer_Info) { peer_mutex.Lock() defer peer_mutex.Unlock() + for _, v := range peer_map { // trim the white list + if v.Whitelist && !IsAddressConnected(ParseIPNoError(v.Address)) { + delete(peer_map, ParseIPNoError(v.Address)) + } + } + for _, v := range peer_map { if v.Whitelist { peers = append(peers, Peer_Info{Addr: v.Address})