ledgers/{ledgerHash}/accounts/{address}/entries-version test OK.tags/1.0.0
@@ -5,6 +5,7 @@ import com.jd.blockchain.crypto.PrivKey; | |||||
import com.jd.blockchain.crypto.PubKey; | import com.jd.blockchain.crypto.PubKey; | ||||
import com.jd.blockchain.ledger.BlockchainKeypair; | import com.jd.blockchain.ledger.BlockchainKeypair; | ||||
import com.jd.blockchain.tools.keygen.KeyGenCommand; | 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.codec.Base58Utils; | ||||
import com.jd.blockchain.utils.io.FileUtils; | import com.jd.blockchain.utils.io.FileUtils; | ||||
import org.apache.maven.plugin.AbstractMojo; | import org.apache.maven.plugin.AbstractMojo; | ||||
@@ -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); | |||||
} | |||||
} |
@@ -1,9 +1,9 @@ | |||||
#项目源文件存放的位置; | |||||
#PROJECT_BASE_DIR | |||||
PROJECT_BASE_DIR=E:\\gitCode\\block\\prototype\\ | PROJECT_BASE_DIR=E:\\gitCode\\block\\prototype\\ | ||||
#合同使用的类库存放的位置,可能不在项目中,故采用全新的地址; | |||||
#LEDGER_BASE_CLASS_PATH | |||||
LEDGER_BASE_CLASS_PATH=E:\\gitCode\\block\\prototype\\libs\\ | LEDGER_BASE_CLASS_PATH=E:\\gitCode\\block\\prototype\\libs\\ | ||||
#为了测试,临时添加的变量; | |||||
#deploy and execute the contract; | |||||
cParam=com.jd.blockchain.contract.AssetContract3 | cParam=com.jd.blockchain.contract.AssetContract3 | ||||
sParam=E:\\gitCode\\block\\prototype\\source\\sdk\\contract-sample\\src\\main\\java\\ | sParam=E:\\gitCode\\block\\prototype\\source\\sdk\\contract-sample\\src\\main\\java\\ | ||||
eParam=utf-8 | eParam=utf-8 | ||||
@@ -1,80 +0,0 @@ | |||||
<project xmlns="http://maven.apache.org/POM/4.0.0" | |||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||||
<modelVersion>4.0.0</modelVersion> | |||||
<parent> | |||||
<groupId>com.jd.blockchain</groupId> | |||||
<artifactId>contract</artifactId> | |||||
<version>0.9.0-SNAPSHOT</version> | |||||
</parent> | |||||
<artifactId>contract-tools</artifactId> | |||||
<dependencies> | |||||
<dependency> | |||||
<groupId>com.jd.blockchain</groupId> | |||||
<artifactId>contract-compiler</artifactId> | |||||
<version>${project.version}</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.jd.blockchain</groupId> | |||||
<artifactId>contract-jar</artifactId> | |||||
<version>${project.version}</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>commons-io</groupId> | |||||
<artifactId>commons-io</artifactId> | |||||
<version>${commons-io.version}</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>junit</groupId> | |||||
<artifactId>junit</artifactId> | |||||
<scope>test</scope> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.mockito</groupId> | |||||
<artifactId>mockito-core</artifactId> | |||||
<scope>test</scope> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.slf4j</groupId> | |||||
<artifactId>slf4j-log4j12</artifactId> | |||||
</dependency> | |||||
</dependencies> | |||||
<build> | |||||
<plugins> | |||||
<plugin> | |||||
<groupId>org.apache.maven.plugins</groupId> | |||||
<artifactId>maven-surefire-plugin</artifactId> | |||||
<version>2.5</version> | |||||
<configuration> | |||||
<skipTests>true</skipTests> | |||||
</configuration> | |||||
</plugin> | |||||
</plugins> | |||||
</build> | |||||
<!--<build>--> | |||||
<!--<plugins>--> | |||||
<!--<plugin>--> | |||||
<!--<groupId>org.apache.maven.plugins</groupId>--> | |||||
<!--<artifactId>maven-compiler-plugin</artifactId>--> | |||||
<!--<version>3.1</version>--> | |||||
<!--<configuration>--> | |||||
<!--<source>1.8</source>--> | |||||
<!--<target>1.8</target>--> | |||||
<!--<encoding>UTF-8</encoding>--> | |||||
<!--<compilerArgs>--> | |||||
<!--<!–<arg>-verbose</arg>–>--> | |||||
<!--<!–<arg>-Xlint:unchecked</arg>–>--> | |||||
<!--<!–<arg>-Xlint:deprecation</arg>–>--> | |||||
<!--<!–<arg>-bootclasspath</arg>–>--> | |||||
<!--<!–<arg>${env.JAVA_HOME}/jre/lib/rt.jar</arg>–>--> | |||||
<!--<arg>-extdirs</arg>--> | |||||
<!--<arg>${project.basedir}/../contract/contract-libs;$JAVA_HOME/jre/lib/ext</arg>--> | |||||
<!--</compilerArgs>--> | |||||
<!--</configuration>--> | |||||
<!--</plugin>--> | |||||
<!--</plugins>--> | |||||
<!--</build>--> | |||||
</project> |
@@ -239,6 +239,14 @@ public class BlockBrowserController implements BlockchainExtendQueryService { | |||||
return peerService.getQueryService().getDataEntries(ledgerHash, address, keys); | 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") | @RequestMapping(method = {RequestMethod.GET, RequestMethod.POST}, path = "ledgers/{ledgerHash}/accounts/address/{address}/entries") | ||||
@Override | @Override | ||||
public KVDataEntry[] getDataEntries(@PathVariable("ledgerHash") HashDigest ledgerHash, | public KVDataEntry[] getDataEntries(@PathVariable("ledgerHash") HashDigest ledgerHash, | ||||
@@ -2,6 +2,7 @@ package com.jd.blockchain.ledger.core.impl; | |||||
import com.jd.blockchain.binaryproto.BinaryProtocol; | import com.jd.blockchain.binaryproto.BinaryProtocol; | ||||
import com.jd.blockchain.binaryproto.PrimitiveType; | import com.jd.blockchain.binaryproto.PrimitiveType; | ||||
import com.jd.blockchain.contract.ContractException; | |||||
import com.jd.blockchain.crypto.HashDigest; | import com.jd.blockchain.crypto.HashDigest; | ||||
import com.jd.blockchain.ledger.*; | import com.jd.blockchain.ledger.*; | ||||
import com.jd.blockchain.ledger.core.ContractAccountSet; | 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.transaction.BlockchainQueryService; | ||||
import com.jd.blockchain.utils.Bytes; | import com.jd.blockchain.utils.Bytes; | ||||
import com.jd.blockchain.utils.QueryUtil; | import com.jd.blockchain.utils.QueryUtil; | ||||
import com.jd.blockchain.utils.StringUtils; | |||||
public class LedgerQueryService implements BlockchainQueryService { | public class LedgerQueryService implements BlockchainQueryService { | ||||
@@ -263,6 +265,9 @@ public class LedgerQueryService implements BlockchainQueryService { | |||||
long ver; | long ver; | ||||
for (int i = 0; i < entries.length; i++) { | for (int i = 0; i < entries.length; i++) { | ||||
ver = dataAccount.getDataVersion(Bytes.fromString(keys[i])); | ver = dataAccount.getDataVersion(Bytes.fromString(keys[i])); | ||||
dataAccount.getBytes(Bytes.fromString(keys[i]),1); | |||||
if (ver < 0) { | if (ver < 0) { | ||||
entries[i] = new KVDataObject(keys[i], -1, PrimitiveType.NIL, null); | entries[i] = new KVDataObject(keys[i], -1, PrimitiveType.NIL, null); | ||||
}else { | }else { | ||||
@@ -275,6 +280,42 @@ public class LedgerQueryService implements BlockchainQueryService { | |||||
return entries; | 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 | @Override | ||||
public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, int fromIndex, int count) { | public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, int fromIndex, int count) { | ||||
@@ -156,6 +156,11 @@ public class ContractLedgerContext implements LedgerContext { | |||||
return innerQueryService.getDataEntries(ledgerHash, address, keys); | 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 | @Override | ||||
public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, int fromIndex, int count) { | public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, int fromIndex, int count) { | ||||
return innerQueryService.getDataEntries(ledgerHash, address, fromIndex, count); | return innerQueryService.getDataEntries(ledgerHash, address, fromIndex, count); | ||||
@@ -261,6 +261,8 @@ public interface BlockchainQueryService { | |||||
*/ | */ | ||||
KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, String... keys); | KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, String... keys); | ||||
KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, String[] keys, String[] versions); | |||||
/** | /** | ||||
* 返回指定数据账户中KV数据的总数; <br> | * 返回指定数据账户中KV数据的总数; <br> | ||||
* | * | ||||
@@ -1,7 +1,8 @@ | |||||
package com.jd.blockchain.peer.web; | package com.jd.blockchain.peer.web; | ||||
import com.jd.blockchain.contract.ContractException; | |||||
import com.jd.blockchain.ledger.*; | 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.beans.factory.annotation.Autowired; | ||||
import org.springframework.web.bind.annotation.PathVariable; | import org.springframework.web.bind.annotation.PathVariable; | ||||
import org.springframework.web.bind.annotation.RequestMapping; | 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.BinaryProtocol; | ||||
import com.jd.blockchain.binaryproto.PrimitiveType; | import com.jd.blockchain.binaryproto.PrimitiveType; | ||||
import com.jd.blockchain.crypto.HashDigest; | 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.transaction.BlockchainQueryService; | ||||
import com.jd.blockchain.utils.Bytes; | import com.jd.blockchain.utils.Bytes; | ||||
import com.jd.blockchain.utils.QueryUtil; | import com.jd.blockchain.utils.QueryUtil; | ||||
@@ -342,6 +352,46 @@ public class LedgerQueryController implements BlockchainQueryService { | |||||
return entries; | 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") | @RequestMapping(method = {RequestMethod.GET, RequestMethod.POST}, path = "ledgers/{ledgerHash}/accounts/address/{address}/entries") | ||||
@Override | @Override | ||||
public KVDataEntry[] getDataEntries(@PathVariable(name = "ledgerHash") HashDigest ledgerHash, | public KVDataEntry[] getDataEntries(@PathVariable(name = "ledgerHash") HashDigest ledgerHash, | ||||
@@ -147,6 +147,11 @@ public abstract class BlockchainServiceProxy implements BlockchainService { | |||||
return getQueryService(ledgerHash).getDataEntries(ledgerHash, address, keys); | 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 | @Override | ||||
public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, int fromIndex, int count) { | public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, int fromIndex, int count) { | ||||
return getQueryService(ledgerHash).getDataEntries(ledgerHash, address, fromIndex, count); | return getQueryService(ledgerHash).getDataEntries(ledgerHash, address, fromIndex, count); | ||||
@@ -496,7 +496,12 @@ public interface HttpBlockchainQueryService extends BlockchainExtendQueryService | |||||
@PathParam(name="address") String address, | @PathParam(name="address") String address, | ||||
@RequestParam(name="keys", array = true) String... keys); | @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,则返回全部的记录;<br> | * 如果参数值为 -1,则返回全部的记录;<br> | ||||
* @return | * @return | ||||
*/ | */ | ||||
@HttpAction(method = HttpMethod.POST, path = "ledgers/{ledgerHash}/accounts/address/{address}/entries") | |||||
@Override | @Override | ||||
KVDataEntry[] getDataEntries(@PathParam(name = "ledgerHash") HashDigest ledgerHash, | KVDataEntry[] getDataEntries(@PathParam(name = "ledgerHash") HashDigest ledgerHash, | ||||
@PathParam(name = "address") String address, | @PathParam(name = "address") String address, | ||||
@@ -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 是整数返回true,否则返回false | |||||
*/ | |||||
public static boolean isNumber(String str) { | |||||
Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$"); | |||||
return pattern.matcher(str).matches(); | |||||
} | |||||
} |