ffiwrapper: Validate PC2 by calling C1 with random seeds
This commit is contained in:
parent
01215b7d2c
commit
d21c44e266
59
extern/sector-storage/ffiwrapper/sealer_cgo.go
vendored
59
extern/sector-storage/ffiwrapper/sealer_cgo.go
vendored
@ -7,6 +7,9 @@ import (
|
|||||||
"bufio"
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
|
"crypto/rand"
|
||||||
|
"encoding/base64"
|
||||||
|
"encoding/json"
|
||||||
"io"
|
"io"
|
||||||
"math/bits"
|
"math/bits"
|
||||||
"os"
|
"os"
|
||||||
@ -530,9 +533,19 @@ func (sb *Sealer) SealPreCommit1(ctx context.Context, sector storage.SectorRef,
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, xerrors.Errorf("presealing sector %d (%s): %w", sector.ID.Number, paths.Unsealed, err)
|
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) {
|
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)
|
paths, done, err := sb.sectors.AcquireSector(ctx, sector, storiface.FTSealed|storiface.FTCache, 0, storiface.PathSealing)
|
||||||
if err != nil {
|
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)
|
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{
|
return storage.SectorCids{
|
||||||
Unsealed: unsealedCID,
|
Unsealed: unsealedCID,
|
||||||
Sealed: sealedCID,
|
Sealed: sealedCID,
|
||||||
|
Loading…
Reference in New Issue
Block a user