pub struct ForeignClient<DstChain: ChainHandle, SrcChain: ChainHandle> {
    pub id: ClientId,
    pub dst_chain: DstChain,
    pub src_chain: SrcChain,
}

Fields

id: ClientId

The identifier of this client. The host chain determines this id upon client creation, so we may be using the default value temporarily.

dst_chain: DstChain

A handle to the chain hosting this client, i.e., destination chain.

src_chain: SrcChain

A handle to the chain whose headers this client is verifying, aka the source chain.

Implementations

Creates a new foreign client on dst_chain. Blocks until the client is created, or an error occurs. Post-condition: dst_chain hosts an IBC client for src_chain.

Queries host_chain to verify that a client with identifier client_id exists. If the client does not exist, returns an error. If the client exists, cross-checks that the identifier for the target chain of this client (i.e., the chain whose headers this client is verifying) is consistent with expected_target_chain, and if so, return a new ForeignClient representing this client.

Returns a handle to the chain hosting this client.

Returns a handle to the chain whose headers this client is sourcing (the source chain).

Lower-level interface for preparing a message to create a client.

Returns the identifier of the newly created client.

Wrapper for build_update_client_with_trusted.

Returns a vector with a message for updating the client to height target_height. If the client already stores a consensus state for this height, returns an empty vector.

Attempts to update a client using header from the latest height of its source chain.

Retrieves the client update event that was emitted when a consensus state at the specified height was created on chain. It is possible that the event cannot be retrieved if the information is not yet available on the full node. To handle this the query is retried a few times.

Checks for evidence of misbehaviour. The check starts with and update_event emitted by chain B (dst_chain) for a client update with a header from chain A (src_chain). The algorithm goes backwards through the headers until it gets to the first misbehaviour.

The following cases are covered: 1 - fork: Assumes at least one consensus state before the fork point exists. Let existing consensus states on chain B be: [Sn,.., Sf, Sf-1, S0] with Sf-1 being the most recent state before fork. Chain A is queried for a header Hf' at Sf.height and if it is different than the Hf in the event for the client update (the one that has generated Sf on chain), then the two headers are included in the evidence and submitted. Note that in this case the headers are different but have the same height.

2 - BFT time violation for unavailable header (a.k.a. Future Lunatic Attack or FLA): Some header with a height that is higher than the latest height on A has been accepted and a consensus state was created on B. Note that this implies that the timestamp of this header must be within the clock_drift of the client. Assume the client on B has been updated with h2(not present on/ produced by chain A) and it has a timestamp of t2 that is at most clock_drift in the future. Then the latest header from A is fetched, let it be h1, with a timestamp of t1. If t1 >= t2 then evidence of misbehavior is submitted to A.

3 - BFT time violation for existing headers (TODO): Ensure that consensus state times are monotonically increasing with height.

Other notes:

  • the algorithm builds misbehavior at each consensus height, starting with the highest height assuming the previous one is trusted. It submits the first constructed evidence (the one with the highest height)
  • a lot of the logic here is derived from the behavior of the only implemented client (ics07-tendermint) and might not be general enough.

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

Used in Output messages. Provides a concise description of a ForeignClient, using the format: {CHAIN-ID} -> {CHAIN-ID}:{CLIENT} where the first chain identifier is for the source chain, and the second chain identifier is the destination (which hosts the client) chain.

Formats the value using the given formatter. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Attaches the provided Context to this type, returning a WithContext wrapper. Read more

Attaches the current Context to this type, returning a WithContext wrapper. Read more

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more

Instruments this type with the current Span, returning an Instrumented wrapper. Read more

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Wrap the input message T in a tonic::Request

Should always be Self

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

Converts the given value to a String. Read more

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more