Skip to content

Commit feebe68

Browse files
authored
Merge pull request #819 from icon-project/805-create-ics-08-compatible-tendermint-lightclient-in-java
feat: Edit tendermint proto files to comply with non wasm clients
2 parents 3767742 + a3e9605 commit feebe68

File tree

456 files changed

+72361
-918
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

456 files changed

+72361
-918
lines changed

contracts/javascore/ibc/build.gradle

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ dependencies {
55
implementation("foundation.icon:javaee-scorex:$scorexVersion")
66
implementation project(':lib')
77
implementation project(':score-util')
8+
implementation project(':proto-lib')
89

910
testImplementation 'com.google.protobuf:protobuf-javalite:3.16.3'
1011
testImplementation 'foundation.icon:javaee-rt:0.9.3'
@@ -45,6 +46,7 @@ jacocoTestReport {
4546
tasks.named('compileJava') {
4647
dependsOn(':score-util:jar')
4748
dependsOn(':lib:jar')
49+
dependsOn(':proto-lib:jar')
4850
}
4951

5052
optimizedJar {

contracts/javascore/ibc/src/intTest/java/ibc/core/integration/IBCIntegrationTest.java

+13-13
Original file line numberDiff line numberDiff line change
@@ -12,26 +12,26 @@
1212
import java.util.Map;
1313
import java.util.function.Consumer;
1414

15-
import ibc.icon.structs.messages.*;
1615
import org.junit.jupiter.api.BeforeAll;
1716
import org.junit.jupiter.api.Order;
1817
import org.junit.jupiter.api.Test;
1918

20-
import foundation.icon.jsonrpc.model.TransactionResult;
21-
import foundation.icon.score.client.DefaultScoreClient;
22-
import foundation.icon.score.client.Wallet;
23-
import ibc.icon.integration.ScoreIntegrationTest;
24-
import ibc.icon.interfaces.IIBCChannelHandshakeScoreClient;
25-
import ibc.icon.interfaces.IIBCClientScoreClient;
26-
import ibc.icon.interfaces.IIBCConnectionScoreClient;
27-
import ibc.icon.interfaces.IIBCHandlerScoreClient;
28-
import ibc.icon.interfaces.IIBCHostScoreClient;
29-
import ibc.icon.interfaces.IIBCPacketScoreClient;
3019
import icon.proto.core.channel.Channel;
3120
import icon.proto.core.channel.Packet;
3221
import icon.proto.core.client.Height;
33-
import icon.proto.core.connection.MerklePrefix;
22+
import ibc.core.commitment.v1.MerklePrefix;
3423
import icon.proto.core.connection.Version;
24+
import foundation.icon.jsonrpc.model.TransactionResult;
25+
import foundation.icon.score.client.DefaultScoreClient;
26+
import foundation.icon.score.client.Wallet;
27+
import ibc.icon.integration.ScoreIntegrationTest;
28+
import icon.ibc.interfaces.IIBCChannelHandshakeScoreClient;
29+
import icon.ibc.interfaces.IIBCClientScoreClient;
30+
import icon.ibc.interfaces.IIBCConnectionScoreClient;
31+
import icon.ibc.interfaces.IIBCHandlerScoreClient;
32+
import icon.ibc.interfaces.IIBCHostScoreClient;
33+
import icon.ibc.interfaces.IIBCPacketScoreClient;
34+
import icon.ibc.structs.messages.*;
3535
import score.Address;
3636

3737
public class IBCIntegrationTest implements ScoreIntegrationTest {
@@ -64,7 +64,7 @@ static void setup() throws Exception {
6464
@Test
6565
@Order(0)
6666
void registerClient() {
67-
getClientInterface(owner).registerClient(clientType, mockLightClient._address());
67+
getClientInterface(owner).registerClient(clientType, mockLightClient._address(), 0);
6868
}
6969

7070
@Test

contracts/javascore/ibc/src/main/java/ibc/ics02/client/IBCClient.java

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package ibc.ics02.client;
22

3-
import ibc.icon.interfaces.ILightClient;
43
import ibc.icon.score.util.Logger;
54
import ibc.icon.score.util.NullChecker;
6-
import ibc.icon.structs.messages.MsgCreateClient;
7-
import ibc.icon.structs.messages.MsgUpdateClient;
85
import ibc.ics24.host.IBCHost;
6+
import ibc.ics24.host.IBCStore;
7+
import icon.ibc.interfaces.ILightClient;
8+
import icon.ibc.structs.messages.MsgCreateClient;
9+
import icon.ibc.structs.messages.MsgUpdateClient;
910
import score.Address;
1011
import score.Context;
1112

@@ -16,9 +17,10 @@ public class IBCClient extends IBCHost {
1617

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

19-
public void registerClient(String clientType, Address lightClient) {
20+
public void registerClient(String clientType, Address lightClient, int hashType) {
2021
Context.require(clientRegistry.get(clientType) == null, "Already registered.");
2122
clientRegistry.set(clientType, lightClient);
23+
IBCStore.hashType.set(clientType, hashType);
2224
}
2325

2426
public String _createClient(MsgCreateClient msg) {
@@ -32,6 +34,7 @@ public String _createClient(MsgCreateClient msg) {
3234
clientTypes.set(clientId, msg.getClientType());
3335
clientImplementations.set(clientId, lightClientAddr);
3436
btpNetworkId.set(clientId, msg.getBtpNetworkId());
37+
// hashMethod.set(clientId, msg.getHashMethod());
3538

3639
ILightClient client = getClient(clientId);
3740
client.createClient(clientId, msg.getClientState(), msg.getConsensusState());

contracts/javascore/ibc/src/main/java/ibc/ics03/connection/IBCConnection.java

+26-10
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,36 @@
11
package ibc.ics03.connection;
22

33
import java.math.BigInteger;
4-
import java.util.Arrays;
54
import java.util.List;
65

7-
import ibc.icon.interfaces.ILightClient;
8-
import ibc.icon.score.util.ByteUtil;
9-
import ibc.icon.score.util.Logger;
10-
import ibc.icon.structs.messages.MsgConnectionOpenAck;
11-
import ibc.icon.structs.messages.MsgConnectionOpenConfirm;
12-
import ibc.icon.structs.messages.MsgConnectionOpenInit;
13-
import ibc.icon.structs.messages.MsgConnectionOpenTry;
14-
import ibc.ics02.client.IBCClient;
15-
import ibc.ics24.host.IBCCommitment;
166
import icon.proto.core.client.Height;
177
import icon.proto.core.connection.ConnectionEnd;
188
import icon.proto.core.connection.Counterparty;
199
import icon.proto.core.connection.Version;
10+
import ibc.core.commitment.v1.MerklePrefix;
11+
import ibc.icon.score.util.ByteUtil;
12+
import ibc.icon.score.util.Logger;
13+
import ibc.ics02.client.IBCClient;
14+
import ibc.ics24.host.IBCCommitment;
15+
import ibc.ics24.host.IBCHost;
16+
import icon.ibc.interfaces.ILightClient;
17+
import icon.ibc.structs.messages.MsgConnectionOpenAck;
18+
import icon.ibc.structs.messages.MsgConnectionOpenConfirm;
19+
import icon.ibc.structs.messages.MsgConnectionOpenInit;
20+
import icon.ibc.structs.messages.MsgConnectionOpenTry;
2021
import score.Context;
2122
import scorex.util.ArrayList;
2223

2324
public class IBCConnection extends IBCClient {
2425
public static final String v1Identifier = "1";
2526
public static final List<String> supportedV1Features = List.of("ORDER_ORDERED", "ORDER_UNORDERED");
2627

28+
public static final MerklePrefix ICS08PREFIX = new MerklePrefix();
29+
static {
30+
ICS08PREFIX.setKeyPrefix("ibc".getBytes());
31+
32+
}
33+
2734
Logger logger = new Logger("ibc-core");
2835

2936
public String _connectionOpenInit(MsgConnectionOpenInit msg) {
@@ -67,6 +74,9 @@ public String _connectionOpenTry(MsgConnectionOpenTry msg) {
6774
Counterparty expectedCounterparty = new Counterparty();
6875
expectedCounterparty.setClientId(msg.getClientId());
6976
expectedCounterparty.setConnectionId("");
77+
if (IBCCommitment.getHashType(msg.getClientId()) == IBCHost.HashType.ICS08.type) {
78+
expectedCounterparty.setPrefix(ICS08PREFIX);
79+
}
7080

7181
ConnectionEnd expectedConnection = new ConnectionEnd();
7282
expectedConnection.setClientId(counterparty.getClientId());
@@ -108,6 +118,9 @@ public byte[] _connectionOpenAck(MsgConnectionOpenAck msg) {
108118
Counterparty expectedCounterparty = new Counterparty();
109119
expectedCounterparty.setClientId(connection.getClientId());
110120
expectedCounterparty.setConnectionId(msg.getConnectionId());
121+
if (IBCCommitment.getHashType(connection.getClientId()) == IBCHost.HashType.ICS08.type) {
122+
expectedCounterparty.setPrefix(ICS08PREFIX);
123+
}
111124

112125
ConnectionEnd expectedConnection = new ConnectionEnd();
113126
expectedConnection.setClientId(connection.getCounterparty().getClientId());
@@ -150,6 +163,9 @@ public byte[] _connectionOpenConfirm(MsgConnectionOpenConfirm msg) {
150163
Counterparty expectedCounterparty = new Counterparty();
151164
expectedCounterparty.setClientId(connection.getClientId());
152165
expectedCounterparty.setConnectionId(msg.getConnectionId());
166+
if (IBCCommitment.getHashType(connection.getClientId()) == IBCHost.HashType.ICS08.type) {
167+
expectedCounterparty.setPrefix(ICS08PREFIX);
168+
}
153169

154170
ConnectionEnd expectedConnection = new ConnectionEnd();
155171
expectedConnection.setClientId(connection.getCounterparty().getClientId());

contracts/javascore/ibc/src/main/java/ibc/ics04/channel/IBCChannelHandshake.java

+8-8
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@
33
import java.math.BigInteger;
44
import java.util.List;
55

6-
import ibc.icon.interfaces.ILightClient;
7-
import ibc.icon.score.util.ByteUtil;
8-
import ibc.icon.structs.messages.MsgChannelCloseConfirm;
9-
import ibc.icon.structs.messages.MsgChannelCloseInit;
10-
import ibc.icon.structs.messages.MsgChannelOpenAck;
11-
import ibc.icon.structs.messages.MsgChannelOpenConfirm;
12-
import ibc.icon.structs.messages.MsgChannelOpenInit;
13-
import ibc.icon.structs.messages.MsgChannelOpenTry;
146
import icon.proto.core.channel.Channel;
157
import icon.proto.core.connection.ConnectionEnd;
8+
import ibc.icon.score.util.ByteUtil;
9+
import icon.ibc.interfaces.ILightClient;
10+
import icon.ibc.structs.messages.MsgChannelCloseConfirm;
11+
import icon.ibc.structs.messages.MsgChannelCloseInit;
12+
import icon.ibc.structs.messages.MsgChannelOpenAck;
13+
import icon.ibc.structs.messages.MsgChannelOpenConfirm;
14+
import icon.ibc.structs.messages.MsgChannelOpenInit;
15+
import icon.ibc.structs.messages.MsgChannelOpenTry;
1616
import ibc.ics03.connection.IBCConnection;
1717
import ibc.ics24.host.IBCCommitment;
1818
import score.Context;

contracts/javascore/ibc/src/main/java/ibc/ics04/channel/IBCPacket.java

+51-16
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
package ibc.ics04.channel;
22

3-
import ibc.icon.interfaces.ILightClient;
43
import ibc.icon.score.util.ByteUtil;
54
import ibc.icon.score.util.Proto;
6-
import ibc.icon.structs.messages.MsgRequestTimeoutPacket;
75
import ibc.ics24.host.IBCCommitment;
8-
import icon.proto.core.channel.Channel;
9-
import icon.proto.core.channel.Packet;
10-
import icon.proto.core.client.Height;
11-
import icon.proto.core.connection.ConnectionEnd;
6+
import ibc.ics24.host.IBCHost;
7+
import icon.ibc.interfaces.ILightClient;
8+
import icon.ibc.structs.messages.MsgRequestTimeoutPacket;
129
import score.Context;
1310
import score.DictDB;
1411

1512
import java.math.BigInteger;
1613
import java.util.Arrays;
1714

15+
import icon.proto.core.channel.Channel;
16+
import icon.proto.core.channel.Packet;
17+
import icon.proto.core.client.Height;
18+
import icon.proto.core.connection.ConnectionEnd;
19+
1820
public class IBCPacket extends IBCChannelHandshake {
1921

2022
public void _sendPacket(Packet packet) {
@@ -57,7 +59,7 @@ public void _sendPacket(Packet packet) {
5759
packet.getSourceChannel(),
5860
packet.getSequence());
5961

60-
byte[] packetCommitment = createPacketCommitment(packet);
62+
byte[] packetCommitment = createPacketCommitment(connection.getClientId(), packet);
6163
commitments.set(packetCommitmentKey, packetCommitment);
6264
packetHeights.at(packet.getSourcePort()).at(packet.getSourceChannel()).set(packet.getSequence(),
6365
Context.getBlockHeight());
@@ -98,7 +100,7 @@ public void _recvPacket(Packet packet, byte[] proof, byte[] proofHeight) {
98100

99101
byte[] commitmentPath = IBCCommitment.packetCommitmentPath(packet.getSourcePort(),
100102
packet.getSourceChannel(), packet.getSequence());
101-
byte[] commitmentBytes = createPacketCommitmentBytes(packet);
103+
byte[] commitmentBytes = createPacketCommitmentBytes(connection.getClientId(), packet);
102104

103105
verifyPacketCommitment(
104106
connection,
@@ -144,7 +146,7 @@ public void _writeAcknowledgement(String destinationPortId, String destinationCh
144146
byte[] ackCommitmentKey = IBCCommitment.packetAcknowledgementCommitmentKey(destinationPortId,
145147
destinationChannel, sequence);
146148
Context.require(commitments.get(ackCommitmentKey) == null, "acknowledgement for packet already exists");
147-
byte[] ackCommitment = IBCCommitment.keccak256(acknowledgement);
149+
byte[] ackCommitment = createAcknowledgmentCommitment(connection.getClientId(), acknowledgement);
148150
commitments.set(ackCommitmentKey, ackCommitment);
149151
ackHeights.at(destinationPortId).at(destinationChannel).set(sequence,
150152
Context.getBlockHeight());
@@ -173,18 +175,19 @@ public void _acknowledgePacket(Packet packet, byte[] acknowledgement, byte[] pro
173175
packet.getSourceChannel(), packet.getSequence());
174176
byte[] packetCommitment = commitments.get(packetCommitmentKey);
175177
Context.require(packetCommitment != null, "packet commitment not found");
176-
byte[] commitment = createPacketCommitment(packet);
178+
byte[] commitment = createPacketCommitment(connection.getClientId(), packet);
177179

178180
Context.require(Arrays.equals(packetCommitment, commitment), "commitment byte[] are not equal");
179181

180182
byte[] packetAckPath = IBCCommitment.packetAcknowledgementCommitmentPath(packet.getDestinationPort(),
181183
packet.getDestinationChannel(), packet.getSequence());
184+
byte[] commitmentBytes = createAcknowledgmentCommitmentBytes(connection.getClientId(), acknowledgement);
182185
verifyPacketAcknowledgement(
183186
connection,
184187
proofHeight,
185188
proof,
186189
packetAckPath,
187-
acknowledgement);
190+
commitmentBytes);
188191

189192
if (channel.getOrdering() == Channel.Order.ORDER_ORDERED) {
190193
DictDB<String, BigInteger> nextSequenceAckSourcePort = nextSequenceAcknowledgements
@@ -235,7 +238,7 @@ public void _requestTimeout(MsgRequestTimeoutPacket msg) {
235238

236239
byte[] commitmentPath = IBCCommitment.packetCommitmentPath(packet.getSourcePort(),
237240
packet.getSourceChannel(), packet.getSequence());
238-
byte[] commitmentBytes = createPacketCommitmentBytes(packet);
241+
byte[] commitmentBytes = createPacketCommitmentBytes(connection.getClientId(), packet);
239242
verifyPacketCommitment(
240243
connection,
241244
proofHeight,
@@ -299,7 +302,7 @@ public void _timeoutPacket(Packet packet, byte[] proofHeight, byte[] proof, BigI
299302
packet.getSourceChannel(), packet.getSequence());
300303
byte[] packetCommitment = commitments.get(packetCommitmentKey);
301304
Context.require(packetCommitment != null, "packet commitment not found");
302-
byte[] commitment = createPacketCommitment(packet);
305+
byte[] commitment = createPacketCommitment(connection.getClientId(), packet);
303306

304307
Context.require(Arrays.equals(packetCommitment, commitment), "commitment byte[] are not equal");
305308

@@ -431,11 +434,20 @@ private BigInteger calcBlockDelay(BigInteger timeDelay) {
431434
return blockDelay;
432435
}
433436

434-
private byte[] createPacketCommitment(Packet packet) {
435-
return IBCCommitment.keccak256(createPacketCommitmentBytes(packet));
437+
private byte[] createPacketCommitment(String clientId, Packet packet) {
438+
return IBCCommitment.keccak256(createPacketCommitmentBytes(clientId, packet));
439+
}
440+
441+
private byte[] createPacketCommitmentBytes(String clientId, Packet packet) {
442+
int hashType = IBCCommitment.getHashType(clientId);
443+
if (hashType == IBCHost.HashType.ICS08.type) {
444+
return createIBCPacketCommitmentBytes(packet);
445+
}
446+
447+
return createWasmPacketCommitmentBytes(packet);
436448
}
437449

438-
public static byte[] createPacketCommitmentBytes(Packet packet) {
450+
public static byte[] createWasmPacketCommitmentBytes(Packet packet) {
439451
return ByteUtil.join(
440452
Proto.encodeFixed64(packet.getTimeoutTimestamp(), false),
441453
Proto.encodeFixed64(packet.getTimeoutHeight().getRevisionNumber(),
@@ -445,6 +457,29 @@ public static byte[] createPacketCommitmentBytes(Packet packet) {
445457
IBCCommitment.keccak256(packet.getData()));
446458
}
447459

460+
public static byte[] createIBCPacketCommitmentBytes(Packet packet) {
461+
return IBCCommitment.sha256(ByteUtil.join(
462+
Proto.encodeFixed64(packet.getTimeoutTimestamp(), false),
463+
Proto.encodeFixed64(packet.getTimeoutHeight().getRevisionNumber(),
464+
false),
465+
Proto.encodeFixed64(packet.getTimeoutHeight().getRevisionHeight(),
466+
false),
467+
IBCCommitment.sha256(packet.getData())));
468+
}
469+
470+
private byte[] createAcknowledgmentCommitment(String clientId, byte[] ack) {
471+
return IBCCommitment.keccak256(createAcknowledgmentCommitmentBytes(clientId, ack));
472+
}
473+
474+
public static byte[] createAcknowledgmentCommitmentBytes(String clientId, byte[] ack) {
475+
int hashType = IBCCommitment.getHashType(clientId);
476+
if (hashType == IBCHost.HashType.ICS08.type) {
477+
return IBCCommitment.sha256(ack);
478+
}
479+
480+
return ack;
481+
}
482+
448483
private boolean lt(Height h1, Height h2) {
449484
return h1.getRevisionNumber().compareTo(h2.getRevisionNumber()) < 0
450485
|| (h1.getRevisionNumber().equals(h2.getRevisionNumber())

contracts/javascore/ibc/src/main/java/ibc/ics05/port/ModuleManager.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package ibc.ics05.port;
22

3-
import ibc.icon.interfaces.IIBCModuleScoreInterface;
43
import ibc.icon.score.util.StringUtil;
4+
import icon.ibc.interfaces.IIBCModuleScoreInterface;
55
import score.Address;
66

77
/**

contracts/javascore/ibc/src/main/java/ibc/ics23/commitment/Compress.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package ibc.ics23.commitment;
22

3-
import icon.proto.core.commitment.*;
3+
import cosmos.ics23.v1.*;
44
import score.Context;
55
import scorex.util.ArrayList;
66
import scorex.util.HashMap;

contracts/javascore/ibc/src/main/java/ibc/ics23/commitment/Ics23.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package ibc.ics23.commitment;
22

3-
import icon.proto.core.commitment.*;
3+
import cosmos.ics23.v1.*;
44
import score.UserRevertedException;
55
import scorex.util.ArrayList;
66

contracts/javascore/ibc/src/main/java/ibc/ics23/commitment/Ops.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import ibc.icon.score.util.ByteUtil;
44
import ibc.icon.score.util.Proto;
5-
import icon.proto.core.commitment.*;
5+
import cosmos.ics23.v1.*;
66
import score.Context;
77
import score.UserRevertedException;
88

@@ -42,7 +42,7 @@ public static byte[] doHashOrNoop(int hashOp, byte[] preImage) {
4242
public static byte[] doHash(int hashOp, byte[] preImage) {
4343
if (hashOp == HashOp.SHA256) {
4444
return Context.hash("sha-256", preImage);
45-
} else if (hashOp == HashOp.KECCAK) {
45+
} else if (hashOp == HashOp.KECCAK256) {
4646
return Context.hash("keccak-256", preImage);
4747
} else if (hashOp == HashOp.RIPEMD160) {
4848
throw new UserRevertedException("RIPEMD160 hash not supported");

0 commit comments

Comments
 (0)