2021-06-07 22:05:52 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2021-06-10 16:39:57 +00:00
|
|
|
"bytes"
|
2021-06-08 18:23:51 +00:00
|
|
|
"context"
|
2021-06-07 22:05:52 +00:00
|
|
|
"fmt"
|
2021-06-10 04:27:48 +00:00
|
|
|
"io"
|
2021-06-10 16:39:57 +00:00
|
|
|
"os"
|
2021-06-07 22:05:52 +00:00
|
|
|
"text/tabwriter"
|
2021-06-08 18:23:51 +00:00
|
|
|
"time"
|
2021-06-07 22:05:52 +00:00
|
|
|
|
2021-06-10 16:39:57 +00:00
|
|
|
"github.com/ipfs/go-cid"
|
2021-06-07 22:05:52 +00:00
|
|
|
"github.com/urfave/cli/v2"
|
2021-06-08 18:23:51 +00:00
|
|
|
|
|
|
|
"github.com/filecoin-project/go-state-types/big"
|
2021-06-10 16:39:57 +00:00
|
|
|
"github.com/filecoin-project/go-state-types/exitcode"
|
|
|
|
"github.com/filecoin-project/specs-actors/v5/actors/builtin"
|
|
|
|
"github.com/filecoin-project/specs-actors/v5/actors/builtin/miner"
|
2021-06-10 02:40:00 +00:00
|
|
|
|
2021-06-08 18:23:51 +00:00
|
|
|
"github.com/filecoin-project/lotus/chain/actors/builtin/power"
|
|
|
|
"github.com/filecoin-project/lotus/chain/stmgr"
|
|
|
|
"github.com/filecoin-project/lotus/chain/types"
|
2021-06-10 04:27:48 +00:00
|
|
|
"github.com/filecoin-project/lotus/cmd/lotus-sim/simulation"
|
2021-06-07 22:05:52 +00:00
|
|
|
)
|
|
|
|
|
2021-06-08 18:23:51 +00:00
|
|
|
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()
|
|
|
|
}
|
|
|
|
|
2021-06-10 04:27:48 +00:00
|
|
|
func printInfo(ctx context.Context, sim *simulation.Simulation, out io.Writer) error {
|
|
|
|
powerNow, err := getTotalPower(ctx, sim.StateManager, sim.GetHead())
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
powerStart, err := getTotalPower(ctx, sim.StateManager, sim.GetStart())
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
powerGrowth := big.Sub(powerNow.RawBytePower, powerStart.RawBytePower)
|
|
|
|
|
|
|
|
tw := tabwriter.NewWriter(out, 8, 8, 1, ' ', 0)
|
|
|
|
|
|
|
|
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()
|
|
|
|
}
|
|
|
|
|
2021-06-07 22:05:52 +00:00
|
|
|
var infoSimCommand = &cli.Command{
|
|
|
|
Name: "info",
|
|
|
|
Description: "Output information about the simulation.",
|
2021-06-10 16:39:57 +00:00
|
|
|
Subcommands: []*cli.Command{
|
|
|
|
infoCommitGasSimCommand,
|
|
|
|
},
|
2021-06-07 22:05:52 +00:00
|
|
|
Action: func(cctx *cli.Context) error {
|
|
|
|
node, err := open(cctx)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
defer node.Close()
|
|
|
|
|
|
|
|
sim, err := node.LoadSim(cctx.Context, cctx.String("simulation"))
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2021-06-10 04:27:48 +00:00
|
|
|
return printInfo(cctx.Context, sim, cctx.App.Writer)
|
2021-06-07 22:05:52 +00:00
|
|
|
},
|
|
|
|
}
|
2021-06-10 16:39:57 +00:00
|
|
|
|
|
|
|
var infoCommitGasSimCommand = &cli.Command{
|
|
|
|
Name: "commit-gas",
|
|
|
|
Description: "Output information about the gas for committs",
|
2021-06-10 17:04:15 +00:00
|
|
|
Flags: []cli.Flag{
|
|
|
|
&cli.Int64Flag{
|
|
|
|
Name: "lookback",
|
|
|
|
Value: 0,
|
|
|
|
},
|
|
|
|
},
|
2021-06-10 16:39:57 +00:00
|
|
|
Action: func(cctx *cli.Context) error {
|
|
|
|
log := func(f string, i ...interface{}) {
|
|
|
|
fmt.Fprintf(os.Stderr, f, i...)
|
|
|
|
}
|
|
|
|
node, err := open(cctx)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
defer node.Close()
|
|
|
|
|
|
|
|
sim, err := node.LoadSim(cctx.Context, cctx.String("simulation"))
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
var gasAgg, proofsAgg uint64
|
|
|
|
var gasAggMax, proofsAggMax uint64
|
2021-06-10 17:26:09 +00:00
|
|
|
var gasSingle, proofsSingle uint64
|
2021-06-10 16:39:57 +00:00
|
|
|
|
2021-06-10 17:26:43 +00:00
|
|
|
sim.Walk(cctx.Context, cctx.Int64("lookback"), func(
|
|
|
|
sm *stmgr.StateManager, ts *types.TipSet, stCid cid.Cid,
|
|
|
|
messages []*simulation.AppliedMessage,
|
|
|
|
) error {
|
|
|
|
for _, m := range messages {
|
|
|
|
if m.ExitCode != exitcode.Ok {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
if m.Method == builtin.MethodsMiner.ProveCommitAggregate {
|
|
|
|
param := miner.ProveCommitAggregateParams{}
|
|
|
|
err := param.UnmarshalCBOR(bytes.NewReader(m.Params))
|
|
|
|
if err != nil {
|
|
|
|
log("failed to decode params: %+v", err)
|
|
|
|
return nil
|
2021-06-10 16:39:57 +00:00
|
|
|
}
|
2021-06-10 17:26:43 +00:00
|
|
|
c, err := param.SectorNumbers.Count()
|
|
|
|
if err != nil {
|
|
|
|
log("failed to count sectors")
|
|
|
|
return nil
|
2021-06-10 16:39:57 +00:00
|
|
|
}
|
2021-06-10 17:26:43 +00:00
|
|
|
gasAgg += uint64(m.GasUsed)
|
|
|
|
proofsAgg += c
|
|
|
|
if c == 819 {
|
|
|
|
gasAggMax += uint64(m.GasUsed)
|
|
|
|
proofsAggMax += c
|
2021-06-10 17:04:15 +00:00
|
|
|
}
|
2021-06-10 16:39:57 +00:00
|
|
|
}
|
|
|
|
|
2021-06-10 17:26:43 +00:00
|
|
|
if m.Method == builtin.MethodsMiner.ProveCommitSector {
|
|
|
|
gasSingle += uint64(m.GasUsed)
|
|
|
|
proofsSingle++
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
})
|
2021-06-10 17:26:09 +00:00
|
|
|
idealGassUsed := float64(gasAggMax) / float64(proofsAggMax) * float64(proofsAgg+proofsSingle)
|
2021-06-10 16:39:57 +00:00
|
|
|
|
2021-06-10 17:26:09 +00:00
|
|
|
fmt.Printf("Gas usage efficiency in comparison to all 819: %f%%\n", 100*idealGassUsed/float64(gasAgg+gasSingle))
|
2021-06-10 16:39:57 +00:00
|
|
|
|
|
|
|
return nil
|
|
|
|
},
|
|
|
|
}
|