Skip to content

Commit 91c9d0e

Browse files
committed
#58 Add shard id verification against state id
1 parent 122e670 commit 91c9d0e

3 files changed

Lines changed: 57 additions & 1 deletion

File tree

src/main/java/org/unicitylabs/sdk/transaction/verification/InclusionProofVerificationRule.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,20 @@ public static VerificationResult<InclusionProofVerificationStatus> verify(RootTr
6565
InclusionProofVerificationStatus.PATH_INVALID);
6666
}
6767

68+
VerificationResult<?> result = ShardIdMatchesStateIdRule.verify(
69+
stateId,
70+
inclusionProof.getUnicityCertificate().getShardTreeCertificate()
71+
);
72+
if (result.getStatus() != VerificationStatus.OK) {
73+
return new VerificationResult<>(
74+
"InclusionProofVerificationRule",
75+
InclusionProofVerificationStatus.SHARD_ID_MISMATCH,
76+
"",
77+
result
78+
);
79+
}
6880

69-
VerificationResult<?> result = UnicityCertificateVerification.verify(trustBase, inclusionProof);
81+
result = UnicityCertificateVerification.verify(trustBase, inclusionProof);
7082
if (result.getStatus() != VerificationStatus.OK) {
7183
return new VerificationResult<>(
7284
"InclusionProofVerificationRule",

src/main/java/org/unicitylabs/sdk/transaction/verification/InclusionProofVerificationStatus.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ public enum InclusionProofVerificationStatus {
1818
INCLUSION_CERTIFICATE_MISSING,
1919
/** Proof path structure or hashes are invalid. */
2020
PATH_INVALID,
21+
/** Shard id of the unicity certificate does not match the transaction state id. */
22+
SHARD_ID_MISMATCH,
2123
/** Inclusion proof verification succeeded. */
2224
OK
2325
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package org.unicitylabs.sdk.transaction.verification;
2+
3+
import org.unicitylabs.sdk.api.StateId;
4+
import org.unicitylabs.sdk.api.bft.ShardId;
5+
import org.unicitylabs.sdk.api.bft.ShardTreeCertificate;
6+
import org.unicitylabs.sdk.util.verification.VerificationResult;
7+
import org.unicitylabs.sdk.util.verification.VerificationStatus;
8+
9+
/**
10+
* Rule to verify that the shard id of the shard tree certificate is a prefix of the transaction
11+
* state id. An empty shard id matches any state id.
12+
*/
13+
public class ShardIdMatchesStateIdRule {
14+
15+
private ShardIdMatchesStateIdRule() {
16+
}
17+
18+
/**
19+
* Verify that the shard id is a prefix of the state id.
20+
*
21+
* @param stateId state id of the transaction being verified
22+
* @param shardTreeCertificate shard tree certificate carrying the shard id
23+
*
24+
* @return verification result with {@link VerificationStatus#OK} on match (or empty shard id),
25+
* otherwise {@link VerificationStatus#FAIL}
26+
*/
27+
public static VerificationResult<VerificationStatus> verify(
28+
StateId stateId,
29+
ShardTreeCertificate shardTreeCertificate
30+
) {
31+
ShardId shardId = shardTreeCertificate.getShard();
32+
if (shardId.getLength() == 0) {
33+
return new VerificationResult<>("ShardIdMatchesStateIdRule", VerificationStatus.OK);
34+
}
35+
36+
if (!shardId.isPrefixOf(stateId.getData())) {
37+
return new VerificationResult<>("ShardIdMatchesStateIdRule", VerificationStatus.FAIL);
38+
}
39+
40+
return new VerificationResult<>("ShardIdMatchesStateIdRule", VerificationStatus.OK);
41+
}
42+
}

0 commit comments

Comments
 (0)