Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

multi: Add getaddrv2 and addrv2. #2627

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions connmgr/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ module github.com/decred/dcrd/connmgr/v3
go 1.13

require (
github.com/decred/dcrd/addrmgr/v2 v2.0.0
github.com/decred/dcrd/wire v1.5.0
github.com/decred/slog v1.2.0
)

replace github.com/decred/dcrd/addrmgr/v2 => ../addrmgr
10 changes: 10 additions & 0 deletions connmgr/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,19 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/decred/dcrd/chaincfg/chainhash v1.0.2 h1:rt5Vlq/jM3ZawwiacWjPa+smINyLRN07EO0cNBV6DGU=
github.com/decred/dcrd/chaincfg/chainhash v1.0.2/go.mod h1:BpbrGgrPTr3YJYRN3Bm+D9NuaFd+zGyNeIKgrhCXK60=
github.com/decred/dcrd/chaincfg/chainhash v1.0.3 h1:PF2czcYZGW3dz4i/35AUfVAgnqHl9TMNQt1ADTYGOoE=
github.com/decred/dcrd/chaincfg/chainhash v1.0.3/go.mod h1:BpbrGgrPTr3YJYRN3Bm+D9NuaFd+zGyNeIKgrhCXK60=
github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0=
github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=
github.com/decred/dcrd/wire v1.5.0 h1:3SgcEzSjqAMQvOugP0a8iX7yQSpiVT1yNi9bc4iOXVg=
github.com/decred/dcrd/wire v1.5.0/go.mod h1:fzAjVqw32LkbAZIt5mnrvBR751GTa3e0rRQdOIhPY3w=
github.com/decred/slog v1.2.0 h1:soHAxV52B54Di3WtKLfPum9OFfWqwtf/ygf9njdfnPM=
github.com/decred/slog v1.2.0/go.mod h1:kVXlGnt6DHy2fV5OjSeuvCJ0OmlmTF6LFpEPMu/fOY0=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
30 changes: 22 additions & 8 deletions connmgr/seed.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
"strconv"
"time"

"github.com/decred/dcrd/addrmgr/v2"
"github.com/decred/dcrd/wire"
)

Expand Down Expand Up @@ -92,7 +93,7 @@ type node struct {
// The available filters can be set via the exported functions that start with
// the prefix SeedFilter. See the documentation for each function for more
// details.
func SeedAddrs(ctx context.Context, seeder string, dialFn DialFunc, filters ...func(f *HttpsSeederFilters)) ([]*wire.NetAddress, error) {
func SeedAddrs(ctx context.Context, seeder string, dialFn DialFunc, filters ...func(f *HttpsSeederFilters)) ([]*addrmgr.NetAddress, error) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Breaking change to the API. connmgr needs a major module version bump for this since it hasn't been done since the last release.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, for reasons mentioned elsewhere, please prefer []addrmgr.NetAddress over the pointer variant.

// Set any caller provided filters.
var seederFilters HttpsSeederFilters
for _, f := range filters {
Expand Down Expand Up @@ -164,7 +165,7 @@ func SeedAddrs(ctx context.Context, seeder string, dialFn DialFunc, filters ...f

// Convert the response to net addresses.
randSource := mrand.New(mrand.NewSource(time.Now().UnixNano()))
addrs := make([]*wire.NetAddress, 0, len(nodes))
addrs := make([]*addrmgr.NetAddress, 0, len(nodes))
for _, node := range nodes {
host, portStr, err := net.SplitHostPort(node.Host)
if err != nil {
Expand All @@ -176,10 +177,17 @@ func SeedAddrs(ctx context.Context, seeder string, dialFn DialFunc, filters ...f
log.Warnf("seeder returned invalid port %q", node.Host)
continue
}
ip := net.ParseIP(host)
if ip == nil {
log.Warnf("seeder returned a hostname that is not an IP address %q",
host)

netAddressType, ipBytes, err := addrmgr.ParseHost(host)
if err != nil {
log.Warnf("seeder returned a hostname that could not be parsed: "+
"%q, %q", host, err)
continue
}

if netAddressType == addrmgr.UnknownAddressType {
log.Warnf("seeder returned a hostname with an unknown address "+
"type: %q", host)
continue
}

Expand All @@ -188,8 +196,14 @@ func SeedAddrs(ctx context.Context, seeder string, dialFn DialFunc, filters ...f
// since they are a more authoritative source than other random peers.
offsetSecs := secondsIn3Days + randSource.Int31n(secondsIn4Days)
ts := time.Now().Add(-1 * time.Second * time.Duration(offsetSecs))
na := wire.NewNetAddressTimestamp(ts, wire.ServiceFlag(node.Services),
ip, uint16(port))
na, err := addrmgr.NewNetAddressByType(netAddressType, ipBytes,
uint16(port), ts, wire.ServiceFlag(node.Services))
if err != nil {
log.Warnf("failed to construct network address from seeder "+
"hostname: %q, %q", host, err)
continue
}

addrs = append(addrs, na)
}

Expand Down
53 changes: 21 additions & 32 deletions server.go
Original file line number Diff line number Diff line change
Expand Up @@ -639,20 +639,15 @@ func (sp *serverPeer) relayTxDisabled() bool {
return isDisabled
}

// wireToAddrmgrNetAddress converts a wire NetAddress to an address manager
// NetAddress.
func wireToAddrmgrNetAddress(netAddr *wire.NetAddress) *addrmgr.NetAddress {
newNetAddr := addrmgr.NewNetAddressIPPort(netAddr.IP, netAddr.Port, netAddr.Services)
newNetAddr.Timestamp = netAddr.Timestamp
return newNetAddr
}

// wireToAddrmgrNetAddresses converts a collection of wire net addresses to a
// collection of address manager net addresses.
// wireToAddrmgrNetAddresses converts a collection of version 1 wire network
// addresses to a collection of address manager network addresses.
func wireToAddrmgrNetAddresses(netAddr []*wire.NetAddress) []*addrmgr.NetAddress {
addrs := make([]*addrmgr.NetAddress, len(netAddr))
for i, wireAddr := range netAddr {
addrs[i] = wireToAddrmgrNetAddress(wireAddr)
newNetAddr := addrmgr.NewNetAddressIPPort(wireAddr.IP, wireAddr.Port,
wireAddr.Services)
newNetAddr.Timestamp = wireAddr.Timestamp
addrs[i] = newNetAddr
}
return addrs
}
Expand All @@ -674,21 +669,6 @@ func wireToAddrmgrNetAddressesV2(netAddr []*wire.NetAddressV2) ([]*addrmgr.NetAd
return addrs, nil
}

// addrmgrToWireNetAddress converts an address manager net address to a wire net
// address.
func addrmgrToWireNetAddress(netAddr *addrmgr.NetAddress) *wire.NetAddress {
return wire.NewNetAddressTimestamp(netAddr.Timestamp, netAddr.Services,
netAddr.IP, netAddr.Port)
}

// addrmgrToWireNetAddressV2 converts an address manager net address to a wire net
// address.
func addrmgrToWireNetAddressV2(netAddr *addrmgr.NetAddress) *wire.NetAddressV2 {
wireNetAddrType := wire.NetAddressType(netAddr.Type)
return wire.NewNetAddressV2(wireNetAddrType, netAddr.IP, netAddr.Port,
netAddr.Timestamp, netAddr.Services)
}

// pushAddrMsg sends an addr message to the connected peer using the provided
// addresses. Any network address passed to this function must have
// already been filtered to ensure that it is supported by the protocol
Expand All @@ -698,7 +678,8 @@ func (sp *serverPeer) pushAddrMsg(addresses []*addrmgr.NetAddress) {
addrs := make([]*wire.NetAddress, 0, len(addresses))
for _, addr := range addresses {
if !sp.addressKnown(addr) {
wireNetAddr := addrmgrToWireNetAddress(addr)
wireNetAddr := wire.NewNetAddressTimestamp(addr.Timestamp,
addr.Services, addr.IP, addr.Port)
addrs = append(addrs, wireNetAddr)
}
}
Expand All @@ -723,7 +704,9 @@ func (sp *serverPeer) pushAddrV2Msg(addresses []*addrmgr.NetAddress) {
addrs := make([]*wire.NetAddressV2, 0, len(addresses))
for _, addr := range addresses {
if !sp.addressKnown(addr) {
addrV2 := addrmgrToWireNetAddressV2(addr)
wireNetAddrType := wire.NetAddressType(addr.Type)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Calling this out again about the cast since I see the function I commented on in an earlier commit is removed.

addrV2 := wire.NewNetAddressV2(wireNetAddrType, addr.IP, addr.Port,
addr.Timestamp, addr.Services)
addrs = append(addrs, addrV2)
}
}
Expand Down Expand Up @@ -1981,7 +1964,14 @@ func (s *server) handleAddPeerMsg(state *peerState, sp *serverPeer) bool {
net = addrmgr.IPv6Address
}

localAddr := wireToAddrmgrNetAddress(na)
localAddr, err := addrmgr.NewNetAddressByType(net, na.IP, na.Port,
na.Timestamp, na.Services)
if err != nil {
srvrLog.Errorf("unable to construct peer network address: %v",
err)
return true
}

valid, reach := s.addrManager.ValidatePeerNa(localAddr, remoteAddr)
if !valid {
return true
Expand Down Expand Up @@ -3292,10 +3282,9 @@ func (s *server) querySeeders(ctx context.Context) {
const httpsPort = 443
srcAddr, err := cfg.hostToNetAddress(seeder, httpsPort, 0)
if err != nil {
srcAddr = wireToAddrmgrNetAddress(addrs[0])
srcAddr = addrs[0]
}
addresses := wireToAddrmgrNetAddresses(addrs)
s.addrManager.AddAddresses(addresses, srcAddr)
s.addrManager.AddAddresses(addrs, srcAddr)
}(seeder)
}
}
Expand Down