Skip to content

Commit 6bed165

Browse files
authored
feat: Add revision number to light client heights (#822)
Add revision number but for now do not add support for resseting chain height
1 parent 4bce6c8 commit 6bed165

File tree

4 files changed

+23
-10
lines changed

4 files changed

+23
-10
lines changed

contracts/javascore/lightclients/tendermint/src/main/java/ibc/tendermint/TendermintHelper.java

+10-2
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,14 @@ public static BigInteger getTotalVotingPower(ValidatorSet validatorSet) {
5757
return validatorSet.getTotalVotingPower();
5858
}
5959

60+
public static BigInteger getRevisionNumber(String chainId) {
61+
int id = chainId.indexOf("-");
62+
if (id >= 0) {
63+
return new BigInteger(chainId.substring(id+1));
64+
}
65+
return BigInteger.ZERO;
66+
}
67+
6068
public static int getByAddress(ValidatorSet validatorSet, byte[] addr) {
6169
int size = validatorSet.getValidators().size();
6270
for (int idx = 0; idx < size; idx++) {
@@ -68,10 +76,10 @@ public static int getByAddress(ValidatorSet validatorSet, byte[] addr) {
6876
return -1;
6977
}
7078

71-
public static Height newHeight(BigInteger blockHeight) {
79+
public static Height newHeight(BigInteger blockHeight, BigInteger revision) {
7280
Height height = new Height();
7381
height.setRevisionHeight(blockHeight);
74-
height.setRevisionNumber(BigInteger.ZERO);
82+
height.setRevisionNumber(revision);
7583

7684
return height;
7785
}

contracts/javascore/lightclients/tendermint/src/main/java/ibc/tendermint/TendermintLightClient.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import score.Context;
1818
import score.DictDB;
1919
import score.annotation.External;
20+
import score.annotation.Optional;
2021

2122
import java.math.BigInteger;
2223
import java.util.Arrays;
@@ -120,7 +121,6 @@ public Map<String, byte[]> updateClient(String clientId, byte[] clientMessageByt
120121
onlyHandler();
121122
ibc.lightclients.tendermint.v1.Header tmHeader = ibc.lightclients.tendermint.v1.Header.decode(clientMessageBytes);
122123
boolean conflictingHeader = false;
123-
124124
// Check if the Client store already has a consensus state for the header's
125125
// height
126126
// If the consensus state exists, and it matches the header then we return early
@@ -153,7 +153,8 @@ public Map<String, byte[]> updateClient(String clientId, byte[] clientMessageByt
153153
// Header is different from existing consensus state and also valid, so freeze
154154
// the client and return
155155
if (conflictingHeader) {
156-
clientState.setFrozenHeight(newHeight(tmHeader.getSignedHeader().getHeader().getHeight()));
156+
BigInteger revision = getRevisionNumber(tmHeader.getSignedHeader().getHeader().getChainId());
157+
clientState.setFrozenHeight(newHeight(tmHeader.getSignedHeader().getHeader().getHeight(), revision));
157158
encodedClientState = clientState.encode();
158159
clientStates.set(clientId, encodedClientState);
159160

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

174175
// update the consensus state from a new header and set processed time metadata
175176
if (tmHeader.getSignedHeader().getHeader().getHeight().compareTo(clientState.getLatestHeight().getRevisionHeight()) > 0) {
176-
clientState.setLatestHeight(newHeight(tmHeader.getSignedHeader().getHeader().getHeight()));
177+
BigInteger revision = getRevisionNumber(tmHeader.getSignedHeader().getHeader().getChainId());
178+
clientState.setLatestHeight(newHeight(tmHeader.getSignedHeader().getHeader().getHeight(), revision));
177179
encodedClientState = clientState.encode();
178180
clientStates.set(clientId, encodedClientState);
179181
}

contracts/javascore/lightclients/tendermint/src/test/java/ibc/tendermint/LightClientTest.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -280,8 +280,9 @@ void getLatestHeight() throws Exception {
280280
SignedHeader header1 = parseSignedHeader(1);
281281
SignedHeader header2 = parseSignedHeader(2);
282282

283-
Height height1 = Height.newBuilder().setRevisionHeight(header1.getHeader().getHeight()).build();
284-
Height height2 = Height.newBuilder().setRevisionHeight(header2.getHeader().getHeight()).build();
283+
BigInteger revision = TendermintHelper.getRevisionNumber(header1.getHeader().getChainId());
284+
Height height1 = Height.newBuilder().setRevisionHeight(header1.getHeader().getHeight()).setRevisionNumber(revision.intValue()).build();
285+
Height height2 = Height.newBuilder().setRevisionHeight(header2.getHeader().getHeight()).setRevisionNumber(revision.intValue()).build();
285286

286287
// Act
287288
initializeClient(1);

contracts/javascore/lightclients/tendermint/src/test/java/ibc/tendermint/LightClientTestBase.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -144,13 +144,15 @@ protected void initializeClient(int blockOrder) throws Exception {
144144
Header header = Header.newBuilder()
145145
.setSignedHeader(parseSignedHeader(blockOrder))
146146
.setValidatorSet(parseValidatorSet(blockOrder)).build();
147-
147+
BigInteger revisionNumber = TendermintHelper.getRevisionNumber(header.getSignedHeader().getHeader().getChainId());
148148
ClientState clientState = ClientState.newBuilder()
149149
.setChainId(header.getSignedHeader().getHeader().getChainId())
150150
.setTrustLevel(trustLevel)
151151
.setTrustingPeriod(trustingPeriod)
152152
.setMaxClockDrift(maxClockDrift)
153-
.setLatestHeight(Height.newBuilder().setRevisionHeight(header.getSignedHeader().getHeader().getHeight()))
153+
.setLatestHeight(Height.newBuilder()
154+
.setRevisionHeight(header.getSignedHeader().getHeader().getHeight())
155+
.setRevisionNumber(revisionNumber.intValue()))
154156
.setAllowUpdateAfterExpiry(allowUpdateAfterExpiry)
155157
.setAllowUpdateAfterMisbehaviour(allowUpdateAfterMisbehaviour).build();
156158

0 commit comments

Comments
 (0)