From 6bed16594dd5af4e7bef5a9b79a9f387515d1238 Mon Sep 17 00:00:00 2001 From: AntonAndell Date: Wed, 17 Jan 2024 08:00:40 +0100 Subject: [PATCH] feat: Add revision number to light client heights (#822) Add revision number but for now do not add support for resseting chain height --- .../main/java/ibc/tendermint/TendermintHelper.java | 12 ++++++++++-- .../java/ibc/tendermint/TendermintLightClient.java | 10 ++++++---- .../test/java/ibc/tendermint/LightClientTest.java | 5 +++-- .../java/ibc/tendermint/LightClientTestBase.java | 6 ++++-- 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/contracts/javascore/lightclients/tendermint/src/main/java/ibc/tendermint/TendermintHelper.java b/contracts/javascore/lightclients/tendermint/src/main/java/ibc/tendermint/TendermintHelper.java index 1aa812492..d11c56d1c 100644 --- a/contracts/javascore/lightclients/tendermint/src/main/java/ibc/tendermint/TendermintHelper.java +++ b/contracts/javascore/lightclients/tendermint/src/main/java/ibc/tendermint/TendermintHelper.java @@ -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++) { @@ -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; } diff --git a/contracts/javascore/lightclients/tendermint/src/main/java/ibc/tendermint/TendermintLightClient.java b/contracts/javascore/lightclients/tendermint/src/main/java/ibc/tendermint/TendermintLightClient.java index 2012a1057..fbe9cc0c0 100644 --- a/contracts/javascore/lightclients/tendermint/src/main/java/ibc/tendermint/TendermintLightClient.java +++ b/contracts/javascore/lightclients/tendermint/src/main/java/ibc/tendermint/TendermintLightClient.java @@ -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; @@ -120,7 +121,6 @@ public Map 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 @@ -153,7 +153,8 @@ public Map 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); @@ -168,12 +169,13 @@ public Map 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); } diff --git a/contracts/javascore/lightclients/tendermint/src/test/java/ibc/tendermint/LightClientTest.java b/contracts/javascore/lightclients/tendermint/src/test/java/ibc/tendermint/LightClientTest.java index 0fa6b2bd0..d6e80de32 100644 --- a/contracts/javascore/lightclients/tendermint/src/test/java/ibc/tendermint/LightClientTest.java +++ b/contracts/javascore/lightclients/tendermint/src/test/java/ibc/tendermint/LightClientTest.java @@ -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); diff --git a/contracts/javascore/lightclients/tendermint/src/test/java/ibc/tendermint/LightClientTestBase.java b/contracts/javascore/lightclients/tendermint/src/test/java/ibc/tendermint/LightClientTestBase.java index 612c5daac..547782b87 100644 --- a/contracts/javascore/lightclients/tendermint/src/test/java/ibc/tendermint/LightClientTestBase.java +++ b/contracts/javascore/lightclients/tendermint/src/test/java/ibc/tendermint/LightClientTestBase.java @@ -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();