Skip to content

Commit

Permalink
feat(javascore): IIBC-108 Implement tendermint lightclient contract (#57
Browse files Browse the repository at this point in the history
)

* Add Java classes to parse JSON versions of IBC proto messages

* Add Java classes to represent messages from [ICS-26](https://github.com/cosmos/ibc/tree/main/spec/core/ics-026-routing-module#datagram-handlers-write)
Translated from interperation done in https://github.com/hyperledger-labs/yui-ibc-solidity/blob/main/contracts/core/25-handler/IBCMsgs.sol

* Add Java classes to parse JSON versions of IBC proto messages

Add RLP encoding to proto messages used in storage

* downrgrade javaeeUnittestVersion from 0.10.0 to 0.9.7

* feat: implement create keys for signing transaction  (#27)

fezt : Create keys

Co-authored-by: hemz10 <sph2740@example.com>

* feat: implement callrequest storage (#24)

* chore: add boilerplate for cosmwasm-contracts

* update cargo

* test: add unit-test setup

* test: setup mock env

* update test

* update test setup, cargo

* add call service message

* chore: inital ibc impl for xcall

* chore:  refactor message and address

* chore: implement state for xcall

* chore: update call service  message

* chore: add call message request storage

* chore: add call message response storage

* chore: add rust rlp library

* chore: update cargo

* remove admin and owner

* add storage key enum

* update types

* remove admin and owner management

* chore : restructure contract state and update methods

* update admin and owner store

* add storage key for cosmwasm persistant storage

* add rollback message

* Initial commit

* removed encodable and decodable

* format code

* format code

* chore: remove rollback

---------

Co-authored-by: shreyasbhat0 <shreyas.ks@hugobyte.com>
Co-authored-by: Shreyas S Bhat <35568964+shreyasbhat0@users.noreply.github.com>

* Feature/add gradle properties for version in java contracts (#28)

* chore: upgrade gradle version to 8.0

Signed-off-by: Night Owl <nightowl121@protonmail.com>

* chore: add common version of java libraries for smart contracts

Signed-off-by: Night Owl <nightowl121@protonmail.com>

---------

Signed-off-by: Night Owl <nightowl121@protonmail.com>

* Add ci to run while updating java contracts (#29)

* chore: add ci to run while updating java contracts

checks will run unit tests and optimize jar tasks

Signed-off-by: Night Owl <nightowl121@protonmail.com>

* fix: fix command location for testing java contracts

Signed-off-by: Night Owl <nightowl121@protonmail.com>

---------

Signed-off-by: Night Owl <nightowl121@protonmail.com>

* docs: ADR for relay (#21)

* feat: implement call message response storage (#18)

* chore: add boilerplate for cosmwasm-contracts

* update cargo

* test: add unit-test setup

* test: setup mock env

* update test

* update test setup, cargo

* add call service message

* chore: inital ibc impl for xcall

* chore:  refactor message and address

* chore: implement state for xcall

* chore: update call service  message

* chore: add call message request storage

* chore: add call message response storage

* chore: add rust rlp library

* chore: update cargo

* remove admin and owner

* add storage key enum

* update types

* remove admin and owner management

* chore : restructure contract state and update methods

* update admin and owner store

* add storage key for cosmwasm persistant storage

* update rlp cargo

* implement request methods

* init rlp encode and decode for messages

* chore: cargo clippy

* chore: update owner and admin

* chore: add unit test

* chore: add unit test for request

---------

Co-authored-by: Muhammed Irfan <50794925+MuhammedIrfan@users.noreply.github.com>

* downrgrade javaeeUnittestVersion from 0.10.0 to 0.9.7

* fix: fix folder name to run github actions

Signed-off-by: Night Owl <nightowl121@protonmail.com>

* Import correct Version class in message classes

* modify gradle files and CI workflow to allow for CI builds

* Implement Client interferface/library for ICON handler
 * add to and from bytes to channel and connection end classes
 * add light client interface
 * add simple store class to use for now
 * add compare methods to height class

* Add inital implementation of the Connection library for IBC Handler

* Add inital implementation of the Channel library for IBC Handler

* Implement IBC handler message definitions as java classes (#32)

* Add Java classes to parse JSON versions of IBC proto messages

* Add Java classes to represent messages from [ICS-26](https://github.com/cosmos/ibc/tree/main/spec/core/ics-026-routing-module#datagram-handlers-write)
Translated from interperation done in https://github.com/hyperledger-labs/yui-ibc-solidity/blob/main/contracts/core/25-handler/IBCMsgs.sol

* feat: implement create keys for signing transaction  (#27)

fezt : Create keys

Co-authored-by: hemz10 <sph2740@example.com>

* feat: implement callrequest storage (#24)

* chore: add boilerplate for cosmwasm-contracts

* update cargo

* test: add unit-test setup

* test: setup mock env

* update test

* update test setup, cargo

* add call service message

* chore: inital ibc impl for xcall

* chore:  refactor message and address

* chore: implement state for xcall

* chore: update call service  message

* chore: add call message request storage

* chore: add call message response storage

* chore: add rust rlp library

* chore: update cargo

* remove admin and owner

* add storage key enum

* update types

* remove admin and owner management

* chore : restructure contract state and update methods

* update admin and owner store

* add storage key for cosmwasm persistant storage

* add rollback message

* Initial commit

* removed encodable and decodable

* format code

* format code

* chore: remove rollback

---------

Co-authored-by: shreyasbhat0 <shreyas.ks@hugobyte.com>
Co-authored-by: Shreyas S Bhat <35568964+shreyasbhat0@users.noreply.github.com>

* Feature/add gradle properties for version in java contracts (#28)

* chore: upgrade gradle version to 8.0

Signed-off-by: Night Owl <nightowl121@protonmail.com>

* chore: add common version of java libraries for smart contracts

Signed-off-by: Night Owl <nightowl121@protonmail.com>

---------

Signed-off-by: Night Owl <nightowl121@protonmail.com>

* Add ci to run while updating java contracts (#29)

* chore: add ci to run while updating java contracts

checks will run unit tests and optimize jar tasks

Signed-off-by: Night Owl <nightowl121@protonmail.com>

* fix: fix command location for testing java contracts

Signed-off-by: Night Owl <nightowl121@protonmail.com>

---------

Signed-off-by: Night Owl <nightowl121@protonmail.com>

* docs: ADR for relay (#21)

* feat: implement call message response storage (#18)

* chore: add boilerplate for cosmwasm-contracts

* update cargo

* test: add unit-test setup

* test: setup mock env

* update test

* update test setup, cargo

* add call service message

* chore: inital ibc impl for xcall

* chore:  refactor message and address

* chore: implement state for xcall

* chore: update call service  message

* chore: add call message request storage

* chore: add call message response storage

* chore: add rust rlp library

* chore: update cargo

* remove admin and owner

* add storage key enum

* update types

* remove admin and owner management

* chore : restructure contract state and update methods

* update admin and owner store

* add storage key for cosmwasm persistant storage

* update rlp cargo

* implement request methods

* init rlp encode and decode for messages

* chore: cargo clippy

* chore: update owner and admin

* chore: add unit test

* chore: add unit test for request

---------

Co-authored-by: Muhammed Irfan <50794925+MuhammedIrfan@users.noreply.github.com>

* downrgrade javaeeUnittestVersion from 0.10.0 to 0.9.7

* fix: fix folder name to run github actions

Signed-off-by: Night Owl <nightowl121@protonmail.com>

* Import correct Version class in message classes

* modify gradle files and CI workflow to allow for CI builds

---------

Signed-off-by: Night Owl <nightowl121@protonmail.com>
Co-authored-by: Hemanth Kumar <96766939+hemz10@users.noreply.github.com>
Co-authored-by: hemz10 <sph2740@example.com>
Co-authored-by: Prathiksha-Nataraja <90592522+Prathiksha-Nataraja@users.noreply.github.com>
Co-authored-by: shreyasbhat0 <shreyas.ks@hugobyte.com>
Co-authored-by: Shreyas S Bhat <35568964+shreyasbhat0@users.noreply.github.com>
Co-authored-by: Night Owl <91905208+nightowl121@users.noreply.github.com>
Co-authored-by: viveksharmapoudel <viveksharmapoudel@gmail.com>
Co-authored-by: Muhammed Irfan <50794925+MuhammedIrfan@users.noreply.github.com>
Co-authored-by: Night Owl <nightowl121@protonmail.com>

* Add inital unittest, ignoring commitments

* add connection unit tests, ignoring commitments and storage assertions

* Add channel handler and  send/recv package unit tests. Ignored commitments

* Apply commitments for IBC host branch

* add packet RLP encoding

* Implement IBC Handler
    * Add unit test covering different connection scenarios
    * Add IBC module Interface and verify callbacks
    * Add inital Eventlogs similar to yui-solidity codebase
    * Add Owner premission to client registrations and port binding

* Inital light client implementation
    * Implement header verification
    * Add simple unit tests with data from archway testnets
    * Add proto encoding utils

* Change to BTP messages instead of commitments

* style: add code formatting by IDE

Signed-off-by: Night Owl <nightowl121@protonmail.com>

* refactor: simplify code

Signed-off-by: Night Owl <nightowl121@protonmail.com>

* docs: remove @dev tag in javadoc

Signed-off-by: Night Owl <nightowl121@protonmail.com>

* refactor: keep comments from previous version

Signed-off-by: Night Owl <nightowl121@protonmail.com>

* fix: explicitly specify dependency for local projects

Signed-off-by: Night Owl <nightowl121@protonmail.com>

* feat(javascore): Simple java score enabled protbuf library/parser.  (#58)

* Intial simple and unoptimized  parser finished

* Apply generated protoparser to IBC implementation
	* Fix issue with decoding byte array lenght
	* Fix issue with estimating size of a varInt
	* Use correct default values for proto messages

* Remove redundant CanonicalBlockID from tendermint proto

* fix: issues in imports while resolving merge conflicts

Signed-off-by: Night Owl <nightowl121@protonmail.com>

* feat(javascore): Use google protobuf for testing. (#82)

* feat(javascore): change IBC unitTests to use protoc generated proto

---------

Co-authored-by: Night Owl <nightowl121@protonmail.com>
Co-authored-by: red__larva <red.x.larva@protonmail.com>

---------

Signed-off-by: Night Owl <nightowl121@protonmail.com>
Co-authored-by: Night Owl <nightowl121@protonmail.com>
Co-authored-by: red__larva <red.x.larva@protonmail.com>

* feat(javascore): IIBC-108 Tendermint lightclient header verification unit tests (#125)

* Intial simple and unoptimized  parser finished

* Apply generated protoparser to IBC implementation
	* Fix issue with decoding byte array lenght
	* Fix issue with estimating size of a varInt
	* Use correct default values for proto messages

* Remove redundant CanonicalBlockID from tendermint proto

* change IBC unitTests to use protoc generated proto

* Extend the block header verification testing for tendermint lighclient

Add tests for adjacent block verification.
Add tests for malicous block updates and frezing client.
Adapt client structure to implement ILightClient.
Add temporary implementation of membership verification.

* Fix merge issues

* Remove tendermint interface implemenation to allow for unit tests at current stage

	In future branch verifyMembership should require positive result and return void

* Set chain score as a string

* feat(javascore): Adapt ibc core to icon lightclient (#141)

* Intial simple and unoptimized  parser finished

* Apply generated protoparser to IBC implementation
	* Fix issue with decoding byte array lenght
	* Fix issue with estimating size of a varInt
	* Use correct default values for proto messages

* Remove redundant CanonicalBlockID from tendermint proto

* change IBC unitTests to use protoc generated proto

* Extend the block header verification testing for tendermint lighclient

Add tests for adjacent block verification.
Add tests for malicous block updates and frezing client.
Adapt client structure to implement ILightClient.
Add temporary implementation of membership verification.

* Fix merge issues

* Remove tendermint interface implemenation to allow for unit tests at current stage

	In future branch verifyMembership should require positive result and return void

* Add simple mock lightclient to test handler logic

* remove built in height decoding in consensus state

* Adapt IBC core to lightclient design

	* Add request timeout to do "nonMembershipProofs"
	* Add timeoutPacket handle to core, handler and module interface
	* Remove deprecated rlp-proto structs
	* Adapt eventlog to fit relay design
	* Change most instance varaible DBs to static to get below variable limit in goloop

* Adapt client verification and update to fit java score

* Add null checks before proto decodings

---------

Co-authored-by: redlarva <91685111+redlarva@users.noreply.github.com>

* fix(javascore): fix method name used for encoding integers in javascore proto generator (#155)

fix(javascore): fix method name used for encoding integers in javascore prot generator

Signed-off-by: Night Owl <nightowl121@protonmail.com>

* Allow for version number during proto genenartion in java

---------

Signed-off-by: Night Owl <nightowl121@protonmail.com>
Co-authored-by: Hemanth Kumar <96766939+hemz10@users.noreply.github.com>
Co-authored-by: hemz10 <sph2740@example.com>
Co-authored-by: Prathiksha-Nataraja <90592522+Prathiksha-Nataraja@users.noreply.github.com>
Co-authored-by: shreyasbhat0 <shreyas.ks@hugobyte.com>
Co-authored-by: Shreyas S Bhat <35568964+shreyasbhat0@users.noreply.github.com>
Co-authored-by: Night Owl <91905208+nightowl121@users.noreply.github.com>
Co-authored-by: viveksharmapoudel <viveksharmapoudel@gmail.com>
Co-authored-by: Muhammed Irfan <50794925+MuhammedIrfan@users.noreply.github.com>
Co-authored-by: Night Owl <nightowl121@protonmail.com>
Co-authored-by: red__larva <red.x.larva@protonmail.com>
Co-authored-by: redlarva <91685111+redlarva@users.noreply.github.com>
  • Loading branch information
12 people authored Mar 29, 2023
1 parent a1a0d24 commit bfc6aba
Show file tree
Hide file tree
Showing 140 changed files with 33,249 additions and 2,713 deletions.
1 change: 1 addition & 0 deletions contracts/javascore/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ buildscript {
}
dependencies {
classpath("foundation.icon:gradle-javaee-plugin:$javaeePluginVersion")
classpath 'com.squareup.wire:wire-gradle-plugin:4.5.0'
}
}

Expand Down
8 changes: 8 additions & 0 deletions contracts/javascore/ibc/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@ dependencies {
implementation project(':lib')
implementation project(':score-util')

testImplementation 'com.google.protobuf:protobuf-javalite:3.13.0'
testImplementation 'foundation.icon:javaee-rt:0.9.3'
testImplementation("org.mockito:mockito-core:$mockitoCoreVersion")
testImplementation("org.mockito:mockito-inline:$mockitoCoreVersion")
testImplementation("foundation.icon:javaee-unittest:$javaeeUnittestVersion")
testAnnotationProcessor("foundation.icon:javaee-score-client:$scoreClientVersion")
testImplementation project(':test-lib')
Expand All @@ -32,6 +35,11 @@ jacocoTestReport {
}
}

tasks.named('compileJava') {
dependsOn(':score-util:jar')
dependsOn(':lib:jar')
}

optimizedJar {
mainClassName = 'ibc.ics25.handler.IBCHandler'
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
Expand Down
Original file line number Diff line number Diff line change
@@ -1,70 +1,72 @@
package ibc.ics02.client;

import ibc.icon.interfaces.IIBCClient;
import ibc.icon.interfaces.ILightClient;
import ibc.icon.score.util.ByteUtil;
import ibc.icon.score.util.Logger;
import ibc.icon.score.util.NullChecker;
import ibc.icon.structs.messages.*;
import ibc.icon.structs.messages.MsgCreateClient;
import ibc.icon.structs.messages.MsgUpdateClient;
import ibc.icon.structs.messages.UpdateClientResponse;
import ibc.ics24.host.IBCCommitment;
import ibc.ics24.host.IBCHost;
import icon.proto.core.client.Height;
import score.Address;
import score.Context;

import java.math.BigInteger;

public class IBCClient extends IBCHost implements IIBCClient {
public class IBCClient extends IBCHost {

Logger logger = new Logger("ibc-core");
static Logger logger = new Logger("ibc-core");

/**
* Registers a client to registry
*
* @param clientType Type of client
* @param lightClient Light client contract address
*/
public void registerClient(String clientType, Address lightClient) {
Context.require(clientRegistry.get(clientType) == null, "Already registered.");
clientRegistry.set(clientType, lightClient);
}

public String createClient(MsgCreateClient msg) {
String clientType = msg.clientType;
public String _createClient(MsgCreateClient msg) {
String clientType = msg.getClientType();
Address lightClientAddr = clientRegistry.get(clientType);
NullChecker.requireNotNull(lightClientAddr, "Register client before creation.");

String clientId = generateClientIdentifier(clientType);
logger.println("Create Client: ", " clientId: ", clientId);

clientTypes.set(clientId, msg.clientType);
clientTypes.set(clientId, msg.getClientType());
clientImplementations.set(clientId, lightClientAddr);
btpNetworkId.set(clientId, msg.getBtpNetworkId());
ILightClient client = getClient(clientId);
CreateClientResponse response = client.createClient(clientId, msg.clientState, msg.consensusState);
Context.require(response.ok);
UpdateClientResponse response = client.createClient(clientId, msg.getClientState(), msg.getConsensusState());

// update commitments
commitments.set(IBCCommitment.clientStateCommitmentKey(clientId), response.clientStateCommitment);
byte[] clientKey = IBCCommitment.clientStateCommitmentKey(clientId);
Height updateHeight = Height.decode(response.getHeight());
byte[] consensusKey = IBCCommitment.consensusStateCommitmentKey(clientId,
response.update.height.getRevisionNumber(), response.update.height.getRevisionHeight());
commitments.set(consensusKey, response.update.consensusStateCommitment);
updateHeight.getRevisionNumber(),
updateHeight.getRevisionHeight());

sendBTPMessage(clientId, ByteUtil.join(clientKey, response.getClientStateCommitment()));
sendBTPMessage(clientId, ByteUtil.join(consensusKey, response.getConsensusStateCommitment()));

return clientId;
}

public void updateClient(MsgUpdateClient msg) {
String clientId = msg.clientId;
public byte[] _updateClient(MsgUpdateClient msg) {
String clientId = msg.getClientId();
ILightClient client = getClient(clientId);

Context.require(commitments.get(IBCCommitment.clientStateCommitmentKey(clientId)) != null);
UpdateClientResponse response = client.updateClient(clientId, msg.clientMessage);
Context.require(response.ok);

// update commitments
commitments.set(IBCCommitment.clientStateCommitmentKey(clientId), response.clientStateCommitment);
for (ConsensusStateUpdate update : response.updates) {
byte[] consensusKey = IBCCommitment.consensusStateCommitmentKey(clientId, update.height.getRevisionNumber(),
update.height.getRevisionHeight());
commitments.set(consensusKey, update.consensusStateCommitment);
}
UpdateClientResponse response = client.updateClient(clientId, msg.getClientMessage());

byte[] clientKey = IBCCommitment.clientStateCommitmentKey(clientId);

Height updateHeight = Height.decode(response.getHeight());
byte[] consensusKey = IBCCommitment.consensusStateCommitmentKey(clientId,
updateHeight.getRevisionNumber(),
updateHeight.getRevisionHeight());

sendBTPMessage(clientId, ByteUtil.join(clientKey, response.getClientStateCommitment()));
sendBTPMessage(clientId, ByteUtil.join(consensusKey, response.getConsensusStateCommitment()));

return response.getHeight();
}

private String generateClientIdentifier(String clientType) {
Expand Down
Loading

0 comments on commit bfc6aba

Please sign in to comment.