Browse Source

Refactored the type system of ledger;

tags/1.0.0
huanghaiquan 5 years ago
parent
commit
4b7a5ad38e
8 changed files with 129 additions and 127 deletions
  1. +23
    -3
      source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/BaseType.java
  2. +11
    -57
      source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/PrimitiveType.java
  3. +2
    -2
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerEditerTest.java
  4. +1
    -1
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValue.java
  5. +21
    -21
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValueEntry.java
  6. +50
    -22
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/DataType.java
  7. +1
    -1
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVDataEntry.java
  8. +20
    -20
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVDataObject.java

+ 23
- 3
source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/BaseType.java View File

@@ -1,7 +1,7 @@
package com.jd.blockchain.binaryproto; package com.jd.blockchain.binaryproto;


/** /**
* 基础类型;
* 基础类型标志
* *
* @author huanghaiquan * @author huanghaiquan
* *
@@ -19,9 +19,29 @@ public interface BaseType {
public static final byte BOOLEAN = (byte) 0x01; public static final byte BOOLEAN = (byte) 0x01;


/** /**
* 数
* 数;
*/ */
public static final byte NUMERIC = (byte) 0x10;
public static final byte INTEGER = (byte) 0x10;

/**
* 8位整数;
*/
public static final byte INT8 = (byte) (INTEGER | 0x01);

/**
* 16位整数;
*/
public static final byte INT16 = (byte) (INTEGER | 0x02);

/**
* 32位整数;
*/
public static final byte INT32 = (byte) (INTEGER | 0x03);

/**
* 64位整数;
*/
public static final byte INT64 = (byte) (INTEGER | 0x04);


/** /**
* 文本 * 文本


+ 11
- 57
source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/PrimitiveType.java View File

@@ -19,80 +19,34 @@ public enum PrimitiveType {
BOOLEAN(BaseType.BOOLEAN), BOOLEAN(BaseType.BOOLEAN),
/** /**
* 数值型
* 8位的整数:
*/ */
INT8((byte) (BaseType.NUMERIC | 0x01)),
INT16((byte) (BaseType.NUMERIC | 0x02)),
INT32((byte) (BaseType.NUMERIC | 0x03)),
INT64((byte) (BaseType.NUMERIC | 0x04)),
INT8(BaseType.INT8),
/** /**
* 时间戳
* 16位整数;
*/ */
TIMESTAMP((byte) (BaseType.NUMERIC | 0x08)),
INT16(BaseType.INT16),
/** /**
* 文本数据
* 32位整数
*/ */
TEXT(BaseType.TEXT),
INT32(BaseType.INT32),
/** /**
* 文本数据
* 64位整数
*/ */
JSON((byte) (BaseType.TEXT | 0x01)),
INT64(BaseType.INT64),
/** /**
* 文本数据
* 文本;
*/ */
XML((byte) (BaseType.TEXT | 0x02)),
TEXT(BaseType.TEXT),
/** /**
* 二进制数据; * 二进制数据;
*/ */
BYTES(BaseType.BYTES),
/**
* 大整数;
*/
BIG_INT((byte) (BaseType.BYTES | 0x01)),
/**
* 图片;
*/
IMG((byte) (BaseType.BYTES | 0x02)),
/**
* 视频;
*/
VIDEO((byte) (BaseType.BYTES | 0x03)),
/**
* 位置坐标;
*/
LOCATION((byte) (BaseType.BYTES | 0x04)),
/**
* 公钥;
*/
PUB_KEY((byte) (BaseType.BYTES | 0x05)),
/**
* 签名摘要;
*/
SIGNATURE_DIGEST((byte) (BaseType.BYTES | 0x06)),
/**
* 哈希摘要;
*/
HASH_DIGEST((byte) (BaseType.BYTES | 0x07)),
/**
* 加密数据;
*/
ENCRYPTED_DATA((byte) (BaseType.BYTES | 0x08));
BYTES(BaseType.BYTES);
public final byte CODE; public final byte CODE;


+ 2
- 2
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerEditerTest.java View File

@@ -18,7 +18,7 @@ import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService; import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.BlockchainKeypair; import com.jd.blockchain.ledger.BlockchainKeypair;
import com.jd.blockchain.ledger.BytesValue; import com.jd.blockchain.ledger.BytesValue;
import com.jd.blockchain.ledger.BytesValueType;
import com.jd.blockchain.ledger.DataType;
import com.jd.blockchain.ledger.LedgerBlock; import com.jd.blockchain.ledger.LedgerBlock;
import com.jd.blockchain.ledger.LedgerInitSetting; import com.jd.blockchain.ledger.LedgerInitSetting;
import com.jd.blockchain.ledger.LedgerTransaction; import com.jd.blockchain.ledger.LedgerTransaction;
@@ -109,7 +109,7 @@ public class LedgerEditerTest {


// 验证数据读写的一致性; // 验证数据读写的一致性;
BytesValue bytes = dataAccount.getBytes("A"); BytesValue bytes = dataAccount.getBytes("A");
assertEquals(BytesValueType.TEXT, bytes.getType());
assertEquals(DataType.TEXT, bytes.getType());
String textValue = bytes.getValue().toUTF8String(); String textValue = bytes.getValue().toUTF8String();
assertEquals("abc", textValue); assertEquals("abc", textValue);
} }


+ 1
- 1
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValue.java View File

@@ -21,7 +21,7 @@ public interface BytesValue {
* @return * @return
*/ */
@DataField(order = 0, refEnum = true) @DataField(order = 0, refEnum = true)
BytesValueType getType();
DataType getType();


/** /**
* 数据值的二进制序列; * 数据值的二进制序列;


+ 21
- 21
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValueEntry.java View File

@@ -9,37 +9,37 @@ import com.jd.blockchain.utils.io.BytesUtils;
* *
*/ */
public class BytesValueEntry implements BytesValue { public class BytesValueEntry implements BytesValue {
BytesValueType type;
DataType type;
Bytes value; Bytes value;


private BytesValueEntry(BytesValueType type, byte[] bytes) {
private BytesValueEntry(DataType type, byte[] bytes) {
this.type = type; this.type = type;
this.value = new Bytes(bytes); this.value = new Bytes(bytes);
} }


private BytesValueEntry(BytesValueType type, Bytes bytes) {
private BytesValueEntry(DataType type, Bytes bytes) {
this.type = type; this.type = type;
this.value = bytes; this.value = bytes;
} }
public static BytesValue fromType(BytesValueType type, byte[] value) {
public static BytesValue fromType(DataType type, byte[] value) {
return new BytesValueEntry(type, value); return new BytesValueEntry(type, value);
} }


public static BytesValue fromBytes(byte[] value) { public static BytesValue fromBytes(byte[] value) {
return new BytesValueEntry(BytesValueType.BYTES, value);
return new BytesValueEntry(DataType.BYTES, value);
} }


public static BytesValue fromBytes(Bytes value) { public static BytesValue fromBytes(Bytes value) {
return new BytesValueEntry(BytesValueType.BYTES, value);
return new BytesValueEntry(DataType.BYTES, value);
} }


public static BytesValue fromImage(byte[] value) { public static BytesValue fromImage(byte[] value) {
return new BytesValueEntry(BytesValueType.IMG, value);
return new BytesValueEntry(DataType.IMG, value);
} }


public static BytesValue fromImage(Bytes value) { public static BytesValue fromImage(Bytes value) {
return new BytesValueEntry(BytesValueType.IMG, value);
return new BytesValueEntry(DataType.IMG, value);
} }


/** /**
@@ -49,7 +49,7 @@ public class BytesValueEntry implements BytesValue {
* @return * @return
*/ */
public static BytesValue fromText(String value) { public static BytesValue fromText(String value) {
return new BytesValueEntry(BytesValueType.TEXT, BytesUtils.toBytes(value));
return new BytesValueEntry(DataType.TEXT, BytesUtils.toBytes(value));
} }


/** /**
@@ -62,51 +62,51 @@ public class BytesValueEntry implements BytesValue {
if (bytesValue == null) { if (bytesValue == null) {
return null; return null;
} }
if (bytesValue.getType() != BytesValueType.TEXT) {
throw new ValueTypeCastException("The expected value type is " + BytesValueType.TEXT.toString()
if (bytesValue.getType() != DataType.TEXT) {
throw new ValueTypeCastException("The expected value type is " + DataType.TEXT.toString()
+ ", but it is actually " + bytesValue.getType().toString() + "!"); + ", but it is actually " + bytesValue.getType().toString() + "!");
} }
return bytesValue.getValue().toUTF8String(); return bytesValue.getValue().toUTF8String();
} }


public static BytesValue fromJSON(String value) { public static BytesValue fromJSON(String value) {
return new BytesValueEntry(BytesValueType.JSON, BytesUtils.toBytes(value));
return new BytesValueEntry(DataType.JSON, BytesUtils.toBytes(value));
} }


public static BytesValue fromXML(String value) { public static BytesValue fromXML(String value) {
return new BytesValueEntry(BytesValueType.XML, BytesUtils.toBytes(value));
return new BytesValueEntry(DataType.XML, BytesUtils.toBytes(value));
} }


public static BytesValue fromInt32(int value) { public static BytesValue fromInt32(int value) {
return new BytesValueEntry(BytesValueType.INT32, BytesUtils.toBytes(value));
return new BytesValueEntry(DataType.INT32, BytesUtils.toBytes(value));
} }


public static BytesValue fromInt64(long value) { public static BytesValue fromInt64(long value) {
return new BytesValueEntry(BytesValueType.INT64, BytesUtils.toBytes(value));
return new BytesValueEntry(DataType.INT64, BytesUtils.toBytes(value));
} }


public static BytesValue fromInt16(short value) { public static BytesValue fromInt16(short value) {
return new BytesValueEntry(BytesValueType.INT16, BytesUtils.toBytes(value));
return new BytesValueEntry(DataType.INT16, BytesUtils.toBytes(value));
} }


public static BytesValue fromInt8(byte value) { public static BytesValue fromInt8(byte value) {
return new BytesValueEntry(BytesValueType.INT8, BytesUtils.toBytes(value));
return new BytesValueEntry(DataType.INT8, BytesUtils.toBytes(value));
} }


public static BytesValue fromTimestamp(long value) { public static BytesValue fromTimestamp(long value) {
return new BytesValueEntry(BytesValueType.TIMESTAMP, BytesUtils.toBytes(value));
return new BytesValueEntry(DataType.TIMESTAMP, BytesUtils.toBytes(value));
} }


public static BytesValue fromBoolean(boolean value) { public static BytesValue fromBoolean(boolean value) {
return new BytesValueEntry(BytesValueType.BOOLEAN, BytesUtils.toBytes(value));
return new BytesValueEntry(DataType.BOOLEAN, BytesUtils.toBytes(value));
} }


@Override @Override
public BytesValueType getType() {
public DataType getType() {
return this.type; return this.type;
} }


public void setType(BytesValueType type) {
public void setType(DataType type) {
this.type = type; this.type = type;
} }




source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValueType.java → source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/DataType.java View File

@@ -1,8 +1,9 @@
package com.jd.blockchain.ledger; package com.jd.blockchain.ledger;
import com.jd.blockchain.binaryproto.PrimitiveType;
import com.jd.blockchain.binaryproto.BaseType;
import com.jd.blockchain.binaryproto.EnumContract; import com.jd.blockchain.binaryproto.EnumContract;
import com.jd.blockchain.binaryproto.EnumField; import com.jd.blockchain.binaryproto.EnumField;
import com.jd.blockchain.binaryproto.PrimitiveType;
import com.jd.blockchain.consts.DataCodes; import com.jd.blockchain.consts.DataCodes;
/** /**
@@ -11,8 +12,8 @@ import com.jd.blockchain.consts.DataCodes;
* @author huanghaiquan * @author huanghaiquan
* *
*/ */
@EnumContract(code = DataCodes.ENUM_TYPE_BYTES_VALUE_TYPE, name = "BytesValueType", decription = "")
public enum BytesValueType {
@EnumContract(code = DataCodes.ENUM_TYPE_BYTES_VALUE_TYPE)
public enum DataType {
/** /**
* 空; * 空;
@@ -35,61 +36,88 @@ public enum BytesValueType {
INT32(PrimitiveType.INT32.CODE), INT32(PrimitiveType.INT32.CODE),
INT64(PrimitiveType.INT64.CODE), INT64(PrimitiveType.INT64.CODE),
/**
* 时间戳;
*/
TIMESTAMP(PrimitiveType.TIMESTAMP.CODE),
/** /**
* 文本数据; * 文本数据;
*/ */
TEXT(PrimitiveType.TEXT.CODE), TEXT(PrimitiveType.TEXT.CODE),
/** /**
* 文本数据;
* 二进制数据;
*/ */
JSON(PrimitiveType.JSON.CODE),
BYTES(PrimitiveType.BYTES.CODE),
/**
* 时间戳;
*/
TIMESTAMP((byte) (BaseType.INTEGER | 0x08)),
/** /**
* 文本数据; * 文本数据;
*/ */
XML(PrimitiveType.XML.CODE),
JSON((byte) (BaseType.TEXT | 0x01)),
/** /**
* 二进制数据;
* 文本数据;
*/ */
BYTES(PrimitiveType.BYTES.CODE),
XML((byte) (BaseType.TEXT | 0x02)),
/** /**
* 大整数; * 大整数;
*/ */
BIG_INT(PrimitiveType.BIG_INT.CODE),
BIG_INT((byte) (BaseType.BYTES | 0x01)),
/** /**
* 图片; * 图片;
*/ */
IMG(PrimitiveType.IMG.CODE),
IMG((byte) (BaseType.BYTES | 0x02)),
/** /**
* 视频; * 视频;
*/ */
VIDEO(PrimitiveType.VIDEO.CODE),
VIDEO((byte) (BaseType.BYTES | 0x03)),
/** /**
* 位置;
* 位置坐标
*/ */
LOCATION(PrimitiveType.LOCATION.CODE);
LOCATION((byte) (BaseType.BYTES | 0x04)),
/**
* 公钥;
*/
PUB_KEY((byte) (BaseType.BYTES | 0x05)),
/**
* 签名摘要;
*/
SIGNATURE_DIGEST((byte) (BaseType.BYTES | 0x06)),
/**
* 哈希摘要;
*/
HASH_DIGEST((byte) (BaseType.BYTES | 0x07)),
/**
* 加密数据;
*/
ENCRYPTED_DATA((byte) (BaseType.BYTES | 0x08));
@EnumField(type = PrimitiveType.INT8) @EnumField(type = PrimitiveType.INT8)
public final byte CODE; public final byte CODE;
private BytesValueType(byte code) {
private DataType(byte code) {
this.CODE = code; this.CODE = code;
} }
public static BytesValueType valueOf(byte code) {
for (BytesValueType dataType : BytesValueType.values()) {
public static DataType valueOf(byte code) {
for (DataType dataType : DataType.values()) {
if (dataType.CODE == code) { if (dataType.CODE == code) {
return dataType; return dataType;
} }

+ 1
- 1
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVDataEntry.java View File

@@ -25,7 +25,7 @@ public interface KVDataEntry {
* *
* @return * @return
*/ */
BytesValueType getType();
DataType getType();
/** /**
* 值; * 值;


+ 20
- 20
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVDataObject.java View File

@@ -58,8 +58,8 @@ public class KVDataObject implements KVDataEntry {
* @see com.jd.blockchain.ledger.KVDataEntry#getType() * @see com.jd.blockchain.ledger.KVDataEntry#getType()
*/ */
@Override @Override
public BytesValueType getType() {
return bytesValue == null ? BytesValueType.NIL : bytesValue.getType();
public DataType getType() {
return bytesValue == null ? DataType.NIL : bytesValue.getType();
} }


@Override @Override
@@ -95,7 +95,7 @@ public class KVDataObject implements KVDataEntry {
* @return * @return
*/ */
public boolean isNil() { public boolean isNil() {
return bytesValue == null || BytesValueType.NIL == bytesValue.getType();
return bytesValue == null || DataType.NIL == bytesValue.getType();
} }


/** /**
@@ -119,10 +119,10 @@ public class KVDataObject implements KVDataEntry {
* @return * @return
*/ */
public byte tinyValue() { public byte tinyValue() {
if (BytesValueType.INT8 == getType()) {
if (DataType.INT8 == getType()) {
return bytesValue.getValue().toBytes()[0]; return bytesValue.getValue().toBytes()[0];
} }
throw new IllegalStateException(String.format("Expected type [%s], but [%s]", BytesValueType.INT8, getType()));
throw new IllegalStateException(String.format("Expected type [%s], but [%s]", DataType.INT8, getType()));
} }


/** /**
@@ -137,10 +137,10 @@ public class KVDataObject implements KVDataEntry {
* @return * @return
*/ */
public short shortValue() { public short shortValue() {
if (BytesValueType.INT16 == getType()) {
if (DataType.INT16 == getType()) {
return BytesUtils.toShort(bytesValue.getValue().toBytes(), 0); return BytesUtils.toShort(bytesValue.getValue().toBytes(), 0);
} }
throw new IllegalStateException(String.format("Expected type [%s], but [%s]", BytesValueType.INT16, getType()));
throw new IllegalStateException(String.format("Expected type [%s], but [%s]", DataType.INT16, getType()));
} }


/** /**
@@ -155,10 +155,10 @@ public class KVDataObject implements KVDataEntry {
* @return * @return
*/ */
public int intValue() { public int intValue() {
if (BytesValueType.INT32 == getType()) {
if (DataType.INT32 == getType()) {
return BytesUtils.toInt(bytesValue.getValue().toBytes(), 0); return BytesUtils.toInt(bytesValue.getValue().toBytes(), 0);
} }
throw new IllegalStateException(String.format("Expected type [%s], but [%s]", BytesValueType.INT32, getType()));
throw new IllegalStateException(String.format("Expected type [%s], but [%s]", DataType.INT32, getType()));
} }


/** /**
@@ -173,10 +173,10 @@ public class KVDataObject implements KVDataEntry {
* @return * @return
*/ */
public long longValue() { public long longValue() {
if (BytesValueType.INT64 == getType()) {
if (DataType.INT64 == getType()) {
return BytesUtils.toLong(bytesValue.getValue().toBytes(), 0); return BytesUtils.toLong(bytesValue.getValue().toBytes(), 0);
} }
throw new IllegalStateException(String.format("Expected type [%s], but [%s]", BytesValueType.INT64, getType()));
throw new IllegalStateException(String.format("Expected type [%s], but [%s]", DataType.INT64, getType()));


} }


@@ -192,11 +192,11 @@ public class KVDataObject implements KVDataEntry {
* @return * @return
*/ */
public BigInteger bigIntValue() { public BigInteger bigIntValue() {
if (BytesValueType.BIG_INT == getType()) {
if (DataType.BIG_INT == getType()) {
return new BigInteger(bytesValue.getValue().toBytes()); return new BigInteger(bytesValue.getValue().toBytes());
} }
throw new IllegalStateException( throw new IllegalStateException(
String.format("Expected type [%s], but [%s]", BytesValueType.BIG_INT, getType()));
String.format("Expected type [%s], but [%s]", DataType.BIG_INT, getType()));
} }


/** /**
@@ -211,11 +211,11 @@ public class KVDataObject implements KVDataEntry {
* @return * @return
*/ */
public boolean boolValue() { public boolean boolValue() {
if (BytesValueType.BOOLEAN == getType()) {
if (DataType.BOOLEAN == getType()) {
return BytesUtils.toBoolean(bytesValue.getValue().toBytes()[0]); return BytesUtils.toBoolean(bytesValue.getValue().toBytes()[0]);
} }
throw new IllegalStateException( throw new IllegalStateException(
String.format("Expected type [%s], but [%s]", BytesValueType.BOOLEAN, getType()));
String.format("Expected type [%s], but [%s]", DataType.BOOLEAN, getType()));
} }


/** /**
@@ -230,12 +230,12 @@ public class KVDataObject implements KVDataEntry {
* @return * @return
*/ */
public Date datetimeValue() { public Date datetimeValue() {
if (BytesValueType.TIMESTAMP == getType()) {
if (DataType.TIMESTAMP == getType()) {
long ts = BytesUtils.toLong(bytesValue.getValue().toBytes()); long ts = BytesUtils.toLong(bytesValue.getValue().toBytes());
return new Date(ts); return new Date(ts);
} }
throw new IllegalStateException( throw new IllegalStateException(
String.format("Expected type [%s], but [%s]", BytesValueType.TIMESTAMP, getType()));
String.format("Expected type [%s], but [%s]", DataType.TIMESTAMP, getType()));
} }


/** /**
@@ -251,12 +251,12 @@ public class KVDataObject implements KVDataEntry {
* @return * @return
*/ */
public String stringValue() { public String stringValue() {
BytesValueType type = getType();
if (BytesValueType.TEXT == type || BytesValueType.JSON == type || BytesValueType.XML == type) {
DataType type = getType();
if (DataType.TEXT == type || DataType.JSON == type || DataType.XML == type) {
return bytesValue.getValue().toUTF8String(); return bytesValue.getValue().toUTF8String();
} }
throw new IllegalStateException(String.format("Expected type [%s] or [%s] or [%s] , but [%s]", throw new IllegalStateException(String.format("Expected type [%s] or [%s] or [%s] , but [%s]",
PrimitiveType.TEXT, BytesValueType.JSON, BytesValueType.XML, type));
PrimitiveType.TEXT, DataType.JSON, DataType.XML, type));
} }


// // ---------------- // // ----------------


Loading…
Cancel
Save