You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.
The text was updated successfully, but these errors were encountered:
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
containsnew_header
,validator_set
, andseal_for_current
(fornew_header
).We don't actually need all fields in the header for light clients. For example,
author
,parent_hash
,extra_data
... and even theseal
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.
update_header.new_header.seal
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, andb#
s are not. (e.gseal
)This forms a 2-depth Merkle tree and the
UpdateHeader
will contain onlya#
s +hash(header.b1, header.b2, ...)
, not the wholenew_header
.BLS
It might be 'tolerable' if we decided to introduce BLS to master.
The text was updated successfully, but these errors were encountered: