Skip to content

Commit 69678eb

Browse files
authored
Merge pull request #19 from unicitynetwork/inline-serialization
Inline serialization
2 parents 6fe8eb6 + 605ce6a commit 69678eb

File tree

255 files changed

+7458
-7401
lines changed

Some content is hidden

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

255 files changed

+7458
-7401
lines changed

README.md

Lines changed: 217 additions & 154 deletions
Large diffs are not rendered by default.

build.gradle.kts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ configurations {
2727

2828
dependencies {
2929
// Core dependencies that work on both platforms
30-
implementation("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.19.2")
31-
implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.19.2")
32-
implementation("com.fasterxml.jackson.core:jackson-databind:2.19.2")
30+
implementation(platform("com.fasterxml.jackson:jackson-bom:2.20.0"))
31+
implementation("com.fasterxml.jackson.datatype:jackson-datatype-jdk8")
32+
implementation("com.fasterxml.jackson.core:jackson-databind")
3333
implementation("org.bouncycastle:bcprov-jdk18on:1.81")
3434
implementation("org.slf4j:slf4j-api:2.0.13")
3535
implementation("com.squareup.okhttp3:okhttp:4.12.0")

src/main/java/org/unicitylabs/sdk/Hashable.java

Lines changed: 0 additions & 7 deletions
This file was deleted.

src/main/java/org/unicitylabs/sdk/StateTransitionClient.java

Lines changed: 81 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,41 +4,65 @@
44
import java.util.List;
55
import java.util.Objects;
66
import java.util.concurrent.CompletableFuture;
7-
import org.unicitylabs.sdk.api.IAggregatorClient;
7+
import org.unicitylabs.sdk.api.AggregatorClient;
88
import org.unicitylabs.sdk.api.InclusionProofResponse;
99
import org.unicitylabs.sdk.api.RequestId;
1010
import org.unicitylabs.sdk.api.SubmitCommitmentResponse;
1111
import org.unicitylabs.sdk.bft.RootTrustBase;
1212
import org.unicitylabs.sdk.predicate.PredicateEngineService;
1313
import org.unicitylabs.sdk.token.Token;
1414
import org.unicitylabs.sdk.token.TokenState;
15-
import org.unicitylabs.sdk.verification.VerificationException;
1615
import org.unicitylabs.sdk.transaction.Commitment;
1716
import org.unicitylabs.sdk.transaction.InclusionProofVerificationStatus;
1817
import org.unicitylabs.sdk.transaction.MintCommitment;
19-
import org.unicitylabs.sdk.transaction.MintTransactionData;
20-
import org.unicitylabs.sdk.transaction.Transaction;
18+
import org.unicitylabs.sdk.transaction.MintTransactionReason;
2119
import org.unicitylabs.sdk.transaction.TransferCommitment;
22-
import org.unicitylabs.sdk.transaction.TransferTransactionData;
20+
import org.unicitylabs.sdk.transaction.TransferTransaction;
21+
import org.unicitylabs.sdk.verification.VerificationException;
2322

23+
/**
24+
* Client for handling state transitions of tokens, including submitting commitments and finalizing
25+
* transactions.
26+
*/
2427
public class StateTransitionClient {
2528

26-
protected final IAggregatorClient client;
29+
/**
30+
* The aggregator client used for submitting commitments and retrieving inclusion proofs.
31+
*/
32+
protected final AggregatorClient client;
2733

28-
public StateTransitionClient(IAggregatorClient client) {
34+
/**
35+
* Creates a new StateTransitionClient with the specified aggregator client.
36+
*
37+
* @param client The aggregator client to use for communication.
38+
*/
39+
public StateTransitionClient(AggregatorClient client) {
2940
this.client = client;
3041
}
3142

32-
public <T extends MintTransactionData<?>> CompletableFuture<SubmitCommitmentResponse> submitCommitment(
33-
MintCommitment<T> commitment
34-
) {
43+
/**
44+
* Submits a mint commitment to the aggregator.
45+
*
46+
* @param commitment The mint commitment to submit.
47+
* @param <R> The type of mint transaction data.
48+
* @return A CompletableFuture that resolves to the response from the aggregator.
49+
*/
50+
public <R extends MintTransactionReason>
51+
CompletableFuture<SubmitCommitmentResponse> submitCommitment(MintCommitment<R> commitment) {
3552
return this.client.submitCommitment(
3653
commitment.getRequestId(),
3754
commitment.getTransactionData().calculateHash(),
3855
commitment.getAuthenticator()
3956
);
4057
}
4158

59+
/**
60+
* Submits a transfer commitment to the aggregator after verifying ownership.
61+
*
62+
* @param commitment The transfer commitment to submit.
63+
* @return A CompletableFuture that resolves to the response from the aggregator.
64+
* @throws IllegalArgumentException if ownership verification fails.
65+
*/
4266
public CompletableFuture<SubmitCommitmentResponse> submitCommitment(
4367
TransferCommitment commitment
4468
) {
@@ -55,29 +79,63 @@ public CompletableFuture<SubmitCommitmentResponse> submitCommitment(
5579
.calculateHash(), commitment.getAuthenticator());
5680
}
5781

58-
public <T extends MintTransactionData<?>> Token<T> finalizeTransaction(
82+
/**
83+
* Finalizes a transaction by updating the token state based on the provided transaction data
84+
* without nametags.
85+
*
86+
* @param trustBase The root trust base for inclusion proof verification.
87+
* @param token The token to be updated.
88+
* @param state The current state of the token.
89+
* @param transaction The transaction containing transfer data.
90+
* @param <R> The type of mint transaction data.
91+
* @return The updated token after applying the transaction.
92+
* @throws VerificationException if verification fails during the update process.
93+
*/
94+
public <R extends MintTransactionReason> Token<R> finalizeTransaction(
5995
RootTrustBase trustBase,
60-
Token<T> token,
96+
Token<R> token,
6197
TokenState state,
62-
Transaction<TransferTransactionData> transaction
98+
TransferTransaction transaction
6399
) throws VerificationException {
64100
return this.finalizeTransaction(trustBase, token, state, transaction, List.of());
65101
}
66102

67-
public <T extends MintTransactionData<?>> Token<T> finalizeTransaction(
103+
/**
104+
* Finalizes a transaction by updating the token state based on the provided transaction data and
105+
* nametags.
106+
*
107+
* @param trustBase The root trust base for inclusion proof verification.
108+
* @param token The token to be updated.
109+
* @param state The current state of the token.
110+
* @param transaction The transaction containing transfer data.
111+
* @param nametags A list of tokens used as nametags in the transaction.
112+
* @param <R> The type of mint transaction data of token.
113+
* @return The updated token after applying the transaction.
114+
* @throws VerificationException if verification fails during the update process.
115+
*/
116+
public <R extends MintTransactionReason> Token<R> finalizeTransaction(
68117
RootTrustBase trustBase,
69-
Token<T> token,
118+
Token<R> token,
70119
TokenState state,
71-
Transaction<TransferTransactionData> transaction,
120+
TransferTransaction transaction,
72121
List<Token<?>> nametags
73122
) throws VerificationException {
74123
Objects.requireNonNull(token, "Token is null");
75124

76125
return token.update(trustBase, state, transaction, nametags);
77126
}
78127

128+
/**
129+
* Retrieves the inclusion proof for a token and verifies its status against the provided public
130+
* key and trust base.
131+
*
132+
* @param token The token for which to retrieve the inclusion proof.
133+
* @param publicKey The public key associated with the token.
134+
* @param trustBase The root trust base for verification.
135+
* @return A CompletableFuture that resolves to the inclusion proof verification status.
136+
*/
79137
public CompletableFuture<InclusionProofVerificationStatus> getTokenStatus(
80-
Token<? extends MintTransactionData<?>> token,
138+
Token<?> token,
81139
byte[] publicKey,
82140
RootTrustBase trustBase
83141
) {
@@ -86,6 +144,12 @@ public CompletableFuture<InclusionProofVerificationStatus> getTokenStatus(
86144
.thenApply(response -> response.getInclusionProof().verify(requestId, trustBase));
87145
}
88146

147+
/**
148+
* Retrieves the inclusion proof for a given commitment.
149+
*
150+
* @param commitment The commitment for which to retrieve the inclusion proof.
151+
* @return A CompletableFuture that resolves to the inclusion proof response from the aggregator.
152+
*/
89153
public CompletableFuture<InclusionProofResponse> getInclusionProof(Commitment<?> commitment) {
90154
return this.client.getInclusionProof(commitment.getRequestId());
91155
}
Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,27 @@
11

22
package org.unicitylabs.sdk.address;
33

4+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
5+
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
6+
7+
/**
8+
* Address interface.
9+
*/
10+
@JsonSerialize(using = AddressJson.Serializer.class)
11+
@JsonDeserialize(using = AddressJson.Deserializer.class)
412
public interface Address {
5-
AddressScheme getScheme();
6-
String getAddress();
13+
14+
/**
15+
* Get the address scheme.
16+
*
17+
* @return address scheme
18+
*/
19+
AddressScheme getScheme();
20+
21+
/**
22+
* Get the address as a string.
23+
*
24+
* @return address string
25+
*/
26+
String getAddress();
727
}

src/main/java/org/unicitylabs/sdk/address/AddressFactory.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,25 @@
11
package org.unicitylabs.sdk.address;
22

3+
import java.util.Arrays;
4+
import java.util.Objects;
35
import org.unicitylabs.sdk.hash.DataHash;
46
import org.unicitylabs.sdk.token.TokenId;
57
import org.unicitylabs.sdk.util.HexConverter;
6-
import java.util.Arrays;
7-
import java.util.Objects;
88

9+
/**
10+
* Factory for creating Address instances from string representations.
11+
*/
912
public class AddressFactory {
1013

14+
/**
15+
* Create an Address from its string representation.
16+
*
17+
* @param address The address string.
18+
* @return The corresponding Address instance.
19+
* @throws IllegalArgumentException if the address format is invalid or does not match the
20+
* expected format.
21+
* @throws NullPointerException if the address is null.
22+
*/
1123
public static Address createAddress(String address) {
1224
Objects.requireNonNull(address, "Address cannot be null");
1325

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package org.unicitylabs.sdk.address;
2+
3+
import com.fasterxml.jackson.core.JsonGenerator;
4+
import com.fasterxml.jackson.core.JsonParser;
5+
import com.fasterxml.jackson.core.JsonToken;
6+
import com.fasterxml.jackson.databind.DeserializationContext;
7+
import com.fasterxml.jackson.databind.SerializerProvider;
8+
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
9+
import com.fasterxml.jackson.databind.exc.MismatchedInputException;
10+
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
11+
import java.io.IOException;
12+
import org.unicitylabs.sdk.predicate.EncodedPredicate;
13+
14+
/**
15+
* Address serializer and deserializer implementation.
16+
*/
17+
public class AddressJson {
18+
19+
private AddressJson() {
20+
}
21+
22+
/**
23+
* Address serializer.
24+
*/
25+
public static class Serializer extends StdSerializer<Address> {
26+
27+
/**
28+
* Create serializer.
29+
*/
30+
public Serializer() {
31+
super(Address.class);
32+
}
33+
34+
/**
35+
* Serialize address.
36+
*
37+
* @param value addess
38+
* @param gen json generator
39+
* @param serializers serializer provider
40+
* @throws IOException on serialization failure
41+
*/
42+
@Override
43+
public void serialize(Address value, JsonGenerator gen,
44+
SerializerProvider serializers)
45+
throws IOException {
46+
gen.writeObject(value.toString());
47+
}
48+
}
49+
50+
/**
51+
* Address deserializer.
52+
*/
53+
public static class Deserializer extends StdDeserializer<Address> {
54+
55+
/**
56+
* Create deserializer.
57+
*/
58+
public Deserializer() {
59+
super(Address.class);
60+
}
61+
62+
/**
63+
* Deserialize address.
64+
*
65+
* @param p Parser used for reading JSON content
66+
* @param ctx Context that can be used to access information about this deserialization
67+
* activity.
68+
* @return address
69+
* @throws IOException on deserialization failure
70+
*/
71+
@Override
72+
public Address deserialize(JsonParser p, DeserializationContext ctx)
73+
throws IOException {
74+
if (p.getCurrentToken() != JsonToken.VALUE_STRING) {
75+
throw MismatchedInputException.from(
76+
p,
77+
EncodedPredicate.class,
78+
"Expected string value"
79+
);
80+
}
81+
82+
try {
83+
return AddressFactory.createAddress(p.readValueAs(String.class));
84+
} catch (Exception e) {
85+
throw MismatchedInputException.from(p, EncodedPredicate.class, "Expected bytes");
86+
}
87+
}
88+
}
89+
}
90+

src/main/java/org/unicitylabs/sdk/address/AddressScheme.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11

22
package org.unicitylabs.sdk.address;
33

4+
/**
5+
* Address scheme.
6+
*/
47
public enum AddressScheme {
58
DIRECT,
69
PROXY

src/main/java/org/unicitylabs/sdk/address/DirectAddress.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package org.unicitylabs.sdk.address;
22

3+
import java.util.Arrays;
4+
import java.util.Objects;
35
import org.unicitylabs.sdk.hash.DataHash;
46
import org.unicitylabs.sdk.hash.DataHasher;
57
import org.unicitylabs.sdk.hash.HashAlgorithm;
68
import org.unicitylabs.sdk.util.HexConverter;
79

8-
import java.util.Arrays;
9-
import java.util.Objects;
10-
1110
/**
12-
* Direct address implementation
11+
* Direct address implementation.
1312
*/
1413
public class DirectAddress implements Address {
1514

@@ -21,6 +20,12 @@ private DirectAddress(DataHash data, byte[] checksum) {
2120
this.checksum = Arrays.copyOf(checksum, checksum.length);
2221
}
2322

23+
/**
24+
* Create a direct address from a predicate reference.
25+
*
26+
* @param reference the data hash to create the address from
27+
* @return the direct address
28+
*/
2429
public static DirectAddress create(DataHash reference) {
2530
DataHash checksum = new DataHasher(HashAlgorithm.SHA256).update(reference.getImprint())
2631
.digest();

0 commit comments

Comments
 (0)