mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2024-12-22 03:30:35 +00:00
07a0a95ee7
* use real blob verifier in forkchoice spectest * wip * Use real blob sidecar for test * Set file db correctly * correctly handle blob cases where valid=false * work-around spectest's weird Fork in genesis state * gaz * revert T-money's log level change * rm whitespace * unskip minimal test * Preston's feedback --------- Co-authored-by: Kasey Kirkham <kasey@users.noreply.github.com> Co-authored-by: terence tsao <terence@prysmaticlabs.com>
112 lines
2.8 KiB
Go
112 lines
2.8 KiB
Go
package verification
|
|
|
|
// Requirement represents a validation check that needs to pass in order for a Verified form a consensus type to be issued.
|
|
type Requirement int
|
|
|
|
var unknownRequirementName = "unknown"
|
|
|
|
func (r Requirement) String() string {
|
|
switch r {
|
|
case RequireBlobIndexInBounds:
|
|
return "RequireBlobIndexInBounds"
|
|
case RequireNotFromFutureSlot:
|
|
return "RequireNotFromFutureSlot"
|
|
case RequireSlotAboveFinalized:
|
|
return "RequireSlotAboveFinalized"
|
|
case RequireValidProposerSignature:
|
|
return "RequireValidProposerSignature"
|
|
case RequireSidecarParentSeen:
|
|
return "RequireSidecarParentSeen"
|
|
case RequireSidecarParentValid:
|
|
return "RequireSidecarParentValid"
|
|
case RequireSidecarParentSlotLower:
|
|
return "RequireSidecarParentSlotLower"
|
|
case RequireSidecarDescendsFromFinalized:
|
|
return "RequireSidecarDescendsFromFinalized"
|
|
case RequireSidecarInclusionProven:
|
|
return "RequireSidecarInclusionProven"
|
|
case RequireSidecarKzgProofVerified:
|
|
return "RequireSidecarKzgProofVerified"
|
|
case RequireSidecarProposerExpected:
|
|
return "RequireSidecarProposerExpected"
|
|
default:
|
|
return unknownRequirementName
|
|
}
|
|
}
|
|
|
|
type requirementList []Requirement
|
|
|
|
func (rl requirementList) excluding(minus ...Requirement) []Requirement {
|
|
rm := make(map[Requirement]struct{})
|
|
nl := make([]Requirement, 0, len(rl)-len(minus))
|
|
for i := range minus {
|
|
rm[minus[i]] = struct{}{}
|
|
}
|
|
for i := range rl {
|
|
if _, excluded := rm[rl[i]]; excluded {
|
|
continue
|
|
}
|
|
nl = append(nl, rl[i])
|
|
}
|
|
return nl
|
|
}
|
|
|
|
// results collects positive verification results.
|
|
// This bitmap can be used to test which verifications have been successfully completed in order to
|
|
// decide whether it is safe to issue a "Verified" type variant.
|
|
type results struct {
|
|
done map[Requirement]error
|
|
reqs []Requirement
|
|
}
|
|
|
|
func newResults(reqs ...Requirement) *results {
|
|
return &results{done: make(map[Requirement]error, len(reqs)), reqs: reqs}
|
|
}
|
|
|
|
func (r *results) record(req Requirement, err error) {
|
|
r.done[req] = err
|
|
}
|
|
|
|
// allSatisfied returns true if there is a nil error result for every Requirement.
|
|
func (r *results) allSatisfied() bool {
|
|
if len(r.done) != len(r.reqs) {
|
|
return false
|
|
}
|
|
for i := range r.reqs {
|
|
err, ok := r.done[r.reqs[i]]
|
|
if !ok || err != nil {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func (r *results) executed(req Requirement) bool {
|
|
_, ok := r.done[req]
|
|
return ok
|
|
}
|
|
|
|
func (r *results) result(req Requirement) error {
|
|
return r.done[req]
|
|
}
|
|
|
|
func (r *results) errors(err error) error {
|
|
return newVerificationMultiError(r, err)
|
|
}
|
|
|
|
func (r *results) failures() map[Requirement]error {
|
|
fail := make(map[Requirement]error, len(r.done))
|
|
for i := range r.reqs {
|
|
req := r.reqs[i]
|
|
err, ok := r.done[req]
|
|
if !ok {
|
|
fail[req] = ErrMissingVerification
|
|
continue
|
|
}
|
|
if err != nil {
|
|
fail[req] = err
|
|
}
|
|
}
|
|
return fail
|
|
}
|