171 lines
5.4 KiB
Go
171 lines
5.4 KiB
Go
//go:build cgo
|
|
// +build cgo
|
|
|
|
package ffiwrapper
|
|
|
|
import (
|
|
"context"
|
|
|
|
"go.opencensus.io/trace"
|
|
"golang.org/x/xerrors"
|
|
|
|
ffi "github.com/filecoin-project/filecoin-ffi"
|
|
"github.com/filecoin-project/go-state-types/abi"
|
|
"github.com/filecoin-project/specs-actors/v7/actors/runtime/proof"
|
|
|
|
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
|
)
|
|
|
|
func (sb *Sealer) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof.ExtendedSectorInfo, randomness abi.PoStRandomness) ([]proof.PoStProof, error) {
|
|
randomness[31] &= 0x3f
|
|
if len(sectorInfo) == 0 {
|
|
return nil, xerrors.Errorf("must provide sectors for winning post")
|
|
}
|
|
ppt, err := sectorInfo[0].SealProof.RegisteredWinningPoStProof()
|
|
if err != nil {
|
|
return nil, xerrors.Errorf("failed to convert to winning post proof: %w", err)
|
|
}
|
|
|
|
privsectors, skipped, done, err := sb.pubExtendedSectorToPriv(ctx, minerID, sectorInfo, nil, ppt) // TODO: FAULTS?
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer done()
|
|
if len(skipped) > 0 {
|
|
return nil, xerrors.Errorf("pubSectorToPriv skipped sectors: %+v", skipped)
|
|
}
|
|
|
|
return ffi.GenerateWinningPoSt(minerID, privsectors, randomness)
|
|
}
|
|
|
|
func (sb *Sealer) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, postProofType abi.RegisteredPoStProof, sectorInfo []proof.ExtendedSectorInfo, randomness abi.PoStRandomness) ([]proof.PoStProof, []abi.SectorID, error) {
|
|
randomness[31] &= 0x3f
|
|
privsectors, skipped, done, err := sb.pubExtendedSectorToPriv(ctx, minerID, sectorInfo, nil, postProofType)
|
|
if err != nil {
|
|
return nil, nil, xerrors.Errorf("gathering sector info: %w", err)
|
|
}
|
|
|
|
defer done()
|
|
|
|
if len(skipped) > 0 {
|
|
return nil, skipped, xerrors.Errorf("pubSectorToPriv skipped some sectors")
|
|
}
|
|
|
|
proof, faulty, err := ffi.GenerateWindowPoSt(minerID, privsectors, randomness)
|
|
|
|
var faultyIDs []abi.SectorID
|
|
for _, f := range faulty {
|
|
faultyIDs = append(faultyIDs, abi.SectorID{
|
|
Miner: minerID,
|
|
Number: f,
|
|
})
|
|
}
|
|
return proof, faultyIDs, err
|
|
}
|
|
|
|
func (sb *Sealer) pubExtendedSectorToPriv(ctx context.Context, mid abi.ActorID, sectorInfo []proof.ExtendedSectorInfo, faults []abi.SectorNumber, postProofType abi.RegisteredPoStProof) (ffi.SortedPrivateSectorInfo, []abi.SectorID, func(), error) {
|
|
fmap := map[abi.SectorNumber]struct{}{}
|
|
for _, fault := range faults {
|
|
fmap[fault] = struct{}{}
|
|
}
|
|
|
|
var doneFuncs []func()
|
|
done := func() {
|
|
for _, df := range doneFuncs {
|
|
df()
|
|
}
|
|
}
|
|
|
|
var skipped []abi.SectorID
|
|
var out []ffi.PrivateSectorInfo
|
|
for _, s := range sectorInfo {
|
|
if _, faulty := fmap[s.SectorNumber]; faulty {
|
|
continue
|
|
}
|
|
|
|
sid := storiface.SectorRef{
|
|
ID: abi.SectorID{Miner: mid, Number: s.SectorNumber},
|
|
ProofType: s.SealProof,
|
|
}
|
|
proveUpdate := s.SectorKey != nil
|
|
var cache string
|
|
var sealed string
|
|
if proveUpdate {
|
|
log.Debugf("Posting over updated sector for sector id: %d", s.SectorNumber)
|
|
paths, d, err := sb.sectors.AcquireSector(ctx, sid, storiface.FTUpdateCache|storiface.FTUpdate, 0, storiface.PathStorage)
|
|
if err != nil {
|
|
log.Warnw("failed to acquire FTUpdateCache and FTUpdate of sector, skipping", "sector", sid.ID, "error", err)
|
|
skipped = append(skipped, sid.ID)
|
|
continue
|
|
}
|
|
doneFuncs = append(doneFuncs, d)
|
|
cache = paths.UpdateCache
|
|
sealed = paths.Update
|
|
} else {
|
|
log.Debugf("Posting over sector key sector for sector id: %d", s.SectorNumber)
|
|
paths, d, err := sb.sectors.AcquireSector(ctx, sid, storiface.FTCache|storiface.FTSealed, 0, storiface.PathStorage)
|
|
if err != nil {
|
|
log.Warnw("failed to acquire FTCache and FTSealed of sector, skipping", "sector", sid.ID, "error", err)
|
|
skipped = append(skipped, sid.ID)
|
|
continue
|
|
}
|
|
doneFuncs = append(doneFuncs, d)
|
|
cache = paths.Cache
|
|
sealed = paths.Sealed
|
|
}
|
|
|
|
ffiInfo := proof.SectorInfo{
|
|
SealProof: s.SealProof,
|
|
SectorNumber: s.SectorNumber,
|
|
SealedCID: s.SealedCID,
|
|
}
|
|
out = append(out, ffi.PrivateSectorInfo{
|
|
CacheDirPath: cache,
|
|
PoStProofType: postProofType,
|
|
SealedSectorPath: sealed,
|
|
SectorInfo: ffiInfo,
|
|
})
|
|
}
|
|
|
|
return ffi.NewSortedPrivateSectorInfo(out...), skipped, done, nil
|
|
}
|
|
|
|
var _ storiface.Verifier = ProofVerifier
|
|
|
|
type proofVerifier struct{}
|
|
|
|
var ProofVerifier = proofVerifier{}
|
|
|
|
func (proofVerifier) VerifySeal(info proof.SealVerifyInfo) (bool, error) {
|
|
return ffi.VerifySeal(info)
|
|
}
|
|
|
|
func (proofVerifier) VerifyAggregateSeals(aggregate proof.AggregateSealVerifyProofAndInfos) (bool, error) {
|
|
return ffi.VerifyAggregateSeals(aggregate)
|
|
}
|
|
|
|
func (proofVerifier) VerifyReplicaUpdate(update proof.ReplicaUpdateInfo) (bool, error) {
|
|
return ffi.SectorUpdate.VerifyUpdateProof(update)
|
|
}
|
|
|
|
func (proofVerifier) VerifyWinningPoSt(ctx context.Context, info proof.WinningPoStVerifyInfo) (bool, error) {
|
|
info.Randomness[31] &= 0x3f
|
|
_, span := trace.StartSpan(ctx, "VerifyWinningPoSt")
|
|
defer span.End()
|
|
|
|
return ffi.VerifyWinningPoSt(info)
|
|
}
|
|
|
|
func (proofVerifier) VerifyWindowPoSt(ctx context.Context, info proof.WindowPoStVerifyInfo) (bool, error) {
|
|
info.Randomness[31] &= 0x3f
|
|
_, span := trace.StartSpan(ctx, "VerifyWindowPoSt")
|
|
defer span.End()
|
|
|
|
return ffi.VerifyWindowPoSt(info)
|
|
}
|
|
|
|
func (proofVerifier) GenerateWinningPoStSectorChallenge(ctx context.Context, proofType abi.RegisteredPoStProof, minerID abi.ActorID, randomness abi.PoStRandomness, eligibleSectorCount uint64) ([]uint64, error) {
|
|
randomness[31] &= 0x3f
|
|
return ffi.GenerateWinningPoStSectorChallenge(proofType, minerID, randomness, eligibleSectorCount)
|
|
}
|