prysm-pulse/slasher/detection/proposals/detector.go
Raul Jordan 546196a6fa
Other Package Godocs for Prysm (#5681)
* e2e docs
* slasher docs
* Merge branch 'other-package-godocs' of github.com:prysmaticlabs/prysm into other-package-godocs
* all validator package comments
* Merge branch 'master' into other-package-godocs
* completed all other packages
* Merge branch 'master' into other-package-godocs
* Merge refs/heads/master into other-package-godocs
2020-04-29 21:32:39 +00:00

52 lines
1.4 KiB
Go

// Package proposals defines an implementation of a double-propose
// detector in the slasher runtime.
package proposals
import (
"bytes"
"context"
ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
"github.com/prysmaticlabs/prysm/slasher/db"
status "github.com/prysmaticlabs/prysm/slasher/db/types"
"go.opencensus.io/trace"
)
// ProposeDetector defines a struct which can detect slashable
// block proposals.
type ProposeDetector struct {
slasherDB db.Database
}
// NewProposeDetector creates a new instance of a struct.
func NewProposeDetector(db db.Database) *ProposeDetector {
return &ProposeDetector{
slasherDB: db,
}
}
// DetectDoublePropose detects double proposals given a block by looking in the db.
func (dd *ProposeDetector) DetectDoublePropose(
ctx context.Context,
incomingBlk *ethpb.SignedBeaconBlockHeader,
) (*ethpb.ProposerSlashing, error) {
ctx, span := trace.StartSpan(ctx, "detector.DetectDoublePropose")
defer span.End()
bha, err := dd.slasherDB.BlockHeaders(ctx, incomingBlk.Header.Slot, incomingBlk.Header.ProposerIndex)
if err != nil {
return nil, err
}
for _, bh := range bha {
if bytes.Equal(bh.Signature, incomingBlk.Signature) {
continue
}
ps := &ethpb.ProposerSlashing{Header_1: incomingBlk, Header_2: bh}
err := dd.slasherDB.SaveProposerSlashing(ctx, status.Active, ps)
if err != nil {
return nil, err
}
return ps, nil
}
return nil, nil
}