Skip to content

Commit 4a2503c

Browse files
authored
Merge pull request #421 from icon-project/fix/aggregator_audit
fix: aggregator audit changes
2 parents c72a550 + 9dfbb74 commit 4a2503c

File tree

3 files changed

+321
-330
lines changed

3 files changed

+321
-330
lines changed

contracts/javascore/aggregator/src/main/java/relay/aggregator/Packet.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.math.BigInteger;
44

5+
import score.ByteArrayObjectWriter;
56
import score.Context;
67
import score.ObjectReader;
78
import score.ObjectWriter;
@@ -66,8 +67,6 @@ public Packet(String srcNetwork, String srcContractAddress, BigInteger srcSn, Bi
6667
|| srcHeight == null || dstNetwork == null || dstContractAddress == null || data == null;
6768
Context.require(!isIllegalArg,
6869
"srcNetwork, contractAddress, srcSn, srcHeight, dstNetwork, and data cannot be null");
69-
if (isIllegalArg) {
70-
}
7170
this.srcNetwork = srcNetwork;
7271
this.srcContractAddress = srcContractAddress;
7372
this.srcSn = srcSn;
@@ -77,12 +76,8 @@ public Packet(String srcNetwork, String srcContractAddress, BigInteger srcSn, Bi
7776
this.data = data;
7877
}
7978

80-
public String getId() {
81-
return createId(this.srcNetwork, this.srcContractAddress, this.srcSn);
82-
}
83-
84-
public static String createId(String srcNetwork, String contractAddress, BigInteger srcSn) {
85-
return srcNetwork + "/" + contractAddress + "/" + srcSn.toString();
79+
public byte[] getId() {
80+
return Context.hash("sha-256", this.toBytes());
8681
}
8782

8883
/**
@@ -173,4 +168,10 @@ public static Packet readObject(ObjectReader r) {
173168
r.end();
174169
return p;
175170
}
171+
172+
public byte[] toBytes() {
173+
ByteArrayObjectWriter writer = Context.newByteArrayObjectWriter("RLPn");
174+
Packet.writeObject(writer, this);
175+
return writer.toByteArray();
176+
}
176177
}

contracts/javascore/aggregator/src/main/java/relay/aggregator/RelayAggregator.java

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,15 @@ public class RelayAggregator {
4141
private final ArrayDB<Address> relayers = Context.newArrayDB("relayers", Address.class);
4242
private final DictDB<Address, Boolean> relayersLookup = Context.newDictDB("relayersLookup", Boolean.class);
4343

44-
private final DictDB<String, Packet> packets = Context.newDictDB("packets", Packet.class);
44+
private final DictDB<byte[], Packet> packets = Context.newDictDB("packets", Packet.class);
4545

46-
private final BranchDB<String, DictDB<Address, byte[]>> signatures = Context.newBranchDB("signatures",
46+
private final BranchDB<byte[], DictDB<Address, byte[]>> signatures = Context.newBranchDB("signatures",
4747
byte[].class);
4848

4949
public RelayAggregator(Address _admin) {
5050
if (admin.get() == null) {
5151
admin.set(_admin);
5252
signatureThreshold.set(DEFAULT_SIGNATURE_THRESHOLD);
53-
addRelayer(_admin);
5453
}
5554
}
5655

@@ -60,12 +59,6 @@ public void setAdmin(Address _admin) {
6059

6160
Context.require(admin.get() != _admin, "admin already set");
6261

63-
// add new admin as relayer
64-
addRelayer(_admin);
65-
66-
// remove old admin from relayer list
67-
removeRelayer(admin.get());
68-
6962
admin.set(_admin);
7063
}
7164

@@ -107,10 +100,9 @@ public void setRelayers(Address[] newRelayers, int threshold) {
107100
addRelayer(newRelayer);
108101
}
109102

110-
Address adminAdrr = admin.get();
111103
for (int i = 0; i < relayers.size(); i++) {
112104
Address oldRelayer = relayers.get(i);
113-
if (!oldRelayer.equals(adminAdrr) && !newRelayersMap.containsKey(oldRelayer)) {
105+
if (!newRelayersMap.containsKey(oldRelayer)) {
114106
removeRelayer(oldRelayer);
115107
}
116108
}
@@ -127,8 +119,13 @@ public boolean packetSubmitted(
127119
Address relayer,
128120
String srcNetwork,
129121
String srcContractAddress,
130-
BigInteger srcSn) {
131-
String pktID = Packet.createId(srcNetwork, srcContractAddress, srcSn);
122+
BigInteger srcSn,
123+
BigInteger srcHeight,
124+
String dstNetwork,
125+
String dstContractAddress,
126+
byte[] data) {
127+
Packet pkt = new Packet(srcNetwork, srcContractAddress, srcSn, srcHeight, dstNetwork, dstContractAddress, data);
128+
byte[] pktID = pkt.getId();
132129
byte[] existingSign = signatures.at(pktID).get(relayer);
133130
return existingSign != null;
134131
}
@@ -147,7 +144,7 @@ public void submitPacket(
147144
relayersOnly();
148145

149146
Packet pkt = new Packet(srcNetwork, srcContractAddress, srcSn, srcHeight, dstNetwork, dstContractAddress, data);
150-
String pktID = pkt.getId();
147+
byte[] pktID = pkt.getId();
151148

152149
if (packets.get(pktID) == null) {
153150
packets.set(pktID, pkt);
@@ -170,7 +167,7 @@ public void submitPacket(
170167
setSignature(pktID, Context.getCaller(), signature);
171168

172169
if (signatureThresholdReached(pktID)) {
173-
byte[][] sigs = getSignatures(srcNetwork, srcContractAddress, srcSn);
170+
byte[][] sigs = getSignatures(pktID);
174171
byte[] encodedSigs = serializeSignatures(sigs);
175172
PacketAcknowledged(
176173
pkt.getSrcNetwork(),
@@ -185,8 +182,7 @@ public void submitPacket(
185182
}
186183
}
187184

188-
private byte[][] getSignatures(String srcNetwork, String srcContractAddress, BigInteger srcSn) {
189-
String pktID = Packet.createId(srcNetwork, srcContractAddress, srcSn);
185+
private byte[][] getSignatures(byte[] pktID) {
190186
DictDB<Address, byte[]> signDict = signatures.at(pktID);
191187
ArrayList<byte[]> signatureList = new ArrayList<byte[]>();
192188

@@ -205,7 +201,7 @@ private byte[][] getSignatures(String srcNetwork, String srcContractAddress, Big
205201
return sigs;
206202
}
207203

208-
protected void setSignature(String pktID, Address addr, byte[] sign) {
204+
protected void setSignature(byte[] pktID, Address addr, byte[] sign) {
209205
signatures.at(pktID).set(addr, sign);
210206
}
211207

@@ -241,7 +237,7 @@ protected static byte[][] deserializeSignatures(byte[] encodedSigs) {
241237
}
242238

243239
private void adminOnly() {
244-
Context.require(Context.getCaller().equals(admin.get()), "Unauthorized: caller is not the leader relayer");
240+
Context.require(Context.getCaller().equals(admin.get()), "Unauthorized: caller is not the admin");
245241
}
246242

247243
private void relayersOnly() {
@@ -270,7 +266,7 @@ private void removeRelayer(Address oldRelayer) {
270266
}
271267
}
272268

273-
private Boolean signatureThresholdReached(String pktID) {
269+
private Boolean signatureThresholdReached(byte[] pktID) {
274270
int noOfSignatures = 0;
275271
for (int i = 0; i < relayers.size(); i++) {
276272
Address relayer = relayers.get(i);
@@ -282,7 +278,7 @@ private Boolean signatureThresholdReached(String pktID) {
282278
return noOfSignatures >= signatureThreshold.get();
283279
}
284280

285-
private void removePacket(String pktID) {
281+
private void removePacket(byte[] pktID) {
286282
packets.set(pktID, null);
287283
DictDB<Address, byte[]> signDict = signatures.at(pktID);
288284

0 commit comments

Comments
 (0)