Handle faults in ss and pss correctly
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
This commit is contained in:
parent
dbc729d049
commit
a63c34a902
@ -477,9 +477,11 @@ func (sma StorageMinerActor) SubmitFallbackPoSt(act *types.Actor, vmctx types.VM
|
|||||||
return nil, aerrors.Absorb(err, 5, "RLE+ invalid")
|
return nil, aerrors.Absorb(err, 5, "RLE+ invalid")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
activeFaults := uint64(0)
|
||||||
var sectorInfos []ffi.PublicSectorInfo
|
var sectorInfos []ffi.PublicSectorInfo
|
||||||
if err := pss.ForEach(func(id uint64, v *cbg.Deferred) error {
|
if err := pss.ForEach(func(id uint64, v *cbg.Deferred) error {
|
||||||
if faults[id] {
|
if faults[id] {
|
||||||
|
activeFaults++
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -517,7 +519,7 @@ func (sma StorageMinerActor) SubmitFallbackPoSt(act *types.Actor, vmctx types.VM
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ok, lerr := sectorbuilder.VerifyFallbackPost(vmctx.Context(), mi.SectorSize,
|
if ok, lerr := sectorbuilder.VerifyFallbackPost(vmctx.Context(), mi.SectorSize,
|
||||||
sectorbuilder.NewSortedPublicSectorInfo(sectorInfos), seed[:], params.Proof, candidates, proverID, len(faults)); !ok || lerr != nil {
|
sectorbuilder.NewSortedPublicSectorInfo(sectorInfos), seed[:], params.Proof, candidates, proverID, activeFaults); !ok || lerr != nil {
|
||||||
if lerr != nil {
|
if lerr != nil {
|
||||||
// TODO: study PoST errors
|
// TODO: study PoST errors
|
||||||
return nil, aerrors.Absorb(lerr, 4, "PoST error")
|
return nil, aerrors.Absorb(lerr, 4, "PoST error")
|
||||||
@ -528,7 +530,7 @@ func (sma StorageMinerActor) SubmitFallbackPoSt(act *types.Actor, vmctx types.VM
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Post submission is successful!
|
// Post submission is successful!
|
||||||
if err := onSuccessfulPoSt(self, vmctx); err != nil {
|
if err := onSuccessfulPoSt(self, vmctx, activeFaults); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -839,6 +841,20 @@ func (sma StorageMinerActor) DeclareFaults(act *types.Actor, vmctx types.VMConte
|
|||||||
return nil, aerrors.Absorb(err, 1, "failed to merge bitfields")
|
return nil, aerrors.Absorb(err, 1, "failed to merge bitfields")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ss, nerr := amt.LoadAMT(types.WrapStorage(vmctx.Storage()), self.Sectors)
|
||||||
|
if nerr != nil {
|
||||||
|
return nil, aerrors.HandleExternalError(nerr, "failed to load sector set")
|
||||||
|
}
|
||||||
|
|
||||||
|
cf, nerr := nfaults.Count()
|
||||||
|
if nerr != nil {
|
||||||
|
return nil, aerrors.Absorb(nerr, 2, "could not decode RLE+")
|
||||||
|
}
|
||||||
|
|
||||||
|
if cf > ss.Count {
|
||||||
|
return nil, aerrors.New(3, "too many declared faults")
|
||||||
|
}
|
||||||
|
|
||||||
self.FaultSet = nfaults
|
self.FaultSet = nfaults
|
||||||
|
|
||||||
self.LastFaultSubmission = vmctx.BlockHeight()
|
self.LastFaultSubmission = vmctx.BlockHeight()
|
||||||
@ -914,7 +930,32 @@ func (sma StorageMinerActor) SubmitElectionPoSt(act *types.Actor, vmctx types.VM
|
|||||||
return nil, aerrors.New(1, "slashed miners can't perform election PoSt")
|
return nil, aerrors.New(1, "slashed miners can't perform election PoSt")
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := onSuccessfulPoSt(self, vmctx); err != nil {
|
pss, nerr := amt.LoadAMT(types.WrapStorage(vmctx.Storage()), self.ProvingSet)
|
||||||
|
if nerr != nil {
|
||||||
|
return nil, aerrors.HandleExternalError(nerr, "failed to load proving set")
|
||||||
|
}
|
||||||
|
|
||||||
|
ss, nerr := amt.LoadAMT(types.WrapStorage(vmctx.Storage()), self.Sectors)
|
||||||
|
if nerr != nil {
|
||||||
|
return nil, aerrors.HandleExternalError(nerr, "failed to load proving set")
|
||||||
|
}
|
||||||
|
|
||||||
|
faults, nerr := self.FaultSet.AllMap(ss.Count)
|
||||||
|
if nerr != nil {
|
||||||
|
return nil, aerrors.Absorb(nerr, 1, "invalid bitfield (fatal?)")
|
||||||
|
}
|
||||||
|
|
||||||
|
activeFaults := uint64(0)
|
||||||
|
if err := pss.ForEach(func(id uint64, v *cbg.Deferred) error {
|
||||||
|
if faults[id] {
|
||||||
|
activeFaults++
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}); err != nil {
|
||||||
|
return nil, aerrors.Absorb(err, 2, "could not decode sectorset")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := onSuccessfulPoSt(self, vmctx, activeFaults); err != nil { // TODO
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -929,7 +970,7 @@ func (sma StorageMinerActor) SubmitElectionPoSt(act *types.Actor, vmctx types.VM
|
|||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func onSuccessfulPoSt(self *StorageMinerActorState, vmctx types.VMContext) aerrors.ActorError {
|
func onSuccessfulPoSt(self *StorageMinerActorState, vmctx types.VMContext, activeFaults uint64) aerrors.ActorError {
|
||||||
// TODO: some sector upkeep stuff that is very haphazard and unclear in the spec
|
// TODO: some sector upkeep stuff that is very haphazard and unclear in the spec
|
||||||
|
|
||||||
var mi MinerInfo
|
var mi MinerInfo
|
||||||
@ -944,7 +985,7 @@ func onSuccessfulPoSt(self *StorageMinerActorState, vmctx types.VMContext) aerro
|
|||||||
|
|
||||||
ss, nerr := amt.LoadAMT(types.WrapStorage(vmctx.Storage()), self.Sectors)
|
ss, nerr := amt.LoadAMT(types.WrapStorage(vmctx.Storage()), self.Sectors)
|
||||||
if nerr != nil {
|
if nerr != nil {
|
||||||
return aerrors.HandleExternalError(nerr, "failed to load proving set")
|
return aerrors.HandleExternalError(nerr, "failed to load sector set")
|
||||||
}
|
}
|
||||||
|
|
||||||
faults, nerr := self.FaultSet.All(ss.Count)
|
faults, nerr := self.FaultSet.All(ss.Count)
|
||||||
@ -955,7 +996,7 @@ func onSuccessfulPoSt(self *StorageMinerActorState, vmctx types.VMContext) aerro
|
|||||||
self.FaultSet = types.NewBitField()
|
self.FaultSet = types.NewBitField()
|
||||||
|
|
||||||
oldPower := self.Power
|
oldPower := self.Power
|
||||||
newPower := types.BigMul(types.NewInt(pss.Count-uint64(len(faults))), types.NewInt(mi.SectorSize))
|
newPower := types.BigMul(types.NewInt(pss.Count-activeFaults), types.NewInt(mi.SectorSize))
|
||||||
|
|
||||||
// If below the minimum size requirement, miners have zero power
|
// If below the minimum size requirement, miners have zero power
|
||||||
if newPower.LessThan(types.NewInt(build.MinimumMinerPower)) {
|
if newPower.LessThan(types.NewInt(build.MinimumMinerPower)) {
|
||||||
|
@ -216,7 +216,7 @@ func IsTicketWinner(partialTicket []byte, ssizeI uint64, snum uint64, totpow Big
|
|||||||
return lhs.Cmp(rhs) < 0
|
return lhs.Cmp(rhs) < 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func ElectionPostChallengeCount(sectors uint64, faults int) uint64 {
|
func ElectionPostChallengeCount(sectors uint64, faults uint64) uint64 {
|
||||||
return sectorbuilder.ElectionPostChallengeCount(sectors, faults)
|
return sectorbuilder.ElectionPostChallengeCount(sectors, faults)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
2
go.mod
2
go.mod
@ -16,7 +16,7 @@ require (
|
|||||||
github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2
|
github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2
|
||||||
github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03
|
github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03
|
||||||
github.com/filecoin-project/go-paramfetch v0.0.0-20200102181131-b20d579f2878
|
github.com/filecoin-project/go-paramfetch v0.0.0-20200102181131-b20d579f2878
|
||||||
github.com/filecoin-project/go-sectorbuilder v0.0.0-20200107152336-0cbb2c483013
|
github.com/filecoin-project/go-sectorbuilder v0.0.0-20200107220006-3361d30ea5ab
|
||||||
github.com/filecoin-project/go-statestore v0.0.0-20200102200712-1f63c701c1e5
|
github.com/filecoin-project/go-statestore v0.0.0-20200102200712-1f63c701c1e5
|
||||||
github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1
|
github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1
|
||||||
github.com/go-ole/go-ole v1.2.4 // indirect
|
github.com/go-ole/go-ole v1.2.4 // indirect
|
||||||
|
2
go.sum
2
go.sum
@ -95,6 +95,8 @@ github.com/filecoin-project/go-paramfetch v0.0.0-20200102181131-b20d579f2878 h1:
|
|||||||
github.com/filecoin-project/go-paramfetch v0.0.0-20200102181131-b20d579f2878/go.mod h1:40kI2Gv16mwcRsHptI3OAV4nlOEU7wVDc4RgMylNFjU=
|
github.com/filecoin-project/go-paramfetch v0.0.0-20200102181131-b20d579f2878/go.mod h1:40kI2Gv16mwcRsHptI3OAV4nlOEU7wVDc4RgMylNFjU=
|
||||||
github.com/filecoin-project/go-sectorbuilder v0.0.0-20200107152336-0cbb2c483013 h1:OGpRq3HRxyrxZJtbNKCOsb5YTmc+RBLLwdAgwZfkRnY=
|
github.com/filecoin-project/go-sectorbuilder v0.0.0-20200107152336-0cbb2c483013 h1:OGpRq3HRxyrxZJtbNKCOsb5YTmc+RBLLwdAgwZfkRnY=
|
||||||
github.com/filecoin-project/go-sectorbuilder v0.0.0-20200107152336-0cbb2c483013/go.mod h1:3OZ4E3B2OuwhJjtxR4r7hPU9bCfB+A+hm4alLEsaeDc=
|
github.com/filecoin-project/go-sectorbuilder v0.0.0-20200107152336-0cbb2c483013/go.mod h1:3OZ4E3B2OuwhJjtxR4r7hPU9bCfB+A+hm4alLEsaeDc=
|
||||||
|
github.com/filecoin-project/go-sectorbuilder v0.0.0-20200107220006-3361d30ea5ab h1:bsrBNO1LwnhOLxPEXlSPal/WuY61mLJUCHYyD0NayHg=
|
||||||
|
github.com/filecoin-project/go-sectorbuilder v0.0.0-20200107220006-3361d30ea5ab/go.mod h1:3OZ4E3B2OuwhJjtxR4r7hPU9bCfB+A+hm4alLEsaeDc=
|
||||||
github.com/filecoin-project/go-statestore v0.0.0-20200102200712-1f63c701c1e5 h1:NZXq90YlfakSmB2/84dGr0AVmKYFA97+yyViBIgTFbk=
|
github.com/filecoin-project/go-statestore v0.0.0-20200102200712-1f63c701c1e5 h1:NZXq90YlfakSmB2/84dGr0AVmKYFA97+yyViBIgTFbk=
|
||||||
github.com/filecoin-project/go-statestore v0.0.0-20200102200712-1f63c701c1e5/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI=
|
github.com/filecoin-project/go-statestore v0.0.0-20200102200712-1f63c701c1e5/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI=
|
||||||
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
|
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
|
||||||
|
Loading…
Reference in New Issue
Block a user