Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reduce the overhead of seal in light clients #242

Open
junha1 opened this issue Mar 10, 2020 · 0 comments
Open

Reduce the overhead of seal in light clients #242

junha1 opened this issue Mar 10, 2020 · 0 comments
Labels
consensus Consensus light-client light client

Comments

@junha1
Copy link
Contributor

junha1 commented Mar 10, 2020

Background

Light clients (both standalone and ICS) utilize the concept of 'Update header', which is a set of data that is enough to update a light client's best header. (In abstract terms, we call this 'update of client state'.)
Currently Foundry's UpdateHeader contains new_header, validator_set, and seal_for_current (for new_header).

We don't actually need all fields in the header for light clients. For example, author, parent_hash, extra_data... and even the seal
However, we must provide them to light clients since they contribute to the block hash, which will be verified by the seal_for_current.

As you can see, UpdateHeader contains two seals.

Problem

You might think it's tolerable, but it's not. It has a problem with ICS.
Of course ICS's light client will have the same problem of having two seals, but the worse part of doing this is that the UpdateHeader in IBC will be recorded in the transaction, and ultimately, in the block.
This means that a full node will carry approximately 3 seals per block if it is Foundry-Foundry IBC and each's chain has similar block generation rate.

  • one for its own block
  • one for update_header.new_header.seal
  • one for update_header.seal_for_current

How to solve

We can change the hashing scheme of our header to:
hash(header.a1, header, a2, .... , hash(header.b1, header.b2, ...))
where a#s are fields that the light client actually uses, and b#s are not. (e.g seal)
This forms a 2-depth Merkle tree and the UpdateHeader will contain only a#s + hash(header.b1, header.b2, ...), not the whole new_header.

BLS

It might be 'tolerable' if we decided to introduce BLS to master.

@junha1 junha1 added consensus Consensus light-client light client labels Mar 10, 2020
@kseo kseo changed the title Reduce overhead of seal in light client Reduce the overhead of seal in light client Mar 10, 2020
@ScarletBlue ScarletBlue changed the title Reduce the overhead of seal in light client Reduce the overhead of seal in the light client Mar 10, 2020
@ScarletBlue ScarletBlue changed the title Reduce the overhead of seal in the light client Reduce the overhead of seal in light clients Mar 10, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
consensus Consensus light-client light client
Projects
None yet
Development

No branches or pull requests

1 participant