Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Edit tendermint proto files to comply with non wasm clients #819

Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions contracts/javascore/ibc/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ dependencies {
implementation("foundation.icon:javaee-scorex:$scorexVersion")
implementation project(':lib')
implementation project(':score-util')
implementation project(':proto-lib')

testImplementation 'com.google.protobuf:protobuf-javalite:3.16.3'
testImplementation 'foundation.icon:javaee-rt:0.9.3'
Expand Down Expand Up @@ -45,6 +46,7 @@ jacocoTestReport {
tasks.named('compileJava') {
dependsOn(':score-util:jar')
dependsOn(':lib:jar')
dependsOn(':proto-lib:jar')
}

optimizedJar {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,26 +12,26 @@
import java.util.Map;
import java.util.function.Consumer;

import ibc.icon.structs.messages.*;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;

import foundation.icon.jsonrpc.model.TransactionResult;
import foundation.icon.score.client.DefaultScoreClient;
import foundation.icon.score.client.Wallet;
import ibc.icon.integration.ScoreIntegrationTest;
import ibc.icon.interfaces.IIBCChannelHandshakeScoreClient;
import ibc.icon.interfaces.IIBCClientScoreClient;
import ibc.icon.interfaces.IIBCConnectionScoreClient;
import ibc.icon.interfaces.IIBCHandlerScoreClient;
import ibc.icon.interfaces.IIBCHostScoreClient;
import ibc.icon.interfaces.IIBCPacketScoreClient;
import icon.proto.core.channel.Channel;
import icon.proto.core.channel.Packet;
import icon.proto.core.client.Height;
import icon.proto.core.connection.MerklePrefix;
import ibc.core.commitment.v1.MerklePrefix;
import icon.proto.core.connection.Version;
import foundation.icon.jsonrpc.model.TransactionResult;
import foundation.icon.score.client.DefaultScoreClient;
import foundation.icon.score.client.Wallet;
import ibc.icon.integration.ScoreIntegrationTest;
import icon.ibc.interfaces.IIBCChannelHandshakeScoreClient;
import icon.ibc.interfaces.IIBCClientScoreClient;
import icon.ibc.interfaces.IIBCConnectionScoreClient;
import icon.ibc.interfaces.IIBCHandlerScoreClient;
import icon.ibc.interfaces.IIBCHostScoreClient;
import icon.ibc.interfaces.IIBCPacketScoreClient;
import icon.ibc.structs.messages.*;
import score.Address;

public class IBCIntegrationTest implements ScoreIntegrationTest {
Expand Down Expand Up @@ -64,7 +64,7 @@ static void setup() throws Exception {
@Test
@Order(0)
void registerClient() {
getClientInterface(owner).registerClient(clientType, mockLightClient._address());
getClientInterface(owner).registerClient(clientType, mockLightClient._address(), 0);
}

@Test
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package ibc.ics02.client;

import ibc.icon.interfaces.ILightClient;
import ibc.icon.score.util.Logger;
import ibc.icon.score.util.NullChecker;
import ibc.icon.structs.messages.MsgCreateClient;
import ibc.icon.structs.messages.MsgUpdateClient;
import ibc.ics24.host.IBCHost;
import ibc.ics24.host.IBCStore;
import icon.ibc.interfaces.ILightClient;
import icon.ibc.structs.messages.MsgCreateClient;
import icon.ibc.structs.messages.MsgUpdateClient;
import score.Address;
import score.Context;

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

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

public void registerClient(String clientType, Address lightClient) {
public void registerClient(String clientType, Address lightClient, int hashType) {
Context.require(clientRegistry.get(clientType) == null, "Already registered.");
clientRegistry.set(clientType, lightClient);
IBCStore.hashType.set(clientType, hashType);
}

public String _createClient(MsgCreateClient msg) {
Expand All @@ -32,6 +34,7 @@ public String _createClient(MsgCreateClient msg) {
clientTypes.set(clientId, msg.getClientType());
clientImplementations.set(clientId, lightClientAddr);
btpNetworkId.set(clientId, msg.getBtpNetworkId());
// hashMethod.set(clientId, msg.getHashMethod());

ILightClient client = getClient(clientId);
client.createClient(clientId, msg.getClientState(), msg.getConsensusState());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,29 +1,36 @@
package ibc.ics03.connection;

import java.math.BigInteger;
import java.util.Arrays;
import java.util.List;

import ibc.icon.interfaces.ILightClient;
import ibc.icon.score.util.ByteUtil;
import ibc.icon.score.util.Logger;
import ibc.icon.structs.messages.MsgConnectionOpenAck;
import ibc.icon.structs.messages.MsgConnectionOpenConfirm;
import ibc.icon.structs.messages.MsgConnectionOpenInit;
import ibc.icon.structs.messages.MsgConnectionOpenTry;
import ibc.ics02.client.IBCClient;
import ibc.ics24.host.IBCCommitment;
import icon.proto.core.client.Height;
import icon.proto.core.connection.ConnectionEnd;
import icon.proto.core.connection.Counterparty;
import icon.proto.core.connection.Version;
import ibc.core.commitment.v1.MerklePrefix;
import ibc.icon.score.util.ByteUtil;
import ibc.icon.score.util.Logger;
import ibc.ics02.client.IBCClient;
import ibc.ics24.host.IBCCommitment;
import ibc.ics24.host.IBCHost;
import icon.ibc.interfaces.ILightClient;
import icon.ibc.structs.messages.MsgConnectionOpenAck;
import icon.ibc.structs.messages.MsgConnectionOpenConfirm;
import icon.ibc.structs.messages.MsgConnectionOpenInit;
import icon.ibc.structs.messages.MsgConnectionOpenTry;
import score.Context;
import scorex.util.ArrayList;

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

public static final MerklePrefix ICS08PREFIX = new MerklePrefix();
static {
ICS08PREFIX.setKeyPrefix("ibc".getBytes());

}

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

public String _connectionOpenInit(MsgConnectionOpenInit msg) {
Expand Down Expand Up @@ -67,6 +74,9 @@ public String _connectionOpenTry(MsgConnectionOpenTry msg) {
Counterparty expectedCounterparty = new Counterparty();
expectedCounterparty.setClientId(msg.getClientId());
expectedCounterparty.setConnectionId("");
if (IBCCommitment.getHashType(msg.getClientId()) == IBCHost.HashType.ICS08.type) {
expectedCounterparty.setPrefix(ICS08PREFIX);
}

ConnectionEnd expectedConnection = new ConnectionEnd();
expectedConnection.setClientId(counterparty.getClientId());
Expand Down Expand Up @@ -108,6 +118,9 @@ public byte[] _connectionOpenAck(MsgConnectionOpenAck msg) {
Counterparty expectedCounterparty = new Counterparty();
expectedCounterparty.setClientId(connection.getClientId());
expectedCounterparty.setConnectionId(msg.getConnectionId());
if (IBCCommitment.getHashType(connection.getClientId()) == IBCHost.HashType.ICS08.type) {
expectedCounterparty.setPrefix(ICS08PREFIX);
}

ConnectionEnd expectedConnection = new ConnectionEnd();
expectedConnection.setClientId(connection.getCounterparty().getClientId());
Expand Down Expand Up @@ -150,6 +163,9 @@ public byte[] _connectionOpenConfirm(MsgConnectionOpenConfirm msg) {
Counterparty expectedCounterparty = new Counterparty();
expectedCounterparty.setClientId(connection.getClientId());
expectedCounterparty.setConnectionId(msg.getConnectionId());
if (IBCCommitment.getHashType(connection.getClientId()) == IBCHost.HashType.ICS08.type) {
expectedCounterparty.setPrefix(ICS08PREFIX);
}

ConnectionEnd expectedConnection = new ConnectionEnd();
expectedConnection.setClientId(connection.getCounterparty().getClientId());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,16 @@
import java.math.BigInteger;
import java.util.List;

import ibc.icon.interfaces.ILightClient;
import ibc.icon.score.util.ByteUtil;
import ibc.icon.structs.messages.MsgChannelCloseConfirm;
import ibc.icon.structs.messages.MsgChannelCloseInit;
import ibc.icon.structs.messages.MsgChannelOpenAck;
import ibc.icon.structs.messages.MsgChannelOpenConfirm;
import ibc.icon.structs.messages.MsgChannelOpenInit;
import ibc.icon.structs.messages.MsgChannelOpenTry;
import icon.proto.core.channel.Channel;
import icon.proto.core.connection.ConnectionEnd;
import ibc.icon.score.util.ByteUtil;
import icon.ibc.interfaces.ILightClient;
import icon.ibc.structs.messages.MsgChannelCloseConfirm;
import icon.ibc.structs.messages.MsgChannelCloseInit;
import icon.ibc.structs.messages.MsgChannelOpenAck;
import icon.ibc.structs.messages.MsgChannelOpenConfirm;
import icon.ibc.structs.messages.MsgChannelOpenInit;
import icon.ibc.structs.messages.MsgChannelOpenTry;
import ibc.ics03.connection.IBCConnection;
import ibc.ics24.host.IBCCommitment;
import score.Context;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,22 @@
package ibc.ics04.channel;

import ibc.icon.interfaces.ILightClient;
import ibc.icon.score.util.ByteUtil;
import ibc.icon.score.util.Proto;
import ibc.icon.structs.messages.MsgRequestTimeoutPacket;
import ibc.ics24.host.IBCCommitment;
import icon.proto.core.channel.Channel;
import icon.proto.core.channel.Packet;
import icon.proto.core.client.Height;
import icon.proto.core.connection.ConnectionEnd;
import ibc.ics24.host.IBCHost;
import icon.ibc.interfaces.ILightClient;
import icon.ibc.structs.messages.MsgRequestTimeoutPacket;
import score.Context;
import score.DictDB;

import java.math.BigInteger;
import java.util.Arrays;

import icon.proto.core.channel.Channel;
import icon.proto.core.channel.Packet;
import icon.proto.core.client.Height;
import icon.proto.core.connection.ConnectionEnd;

public class IBCPacket extends IBCChannelHandshake {

public void _sendPacket(Packet packet) {
Expand Down Expand Up @@ -57,7 +59,7 @@ public void _sendPacket(Packet packet) {
packet.getSourceChannel(),
packet.getSequence());

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

byte[] commitmentPath = IBCCommitment.packetCommitmentPath(packet.getSourcePort(),
packet.getSourceChannel(), packet.getSequence());
byte[] commitmentBytes = createPacketCommitmentBytes(packet);
byte[] commitmentBytes = createPacketCommitmentBytes(connection.getClientId(), packet);

verifyPacketCommitment(
connection,
Expand Down Expand Up @@ -144,7 +146,7 @@ public void _writeAcknowledgement(String destinationPortId, String destinationCh
byte[] ackCommitmentKey = IBCCommitment.packetAcknowledgementCommitmentKey(destinationPortId,
destinationChannel, sequence);
Context.require(commitments.get(ackCommitmentKey) == null, "acknowledgement for packet already exists");
byte[] ackCommitment = IBCCommitment.keccak256(acknowledgement);
byte[] ackCommitment = createAcknowledgmentCommitment(connection.getClientId(), acknowledgement);
commitments.set(ackCommitmentKey, ackCommitment);
ackHeights.at(destinationPortId).at(destinationChannel).set(sequence,
Context.getBlockHeight());
Expand Down Expand Up @@ -173,18 +175,19 @@ public void _acknowledgePacket(Packet packet, byte[] acknowledgement, byte[] pro
packet.getSourceChannel(), packet.getSequence());
byte[] packetCommitment = commitments.get(packetCommitmentKey);
Context.require(packetCommitment != null, "packet commitment not found");
byte[] commitment = createPacketCommitment(packet);
byte[] commitment = createPacketCommitment(connection.getClientId(), packet);

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

byte[] packetAckPath = IBCCommitment.packetAcknowledgementCommitmentPath(packet.getDestinationPort(),
packet.getDestinationChannel(), packet.getSequence());
byte[] commitmentBytes = createAcknowledgmentCommitmentBytes(connection.getClientId(), acknowledgement);
verifyPacketAcknowledgement(
connection,
proofHeight,
proof,
packetAckPath,
acknowledgement);
commitmentBytes);

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

byte[] commitmentPath = IBCCommitment.packetCommitmentPath(packet.getSourcePort(),
packet.getSourceChannel(), packet.getSequence());
byte[] commitmentBytes = createPacketCommitmentBytes(packet);
byte[] commitmentBytes = createPacketCommitmentBytes(connection.getClientId(), packet);
verifyPacketCommitment(
connection,
proofHeight,
Expand Down Expand Up @@ -299,7 +302,7 @@ public void _timeoutPacket(Packet packet, byte[] proofHeight, byte[] proof, BigI
packet.getSourceChannel(), packet.getSequence());
byte[] packetCommitment = commitments.get(packetCommitmentKey);
Context.require(packetCommitment != null, "packet commitment not found");
byte[] commitment = createPacketCommitment(packet);
byte[] commitment = createPacketCommitment(connection.getClientId(), packet);

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

Expand Down Expand Up @@ -431,11 +434,20 @@ private BigInteger calcBlockDelay(BigInteger timeDelay) {
return blockDelay;
}

private byte[] createPacketCommitment(Packet packet) {
return IBCCommitment.keccak256(createPacketCommitmentBytes(packet));
private byte[] createPacketCommitment(String clientId, Packet packet) {
return IBCCommitment.keccak256(createPacketCommitmentBytes(clientId, packet));
}

private byte[] createPacketCommitmentBytes(String clientId, Packet packet) {
int hashType = IBCCommitment.getHashType(clientId);
if (hashType == IBCHost.HashType.ICS08.type) {
return createIBCPacketCommitmentBytes(packet);
}

return createWasmPacketCommitmentBytes(packet);
}

public static byte[] createPacketCommitmentBytes(Packet packet) {
public static byte[] createWasmPacketCommitmentBytes(Packet packet) {
return ByteUtil.join(
Proto.encodeFixed64(packet.getTimeoutTimestamp(), false),
Proto.encodeFixed64(packet.getTimeoutHeight().getRevisionNumber(),
Expand All @@ -445,6 +457,29 @@ public static byte[] createPacketCommitmentBytes(Packet packet) {
IBCCommitment.keccak256(packet.getData()));
}

public static byte[] createIBCPacketCommitmentBytes(Packet packet) {
return IBCCommitment.sha256(ByteUtil.join(
Proto.encodeFixed64(packet.getTimeoutTimestamp(), false),
Proto.encodeFixed64(packet.getTimeoutHeight().getRevisionNumber(),
false),
Proto.encodeFixed64(packet.getTimeoutHeight().getRevisionHeight(),
false),
IBCCommitment.sha256(packet.getData())));
}

private byte[] createAcknowledgmentCommitment(String clientId, byte[] ack) {
return IBCCommitment.keccak256(createAcknowledgmentCommitmentBytes(clientId, ack));
}

public static byte[] createAcknowledgmentCommitmentBytes(String clientId, byte[] ack) {
int hashType = IBCCommitment.getHashType(clientId);
if (hashType == IBCHost.HashType.ICS08.type) {
return IBCCommitment.sha256(ack);
}

return ack;
}

private boolean lt(Height h1, Height h2) {
return h1.getRevisionNumber().compareTo(h2.getRevisionNumber()) < 0
|| (h1.getRevisionNumber().equals(h2.getRevisionNumber())
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package ibc.ics05.port;

import ibc.icon.interfaces.IIBCModuleScoreInterface;
import ibc.icon.score.util.StringUtil;
import icon.ibc.interfaces.IIBCModuleScoreInterface;
import score.Address;

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package ibc.ics23.commitment;

import icon.proto.core.commitment.*;
import cosmos.ics23.v1.*;
import score.Context;
import scorex.util.ArrayList;
import scorex.util.HashMap;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package ibc.ics23.commitment;

import icon.proto.core.commitment.*;
import cosmos.ics23.v1.*;
import score.UserRevertedException;
import scorex.util.ArrayList;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import ibc.icon.score.util.ByteUtil;
import ibc.icon.score.util.Proto;
import icon.proto.core.commitment.*;
import cosmos.ics23.v1.*;
import score.Context;
import score.UserRevertedException;

Expand Down Expand Up @@ -42,7 +42,7 @@ public static byte[] doHashOrNoop(int hashOp, byte[] preImage) {
public static byte[] doHash(int hashOp, byte[] preImage) {
if (hashOp == HashOp.SHA256) {
return Context.hash("sha-256", preImage);
} else if (hashOp == HashOp.KECCAK) {
} else if (hashOp == HashOp.KECCAK256) {
return Context.hash("keccak-256", preImage);
} else if (hashOp == HashOp.RIPEMD160) {
throw new UserRevertedException("RIPEMD160 hash not supported");
Expand Down
Loading
Loading