forked from Qortal/qortal
Added support for deserialization of MESSAGE-type AT transactions (requires transaction version 6)
This commit is contained in:
parent
b5522ea260
commit
522ef282c8
@ -9,6 +9,7 @@ import org.qortal.data.transaction.ATTransactionData;
|
|||||||
import org.qortal.data.transaction.BaseTransactionData;
|
import org.qortal.data.transaction.BaseTransactionData;
|
||||||
import org.qortal.data.transaction.TransactionData;
|
import org.qortal.data.transaction.TransactionData;
|
||||||
import org.qortal.group.Group;
|
import org.qortal.group.Group;
|
||||||
|
import org.qortal.transaction.Transaction;
|
||||||
import org.qortal.transform.TransformationException;
|
import org.qortal.transform.TransformationException;
|
||||||
import org.qortal.utils.Serialization;
|
import org.qortal.utils.Serialization;
|
||||||
|
|
||||||
@ -20,9 +21,16 @@ public class AtTransactionTransformer extends TransactionTransformer {
|
|||||||
protected static final TransactionLayout layout = null;
|
protected static final TransactionLayout layout = null;
|
||||||
|
|
||||||
// Property lengths
|
// Property lengths
|
||||||
|
|
||||||
|
private static final int MESSAGE_SIZE_LENGTH = INT_LENGTH;
|
||||||
|
private static final int TYPE_LENGTH = INT_LENGTH;
|
||||||
|
|
||||||
|
|
||||||
public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException {
|
public static TransactionData fromByteBuffer(ByteBuffer byteBuffer) throws TransformationException {
|
||||||
long timestamp = byteBuffer.getLong();
|
long timestamp = byteBuffer.getLong();
|
||||||
|
|
||||||
|
int version = Transaction.getVersionByTimestamp(timestamp);
|
||||||
|
|
||||||
byte[] reference = new byte[REFERENCE_LENGTH];
|
byte[] reference = new byte[REFERENCE_LENGTH];
|
||||||
byteBuffer.get(reference);
|
byteBuffer.get(reference);
|
||||||
|
|
||||||
@ -30,11 +38,34 @@ public class AtTransactionTransformer extends TransactionTransformer {
|
|||||||
|
|
||||||
String recipient = Serialization.deserializeAddress(byteBuffer);
|
String recipient = Serialization.deserializeAddress(byteBuffer);
|
||||||
|
|
||||||
// Assume PAYMENT-type, as these are the only ones used in ACCTs
|
// Default to PAYMENT-type, as there were no MESSAGE-type transactions before transaction v6
|
||||||
// TODO: add support for MESSAGE-type
|
boolean isMessageType = false;
|
||||||
long assetId = byteBuffer.getLong();
|
|
||||||
|
|
||||||
long amount = byteBuffer.getLong();
|
if (version >= 6) {
|
||||||
|
// Version 6 supports both PAYMENT-type and MESSAGE-type, specified using an integer.
|
||||||
|
// This could be extended to support additional types at a later date, simply by adding
|
||||||
|
// additional integer values.
|
||||||
|
int type = byteBuffer.getInt();
|
||||||
|
isMessageType = (type == 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int messageLength = 0;
|
||||||
|
byte[] message = null;
|
||||||
|
long assetId = 0L;
|
||||||
|
long amount = 0L;
|
||||||
|
|
||||||
|
if (isMessageType) {
|
||||||
|
messageLength = byteBuffer.getInt();
|
||||||
|
|
||||||
|
message = new byte[messageLength];
|
||||||
|
byteBuffer.get(message);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Assume PAYMENT-type, as there were no MESSAGE-type transactions until this time
|
||||||
|
assetId = byteBuffer.getLong();
|
||||||
|
|
||||||
|
amount = byteBuffer.getLong();
|
||||||
|
}
|
||||||
|
|
||||||
long fee = byteBuffer.getLong();
|
long fee = byteBuffer.getLong();
|
||||||
|
|
||||||
@ -43,12 +74,44 @@ public class AtTransactionTransformer extends TransactionTransformer {
|
|||||||
|
|
||||||
BaseTransactionData baseTransactionData = new BaseTransactionData(timestamp, Group.NO_GROUP, reference, NullAccount.PUBLIC_KEY, fee, signature);
|
BaseTransactionData baseTransactionData = new BaseTransactionData(timestamp, Group.NO_GROUP, reference, NullAccount.PUBLIC_KEY, fee, signature);
|
||||||
|
|
||||||
|
if (isMessageType) {
|
||||||
|
// MESSAGE-type
|
||||||
|
return new ATTransactionData(baseTransactionData, atAddress, recipient, message);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// PAYMENT-type
|
||||||
return new ATTransactionData(baseTransactionData, atAddress, recipient, amount, assetId);
|
return new ATTransactionData(baseTransactionData, atAddress, recipient, amount, assetId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public static int getDataLength(TransactionData transactionData) throws TransformationException {
|
public static int getDataLength(TransactionData transactionData) throws TransformationException {
|
||||||
return TYPE_LENGTH + TIMESTAMP_LENGTH + REFERENCE_LENGTH + ADDRESS_LENGTH + ADDRESS_LENGTH +
|
ATTransactionData atTransactionData = (ATTransactionData) transactionData;
|
||||||
ASSET_ID_LENGTH + AMOUNT_LENGTH + FEE_LENGTH + SIGNATURE_LENGTH;
|
int version = Transaction.getVersionByTimestamp(transactionData.getTimestamp());
|
||||||
|
|
||||||
|
final int baseLength = TYPE_LENGTH + TIMESTAMP_LENGTH + REFERENCE_LENGTH + ADDRESS_LENGTH + ADDRESS_LENGTH +
|
||||||
|
FEE_LENGTH + SIGNATURE_LENGTH;
|
||||||
|
|
||||||
|
int typeSpecificLength = 0;
|
||||||
|
|
||||||
|
byte[] message = atTransactionData.getMessage();
|
||||||
|
boolean isMessageType = (message != null);
|
||||||
|
|
||||||
|
// MESSAGE-type and PAYMENT-type transactions will have differing lengths
|
||||||
|
if (isMessageType) {
|
||||||
|
typeSpecificLength = MESSAGE_SIZE_LENGTH + message.length;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
typeSpecificLength = ASSET_ID_LENGTH + AMOUNT_LENGTH;
|
||||||
|
}
|
||||||
|
|
||||||
|
// V6 transactions include an extra integer to denote the type
|
||||||
|
int versionSpecificLength = 0;
|
||||||
|
if (version >= 6) {
|
||||||
|
versionSpecificLength = TYPE_LENGTH;
|
||||||
|
}
|
||||||
|
|
||||||
|
return baseLength + typeSpecificLength + versionSpecificLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Used for generating fake transaction signatures
|
// Used for generating fake transaction signatures
|
||||||
@ -56,6 +119,8 @@ public class AtTransactionTransformer extends TransactionTransformer {
|
|||||||
try {
|
try {
|
||||||
ATTransactionData atTransactionData = (ATTransactionData) transactionData;
|
ATTransactionData atTransactionData = (ATTransactionData) transactionData;
|
||||||
|
|
||||||
|
int version = Transaction.getVersionByTimestamp(atTransactionData.getTimestamp());
|
||||||
|
|
||||||
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
|
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
|
||||||
|
|
||||||
bytes.write(Ints.toByteArray(atTransactionData.getType().value));
|
bytes.write(Ints.toByteArray(atTransactionData.getType().value));
|
||||||
@ -68,7 +133,17 @@ public class AtTransactionTransformer extends TransactionTransformer {
|
|||||||
|
|
||||||
byte[] message = atTransactionData.getMessage();
|
byte[] message = atTransactionData.getMessage();
|
||||||
|
|
||||||
if (message != null) {
|
boolean isMessageType = (message != null);
|
||||||
|
int type = isMessageType ? 1 : 0;
|
||||||
|
|
||||||
|
if (version >= 6) {
|
||||||
|
// Version 6 supports both PAYMENT-type and MESSAGE-type, specified using an integer.
|
||||||
|
// This could be extended to support additional types at a later date, simply by adding
|
||||||
|
// additional integer values.
|
||||||
|
bytes.write(Ints.toByteArray(type));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isMessageType) {
|
||||||
// MESSAGE-type
|
// MESSAGE-type
|
||||||
bytes.write(Ints.toByteArray(message.length));
|
bytes.write(Ints.toByteArray(message.length));
|
||||||
bytes.write(message);
|
bytes.write(message);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user