@@ -40,11 +40,11 @@ public class ContractAccount extends AccountDecorator implements ContractInfo { | |||||
} | } | ||||
public byte[] getChainCode() { | public byte[] getChainCode() { | ||||
return getHeaders().getValue(CHAIN_CODE_KEY).getValue().toBytes(); | |||||
return getHeaders().getValue(CHAIN_CODE_KEY).getBytes().toBytes(); | |||||
} | } | ||||
public byte[] getChainCode(long version) { | 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() { | public long getChaincodeVersion() { | ||||
@@ -5,7 +5,6 @@ import java.util.List; | |||||
import com.jd.blockchain.contract.ContractException; | import com.jd.blockchain.contract.ContractException; | ||||
import com.jd.blockchain.crypto.HashDigest; | import com.jd.blockchain.crypto.HashDigest; | ||||
import com.jd.blockchain.ledger.AccountHeader; | |||||
import com.jd.blockchain.ledger.BlockchainIdentity; | import com.jd.blockchain.ledger.BlockchainIdentity; | ||||
import com.jd.blockchain.ledger.BytesValue; | import com.jd.blockchain.ledger.BytesValue; | ||||
import com.jd.blockchain.ledger.ContractInfo; | import com.jd.blockchain.ledger.ContractInfo; | ||||
@@ -293,12 +292,12 @@ public class LedgerQueryService implements BlockchainQueryService { | |||||
for (int i = 0; i < entries.length; i++) { | for (int i = 0; i < entries.length; i++) { | ||||
final String currKey = keys[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) { | if (ver < 0) { | ||||
entries[i] = new KVDataObject(currKey, -1, null); | entries[i] = new KVDataObject(currKey, -1, null); | ||||
} else { | } else { | ||||
BytesValue value = dataAccount.getDataset().getValue(Bytes.fromString(currKey), ver); | |||||
BytesValue value = dataAccount.getDataset().getValue(currKey, ver); | |||||
entries[i] = new KVDataObject(currKey, ver, value); | entries[i] = new KVDataObject(currKey, ver, value); | ||||
} | } | ||||
} | } | ||||
@@ -49,68 +49,60 @@ public class MerkleAccount implements LedgerAccount, HashProvable, MerkleSnapsho | |||||
private Dataset<String, TypedValue> typedData; | 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, | * At the same time, a empty merkle dataset is also created for this account, | ||||
* which is used for storing data of this account.<br> | * 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, | public MerkleAccount(BlockchainIdentity accountID, CryptoSetting cryptoSetting, Bytes keyPrefix, | ||||
ExPolicyKVStorage exStorage, VersioningKVStorage verStorage) { | 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()); | 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 | * merkle dataset from the specified root hash. This merkle dateset is used for | ||||
* storing data of this account.<br> | * 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); | 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); | Bytes dataPrefix = keyPrefix.concat(DATA_PREFIX); | ||||
this.dataDataset = new MerkleDataSet(dataRoot, cryptoSetting, dataPrefix, exStorage, verStorage, readonly); | this.dataDataset = new MerkleDataSet(dataRoot, cryptoSetting, dataPrefix, exStorage, verStorage, readonly); | ||||
this.typedData = DatasetHelper.listen(DatasetHelper.map(dataDataset, valueMapper), dataChangedListener); | 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() { | private HashDigest loadHeaderRoot() { | ||||
@@ -258,6 +241,9 @@ public class MerkleAccount implements LedgerAccount, HashProvable, MerkleSnapsho | |||||
*/ | */ | ||||
private PubKey loadPubKey() { | private PubKey loadPubKey() { | ||||
TypedValue value = typedHeader.getValue(KEY_PUBKEY); | TypedValue value = typedHeader.getValue(KEY_PUBKEY); | ||||
if (value == null) { | |||||
return null; | |||||
} | |||||
return value.pubKeyValue(); | return value.pubKeyValue(); | ||||
} | } | ||||
@@ -276,12 +262,10 @@ public class MerkleAccount implements LedgerAccount, HashProvable, MerkleSnapsho | |||||
* | * | ||||
* 此方法默认会返回新的账户版本号,等于当前版本号加 1 ; | * 此方法默认会返回新的账户版本号,等于当前版本号加 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 | @Override | ||||
@@ -303,8 +287,9 @@ public class MerkleAccount implements LedgerAccount, HashProvable, MerkleSnapsho | |||||
} | } | ||||
if (rootDataset.isUpdated()) { | if (rootDataset.isUpdated()) { | ||||
HashDigest previousRootHash = rootDataset.getRootHash(); | |||||
rootDataset.commit(); | 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 class MerkleDatasetAdapter implements Dataset<String, BytesValue> { | ||||
// | // | ||||
// private static DataChangedListener NULL_LISTENER = new DataChangedListener() { | // private static DataChangedListener NULL_LISTENER = new DataChangedListener() { | ||||
@@ -94,7 +94,8 @@ public class MerkleAccountSet implements Transactional, MerkleProvable, AccountQ | |||||
BlockchainIdentity[] ids = new BlockchainIdentity[results.length]; | BlockchainIdentity[] ids = new BlockchainIdentity[results.length]; | ||||
for (int i = 0; i < results.length; i++) { | 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(); | ids[i] = account.getID(); | ||||
} | } | ||||
return ids; | return ids; | ||||
@@ -284,11 +285,11 @@ public class MerkleAccountSet implements Transactional, MerkleProvable, AccountQ | |||||
return createAccount(address, rootHash, version, readonly); | 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; | // prefix; | ||||
Bytes prefix = keyPrefix.concat(address); | Bytes prefix = keyPrefix.concat(address); | ||||
return new InnerMerkleAccount(address, version, rootHash, cryptoSetting, prefix, baseExStorage, baseVerStorage, | return new InnerMerkleAccount(address, version, rootHash, cryptoSetting, prefix, baseExStorage, baseVerStorage, | ||||
readonly); | readonly); | ||||
} | } | ||||
@@ -358,14 +359,18 @@ public class MerkleAccountSet implements Transactional, MerkleProvable, AccountQ | |||||
*/ | */ | ||||
private class InnerMerkleAccount extends MerkleAccount { | private class InnerMerkleAccount extends MerkleAccount { | ||||
private long version; | |||||
public InnerMerkleAccount(BlockchainIdentity accountID, CryptoSetting cryptoSetting, Bytes keyPrefix, | public InnerMerkleAccount(BlockchainIdentity accountID, CryptoSetting cryptoSetting, Bytes keyPrefix, | ||||
ExPolicyKVStorage exStorage, VersioningKVStorage verStorage) { | ExPolicyKVStorage exStorage, VersioningKVStorage verStorage) { | ||||
super(accountID, cryptoSetting, keyPrefix, exStorage, verStorage); | super(accountID, cryptoSetting, keyPrefix, exStorage, verStorage); | ||||
this.version = -1; | |||||
} | } | ||||
public InnerMerkleAccount(Bytes address, long version, HashDigest dataRootHash, CryptoSetting cryptoSetting, | public InnerMerkleAccount(Bytes address, long version, HashDigest dataRootHash, CryptoSetting cryptoSetting, | ||||
Bytes keyPrefix, ExPolicyKVStorage exStorage, VersioningKVStorage verStorage, boolean readonly) { | 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 | @Override | ||||
@@ -374,13 +379,17 @@ public class MerkleAccountSet implements Transactional, MerkleProvable, AccountQ | |||||
} | } | ||||
@Override | @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) { | if (newVersion < 0) { | ||||
// Update fail; | // Update fail; | ||||
throw new LedgerException("Account updating fail! --[Address=" + this.getAddress() + "]"); | throw new LedgerException("Account updating fail! --[Address=" + this.getAddress() + "]"); | ||||
} | } | ||||
return newVersion; | |||||
this.version = newVersion; | |||||
} | |||||
public long getVersion() { | |||||
return version; | |||||
} | } | ||||
} | } | ||||
@@ -43,7 +43,7 @@ public class UserAccount extends AccountDecorator implements UserInfo { // imple | |||||
if (pkBytes == null) { | if (pkBytes == null) { | ||||
return null; | return null; | ||||
} | } | ||||
dataPubKey = new PubKey(pkBytes.getValue().toBytes()); | |||||
dataPubKey = new PubKey(pkBytes.getBytes().toBytes()); | |||||
} | } | ||||
return dataPubKey; | return dataPubKey; | ||||
} | } | ||||
@@ -69,12 +69,12 @@ public class UserAccount extends AccountDecorator implements UserInfo { // imple | |||||
public String getProperty(String key) { | public String getProperty(String key) { | ||||
BytesValue value = getHeaders().getValue(encodePropertyKey(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) { | public String getProperty(String key, long version) { | ||||
BytesValue value = getHeaders().getValue(encodePropertyKey(key), 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) { | private String encodePropertyKey(String key) { | ||||
@@ -27,7 +27,6 @@ import com.jd.blockchain.ledger.BlockchainKeypair; | |||||
import com.jd.blockchain.ledger.BytesValue; | import com.jd.blockchain.ledger.BytesValue; | ||||
import com.jd.blockchain.ledger.DataAccountRegisterOperation; | import com.jd.blockchain.ledger.DataAccountRegisterOperation; | ||||
import com.jd.blockchain.ledger.EndpointRequest; | import com.jd.blockchain.ledger.EndpointRequest; | ||||
import com.jd.blockchain.ledger.KVDataEntry; | |||||
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.LedgerPermission; | 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.BooleanValueHolder; | ||||
import com.jd.blockchain.transaction.TxBuilder; | import com.jd.blockchain.transaction.TxBuilder; | ||||
import com.jd.blockchain.utils.Bytes; | import com.jd.blockchain.utils.Bytes; | ||||
import com.jd.blockchain.utils.DataEntry; | |||||
import com.jd.blockchain.utils.io.BytesUtils; | import com.jd.blockchain.utils.io.BytesUtils; | ||||
import test.com.jd.blockchain.ledger.TxTestContract; | import test.com.jd.blockchain.ledger.TxTestContract; | ||||
@@ -243,7 +243,7 @@ public class ContractInvokingTest { | |||||
BytesValue latestValue = ledgerRepo.getDataAccountSet().getAccount(kpDataAccount.getAddress()).getDataset().getValue(key, | BytesValue latestValue = ledgerRepo.getDataAccountSet().getAccount(kpDataAccount.getAddress()).getDataset().getValue(key, | ||||
-1); | -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(); | boolean readable = readableHolder.get(); | ||||
assertTrue(readable); | 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); | 0); | ||||
KVDataEntry kv2 = ledgerRepo.getDataAccountSet().getAccount(kpDataAccount.getAddress()).getDataEntry("K2", | |||||
DataEntry<String, TypedValue> kv2 = ledgerRepo.getDataAccountSet().getAccount(kpDataAccount.getAddress()).getDataset().getDataEntry("K2", | |||||
0); | 0); | ||||
assertEquals(0, kv1.getVersion()); | assertEquals(0, kv1.getVersion()); | ||||
assertEquals(0, kv2.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, kv1.getVersion()); | ||||
assertEquals(1, kv2.getVersion()); | assertEquals(1, kv2.getVersion()); | ||||
assertEquals("V1-1", kv1.getValue()); | 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(1, kv1.getVersion()); | ||||
assertEquals("V1-1", kv1.getValue()); | 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(-1, kv1.getVersion()); | ||||
assertEquals(null, kv1.getValue()); | assertEquals(null, kv1.getValue()); | ||||
@@ -109,7 +109,7 @@ public class LedgerEditorTest { | |||||
// 验证数据读写的一致性; | // 验证数据读写的一致性; | ||||
BytesValue bytes = dataAccount.getDataset().getValue("A"); | BytesValue bytes = dataAccount.getDataset().getValue("A"); | ||||
assertEquals(DataType.TEXT, bytes.getType()); | assertEquals(DataType.TEXT, bytes.getType()); | ||||
String textValue = bytes.getValue().toUTF8String(); | |||||
String textValue = bytes.getBytes().toUTF8String(); | |||||
assertEquals("abc", textValue); | assertEquals("abc", textValue); | ||||
} | } | ||||
@@ -346,10 +346,10 @@ public class TransactionBatchProcessorTest { | |||||
assertNotNull(v2); | assertNotNull(v2); | ||||
assertNotNull(v3); | 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 ; | // 先写一笔正确的交易; k3 的版本将变为 1 ; | ||||
@@ -390,8 +390,8 @@ public class TransactionBatchProcessorTest { | |||||
assertNotNull(v1); | assertNotNull(v1); | ||||
assertNotNull(v3); | 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(); | // ledgerManager = new LedgerManager(); | ||||
@@ -164,8 +164,8 @@ public class TransactionSetTest { | |||||
for (int i = 0; i < acutualKVWriteSet.length; i++) { | for (int i = 0; i < acutualKVWriteSet.length; i++) { | ||||
assertEquals(expKVWriteSet[i].getKey(), acutualKVWriteSet[i].getKey()); | assertEquals(expKVWriteSet[i].getKey(), acutualKVWriteSet[i].getKey()); | ||||
assertEquals(expKVWriteSet[i].getExpectedVersion(), acutualKVWriteSet[i].getExpectedVersion()); | 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]; | ContractCodeDeployOperation actualContractDplOp = (ContractCodeDeployOperation) actualOperations[3]; | ||||
@@ -29,6 +29,6 @@ public interface BytesValue { | |||||
* @return | * @return | ||||
*/ | */ | ||||
@DataField(order = 1, primitiveType = PrimitiveType.BYTES) | @DataField(order = 1, primitiveType = PrimitiveType.BYTES) | ||||
Bytes getValue(); | |||||
Bytes getBytes(); | |||||
} | } |
@@ -72,15 +72,15 @@ public class KVDataObject implements KVDataEntry { | |||||
case NIL: | case NIL: | ||||
return null; | return null; | ||||
case TEXT: | case TEXT: | ||||
return bytesValue.getValue().toUTF8String(); | |||||
return bytesValue.getBytes().toUTF8String(); | |||||
case BYTES: | case BYTES: | ||||
return ByteArray.toHex(bytesValue.getValue().toBytes()); | |||||
return ByteArray.toHex(bytesValue.getBytes().toBytes()); | |||||
case INT64: | case INT64: | ||||
return BytesUtils.toLong(bytesValue.getValue().toBytes()); | |||||
return BytesUtils.toLong(bytesValue.getBytes().toBytes()); | |||||
case JSON: | case JSON: | ||||
return bytesValue.getValue().toUTF8String(); | |||||
return bytesValue.getBytes().toUTF8String(); | |||||
case XML: | case XML: | ||||
return bytesValue.getValue().toUTF8String(); | |||||
return bytesValue.getBytes().toUTF8String(); | |||||
default: | default: | ||||
throw new IllegalStateException("Unsupported value type[" + getType() + "] to resolve!"); | throw new IllegalStateException("Unsupported value type[" + getType() + "] to resolve!"); | ||||
@@ -106,7 +106,7 @@ public class KVDataObject implements KVDataEntry { | |||||
* @return | * @return | ||||
*/ | */ | ||||
Bytes bytesArray() { | Bytes bytesArray() { | ||||
return bytesValue.getValue(); | |||||
return bytesValue.getBytes(); | |||||
} | } | ||||
/** | /** | ||||
@@ -122,7 +122,7 @@ public class KVDataObject implements KVDataEntry { | |||||
*/ | */ | ||||
public byte tinyValue() { | public byte tinyValue() { | ||||
if (DataType.INT8 == getType()) { | 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())); | 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() { | public short shortValue() { | ||||
if (DataType.INT16 == getType()) { | 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())); | 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() { | public int intValue() { | ||||
if (DataType.INT32 == getType()) { | 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())); | 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() { | public long longValue() { | ||||
if (DataType.INT64 == getType()) { | 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())); | 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() { | public BigInteger bigIntValue() { | ||||
if (DataType.BIG_INT == getType()) { | if (DataType.BIG_INT == getType()) { | ||||
return new BigInteger(bytesValue.getValue().toBytes()); | |||||
return new BigInteger(bytesValue.getBytes().toBytes()); | |||||
} | } | ||||
throw new IllegalStateException( | throw new IllegalStateException( | ||||
String.format("Expected type [%s], but [%s]", DataType.BIG_INT, getType())); | String.format("Expected type [%s], but [%s]", DataType.BIG_INT, getType())); | ||||
@@ -214,7 +214,7 @@ public class KVDataObject implements KVDataEntry { | |||||
*/ | */ | ||||
public boolean boolValue() { | public boolean boolValue() { | ||||
if (DataType.BOOLEAN == getType()) { | if (DataType.BOOLEAN == getType()) { | ||||
return BytesUtils.toBoolean(bytesValue.getValue().toBytes()[0]); | |||||
return BytesUtils.toBoolean(bytesValue.getBytes().toBytes()[0]); | |||||
} | } | ||||
throw new IllegalStateException( | throw new IllegalStateException( | ||||
String.format("Expected type [%s], but [%s]", DataType.BOOLEAN, getType())); | String.format("Expected type [%s], but [%s]", DataType.BOOLEAN, getType())); | ||||
@@ -233,7 +233,7 @@ public class KVDataObject implements KVDataEntry { | |||||
*/ | */ | ||||
public Date datetimeValue() { | public Date datetimeValue() { | ||||
if (DataType.TIMESTAMP == getType()) { | if (DataType.TIMESTAMP == getType()) { | ||||
long ts = BytesUtils.toLong(bytesValue.getValue().toBytes()); | |||||
long ts = BytesUtils.toLong(bytesValue.getBytes().toBytes()); | |||||
return new Date(ts); | return new Date(ts); | ||||
} | } | ||||
throw new IllegalStateException( | throw new IllegalStateException( | ||||
@@ -255,7 +255,7 @@ public class KVDataObject implements KVDataEntry { | |||||
public String stringValue() { | public String stringValue() { | ||||
DataType type = getType(); | DataType type = getType(); | ||||
if (DataType.TEXT == type || DataType.JSON == type || DataType.XML == type) { | 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]", | throw new IllegalStateException(String.format("Expected type [%s] or [%s] or [%s] , but [%s]", | ||||
PrimitiveType.TEXT, DataType.JSON, DataType.XML, type)); | PrimitiveType.TEXT, DataType.JSON, DataType.XML, type)); | ||||
@@ -34,7 +34,7 @@ public class TypedValue implements BytesValue { | |||||
private TypedValue(BytesValue bytesValue) { | private TypedValue(BytesValue bytesValue) { | ||||
this.type = bytesValue.getType(); | this.type = bytesValue.getType(); | ||||
this.value = bytesValue.getValue(); | |||||
this.value = bytesValue.getBytes(); | |||||
} | } | ||||
private TypedValue() { | private TypedValue() { | ||||
@@ -48,11 +48,11 @@ public class TypedValue implements BytesValue { | |||||
} | } | ||||
@Override | @Override | ||||
public Bytes getValue() { | |||||
public Bytes getBytes() { | |||||
return this.value; | return this.value; | ||||
} | } | ||||
public Object getTypedValue() { | |||||
public Object getValue() { | |||||
if (isNil()) { | if (isNil()) { | ||||
return null; | return null; | ||||
} | } | ||||
@@ -47,7 +47,7 @@ public abstract class AbstractBytesValueResolver implements BytesValueResolver { | |||||
if (!isSupport(dataType)) { | if (!isSupport(dataType)) { | ||||
throw new IllegalStateException(String.format("Un-support encode DataType[%s] Object !!!", dataType.name())); | 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); | protected abstract Object decode(Bytes value); |
@@ -26,7 +26,7 @@ public class BytesToBytesValueResolverTest { | |||||
assertEquals(bytesValue.getType(), DataType.BYTES); | assertEquals(bytesValue.getType(), DataType.BYTES); | ||||
assertEquals(bytesObj, bytesValue.getValue()); | |||||
assertEquals(bytesObj, bytesValue.getBytes()); | |||||
Bytes resolveBytesObj = (Bytes)resolver.decode(bytesValue); | Bytes resolveBytesObj = (Bytes)resolver.decode(bytesValue); | ||||
@@ -28,9 +28,9 @@ public class BytesValueEncodingTest { | |||||
BytesValue longBytesVal2 = BytesValueEncoding.encodeSingle(longVal, long.class); | BytesValue longBytesVal2 = BytesValueEncoding.encodeSingle(longVal, long.class); | ||||
BytesValue longBytesVal3 = 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(longBytesVal1.getType(), longBytesVal2.getType()); | ||||
assertEquals(longBytesVal2.getValue(), longBytesVal3.getValue()); | |||||
assertEquals(longBytesVal2.getBytes(), longBytesVal3.getBytes()); | |||||
assertEquals(longBytesVal2.getType(), longBytesVal3.getType()); | assertEquals(longBytesVal2.getType(), longBytesVal3.getType()); | ||||
long resolveLongVal1 = (long)BytesValueEncoding.decode(longBytesVal1); | long resolveLongVal1 = (long)BytesValueEncoding.decode(longBytesVal1); | ||||
@@ -63,7 +63,7 @@ public class DataAccountKVSetOpTemplateTest { | |||||
assertEquals(dataKv.length, resolvedKv.length); | assertEquals(dataKv.length, resolvedKv.length); | ||||
for (int i = 0; i < dataKv.length; i++) { | for (int i = 0; i < dataKv.length; i++) { | ||||
assertEquals(dataKv[i].getKey(), resolvedKv[i].getKey()); | 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].getValue().getType().CODE, resolvedKv[i].getValue().getType().CODE); | ||||
assertEquals(dataKv[i].getExpectedVersion(), resolvedKv[i].getExpectedVersion()); | assertEquals(dataKv[i].getExpectedVersion(), resolvedKv[i].getExpectedVersion()); | ||||
@@ -22,13 +22,13 @@ public class IntegerToBytesValueResolverTest { | |||||
BytesValue intBytesValue2 = resolver.encode(intVal, Integer.class); | 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); | Bytes intBytes = Bytes.fromInt(intVal); | ||||
assertEquals(intBytes, intBytesValue.getValue()); | |||||
assertEquals(intBytes, intBytesValue.getBytes()); | |||||
assertEquals(intBytesValue.getType(), DataType.INT32); | assertEquals(intBytesValue.getType(), DataType.INT32); | ||||
@@ -48,7 +48,7 @@ public class KVDataTest { | |||||
System.out.println("------Assert start ------"); | System.out.println("------Assert start ------"); | ||||
assertEquals(resolvedKvData.getKey(), kvData.getKey()); | assertEquals(resolvedKvData.getKey(), kvData.getKey()); | ||||
assertEquals(resolvedKvData.getExpectedVersion(), kvData.getExpectedVersion()); | 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 ------"); | System.out.println("------Assert OK ------"); | ||||
} | } | ||||
} | } |
@@ -23,13 +23,13 @@ public class LongToBytesValueResolverTest { | |||||
BytesValue longBytesValue2 = resolver.encode(longVal, Long.class); | 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); | Bytes longBytes = Bytes.fromLong(longVal); | ||||
assertEquals(longBytes, longBytesValue.getValue()); | |||||
assertEquals(longBytes, longBytesValue.getBytes()); | |||||
assertEquals(longBytesValue.getType(), DataType.INT64); | assertEquals(longBytesValue.getType(), DataType.INT64); | ||||
@@ -21,7 +21,7 @@ public class ShortToBytesValueResolverTest { | |||||
Bytes shortBytes = new Bytes(BytesUtils.toBytes(shortVal)); | Bytes shortBytes = new Bytes(BytesUtils.toBytes(shortVal)); | ||||
assertEquals(shortBytes, shortBytesValue.getValue()); | |||||
assertEquals(shortBytes, shortBytesValue.getBytes()); | |||||
assertEquals(shortBytesValue.getType(), DataType.INT16); | assertEquals(shortBytesValue.getType(), DataType.INT16); | ||||
@@ -20,7 +20,7 @@ public class StringToBytesValueResolverTest { | |||||
BytesValue textBytesValue = resolver.encode(textVal); | BytesValue textBytesValue = resolver.encode(textVal); | ||||
assertEquals(Bytes.fromString(textVal), textBytesValue.getValue()); | |||||
assertEquals(Bytes.fromString(textVal), textBytesValue.getBytes()); | |||||
assertEquals(textBytesValue.getType(), DataType.TEXT); | assertEquals(textBytesValue.getType(), DataType.TEXT); | ||||
@@ -43,7 +43,7 @@ public class StringToBytesValueResolverTest { | |||||
Person person = new Person("zhangsan", 80); | Person person = new Person("zhangsan", 80); | ||||
String personJson = JSON.toJSONString(person); | String personJson = JSON.toJSONString(person); | ||||
BytesValue textBytesValue = resolver.encode(personJson); | BytesValue textBytesValue = resolver.encode(personJson); | ||||
assertEquals(Bytes.fromString(personJson), textBytesValue.getValue()); | |||||
assertEquals(Bytes.fromString(personJson), textBytesValue.getBytes()); | |||||
assertEquals(textBytesValue.getType(), DataType.JSON); | assertEquals(textBytesValue.getType(), DataType.JSON); | ||||
} | } | ||||
@@ -77,8 +77,8 @@ public class TxContentBlobTest { | |||||
for (int j = 0; j < dataKv.length; j++) { | for (int j = 0; j < dataKv.length; j++) { | ||||
assertEquals(dataKv[i].getKey(), resolvedKv[i].getKey()); | assertEquals(dataKv[i].getKey(), resolvedKv[i].getKey()); | ||||
assertEquals(dataKv[i].getExpectedVersion(), resolvedKv[i].getExpectedVersion()); | 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++) { | for (int j = 0; j < dataKv.length; j++) { | ||||
assertEquals(dataKv[i].getKey(), resolvedKv[i].getKey()); | assertEquals(dataKv[i].getKey(), resolvedKv[i].getKey()); | ||||
assertEquals(dataKv[i].getExpectedVersion(), resolvedKv[i].getExpectedVersion()); | 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()); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -331,7 +331,7 @@ public class LedgerQueryController implements BlockchainQueryService { | |||||
LedgerQuery ledger = ledgerService.getLedger(ledgerHash); | LedgerQuery ledger = ledgerService.getLedger(ledgerHash); | ||||
LedgerBlock block = ledger.getLatestBlock(); | LedgerBlock block = ledger.getLatestBlock(); | ||||
DataAccountQuery dataAccountSet = ledger.getDataAccountSet(block); | DataAccountQuery dataAccountSet = ledger.getDataAccountSet(block); | ||||
return dataAccountSet.getAccount(Bytes.fromBase58(address)); | |||||
return dataAccountSet.getAccount(Bytes.fromBase58(address)).getID(); | |||||
} | } | ||||
@RequestMapping(method = { RequestMethod.GET, | @RequestMapping(method = { RequestMethod.GET, | ||||
@@ -350,11 +350,11 @@ public class LedgerQueryController implements BlockchainQueryService { | |||||
KVDataEntry[] entries = new KVDataEntry[keys.length]; | KVDataEntry[] entries = new KVDataEntry[keys.length]; | ||||
long ver; | long ver; | ||||
for (int i = 0; i < entries.length; i++) { | 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) { | if (ver < 0) { | ||||
entries[i] = new KVDataObject(keys[i], -1, null); | entries[i] = new KVDataObject(keys[i], -1, null); | ||||
} else { | } 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); | entries[i] = new KVDataObject(keys[i], ver, value); | ||||
} | } | ||||
} | } | ||||
@@ -404,12 +404,12 @@ public class LedgerQueryController implements BlockchainQueryService { | |||||
if (ver < 0) { | if (ver < 0) { | ||||
entries[i] = new KVDataObject(keys[i], -1, null); | entries[i] = new KVDataObject(keys[i], -1, null); | ||||
} else { | } 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; | // is the address is not exist; the result is null; | ||||
entries[i] = new KVDataObject(keys[i], -1, null); | entries[i] = new KVDataObject(keys[i], -1, null); | ||||
} else { | } 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); | entries[i] = new KVDataObject(keys[i], ver, value); | ||||
} | } | ||||
} | } | ||||
@@ -431,7 +431,7 @@ public class LedgerQueryController implements BlockchainQueryService { | |||||
DataAccountQuery dataAccountSet = ledger.getDataAccountSet(block); | DataAccountQuery dataAccountSet = ledger.getDataAccountSet(block); | ||||
DataAccount dataAccount = dataAccountSet.getAccount(Bytes.fromBase58(address)); | 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]); | return dataAccount.getDataEntries(pages[0], pages[1]); | ||||
} | } | ||||
@@ -445,7 +445,7 @@ public class LedgerQueryController implements BlockchainQueryService { | |||||
DataAccountQuery dataAccountSet = ledger.getDataAccountSet(block); | DataAccountQuery dataAccountSet = ledger.getDataAccountSet(block); | ||||
DataAccount dataAccount = dataAccountSet.getAccount(Bytes.fromBase58(address)); | DataAccount dataAccount = dataAccountSet.getAccount(Bytes.fromBase58(address)); | ||||
return dataAccount.getDataEntriesTotalCount(); | |||||
return dataAccount.getDataset().getDataCount(); | |||||
} | } | ||||
@RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/contracts/address/{address}") | @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/contracts/address/{address}") | ||||
@@ -108,7 +108,7 @@ public class ClientResolveUtil { | |||||
public static Object readValueByBytesValue(BytesValue bytesValue) { | public static Object readValueByBytesValue(BytesValue bytesValue) { | ||||
DataType dataType = bytesValue.getType(); | DataType dataType = bytesValue.getType(); | ||||
Bytes saveVal = bytesValue.getValue(); | |||||
Bytes saveVal = bytesValue.getBytes(); | |||||
Object showVal; | Object showVal; | ||||
switch (dataType) { | switch (dataType) { | ||||
case BYTES: | case BYTES: | ||||
@@ -236,13 +236,13 @@ public class IntegrationTestAll4Redis { | |||||
assertEquals(ledgerRepository.retrieveLatestBlockHeight(), txResp.getBlockHeight()); | assertEquals(ledgerRepository.retrieveLatestBlockHeight(), txResp.getBlockHeight()); | ||||
assertEquals("Value_A_0", ledgerRepository.getDataAccountSet(ledgerRepository.retrieveLatestBlock()) | 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()) | 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()) | 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()) | 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()) | assertEquals(0, ledgerRepository.getDataAccountSet(ledgerRepository.retrieveLatestBlock()) | ||||
.getAccount(dataKey.getAddress()).getDataset().getVersion("A")); | .getAccount(dataKey.getAddress()).getDataset().getVersion("A")); | ||||
assertEquals(0, ledgerRepository.getDataAccountSet(ledgerRepository.retrieveLatestBlock()) | assertEquals(0, ledgerRepository.getDataAccountSet(ledgerRepository.retrieveLatestBlock()) | ||||
@@ -473,7 +473,7 @@ public class IntegrationTestAll4Redis { | |||||
Bytes dataAddress = AddressEncoding.generateAddress(pubKey); | Bytes dataAddress = AddressEncoding.generateAddress(pubKey); | ||||
assertEquals(dataAddress, dataAccountSet.getAccount(dataAddress).getID().getAddress()); | assertEquals(dataAddress, dataAccountSet.getAccount(dataAddress).getID().getAddress()); | ||||
assertEquals("hello", | assertEquals("hello", | ||||
dataAccountSet.getAccount(dataAddress).getDataset().getValue(KEY_TOTAL, -1).getValue().toUTF8String()); | |||||
dataAccountSet.getAccount(dataAddress).getDataset().getValue(KEY_TOTAL, -1).getBytes().toUTF8String()); | |||||
// 验证userAccount,从合约内部赋值,然后外部验证;内部定义动态key,外部不便于得到,临时屏蔽; | // 验证userAccount,从合约内部赋值,然后外部验证;内部定义动态key,外部不便于得到,临时屏蔽; | ||||
// UserAccountSet userAccountSet = | // UserAccountSet userAccountSet = | ||||
@@ -504,8 +504,8 @@ public class IntegrationTestAll4Redis { | |||||
.getDataset().getValue("A"); | .getDataset().getValue("A"); | ||||
BytesValue val2InDb = ledgerRepository.getDataAccountSet(block).getAccount(contractDataKey.getAddress()) | BytesValue val2InDb = ledgerRepository.getDataAccountSet(block).getAccount(contractDataKey.getAddress()) | ||||
.getDataset().getValue(KEY_TOTAL); | .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()); | |||||
} | } | ||||
/** | /** | ||||
@@ -4,28 +4,6 @@ public interface Dataset<K, V> { | |||||
long getDataCount(); | 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 | * Create or update the value associated the specified key if the version | ||||
* checking is passed.<br> | * checking is passed.<br> | ||||