Skip to content

Commit 92dce55

Browse files
authored
Merge pull request #249 from Crypt-iQ/neutrinov2
go.mod+neutrino.go: use NetAddressV2 where appropriate
2 parents 59d04fc + 8b072be commit 92dce55

File tree

3 files changed

+140
-29
lines changed

3 files changed

+140
-29
lines changed

go.mod

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
module github.com/lightninglabs/neutrino
22

33
require (
4-
github.com/btcsuite/btcd v0.22.0-beta.0.20220207191057-4dc4ff7963b4
5-
github.com/btcsuite/btcd/btcec/v2 v2.1.0
6-
github.com/btcsuite/btcd/btcutil v1.1.0
4+
github.com/btcsuite/btcd v0.22.0-beta.0.20220413172512-bf64c8bdbbbf
5+
github.com/btcsuite/btcd/btcec/v2 v2.1.3
6+
github.com/btcsuite/btcd/btcutil v1.1.1
7+
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1
78
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f
8-
github.com/btcsuite/btcwallet/wallet/txauthor v1.2.1
9+
github.com/btcsuite/btcwallet/wallet/txauthor v1.2.3
910
github.com/btcsuite/btcwallet/walletdb v1.3.5
1011
github.com/btcsuite/btcwallet/wtxmgr v1.5.0
1112
github.com/davecgh/go-spew v1.1.1
1213
github.com/lightningnetwork/lnd/queue v1.0.1
13-
github.com/stretchr/testify v1.5.1
14+
github.com/stretchr/testify v1.7.0
1415
)
1516

1617
go 1.13

go.sum

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,25 @@ github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcug
44
github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ=
55
github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M=
66
github.com/btcsuite/btcd v0.22.0-beta.0.20220204213055-eaf0459ff879/go.mod h1:osu7EoKiL36UThEgzYPqdRaxeo0NU8VoXqgcnwpey0g=
7-
github.com/btcsuite/btcd v0.22.0-beta.0.20220207191057-4dc4ff7963b4 h1:CEGr/598C/0LZQUoioaT6sdGGcJgu4+ck0PDeJ/QkKs=
8-
github.com/btcsuite/btcd v0.22.0-beta.0.20220207191057-4dc4ff7963b4/go.mod h1:7alexyj/lHlOtr2PJK7L/+HDJZpcGDn/pAU98r7DY08=
9-
github.com/btcsuite/btcd/btcec/v2 v2.1.0 h1:Whmbo9yShKKG+WrUfYGFfgj77vYBiwhwBSJnM66TMKI=
7+
github.com/btcsuite/btcd v0.22.0-beta.0.20220316175102-8d5c75c28923/go.mod h1:taIcYprAW2g6Z9S0gGUxyR+zDwimyDMK5ePOX+iJ2ds=
8+
github.com/btcsuite/btcd v0.22.0-beta.0.20220413172512-bf64c8bdbbbf h1:8lTakMpAAOKTe60bNhiEjUDtcZAlrst2MF49ekuA9yI=
9+
github.com/btcsuite/btcd v0.22.0-beta.0.20220413172512-bf64c8bdbbbf/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY=
1010
github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA=
11+
github.com/btcsuite/btcd/btcec/v2 v2.1.1/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE=
12+
github.com/btcsuite/btcd/btcec/v2 v2.1.3 h1:xM/n3yIhHAhHy04z4i43C8p4ehixJZMsnrVJkgl+MTE=
13+
github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE=
1114
github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A=
12-
github.com/btcsuite/btcd/btcutil v1.1.0 h1:MO4klnGY+EWJdoWF12Wkuf4AWDBPMpZNeN/jRLrklUU=
1315
github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE=
16+
github.com/btcsuite/btcd/btcutil v1.1.1 h1:hDcDaXiP0uEzR8Biqo2weECKqEw0uHDZ9ixIWevVQqY=
17+
github.com/btcsuite/btcd/btcutil v1.1.1/go.mod h1:nbKlBMNm9FGsdvKvu0essceubPiAcI57pYBNnsLAa34=
18+
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
19+
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U=
20+
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
1421
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo=
1522
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
1623
github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
17-
github.com/btcsuite/btcwallet/wallet/txauthor v1.2.1 h1:oxIaFiF8gmOLJh7wNkXYkyLWT7Pj5igSrn5HthPVDYg=
18-
github.com/btcsuite/btcwallet/wallet/txauthor v1.2.1/go.mod h1:/74bubxX5Js48d76nf/TsNabpYp/gndUuJw4chzCmhU=
24+
github.com/btcsuite/btcwallet/wallet/txauthor v1.2.3 h1:M2yr5UlULvpqtxUqpMxTME/pA92Z9cpqeyvAFk9lAg0=
25+
github.com/btcsuite/btcwallet/wallet/txauthor v1.2.3/go.mod h1:T2xSiKGpUkSLCh68aF+FMXmKK9mFqNdHl9VaqOr+JjU=
1926
github.com/btcsuite/btcwallet/wallet/txrules v1.2.0 h1:BtEN5Empw62/RVnZ0VcJaVtVlBijnLlJY+dwjAye2Bg=
2027
github.com/btcsuite/btcwallet/wallet/txrules v1.2.0/go.mod h1:AtkqiL7ccKWxuLYtZm8Bu8G6q82w4yIZdgq6riy60z0=
2128
github.com/btcsuite/btcwallet/wallet/txsizes v1.1.0 h1:wZnOolEAeNOHzHTnznw/wQv+j35ftCIokNrnOTOU5o8=
@@ -27,10 +34,8 @@ github.com/btcsuite/btcwallet/wtxmgr v1.5.0/go.mod h1:TQVDhFxseiGtZwEPvLgtfyxuNU
2734
github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw=
2835
github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg=
2936
github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY=
30-
github.com/btcsuite/goleveldb v1.0.0 h1:Tvd0BfvqX9o823q1j2UZ/epQo09eJh6dTcRp79ilIN4=
3137
github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I=
3238
github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
33-
github.com/btcsuite/snappy-go v1.0.0 h1:ZxaA6lo2EpxGddsA8JwWOcxlzRybb444sgmeJQMJGQE=
3439
github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
3540
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc=
3641
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
@@ -56,6 +61,8 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W
5661
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
5762
github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
5863
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
64+
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
65+
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
5966
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
6067
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
6168
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
@@ -92,8 +99,11 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y
9299
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
93100
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
94101
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
95-
github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
96102
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
103+
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
104+
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
105+
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY=
106+
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc=
97107
go.etcd.io/bbolt v1.3.5-0.20200615073812-232d8fc87f50 h1:ASw9n1EHMftwnP3Az4XW6e308+gNsrHzmdhd0Olz9Hs=
98108
go.etcd.io/bbolt v1.3.5-0.20200615073812-232d8fc87f50/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
99109
golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
@@ -148,3 +158,5 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
148158
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
149159
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
150160
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
161+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
162+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

neutrino.go

Lines changed: 113 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"fmt"
99
"net"
1010
"strconv"
11+
"strings"
1112
"sync"
1213
"sync/atomic"
1314
"time"
@@ -164,7 +165,7 @@ type ServerPeer struct {
164165
connReq *connmgr.ConnReq
165166
server *ChainService
166167
persistent bool
167-
knownAddresses map[string]struct{}
168+
knownAddresses *lru.Cache
168169
quit chan struct{}
169170

170171
// The following map of subcribers is used to subscribe to messages
@@ -186,7 +187,7 @@ func newServerPeer(s *ChainService, isPersistent bool) *ServerPeer {
186187
return &ServerPeer{
187188
server: s,
188189
persistent: isPersistent,
189-
knownAddresses: make(map[string]struct{}),
190+
knownAddresses: lru.NewCache(5000),
190191
quit: make(chan struct{}),
191192
recvSubscribers: make(map[spMsgSubscription]struct{}),
192193
recvSubscribers2: make(map[msgSubscription]struct{}),
@@ -206,9 +207,14 @@ func (sp *ServerPeer) newestBlock() (*chainhash.Hash, int32, error) {
206207

207208
// addKnownAddresses adds the given addresses to the set of known addresses to
208209
// the peer to prevent sending duplicate addresses.
209-
func (sp *ServerPeer) addKnownAddresses(addresses []*wire.NetAddress) {
210+
func (sp *ServerPeer) addKnownAddresses(addresses []*wire.NetAddressV2) {
210211
for _, na := range addresses {
211-
sp.knownAddresses[addrmgr.NetAddressKey(na)] = struct{}{}
212+
_, err := sp.knownAddresses.Put(
213+
addrmgr.NetAddressKey(na), &cachedAddr{},
214+
)
215+
if err != nil {
216+
log.Debugf("Could not store known addresses: %v", err)
217+
}
212218
}
213219
}
214220

@@ -344,7 +350,7 @@ func (sp *ServerPeer) OnAddr(_ *peer.Peer, msg *wire.MsgAddr) {
344350
return
345351
}
346352

347-
addrsSupportingServices := make([]*wire.NetAddress, 0, len(msg.AddrList))
353+
addrs := make([]*wire.NetAddressV2, 0, len(msg.AddrList))
348354
for _, na := range msg.AddrList {
349355
// Don't add more address if we're disconnecting.
350356
if !sp.Connected() {
@@ -356,32 +362,88 @@ func (sp *ServerPeer) OnAddr(_ *peer.Peer, msg *wire.MsgAddr) {
356362
continue
357363
}
358364

359-
// Set the timestamp to 5 days ago if it's more than 24 hours
365+
// Set the timestamp to 5 days ago if it's more than 10 minutes
360366
// in the future so this address is one of the first to be
361367
// removed when space is needed.
362368
now := time.Now()
363369
if na.Timestamp.After(now.Add(time.Minute * 10)) {
364370
na.Timestamp = now.Add(-1 * time.Hour * 24 * 5)
365371
}
366372

367-
addrsSupportingServices = append(addrsSupportingServices, na)
373+
// Convert the wire.NetAddress to wire.NetAddressV2 since that
374+
// is what is used by the addrmgr.
375+
currentNa := wire.NetAddressV2FromBytes(
376+
na.Timestamp, na.Services, na.IP, na.Port,
377+
)
378+
addrs = append(addrs, currentNa)
368379
}
369380

370381
// Ignore any addr messages if none of them contained our required
371382
// services.
372-
if len(addrsSupportingServices) == 0 {
383+
if len(addrs) == 0 {
373384
return
374385
}
375386

376-
// Add address to known addresses for this peer.
377-
sp.addKnownAddresses(addrsSupportingServices)
387+
// Add addresses to the set of known addresses for this peer.
388+
sp.addKnownAddresses(addrs)
378389

379390
// Add addresses to server address manager. The address manager handles
380391
// the details of things such as preventing duplicate addresses, max
381392
// addresses, and last seen updates.
382393
// XXX bitcoind gives a 2 hour time penalty here, do we want to do the
383394
// same?
384-
sp.server.addrManager.AddAddresses(addrsSupportingServices, sp.NA())
395+
sp.server.addrManager.AddAddresses(addrs, sp.NA())
396+
}
397+
398+
// OnAddrV2 is called when a peer receives an AddrV2 message from its peer.
399+
func (sp *ServerPeer) OnAddrV2(_ *peer.Peer, msg *wire.MsgAddrV2) {
400+
// Ignore addresses when running on a private development network for
401+
// the same reason that OnAddr does.
402+
if isDevNetwork(sp.server.chainParams.Net) {
403+
return
404+
}
405+
406+
// An empty AddrV2 message is invalid.
407+
if len(msg.AddrList) == 0 {
408+
log.Errorf("Command [%s] from %s does not contain any "+
409+
"addresses", msg.Command(), sp.Addr())
410+
sp.Disconnect()
411+
return
412+
}
413+
414+
addrs := make([]*wire.NetAddressV2, 0, len(msg.AddrList))
415+
for _, na := range msg.AddrList {
416+
// Don't add more addresses if we're disconnecting.
417+
if !sp.Connected() {
418+
return
419+
}
420+
421+
// Skip any that don't advertise our required services.
422+
if na.Services&RequiredServices != RequiredServices {
423+
continue
424+
}
425+
426+
// Set the timestamp to 5 days ago if it's more than 10 minutes
427+
// in the future so this address is one of the first to be
428+
// removed when space is needed.
429+
now := time.Now()
430+
if na.Timestamp.After(now.Add(time.Minute * 10)) {
431+
na.Timestamp = now.Add(-1 * time.Hour * 24 * 5)
432+
}
433+
addrs = append(addrs, na)
434+
}
435+
436+
// Ignore addrv2 message if no addresses contained our required
437+
// services.
438+
if len(addrs) == 0 {
439+
return
440+
}
441+
442+
// Add the addresses to the set of known addresses for this peer.
443+
sp.addKnownAddresses(addrs)
444+
445+
// Add addresses to the address manager.
446+
sp.server.addrManager.AddAddresses(addrs, sp.NA())
385447
}
386448

387449
// OnRead is invoked when a peer receives a message and it is used to update
@@ -1077,8 +1139,8 @@ func (s *ChainService) peerHandler() {
10771139
if !DisableDNSSeed {
10781140
// Add peers discovered through DNS to the address manager.
10791141
connmgr.SeedFromDNS(&s.chainParams, RequiredServices,
1080-
s.nameResolver, func(addrs []*wire.NetAddress) {
1081-
var validAddrs []*wire.NetAddress
1142+
s.nameResolver, func(addrs []*wire.NetAddressV2) {
1143+
var validAddrs []*wire.NetAddressV2
10821144
for _, addr := range addrs {
10831145
addr.Services = RequiredServices
10841146

@@ -1162,6 +1224,12 @@ func (s *ChainService) addrStringToNetAddr(addr string) (net.Addr, error) {
11621224
}
11631225
}
11641226

1227+
// Tor addresses cannot be resolved to an IP, so just return onionAddr
1228+
// instead.
1229+
if strings.HasSuffix(host, ".onion") {
1230+
return &onionAddr{addr: addr}, nil
1231+
}
1232+
11651233
// Attempt to look up an IP address associated with the parsed host.
11661234
ips, err := s.nameResolver(host)
11671235
if err != nil {
@@ -1283,7 +1351,7 @@ func (s *ChainService) handleAddPeerMsg(state *peerState, sp *ServerPeer) bool {
12831351

12841352
// Add the address to the addr manager anew, and also mark it as
12851353
// a good address.
1286-
s.addrManager.AddAddresses([]*wire.NetAddress{sp.NA()}, sp.NA())
1354+
s.addrManager.AddAddresses([]*wire.NetAddressV2{sp.NA()}, sp.NA())
12871355
s.addrManager.Good(sp.NA())
12881356
}
12891357

@@ -1411,6 +1479,7 @@ func newPeerConfig(sp *ServerPeer) *peer.Config {
14111479
OnReject: sp.OnReject,
14121480
OnFeeFilter: sp.OnFeeFilter,
14131481
OnAddr: sp.OnAddr,
1482+
OnAddrV2: sp.OnAddrV2,
14141483
OnRead: sp.OnRead,
14151484
OnWrite: sp.OnWrite,
14161485

@@ -1426,7 +1495,7 @@ func newPeerConfig(sp *ServerPeer) *peer.Config {
14261495
UserAgentVersion: sp.server.userAgentVersion,
14271496
ChainParams: &sp.server.chainParams,
14281497
Services: sp.server.services,
1429-
ProtocolVersion: wire.FeeFilterVersion,
1498+
ProtocolVersion: wire.AddrV2Version,
14301499
DisableRelayTx: true,
14311500
}
14321501
}
@@ -1650,3 +1719,32 @@ func (s *RescanChainSource) Subscribe(
16501719

16511720
return s.blockSubscriptionMgr.NewSubscription(bestHeight)
16521721
}
1722+
1723+
// cachedAddr is an empty struct used to satisfy the cache.Value interface.
1724+
type cachedAddr struct{}
1725+
1726+
// Size returns the size of cachedAddr, which is 1.
1727+
func (c *cachedAddr) Size() (uint64, error) {
1728+
return 1, nil
1729+
}
1730+
1731+
// onionAddr implements the net.Addr interface and represents a tor address.
1732+
// This code is identical to btcd's unexported onionAddr. It is used so that
1733+
// neutrino can connect to v2 addresses without relying on the OnionCat
1734+
// encoding. It also enables connecting to v3 addresses.
1735+
type onionAddr struct {
1736+
addr string
1737+
}
1738+
1739+
// String returns the onion address.
1740+
func (o *onionAddr) String() string {
1741+
return o.addr
1742+
}
1743+
1744+
// Network returns "onion".
1745+
func (o *onionAddr) Network() string {
1746+
return "onion"
1747+
}
1748+
1749+
// Ensure onionAddr implements the net.Addr interface.
1750+
var _ net.Addr = (*onionAddr)(nil)

0 commit comments

Comments
 (0)