Release66: P2P and Mining Improvements
This commit is contained in:
parent
a66d3d5051
commit
b2fe65c7a1
@ -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=<socks_ip:port>] [--data-dir=<directory>] [--p2p-bind=<0.0.0.0:18089>] [--add-exclusive-node=<ip:port>]... [--add-priority-node=<ip:port>]... [--min-peers=<11>] [--rpc-bind=<127.0.0.1:9999>] [--getwork-bind=<0.0.0.0:18089>] [--node-tag=<unique name>] [--prune-history=<50>] [--integrator-address=<address>] [--clog-level=1] [--flog-level=1]
|
||||
derod [--help] [--version] [--testnet] [--debug] [--sync-node] [--timeisinsync] [--fastsync] [--socks-proxy=<socks_ip:port>] [--data-dir=<directory>] [--p2p-bind=<0.0.0.0:18089>] [--add-exclusive-node=<ip:port>]... [--add-priority-node=<ip:port>]... [--min-peers=<11>] [--max-peers=<100>] [--rpc-bind=<127.0.0.1:9999>] [--getwork-bind=<0.0.0.0:18089>] [--node-tag=<unique name>] [--prune-history=<50>] [--integrator-address=<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> 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 <transaction_hash>\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"),
|
||||
|
@ -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.")
|
||||
|
@ -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
|
||||
|
@ -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")
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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})
|
||||
|
Loading…
Reference in New Issue
Block a user