mirror of
https://github.com/logos-messaging/go-discover.git
synced 2026-01-02 13:03:12 +00:00
feat: Add ProtocolID to the UDP config
This commit is contained in:
parent
87bd8c3fe4
commit
1d9628ff46
@ -25,6 +25,7 @@ import (
|
||||
"github.com/ethereum/go-ethereum/p2p/enode"
|
||||
"github.com/ethereum/go-ethereum/p2p/enr"
|
||||
"github.com/ethereum/go-ethereum/p2p/netutil"
|
||||
"github.com/status-im/go-discover/discover/v5wire"
|
||||
)
|
||||
|
||||
// UDPConn is a network connection on which discovery can operate.
|
||||
@ -35,6 +36,10 @@ type UDPConn interface {
|
||||
LocalAddr() net.Addr
|
||||
}
|
||||
|
||||
type V5Config struct {
|
||||
ProtocolID [6]byte
|
||||
}
|
||||
|
||||
// Config holds settings for the discovery listener.
|
||||
type Config struct {
|
||||
// These settings are required and configure the UDP listener:
|
||||
@ -48,6 +53,7 @@ type Config struct {
|
||||
ValidSchemes enr.IdentityScheme // allowed identity schemes
|
||||
Clock mclock.Clock
|
||||
ValidNodeFn func(enode.Node) bool // function to validate a node before it's added to routing tables
|
||||
V5Config V5Config // DiscV5 settings
|
||||
}
|
||||
|
||||
func (cfg Config) withDefaults() Config {
|
||||
@ -60,6 +66,9 @@ func (cfg Config) withDefaults() Config {
|
||||
if cfg.Clock == nil {
|
||||
cfg.Clock = mclock.System{}
|
||||
}
|
||||
if len(cfg.V5Config.ProtocolID) == 0 {
|
||||
cfg.V5Config.ProtocolID = v5wire.DefaultProtocolID
|
||||
}
|
||||
return cfg
|
||||
}
|
||||
|
||||
|
||||
@ -156,7 +156,7 @@ func newUDPv5(conn UDPConn, ln *enode.LocalNode, cfg Config) (*UDPv5, error) {
|
||||
callDoneCh: make(chan *callV5),
|
||||
respTimeoutCh: make(chan *callTimeout),
|
||||
// state of dispatch
|
||||
codec: v5wire.NewCodec(ln, cfg.PrivateKey, cfg.Clock),
|
||||
codec: v5wire.NewCodec(ln, cfg.PrivateKey, cfg.Clock, cfg.V5Config.ProtocolID),
|
||||
activeCallByNode: make(map[enode.ID]*callV5),
|
||||
activeCallByAuth: make(map[v5wire.Nonce]*callV5),
|
||||
callQueue: make(map[enode.ID][]*callV5),
|
||||
|
||||
@ -94,7 +94,7 @@ const (
|
||||
randomPacketMsgSize = 20
|
||||
)
|
||||
|
||||
var protocolID = [6]byte{'d', 'i', 's', 'c', 'v', '5'}
|
||||
var DefaultProtocolID = [6]byte{'d', 'i', 's', 'c', 'v', '5'}
|
||||
|
||||
// Errors.
|
||||
var (
|
||||
@ -134,6 +134,8 @@ type Codec struct {
|
||||
privkey *ecdsa.PrivateKey
|
||||
sc *SessionCache
|
||||
|
||||
protocolID [6]byte
|
||||
|
||||
// encoder buffers
|
||||
buf bytes.Buffer // whole packet
|
||||
headbuf bytes.Buffer // packet header
|
||||
@ -145,12 +147,13 @@ type Codec struct {
|
||||
}
|
||||
|
||||
// NewCodec creates a wire codec.
|
||||
func NewCodec(ln *enode.LocalNode, key *ecdsa.PrivateKey, clock mclock.Clock) *Codec {
|
||||
func NewCodec(ln *enode.LocalNode, key *ecdsa.PrivateKey, clock mclock.Clock, protocolID [6]byte) *Codec {
|
||||
c := &Codec{
|
||||
sha256: sha256.New(),
|
||||
localnode: ln,
|
||||
privkey: key,
|
||||
sc: NewSessionCache(1024, clock),
|
||||
sha256: sha256.New(),
|
||||
localnode: ln,
|
||||
privkey: key,
|
||||
sc: NewSessionCache(1024, clock),
|
||||
protocolID: protocolID,
|
||||
}
|
||||
return c
|
||||
}
|
||||
@ -250,7 +253,7 @@ func (c *Codec) makeHeader(toID enode.ID, flag byte, authsizeExtra int) Header {
|
||||
}
|
||||
return Header{
|
||||
StaticHeader: StaticHeader{
|
||||
ProtocolID: protocolID,
|
||||
ProtocolID: c.protocolID,
|
||||
Version: version,
|
||||
Flag: flag,
|
||||
AuthSize: uint16(authsize),
|
||||
@ -429,7 +432,7 @@ func (c *Codec) Decode(input []byte, addr string) (src enode.ID, n *enode.Node,
|
||||
c.reader.Reset(staticHeader)
|
||||
binary.Read(&c.reader, binary.BigEndian, &head.StaticHeader)
|
||||
remainingInput := len(input) - sizeofStaticPacketData
|
||||
if err := head.checkValid(remainingInput); err != nil {
|
||||
if err := head.checkValid(remainingInput, c.protocolID); err != nil {
|
||||
return enode.ID{}, nil, nil, err
|
||||
}
|
||||
|
||||
@ -616,7 +619,7 @@ func (c *Codec) decryptMessage(input, nonce, headerData, readKey []byte) (Packet
|
||||
|
||||
// checkValid performs some basic validity checks on the header.
|
||||
// The packetLen here is the length remaining after the static header.
|
||||
func (h *StaticHeader) checkValid(packetLen int) error {
|
||||
func (h *StaticHeader) checkValid(packetLen int, protocolID [6]byte) error {
|
||||
if h.ProtocolID != protocolID {
|
||||
return errInvalidHeader
|
||||
}
|
||||
|
||||
@ -498,8 +498,8 @@ type handshakeTestNode struct {
|
||||
|
||||
func newHandshakeTest() *handshakeTest {
|
||||
t := new(handshakeTest)
|
||||
t.nodeA.init(testKeyA, net.IP{127, 0, 0, 1}, &t.clock)
|
||||
t.nodeB.init(testKeyB, net.IP{127, 0, 0, 1}, &t.clock)
|
||||
t.nodeA.init(testKeyA, net.IP{127, 0, 0, 1}, &t.clock, [6]byte{'d', 'i', 's', 'c', 'v', '5'})
|
||||
t.nodeB.init(testKeyB, net.IP{127, 0, 0, 1}, &t.clock, [6]byte{'d', 'i', 's', 'c', 'v', '5'})
|
||||
return t
|
||||
}
|
||||
|
||||
@ -508,11 +508,11 @@ func (t *handshakeTest) close() {
|
||||
t.nodeB.ln.Database().Close()
|
||||
}
|
||||
|
||||
func (n *handshakeTestNode) init(key *ecdsa.PrivateKey, ip net.IP, clock mclock.Clock) {
|
||||
func (n *handshakeTestNode) init(key *ecdsa.PrivateKey, ip net.IP, clock mclock.Clock, protocolID [6]byte) {
|
||||
db, _ := enode.OpenDB("")
|
||||
n.ln = enode.NewLocalNode(db, key)
|
||||
n.ln.SetStaticIP(ip)
|
||||
n.c = NewCodec(n.ln, key, clock)
|
||||
n.c = NewCodec(n.ln, key, clock, protocolID)
|
||||
}
|
||||
|
||||
func (n *handshakeTestNode) encode(t testing.TB, to handshakeTestNode, p Packet) ([]byte, Nonce) {
|
||||
|
||||
27
discover/v5wire/testdata/v5.1-ping-handshake-enr.txt
vendored
Normal file
27
discover/v5wire/testdata/v5.1-ping-handshake-enr.txt
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
# src-node-id = 0xaaaa8419e9f49d0083561b48287df592939a8d19947d8c0ef88f2a4856a69fbb
|
||||
# dest-node-id = 0xbbbb9d047f0488c0b5a93c1c3f2d8bafc7c8ff337024a55434a0d0555de64db9
|
||||
# nonce = 0xffffffffffffffffffffffff
|
||||
# read-key = 0x53b1c075f41876423154e157470c2f48
|
||||
# ping.req-id = 0x00000001
|
||||
# ping.enr-seq = 1
|
||||
#
|
||||
# handshake inputs:
|
||||
#
|
||||
# whoareyou.challenge-data = 0x000000000000000000000000000000006469736376350001010102030405060708090a0b0c00180102030405060708090a0b0c0d0e0f100000000000000000
|
||||
# whoareyou.request-nonce = 0x0102030405060708090a0b0c
|
||||
# whoareyou.id-nonce = 0x0102030405060708090a0b0c0d0e0f10
|
||||
# whoareyou.enr-seq = 0
|
||||
# ephemeral-key = 0x0288ef00023598499cb6c940146d050d2b1fb914198c327f76aad590bead68b6
|
||||
# ephemeral-pubkey = 0x039a003ba6517b473fa0cd74aefe99dadfdb34627f90fec6362df85803908f53a5
|
||||
|
||||
00000000000000000000000000000000088b3d4342774649305f313964a39e55
|
||||
ea96c005ad539c8c7560413a7008f16c9e6d2f43bbea8814a546b7409ce783d3
|
||||
4c4f53245d08da4bb23698868350aaad22e3ab8dd034f548a1c43cd246be9856
|
||||
2fafa0a1fa86d8e7a3b95ae78cc2b988ded6a5b59eb83ad58097252188b902b2
|
||||
1481e30e5e285f19735796706adff216ab862a9186875f9494150c4ae06fa4d1
|
||||
f0396c93f215fa4ef524e0ed04c3c21e39b1868e1ca8105e585ec17315e755e6
|
||||
cfc4dd6cb7fd8e1a1f55e49b4b5eb024221482105346f3c82b15fdaae36a3bb1
|
||||
2a494683b4a3c7f2ae41306252fed84785e2bbff3b022812d0882f06978df84a
|
||||
80d443972213342d04b9048fc3b1d5fcb1df0f822152eced6da4d3f6df27e70e
|
||||
4539717307a0208cd208d65093ccab5aa596a34d7511401987662d8cf62b1394
|
||||
71
|
||||
23
discover/v5wire/testdata/v5.1-ping-handshake.txt
vendored
Normal file
23
discover/v5wire/testdata/v5.1-ping-handshake.txt
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
# src-node-id = 0xaaaa8419e9f49d0083561b48287df592939a8d19947d8c0ef88f2a4856a69fbb
|
||||
# dest-node-id = 0xbbbb9d047f0488c0b5a93c1c3f2d8bafc7c8ff337024a55434a0d0555de64db9
|
||||
# nonce = 0xffffffffffffffffffffffff
|
||||
# read-key = 0x4f9fac6de7567d1e3b1241dffe90f662
|
||||
# ping.req-id = 0x00000001
|
||||
# ping.enr-seq = 1
|
||||
#
|
||||
# handshake inputs:
|
||||
#
|
||||
# whoareyou.challenge-data = 0x000000000000000000000000000000006469736376350001010102030405060708090a0b0c00180102030405060708090a0b0c0d0e0f100000000000000001
|
||||
# whoareyou.request-nonce = 0x0102030405060708090a0b0c
|
||||
# whoareyou.id-nonce = 0x0102030405060708090a0b0c0d0e0f10
|
||||
# whoareyou.enr-seq = 1
|
||||
# ephemeral-key = 0x0288ef00023598499cb6c940146d050d2b1fb914198c327f76aad590bead68b6
|
||||
# ephemeral-pubkey = 0x039a003ba6517b473fa0cd74aefe99dadfdb34627f90fec6362df85803908f53a5
|
||||
|
||||
00000000000000000000000000000000088b3d4342774649305f313964a39e55
|
||||
ea96c005ad521d8c7560413a7008f16c9e6d2f43bbea8814a546b7409ce783d3
|
||||
4c4f53245d08da4bb252012b2cba3f4f374a90a75cff91f142fa9be3e0a5f3ef
|
||||
268ccb9065aeecfd67a999e7fdc137e062b2ec4a0eb92947f0d9a74bfbf44dfb
|
||||
a776b21301f8b65efd5796706adff216ab862a9186875f9494150c4ae06fa4d1
|
||||
f0396c93f215fa4ef524f1eadf5f0f4126b79336671cbcf7a885b1f8bd2a5d83
|
||||
9cf8
|
||||
10
discover/v5wire/testdata/v5.1-ping-message.txt
vendored
Normal file
10
discover/v5wire/testdata/v5.1-ping-message.txt
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
# src-node-id = 0xaaaa8419e9f49d0083561b48287df592939a8d19947d8c0ef88f2a4856a69fbb
|
||||
# dest-node-id = 0xbbbb9d047f0488c0b5a93c1c3f2d8bafc7c8ff337024a55434a0d0555de64db9
|
||||
# nonce = 0xffffffffffffffffffffffff
|
||||
# read-key = 0x00000000000000000000000000000000
|
||||
# ping.req-id = 0x00000001
|
||||
# ping.enr-seq = 2
|
||||
|
||||
00000000000000000000000000000000088b3d4342774649325f313964a39e55
|
||||
ea96c005ad52be8c7560413a7008f16c9e6d2f43bbea8814a546b7409ce783d3
|
||||
4c4f53245d08dab84102ed931f66d1492acb308fa1c6715b9d139b81acbdcc
|
||||
9
discover/v5wire/testdata/v5.1-whoareyou.txt
vendored
Normal file
9
discover/v5wire/testdata/v5.1-whoareyou.txt
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
# src-node-id = 0xaaaa8419e9f49d0083561b48287df592939a8d19947d8c0ef88f2a4856a69fbb
|
||||
# dest-node-id = 0xbbbb9d047f0488c0b5a93c1c3f2d8bafc7c8ff337024a55434a0d0555de64db9
|
||||
# whoareyou.challenge-data = 0x000000000000000000000000000000006469736376350001010102030405060708090a0b0c00180102030405060708090a0b0c0d0e0f100000000000000000
|
||||
# whoareyou.request-nonce = 0x0102030405060708090a0b0c
|
||||
# whoareyou.id-nonce = 0x0102030405060708090a0b0c0d0e0f10
|
||||
# whoareyou.enr-seq = 0
|
||||
|
||||
00000000000000000000000000000000088b3d434277464933a1ccc59f5967ad
|
||||
1d6035f15e528627dde75cd68292f9e6c27d6b66c8100a873fcbaed4e16b8d
|
||||
Loading…
x
Reference in New Issue
Block a user