|
|
@ -4,20 +4,19 @@ order: 9 |
|
|
|
|
|
|
|
# Light Client Protocol |
|
|
|
|
|
|
|
Light clients are an important part of the complete blockchain system |
|
|
|
for most applications. Tendermint provides unique speed and security |
|
|
|
properties for light client applications. |
|
|
|
Light clients are an important part of the complete blockchain system for most |
|
|
|
applications. Tendermint provides unique speed and security properties for |
|
|
|
light client applications. |
|
|
|
|
|
|
|
See our [lite |
|
|
|
package](https://godoc.org/github.com/tendermint/tendermint/lite). |
|
|
|
package](https://pkg.go.dev/github.com/tendermint/tendermint/lite2?tab=doc). |
|
|
|
|
|
|
|
## Overview |
|
|
|
|
|
|
|
The objective of the light client protocol is to get a |
|
|
|
commit for a recent block |
|
|
|
hash where the commit includes a |
|
|
|
majority of signatures from the last known validator set. From there, |
|
|
|
all the application state is verifiable with [merkle |
|
|
|
The objective of the light client protocol is to get a commit for a recent |
|
|
|
block hash where the commit includes a majority of signatures from the last |
|
|
|
known validator set. From there, all the application state is verifiable with |
|
|
|
[merkle |
|
|
|
proofs](https://github.com/tendermint/spec/blob/953523c3cb99fdb8c8f7a2d21e3a99094279e9de/spec/blockchain/encoding.md#iavl-tree). |
|
|
|
|
|
|
|
## Properties |
|
|
@ -27,8 +26,38 @@ proofs](https://github.com/tendermint/spec/blob/953523c3cb99fdb8c8f7a2d21e3a9909 |
|
|
|
- You get the full speed benefits of Tendermint; transactions |
|
|
|
commit instantly. |
|
|
|
- You can get the most recent version of the application state |
|
|
|
non-interactively (without committing anything to the blockchain). |
|
|
|
For example, this means that you can get the most recent value of a |
|
|
|
name from the name-registry without worrying about fork censorship |
|
|
|
attacks, without posting a commit and waiting for confirmations. |
|
|
|
It's fast, secure, and free! |
|
|
|
non-interactively (without committing anything to the blockchain). For |
|
|
|
example, this means that you can get the most recent value of a name from the |
|
|
|
name-registry without worrying about fork censorship attacks, without posting |
|
|
|
a commit and waiting for confirmations. It's fast, secure, and free! |
|
|
|
|
|
|
|
## Where to obtain trusted height & hash? |
|
|
|
|
|
|
|
https://pkg.go.dev/github.com/tendermint/tendermint/lite2?tab=doc#TrustOptions |
|
|
|
|
|
|
|
One way to obtain semi-trusted hash & height is to query multiple full nodes |
|
|
|
and compare their hashes: |
|
|
|
|
|
|
|
```sh |
|
|
|
$ curl -s https://233.123.0.140:26657:26657/commit | jq "{height: .result.signed_header.header.height, hash: .result.signed_header.commit.block_id.hash}" |
|
|
|
{ |
|
|
|
"height": "273", |
|
|
|
"hash": "188F4F36CBCD2C91B57509BBF231C777E79B52EE3E0D90D06B1A25EB16E6E23D" |
|
|
|
} |
|
|
|
``` |
|
|
|
|
|
|
|
## HTTP proxy |
|
|
|
|
|
|
|
Tendermint comes with a built-in `tendermint lite` command, which can be used |
|
|
|
to run a light client proxy server, verifying Tendermint rpc. All calls that |
|
|
|
can be tracked back to a block header by a proof will be verified before |
|
|
|
passing them back to the caller. Other than that, it will present the same |
|
|
|
interface as a full Tendermint node. |
|
|
|
|
|
|
|
```sh |
|
|
|
$ tendermint lite --chain-id=supernova --primary=tcp://233.123.0.140:26657 \ |
|
|
|
--witnesses=tcp://179.63.29.15:26657,tcp://144.165.223.135:26657 \ |
|
|
|
--trusted-height=10 --trusted-hash=37E9A6DD3FA25E83B22C18835401E8E56088D0D7ABC6FD99FCDC920DD76C1C57 |
|
|
|
``` |
|
|
|
|
|
|
|
For additional options, run `tendermint lite --help`. |