mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-10-14 00:59:33 +00:00

* [NOD-1147] Implement address exchange * [NOD-1147] Put placeholder for source address * [NOD-1147] Fix tests * [NOD-1147] Add comment * [NOD-1147] Remove needAddresses from MsgGetAddr * [NOD-1147] Use rand.Shuffle * [NOD-1147] Remove redundant const * [NOD-1147] Move defer to its correct place * [NOD-1147] Fix typo * [NOD-1147] Use EnqueueWithTimeout for outgoingRoute * [NOD-1147] Rename MsgGetAddr->MsgGetAddresses * [NOD-1147] Rename MsgGetAddr->MsgGetAddresses * [NOD-1147] Rename MsgAddr->MsgAddresses * [NOD-1147] Rename fakeSrcAddr->fakeSourceAddress * [NOD-1147] Remove redundant files * [NOD-1147] CmdAddr -> CmdAddress * [NOD-1147] Rename addr to address in protocol package
58 lines
1.6 KiB
Go
58 lines
1.6 KiB
Go
package sendaddresses
|
|
|
|
import (
|
|
"github.com/kaspanet/kaspad/addrmgr"
|
|
"github.com/kaspanet/kaspad/netadapter/router"
|
|
"github.com/kaspanet/kaspad/wire"
|
|
"math/rand"
|
|
"time"
|
|
)
|
|
|
|
// SendAddresses sends addresses to a peer that requests it.
|
|
func SendAddresses(incomingRoute *router.Route, outgoingRoute *router.Route,
|
|
addressManager *addrmgr.AddrManager) (routeClosed bool, err error) {
|
|
|
|
message, isOpen := incomingRoute.Dequeue()
|
|
if !isOpen {
|
|
return true, nil
|
|
}
|
|
|
|
msgGetAddresses := message.(*wire.MsgGetAddresses)
|
|
addresses := addressManager.AddressCache(msgGetAddresses.IncludeAllSubnetworks, msgGetAddresses.SubnetworkID)
|
|
msgAddresses := wire.NewMsgAddresses(msgGetAddresses.IncludeAllSubnetworks, msgGetAddresses.SubnetworkID)
|
|
err = msgAddresses.AddAddresses(shuffleAddresses(addresses)...)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
const timeout = 30 * time.Second
|
|
isOpen, err = outgoingRoute.EnqueueWithTimeout(msgAddresses, timeout)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
if !isOpen {
|
|
return true, nil
|
|
}
|
|
return false, nil
|
|
}
|
|
|
|
// shuffleAddresses randomizes the given addresses sent if there are more than the maximum allowed in one message.
|
|
func shuffleAddresses(addresses []*wire.NetAddress) []*wire.NetAddress {
|
|
addressCount := len(addresses)
|
|
|
|
if addressCount < wire.MaxAddressesPerMsg {
|
|
return addresses
|
|
}
|
|
|
|
shuffleAddresses := make([]*wire.NetAddress, addressCount)
|
|
copy(shuffleAddresses, addresses)
|
|
|
|
rand.Shuffle(addressCount, func(i, j int) {
|
|
shuffleAddresses[i], shuffleAddresses[j] = shuffleAddresses[j], shuffleAddresses[i]
|
|
})
|
|
|
|
// Truncate it to the maximum size.
|
|
shuffleAddresses = shuffleAddresses[:wire.MaxAddressesPerMsg]
|
|
return shuffleAddresses
|
|
}
|