status-go/_assets/patches/geth/0030-discovery-status-dht.patch
Dmitry Shulyak ed1cdf0418
Custom status bootnodes (#968)
This change makes invalidation mechanism more aggressive. With a primary goal to invalidate short living nodes faster. In current setup any node that became known in terms of discovery will stay in this state until it will fail to respond to 5 queries. Removing them earlier from a table allows to reduce latency for finding required nodes.

The second change, one adds a version for discovery, separates status dht from ethereum dht.
After we rolled out discovery it became obvious that our boot nodes became spammed with irrelevant nodes. And this made discovery process very long, for example with separate dht discovery takes ~2s, with mutual dht - it can take 1m-10m and there is still no guarantee to find a max amount of peers, cause status nodes is a very small part of whole ethereum infra.

In my understanding, we don't need to be a part of ethereum dht, and lower latency is way more important for us.

Closes: #941
Partially closes: #960 (960 requires futher investigations on devices)
2018-05-18 16:43:07 +03:00

65 lines
1.9 KiB
Diff

diff --git c/p2p/discv5/net.go w/p2p/discv5/net.go
index 9b0bd0c80..d0eae28f9 100644
--- c/p2p/discv5/net.go
+++ w/p2p/discv5/net.go
@@ -40,7 +40,7 @@ var (
const (
autoRefreshInterval = 1 * time.Hour
- bucketRefreshInterval = 1 * time.Minute
+ bucketRefreshInterval = 10 * time.Second
seedCount = 30
seedMaxAge = 5 * 24 * time.Hour
lowPort = 1024
@@ -1055,7 +1055,11 @@ func (net *Network) handle(n *Node, ev nodeEvent, pkt *ingressPacket) error {
func (net *Network) checkPacket(n *Node, ev nodeEvent, pkt *ingressPacket) error {
// Replay prevention checks.
switch ev {
- case pingPacket, findnodeHashPacket, neighborsPacket:
+ case pingPacket:
+ if pkt.data.(*ping).Version != Version {
+ return fmt.Errorf("version mismatch")
+ }
+ case findnodeHashPacket, neighborsPacket:
// TODO: check date is > last date seen
// TODO: check ping version
case pongPacket:
diff --git c/p2p/discv5/table.go w/p2p/discv5/table.go
index c8d234b93..42311e1db 100644
--- c/p2p/discv5/table.go
+++ w/p2p/discv5/table.go
@@ -38,7 +38,7 @@ const (
hashBits = len(common.Hash{}) * 8
nBuckets = hashBits + 1 // Number of buckets
- maxFindnodeFailures = 5
+ maxFindnodeFailures = 1
)
type Table struct {
@@ -177,6 +177,11 @@ func (tab *Table) closest(target common.Hash, nresults int) *nodesByDistance {
close := &nodesByDistance{target: target}
for _, b := range tab.buckets {
for _, n := range b.entries {
+ // node can be in table only in two states
+ // known and contested
+ if n.state != known {
+ continue
+ }
close.push(n, nresults)
}
}
diff --git c/p2p/discv5/udp.go w/p2p/discv5/udp.go
index 49e1cb811..0ead22753 100644
--- c/p2p/discv5/udp.go
+++ w/p2p/discv5/udp.go
@@ -32,7 +32,7 @@ import (
"github.com/ethereum/go-ethereum/rlp"
)
-const Version = 4
+const Version = 55
// Errors
var (