mirror of
https://github.com/tendermint/tendermint.git
synced 2026-01-04 20:23:59 +00:00
Closes: #4530 This PR contains logic for both submitting an evidence by the light client (lite2 package) and receiving it on the Tendermint side (/broadcast_evidence RPC and/or EvidenceReactor#Receive). Upon receiving the ConflictingHeadersEvidence (introduced by this PR), the Tendermint validates it, then breaks it down into smaller pieces (DuplicateVoteEvidence, LunaticValidatorEvidence, PhantomValidatorEvidence, PotentialAmnesiaEvidence). Afterwards, each piece of evidence is verified against the state of the full node and added to the pool, from which it's reaped upon block creation. * rpc/client: do not pass height param if height ptr is nil * rpc/core: validate incoming evidence! * only accept ConflictingHeadersEvidence if one of the headers is committed from this full node's perspective This simplifies the code. Plus, if there are multiple forks, we'll likely to receive multiple ConflictingHeadersEvidence anyway. * swap CommitSig with Vote in LunaticValidatorEvidence Vote is needed to validate signature * no need to embed client http is a provider and should not be used as a client
66 lines
1.7 KiB
Go
66 lines
1.7 KiB
Go
package lite
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/tendermint/tendermint/lite2/provider"
|
|
"github.com/tendermint/tendermint/types"
|
|
)
|
|
|
|
// ErrOldHeaderExpired means the old (trusted) header has expired according to
|
|
// the given trustingPeriod and current time. If so, the light client must be
|
|
// reset subjectively.
|
|
type ErrOldHeaderExpired struct {
|
|
At time.Time
|
|
Now time.Time
|
|
}
|
|
|
|
func (e ErrOldHeaderExpired) Error() string {
|
|
return fmt.Sprintf("old header has expired at %v (now: %v)", e.At, e.Now)
|
|
}
|
|
|
|
// ErrNewValSetCantBeTrusted means the new validator set cannot be trusted
|
|
// because < 1/3rd (+trustLevel+) of the old validator set has signed.
|
|
type ErrNewValSetCantBeTrusted struct {
|
|
Reason types.ErrNotEnoughVotingPowerSigned
|
|
}
|
|
|
|
func (e ErrNewValSetCantBeTrusted) Error() string {
|
|
return fmt.Sprintf("cant trust new val set: %v", e.Reason)
|
|
}
|
|
|
|
// ErrInvalidHeader means the header either failed the basic validation or
|
|
// commit is not signed by 2/3+.
|
|
type ErrInvalidHeader struct {
|
|
Reason error
|
|
}
|
|
|
|
func (e ErrInvalidHeader) Error() string {
|
|
return fmt.Sprintf("invalid header: %v", e.Reason)
|
|
}
|
|
|
|
// ErrConflictingHeaders is thrown when two conflicting headers are discovered.
|
|
type ErrConflictingHeaders struct {
|
|
H1 *types.SignedHeader
|
|
Primary provider.Provider
|
|
|
|
H2 *types.SignedHeader
|
|
Witness provider.Provider
|
|
}
|
|
|
|
func (e ErrConflictingHeaders) Error() string {
|
|
return fmt.Sprintf(
|
|
"header hash %X from primary %v does not match one %X from witness %v",
|
|
e.H1.Hash(), e.Primary,
|
|
e.H2.Hash(), e.Witness)
|
|
}
|
|
|
|
// errNoWitnesses means that there are not enough witnesses connected to
|
|
// continue running the light client.
|
|
type errNoWitnesses struct{}
|
|
|
|
func (e errNoWitnesses) Error() string {
|
|
return "no witnesses connected. please reset light client"
|
|
}
|