From d21c44e266e3547e3b644bbd6fa147df0a57f2ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 30 Nov 2021 01:33:05 +0100 Subject: [PATCH] ffiwrapper: Validate PC2 by calling C1 with random seeds --- .../sector-storage/ffiwrapper/sealer_cgo.go | 59 ++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/extern/sector-storage/ffiwrapper/sealer_cgo.go b/extern/sector-storage/ffiwrapper/sealer_cgo.go index 59770ec9a..61aceadaf 100644 --- a/extern/sector-storage/ffiwrapper/sealer_cgo.go +++ b/extern/sector-storage/ffiwrapper/sealer_cgo.go @@ -7,6 +7,9 @@ import ( "bufio" "bytes" "context" + "crypto/rand" + "encoding/base64" + "encoding/json" "io" "math/bits" "os" @@ -530,9 +533,19 @@ func (sb *Sealer) SealPreCommit1(ctx context.Context, sector storage.SectorRef, if err != nil { return nil, xerrors.Errorf("presealing sector %d (%s): %w", sector.ID.Number, paths.Unsealed, err) } - return p1o, nil + + p1odec := map[string]interface{}{} + if err := json.Unmarshal(p1o, &p1odec); err != nil { + return nil, xerrors.Errorf("unmarshaling pc1 output: %w", err) + } + + p1odec["_lotus_SealRandomness"] = ticket + + return json.Marshal(&p1odec) } +var PC2CheckRounds = 3 + func (sb *Sealer) SealPreCommit2(ctx context.Context, sector storage.SectorRef, phase1Out storage.PreCommit1Out) (storage.SectorCids, error) { paths, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTSealed|storiface.FTCache, 0, storiface.PathSealing) if err != nil { @@ -545,6 +558,50 @@ func (sb *Sealer) SealPreCommit2(ctx context.Context, sector storage.SectorRef, return storage.SectorCids{}, xerrors.Errorf("presealing sector %d (%s): %w", sector.ID.Number, paths.Unsealed, err) } + ssize, err := sector.ProofType.SectorSize() + if err != nil { + return storage.SectorCids{}, xerrors.Errorf("get ssize: %w", err) + } + + p1odec := map[string]interface{}{} + if err := json.Unmarshal(phase1Out, &p1odec); err != nil { + return storage.SectorCids{}, xerrors.Errorf("unmarshaling pc1 output: %w", err) + } + + var ticket abi.SealRandomness + ti, found := p1odec["_lotus_SealRandomness"] + + if found { + ticket, err = base64.StdEncoding.DecodeString(ti.(string)) + if err != nil { + return storage.SectorCids{}, xerrors.Errorf("decoding ticket: %w", err) + } + + for i := 0; i < PC2CheckRounds; i++ { + var sd [32]byte + _, _ = rand.Read(sd[:]) + + _, err := ffi.SealCommitPhase1( + sector.ProofType, + sealedCID, + unsealedCID, + paths.Cache, + paths.Sealed, + sector.ID.Number, + sector.ID.Miner, + ticket, + sd[:], + []abi.PieceInfo{{Size: abi.PaddedPieceSize(ssize), PieceCID: unsealedCID}}, + ) + if err != nil { + log.Warn("checking PreCommit failed: ", err) + log.Warnf("num:%d tkt:%v seed:%v sealedCID:%v, unsealedCID:%v", sector.ID.Number, ticket, sd[:], sealedCID, unsealedCID) + + return storage.SectorCids{}, xerrors.Errorf("checking PreCommit failed: %w", err) + } + } + } + return storage.SectorCids{ Unsealed: unsealedCID, Sealed: sealedCID,