diff --git a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/ContractDeployMojo.java b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/ContractDeployMojo.java
index 80be911f..3eac13bb 100644
--- a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/ContractDeployMojo.java
+++ b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/ContractDeployMojo.java
@@ -5,6 +5,7 @@ import com.jd.blockchain.crypto.PrivKey;
import com.jd.blockchain.crypto.PubKey;
import com.jd.blockchain.ledger.BlockchainKeypair;
import com.jd.blockchain.tools.keygen.KeyGenCommand;
+import com.jd.blockchain.utils.StringUtils;
import com.jd.blockchain.utils.codec.Base58Utils;
import com.jd.blockchain.utils.io.FileUtils;
import org.apache.maven.plugin.AbstractMojo;
diff --git a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/StringUtils.java b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/StringUtils.java
deleted file mode 100644
index f8fe1867..00000000
--- a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/StringUtils.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.jd.blockchain;
-/**
- * @Author zhaogw
- * @Date 2018/11/26 20:46
- */
-public abstract class StringUtils {
- public static boolean isEmpty(Object str) {
- return str == null || "".equals(str);
- }
-}
\ No newline at end of file
diff --git a/source/contract/contract-maven-plugin/src/main/resources/sys-contract.properties b/source/contract/contract-maven-plugin/src/main/resources/sys-contract.properties
index 6dd66e5e..a7179906 100644
--- a/source/contract/contract-maven-plugin/src/main/resources/sys-contract.properties
+++ b/source/contract/contract-maven-plugin/src/main/resources/sys-contract.properties
@@ -1,9 +1,9 @@
-#项目源文件存放的位置;
+#PROJECT_BASE_DIR
PROJECT_BASE_DIR=E:\\gitCode\\block\\prototype\\
-#合同使用的类库存放的位置,可能不在项目中,故采用全新的地址;
+#LEDGER_BASE_CLASS_PATH
LEDGER_BASE_CLASS_PATH=E:\\gitCode\\block\\prototype\\libs\\
-#为了测试,临时添加的变量;
+#deploy and execute the contract;
cParam=com.jd.blockchain.contract.AssetContract3
sParam=E:\\gitCode\\block\\prototype\\source\\sdk\\contract-sample\\src\\main\\java\\
eParam=utf-8
diff --git a/source/contract/contract-tools/pom.xml b/source/contract/contract-tools/pom.xml
deleted file mode 100644
index da60f463..00000000
--- a/source/contract/contract-tools/pom.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-
- 4.0.0
-
- com.jd.blockchain
- contract
- 0.9.0-SNAPSHOT
-
- contract-tools
-
-
-
- com.jd.blockchain
- contract-compiler
- ${project.version}
-
-
- com.jd.blockchain
- contract-jar
- ${project.version}
-
-
- commons-io
- commons-io
- ${commons-io.version}
-
-
- junit
- junit
- test
-
-
- org.mockito
- mockito-core
- test
-
-
- org.slf4j
- slf4j-log4j12
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.5
-
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/source/gateway/src/main/java/com/jd/blockchain/gateway/web/BlockBrowserController.java b/source/gateway/src/main/java/com/jd/blockchain/gateway/web/BlockBrowserController.java
index 381cc50f..1094e9b9 100644
--- a/source/gateway/src/main/java/com/jd/blockchain/gateway/web/BlockBrowserController.java
+++ b/source/gateway/src/main/java/com/jd/blockchain/gateway/web/BlockBrowserController.java
@@ -239,6 +239,14 @@ public class BlockBrowserController implements BlockchainExtendQueryService {
return peerService.getQueryService().getDataEntries(ledgerHash, address, keys);
}
+ @RequestMapping(method = {RequestMethod.GET, RequestMethod.POST}, path = "ledgers/{ledgerHash}/accounts/{address}/entries-version")
+ public KVDataEntry[] getDataEntries(@PathVariable("ledgerHash") HashDigest ledgerHash,
+ @PathVariable("address") String address,
+ @RequestParam("keys") String keys[],
+ @RequestParam("versions") String versions[]) {
+ return peerService.getQueryService().getDataEntries(ledgerHash, address, keys, versions);
+ }
+
@RequestMapping(method = {RequestMethod.GET, RequestMethod.POST}, path = "ledgers/{ledgerHash}/accounts/address/{address}/entries")
@Override
public KVDataEntry[] getDataEntries(@PathVariable("ledgerHash") HashDigest ledgerHash,
diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerQueryService.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerQueryService.java
index 086b18ff..1ed2b6d9 100644
--- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerQueryService.java
+++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerQueryService.java
@@ -2,6 +2,7 @@ package com.jd.blockchain.ledger.core.impl;
import com.jd.blockchain.binaryproto.BinaryProtocol;
import com.jd.blockchain.binaryproto.PrimitiveType;
+import com.jd.blockchain.contract.ContractException;
import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.ledger.*;
import com.jd.blockchain.ledger.core.ContractAccountSet;
@@ -15,6 +16,7 @@ import com.jd.blockchain.ledger.core.UserAccountSet;
import com.jd.blockchain.transaction.BlockchainQueryService;
import com.jd.blockchain.utils.Bytes;
import com.jd.blockchain.utils.QueryUtil;
+import com.jd.blockchain.utils.StringUtils;
public class LedgerQueryService implements BlockchainQueryService {
@@ -263,6 +265,9 @@ public class LedgerQueryService implements BlockchainQueryService {
long ver;
for (int i = 0; i < entries.length; i++) {
ver = dataAccount.getDataVersion(Bytes.fromString(keys[i]));
+
+ dataAccount.getBytes(Bytes.fromString(keys[i]),1);
+
if (ver < 0) {
entries[i] = new KVDataObject(keys[i], -1, PrimitiveType.NIL, null);
}else {
@@ -275,6 +280,42 @@ public class LedgerQueryService implements BlockchainQueryService {
return entries;
}
+ public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, String[] keys, String[] versions) {
+ if (keys == null || keys.length == 0) {
+ return null;
+ }
+ if (versions == null || versions.length == 0) {
+ return null;
+ }
+ if(keys.length != versions.length){
+ throw new ContractException("keys.length!=versions.length!");
+ }
+
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
+ DataAccount dataAccount = dataAccountSet.getDataAccount(Bytes.fromBase58(address));
+
+ KVDataEntry[] entries = new KVDataEntry[keys.length];
+ long ver = -1;
+ for (int i = 0; i < entries.length; i++) {
+// ver = dataAccount.getDataVersion(Bytes.fromString(keys[i]));
+// dataAccount.getBytes(Bytes.fromString(keys[i]),1);
+ if(StringUtils.isNumber(versions[i])){
+ ver = Long.parseLong(versions[i]);
+ }
+ if (ver < 0) {
+ entries[i] = new KVDataObject(keys[i], -1, PrimitiveType.NIL, null);
+ }else {
+ byte[] value = dataAccount.getBytes(Bytes.fromString(keys[i]), ver);
+ BytesValue decodeData = BinaryProtocol.decode(value);
+ entries[i] = new KVDataObject(keys[i], ver, PrimitiveType.valueOf(decodeData.getType().CODE), decodeData.getValue().toBytes());
+ }
+ }
+
+ return entries;
+ }
+
@Override
public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, int fromIndex, int count) {
diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractLedgerContext.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractLedgerContext.java
index 2d51c185..92049f0f 100644
--- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractLedgerContext.java
+++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractLedgerContext.java
@@ -156,6 +156,11 @@ public class ContractLedgerContext implements LedgerContext {
return innerQueryService.getDataEntries(ledgerHash, address, keys);
}
+ @Override
+ public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, String[] keys, String[] versions) {
+ return innerQueryService.getDataEntries(ledgerHash, address, keys, versions);
+ }
+
@Override
public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, int fromIndex, int count) {
return innerQueryService.getDataEntries(ledgerHash, address, fromIndex, count);
diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainQueryService.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainQueryService.java
index 45301f13..26d719bd 100644
--- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainQueryService.java
+++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainQueryService.java
@@ -261,6 +261,8 @@ public interface BlockchainQueryService {
*/
KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, String... keys);
+ KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, String[] keys, String[] versions);
+
/**
* 杩斿洖鎸囧畾鏁版嵁璐︽埛涓璌V鏁版嵁鐨勬绘暟锛
*
diff --git a/source/peer/src/main/java/com/jd/blockchain/peer/web/LedgerQueryController.java b/source/peer/src/main/java/com/jd/blockchain/peer/web/LedgerQueryController.java
index 6db9674c..8487d67f 100644
--- a/source/peer/src/main/java/com/jd/blockchain/peer/web/LedgerQueryController.java
+++ b/source/peer/src/main/java/com/jd/blockchain/peer/web/LedgerQueryController.java
@@ -1,7 +1,8 @@
package com.jd.blockchain.peer.web;
+import com.jd.blockchain.contract.ContractException;
import com.jd.blockchain.ledger.*;
-import com.jd.blockchain.ledger.core.*;
+import com.jd.blockchain.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -12,6 +13,15 @@ import org.springframework.web.bind.annotation.RestController;
import com.jd.blockchain.binaryproto.BinaryProtocol;
import com.jd.blockchain.binaryproto.PrimitiveType;
import com.jd.blockchain.crypto.HashDigest;
+import com.jd.blockchain.ledger.core.ContractAccountSet;
+import com.jd.blockchain.ledger.core.DataAccount;
+import com.jd.blockchain.ledger.core.DataAccountSet;
+import com.jd.blockchain.ledger.core.LedgerAdministration;
+import com.jd.blockchain.ledger.core.LedgerRepository;
+import com.jd.blockchain.ledger.core.LedgerService;
+import com.jd.blockchain.ledger.core.ParticipantCertData;
+import com.jd.blockchain.ledger.core.TransactionSet;
+import com.jd.blockchain.ledger.core.UserAccountSet;
import com.jd.blockchain.transaction.BlockchainQueryService;
import com.jd.blockchain.utils.Bytes;
import com.jd.blockchain.utils.QueryUtil;
@@ -342,6 +352,46 @@ public class LedgerQueryController implements BlockchainQueryService {
return entries;
}
+ @RequestMapping(method = {RequestMethod.GET, RequestMethod.POST}, path = "ledgers/{ledgerHash}/accounts/{address}/entries-version")
+ @Override
+ public KVDataEntry[] getDataEntries(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
+ @PathVariable(name = "address") String address,
+ @RequestParam("keys") String[] keys,
+ @RequestParam("versions") String[] versions) {
+ if (keys == null || keys.length == 0) {
+ return null;
+ }
+ if (versions == null || versions.length == 0) {
+ return null;
+ }
+ if(keys.length != versions.length){
+ throw new ContractException("keys.length!=versions.length!");
+ }
+
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
+ DataAccount dataAccount = dataAccountSet.getDataAccount(Bytes.fromBase58(address));
+
+ KVDataEntry[] entries = new KVDataEntry[keys.length];
+ long ver = -1;
+ for (int i = 0; i < entries.length; i++) {
+// ver = dataAccount.getDataVersion(Bytes.fromString(keys[i]));
+ if(StringUtils.isNumber(versions[i])){
+ ver = Long.parseLong(versions[i]);
+ }
+ if (ver < 0) {
+ entries[i] = new KVDataObject(keys[i], -1, PrimitiveType.NIL, null);
+ }else {
+ byte[] value = dataAccount.getBytes(Bytes.fromString(keys[i]), ver);
+ BytesValue decodeData = BinaryProtocol.decode(value);
+ entries[i] = new KVDataObject(keys[i], ver, PrimitiveType.valueOf(decodeData.getType().CODE), decodeData.getValue().toBytes());
+ }
+ }
+
+ return entries;
+ }
+
@RequestMapping(method = {RequestMethod.GET, RequestMethod.POST}, path = "ledgers/{ledgerHash}/accounts/address/{address}/entries")
@Override
public KVDataEntry[] getDataEntries(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
diff --git a/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/proxy/BlockchainServiceProxy.java b/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/proxy/BlockchainServiceProxy.java
index 4dbe7bc9..fce0d410 100644
--- a/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/proxy/BlockchainServiceProxy.java
+++ b/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/proxy/BlockchainServiceProxy.java
@@ -147,6 +147,11 @@ public abstract class BlockchainServiceProxy implements BlockchainService {
return getQueryService(ledgerHash).getDataEntries(ledgerHash, address, keys);
}
+ @Override
+ public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, String[] keys, String[] versions) {
+ return getQueryService(ledgerHash).getDataEntries(ledgerHash, address, keys, versions);
+ }
+
@Override
public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, int fromIndex, int count) {
return getQueryService(ledgerHash).getDataEntries(ledgerHash, address, fromIndex, count);
diff --git a/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/proxy/HttpBlockchainQueryService.java b/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/proxy/HttpBlockchainQueryService.java
index bfdc0baf..90860f80 100644
--- a/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/proxy/HttpBlockchainQueryService.java
+++ b/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/proxy/HttpBlockchainQueryService.java
@@ -496,7 +496,12 @@ public interface HttpBlockchainQueryService extends BlockchainExtendQueryService
@PathParam(name="address") String address,
@RequestParam(name="keys", array = true) String... keys);
- @HttpAction(method = HttpMethod.POST, path = "ledgers/{ledgerHash}/accounts/address/{address}/entries")
+ @HttpAction(method=HttpMethod.POST, path="ledgers/{ledgerHash}/accounts/{address}/entries-version")
+ @Override
+ KVDataEntry[] getDataEntries(@PathParam(name="ledgerHash", converter=HashDigestToStringConverter.class) HashDigest ledgerHash,
+ @PathParam(name="address") String address,
+ @RequestParam(name="keys", array = true) String[] keys,
+ @RequestParam(name="versions", array = true) String[] versions);
/**
* 杩斿洖鏁版嵁璐︽埛涓寚瀹氬簭鍙风殑鏈鏂板硷紱
@@ -513,6 +518,7 @@ public interface HttpBlockchainQueryService extends BlockchainExtendQueryService
* 濡傛灉鍙傛暟鍊间负 -1锛屽垯杩斿洖鍏ㄩ儴鐨勮褰曪紱
* @return
*/
+ @HttpAction(method = HttpMethod.POST, path = "ledgers/{ledgerHash}/accounts/address/{address}/entries")
@Override
KVDataEntry[] getDataEntries(@PathParam(name = "ledgerHash") HashDigest ledgerHash,
@PathParam(name = "address") String address,
diff --git a/source/utils/utils-common/src/main/java/com/jd/blockchain/utils/StringUtils.java b/source/utils/utils-common/src/main/java/com/jd/blockchain/utils/StringUtils.java
new file mode 100644
index 00000000..5ae1a856
--- /dev/null
+++ b/source/utils/utils-common/src/main/java/com/jd/blockchain/utils/StringUtils.java
@@ -0,0 +1,24 @@
+package com.jd.blockchain.utils;
+
+import java.util.regex.Pattern;
+
+/**
+ * @Author zhaogw
+ * date 2018/11/26 20:46
+ */
+public class StringUtils {
+ public static boolean isEmpty(Object str) {
+ return str == null || "".equals(str);
+ }
+
+ /*
+ * 鍒ゆ柇鏄惁涓烘暣鏁
+ * @param str 浼犲叆鐨勫瓧绗︿覆
+ * @return 鏄暣鏁拌繑鍥瀟rue,鍚﹀垯杩斿洖false
+ */
+
+ public static boolean isNumber(String str) {
+ Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
+ return pattern.matcher(str).matches();
+ }
+}
\ No newline at end of file