mirror of
https://github.com/logos-messaging/go-discover.git
synced 2026-01-04 05:53:10 +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/enode"
|
||||||
"github.com/ethereum/go-ethereum/p2p/enr"
|
"github.com/ethereum/go-ethereum/p2p/enr"
|
||||||
"github.com/ethereum/go-ethereum/p2p/netutil"
|
"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.
|
// UDPConn is a network connection on which discovery can operate.
|
||||||
@ -35,6 +36,10 @@ type UDPConn interface {
|
|||||||
LocalAddr() net.Addr
|
LocalAddr() net.Addr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type V5Config struct {
|
||||||
|
ProtocolID [6]byte
|
||||||
|
}
|
||||||
|
|
||||||
// Config holds settings for the discovery listener.
|
// Config holds settings for the discovery listener.
|
||||||
type Config struct {
|
type Config struct {
|
||||||
// These settings are required and configure the UDP listener:
|
// These settings are required and configure the UDP listener:
|
||||||
@ -48,6 +53,7 @@ type Config struct {
|
|||||||
ValidSchemes enr.IdentityScheme // allowed identity schemes
|
ValidSchemes enr.IdentityScheme // allowed identity schemes
|
||||||
Clock mclock.Clock
|
Clock mclock.Clock
|
||||||
ValidNodeFn func(enode.Node) bool // function to validate a node before it's added to routing tables
|
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 {
|
func (cfg Config) withDefaults() Config {
|
||||||
@ -60,6 +66,9 @@ func (cfg Config) withDefaults() Config {
|
|||||||
if cfg.Clock == nil {
|
if cfg.Clock == nil {
|
||||||
cfg.Clock = mclock.System{}
|
cfg.Clock = mclock.System{}
|
||||||
}
|
}
|
||||||
|
if len(cfg.V5Config.ProtocolID) == 0 {
|
||||||
|
cfg.V5Config.ProtocolID = v5wire.DefaultProtocolID
|
||||||
|
}
|
||||||
return cfg
|
return cfg
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -156,7 +156,7 @@ func newUDPv5(conn UDPConn, ln *enode.LocalNode, cfg Config) (*UDPv5, error) {
|
|||||||
callDoneCh: make(chan *callV5),
|
callDoneCh: make(chan *callV5),
|
||||||
respTimeoutCh: make(chan *callTimeout),
|
respTimeoutCh: make(chan *callTimeout),
|
||||||
// state of dispatch
|
// 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),
|
activeCallByNode: make(map[enode.ID]*callV5),
|
||||||
activeCallByAuth: make(map[v5wire.Nonce]*callV5),
|
activeCallByAuth: make(map[v5wire.Nonce]*callV5),
|
||||||
callQueue: make(map[enode.ID][]*callV5),
|
callQueue: make(map[enode.ID][]*callV5),
|
||||||
|
|||||||
@ -94,7 +94,7 @@ const (
|
|||||||
randomPacketMsgSize = 20
|
randomPacketMsgSize = 20
|
||||||
)
|
)
|
||||||
|
|
||||||
var protocolID = [6]byte{'d', 'i', 's', 'c', 'v', '5'}
|
var DefaultProtocolID = [6]byte{'d', 'i', 's', 'c', 'v', '5'}
|
||||||
|
|
||||||
// Errors.
|
// Errors.
|
||||||
var (
|
var (
|
||||||
@ -134,6 +134,8 @@ type Codec struct {
|
|||||||
privkey *ecdsa.PrivateKey
|
privkey *ecdsa.PrivateKey
|
||||||
sc *SessionCache
|
sc *SessionCache
|
||||||
|
|
||||||
|
protocolID [6]byte
|
||||||
|
|
||||||
// encoder buffers
|
// encoder buffers
|
||||||
buf bytes.Buffer // whole packet
|
buf bytes.Buffer // whole packet
|
||||||
headbuf bytes.Buffer // packet header
|
headbuf bytes.Buffer // packet header
|
||||||
@ -145,12 +147,13 @@ type Codec struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewCodec creates a wire codec.
|
// 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{
|
c := &Codec{
|
||||||
sha256: sha256.New(),
|
sha256: sha256.New(),
|
||||||
localnode: ln,
|
localnode: ln,
|
||||||
privkey: key,
|
privkey: key,
|
||||||
sc: NewSessionCache(1024, clock),
|
sc: NewSessionCache(1024, clock),
|
||||||
|
protocolID: protocolID,
|
||||||
}
|
}
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
@ -250,7 +253,7 @@ func (c *Codec) makeHeader(toID enode.ID, flag byte, authsizeExtra int) Header {
|
|||||||
}
|
}
|
||||||
return Header{
|
return Header{
|
||||||
StaticHeader: StaticHeader{
|
StaticHeader: StaticHeader{
|
||||||
ProtocolID: protocolID,
|
ProtocolID: c.protocolID,
|
||||||
Version: version,
|
Version: version,
|
||||||
Flag: flag,
|
Flag: flag,
|
||||||
AuthSize: uint16(authsize),
|
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)
|
c.reader.Reset(staticHeader)
|
||||||
binary.Read(&c.reader, binary.BigEndian, &head.StaticHeader)
|
binary.Read(&c.reader, binary.BigEndian, &head.StaticHeader)
|
||||||
remainingInput := len(input) - sizeofStaticPacketData
|
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
|
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.
|
// checkValid performs some basic validity checks on the header.
|
||||||
// The packetLen here is the length remaining after the static 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 {
|
if h.ProtocolID != protocolID {
|
||||||
return errInvalidHeader
|
return errInvalidHeader
|
||||||
}
|
}
|
||||||
|
|||||||
@ -498,8 +498,8 @@ type handshakeTestNode struct {
|
|||||||
|
|
||||||
func newHandshakeTest() *handshakeTest {
|
func newHandshakeTest() *handshakeTest {
|
||||||
t := new(handshakeTest)
|
t := new(handshakeTest)
|
||||||
t.nodeA.init(testKeyA, 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)
|
t.nodeB.init(testKeyB, net.IP{127, 0, 0, 1}, &t.clock, [6]byte{'d', 'i', 's', 'c', 'v', '5'})
|
||||||
return t
|
return t
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -508,11 +508,11 @@ func (t *handshakeTest) close() {
|
|||||||
t.nodeB.ln.Database().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("")
|
db, _ := enode.OpenDB("")
|
||||||
n.ln = enode.NewLocalNode(db, key)
|
n.ln = enode.NewLocalNode(db, key)
|
||||||
n.ln.SetStaticIP(ip)
|
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) {
|
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