-
Notifications
You must be signed in to change notification settings - Fork 0
/
spinfo.go
85 lines (73 loc) · 2.05 KB
/
spinfo.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package spinfo
import (
"context"
"errors"
"fmt"
"net/url"
"github.com/filecoin-project/go-address"
"github.com/ipfs/go-cid"
"github.com/libp2p/go-libp2p/core/peer"
"github.com/multiformats/go-multiaddr"
jrpc "github.com/ybbus/jsonrpc/v2"
)
type ExpTipSet struct {
Cids []cid.Cid
//Blocks []*BlockHeader
//Height abi.ChainEpoch
Blocks []interface{}
Height int64
}
type MinerInfo struct {
Owner address.Address
Worker address.Address
NewWorker address.Address
ControlAddresses []address.Address
WorkerChangeEpoch int64
PeerId *peer.ID
Multiaddrs [][]byte
WindowPoStProofType int64
SectorSize uint64
WindowPoStPartitionSectors uint64
ConsensusFaultElapsed int64
}
func SPAddrInfo(ctx context.Context, gateway, spID string) (peer.AddrInfo, error) {
if gateway == "" {
return peer.AddrInfo{}, errors.New("empty gateway")
}
// Get SP info from lotus
spAddr, err := address.NewFromString(spID)
if err != nil {
return peer.AddrInfo{}, fmt.Errorf("invalid storage provider id: %w", err)
}
gwURL := url.URL{
Host: gateway,
Scheme: "https",
Path: "/rpc/v1",
}
jrpcClient := jrpc.NewClient(gwURL.String())
var ets ExpTipSet
err = jrpcClient.CallFor(&ets, "Filecoin.ChainHead")
if err != nil {
return peer.AddrInfo{}, fmt.Errorf("cannot get chain head from gateway: %w", err)
}
var minerInfo MinerInfo
err = jrpcClient.CallFor(&minerInfo, "Filecoin.StateMinerInfo", spAddr, ets.Cids)
if err != nil {
return peer.AddrInfo{}, fmt.Errorf("cannot get miner infor from gateway: %w", err)
}
if minerInfo.PeerId == nil {
return peer.AddrInfo{}, errors.New("no peer id for miner")
}
multiaddrs := make([]multiaddr.Multiaddr, 0, len(minerInfo.Multiaddrs))
for _, a := range minerInfo.Multiaddrs {
maddr, err := multiaddr.NewMultiaddrBytes(a)
if err != nil {
continue
}
multiaddrs = append(multiaddrs, maddr)
}
return peer.AddrInfo{
ID: *minerInfo.PeerId,
Addrs: multiaddrs,
}, nil
}