cmd/devp2p: fix discv5 PingMultiIP handshake reply addr

Signed-off-by: Delweng <delweng@gmail.com>
This commit is contained in:
Delweng 2026-02-26 11:37:47 +08:00
parent db7d3a4e0e
commit 0f2eb27996

View file

@ -65,6 +65,7 @@ type conn struct {
log logger log logger
codec *v5wire.Codec codec *v5wire.Codec
idCounter uint32 idCounter uint32
lastFrom string
} }
type logger interface { type logger interface {
@ -200,7 +201,11 @@ func (tc *conn) findnode(c net.PacketConn, dists []uint) ([]*enode.Node, error)
// write sends a packet on the given connection. // write sends a packet on the given connection.
func (tc *conn) write(c net.PacketConn, p v5wire.Packet, challenge *v5wire.Whoareyou) v5wire.Nonce { func (tc *conn) write(c net.PacketConn, p v5wire.Packet, challenge *v5wire.Whoareyou) v5wire.Nonce {
packet, nonce, err := tc.codec.Encode(tc.remote.ID(), tc.remoteAddr.String(), p, challenge) addr := tc.remoteAddr.String()
if challenge != nil && tc.lastFrom != "" {
addr = tc.lastFrom
}
packet, nonce, err := tc.codec.Encode(tc.remote.ID(), addr, p, challenge)
if err != nil { if err != nil {
panic(fmt.Errorf("can't encode %v packet: %v", p.Name(), err)) panic(fmt.Errorf("can't encode %v packet: %v", p.Name(), err))
} }
@ -222,6 +227,7 @@ func (tc *conn) read(c net.PacketConn) v5wire.Packet {
if err != nil { if err != nil {
return &readError{err} return &readError{err}
} }
tc.lastFrom = fromAddr.String()
_, _, p, err := tc.codec.Decode(buf[:n], fromAddr.String()) _, _, p, err := tc.codec.Decode(buf[:n], fromAddr.String())
if err != nil { if err != nil {
return &readError{err} return &readError{err}