Skip to content

Commit

Permalink
feat: Add revision number to light client heights
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 committed Jan 17, 2024
1 parent 4bce6c8 commit 95c1ed8
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 95c1ed8

Please sign in to comment.