Skip to content

Commit 48c5494

Browse files
authored
multiple network support (textileio#525)
* support different networks Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com> * get network name from api Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com> * improve and fix error handling Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com> * changes due to update Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com> * keep using 0.4.0 Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com> * nits Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com> * lint Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com> * keep using 0.4.0 Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com> * readme and fixes Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com> * typo Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
1 parent 7e82717 commit 48c5494

11 files changed

Lines changed: 121 additions & 65 deletions

File tree

README.md

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -205,19 +205,18 @@ In this example we created a random 700 bytes file for the test, but since the l
205205
206206
## Production setup
207207
208-
Apart from what was mentioned in the _Installation_ section, a docker-compose setup is available which installs extra components for better monitoring of Powergate:
209-
```bash
210-
cd docker
211-
make up
212-
```
213-
This will spinup and auto-wire:
208+
A production setup is also provided in the `docker` folder. It launches `powd` connected to `lotus` and `ipfs`, plus a set of monitoring components:
214209
- _Prometheus_, which is the backend for metrics processing.
215210
- _Grafana_, for metrics dashboard.
216211
- _cAdvisor_, for container metrics.
217212
- _Lotus_, node running on the current Testnet.
218213
- _IPFS_, node running to back Powergate FFS.
219214
- _Powergate_, wired with all of above components.
220215
216+
Depending on which network you want to connect to, you have to run different commands:
217+
- `make up`, to connect to `testnet`.
218+
- `make nerpa-up`, to connect to `nerpa`.
219+
221220
Remember that you should wait for _Lotus_ to be fully-synced which might take a long time; you can check your current node sync status running `lotus sync status` inside the Lotus container. We also provide automatically generated Dockerhub images of Powergate server, see [textile/powergate](https://hub.docker.com/r/textile/powergate).
222221
223222
We will soon provide other non-contanerized setups, but most of the wiring can be auto-explained by the `docker/docker-compose.yaml` file.

api/server/server.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,15 @@ func NewServer(conf Config) (*Server, error) {
130130
}
131131
}
132132

133-
fchost, err := fchost.New(!conf.Devnet)
133+
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
134+
defer cancel()
135+
network, err := c.StateNetworkName(ctx)
136+
if err != nil {
137+
return nil, fmt.Errorf("getting Lotus network name: %s", err)
138+
}
139+
log.Infof("Detected Lotus node connected to network: %s", network)
140+
141+
fchost, err := fchost.New(string(network), !conf.Devnet)
134142
if err != nil {
135143
return nil, fmt.Errorf("creating filecoin host: %s", err)
136144
}

deals/module/deals.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ func (m *Module) retrieve(ctx context.Context, waddr string, cid cid.Cid, ref *a
185185
}
186186
for _, o := range offers {
187187
if err = m.api.ClientRetrieve(ctx, o.Order(addr), ref); err != nil {
188-
log.Infof("error fetching/retrieving cid %s from %s: %s", cid, o.Miner, err)
188+
log.Infof("fetching/retrieving cid %s from %s: %s", cid, o.Miner, err)
189189
continue
190190
}
191191
m.recordRetrieval(waddr, o)
@@ -228,6 +228,7 @@ func (m *Module) Watch(ctx context.Context, proposals []cid.Cid) (<-chan deals.S
228228
case <-time.After(util.AvgBlockTime):
229229
if err := notifyChanges(ctx, m.api, currentState, proposals, ch); err != nil {
230230
log.Errorf("pushing new proposal states: %s", err)
231+
return
231232
}
232233
}
233234
}
@@ -439,7 +440,7 @@ func (m *Module) eventuallyFinalizeDeal(dr deals.StorageDealRecord, timeout time
439440
return
440441
case info, ok := <-updates:
441442
if !ok {
442-
log.Errorf("updates channel unexpectedly closed for proposal cid: %s", dr.DealInfo.ProposalCid.String(), err)
443+
log.Errorf("updates channel unexpectedly closed for proposal cid %s", dr.DealInfo.ProposalCid.String())
443444
if err := m.store.deletePendingDeal(dr.DealInfo.ProposalCid); err != nil {
444445
log.Errorf("deleting pending deal: %v", err)
445446
}
@@ -495,8 +496,7 @@ func notifyChanges(ctx context.Context, client *apistruct.FullNodeStruct, currSt
495496
for _, pcid := range proposals {
496497
dinfo, err := client.ClientGetDealInfo(ctx, pcid)
497498
if err != nil {
498-
log.Errorf("getting deal proposal info %s: %s", pcid, err)
499-
continue
499+
return fmt.Errorf("getting deal proposal info %s: %s", pcid, err)
500500
}
501501
if currState[pcid] == nil || (*currState[pcid]).State != dinfo.State {
502502
currState[pcid] = dinfo

deals/module/deals_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ func storeMultiMiner(m *Module, client *apistruct.FullNodeStruct, numMiners int,
130130
}
131131
srs, err := m.Store(ctx, addr.String(), dataCid, 2*uint64(size), cfgs, 1000)
132132
if err != nil {
133-
return cid.Undef, nil, fmt.Errorf("error when calling Store(): %s", err)
133+
return cid.Undef, nil, fmt.Errorf("calling Store(): %s", err)
134134
}
135135

136136
var pcids []cid.Cid

docker/Makefile

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,55 @@
11
down:
2+
LOTUS_IMAGE_TAG=v0.4.1 \
23
docker-compose \
34
-f docker-compose.yaml \
45
-f ipfs-image.yaml \
56
-f powergate-build-context.yaml \
67
down
7-
docker-compose -p localnet \
8-
-f docker-compose-localnet.yaml \
9-
-f ipfs-image.yaml \
10-
-f powergate-build-context.yaml \
11-
down
128
.PHONY: down
139

1410
up: down
11+
LOTUS_IMAGE_TAG=v0.4.1 \
1512
docker-compose \
1613
-f docker-compose.yaml \
1714
-f ipfs-image.yaml \
1815
-f powergate-build-context.yaml \
1916
up --build
2017
.PHONY: up
2118

19+
20+
localnet-down:
21+
docker-compose -p localnet \
22+
-f docker-compose-localnet.yaml \
23+
-f ipfs-image.yaml \
24+
-f powergate-build-context.yaml \
25+
down
26+
.PHONY: localnet-down
27+
2228
localnet:
2329
docker-compose -p localnet \
2430
-f docker-compose-localnet.yaml \
2531
-f ipfs-image.yaml \
2632
-f powergate-build-context.yaml \
2733
up --build -V
2834
.PHONY: localnet
35+
36+
37+
nerpa-up: nerpa-down
38+
LOTUS_IMAGE_TAG=nerpa-ntwk-nerpa-7.7.0 \
39+
docker-compose \
40+
-p nerpa \
41+
-f docker-compose.yaml \
42+
-f ipfs-image.yaml \
43+
-f powergate-build-context.yaml \
44+
up --build
45+
.PHONY: nerpa-up
46+
47+
nerpa-down:
48+
LOTUS_IMAGE_TAG=nerpa-ntwk-nerpa-7.7.0 \
49+
docker-compose \
50+
-p nerpa \
51+
-f docker-compose.yaml \
52+
-f ipfs-image.yaml \
53+
-f powergate-build-context.yaml \
54+
down
55+
.PHONY: nerpa-down

docker/docker-compose.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ services:
2828
- powergate-lotus:/root/lotus
2929

3030
lotus:
31-
image: textile/lotus:v0.4.0
31+
image: textile/lotus:${LOTUS_IMAGE_TAG}
3232
volumes:
3333
- powergate-lotus:/data
3434
environment:

fchost/config.go

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,45 @@
11
package fchost
22

33
import (
4+
"fmt"
5+
46
"github.com/libp2p/go-libp2p"
57
"github.com/libp2p/go-libp2p-core/peer"
68
"github.com/libp2p/go-libp2p/config"
79
"github.com/multiformats/go-multiaddr"
810
)
911

1012
var (
11-
addrs = []string{
12-
"/dns4/bootstrap-0-sin.fil-test.net/tcp/1347/p2p/12D3KooWPdUquftaQvoQEtEdsRBAhwD6jopbF2oweVTzR59VbHEd",
13-
"/ip4/86.109.15.57/tcp/1347/p2p/12D3KooWPdUquftaQvoQEtEdsRBAhwD6jopbF2oweVTzR59VbHEd",
14-
"/dns4/bootstrap-0-dfw.fil-test.net/tcp/1347/p2p/12D3KooWQSCkHCzosEyrh8FgYfLejKgEPM5VB6qWzZE3yDAuXn8d",
15-
"/ip4/139.178.84.45/tcp/1347/p2p/12D3KooWQSCkHCzosEyrh8FgYfLejKgEPM5VB6qWzZE3yDAuXn8d",
16-
"/dns4/bootstrap-0-fra.fil-test.net/tcp/1347/p2p/12D3KooWEXN2eQmoyqnNjde9PBAQfQLHN67jcEdWU6JougWrgXJK",
17-
"/ip4/136.144.49.17/tcp/1347/p2p/12D3KooWEXN2eQmoyqnNjde9PBAQfQLHN67jcEdWU6JougWrgXJK",
18-
"/dns4/bootstrap-1-sin.fil-test.net/tcp/1347/p2p/12D3KooWLmJkZd33mJhjg5RrpJ6NFep9SNLXWc4uVngV4TXKwzYw",
19-
"/ip4/86.109.15.123/tcp/1347/p2p/12D3KooWLmJkZd33mJhjg5RrpJ6NFep9SNLXWc4uVngV4TXKwzYw",
20-
"/dns4/bootstrap-1-dfw.fil-test.net/tcp/1347/p2p/12D3KooWGXLHjiz6pTRu7x2pkgTVCoxcCiVxcNLpMnWcJ3JiNEy5",
21-
"/ip4/139.178.86.3/tcp/1347/p2p/12D3KooWGXLHjiz6pTRu7x2pkgTVCoxcCiVxcNLpMnWcJ3JiNEy5",
22-
"/dns4/bootstrap-1-fra.fil-test.net/tcp/1347/p2p/12D3KooW9szZmKttS9A1FafH3Zc2pxKwwmvCWCGKkRP4KmbhhC4R",
23-
"/ip4/136.144.49.131/tcp/1347/p2p/12D3KooW9szZmKttS9A1FafH3Zc2pxKwwmvCWCGKkRP4KmbhhC4R",
13+
networkBootstrappers = map[string][]string{
14+
"testnet": {
15+
"/dns4/bootstrap-0-sin.fil-test.net/tcp/1347/p2p/12D3KooWPdUquftaQvoQEtEdsRBAhwD6jopbF2oweVTzR59VbHEd",
16+
"/ip4/86.109.15.57/tcp/1347/p2p/12D3KooWPdUquftaQvoQEtEdsRBAhwD6jopbF2oweVTzR59VbHEd",
17+
"/dns4/bootstrap-0-dfw.fil-test.net/tcp/1347/p2p/12D3KooWQSCkHCzosEyrh8FgYfLejKgEPM5VB6qWzZE3yDAuXn8d",
18+
"/ip4/139.178.84.45/tcp/1347/p2p/12D3KooWQSCkHCzosEyrh8FgYfLejKgEPM5VB6qWzZE3yDAuXn8d",
19+
"/dns4/bootstrap-0-fra.fil-test.net/tcp/1347/p2p/12D3KooWEXN2eQmoyqnNjde9PBAQfQLHN67jcEdWU6JougWrgXJK",
20+
"/ip4/136.144.49.17/tcp/1347/p2p/12D3KooWEXN2eQmoyqnNjde9PBAQfQLHN67jcEdWU6JougWrgXJK",
21+
"/dns4/bootstrap-1-sin.fil-test.net/tcp/1347/p2p/12D3KooWLmJkZd33mJhjg5RrpJ6NFep9SNLXWc4uVngV4TXKwzYw",
22+
"/ip4/86.109.15.123/tcp/1347/p2p/12D3KooWLmJkZd33mJhjg5RrpJ6NFep9SNLXWc4uVngV4TXKwzYw",
23+
"/dns4/bootstrap-1-dfw.fil-test.net/tcp/1347/p2p/12D3KooWGXLHjiz6pTRu7x2pkgTVCoxcCiVxcNLpMnWcJ3JiNEy5",
24+
"/ip4/139.178.86.3/tcp/1347/p2p/12D3KooWGXLHjiz6pTRu7x2pkgTVCoxcCiVxcNLpMnWcJ3JiNEy5",
25+
"/dns4/bootstrap-1-fra.fil-test.net/tcp/1347/p2p/12D3KooW9szZmKttS9A1FafH3Zc2pxKwwmvCWCGKkRP4KmbhhC4R",
26+
"/ip4/136.144.49.131/tcp/1347/p2p/12D3KooW9szZmKttS9A1FafH3Zc2pxKwwmvCWCGKkRP4KmbhhC4R",
27+
},
28+
"nerpanet": {
29+
"/dns4/bootstrap-0.nerpa.fildev.network/tcp/1347/p2p/12D3KooWSTq4K1mTMoUSsDciFqxTwq3ZLu7T9scXiXZgM4tZdZi5",
30+
"/dns4/bootstrap-1.nerpa.fildev.network/tcp/1347/p2p/12D3KooWPWo8JEoVmekqzvAh9gsiF6hrrDYvRpgsQjqLPV4AwvZA",
31+
"/dns4/bootstrap-2.nerpa.fildev.network/tcp/1347/p2p/12D3KooWBMJQooyJVRdMEorxGozRdq5RLxjfHPmMrRnCcX34t7pK",
32+
"/dns4/bootstrap-3.nerpa.fildev.network/tcp/1347/p2p/12D3KooW9qdXNp4x51GHnUsaFJzWXcHFhp4t2HeEZNFBZj5JHfbU",
33+
},
2434
}
2535
)
2636

27-
func getBootstrapPeers() []peer.AddrInfo {
37+
func getBootstrapPeers(network string) ([]peer.AddrInfo, error) {
38+
addrs, ok := networkBootstrappers[network]
39+
if !ok {
40+
return nil, fmt.Errorf("network doesn't have any configured bootstrappers")
41+
}
42+
2843
maddrs := make([]multiaddr.Multiaddr, len(addrs))
2944
for i, addr := range addrs {
3045
var err error
@@ -37,7 +52,7 @@ func getBootstrapPeers() []peer.AddrInfo {
3752
if err != nil {
3853
panic(err)
3954
}
40-
return peers
55+
return peers, nil
4156
}
4257

4358
func getDefaultOpts() []config.Option {

fchost/fchost.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/libp2p/go-libp2p"
1010
"github.com/libp2p/go-libp2p-core/host"
1111
"github.com/libp2p/go-libp2p-core/peer"
12+
"github.com/libp2p/go-libp2p-core/protocol"
1213
dht "github.com/libp2p/go-libp2p-kad-dht"
1314
routedhost "github.com/libp2p/go-libp2p/p2p/host/routed"
1415
"github.com/libp2p/go-libp2p/p2p/protocol/ping"
@@ -27,21 +28,21 @@ type FilecoinHost struct {
2728
}
2829

2930
// New returns a new FilecoinHost.
30-
func New(bootstrap bool) (*FilecoinHost, error) {
31+
func New(network string, bootstrap bool) (*FilecoinHost, error) {
3132
ctx := context.Background()
3233
opts := getDefaultOpts()
3334
h, err := libp2p.New(ctx, opts...)
3435
if err != nil {
3536
return nil, err
3637
}
3738

38-
dht, err := dht.New(ctx, h, dht.ProtocolPrefix("/fil/kad/testnet"))
39+
dht, err := dht.New(ctx, h, dht.ProtocolPrefix(protocol.ID("/fil/kad/"+network)))
3940
if err != nil {
4041
return nil, err
4142
}
4243

4344
if bootstrap {
44-
if err := connectToBootstrapPeers(h); err != nil {
45+
if err := connectToBootstrapPeers(network, h); err != nil {
4546
return nil, err
4647
}
4748
}
@@ -87,8 +88,11 @@ func (fc *FilecoinHost) Addrs(pid peer.ID) []multiaddr.Multiaddr {
8788
return fc.h.Peerstore().Addrs(pid)
8889
}
8990

90-
func connectToBootstrapPeers(h host.Host) error {
91-
peers := getBootstrapPeers()
91+
func connectToBootstrapPeers(network string, h host.Host) error {
92+
peers, err := getBootstrapPeers(network)
93+
if err != nil {
94+
return fmt.Errorf("getting bootstrap peers: %s", err)
95+
}
9296
ctx := context.Background()
9397
var lock sync.Mutex
9498
var success int

fchost/fchost_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@ func TestPingBootstrapers(t *testing.T) {
1212
// a lot and boostrap peers change very frequently.
1313
// We can re-enable this when the network becomes stable again.
1414
t.SkipNow()
15-
h, err := New(false)
15+
h, err := New("testnet", false)
1616
require.NoError(t, err)
1717
err = h.Bootstrap()
1818
require.NoError(t, err)
1919

20-
bsPeers := getBootstrapPeers()
20+
bsPeers, err := getBootstrapPeers("testnet")
21+
require.NoError(t, err)
2122
for _, addr := range bsPeers {
2223
pong := h.Ping(context.Background(), addr.ID)
2324
if pong {

go.mod

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ require (
88
github.com/containerd/continuity v0.0.0-20200228182428-0f16d7a0959c // indirect
99
github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect
1010
github.com/filecoin-project/go-address v0.0.2-0.20200504173055-8b6f2fb2b3ef
11-
github.com/filecoin-project/go-fil-markets v0.3.0
11+
github.com/filecoin-project/go-fil-markets v0.3.2-0.20200702145639-4034a18364e4
1212
github.com/filecoin-project/go-jsonrpc v0.1.1-0.20200602181149-522144ab4e24
1313
github.com/filecoin-project/go-padreader v0.0.0-20200210211231-548257017ca6
14-
github.com/filecoin-project/lotus v0.4.0
15-
github.com/filecoin-project/specs-actors v0.6.2-0.20200617175406-de392ca14121
14+
github.com/filecoin-project/lotus v0.4.2-0.20200707004538-0a696f356696
15+
github.com/filecoin-project/specs-actors v0.6.2-0.20200702170846-2cd72643a5cf
1616
github.com/gin-contrib/location v0.0.2
1717
github.com/gin-contrib/static v0.0.0-20191128031702-f81c604d8ac2
1818
github.com/gin-gonic/gin v1.6.3
@@ -28,14 +28,15 @@ require (
2828
github.com/ipfs/go-ipfs-files v0.0.8
2929
github.com/ipfs/go-ipfs-http-client v0.0.6-0.20200512220018-7002cce28cb1
3030
github.com/ipfs/go-ipld-format v0.2.0
31-
github.com/ipfs/go-log/v2 v2.1.2-0.20200609205458-f8d20c392cb7
31+
github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4
3232
github.com/ipfs/go-merkledag v0.3.1
3333
github.com/ipfs/interface-go-ipfs-core v0.2.6
3434
github.com/ipld/go-car v0.1.1-0.20200526133713-1c7508d55aae
3535
github.com/jessevdk/go-assets v0.0.0-20160921144138-4f4301a06e15
3636
github.com/libp2p/go-libp2p v0.10.0
3737
github.com/libp2p/go-libp2p-core v0.6.0
3838
github.com/libp2p/go-libp2p-kad-dht v0.8.2
39+
github.com/libp2p/go-libp2p-protocol v0.1.0
3940
github.com/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381
4041
github.com/mattn/go-runewidth v0.0.8 // indirect
4142
github.com/mitchellh/go-homedir v1.1.0

0 commit comments

Comments
 (0)