github.com/soomindae/tendermint@v0.0.5-0.20210528140126-84a0c70c8162/light/errors.go (about) 1 package light 2 3 import ( 4 "errors" 5 "fmt" 6 "time" 7 8 "github.com/soomindae/tendermint/types" 9 ) 10 11 // ErrOldHeaderExpired means the old (trusted) header has expired according to 12 // the given trustingPeriod and current time. If so, the light client must be 13 // reset subjectively. 14 type ErrOldHeaderExpired struct { 15 At time.Time 16 Now time.Time 17 } 18 19 func (e ErrOldHeaderExpired) Error() string { 20 return fmt.Sprintf("old header has expired at %v (now: %v)", e.At, e.Now) 21 } 22 23 // ErrNewValSetCantBeTrusted means the new validator set cannot be trusted 24 // because < 1/3rd (+trustLevel+) of the old validator set has signed. 25 type ErrNewValSetCantBeTrusted struct { 26 Reason types.ErrNotEnoughVotingPowerSigned 27 } 28 29 func (e ErrNewValSetCantBeTrusted) Error() string { 30 return fmt.Sprintf("cant trust new val set: %v", e.Reason) 31 } 32 33 // ErrInvalidHeader means the header either failed the basic validation or 34 // commit is not signed by 2/3+. 35 type ErrInvalidHeader struct { 36 Reason error 37 } 38 39 func (e ErrInvalidHeader) Error() string { 40 return fmt.Sprintf("invalid header: %v", e.Reason) 41 } 42 43 // ErrFailedHeaderCrossReferencing is returned when the detector was not able to cross reference the header 44 // with any of the connected witnesses. 45 var ErrFailedHeaderCrossReferencing = errors.New("all witnesses have either not responded, don't have the " + 46 " blocks or sent invalid blocks. You should look to change your witnesses" + 47 " or review the light client's logs for more information") 48 49 // ErrVerificationFailed means either sequential or skipping verification has 50 // failed to verify from header #1 to header #2 due to some reason. 51 type ErrVerificationFailed struct { 52 From int64 53 To int64 54 Reason error 55 } 56 57 // Unwrap returns underlying reason. 58 func (e ErrVerificationFailed) Unwrap() error { 59 return e.Reason 60 } 61 62 func (e ErrVerificationFailed) Error() string { 63 return fmt.Sprintf("verify from #%d to #%d failed: %v", e.From, e.To, e.Reason) 64 } 65 66 // ErrLightClientAttack is returned when the light client has detected an attempt 67 // to verify a false header and has sent the evidence to either a witness or primary. 68 var ErrLightClientAttack = errors.New(`attempted attack detected. 69 Light client received valid conflicting header from witness. 70 Unable to verify header. Evidence has been sent to both providers. 71 Check logs for full evidence and trace`, 72 ) 73 74 // ErrNoWitnesses means that there are not enough witnesses connected to 75 // continue running the light client. 76 var ErrNoWitnesses = errors.New("no witnesses connected. please reset light client") 77 78 // ----------------------------- INTERNAL ERRORS --------------------------------- 79 80 // ErrConflictingHeaders is thrown when two conflicting headers are discovered. 81 type errConflictingHeaders struct { 82 Block *types.LightBlock 83 WitnessIndex int 84 } 85 86 func (e errConflictingHeaders) Error() string { 87 return fmt.Sprintf( 88 "header hash (%X) from witness (%d) does not match primary", 89 e.Block.Hash(), e.WitnessIndex) 90 } 91 92 // errNoWitnesses means that there are not enough witnesses connected to 93 // continue running the light client. 94 type errNoWitnesses struct{} 95 96 func (e errNoWitnesses) Error() string { 97 return "no witnesses connected. please reset light client" 98 } 99 100 // errBadWitness is returned when the witness either does not respond or 101 // responds with an invalid header. 102 type errBadWitness struct { 103 Reason error 104 WitnessIndex int 105 } 106 107 func (e errBadWitness) Error() string { 108 return fmt.Sprintf("Witness %d returned error: %s", e.WitnessIndex, e.Reason.Error()) 109 } 110 111 var errNoDivergence = errors.New( 112 "sanity check failed: no divergence between the original trace and the provider's new trace", 113 )