From 6c7f5ada36cc4bae7f9475490ea8177a7d171957 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Mon, 13 May 2019 17:11:42 +0800 Subject: [PATCH] add new restful interface: ledgers/{ledgerHash}/accounts/{address}/entries-version test OK. --- .../com/jd/blockchain/ContractDeployMojo.java | 1 + .../java/com/jd/blockchain/StringUtils.java | 10 --- .../main/resources/sys-contract.properties | 6 +- source/contract/contract-tools/pom.xml | 80 ------------------- .../gateway/web/BlockBrowserController.java | 8 ++ .../ledger/core/impl/LedgerQueryService.java | 41 ++++++++++ .../impl/handles/ContractLedgerContext.java | 5 ++ .../transaction/BlockchainQueryService.java | 2 + .../peer/web/LedgerQueryController.java | 52 +++++++++++- .../sdk/proxy/BlockchainServiceProxy.java | 5 ++ .../sdk/proxy/HttpBlockchainQueryService.java | 8 +- .../com/jd/blockchain/utils/StringUtils.java | 24 ++++++ 12 files changed, 147 insertions(+), 95 deletions(-) delete mode 100644 source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/StringUtils.java delete mode 100644 source/contract/contract-tools/pom.xml create mode 100644 source/utils/utils-common/src/main/java/com/jd/blockchain/utils/StringUtils.java 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