From ccdd660f0ddf057e91e02c86b0089d1982a1c4e8 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 8 Jun 2021 11:23:51 -0700 Subject: [PATCH] feat(lotus-sim): more stats --- cmd/lotus-sim/stat.go | 61 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 57 insertions(+), 4 deletions(-) diff --git a/cmd/lotus-sim/stat.go b/cmd/lotus-sim/stat.go index 25f9f5d51..b51853b31 100644 --- a/cmd/lotus-sim/stat.go +++ b/cmd/lotus-sim/stat.go @@ -1,12 +1,31 @@ package main import ( + "context" "fmt" "text/tabwriter" + "time" "github.com/urfave/cli/v2" + + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/lotus/chain/actors/builtin/power" + "github.com/filecoin-project/lotus/chain/stmgr" + "github.com/filecoin-project/lotus/chain/types" ) +func getTotalPower(ctx context.Context, sm *stmgr.StateManager, ts *types.TipSet) (power.Claim, error) { + actor, err := sm.LoadActor(ctx, power.Address, ts) + if err != nil { + return power.Claim{}, err + } + state, err := power.Load(sm.ChainStore().ActorStore(ctx), actor) + if err != nil { + return power.Claim{}, err + } + return state.TotalPower() +} + var infoSimCommand = &cli.Command{ Name: "info", Description: "Output information about the simulation.", @@ -21,11 +40,45 @@ var infoSimCommand = &cli.Command{ if err != nil { return err } + + powerNow, err := getTotalPower(cctx.Context, sim.StateManager, sim.GetHead()) + if err != nil { + return err + } + powerStart, err := getTotalPower(cctx.Context, sim.StateManager, sim.GetStart()) + if err != nil { + return err + } + powerGrowth := big.Sub(powerNow.RawBytePower, powerStart.RawBytePower) + tw := tabwriter.NewWriter(cctx.App.Writer, 8, 8, 0, ' ', 0) - fmt.Fprintln(tw, "Name:\t", sim.Name()) - fmt.Fprintln(tw, "Height:\t", sim.GetHead().Height()) - fmt.Fprintln(tw, "TipSet:\t", sim.GetHead()) - fmt.Fprintln(tw, "Network Version:\t", sim.GetNetworkVersion()) + + head := sim.GetHead() + start := sim.GetStart() + headEpoch := head.Height() + firstEpoch := start.Height() + 1 + + headTime := time.Unix(int64(head.MinTimestamp()), 0) + startTime := time.Unix(int64(start.MinTimestamp()), 0) + duration := headTime.Sub(startTime) + + // growth rate in size/day + growthRate := big.Div( + big.Mul(powerGrowth, big.NewInt(int64(24*time.Hour))), + big.NewInt(int64(duration)), + ) + + fmt.Fprintf(tw, "Name:\t%s\n", sim.Name()) + fmt.Fprintf(tw, "Head:\t%s\n", head) + fmt.Fprintf(tw, "Last Epoch:\t%d\n", headEpoch) + fmt.Fprintf(tw, "First Epoch:\t%d\n", firstEpoch) + fmt.Fprintf(tw, "Length:\t%d\n", headEpoch-firstEpoch) + fmt.Fprintf(tw, "Date:\t%s\n", headTime) + fmt.Fprintf(tw, "Duration:\t%s\n", duration) + fmt.Fprintf(tw, "Power:\t%s\n", types.SizeStr(powerNow.RawBytePower)) + fmt.Fprintf(tw, "Power Growth:\t%s\n", types.SizeStr(powerGrowth)) + fmt.Fprintf(tw, "Power Growth Rate:\t%s/day\n", types.SizeStr(growthRate)) + fmt.Fprintf(tw, "Network Version:\t%d\n", sim.GetNetworkVersion()) return tw.Flush() }, }