2019-11-25 04:45:13 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2019-12-08 18:35:44 +00:00
|
|
|
"fmt"
|
2019-11-25 04:45:13 +00:00
|
|
|
"os"
|
|
|
|
|
2019-12-08 18:35:44 +00:00
|
|
|
"encoding/json"
|
|
|
|
|
2019-11-25 04:45:13 +00:00
|
|
|
logging "github.com/ipfs/go-log"
|
|
|
|
"github.com/mitchellh/go-homedir"
|
|
|
|
"gopkg.in/urfave/cli.v2"
|
2019-11-26 13:52:59 +00:00
|
|
|
|
|
|
|
"github.com/filecoin-project/lotus/build"
|
|
|
|
"github.com/filecoin-project/lotus/chain/address"
|
2019-11-27 14:18:51 +00:00
|
|
|
"github.com/filecoin-project/lotus/cmd/lotus-seed/seed"
|
2019-12-08 18:35:44 +00:00
|
|
|
"github.com/filecoin-project/lotus/genesis"
|
2019-11-25 04:45:13 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
var log = logging.Logger("lotus-seed")
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
logging.SetLogLevel("*", "INFO")
|
|
|
|
|
|
|
|
log.Info("Starting seed")
|
|
|
|
|
|
|
|
local := []*cli.Command{
|
|
|
|
preSealCmd,
|
2019-12-08 18:35:44 +00:00
|
|
|
aggregateManifestsCmd,
|
2019-11-25 04:45:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
app := &cli.App{
|
|
|
|
Name: "lotus-seed",
|
|
|
|
Usage: "Seal sectors for genesis miner",
|
|
|
|
Version: build.Version,
|
|
|
|
Flags: []cli.Flag{
|
|
|
|
&cli.StringFlag{
|
|
|
|
Name: "sectorbuilder-dir",
|
|
|
|
Value: "~/.genesis-sectors",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
Commands: local,
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := app.Run(os.Args); err != nil {
|
|
|
|
log.Warn(err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var preSealCmd = &cli.Command{
|
|
|
|
Name: "pre-seal",
|
|
|
|
Flags: []cli.Flag{
|
|
|
|
&cli.StringFlag{
|
|
|
|
Name: "miner-addr",
|
|
|
|
Value: "t0101",
|
|
|
|
Usage: "specify the future address of your miner",
|
|
|
|
},
|
|
|
|
&cli.Uint64Flag{
|
|
|
|
Name: "sector-size",
|
2019-11-28 10:55:34 +00:00
|
|
|
Value: build.SectorSizes[0],
|
2019-11-25 04:45:13 +00:00
|
|
|
Usage: "specify size of sectors to pre-seal",
|
|
|
|
},
|
|
|
|
&cli.StringFlag{
|
|
|
|
Name: "ticket-preimage",
|
|
|
|
Value: "lotus is fire",
|
|
|
|
Usage: "set the ticket preimage for sealing randomness",
|
|
|
|
},
|
2019-11-30 23:17:50 +00:00
|
|
|
&cli.IntFlag{
|
2019-11-25 04:45:13 +00:00
|
|
|
Name: "num-sectors",
|
|
|
|
Value: 1,
|
|
|
|
Usage: "select number of sectors to pre-seal",
|
|
|
|
},
|
2019-12-06 17:55:46 +00:00
|
|
|
&cli.Uint64Flag{
|
2019-12-06 17:53:33 +00:00
|
|
|
Name: "sector-offset",
|
|
|
|
Value: 0,
|
2019-12-06 21:49:44 +00:00
|
|
|
Usage: "how many sector ids to skip when starting to seal",
|
2019-12-06 17:53:33 +00:00
|
|
|
},
|
2019-11-25 04:45:13 +00:00
|
|
|
},
|
|
|
|
Action: func(c *cli.Context) error {
|
|
|
|
sdir := c.String("sectorbuilder-dir")
|
|
|
|
sbroot, err := homedir.Expand(sdir)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
maddr, err := address.NewFromString(c.String("miner-addr"))
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2019-12-06 17:53:33 +00:00
|
|
|
gm, err := seed.PreSeal(maddr, c.Uint64("sector-size"), c.Uint64("sector-offset"), c.Int("num-sectors"), sbroot, []byte(c.String("ticket-preimage")))
|
2019-11-29 03:38:18 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return seed.WriteGenesisMiner(maddr, sbroot, gm)
|
2019-11-25 04:45:13 +00:00
|
|
|
},
|
|
|
|
}
|
2019-12-08 18:35:44 +00:00
|
|
|
|
|
|
|
var aggregateManifestsCmd = &cli.Command{
|
|
|
|
Name: "aggregate-manifests",
|
|
|
|
Usage: "aggregate a set of preseal manifests into a single file",
|
|
|
|
Action: func(cctx *cli.Context) error {
|
|
|
|
var inputs []map[string]genesis.GenesisMiner
|
|
|
|
for _, infi := range cctx.Args().Slice() {
|
|
|
|
fi, err := os.Open(infi)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
defer fi.Close()
|
|
|
|
var val map[string]genesis.GenesisMiner
|
|
|
|
if err := json.NewDecoder(fi).Decode(&val); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
inputs = append(inputs, val)
|
|
|
|
}
|
|
|
|
|
|
|
|
output := make(map[string]genesis.GenesisMiner)
|
|
|
|
for _, in := range inputs {
|
|
|
|
for maddr, val := range in {
|
|
|
|
if gm, ok := output[maddr]; ok {
|
|
|
|
output[maddr] = mergeGenMiners(gm, val)
|
|
|
|
} else {
|
|
|
|
output[maddr] = val
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
blob, err := json.MarshalIndent(output, "", " ")
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
fmt.Println(string(blob))
|
|
|
|
return nil
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
func mergeGenMiners(a, b genesis.GenesisMiner) genesis.GenesisMiner {
|
|
|
|
if a.SectorSize != b.SectorSize {
|
|
|
|
panic("sector sizes mismatch")
|
|
|
|
}
|
|
|
|
|
|
|
|
return genesis.GenesisMiner{
|
|
|
|
Owner: a.Owner,
|
|
|
|
Worker: a.Worker,
|
|
|
|
SectorSize: a.SectorSize,
|
|
|
|
Key: a.Key,
|
|
|
|
Sectors: append(a.Sectors, b.Sectors...),
|
|
|
|
}
|
|
|
|
}
|