Browse Source

Refactored MerkleAccount;

tags/1.1.2^2
huanghaiquan 5 years ago
parent
commit
ae9d4aaa7b
26 changed files with 136 additions and 169 deletions
  1. +2
    -2
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/ContractAccount.java
  2. +2
    -3
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerQueryService.java
  3. +42
    -61
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/MerkleAccount.java
  4. +17
    -8
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/MerkleAccountSet.java
  5. +3
    -3
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/UserAccount.java
  6. +8
    -8
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/ContractInvokingTest.java
  7. +1
    -1
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerEditorTest.java
  8. +6
    -6
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/TransactionBatchProcessorTest.java
  9. +2
    -2
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/TransactionSetTest.java
  10. +1
    -1
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/BytesValue.java
  11. +14
    -14
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVDataObject.java
  12. +3
    -3
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TypedValue.java
  13. +1
    -1
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/resolver/AbstractBytesValueResolver.java
  14. +1
    -1
      source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/BytesToBytesValueResolverTest.java
  15. +2
    -2
      source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/BytesValueEncodingTest.java
  16. +1
    -1
      source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/DataAccountKVSetOpTemplateTest.java
  17. +3
    -3
      source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/IntegerToBytesValueResolverTest.java
  18. +1
    -1
      source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/KVDataTest.java
  19. +3
    -3
      source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/LongToBytesValueResolverTest.java
  20. +1
    -1
      source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/ShortToBytesValueResolverTest.java
  21. +2
    -2
      source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/StringToBytesValueResolverTest.java
  22. +4
    -4
      source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/TxContentBlobTest.java
  23. +8
    -8
      source/peer/src/main/java/com/jd/blockchain/peer/web/LedgerQueryController.java
  24. +1
    -1
      source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/converters/ClientResolveUtil.java
  25. +7
    -7
      source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTestAll4Redis.java
  26. +0
    -22
      source/utils/utils-common/src/main/java/com/jd/blockchain/utils/Dataset.java

+ 2
- 2
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/ContractAccount.java View File

@@ -40,11 +40,11 @@ public class ContractAccount extends AccountDecorator implements ContractInfo {
}
public byte[] getChainCode() {
return getHeaders().getValue(CHAIN_CODE_KEY).getValue().toBytes();
return getHeaders().getValue(CHAIN_CODE_KEY).getBytes().toBytes();
}
public byte[] getChainCode(long version) {
return getHeaders().getValue(CHAIN_CODE_KEY, version).getValue().toBytes();
return getHeaders().getValue(CHAIN_CODE_KEY, version).getBytes().toBytes();
}
public long getChaincodeVersion() {


+ 2
- 3
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerQueryService.java View File

@@ -5,7 +5,6 @@ import java.util.List;

import com.jd.blockchain.contract.ContractException;
import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.ledger.AccountHeader;
import com.jd.blockchain.ledger.BlockchainIdentity;
import com.jd.blockchain.ledger.BytesValue;
import com.jd.blockchain.ledger.ContractInfo;
@@ -293,12 +292,12 @@ public class LedgerQueryService implements BlockchainQueryService {
for (int i = 0; i < entries.length; i++) {
final String currKey = keys[i];

ver = dataAccount == null ? -1 : dataAccount.getDataset().getVersion(Bytes.fromString(currKey));
ver = dataAccount == null ? -1 : dataAccount.getDataset().getVersion(currKey);

if (ver < 0) {
entries[i] = new KVDataObject(currKey, -1, null);
} else {
BytesValue value = dataAccount.getDataset().getValue(Bytes.fromString(currKey), ver);
BytesValue value = dataAccount.getDataset().getValue(currKey, ver);
entries[i] = new KVDataObject(currKey, ver, value);
}
}


+ 42
- 61
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/MerkleAccount.java View File

@@ -49,68 +49,60 @@ public class MerkleAccount implements LedgerAccount, HashProvable, MerkleSnapsho

private Dataset<String, TypedValue> typedData;

private long version;
// private long version;

/**
* Create a new Account with the specified address and pubkey; <br>
* Create a new Account with the specified identity(address and pubkey); <br>
*
* At the same time, a empty merkle dataset is also created for this account,
* which is used for storing data of this account.<br>
*
* This new account will be writable. <br>
*
* Note that, the blockchain identity of the account is not stored in the
* account's merkle dataset, but is stored by the outer invoker;
*
* @param accountID 身份;
* @param cryptoSetting 密码参数;
* @param keyPrefix 数据前缀;
* @param exStorage
* @param verStorage
* @param accountID Identity of this new account;
* @param cryptoSetting Settings about crypto operations;
* @param keyPrefix Prefix of all keys in this account's dataset;
* @param exStorage The base storage for existance operation;
* @param verStorage The base storage for versioning operation;
*/
public MerkleAccount(BlockchainIdentity accountID, CryptoSetting cryptoSetting, Bytes keyPrefix,
ExPolicyKVStorage exStorage, VersioningKVStorage verStorage) {
this(accountID.getAddress(), accountID.getPubKey(), -1, null, cryptoSetting, keyPrefix, exStorage, verStorage,
false);
// 初始化数据集;
initializeDatasets(null, cryptoSetting, keyPrefix, exStorage, verStorage, false);

initPubKey(accountID.getPubKey());
this.accountID = accountID;
}

/**
* Create a account instance with the specified address and pubkey and load it's
* Create a account instance with the specified address and root hash; load it's
* merkle dataset from the specified root hash. This merkle dateset is used for
* storing data of this account.<br>
*
* @param accountID identity of this account;
* @param version
* @param dataRootHash merkle root hash of account's data; if set to a null
* value, an empty merkle dataset is created;
* @param cryptoSetting
* @param keyPrefix
* @param exStorage
* @param verStorage
* @param readonly
* @param address Address of this account;
* @param rootHash Merkle root hash of this account; It can not be null;
* @param cryptoSetting Settings about crypto operations;
* @param keyPrefix Prefix of all keys in this account's dataset;
* @param exStorage The base storage for existance operation;
* @param verStorage The base storage for versioning operation;
* @param readonly Readonly about this account's dataset;
*/
public MerkleAccount(Bytes address, long version, HashDigest dataRootHash, CryptoSetting cryptoSetting,
Bytes keyPrefix, ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, boolean readonly) {
this(address, null, version, dataRootHash, cryptoSetting, keyPrefix, exStorage, verStorage, readonly);
}
public MerkleAccount(Bytes address, HashDigest rootHash, CryptoSetting cryptoSetting, Bytes keyPrefix,
ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, boolean readonly) {
if (rootHash == null) {
throw new IllegalArgumentException("Specified a null root hash for account[" + address.toBase58() + "]!");
}

/**
* 内部构造器;
*
* @param address 账户地址;
* @param pubKey 账户公钥; 如果为空,则会进行加载验证;
* @param version 账户版本;
* @param rootHash 账户根哈希;
* @param cryptoSetting 密码参数设置;
* @param keyPrefix 当前账户的 Key 前缀;
* @param exStorage 单键存储服务;
* @param verStorage 多版本存储服务;
* @param readonly 是否只读;
*/
private MerkleAccount(Bytes address, PubKey pubKey, long version, HashDigest rootHash, CryptoSetting cryptoSetting,
Bytes keyPrefix, ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, boolean readonly) {
this.version = version;
// 初始化数据集;
initializeDatasets(rootHash, cryptoSetting, keyPrefix, exStorage, verStorage, readonly);

// 初始化账户的身份;
PubKey pubKey = loadPubKey();
this.accountID = new AccountID(address, pubKey);
}

private void initializeDatasets(HashDigest rootHash, CryptoSetting cryptoSetting, Bytes keyPrefix,
ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, boolean readonly) {
// 加载“根数据集”
this.rootDataset = new MerkleDataSet(rootHash, cryptoSetting, keyPrefix, exStorage, verStorage, readonly);

@@ -148,15 +140,6 @@ public class MerkleAccount implements LedgerAccount, HashProvable, MerkleSnapsho
Bytes dataPrefix = keyPrefix.concat(DATA_PREFIX);
this.dataDataset = new MerkleDataSet(dataRoot, cryptoSetting, dataPrefix, exStorage, verStorage, readonly);
this.typedData = DatasetHelper.listen(DatasetHelper.map(dataDataset, valueMapper), dataChangedListener);

// 初始化账户的身份;
if (pubKey == null) {
if (version < 0) {
throw new IllegalArgumentException("Specified a null PubKey for newly Account!");
}
pubKey = loadPubKey();
}
this.accountID = new AccountID(address, pubKey);
}

private HashDigest loadHeaderRoot() {
@@ -258,6 +241,9 @@ public class MerkleAccount implements LedgerAccount, HashProvable, MerkleSnapsho
*/
private PubKey loadPubKey() {
TypedValue value = typedHeader.getValue(KEY_PUBKEY);
if (value == null) {
return null;
}
return value.pubKeyValue();
}

@@ -276,12 +262,10 @@ public class MerkleAccount implements LedgerAccount, HashProvable, MerkleSnapsho
*
* 此方法默认会返回新的账户版本号,等于当前版本号加 1 ;
*
* @param newRootHash
* @param currentVersion
* @return
* @param previousRootHash 提交前的根哈希;如果是新账户的首次提交,则为 null;
* @param newRootHash 新的根哈希;
*/
protected long onCommited(HashDigest newRootHash, long currentVersion) {
return currentVersion + 1;
protected void onCommited(HashDigest previousRootHash, HashDigest newRootHash) {
}

@Override
@@ -303,8 +287,9 @@ public class MerkleAccount implements LedgerAccount, HashProvable, MerkleSnapsho
}

if (rootDataset.isUpdated()) {
HashDigest previousRootHash = rootDataset.getRootHash();
rootDataset.commit();
this.version = onCommited(rootDataset.getRootHash(), version);
onCommited(previousRootHash, rootDataset.getRootHash());
}
}

@@ -340,10 +325,6 @@ public class MerkleAccount implements LedgerAccount, HashProvable, MerkleSnapsho

}

public long getVersion() {
return version;
}

// private static class MerkleDatasetAdapter implements Dataset<String, BytesValue> {
//
// private static DataChangedListener NULL_LISTENER = new DataChangedListener() {


+ 17
- 8
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/MerkleAccountSet.java View File

@@ -94,7 +94,8 @@ public class MerkleAccountSet implements Transactional, MerkleProvable, AccountQ
BlockchainIdentity[] ids = new BlockchainIdentity[results.length];
for (int i = 0; i < results.length; i++) {
InnerMerkleAccount account = createAccount(results[i].getKey(), new HashDigest(results[i].getValue()), results[i].getVersion(), true);
InnerMerkleAccount account = createAccount(results[i].getKey(), new HashDigest(results[i].getValue()),
results[i].getVersion(), true);
ids[i] = account.getID();
}
return ids;
@@ -284,11 +285,11 @@ public class MerkleAccountSet implements Transactional, MerkleProvable, AccountQ
return createAccount(address, rootHash, version, readonly);
}
private InnerMerkleAccount createAccount(Bytes address,HashDigest rootHash, long version, boolean readonly) {
private InnerMerkleAccount createAccount(Bytes address, HashDigest rootHash, long version, boolean readonly) {
// prefix;
Bytes prefix = keyPrefix.concat(address);
return new InnerMerkleAccount(address, version, rootHash, cryptoSetting, prefix, baseExStorage, baseVerStorage,
readonly);
}
@@ -358,14 +359,18 @@ public class MerkleAccountSet implements Transactional, MerkleProvable, AccountQ
*/
private class InnerMerkleAccount extends MerkleAccount {
private long version;
public InnerMerkleAccount(BlockchainIdentity accountID, CryptoSetting cryptoSetting, Bytes keyPrefix,
ExPolicyKVStorage exStorage, VersioningKVStorage verStorage) {
super(accountID, cryptoSetting, keyPrefix, exStorage, verStorage);
this.version = -1;
}
public InnerMerkleAccount(Bytes address, long version, HashDigest dataRootHash, CryptoSetting cryptoSetting,
Bytes keyPrefix, ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, boolean readonly) {
super(address, version, dataRootHash, cryptoSetting, keyPrefix, exStorage, verStorage, readonly);
super(address, dataRootHash, cryptoSetting, keyPrefix, exStorage, verStorage, readonly);
this.version = version;
}
@Override
@@ -374,13 +379,17 @@ public class MerkleAccountSet implements Transactional, MerkleProvable, AccountQ
}
@Override
protected long onCommited(HashDigest newRootHash, long currentVersion) {
long newVersion = merkleDataset.setValue(this.getAddress(), newRootHash.toBytes(), currentVersion);
protected void onCommited(HashDigest previousRootHash, HashDigest newRootHash) {
long newVersion = merkleDataset.setValue(this.getAddress(), newRootHash.toBytes(), version);
if (newVersion < 0) {
// Update fail;
throw new LedgerException("Account updating fail! --[Address=" + this.getAddress() + "]");
}
return newVersion;
this.version = newVersion;
}
public long getVersion() {
return version;
}
}


+ 3
- 3
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/UserAccount.java View File

@@ -43,7 +43,7 @@ public class UserAccount extends AccountDecorator implements UserInfo { // imple
if (pkBytes == null) {
return null;
}
dataPubKey = new PubKey(pkBytes.getValue().toBytes());
dataPubKey = new PubKey(pkBytes.getBytes().toBytes());
}
return dataPubKey;
}
@@ -69,12 +69,12 @@ public class UserAccount extends AccountDecorator implements UserInfo { // imple
public String getProperty(String key) {
BytesValue value = getHeaders().getValue(encodePropertyKey(key));
return value == null ? null : value.getValue().toUTF8String();
return value == null ? null : value.getBytes().toUTF8String();
}
public String getProperty(String key, long version) {
BytesValue value = getHeaders().getValue(encodePropertyKey(key), version);
return value == null ? null : value.getValue().toUTF8String();
return value == null ? null : value.getBytes().toUTF8String();
}
private String encodePropertyKey(String key) {


+ 8
- 8
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/ContractInvokingTest.java View File

@@ -27,7 +27,6 @@ import com.jd.blockchain.ledger.BlockchainKeypair;
import com.jd.blockchain.ledger.BytesValue;
import com.jd.blockchain.ledger.DataAccountRegisterOperation;
import com.jd.blockchain.ledger.EndpointRequest;
import com.jd.blockchain.ledger.KVDataEntry;
import com.jd.blockchain.ledger.LedgerBlock;
import com.jd.blockchain.ledger.LedgerInitSetting;
import com.jd.blockchain.ledger.LedgerPermission;
@@ -65,6 +64,7 @@ import com.jd.blockchain.storage.service.utils.MemoryKVStorage;
import com.jd.blockchain.transaction.BooleanValueHolder;
import com.jd.blockchain.transaction.TxBuilder;
import com.jd.blockchain.utils.Bytes;
import com.jd.blockchain.utils.DataEntry;
import com.jd.blockchain.utils.io.BytesUtils;

import test.com.jd.blockchain.ledger.TxTestContract;
@@ -243,7 +243,7 @@ public class ContractInvokingTest {

BytesValue latestValue = ledgerRepo.getDataAccountSet().getAccount(kpDataAccount.getAddress()).getDataset().getValue(key,
-1);
System.out.printf("latest value=[%s] %s \r\n", latestValue.getType(), latestValue.getValue().toUTF8String());
System.out.printf("latest value=[%s] %s \r\n", latestValue.getType(), latestValue.getBytes().toUTF8String());

boolean readable = readableHolder.get();
assertTrue(readable);
@@ -301,9 +301,9 @@ public class ContractInvokingTest {
}
});
// 预期数据都能够正常写入;
KVDataEntry kv1 = ledgerRepo.getDataAccountSet().getAccount(kpDataAccount.getAddress()).getDataset().getDataEntry("K1",
DataEntry<String, TypedValue> kv1 = ledgerRepo.getDataAccountSet().getAccount(kpDataAccount.getAddress()).getDataset().getDataEntry("K1",
0);
KVDataEntry kv2 = ledgerRepo.getDataAccountSet().getAccount(kpDataAccount.getAddress()).getDataEntry("K2",
DataEntry<String, TypedValue> kv2 = ledgerRepo.getDataAccountSet().getAccount(kpDataAccount.getAddress()).getDataset().getDataEntry("K2",
0);
assertEquals(0, kv1.getVersion());
assertEquals(0, kv2.getVersion());
@@ -322,8 +322,8 @@ public class ContractInvokingTest {
}
});
// 预期数据都能够正常写入;
kv1 = ledgerRepo.getDataAccountSet().getAccount(kpDataAccount.getAddress()).getDataEntry("K1", 1);
kv2 = ledgerRepo.getDataAccountSet().getAccount(kpDataAccount.getAddress()).getDataEntry("K2", 1);
kv1 = ledgerRepo.getDataAccountSet().getAccount(kpDataAccount.getAddress()).getDataset().getDataEntry("K1", 1);
kv2 = ledgerRepo.getDataAccountSet().getAccount(kpDataAccount.getAddress()).getDataset().getDataEntry("K2", 1);
assertEquals(1, kv1.getVersion());
assertEquals(1, kv2.getVersion());
assertEquals("V1-1", kv1.getValue());
@@ -341,10 +341,10 @@ public class ContractInvokingTest {
}
});
// 预期数据都能够正常写入;
kv1 = ledgerRepo.getDataAccountSet().getAccount(kpDataAccount.getAddress()).getDataEntry("K1", 1);
kv1 = ledgerRepo.getDataAccountSet().getAccount(kpDataAccount.getAddress()).getDataset().getDataEntry("K1", 1);
assertEquals(1, kv1.getVersion());
assertEquals("V1-1", kv1.getValue());
kv1 = ledgerRepo.getDataAccountSet().getAccount(kpDataAccount.getAddress()).getDataEntry("K1", 2);
kv1 = ledgerRepo.getDataAccountSet().getAccount(kpDataAccount.getAddress()).getDataset().getDataEntry("K1", 2);
assertEquals(-1, kv1.getVersion());
assertEquals(null, kv1.getValue());



+ 1
- 1
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerEditorTest.java View File

@@ -109,7 +109,7 @@ public class LedgerEditorTest {
// 验证数据读写的一致性;
BytesValue bytes = dataAccount.getDataset().getValue("A");
assertEquals(DataType.TEXT, bytes.getType());
String textValue = bytes.getValue().toUTF8String();
String textValue = bytes.getBytes().toUTF8String();
assertEquals("abc", textValue);
}



+ 6
- 6
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/TransactionBatchProcessorTest.java View File

@@ -346,10 +346,10 @@ public class TransactionBatchProcessorTest {
assertNotNull(v2);
assertNotNull(v3);

assertEquals("V-1-1", v1_0.getValue().toUTF8String());
assertEquals("V-1-2", v1_1.getValue().toUTF8String());
assertEquals("V-2-1", v2.getValue().toUTF8String());
assertEquals("V-3-1", v3.getValue().toUTF8String());
assertEquals("V-1-1", v1_0.getBytes().toUTF8String());
assertEquals("V-1-2", v1_1.getBytes().toUTF8String());
assertEquals("V-2-1", v2.getBytes().toUTF8String());
assertEquals("V-3-1", v3.getBytes().toUTF8String());

// 提交多笔数据写入的交易,包含存在数据版本冲突的交易,验证交易是否正确回滚;
// 先写一笔正确的交易; k3 的版本将变为 1 ;
@@ -390,8 +390,8 @@ public class TransactionBatchProcessorTest {

assertNotNull(v1);
assertNotNull(v3);
assertEquals("V-1-2", v1.getValue().toUTF8String());
assertEquals("V-3-2", v3.getValue().toUTF8String());
assertEquals("V-1-2", v1.getBytes().toUTF8String());
assertEquals("V-3-2", v3.getBytes().toUTF8String());

// // 验证正确性;
// ledgerManager = new LedgerManager();


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

@@ -164,8 +164,8 @@ public class TransactionSetTest {
for (int i = 0; i < acutualKVWriteSet.length; i++) {
assertEquals(expKVWriteSet[i].getKey(), acutualKVWriteSet[i].getKey());
assertEquals(expKVWriteSet[i].getExpectedVersion(), acutualKVWriteSet[i].getExpectedVersion());
assertTrue(BytesUtils.equals(expKVWriteSet[i].getValue().getValue().toBytes(),
acutualKVWriteSet[i].getValue().getValue().toBytes()));
assertTrue(BytesUtils.equals(expKVWriteSet[i].getValue().getBytes().toBytes(),
acutualKVWriteSet[i].getValue().getBytes().toBytes()));
}

ContractCodeDeployOperation actualContractDplOp = (ContractCodeDeployOperation) actualOperations[3];


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

@@ -29,6 +29,6 @@ public interface BytesValue {
* @return
*/
@DataField(order = 1, primitiveType = PrimitiveType.BYTES)
Bytes getValue();
Bytes getBytes();
}

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

@@ -72,15 +72,15 @@ public class KVDataObject implements KVDataEntry {
case NIL:
return null;
case TEXT:
return bytesValue.getValue().toUTF8String();
return bytesValue.getBytes().toUTF8String();
case BYTES:
return ByteArray.toHex(bytesValue.getValue().toBytes());
return ByteArray.toHex(bytesValue.getBytes().toBytes());
case INT64:
return BytesUtils.toLong(bytesValue.getValue().toBytes());
return BytesUtils.toLong(bytesValue.getBytes().toBytes());
case JSON:
return bytesValue.getValue().toUTF8String();
return bytesValue.getBytes().toUTF8String();
case XML:
return bytesValue.getValue().toUTF8String();
return bytesValue.getBytes().toUTF8String();

default:
throw new IllegalStateException("Unsupported value type[" + getType() + "] to resolve!");
@@ -106,7 +106,7 @@ public class KVDataObject implements KVDataEntry {
* @return
*/
Bytes bytesArray() {
return bytesValue.getValue();
return bytesValue.getBytes();
}

/**
@@ -122,7 +122,7 @@ public class KVDataObject implements KVDataEntry {
*/
public byte tinyValue() {
if (DataType.INT8 == getType()) {
return bytesValue.getValue().toBytes()[0];
return bytesValue.getBytes().toBytes()[0];
}
throw new IllegalStateException(String.format("Expected type [%s], but [%s]", DataType.INT8, getType()));
}
@@ -140,7 +140,7 @@ public class KVDataObject implements KVDataEntry {
*/
public short shortValue() {
if (DataType.INT16 == getType()) {
return BytesUtils.toShort(bytesValue.getValue().toBytes(), 0);
return BytesUtils.toShort(bytesValue.getBytes().toBytes(), 0);
}
throw new IllegalStateException(String.format("Expected type [%s], but [%s]", DataType.INT16, getType()));
}
@@ -158,7 +158,7 @@ public class KVDataObject implements KVDataEntry {
*/
public int intValue() {
if (DataType.INT32 == getType()) {
return BytesUtils.toInt(bytesValue.getValue().toBytes(), 0);
return BytesUtils.toInt(bytesValue.getBytes().toBytes(), 0);
}
throw new IllegalStateException(String.format("Expected type [%s], but [%s]", DataType.INT32, getType()));
}
@@ -176,7 +176,7 @@ public class KVDataObject implements KVDataEntry {
*/
public long longValue() {
if (DataType.INT64 == getType()) {
return BytesUtils.toLong(bytesValue.getValue().toBytes(), 0);
return BytesUtils.toLong(bytesValue.getBytes().toBytes(), 0);
}
throw new IllegalStateException(String.format("Expected type [%s], but [%s]", DataType.INT64, getType()));

@@ -195,7 +195,7 @@ public class KVDataObject implements KVDataEntry {
*/
public BigInteger bigIntValue() {
if (DataType.BIG_INT == getType()) {
return new BigInteger(bytesValue.getValue().toBytes());
return new BigInteger(bytesValue.getBytes().toBytes());
}
throw new IllegalStateException(
String.format("Expected type [%s], but [%s]", DataType.BIG_INT, getType()));
@@ -214,7 +214,7 @@ public class KVDataObject implements KVDataEntry {
*/
public boolean boolValue() {
if (DataType.BOOLEAN == getType()) {
return BytesUtils.toBoolean(bytesValue.getValue().toBytes()[0]);
return BytesUtils.toBoolean(bytesValue.getBytes().toBytes()[0]);
}
throw new IllegalStateException(
String.format("Expected type [%s], but [%s]", DataType.BOOLEAN, getType()));
@@ -233,7 +233,7 @@ public class KVDataObject implements KVDataEntry {
*/
public Date datetimeValue() {
if (DataType.TIMESTAMP == getType()) {
long ts = BytesUtils.toLong(bytesValue.getValue().toBytes());
long ts = BytesUtils.toLong(bytesValue.getBytes().toBytes());
return new Date(ts);
}
throw new IllegalStateException(
@@ -255,7 +255,7 @@ public class KVDataObject implements KVDataEntry {
public String stringValue() {
DataType type = getType();
if (DataType.TEXT == type || DataType.JSON == type || DataType.XML == type) {
return bytesValue.getValue().toUTF8String();
return bytesValue.getBytes().toUTF8String();
}
throw new IllegalStateException(String.format("Expected type [%s] or [%s] or [%s] , but [%s]",
PrimitiveType.TEXT, DataType.JSON, DataType.XML, type));


+ 3
- 3
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TypedValue.java View File

@@ -34,7 +34,7 @@ public class TypedValue implements BytesValue {
private TypedValue(BytesValue bytesValue) {
this.type = bytesValue.getType();
this.value = bytesValue.getValue();
this.value = bytesValue.getBytes();
}
private TypedValue() {
@@ -48,11 +48,11 @@ public class TypedValue implements BytesValue {
}

@Override
public Bytes getValue() {
public Bytes getBytes() {
return this.value;
}

public Object getTypedValue() {
public Object getValue() {
if (isNil()) {
return null;
}


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

@@ -47,7 +47,7 @@ public abstract class AbstractBytesValueResolver implements BytesValueResolver {
if (!isSupport(dataType)) {
throw new IllegalStateException(String.format("Un-support encode DataType[%s] Object !!!", dataType.name()));
}
return decode(value.getValue());
return decode(value.getBytes());
}

protected abstract Object decode(Bytes value);

+ 1
- 1
source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/BytesToBytesValueResolverTest.java View File

@@ -26,7 +26,7 @@ public class BytesToBytesValueResolverTest {

assertEquals(bytesValue.getType(), DataType.BYTES);

assertEquals(bytesObj, bytesValue.getValue());
assertEquals(bytesObj, bytesValue.getBytes());

Bytes resolveBytesObj = (Bytes)resolver.decode(bytesValue);



+ 2
- 2
source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/BytesValueEncodingTest.java View File

@@ -28,9 +28,9 @@ public class BytesValueEncodingTest {
BytesValue longBytesVal2 = BytesValueEncoding.encodeSingle(longVal, long.class);
BytesValue longBytesVal3 = BytesValueEncoding.encodeSingle(longVal, Long.class);

assertEquals(longBytesVal1.getValue(), longBytesVal2.getValue());
assertEquals(longBytesVal1.getBytes(), longBytesVal2.getBytes());
assertEquals(longBytesVal1.getType(), longBytesVal2.getType());
assertEquals(longBytesVal2.getValue(), longBytesVal3.getValue());
assertEquals(longBytesVal2.getBytes(), longBytesVal3.getBytes());
assertEquals(longBytesVal2.getType(), longBytesVal3.getType());

long resolveLongVal1 = (long)BytesValueEncoding.decode(longBytesVal1);


+ 1
- 1
source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/DataAccountKVSetOpTemplateTest.java View File

@@ -63,7 +63,7 @@ public class DataAccountKVSetOpTemplateTest {
assertEquals(dataKv.length, resolvedKv.length);
for (int i = 0; i < dataKv.length; i++) {
assertEquals(dataKv[i].getKey(), resolvedKv[i].getKey());
assertArrayEquals(dataKv[i].getValue().getValue().toBytes(), resolvedKv[i].getValue().getValue().toBytes());
assertArrayEquals(dataKv[i].getValue().getBytes().toBytes(), resolvedKv[i].getValue().getBytes().toBytes());
assertEquals(dataKv[i].getValue().getType().CODE, resolvedKv[i].getValue().getType().CODE);

assertEquals(dataKv[i].getExpectedVersion(), resolvedKv[i].getExpectedVersion());


+ 3
- 3
source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/IntegerToBytesValueResolverTest.java View File

@@ -22,13 +22,13 @@ public class IntegerToBytesValueResolverTest {

BytesValue intBytesValue2 = resolver.encode(intVal, Integer.class);

assertEquals(intBytesValue.getValue(), intBytesValue1.getValue());
assertEquals(intBytesValue.getBytes(), intBytesValue1.getBytes());

assertEquals(intBytesValue.getValue(), intBytesValue2.getValue());
assertEquals(intBytesValue.getBytes(), intBytesValue2.getBytes());

Bytes intBytes = Bytes.fromInt(intVal);

assertEquals(intBytes, intBytesValue.getValue());
assertEquals(intBytes, intBytesValue.getBytes());

assertEquals(intBytesValue.getType(), DataType.INT32);



+ 1
- 1
source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/KVDataTest.java View File

@@ -48,7 +48,7 @@ public class KVDataTest {
System.out.println("------Assert start ------");
assertEquals(resolvedKvData.getKey(), kvData.getKey());
assertEquals(resolvedKvData.getExpectedVersion(), kvData.getExpectedVersion());
assertArrayEquals(resolvedKvData.getValue().getValue().toBytes(), kvData.getValue().getValue().toBytes());
assertArrayEquals(resolvedKvData.getValue().getBytes().toBytes(), kvData.getValue().getBytes().toBytes());
System.out.println("------Assert OK ------");
}
}

+ 3
- 3
source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/LongToBytesValueResolverTest.java View File

@@ -23,13 +23,13 @@ public class LongToBytesValueResolverTest {

BytesValue longBytesValue2 = resolver.encode(longVal, Long.class);

assertEquals(longBytesValue.getValue(), longBytesValue1.getValue());
assertEquals(longBytesValue.getBytes(), longBytesValue1.getBytes());

assertEquals(longBytesValue.getValue(), longBytesValue2.getValue());
assertEquals(longBytesValue.getBytes(), longBytesValue2.getBytes());

Bytes longBytes = Bytes.fromLong(longVal);

assertEquals(longBytes, longBytesValue.getValue());
assertEquals(longBytes, longBytesValue.getBytes());

assertEquals(longBytesValue.getType(), DataType.INT64);



+ 1
- 1
source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/ShortToBytesValueResolverTest.java View File

@@ -21,7 +21,7 @@ public class ShortToBytesValueResolverTest {

Bytes shortBytes = new Bytes(BytesUtils.toBytes(shortVal));

assertEquals(shortBytes, shortBytesValue.getValue());
assertEquals(shortBytes, shortBytesValue.getBytes());

assertEquals(shortBytesValue.getType(), DataType.INT16);



+ 2
- 2
source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/StringToBytesValueResolverTest.java View File

@@ -20,7 +20,7 @@ public class StringToBytesValueResolverTest {

BytesValue textBytesValue = resolver.encode(textVal);

assertEquals(Bytes.fromString(textVal), textBytesValue.getValue());
assertEquals(Bytes.fromString(textVal), textBytesValue.getBytes());

assertEquals(textBytesValue.getType(), DataType.TEXT);

@@ -43,7 +43,7 @@ public class StringToBytesValueResolverTest {
Person person = new Person("zhangsan", 80);
String personJson = JSON.toJSONString(person);
BytesValue textBytesValue = resolver.encode(personJson);
assertEquals(Bytes.fromString(personJson), textBytesValue.getValue());
assertEquals(Bytes.fromString(personJson), textBytesValue.getBytes());
assertEquals(textBytesValue.getType(), DataType.JSON);
}



+ 4
- 4
source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/TxContentBlobTest.java View File

@@ -77,8 +77,8 @@ public class TxContentBlobTest {
for (int j = 0; j < dataKv.length; j++) {
assertEquals(dataKv[i].getKey(), resolvedKv[i].getKey());
assertEquals(dataKv[i].getExpectedVersion(), resolvedKv[i].getExpectedVersion());
assertArrayEquals(dataKv[i].getValue().getValue().toBytes(),
resolvedKv[i].getValue().getValue().toBytes());
assertArrayEquals(dataKv[i].getValue().getBytes().toBytes(),
resolvedKv[i].getValue().getBytes().toBytes());
}
}
}
@@ -108,8 +108,8 @@ public class TxContentBlobTest {
for (int j = 0; j < dataKv.length; j++) {
assertEquals(dataKv[i].getKey(), resolvedKv[i].getKey());
assertEquals(dataKv[i].getExpectedVersion(), resolvedKv[i].getExpectedVersion());
assertArrayEquals(dataKv[i].getValue().getValue().toBytes(),
resolvedKv[i].getValue().getValue().toBytes());
assertArrayEquals(dataKv[i].getValue().getBytes().toBytes(),
resolvedKv[i].getValue().getBytes().toBytes());
}
}
}


+ 8
- 8
source/peer/src/main/java/com/jd/blockchain/peer/web/LedgerQueryController.java View File

@@ -331,7 +331,7 @@ public class LedgerQueryController implements BlockchainQueryService {
LedgerQuery ledger = ledgerService.getLedger(ledgerHash);
LedgerBlock block = ledger.getLatestBlock();
DataAccountQuery dataAccountSet = ledger.getDataAccountSet(block);
return dataAccountSet.getAccount(Bytes.fromBase58(address));
return dataAccountSet.getAccount(Bytes.fromBase58(address)).getID();
}

@RequestMapping(method = { RequestMethod.GET,
@@ -350,11 +350,11 @@ public class LedgerQueryController implements BlockchainQueryService {
KVDataEntry[] entries = new KVDataEntry[keys.length];
long ver;
for (int i = 0; i < entries.length; i++) {
ver = dataAccount.getDataset().getVersion(Bytes.fromString(keys[i]));
ver = dataAccount.getDataset().getVersion(keys[i]);
if (ver < 0) {
entries[i] = new KVDataObject(keys[i], -1, null);
} else {
BytesValue value = dataAccount.getDataset().getValue(Bytes.fromString(keys[i]), ver);
BytesValue value = dataAccount.getDataset().getValue(keys[i], ver);
entries[i] = new KVDataObject(keys[i], ver, value);
}
}
@@ -404,12 +404,12 @@ public class LedgerQueryController implements BlockchainQueryService {
if (ver < 0) {
entries[i] = new KVDataObject(keys[i], -1, null);
} else {
if (dataAccount.getDataEntriesTotalCount() == 0
|| dataAccount.getDataset().getValue(Bytes.fromString(keys[i]), ver) == null) {
if (dataAccount.getDataset().getDataCount() == 0
|| dataAccount.getDataset().getValue(keys[i], ver) == null) {
// is the address is not exist; the result is null;
entries[i] = new KVDataObject(keys[i], -1, null);
} else {
BytesValue value = dataAccount.getDataset().getValue(Bytes.fromString(keys[i]), ver);
BytesValue value = dataAccount.getDataset().getValue(keys[i], ver);
entries[i] = new KVDataObject(keys[i], ver, value);
}
}
@@ -431,7 +431,7 @@ public class LedgerQueryController implements BlockchainQueryService {
DataAccountQuery dataAccountSet = ledger.getDataAccountSet(block);
DataAccount dataAccount = dataAccountSet.getAccount(Bytes.fromBase58(address));

int pages[] = QueryUtil.calFromIndexAndCount(fromIndex, count, (int) dataAccount.getDataEntriesTotalCount());
int pages[] = QueryUtil.calFromIndexAndCount(fromIndex, count, (int) dataAccount.getDataset().getDataCount());
return dataAccount.getDataEntries(pages[0], pages[1]);
}

@@ -445,7 +445,7 @@ public class LedgerQueryController implements BlockchainQueryService {
DataAccountQuery dataAccountSet = ledger.getDataAccountSet(block);
DataAccount dataAccount = dataAccountSet.getAccount(Bytes.fromBase58(address));

return dataAccount.getDataEntriesTotalCount();
return dataAccount.getDataset().getDataCount();
}

@RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/contracts/address/{address}")


+ 1
- 1
source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/converters/ClientResolveUtil.java View File

@@ -108,7 +108,7 @@ public class ClientResolveUtil {

public static Object readValueByBytesValue(BytesValue bytesValue) {
DataType dataType = bytesValue.getType();
Bytes saveVal = bytesValue.getValue();
Bytes saveVal = bytesValue.getBytes();
Object showVal;
switch (dataType) {
case BYTES:


+ 7
- 7
source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTestAll4Redis.java View File

@@ -236,13 +236,13 @@ public class IntegrationTestAll4Redis {
assertEquals(ledgerRepository.retrieveLatestBlockHeight(), txResp.getBlockHeight());

assertEquals("Value_A_0", ledgerRepository.getDataAccountSet(ledgerRepository.retrieveLatestBlock())
.getAccount(dataKey.getAddress()).getDataset().getValue("A").getValue().toUTF8String());
.getAccount(dataKey.getAddress()).getDataset().getValue("A").getBytes().toUTF8String());
assertEquals("Value_B_0", ledgerRepository.getDataAccountSet(ledgerRepository.retrieveLatestBlock())
.getAccount(dataKey.getAddress()).getDataset().getValue("B").getValue().toUTF8String());
.getAccount(dataKey.getAddress()).getDataset().getValue("B").getBytes().toUTF8String());
assertEquals("Value_C_0", ledgerRepository.getDataAccountSet(ledgerRepository.retrieveLatestBlock())
.getAccount(dataKey.getAddress()).getDataset().getValue("C").getValue().toUTF8String());
.getAccount(dataKey.getAddress()).getDataset().getValue("C").getBytes().toUTF8String());
assertEquals("Value_D_0", ledgerRepository.getDataAccountSet(ledgerRepository.retrieveLatestBlock())
.getAccount(dataKey.getAddress()).getDataset().getValue("D").getValue().toUTF8String());
.getAccount(dataKey.getAddress()).getDataset().getValue("D").getBytes().toUTF8String());
assertEquals(0, ledgerRepository.getDataAccountSet(ledgerRepository.retrieveLatestBlock())
.getAccount(dataKey.getAddress()).getDataset().getVersion("A"));
assertEquals(0, ledgerRepository.getDataAccountSet(ledgerRepository.retrieveLatestBlock())
@@ -473,7 +473,7 @@ public class IntegrationTestAll4Redis {
Bytes dataAddress = AddressEncoding.generateAddress(pubKey);
assertEquals(dataAddress, dataAccountSet.getAccount(dataAddress).getID().getAddress());
assertEquals("hello",
dataAccountSet.getAccount(dataAddress).getDataset().getValue(KEY_TOTAL, -1).getValue().toUTF8String());
dataAccountSet.getAccount(dataAddress).getDataset().getValue(KEY_TOTAL, -1).getBytes().toUTF8String());

// 验证userAccount,从合约内部赋值,然后外部验证;内部定义动态key,外部不便于得到,临时屏蔽;
// UserAccountSet userAccountSet =
@@ -504,8 +504,8 @@ public class IntegrationTestAll4Redis {
.getDataset().getValue("A");
BytesValue val2InDb = ledgerRepository.getDataAccountSet(block).getAccount(contractDataKey.getAddress())
.getDataset().getValue(KEY_TOTAL);
assertEquals("Value_A_0", val1InDb.getValue().toUTF8String());
assertEquals("total value,dataAccount", val2InDb.getValue().toUTF8String());
assertEquals("Value_A_0", val1InDb.getBytes().toUTF8String());
assertEquals("total value,dataAccount", val2InDb.getBytes().toUTF8String());
}

/**


+ 0
- 22
source/utils/utils-common/src/main/java/com/jd/blockchain/utils/Dataset.java View File

@@ -4,28 +4,6 @@ public interface Dataset<K, V> {
long getDataCount();

// /**
// * Create or update the value associated the specified key if the version
// * checking is passed.<br>
// *
// * The value of the key will be updated only if it's latest version equals the
// * specified version argument. <br>
// * If the key doesn't exist, it will be created when the version arg was -1.
// * <p>
// * If updating is performed, the version of the key increase by 1. <br>
// * If creating is performed, the version of the key initialize by 0. <br>
// *
// * @param key The key of data;
// * @param value The value of data;
// * @param version The expected latest version of the key.
// * @return The new version of the key. <br>
// * If the key is new created success, then return 0; <br>
// * If the key is updated success, then return the new version;<br>
// * If this operation fail by version checking or other reason, then
// * return -1;
// */
// long setValue(String key, byte[] value, long version);

/**
* Create or update the value associated the specified key if the version
* checking is passed.<br>


Loading…
Cancel
Save