2019-07-24 01:13:56 +00:00
|
|
|
package impl
|
2019-07-08 19:07:16 +00:00
|
|
|
|
|
|
|
import (
|
2020-10-01 15:14:08 +00:00
|
|
|
"context"
|
2021-03-10 17:22:35 +00:00
|
|
|
"time"
|
|
|
|
|
2020-01-08 19:10:57 +00:00
|
|
|
logging "github.com/ipfs/go-log/v2"
|
2022-08-25 18:20:41 +00:00
|
|
|
"github.com/libp2p/go-libp2p/core/peer"
|
2019-09-30 21:06:47 +00:00
|
|
|
|
2020-03-19 02:31:53 +00:00
|
|
|
"github.com/filecoin-project/lotus/api"
|
2021-03-10 17:22:35 +00:00
|
|
|
"github.com/filecoin-project/lotus/build"
|
2022-09-27 16:08:04 +00:00
|
|
|
consensus2 "github.com/filecoin-project/lotus/lib/consensus/raft"
|
2019-10-18 04:47:41 +00:00
|
|
|
"github.com/filecoin-project/lotus/node/impl/client"
|
2020-03-19 02:31:53 +00:00
|
|
|
"github.com/filecoin-project/lotus/node/impl/common"
|
|
|
|
"github.com/filecoin-project/lotus/node/impl/full"
|
2019-11-08 20:11:56 +00:00
|
|
|
"github.com/filecoin-project/lotus/node/impl/market"
|
2021-06-29 12:07:00 +00:00
|
|
|
"github.com/filecoin-project/lotus/node/impl/net"
|
2019-10-18 04:47:41 +00:00
|
|
|
"github.com/filecoin-project/lotus/node/impl/paych"
|
2020-10-01 15:14:08 +00:00
|
|
|
"github.com/filecoin-project/lotus/node/modules/dtypes"
|
2021-03-10 17:22:35 +00:00
|
|
|
"github.com/filecoin-project/lotus/node/modules/lp2p"
|
2019-07-08 19:07:16 +00:00
|
|
|
)
|
|
|
|
|
2019-07-23 17:27:45 +00:00
|
|
|
var log = logging.Logger("node")
|
|
|
|
|
2019-08-20 17:19:24 +00:00
|
|
|
type FullNodeAPI struct {
|
2020-03-19 02:31:53 +00:00
|
|
|
common.CommonAPI
|
2021-06-29 12:07:00 +00:00
|
|
|
net.NetAPI
|
2019-08-20 16:48:33 +00:00
|
|
|
full.ChainAPI
|
2019-09-16 13:46:05 +00:00
|
|
|
client.API
|
2019-08-20 16:48:33 +00:00
|
|
|
full.MpoolAPI
|
2020-07-20 17:48:30 +00:00
|
|
|
full.GasAPI
|
2019-11-08 17:15:38 +00:00
|
|
|
market.MarketAPI
|
2019-09-16 13:46:05 +00:00
|
|
|
paych.PaychAPI
|
2019-08-20 16:48:33 +00:00
|
|
|
full.StateAPI
|
2020-05-04 19:29:26 +00:00
|
|
|
full.MsigAPI
|
2019-08-20 16:48:33 +00:00
|
|
|
full.WalletAPI
|
2019-09-30 21:06:47 +00:00
|
|
|
full.SyncAPI
|
2022-09-27 16:08:04 +00:00
|
|
|
full.RaftAPI
|
2020-10-01 15:14:08 +00:00
|
|
|
|
2021-03-10 17:22:35 +00:00
|
|
|
DS dtypes.MetadataDS
|
|
|
|
NetworkName dtypes.NetworkName
|
2020-10-01 15:14:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (n *FullNodeAPI) CreateBackup(ctx context.Context, fpath string) error {
|
2021-12-11 21:03:00 +00:00
|
|
|
return backup(ctx, n.DS, fpath)
|
2019-08-20 18:05:17 +00:00
|
|
|
}
|
|
|
|
|
2021-03-10 17:22:35 +00:00
|
|
|
func (n *FullNodeAPI) NodeStatus(ctx context.Context, inclChainStatus bool) (status api.NodeStatus, err error) {
|
|
|
|
curTs, err := n.ChainHead(ctx)
|
|
|
|
if err != nil {
|
|
|
|
return status, err
|
|
|
|
}
|
|
|
|
|
|
|
|
status.SyncStatus.Epoch = uint64(curTs.Height())
|
|
|
|
timestamp := time.Unix(int64(curTs.MinTimestamp()), 0)
|
|
|
|
delta := time.Since(timestamp).Seconds()
|
|
|
|
status.SyncStatus.Behind = uint64(delta / 30)
|
|
|
|
|
|
|
|
// get peers in the messages and blocks topics
|
|
|
|
peersMsgs := make(map[peer.ID]struct{})
|
|
|
|
peersBlocks := make(map[peer.ID]struct{})
|
|
|
|
|
|
|
|
for _, p := range n.PubSub.ListPeers(build.MessagesTopic(n.NetworkName)) {
|
|
|
|
peersMsgs[p] = struct{}{}
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, p := range n.PubSub.ListPeers(build.BlocksTopic(n.NetworkName)) {
|
|
|
|
peersBlocks[p] = struct{}{}
|
|
|
|
}
|
|
|
|
|
|
|
|
// get scores for all connected and recent peers
|
|
|
|
scores, err := n.NetPubsubScores(ctx)
|
|
|
|
if err != nil {
|
|
|
|
return status, err
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, score := range scores {
|
|
|
|
if score.Score.Score > lp2p.PublishScoreThreshold {
|
|
|
|
_, inMsgs := peersMsgs[score.ID]
|
|
|
|
if inMsgs {
|
|
|
|
status.PeerStatus.PeersToPublishMsgs++
|
|
|
|
}
|
|
|
|
|
|
|
|
_, inBlocks := peersBlocks[score.ID]
|
|
|
|
if inBlocks {
|
|
|
|
status.PeerStatus.PeersToPublishBlocks++
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if inclChainStatus && status.SyncStatus.Epoch > uint64(build.Finality) {
|
|
|
|
blockCnt := 0
|
|
|
|
ts := curTs
|
|
|
|
|
|
|
|
for i := 0; i < 100; i++ {
|
|
|
|
blockCnt += len(ts.Blocks())
|
|
|
|
tsk := ts.Parents()
|
|
|
|
ts, err = n.ChainGetTipSet(ctx, tsk)
|
|
|
|
if err != nil {
|
|
|
|
return status, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
status.ChainStatus.BlocksPerTipsetLast100 = float64(blockCnt) / 100
|
|
|
|
|
|
|
|
for i := 100; i < int(build.Finality); i++ {
|
|
|
|
blockCnt += len(ts.Blocks())
|
|
|
|
tsk := ts.Parents()
|
|
|
|
ts, err = n.ChainGetTipSet(ctx, tsk)
|
|
|
|
if err != nil {
|
|
|
|
return status, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
status.ChainStatus.BlocksPerTipsetLastFinality = float64(blockCnt) / float64(build.Finality)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return status, nil
|
|
|
|
}
|
|
|
|
|
2022-09-27 16:08:04 +00:00
|
|
|
func (n *FullNodeAPI) RaftState(ctx context.Context) (*consensus2.RaftState, error) {
|
|
|
|
return n.RaftAPI.GetRaftState(ctx)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (n *FullNodeAPI) RaftLeader(ctx context.Context) (peer.ID, error) {
|
|
|
|
return n.RaftAPI.Leader(ctx)
|
2022-09-08 18:20:05 +00:00
|
|
|
}
|
|
|
|
|
2019-08-20 17:19:24 +00:00
|
|
|
var _ api.FullNode = &FullNodeAPI{}
|