mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2025-01-12 04:30:04 +00:00
607f086de9
* min max span update logic * add comment to exported method * Update slasher/rpc/update_min_max_span.go Co-Authored-By: Raul Jordan <raul@prysmaticlabs.com> * Update slasher/rpc/update_min_max_span.go Co-Authored-By: Raul Jordan <raul@prysmaticlabs.com> * Update slasher/rpc/update_min_max_span.go Co-Authored-By: Raul Jordan <raul@prysmaticlabs.com> * Update slasher/rpc/update_min_max_span_test.go Co-Authored-By: Raul Jordan <raul@prysmaticlabs.com> * Update slasher/rpc/update_min_max_span.go Co-Authored-By: terence tsao <terence@prysmaticlabs.com> * Update slasher/rpc/update_min_max_span.go Co-Authored-By: Raul Jordan <raul@prysmaticlabs.com> * weak subjectivity error * add context * SlasherDb change to SlasherDB * gaz * raul feedback * fix old problem * gofmt goimports * gaz * import fix * change order * min max span detection * added benchmark * max diff without error * Update slasher/rpc/detect_update_min_max_span_bench_test.go Co-Authored-By: Raul Jordan <raul@prysmaticlabs.com> * Update slasher/db/indexed_attestations.go Co-Authored-By: Raul Jordan <raul@prysmaticlabs.com> * Update slasher/rpc/detect_update_min_max_span_bench_test.go Co-Authored-By: Raul Jordan <raul@prysmaticlabs.com> * Update slasher/rpc/detect_update_min_max_span_test.go Co-Authored-By: Raul Jordan <raul@prysmaticlabs.com> * Update slasher/rpc/detect_update_min_max_span.go Co-Authored-By: Raul Jordan <raul@prysmaticlabs.com> * Update slasher/rpc/detect_update_min_max_span_test.go Co-Authored-By: Raul Jordan <raul@prysmaticlabs.com> * Update slasher/rpc/detect_update_min_max_span_bench_test.go Co-Authored-By: Raul Jordan <raul@prysmaticlabs.com> * raul feedback, benchmark fix * raul feedback * gaz * fix merge * bench fix * another bench fix * comments * changed names of functions and proto * name change fix * name change fix * fix test * clarification comment * change to interface * Update proto/eth/v1alpha1/slasher.proto Co-Authored-By: Ivan Martinez <ivanthegreatdev@gmail.com> * Update slasher/rpc/detect_update_min_max_span.go Co-Authored-By: Raul Jordan <raul@prysmaticlabs.com> * Update slasher/rpc/detect_update_min_max_span.go Co-Authored-By: Raul Jordan <raul@prysmaticlabs.com> * change order to reduce confusion * Update proto/eth/v1alpha1/slasher.proto Co-Authored-By: terence tsao <terence@prysmaticlabs.com> * Update slasher/rpc/detect_update_min_max_span.go Co-Authored-By: terence tsao <terence@prysmaticlabs.com> * Update slasher/rpc/detect_update_min_max_span.go Co-Authored-By: terence tsao <terence@prysmaticlabs.com> * Update slasher/rpc/detect_update_min_max_span.go Co-Authored-By: terence tsao <terence@prysmaticlabs.com> * Apply suggestions from code review Co-Authored-By: terence tsao <terence@prysmaticlabs.com> * Update slasher/rpc/detect_update_min_max_span.go * Fix some comments * terence feedback * preston feedback * fix test * fix comments
74 lines
2.3 KiB
Go
74 lines
2.3 KiB
Go
package db
|
|
|
|
import (
|
|
"github.com/boltdb/bolt"
|
|
"github.com/gogo/protobuf/proto"
|
|
"github.com/pkg/errors"
|
|
ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
|
|
"github.com/prysmaticlabs/prysm/shared/bytesutil"
|
|
)
|
|
|
|
func createEpochSpanMap(enc []byte) (*ethpb.EpochSpanMap, error) {
|
|
epochSpanMap := ðpb.EpochSpanMap{}
|
|
err := proto.Unmarshal(enc, epochSpanMap)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "failed to unmarshal encoding")
|
|
}
|
|
return epochSpanMap, nil
|
|
}
|
|
|
|
// ValidatorSpansMap accepts validator index and returns the corresponding spans
|
|
// map for slashing detection.
|
|
// Returns nil if the span map for this validator index does not exist.
|
|
func (db *Store) ValidatorSpansMap(validatorIdx uint64) (*ethpb.EpochSpanMap, error) {
|
|
var sm *ethpb.EpochSpanMap
|
|
err := db.view(func(tx *bolt.Tx) error {
|
|
b := tx.Bucket(validatorsMinMaxSpanBucket)
|
|
enc := b.Get(bytesutil.Bytes4(validatorIdx))
|
|
var err error
|
|
sm, err = createEpochSpanMap(enc)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
})
|
|
if sm.EpochSpanMap == nil {
|
|
sm.EpochSpanMap = make(map[uint64]*ethpb.MinMaxEpochSpan)
|
|
}
|
|
return sm, err
|
|
}
|
|
|
|
// SaveValidatorSpansMap accepts a validator index and span map and writes it to disk.
|
|
func (db *Store) SaveValidatorSpansMap(validatorIdx uint64, spanMap *ethpb.EpochSpanMap) error {
|
|
err := db.update(func(tx *bolt.Tx) error {
|
|
bucket := tx.Bucket(validatorsMinMaxSpanBucket)
|
|
key := bytesutil.Bytes4(validatorIdx)
|
|
val, err := proto.Marshal(spanMap)
|
|
if err != nil {
|
|
return errors.Wrap(err, "failed to marshal span map")
|
|
}
|
|
if err := bucket.Put(key, val); err != nil {
|
|
return errors.Wrapf(err, "failed to delete validator id: %d from validators min max span bucket", validatorIdx)
|
|
}
|
|
return err
|
|
})
|
|
return err
|
|
}
|
|
|
|
// DeleteValidatorSpanMap deletes a validator span map using a validator index as bucket key.
|
|
func (db *Store) DeleteValidatorSpanMap(validatorIdx uint64) error {
|
|
return db.update(func(tx *bolt.Tx) error {
|
|
bucket := tx.Bucket(validatorsMinMaxSpanBucket)
|
|
key := bytesutil.Bytes4(validatorIdx)
|
|
enc := bucket.Get(key)
|
|
if enc == nil {
|
|
return nil
|
|
}
|
|
if err := bucket.Delete(key); err != nil {
|
|
tx.Rollback()
|
|
return errors.Wrapf(err, "failed to delete the span map for validator idx: %v from validators min max span bucket", validatorIdx)
|
|
}
|
|
return nil
|
|
})
|
|
}
|