lotus/storage/sealer/ffiwrapper/verifier_cgo.go

169 lines
5.4 KiB
Go
Raw Normal View History

//go:build cgo
// +build cgo
2020-03-26 19:34:38 +00:00
package ffiwrapper
import (
"context"
2020-08-16 10:40:35 +00:00
2020-09-30 17:32:19 +00:00
"go.opencensus.io/trace"
2020-03-26 19:34:38 +00:00
"golang.org/x/xerrors"
ffi "github.com/filecoin-project/filecoin-ffi"
2020-09-30 17:32:19 +00:00
"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"
2020-03-26 19:34:38 +00:00
)
func (sb *Sealer) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof.ExtendedSectorInfo, randomness abi.PoStRandomness) ([]proof.PoStProof, error) {
randomness[31] &= 0x3f
privsectors, skipped, done, err := sb.pubExtendedSectorToPriv(ctx, minerID, sectorInfo, nil, abi.RegisteredSealProof.RegisteredWinningPoStProof) // TODO: FAULTS?
2020-03-26 19:34:38 +00:00
if err != nil {
return nil, err
}
defer done()
2020-06-08 17:22:11 +00:00
if len(skipped) > 0 {
return nil, xerrors.Errorf("pubSectorToPriv skipped sectors: %+v", skipped)
}
2020-03-26 19:34:38 +00:00
2020-04-10 18:41:59 +00:00
return ffi.GenerateWinningPoSt(minerID, privsectors, randomness)
}
2020-03-26 19:34:38 +00:00
func (sb *Sealer) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []proof.ExtendedSectorInfo, randomness abi.PoStRandomness) ([]proof.PoStProof, []abi.SectorID, error) {
randomness[31] &= 0x3f
privsectors, skipped, done, err := sb.pubExtendedSectorToPriv(ctx, minerID, sectorInfo, nil, abi.RegisteredSealProof.RegisteredWindowPoStProof)
2020-03-26 19:34:38 +00:00
if err != nil {
2020-06-08 17:22:11 +00:00
return nil, nil, xerrors.Errorf("gathering sector info: %w", err)
2020-03-26 19:34:38 +00:00
}
defer done()
2020-03-26 19:34:38 +00:00
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
2020-03-26 19:34:38 +00:00
}
func (sb *Sealer) pubExtendedSectorToPriv(ctx context.Context, mid abi.ActorID, sectorInfo []proof.ExtendedSectorInfo, faults []abi.SectorNumber, rpt func(abi.RegisteredSealProof) (abi.RegisteredPoStProof, error)) (ffi.SortedPrivateSectorInfo, []abi.SectorID, func(), error) {
2020-03-26 19:34:38 +00:00
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
2020-03-26 19:34:38 +00:00
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
2020-03-26 19:34:38 +00:00
}
2020-06-15 12:32:17 +00:00
postProofType, err := rpt(s.SealProof)
2020-03-26 19:34:38 +00:00
if err != nil {
done()
return ffi.SortedPrivateSectorInfo{}, nil, nil, xerrors.Errorf("acquiring registered PoSt proof from sector info %+v: %w", s, err)
2020-03-26 19:34:38 +00:00
}
2022-04-20 21:34:28 +00:00
ffiInfo := proof.SectorInfo{
SealProof: s.SealProof,
SectorNumber: s.SectorNumber,
SealedCID: s.SealedCID,
}
2020-03-26 19:34:38 +00:00
out = append(out, ffi.PrivateSectorInfo{
CacheDirPath: cache,
2020-03-26 19:34:38 +00:00
PoStProofType: postProofType,
SealedSectorPath: sealed,
SectorInfo: ffiInfo,
2020-03-26 19:34:38 +00:00
})
}
return ffi.NewSortedPrivateSectorInfo(out...), skipped, done, nil
2020-03-26 19:34:38 +00:00
}
var _ Verifier = ProofVerifier
type proofVerifier struct{}
var ProofVerifier = proofVerifier{}
func (proofVerifier) VerifySeal(info proof.SealVerifyInfo) (bool, error) {
2020-03-26 19:34:38 +00:00
return ffi.VerifySeal(info)
}
func (proofVerifier) VerifyAggregateSeals(aggregate proof.AggregateSealVerifyProofAndInfos) (bool, error) {
2021-03-10 15:16:44 +00:00
return ffi.VerifyAggregateSeals(aggregate)
}
func (proofVerifier) VerifyReplicaUpdate(update proof.ReplicaUpdateInfo) (bool, error) {
2021-11-17 17:41:42 +00:00
return ffi.SectorUpdate.VerifyUpdateProof(update)
2021-11-04 15:59:29 +00:00
}
func (proofVerifier) VerifyWinningPoSt(ctx context.Context, info proof.WinningPoStVerifyInfo) (bool, error) {
info.Randomness[31] &= 0x3f
2020-04-10 18:41:59 +00:00
_, span := trace.StartSpan(ctx, "VerifyWinningPoSt")
defer span.End()
2020-03-26 19:34:38 +00:00
2020-04-10 18:41:59 +00:00
return ffi.VerifyWinningPoSt(info)
2020-03-26 19:34:38 +00:00
}
func (proofVerifier) VerifyWindowPoSt(ctx context.Context, info proof.WindowPoStVerifyInfo) (bool, error) {
info.Randomness[31] &= 0x3f
2020-04-10 18:41:59 +00:00
_, span := trace.StartSpan(ctx, "VerifyWindowPoSt")
2020-03-26 19:34:38 +00:00
defer span.End()
2020-04-10 18:41:59 +00:00
return ffi.VerifyWindowPoSt(info)
2020-03-26 19:34:38 +00:00
}
2020-06-15 12:32:17 +00:00
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)
}