@@ -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() { | |||
@@ -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); | |||
} | |||
} | |||
@@ -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() { | |||
@@ -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; | |||
} | |||
} | |||
@@ -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) { | |||
@@ -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()); | |||
@@ -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); | |||
} | |||
@@ -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(); | |||
@@ -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]; | |||
@@ -29,6 +29,6 @@ public interface BytesValue { | |||
* @return | |||
*/ | |||
@DataField(order = 1, primitiveType = PrimitiveType.BYTES) | |||
Bytes getValue(); | |||
Bytes getBytes(); | |||
} |
@@ -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)); | |||
@@ -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; | |||
} | |||
@@ -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); |
@@ -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); | |||
@@ -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); | |||
@@ -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()); | |||
@@ -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); | |||
@@ -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 ------"); | |||
} | |||
} |
@@ -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); | |||
@@ -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); | |||
@@ -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); | |||
} | |||
@@ -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()); | |||
} | |||
} | |||
} | |||
@@ -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}") | |||
@@ -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: | |||
@@ -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()); | |||
} | |||
/** | |||
@@ -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> | |||