You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

79 lines
2.1 KiB

7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
  1. package evidence
  2. import (
  3. "github.com/tendermint/tmlibs/log"
  4. "github.com/tendermint/tendermint/types"
  5. )
  6. // EvidencePool maintains a pool of valid evidence
  7. // in an EvidenceStore.
  8. type EvidencePool struct {
  9. params types.EvidenceParams
  10. logger log.Logger
  11. state types.State
  12. evidenceStore *EvidenceStore
  13. evidenceChan chan types.Evidence
  14. }
  15. func NewEvidencePool(params types.EvidenceParams, evidenceStore *EvidenceStore, state types.State) *EvidencePool {
  16. evpool := &EvidencePool{
  17. params: params,
  18. logger: log.NewNopLogger(),
  19. evidenceStore: evidenceStore,
  20. state: state,
  21. evidenceChan: make(chan types.Evidence),
  22. }
  23. return evpool
  24. }
  25. // SetLogger sets the Logger.
  26. func (evpool *EvidencePool) SetLogger(l log.Logger) {
  27. evpool.logger = l
  28. }
  29. // EvidenceChan returns an unbuffered channel on which new evidence can be received.
  30. func (evpool *EvidencePool) EvidenceChan() <-chan types.Evidence {
  31. return evpool.evidenceChan
  32. }
  33. // PriorityEvidence returns the priority evidence.
  34. func (evpool *EvidencePool) PriorityEvidence() []types.Evidence {
  35. return evpool.evidenceStore.PriorityEvidence()
  36. }
  37. // PendingEvidence returns all uncommitted evidence.
  38. func (evpool *EvidencePool) PendingEvidence() []types.Evidence {
  39. return evpool.evidenceStore.PendingEvidence()
  40. }
  41. // AddEvidence checks the evidence is valid and adds it to the pool.
  42. // Blocks on the EvidenceChan.
  43. func (evpool *EvidencePool) AddEvidence(evidence types.Evidence) (err error) {
  44. // XXX: is this thread safe ?
  45. priority, err := evpool.state.VerifyEvidence(evidence)
  46. if err != nil {
  47. return err
  48. }
  49. added := evpool.evidenceStore.AddNewEvidence(evidence, priority)
  50. if !added {
  51. // evidence already known, just ignore
  52. return
  53. }
  54. evpool.logger.Info("Verified new evidence of byzantine behaviour", "evidence", evidence)
  55. evpool.evidenceChan <- evidence
  56. return nil
  57. }
  58. // MarkEvidenceAsCommitted marks all the evidence as committed.
  59. func (evpool *EvidencePool) MarkEvidenceAsCommitted(evidence []types.Evidence) {
  60. for _, ev := range evidence {
  61. evpool.evidenceStore.MarkEvidenceAsCommitted(ev)
  62. }
  63. }