fix:add justseen node

Signed-off-by: Chen Kai <281165273grape@gmail.com>
This commit is contained in:
Chen Kai 2024-02-22 16:21:27 +08:00
parent 12169d3848
commit a8ba15d62c
3 changed files with 34 additions and 9 deletions

View file

@ -10,6 +10,7 @@ import (
"github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/p2p/discover" "github.com/ethereum/go-ethereum/p2p/discover"
"github.com/ethereum/go-ethereum/p2p/discover/portalwire" "github.com/ethereum/go-ethereum/p2p/discover/portalwire"
"github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/enode"
@ -18,6 +19,11 @@ import (
) )
func main() { func main() {
glogger := log.NewGlogHandler(log.NewTerminalHandler(os.Stderr, true))
slogVerbosity := log.FromLegacyLevel(5)
glogger.Verbosity(slogVerbosity)
log.SetDefault(log.NewLogger(glogger))
var privateKey *ecdsa.PrivateKey var privateKey *ecdsa.PrivateKey
var err error var err error
privateKeyHex := os.Getenv("HIVE_CLIENT_PRIVATE_KEY") privateKeyHex := os.Getenv("HIVE_CLIENT_PRIVATE_KEY")

View file

@ -76,7 +76,9 @@ func (d *DiscV5API) AddEnr(enr string) (bool, error) {
return false, err return false, err
} }
d.DiscV5.tab.addSeenNode(wrapNode(n)) wn := wrapNode(n)
wn.livenessChecks++
d.DiscV5.tab.addVerifiedNode(wn)
return true, nil return true, nil
} }
@ -225,7 +227,9 @@ func (p *PortalAPI) HistoryAddEnr(enr string) (bool, error) {
return false, err return false, err
} }
p.portalProtocol.table.addSeenNode(wrapNode(n)) wn := wrapNode(n)
wn.livenessChecks++
p.portalProtocol.table.addVerifiedNode(wn)
return true, nil return true, nil
} }
@ -237,7 +241,9 @@ func (p *PortalAPI) AddEnrs(enrs []string) bool {
continue continue
} }
p.portalProtocol.table.addSeenNode(wrapNode(n)) wn := wrapNode(n)
wn.livenessChecks++
p.portalProtocol.table.addVerifiedNode(wn)
} }
return true return true

View file

@ -13,7 +13,6 @@ import (
"math/big" "math/big"
"math/rand" "math/rand"
"net" "net"
"os"
"sort" "sort"
"time" "time"
@ -202,12 +201,12 @@ func NewPortalProtocol(config *PortalProtocolConfig, protocolId string, privateK
if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
if ipnet.IP.To4() != nil { if ipnet.IP.To4() != nil {
localNode.SetStaticIP(ipnet.IP) localNode.SetStaticIP(ipnet.IP)
break
} }
} }
} }
closeCtx, cancelCloseCtx := context.WithCancel(context.Background()) closeCtx, cancelCloseCtx := context.WithCancel(context.Background())
log.SetDefault(log.NewLogger(log.NewTerminalHandlerWithLevel(os.Stderr, log.LevelTrace, true)))
protocol := &PortalProtocol{ protocol := &PortalProtocol{
protocolId: protocolId, protocolId: protocolId,
ListenAddr: config.ListenAddr, ListenAddr: config.ListenAddr,
@ -248,6 +247,9 @@ func (p *PortalProtocol) Start() error {
for i := 0; i < concurrentOffers; i++ { for i := 0; i < concurrentOffers; i++ {
go p.offerWorker() go p.offerWorker()
} }
// wait for the routing table to be initialized
<-p.table.initDone
return nil return nil
} }
@ -516,6 +518,7 @@ func (p *PortalProtocol) processOffer(target *enode.Node, resp []byte, request *
} }
p.log.Trace("Received accept response", "id", target.ID(), "accept", accept) p.log.Trace("Received accept response", "id", target.ID(), "accept", accept)
p.setJustSeen(target)
var contentKeyLen int var contentKeyLen int
if request.Kind == TransientOfferRequestKind { if request.Kind == TransientOfferRequestKind {
@ -636,6 +639,7 @@ func (p *PortalProtocol) processContent(target *enode.Node, resp []byte) (byte,
} }
p.log.Trace("Received content response", "id", target.ID(), "content", content) p.log.Trace("Received content response", "id", target.ID(), "content", content)
p.setJustSeen(target)
return resp[1], content.Content, nil return resp[1], content.Content, nil
case portalwire.ContentConnIdSelector: case portalwire.ContentConnIdSelector:
connIdMsg := &portalwire.ConnectionId{} connIdMsg := &portalwire.ConnectionId{}
@ -645,6 +649,7 @@ func (p *PortalProtocol) processContent(target *enode.Node, resp []byte) (byte,
} }
p.log.Trace("Received content response", "id", target.ID(), "connIdMsg", connIdMsg) p.log.Trace("Received content response", "id", target.ID(), "connIdMsg", connIdMsg)
p.setJustSeen(target)
connctx, conncancel := context.WithTimeout(p.closeCtx, defaultUTPConnectTimeout) connctx, conncancel := context.WithTimeout(p.closeCtx, defaultUTPConnectTimeout)
laddr := p.utp.Addr().(*utp.Addr) laddr := p.utp.Addr().(*utp.Addr)
raddr := &utp.Addr{IP: target.IP(), Port: target.UDP()} raddr := &utp.Addr{IP: target.IP(), Port: target.UDP()}
@ -686,7 +691,7 @@ func (p *PortalProtocol) processContent(target *enode.Node, resp []byte) (byte,
} }
p.log.Trace("Received content response", "id", target.ID(), "enrs", enrs) p.log.Trace("Received content response", "id", target.ID(), "enrs", enrs)
p.setJustSeen(target)
nodes := p.filterNodes(target, enrs.Enrs, nil) nodes := p.filterNodes(target, enrs.Enrs, nil)
return resp[1], nodes, nil return resp[1], nodes, nil
default: default:
@ -705,12 +710,18 @@ func (p *PortalProtocol) processNodes(target *enode.Node, resp []byte, distances
return nil, err return nil, err
} }
p.table.addVerifiedNode(wrapNode(target)) p.setJustSeen(target)
nodes := p.filterNodes(target, nodesResp.Enrs, distances) nodes := p.filterNodes(target, nodesResp.Enrs, distances)
return nodes, nil return nodes, nil
} }
func (p *PortalProtocol) setJustSeen(target *enode.Node) {
wn := wrapNode(target)
wn.livenessChecks++
p.table.addVerifiedNode(wn)
}
func (p *PortalProtocol) filterNodes(target *enode.Node, enrs [][]byte, distances []uint) []*enode.Node { func (p *PortalProtocol) filterNodes(target *enode.Node, enrs [][]byte, distances []uint) []*enode.Node {
var ( var (
nodes []*enode.Node nodes []*enode.Node
@ -761,9 +772,9 @@ func (p *PortalProtocol) processPong(target *enode.Node, resp []byte) (*portalwi
} }
p.log.Trace("Received pong response", "id", target.ID(), "pong", pong, "customPayload", customPayload) p.log.Trace("Received pong response", "id", target.ID(), "pong", pong, "customPayload", customPayload)
p.setJustSeen(target)
p.radiusCache.Set([]byte(target.ID().String()), customPayload.Radius) p.radiusCache.Set([]byte(target.ID().String()), customPayload.Radius)
p.table.addVerifiedNode(wrapNode(target))
return pong, nil return pong, nil
} }
@ -1308,7 +1319,9 @@ func (p *PortalProtocol) lookupWorker(destNode *node, target enode.ID) ([]*node,
} }
for _, n := range r { for _, n := range r {
if n.ID() != p.Self().ID() { if n.ID() != p.Self().ID() {
nodes.push(wrapNode(n), portalFindnodesResultLimit) wn := wrapNode(n)
p.table.addSeenNode(wn)
nodes.push(wn, portalFindnodesResultLimit)
} }
} }
return nodes.entries, err return nodes.entries, err