Skip to content

Commit

Permalink
Merge pull request #4824 from filecoin-project/feat/winpost-warmup
Browse files Browse the repository at this point in the history
miner: Winning PoSt Warmup
  • Loading branch information
magik6k authored Nov 12, 2020
2 parents 36b78b1 + fb05bb7 commit 6d3e59e
Show file tree
Hide file tree
Showing 2 changed files with 84 additions and 0 deletions.
2 changes: 2 additions & 0 deletions miner/miner.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,8 @@ func (m *Miner) mine(ctx context.Context) {
ctx, span := trace.StartSpan(ctx, "/mine")
defer span.End()

go m.doWinPoStWarmup(ctx)

var lastBase MiningBase
minerLoop:
for {
Expand Down
82 changes: 82 additions & 0 deletions miner/warmup.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package miner

import (
"context"
"crypto/rand"
"math"
"time"

"golang.org/x/xerrors"

"github.com/filecoin-project/go-bitfield"
"github.com/filecoin-project/go-state-types/abi"

proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof"

"github.com/filecoin-project/lotus/chain/types"
)

func (m *Miner) winPoStWarmup(ctx context.Context) error {
deadlines, err := m.api.StateMinerDeadlines(ctx, m.address, types.EmptyTSK)
if err != nil {
return xerrors.Errorf("getting deadlines: %w", err)
}

var sector abi.SectorNumber = math.MaxUint64

for dlIdx := range deadlines {
partitions, err := m.api.StateMinerPartitions(ctx, m.address, uint64(dlIdx), types.EmptyTSK)
if err != nil {
return xerrors.Errorf("getting partitions for deadline %d: %w", dlIdx, err)
}

for _, partition := range partitions {
b, err := partition.ActiveSectors.First()
if err == bitfield.ErrNoBitsSet {
continue
}
if err != nil {
return err
}

sector = abi.SectorNumber(b)
}
}

if sector == math.MaxUint64 {
log.Info("skipping winning PoSt warmup, no sectors")
return nil
}

log.Infow("starting winning PoSt warmup", "sector", sector)
start := time.Now()

var r abi.PoStRandomness = make([]byte, abi.RandomnessLength)
_, _ = rand.Read(r)

si, err := m.api.StateSectorGetInfo(ctx, m.address, sector, types.EmptyTSK)
if err != nil {
return xerrors.Errorf("getting sector info: %w", err)
}

_, err = m.epp.ComputeProof(ctx, []proof2.SectorInfo{
{
SealProof: si.SealProof,
SectorNumber: sector,
SealedCID: si.SealedCID,
},
}, r)
if err != nil {
return xerrors.Errorf("failed to compute proof: %w", err)
}

log.Infow("winning PoSt warmup successful", "took", time.Now().Sub(start))
return nil
}

func (m *Miner) doWinPoStWarmup(ctx context.Context) {
err := m.winPoStWarmup(ctx)
if err != nil {
log.Errorw("winning PoSt warmup failed", "error", err)
}
}

0 comments on commit 6d3e59e

Please sign in to comment.