Add randomness

License: MIT
Signed-off-by: Jakub Sztandera <kubuxu@protonmail.ch>
This commit is contained in:
Jakub Sztandera 2019-09-19 15:32:00 +02:00
parent 86fd132cf7
commit 54e076b6f9
4 changed files with 33 additions and 12 deletions

View File

@ -14,4 +14,7 @@ const DealVoucherSkewLimit = 10
const ForkLengthThreshold = 20 const ForkLengthThreshold = 20
const RandomnessLookback = 20 const RandomnessLookback = 20
const ProvingPeriodDuration = 2 * 60 // an hour, for now
const PoSTChallangeTime = 1 * 60
// TODO: Move other important consts here // TODO: Move other important consts here

View File

@ -2,7 +2,9 @@ package actors
import ( import (
"context" "context"
"fmt"
"github.com/filecoin-project/go-lotus/build"
"github.com/filecoin-project/go-lotus/chain/actors/aerrors" "github.com/filecoin-project/go-lotus/chain/actors/aerrors"
"github.com/filecoin-project/go-lotus/chain/address" "github.com/filecoin-project/go-lotus/chain/address"
"github.com/filecoin-project/go-lotus/chain/types" "github.com/filecoin-project/go-lotus/chain/types"
@ -16,9 +18,6 @@ import (
"golang.org/x/xerrors" "golang.org/x/xerrors"
) )
var ProvingPeriodDuration = uint64(2 * 60) // an hour, for now
var PoSTChallangeTime = uint64(1 * 60)
const POST_SECTORS_COUNT = 8192 const POST_SECTORS_COUNT = 8192
type StorageMinerActor struct{} type StorageMinerActor struct{}
@ -272,7 +271,7 @@ func (sma StorageMinerActor) CommitSector(act *types.Actor, vmctx types.VMContex
if self.ProvingSetSize == 0 { if self.ProvingSetSize == 0 {
self.ProvingSet = self.Sectors self.ProvingSet = self.Sectors
self.ProvingSetSize = self.SectorSetSize self.ProvingSetSize = self.SectorSetSize
self.ProvingPeriodEnd = vmctx.BlockHeight() + ProvingPeriodDuration self.ProvingPeriodEnd = vmctx.BlockHeight() + build.ProvingPeriodDuration
} }
nstate, err := vmctx.Storage().Put(self) nstate, err := vmctx.Storage().Put(self)
@ -310,7 +309,7 @@ func (sma StorageMinerActor) SubmitPoSt(act *types.Actor, vmctx types.VMContext,
} }
feesRequired := types.NewInt(0) feesRequired := types.NewInt(0)
nextProvingPeriodEnd := self.ProvingPeriodEnd + ProvingPeriodDuration nextProvingPeriodEnd := self.ProvingPeriodEnd + build.ProvingPeriodDuration
if vmctx.BlockHeight() > nextProvingPeriodEnd { if vmctx.BlockHeight() > nextProvingPeriodEnd {
return nil, aerrors.New(1, "PoSt submited too late") return nil, aerrors.New(1, "PoSt submited too late")
} }
@ -338,11 +337,22 @@ func (sma StorageMinerActor) SubmitPoSt(act *types.Actor, vmctx types.VMContext,
} }
var seed [sectorbuilder.CommLen]byte var seed [sectorbuilder.CommLen]byte
//TODO {
if !lateSubmission { var rand []byte
//GetChainRandom(self.ProvingPeriodEnd-PoSTChallangeTime) var err ActorError
} else { if !lateSubmission {
//GetChainRandom(nextProvingPeriodEnd-PoSTChallangeTime) rand, err = vmctx.GetRandomness(self.ProvingPeriodEnd - build.PoSTChallangeTime)
} else {
rand, err = vmctx.GetRandomness(nextProvingPeriodEnd - build.PoSTChallangeTime)
}
if err != nil {
return nil, aerrors.Wrap(err, "could not get randomness for PoST")
}
if len(rand) < len(seed) {
return nil, aerrors.Escalate(fmt.Errorf("randomness too small (%d < %d)",
len(rand), len(seed)), "improper randomness")
}
copy(seed[:], rand)
} }
pss, lerr := amt.LoadAMT(types.WrapStorage(vmctx.Storage()), self.ProvingSet) pss, lerr := amt.LoadAMT(types.WrapStorage(vmctx.Storage()), self.ProvingSet)
@ -399,8 +409,6 @@ func (sma StorageMinerActor) SubmitPoSt(act *types.Actor, vmctx types.VMContext,
return nil, aerrors.Escalate(err, "failed to delete sectors in done set") return nil, aerrors.Escalate(err, "failed to delete sectors in done set")
} }
_ = ss
//TODO: Remove done sectors from SectorSet
self.ProvingSet, lerr = ss.Flush() self.ProvingSet, lerr = ss.Flush()
if lerr != nil { if lerr != nil {
return nil, aerrors.Escalate(lerr, "could not flish AMT") return nil, aerrors.Escalate(lerr, "could not flish AMT")

View File

@ -36,6 +36,7 @@ type VMContext interface {
StateTree() (StateTree, aerrors.ActorError) StateTree() (StateTree, aerrors.ActorError)
VerifySignature(sig *Signature, from address.Address, data []byte) aerrors.ActorError VerifySignature(sig *Signature, from address.Address, data []byte) aerrors.ActorError
ChargeGas(uint64) aerrors.ActorError ChargeGas(uint64) aerrors.ActorError
GetRandomness(height uint64) ([]byte, aerrors.ActorError)
} }
type storageWrapper struct { type storageWrapper struct {

View File

@ -66,6 +66,15 @@ func (vmc *VMContext) Message() *types.Message {
return vmc.msg return vmc.msg
} }
func (vmc *VMContext) GetRandomness(height uint64) ([]byte, aerrors.ActorError) {
relHeight := int(vmc.BlockHeight) - int(height)
res, err := vmc.vm.cs.GetRandomness(vmc.ctx, vmc.vm.cs.GetHeaviestTipSet(), nil, relHeight)
if err != nil {
return nil, aerrors.Escalate(err, "could not get randomness")
}
return res, nil
}
// Storage interface // Storage interface
func (vmc *VMContext) Put(i cbg.CBORMarshaler) (cid.Cid, aerrors.ActorError) { func (vmc *VMContext) Put(i cbg.CBORMarshaler) (cid.Cid, aerrors.ActorError) {