Sector Poster
-
State
wip
-
Theory Audit
wip
-
Edit this section
-
section-systems.filecoin_mining.storage_proving.poster
-
State
wip
-
Theory Audit
wip
- Edit this section
-
section-systems.filecoin_mining.storage_proving.poster
PoSt Generator object
-
State
wip
-
Theory Audit
wip
-
Edit this section
-
section-systems.filecoin_mining.storage_proving.poster.post-generator-object
-
State
wip
-
Theory Audit
wip
- Edit this section
-
section-systems.filecoin_mining.storage_proving.poster.post-generator-object
import abi "github.com/filecoin-project/specs-actors/actors/abi"
import sector_index "github.com/filecoin-project/specs/systems/filecoin_mining/sector_index"
type UInt64 UInt
// TODO: move this to somewhere the blockchain can import
// candidates:
// - filproofs - may have to learn about Sectors (and if we move Seal stuff, Deals)
// - "blockchain/builtins" or something like that - a component in the blockchain that handles storage verification
type PoStSubmission struct {
PostProof abi.PoStProof
ChainEpoch abi.ChainEpoch
}
type PoStGenerator struct {
SectorStore sector_index.SectorStore
GeneratePoStCandidates(
challengeSeed abi.PoStRandomness
candidateCount UInt
sectors [abi.SectorID]
) [abi.PoStCandidate]
CreateElectionPoStProof(
randomness abi.PoStRandomness
witness [abi.PoStCandidate]
) [abi.PoStProof]
CreateSurprisePoStProof(
randomness abi.PoStRandomness
witness [abi.PoStCandidate]
) [abi.PoStProof]
// FIXME: Verification shouldn't require a PoStGenerator. Move this.
VerifyPoStProof(
Proof abi.PoStProof
challengeSeed abi.PoStRandomness
) bool
}
package poster
import (
abi "github.com/filecoin-project/specs-actors/actors/abi"
filproofs "github.com/filecoin-project/specs/libraries/filcrypto/filproofs"
util "github.com/filecoin-project/specs/util"
)
type Serialization = util.Serialization
// See "Proof-of-Spacetime Parameters" Section
// TODO: Unify with orient model.
const POST_CHALLENGE_DEADLINE = uint(480)
func (pg *PoStGenerator_I) GeneratePoStCandidates(challengeSeed abi.PoStRandomness, candidateCount int, sectors []abi.SectorID) []abi.PoStCandidate {
// Question: Should we pass metadata into FilProofs so it can interact with SectorStore directly?
// Like this:
// PoStReponse := SectorStorageSubsystem.GeneratePoSt(sectorSize, challenge, faults, sectorsMetatada);
// Question: Or should we resolve + manifest trees here and pass them in?
// Like this:
// trees := sectorsMetadata.map(func(md) { SectorStorage.GetMerkleTree(md.MerkleTreePath) });
// Done this way, we redundantly pass the tree paths in the metadata. At first thought, the other way
// seems cleaner.
// PoStReponse := SectorStorageSubsystem.GeneratePoSt(sectorSize, challenge, faults, sectorsMetadata, trees);
// For now, dodge this by passing the whole SectorStore. Once we decide how we want to represent this, we can narrow the call.
return filproofs.GenerateElectionPoStCandidates(challengeSeed, sectors, candidateCount, pg.SectorStore())
}
func (pg *PoStGenerator_I) CreateElectionPoStProof(randomness abi.PoStRandomness, postCandidates []abi.PoStCandidate) []abi.PoStProof {
var privateProofs []abi.PrivatePoStCandidateProof
for _, candidate := range postCandidates {
privateProofs = append(privateProofs, candidate.PrivateProof)
}
return filproofs.CreateElectionPoStProof(privateProofs, randomness)
}
func (pg *PoStGenerator_I) CreateSurprisePoStProof(randomness abi.PoStRandomness, postCandidates []abi.PoStCandidate) []abi.PoStProof {
var privateProofs []abi.PrivatePoStCandidateProof
for _, candidate := range postCandidates {
privateProofs = append(privateProofs, candidate.PrivateProof)
}
return filproofs.CreateSurprisePoStProof(privateProofs, randomness)
}