Skip to content

Commit 3baf0ee

Browse files
authored
feat: By default, use Berty rdvp and relay nodes (#111)
* feat: By default, use Berty rdvp and relay nodes Signed-off-by: Jeff Thompson <[email protected]> * chore: In MobileOptions, add Logger. Use it in fillDefault Signed-off-by: Jeff Thompson <[email protected]> --------- Signed-off-by: Jeff Thompson <[email protected]>
1 parent e51f117 commit 3baf0ee

File tree

5 files changed

+123
-10
lines changed

5 files changed

+123
-10
lines changed

pkg/ipfsutil/consts.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package ipfsutil
2+
3+
const (
4+
// svc ams 1
5+
DefaultP2PRdvpMaddr = "/ip4/51.15.25.224/udp/4040/quic-v1/p2p/12D3KooWHhDBv6DJJ4XDWjzEXq6sVNEs6VuxsV1WyBBEhPENHzcZ"
6+
// svc ams 1
7+
DefaultP2PStaticRelay = "/ip4/51.15.25.224/udp/6363/quic-v1/p2p/12D3KooWAHcEz4K5XAgRDav9fLuhiRY2wuXip385EmT5RoRkCmjr"
8+
)

pkg/ipfsutil/mobile.go

Lines changed: 69 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,21 @@ import (
44
"context"
55
"fmt"
66

7+
ipfs_cfg "github.com/ipfs/kubo/config"
78
ipfs_config "github.com/ipfs/kubo/config"
89
ipfs_p2p "github.com/ipfs/kubo/core/node/libp2p"
10+
"github.com/libp2p/go-libp2p"
911
p2p "github.com/libp2p/go-libp2p"
1012
dht "github.com/libp2p/go-libp2p-kad-dht"
1113
p2p_dht "github.com/libp2p/go-libp2p-kad-dht"
1214
"github.com/libp2p/go-libp2p-kad-dht/dual"
1315
host "github.com/libp2p/go-libp2p/core/host"
16+
"github.com/libp2p/go-libp2p/core/peer"
1417
p2p_routing "github.com/libp2p/go-libp2p/core/routing"
18+
quict "github.com/libp2p/go-libp2p/p2p/transport/quic"
19+
"github.com/libp2p/go-libp2p/p2p/transport/quicreuse"
20+
tcpt "github.com/libp2p/go-libp2p/p2p/transport/tcp"
21+
"go.uber.org/zap"
1522

1623
ipfs_mobile "berty.tech/weshnet/v2/pkg/ipfsutil/mobile"
1724
)
@@ -27,7 +34,11 @@ const (
2734
type Config func(cfg *ipfs_config.Config) ([]p2p.Option, error)
2835

2936
type MobileOptions struct {
37+
Logger *zap.Logger
3038
IpfsConfigPatch Config
39+
// P2PStaticRelays and PeerStorePeers are only used if IpfsConfigPatch is nil
40+
P2PStaticRelays []string
41+
PeerStorePeers []string
3142

3243
HostOption ipfs_p2p.HostOption
3344
RoutingOption ipfs_p2p.RoutingOption
@@ -39,6 +50,10 @@ type MobileOptions struct {
3950
}
4051

4152
func (o *MobileOptions) fillDefault() {
53+
if o.Logger == nil {
54+
o.Logger = zap.NewNop()
55+
}
56+
4257
if o.HostOption == nil {
4358
o.HostOption = ipfs_p2p.DefaultHostOption
4459
}
@@ -48,7 +63,15 @@ func (o *MobileOptions) fillDefault() {
4863
}
4964

5065
if o.IpfsConfigPatch == nil {
51-
o.IpfsConfigPatch = defaultIpfsConfigPatch
66+
o.IpfsConfigPatch = o.defaultIpfsConfigPatch
67+
68+
// P2PStaticRelays and PeerStorePeers are only used by defaultIpfsConfigPatch
69+
if o.P2PStaticRelays == nil {
70+
o.P2PStaticRelays = []string{DefaultP2PStaticRelay}
71+
}
72+
if o.PeerStorePeers == nil {
73+
o.PeerStorePeers = []string{DefaultP2PRdvpMaddr}
74+
}
5275
}
5376

5477
// apply default extras
@@ -125,8 +148,51 @@ func CustomRoutingOption(mode p2p_dht.ModeOpt, net DHTNetworkMode, opts ...p2p_d
125148
}
126149
}
127150

128-
func defaultIpfsConfigPatch(_ *ipfs_config.Config) ([]p2p.Option, error) {
129-
return []p2p.Option{}, nil
151+
func (o *MobileOptions) defaultIpfsConfigPatch(cfg *ipfs_config.Config) ([]p2p.Option, error) {
152+
// Imitate berty setupIPFSConfig
153+
// https://github.com/berty/berty/blob/5a8b9cb8524c1287ab2533a9e186ac8bde7f2b57/go/internal/initutil/ipfs.go#L474C19-L474C34
154+
p2popts := []libp2p.Option{}
155+
156+
// make sure relay is enabled
157+
cfg.Swarm.RelayClient.Enabled = ipfs_cfg.True
158+
cfg.Swarm.Transports.Network.Relay = ipfs_cfg.True
159+
160+
// add static relay
161+
pis, err := ParseAndResolveMaddrs(context.TODO(), o.Logger, o.P2PStaticRelays)
162+
if err != nil {
163+
return nil, err
164+
}
165+
if len(pis) > 0 {
166+
peers := make([]peer.AddrInfo, len(pis))
167+
for i, p := range pis {
168+
peers[i] = *p
169+
}
170+
171+
p2popts = append(p2popts, libp2p.EnableAutoRelayWithStaticRelays(peers))
172+
}
173+
174+
// prefill peerstore with known rdvp servers
175+
peers, err := ParseAndResolveMaddrs(context.TODO(), o.Logger, o.PeerStorePeers)
176+
if err != nil {
177+
return nil, err
178+
}
179+
for _, p := range peers {
180+
cfg.Peering.Peers = append(cfg.Peering.Peers, *p)
181+
}
182+
183+
// @NOTE(gfanton): disable quic transport so we can init a custom transport
184+
// with reusport disabled
185+
cfg.Swarm.Transports.Network.QUIC = ipfs_cfg.False
186+
p2popts = append(p2popts, libp2p.Transport(quict.NewTransport), libp2p.QUICReuse(quicreuse.NewConnManager, quicreuse.DisableReuseport()))
187+
188+
// @NOTE(gfanton): disable tcp transport so we can init a custom transport
189+
// with reusport disabled
190+
cfg.Swarm.Transports.Network.TCP = ipfs_cfg.False
191+
p2popts = append(p2popts, libp2p.Transport(tcpt.NewTCPTransport,
192+
tcpt.DisableReuseport(),
193+
))
194+
195+
return p2popts, nil
130196
}
131197

132198
const (

pkg/ipfsutil/testing.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,8 @@ func TestingCoreAPIUsingMockNet(ctx context.Context, t testing.TB, opts *Testing
144144
ExtraOpts: map[string]bool{
145145
"pubsub": false,
146146
},
147+
P2PStaticRelays: []string{},
148+
PeerStorePeers: []string{},
147149
})
148150
t.Cleanup(func() { mnode.Close() })
149151
h := mnode.PeerHost()

service.go

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"github.com/libp2p/go-libp2p/core/event"
2121
"github.com/libp2p/go-libp2p/core/host"
2222
"github.com/libp2p/go-libp2p/core/network"
23+
"github.com/libp2p/go-libp2p/core/peerstore"
2324
backoff "github.com/libp2p/go-libp2p/p2p/discovery/backoff"
2425
"github.com/libp2p/go-libp2p/p2p/host/eventbus"
2526
"github.com/pkg/errors"
@@ -39,6 +40,7 @@ import (
3940
"berty.tech/weshnet/v2/pkg/ipfsutil"
4041
ipfs_mobile "berty.tech/weshnet/v2/pkg/ipfsutil/mobile"
4142
"berty.tech/weshnet/v2/pkg/protocoltypes"
43+
"berty.tech/weshnet/v2/pkg/rendezvous"
4244
"berty.tech/weshnet/v2/pkg/secretstore"
4345
tinder "berty.tech/weshnet/v2/pkg/tinder"
4446
"berty.tech/weshnet/v2/pkg/tyber"
@@ -96,6 +98,10 @@ type Opts struct {
9698
close func() error
9799
SecretStore secretstore.SecretStore
98100
PrometheusRegister prometheus.Registerer
101+
// P2PStaticRelays is only used if IpfsCoreAPI is nil
102+
P2PStaticRelays []string
103+
// P2PRdvpMaddrs is only used if TinderService is nil
104+
P2PRdvpMaddrs []string
99105

100106
// These are used if OrbitDB is nil.
101107
GroupMetadataStoreType string
@@ -169,6 +175,10 @@ func (opts *Opts) applyDefaults(ctx context.Context) error {
169175
opts.SecretStore = secretStore
170176
}
171177

178+
if opts.P2PRdvpMaddrs == nil {
179+
opts.P2PRdvpMaddrs = []string{ipfsutil.DefaultP2PRdvpMaddr}
180+
}
181+
172182
var mnode *ipfs_mobile.IpfsMobile
173183
if opts.IpfsCoreAPI == nil {
174184
dsync := opts.RootDatastore
@@ -182,7 +192,12 @@ func (opts *Opts) applyDefaults(ctx context.Context) error {
182192
}
183193

184194
mrepo := ipfs_mobile.NewRepoMobile(opts.DatastoreDir, repo)
185-
mnode, err = ipfsutil.NewIPFSMobile(ctx, mrepo, &ipfsutil.MobileOptions{})
195+
// NewIPFSMobile will apply defaults for P2PStaticRelays
196+
mnode, err = ipfsutil.NewIPFSMobile(ctx, mrepo, &ipfsutil.MobileOptions{
197+
Logger: opts.Logger,
198+
P2PStaticRelays: opts.P2PStaticRelays,
199+
PeerStorePeers: opts.P2PRdvpMaddrs,
200+
})
186201
if err != nil {
187202
return err
188203
}
@@ -218,6 +233,26 @@ func (opts *Opts) applyDefaults(ctx context.Context) error {
218233
}
219234
drivers = append(drivers, localdisc)
220235

236+
// rdvp driver. Imitate berty configIPFSRouting
237+
// https://github.com/berty/berty/blob/5a8b9cb8524c1287ab2533a9e186ac8bde7f2b57/go/internal/initutil/ipfs.go#L684
238+
rdvpeers, err := ipfsutil.ParseAndResolveMaddrs(ctx, opts.Logger, opts.P2PRdvpMaddrs)
239+
if err != nil {
240+
return fmt.Errorf("unable to resolve maddrs: %w", err)
241+
}
242+
addrsFactory := tinder.PublicAddrsOnlyFactory
243+
if len(rdvpeers) > 0 {
244+
for _, peer := range rdvpeers {
245+
opts.Host.Peerstore().AddAddrs(peer.ID, peer.Addrs, peerstore.PermanentAddrTTL)
246+
emitterclient := rendezvous.NewEmitterClient(&rendezvous.EmitterClientOptions{
247+
Logger: opts.Logger,
248+
})
249+
250+
// mqttclient := rendezvous.NewMQTTClient(logger, baseopts)
251+
udisc := tinder.NewRendezvousDiscovery(opts.Logger, opts.Host, peer.ID, addrsFactory, rng, emitterclient)
252+
drivers = append(drivers, udisc)
253+
}
254+
}
255+
221256
if mnode != nil {
222257
dhtdisc := tinder.NewRoutingDiscoveryDriver("dht", mnode.DHT)
223258
drivers = append(drivers, dhtdisc)

service_client.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,15 @@ func NewPersistentServiceClient(path string) (ServiceClient, error) {
9393
return nil, err
9494
}
9595

96+
var cleanupLogger func()
97+
if opts.Logger, cleanupLogger, err = setupDefaultLogger(); err != nil {
98+
return nil, fmt.Errorf("uanble to setup logger: %w", err)
99+
}
100+
96101
mrepo := ipfs_mobile.NewRepoMobile(path, repo)
97-
mnode, err := ipfsutil.NewIPFSMobile(context.TODO(), mrepo, &ipfsutil.MobileOptions{})
102+
mnode, err := ipfsutil.NewIPFSMobile(context.TODO(), mrepo, &ipfsutil.MobileOptions{
103+
Logger: opts.Logger,
104+
})
98105
if err != nil {
99106
return nil, err
100107
}
@@ -104,11 +111,6 @@ func NewPersistentServiceClient(path string) (ServiceClient, error) {
104111
return nil, err
105112
}
106113

107-
var cleanupLogger func()
108-
if opts.Logger, cleanupLogger, err = setupDefaultLogger(); err != nil {
109-
return nil, fmt.Errorf("uanble to setup logger: %w", err)
110-
}
111-
112114
cl, err := NewServiceClient(opts)
113115
if err != nil {
114116
return nil, err

0 commit comments

Comments
 (0)