Skip to content

Commit

Permalink
feat: Add revision number to light client heights (#822)
Browse files Browse the repository at this point in the history
Add revision number but for now do not add support for resseting chain height
  • Loading branch information
AntonAndell authored Jan 17, 2024
1 parent 4bce6c8 commit 6bed165
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,14 @@ public static BigInteger getTotalVotingPower(ValidatorSet validatorSet) {
return validatorSet.getTotalVotingPower();
}

public static BigInteger getRevisionNumber(String chainId) {
int id = chainId.indexOf("-");
if (id >= 0) {
return new BigInteger(chainId.substring(id+1));
}
return BigInteger.ZERO;
}

public static int getByAddress(ValidatorSet validatorSet, byte[] addr) {
int size = validatorSet.getValidators().size();
for (int idx = 0; idx < size; idx++) {
Expand All @@ -68,10 +76,10 @@ public static int getByAddress(ValidatorSet validatorSet, byte[] addr) {
return -1;
}

public static Height newHeight(BigInteger blockHeight) {
public static Height newHeight(BigInteger blockHeight, BigInteger revision) {
Height height = new Height();
height.setRevisionHeight(blockHeight);
height.setRevisionNumber(BigInteger.ZERO);
height.setRevisionNumber(revision);

return height;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import score.Context;
import score.DictDB;
import score.annotation.External;
import score.annotation.Optional;

import java.math.BigInteger;
import java.util.Arrays;
Expand Down Expand Up @@ -120,7 +121,6 @@ public Map<String, byte[]> updateClient(String clientId, byte[] clientMessageByt
onlyHandler();
ibc.lightclients.tendermint.v1.Header tmHeader = ibc.lightclients.tendermint.v1.Header.decode(clientMessageBytes);
boolean conflictingHeader = false;

// Check if the Client store already has a consensus state for the header's
// height
// If the consensus state exists, and it matches the header then we return early
Expand Down Expand Up @@ -153,7 +153,8 @@ public Map<String, byte[]> updateClient(String clientId, byte[] clientMessageByt
// Header is different from existing consensus state and also valid, so freeze
// the client and return
if (conflictingHeader) {
clientState.setFrozenHeight(newHeight(tmHeader.getSignedHeader().getHeader().getHeight()));
BigInteger revision = getRevisionNumber(tmHeader.getSignedHeader().getHeader().getChainId());
clientState.setFrozenHeight(newHeight(tmHeader.getSignedHeader().getHeader().getHeight(), revision));
encodedClientState = clientState.encode();
clientStates.set(clientId, encodedClientState);

Expand All @@ -168,12 +169,13 @@ public Map<String, byte[]> updateClient(String clientId, byte[] clientMessageByt
"clientStateCommitment", IBCCommitment.keccak256(encodedClientState),
"consensusStateCommitment", IBCCommitment.keccak256(encodedConsensusState),
"height",
newHeight(tmHeader.getSignedHeader().getHeader().getHeight()).encode());
newHeight(tmHeader.getSignedHeader().getHeader().getHeight(), revision).encode());
}

// update the consensus state from a new header and set processed time metadata
if (tmHeader.getSignedHeader().getHeader().getHeight().compareTo(clientState.getLatestHeight().getRevisionHeight()) > 0) {
clientState.setLatestHeight(newHeight(tmHeader.getSignedHeader().getHeader().getHeight()));
BigInteger revision = getRevisionNumber(tmHeader.getSignedHeader().getHeader().getChainId());
clientState.setLatestHeight(newHeight(tmHeader.getSignedHeader().getHeader().getHeight(), revision));
encodedClientState = clientState.encode();
clientStates.set(clientId, encodedClientState);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -280,8 +280,9 @@ void getLatestHeight() throws Exception {
SignedHeader header1 = parseSignedHeader(1);
SignedHeader header2 = parseSignedHeader(2);

Height height1 = Height.newBuilder().setRevisionHeight(header1.getHeader().getHeight()).build();
Height height2 = Height.newBuilder().setRevisionHeight(header2.getHeader().getHeight()).build();
BigInteger revision = TendermintHelper.getRevisionNumber(header1.getHeader().getChainId());
Height height1 = Height.newBuilder().setRevisionHeight(header1.getHeader().getHeight()).setRevisionNumber(revision.intValue()).build();
Height height2 = Height.newBuilder().setRevisionHeight(header2.getHeader().getHeight()).setRevisionNumber(revision.intValue()).build();

// Act
initializeClient(1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,13 +144,15 @@ protected void initializeClient(int blockOrder) throws Exception {
Header header = Header.newBuilder()
.setSignedHeader(parseSignedHeader(blockOrder))
.setValidatorSet(parseValidatorSet(blockOrder)).build();

BigInteger revisionNumber = TendermintHelper.getRevisionNumber(header.getSignedHeader().getHeader().getChainId());
ClientState clientState = ClientState.newBuilder()
.setChainId(header.getSignedHeader().getHeader().getChainId())
.setTrustLevel(trustLevel)
.setTrustingPeriod(trustingPeriod)
.setMaxClockDrift(maxClockDrift)
.setLatestHeight(Height.newBuilder().setRevisionHeight(header.getSignedHeader().getHeader().getHeight()))
.setLatestHeight(Height.newBuilder()
.setRevisionHeight(header.getSignedHeader().getHeader().getHeight())
.setRevisionNumber(revisionNumber.intValue()))
.setAllowUpdateAfterExpiry(allowUpdateAfterExpiry)
.setAllowUpdateAfterMisbehaviour(allowUpdateAfterMisbehaviour).build();

Expand Down

0 comments on commit 6bed165

Please sign in to comment.