Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 2 additions & 5 deletions src/main/java/org/unicitylabs/sdk/StateTransitionClient.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@

package org.unicitylabs.sdk;

import org.unicitylabs.sdk.api.*;

import java.util.concurrent.CompletableFuture;
import org.unicitylabs.sdk.api.AggregatorClient;
import org.unicitylabs.sdk.api.CertificationData;
import org.unicitylabs.sdk.api.CertificationResponse;
import org.unicitylabs.sdk.api.InclusionProofResponse;
import org.unicitylabs.sdk.api.StateId;

/**
* Client for handling state transitions of tokens, including submitting commitments and finalizing transactions.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.util.Objects;
import org.unicitylabs.sdk.serializer.UnicityObjectMapper;
import org.unicitylabs.sdk.serializer.json.JsonSerializationException;
import org.unicitylabs.sdk.serializer.json.LongAsStringSerializer;

import java.util.Objects;

/**
* Block height response.
*/
Expand All @@ -18,7 +19,7 @@ public class BlockHeightResponse {

@JsonCreator
private BlockHeightResponse(
@JsonProperty("blockNumber") long blockNumber
@JsonProperty("blockNumber") long blockNumber
) {
this.blockNumber = blockNumber;
}
Expand Down
93 changes: 51 additions & 42 deletions src/main/java/org/unicitylabs/sdk/api/CertificationData.java
Original file line number Diff line number Diff line change
@@ -1,45 +1,52 @@
package org.unicitylabs.sdk.api;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import org.unicitylabs.sdk.crypto.MintSigningService;
import org.unicitylabs.sdk.crypto.hash.DataHash;
import org.unicitylabs.sdk.crypto.hash.DataHasher;
import org.unicitylabs.sdk.crypto.hash.HashAlgorithm;
import org.unicitylabs.sdk.crypto.secp256k1.SigningService;
import org.unicitylabs.sdk.predicate.EncodedPredicate;
import org.unicitylabs.sdk.predicate.Predicate;
import org.unicitylabs.sdk.predicate.UnlockScript;
import org.unicitylabs.sdk.predicate.builtin.PayToPublicKeyPredicateUnlockScript;
import org.unicitylabs.sdk.serializer.cbor.CborDeserializer;
import org.unicitylabs.sdk.serializer.cbor.CborSerializationException;
import org.unicitylabs.sdk.serializer.cbor.CborSerializer;
import org.unicitylabs.sdk.transaction.MintTransaction;
import org.unicitylabs.sdk.transaction.Transaction;
import org.unicitylabs.sdk.util.HexConverter;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;

/**
* Certification data.
*/
public class CertificationData {
public static final long CBOR_TAG = 39031;
private static final int VERSION = 1;

private final Predicate lockScript;
private final DataHash sourceStateHash;
private final DataHash transactionHash;
private final byte[] unlockScript;

CertificationData(
Predicate lockScript,
DataHash sourceStateHash,
DataHash transactionHash,
byte[] unlockScript
Predicate lockScript,
DataHash sourceStateHash,
DataHash transactionHash,
byte[] unlockScript
) {
this.lockScript = lockScript;
this.sourceStateHash = sourceStateHash;
this.transactionHash = transactionHash;
this.unlockScript = Arrays.copyOf(unlockScript, unlockScript.length);
}

public int getVersion() {
return CertificationData.VERSION;
}

/**
* Get lock script of certified transaction output.
*
Expand Down Expand Up @@ -83,13 +90,22 @@ public byte[] getUnlockScript() {
* @return CertificationData
*/
public static CertificationData fromCbor(byte[] bytes) {
List<byte[]> data = CborDeserializer.decodeArray(bytes);
CborDeserializer.CborTag tag = CborDeserializer.decodeTag(bytes);
if (tag.getTag() != CertificationData.CBOR_TAG) {
throw new CborSerializationException(String.format("Invalid CBOR tag: %s", tag.getTag()));
}
List<byte[]> data = CborDeserializer.decodeArray(tag.getData());

int version = CborDeserializer.decodeUnsignedInteger(data.get(0)).asInt();
if (version != CertificationData.VERSION) {
throw new CborSerializationException(String.format("Unsupported version: %s", version));
}

return new CertificationData(
EncodedPredicate.fromCbor(data.get(0)),
new DataHash(HashAlgorithm.SHA256, CborDeserializer.decodeByteString(data.get(1))),
new DataHash(HashAlgorithm.SHA256, CborDeserializer.decodeByteString(data.get(2))),
CborDeserializer.decodeByteString(data.get(3))
EncodedPredicate.fromCbor(data.get(1)),
new DataHash(HashAlgorithm.SHA256, CborDeserializer.decodeByteString(data.get(2))),
new DataHash(HashAlgorithm.SHA256, CborDeserializer.decodeByteString(data.get(3))),
CborDeserializer.decodeByteString(data.get(4))
);
}

Expand All @@ -104,9 +120,9 @@ public static CertificationData fromMintTransaction(MintTransaction transaction)
SigningService signingService = MintSigningService.create(transaction.getTokenId());

return CertificationData.fromTransaction(
transaction,
PayToPublicKeyPredicateUnlockScript.create(transaction, signingService).getSignature()
.encode()
transaction,
PayToPublicKeyPredicateUnlockScript.create(transaction, signingService).getSignature()
.encode()
);
}

Expand All @@ -132,35 +148,28 @@ public static CertificationData fromTransaction(Transaction transaction, UnlockS
*/
public static CertificationData fromTransaction(Transaction transaction, byte[] unlockScript) {
return new CertificationData(
transaction.getLockScript(),
transaction.getSourceStateHash(),
transaction.calculateTransactionHash(),
unlockScript
transaction.getLockScript(),
transaction.getSourceStateHash(),
transaction.calculateTransactionHash(),
unlockScript
);
}

/**
* Calculate leaf value for Merkle tree.
*
* @return leaf value
*/
public DataHash calculateLeafValue() {
return new DataHasher(HashAlgorithm.SHA256)
.update(this.toCbor())
.digest();
}

/**
* Serialize certification data to CBOR bytes.
*
* @return CBOR bytes
*/
public byte[] toCbor() {
return CborSerializer.encodeArray(
EncodedPredicate.fromPredicate(this.getLockScript()).toCbor(),
CborSerializer.encodeByteString(this.sourceStateHash.getData()),
CborSerializer.encodeByteString(this.transactionHash.getData()),
CborSerializer.encodeByteString(this.unlockScript)
return CborSerializer.encodeTag(
CertificationData.CBOR_TAG,
CborSerializer.encodeArray(
CborSerializer.encodeUnsignedInteger(CertificationData.VERSION),
EncodedPredicate.fromPredicate(this.getLockScript()).toCbor(),
CborSerializer.encodeByteString(this.sourceStateHash.getData()),
CborSerializer.encodeByteString(this.transactionHash.getData()),
CborSerializer.encodeByteString(this.unlockScript)
)
);
}

Expand All @@ -171,16 +180,16 @@ public boolean equals(Object o) {
}
CertificationData that = (CertificationData) o;
return this.lockScript.isEqualTo(that.lockScript)
&& Objects.equals(this.sourceStateHash, that.sourceStateHash)
&& Objects.equals(this.transactionHash, that.transactionHash)
&& Arrays.equals(this.unlockScript, that.unlockScript);
&& Objects.equals(this.sourceStateHash, that.sourceStateHash)
&& Objects.equals(this.transactionHash, that.transactionHash)
&& Arrays.equals(this.unlockScript, that.unlockScript);
}
Comment thread
martti007 marked this conversation as resolved.

@Override
public String toString() {
return String.format(
"CertificationData{lockScript=%s, sourceStateHash=%s, transactionHash=%s, unlockScript=%s}",
this.lockScript, this.sourceStateHash, this.transactionHash,
HexConverter.encode(this.unlockScript));
"CertificationData{lockScript=%s, sourceStateHash=%s, transactionHash=%s, unlockScript=%s}",
this.lockScript, this.sourceStateHash, this.transactionHash,
HexConverter.encode(this.unlockScript));
}
}
24 changes: 17 additions & 7 deletions src/main/java/org/unicitylabs/sdk/api/CertificationRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
* Submit certification request.
*/
public class CertificationRequest {
public static final long CBOR_TAG = 39030;
private static final int VERSION = 1;

private final StateId stateId;
private final CertificationData certificationData;
Expand All @@ -17,13 +19,17 @@ public class CertificationRequest {
* @param certificationData transaction hash
*/
private CertificationRequest(
StateId stateId,
CertificationData certificationData
StateId stateId,
CertificationData certificationData
) {
this.stateId = stateId;
this.certificationData = certificationData;
}

public int getVersion() {
return CertificationRequest.VERSION;
}

/**
* Get state id.
*
Expand All @@ -50,7 +56,7 @@ public CertificationData getCertificationData() {
*/
public static CertificationRequest create(CertificationData certificationData) {
return new CertificationRequest(StateId.fromCertificationData(certificationData),
certificationData);
certificationData);
}

/**
Expand All @@ -59,10 +65,14 @@ public static CertificationRequest create(CertificationData certificationData) {
* @return CBOR bytes
*/
public byte[] toCbor() {
return CborSerializer.encodeArray(
this.stateId.toCbor(),
this.certificationData.toCbor(),
CborSerializer.encodeUnsignedInteger(0)
return CborSerializer.encodeTag(
CertificationRequest.CBOR_TAG,
CborSerializer.encodeArray(
CborSerializer.encodeUnsignedInteger(CertificationRequest.VERSION),
this.stateId.toCbor(),
this.certificationData.toCbor(),
CborSerializer.encodeUnsignedInteger(0)
)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonProcessingException;
import java.util.Objects;
import org.unicitylabs.sdk.serializer.UnicityObjectMapper;
import org.unicitylabs.sdk.serializer.json.JsonSerializationException;

Expand All @@ -21,7 +20,7 @@ public class CertificationResponse {
*/
@JsonCreator
CertificationResponse(
@JsonProperty("status") CertificationStatus status
@JsonProperty("status") CertificationStatus status
) {
this.status = status;
}
Expand Down
Loading
Loading