diff --git a/source/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JavaContractCode.java b/source/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JavaContractCode.java
index c6b7c5b9..fa4d8260 100644
--- a/source/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JavaContractCode.java
+++ b/source/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JavaContractCode.java
@@ -68,7 +68,7 @@ public class JavaContractCode extends AbstractContractCode {
@Override
public BytesValue processEvent(ContractEventContext eventContext) {
if (LOGGER.isDebugEnabled()) {
- LOGGER.debug("Start processing event[%s] of contract[%s]...", eventContext.getEvent(), address.toString());
+ LOGGER.debug("Start processing event{} of contract{}...", eventContext.getEvent(), address.toString());
}
try {
return codeModule.call(new ContractExecution(eventContext));
@@ -78,7 +78,7 @@ public class JavaContractCode extends AbstractContractCode {
throw ex;
} finally {
if (LOGGER.isDebugEnabled()) {
- LOGGER.debug("End processing event[%s] of contract[%s]. ", eventContext.getEvent(), address.toString());
+ LOGGER.debug("End processing event{} of contract{}. ", eventContext.getEvent(), address.toString());
}
}
}
diff --git a/source/deployment/deployment-gateway/src/main/resources/config/gateway.conf b/source/deployment/deployment-gateway/src/main/resources/config/gateway.conf
index d2913069..1fc0594c 100644
--- a/source/deployment/deployment-gateway/src/main/resources/config/gateway.conf
+++ b/source/deployment/deployment-gateway/src/main/resources/config/gateway.conf
@@ -1,4 +1,4 @@
-#网关的HTTP服务地址;
+#网关的HTTP服务地址,建议直接使用0.0.0.0;
http.host=0.0.0.0
#网关的HTTP服务端口;
http.port=8081
@@ -18,6 +18,7 @@ peer.providers=com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider
#数据检索服务对应URL,格式:http://{ip}:{port},例如:http://127.0.0.1:10001
#若该值不配置或配置不正确,则浏览器模糊查询部分无法正常显示
+#数据检索服务模块(Argus)需单独部署,若不部署其他功能仍可正常使用
data.retrieval.url=http://127.0.0.1:10001
#默认公钥的内容(Base58编码数据);
diff --git a/source/deployment/deployment-gateway/src/main/resources/docs/api_doc_cn_1.4.MD b/source/deployment/deployment-gateway/src/main/resources/docs/api_doc_cn_1.4.MD
new file mode 100644
index 00000000..7ff79c96
--- /dev/null
+++ b/source/deployment/deployment-gateway/src/main/resources/docs/api_doc_cn_1.4.MD
@@ -0,0 +1,2083 @@
+# 京东区块链浏览器API文档参考 V_1.4
+
+## 1 API调用说明
+
+该文档内的所有api的调用成功和失败均按照以下规则
+
+### 1.1 成功
+
+```json
+{
+ "data": ...,
+ "success": true
+}
+```
+
+说明
+
+ - success 值为 true 表明api调用成功
+ - data 为返回的数据,具体数据类型参考具体的api说明
+
+### 1.2 失败
+
+```json
+{
+ "error": {
+ "errorCode": 5000,
+ "errorMessage": "未预期的异常! --Unsupported access ledger[6Gw3cK4uazegy4HjoaM81ck9NgYLNoKyBMb7a1TK1jt3d] !"
+ },
+ "success": false
+}
+```
+
+说明
+
+ - success 值为 false 表明api调用成功
+ - errorCode 为异常代码
+ - errorMessage 为错误提示
+
+## 2 账本
+
+### 2.1 获取账本总数
+
+```http
+GET /ledgers/count
+```
+
+#### 参数
+无
+
+
+#### 请求实例
+```http
+http://localhost/ledgers/count
+```
+
+#### 返回实例
+
+```json
+{
+ "data": 2,
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|data|账本总数|
+
+
+### 2.2 获取账本列表
+
+```http
+GET /ledgers?fromIndex={start_index}&count={count}
+```
+
+#### 参数
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|query|start_index|否|查询账本的起始序号,默认为0|数字
+|query|count|否|查询返回账本的数量限制,默认最大限制为100,小于0或大于100均返回最大可返回结果集|数字
+
+
+#### 请求实例
+```http
+http://localhost/ledgers?fromIndex=0&count=-1
+```
+
+#### 返回实例
+
+```json
+{
+ "data": [
+ {
+ "value": "657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs"
+ }
+ ],
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|data|账本哈希列表|
+|value|账户哈希|
+
+### 2.3 获取账本详细信息
+
+```http
+GET /ledgers/{ledger}
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串
+
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs
+```
+
+#### 返回实例
+
+```json
+{
+ "data": {
+ "hash": {
+ "value": "657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs"
+ },
+ "latestBlockHash": {
+ "value": "67XsKWgqZTBz1NsytKGpyNWHMbMRENWcBj8PEDYQnWiDL"
+ },
+ "latestBlockHeight": 66
+ },
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|data|账本信息|
+|hash.value|账本哈希|
+|latestBlockHash.value|最新区块哈希
+|latestBlockHeight|账本高度
+
+
+### 2.4 获取账本成员总数
+
+```http
+GET /ledgers/{ledger}/participants/count
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串
+
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/participants/count
+```
+
+#### 返回实例
+
+```json
+{
+ "data": 4,
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|data|账本成员总数|
+
+
+### 2.5 获取账本成员列表
+
+```http
+GET /ledgers/{ledger}/participants?fromIndex={start_index}&count={count}
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串
+|query|start_index|否|查询成员起始序号,默认为0|数字
+|query|count|否|查询成员返回数量,默认最大返回100,小于0或大于100均返回最大可返回结果集|数字
+
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/participants?fromIndex=0&count=-1
+```
+
+#### 返回实例
+
+```json
+{
+ "data": [
+ {
+ "address": "5SmFzgFtHtpbJwMCsmWTwjNGTk6SeMKU1522",
+ "name": "jd.com",
+ "id": 0,
+ "pubKey": {
+ "value": "mb5kbwzACnhK9P1dVxgMPB2ySJLFyJKQbHpH7T9oRK3LpS"
+ }
+ },
+ {
+ "address": "5SmA98VknTbZ1Z7fmbNPHBuN2pbD89ogy8Ha",
+ "name": "at.com",
+ "id": 1,
+ "pubKey": {
+ "value": "mbC8hzmYBz2SsLLqwoBXAJiGeHrCnByBEvcaUZWscAiPqR"
+ }
+ },
+ {
+ "address": "5SmMWsqV2kbgrRMjyQFtSq1wvYuPzeRVepHG",
+ "name": "bt.com",
+ "id": 2,
+ "pubKey": {
+ "value": "mb4AtiGAH7vtPufMDuap2oca2Ww9X6KTkp59Eh5nZjXA5H"
+ }
+ },
+ {
+ "address": "5Sm5QFyvN1dVB4GHFxWhDCp8vsJbNkdx31Ds",
+ "name": "xt.com",
+ "id": 3,
+ "pubKey": {
+ "value": "mb7pGhmmjqYUhxrJJ57C1YxXr9h1AWXv8QVosETyuLhVvH"
+ }
+ }
+ ],
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|id|成员唯一标识|
+|name|成员名称|
+|address|成员地址|
+|pubKey.value|成员公钥|
+
+
+
+### 2.6 获取账本元数据信息
+
+```http
+GET /ledgers/{ledger}/metadata
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串
+
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/metadata
+```
+
+#### 返回实例
+
+```json
+{
+ "data": {
+ "participantsHash": {
+ "value": "j5hQErg4epzNh38FR3EABx8YJqPkLYZoY828giAyKpCXMd"
+ },
+ "seed": "ky3+I/4jIy8oPzL63TKqdoMiyi9WI2zacTazIssyP/4=",
+ "setting": {
+ "consensusProvider": "com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider",
+ "cryptoSetting": {
+ "supportedProviders": [{
+ "algorithms": [{}, {}, {}, {}, {}, {}, {}],
+ "name": "com.jd.blockchain.crypto.service.classic.ClassicCryptoService"
+ }, {
+ "algorithms": [{}, {}, {}],
+ "name": "com.jd.blockchain.crypto.service.sm.SMCryptoService"
+ }],
+ "autoVerifyHash": true,
+ "hashAlgorithm": 8216
+ },
+ "consensusSetting": {
+ "value": "112ky33NcTKBkV..."
+ }
+ }
+ },
+ "success": true
+}
+
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|seed|账本生成种子|
+|consensusSetting|共识配置,每种共识不同,需独立解析|
+
+
+
+
+### 2.7 获取账本配置信息
+
+```http
+GET /ledgers/{ledger}/settings
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串
+
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/settings
+```
+
+#### 返回实例
+
+```json
+
+{
+ "data": {
+ "consensusProtocol": "com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider",
+ "consensusSettings": {
+ "nodes": [{
+ "address": "LdeNgXM4J1SybrdUn71KdPhwBYvJzZ6xUG5Rd",
+ "id": 0,
+ "networkAddress": {
+ "host": "127.0.0.1",
+ "port": 26000,
+ "secure": false
+ },
+ "pubKey": {
+ "value": "7VeRMXAkf3zoqr4N2RgLZ83xAv7wurqu6Vxak1V1GHv4Kfe3"
+ }
+ }, {
+ "address": "LdeNwbLhiAHQCVxnXsyKLhgcmUi2fuwYd6jkh",
+ "id": 1,
+ "networkAddress": {
+ "host": "127.0.0.1",
+ "port": 26010,
+ "secure": false
+ },
+ "pubKey": {
+ "value": "7VeRAt79WPnMQ7TsM5cfhy2ERwVLu8fXbDezfFb6bT9BgYaZ"
+ }
+ }, {
+ "address": "LdeNgVjFaUTzsSHySB3ZrBaLiEeZebLkkyWFP",
+ "id": 2,
+ "networkAddress": {
+ "host": "127.0.0.1",
+ "port": 26020,
+ "secure": false
+ },
+ "pubKey": {
+ "value": "7VeR9rnFNzgECCYGF8V3G36xhF3X9rr6YzqfN8h6CojgLpEY"
+ }
+ }, {
+ "address": "LdeNgVAkBAAdKLD1z3Nb7n5vtGujfqWdhx8G7",
+ "id": 3,
+ "networkAddress": {
+ "host": "127.0.0.1",
+ "port": 26030,
+ "secure": false
+ },
+ "pubKey": {
+ "value": "7VeRPkXMyHFvpPf2jayHjiLX8H7CAcTJpF9F1FARogiroSK2"
+ }
+ }],
+ "systemConfigs": [{
+ "name": "system.bft",
+ "value": "true"
+ }, {
+ "name": "system.communication.defaultkeys",
+ "value": "true"
+ }, {
+ "name": "system.communication.inQueueSize",
+ "value": "500000"
+ }, {
+ "name": "system.communication.outQueueSize",
+ "value": "500000"
+ }, {
+ "name": "system.communication.useMACs",
+ "value": "1"
+ }, {
+ "name": "system.communication.useSenderThread",
+ "value": "true"
+ }, {
+ "name": "system.communication.useSignatures",
+ "value": "0"
+ }, {
+ "name": "system.debug",
+ "value": "0"
+ }, {
+ "name": "system.initial.view",
+ "value": "0,1,2,3"
+ }, {
+ "name": "system.servers.f",
+ "value": "1"
+ }, {
+ "name": "system.servers.num",
+ "value": "4"
+ }, {
+ "name": "system.shutdownhook",
+ "value": "true"
+ }, {
+ "name": "system.totalordermulticast.checkpoint_period",
+ "value": "1000"
+ }, {
+ "name": "system.totalordermulticast.checkpoint_to_disk",
+ "value": "false"
+ }, {
+ "name": "system.totalordermulticast.global_checkpoint_period",
+ "value": "120000"
+ }, {
+ "name": "system.totalordermulticast.highMark",
+ "value": "10000"
+ }, {
+ "name": "system.totalordermulticast.log",
+ "value": "true"
+ }, {
+ "name": "system.totalordermulticast.log_parallel",
+ "value": "false"
+ }, {
+ "name": "system.totalordermulticast.log_to_disk",
+ "value": "false"
+ }, {
+ "name": "system.totalordermulticast.maxbatchsize",
+ "value": "400"
+ }, {
+ "name": "system.totalordermulticast.nonces",
+ "value": "10"
+ }, {
+ "name": "system.totalordermulticast.revival_highMark",
+ "value": "10"
+ }, {
+ "name": "system.totalordermulticast.state_transfer",
+ "value": "true"
+ }, {
+ "name": "system.totalordermulticast.sync_ckp",
+ "value": "false"
+ }, {
+ "name": "system.totalordermulticast.sync_log",
+ "value": "false"
+ }, {
+ "name": "system.totalordermulticast.timeout",
+ "value": "2000"
+ }, {
+ "name": "system.totalordermulticast.timeout_highMark",
+ "value": "200"
+ }, {
+ "name": "system.totalordermulticast.verifyTimestamps",
+ "value": "false"
+ }, {
+ "name": "system.ttp.id",
+ "value": "7002"
+ }]
+ },
+ "cryptoSetting": {
+ "autoVerifyHash": true,
+ "hashAlgorithm": 8216,
+ "supportedProviders": [{
+ "algorithms": [{}, {}, {}, {}, {}, {}, {}],
+ "name": "com.jd.blockchain.crypto.service.classic.ClassicCryptoService"
+ }, {
+ "algorithms": [{}, {}, {}],
+ "name": "com.jd.blockchain.crypto.service.sm.SMCryptoService"
+ }]
+ },
+ "participantNodes": [{
+ "address": "LdeNgXM4J1SybrdUn71KdPhwBYvJzZ6xUG5Rd",
+ "id": 0,
+ "name": "a.com",
+ "pubKey": {
+ "value": "7VeRMXAkf3zoqr4N2RgLZ83xAv7wurqu6Vxak1V1GHv4Kfe3"
+ }
+ }, {
+ "address": "LdeNwbLhiAHQCVxnXsyKLhgcmUi2fuwYd6jkh",
+ "id": 1,
+ "name": "b.com",
+ "pubKey": {
+ "value": "7VeRAt79WPnMQ7TsM5cfhy2ERwVLu8fXbDezfFb6bT9BgYaZ"
+ }
+ }, {
+ "address": "LdeNgVjFaUTzsSHySB3ZrBaLiEeZebLkkyWFP",
+ "id": 2,
+ "name": "c.com",
+ "pubKey": {
+ "value": "7VeR9rnFNzgECCYGF8V3G36xhF3X9rr6YzqfN8h6CojgLpEY"
+ }
+ }, {
+ "address": "LdeNgVAkBAAdKLD1z3Nb7n5vtGujfqWdhx8G7",
+ "id": 3,
+ "name": "d.com",
+ "pubKey": {
+ "value": "7VeRPkXMyHFvpPf2jayHjiLX8H7CAcTJpF9F1FARogiroSK2"
+ }
+ }],
+ "participantsHash": {
+ "value": "j5hQErg4epzNh38FR3EABx8YJqPkLYZoY828giAyKpCXMd"
+ },
+ "seed": "932dfe23-fe23232f-283f32fa-dd32aa76-8322ca2f-56236cda-7136b322-cb323ffe"
+ },
+ "success": true
+}
+
+
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|seed|账本种子信息|
+|consensusProtocol|共识协议,以字符串方式显示|
+|consensusSettings|共识配置,不同共识协议内容不同,上述示例为BFTSmart相关配置|
+|cryptoSetting|密码相关配置|
+|cryptoSetting.hashAlgorithm|Hash算法Code(8216代表SHA256)|
+|cryptoSetting.autoVerifyHash|是否自动校验Hash|
+|cryptoSetting.supportedProviders|支持的算法库|
+|participantNodes|参与方列表信息|
+|participantNodes.id|参与方序号|
+|participantNodes.address|参与方地址|
+|participantNodes.name|参与方名称|
+|participantNodes.pubKey.value|参与方公钥信息|
+|participantsHash.value|参与方根Hash|
+
+
+
+## 3 区块
+
+### 3.1 获取最新区块
+
+```http
+GET /ledgers/{ledger}/blocks/latest
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/blocks/latest
+```
+
+#### 返回实例
+
+```json
+{
+ "data": {
+ "ledgerHash": {
+ "value": "657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs"
+ },
+ "previousHash": {
+ "value": "6EJZnMc9464DCSU2kgi96RyngEv8YeEfVoJNhH3yZ2v5T"
+ },
+ "transactionSetHash": {
+ "value": "6LmZtDpMM7xE8FPChACEmLj1PLhfaoVM2rEHRsrV3ohPN"
+ },
+ "userAccountSetHash": {
+ "value": "67jx7SctrwdSczxxuYjwBocA8fER7V8qcRZUzWamSav5p"
+ },
+ "contractAccountSetHash": {
+ "value": "67ftaBhPDez24NEB9wiiTM3SNcn1XFz5rb7boYhpbbLXN"
+ },
+ "adminAccountHash": {
+ "value": "69KEFp9m5iFyAiyGmJ2qPcVxuT79gMChMf9JkStBZe8aa"
+ },
+ "dataAccountSetHash": {
+ "value": "6LB9gosVWEPG3uvWXkxTcWq22mcwMHVehbiXkavFtr5fZ"
+ },
+ "hash": {
+ "value": "67XsKWgqZTBz1NsytKGpyNWHMbMRENWcBj8PEDYQnWiDL"
+ },
+ "height": 66
+ },
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|hash|区块哈希|
+|ledgerHash|账本哈希|
+|previousHash|前置区块哈希|
+|transactionSetHash|交易集哈希|
+|userAccountSetHash|用户集哈希|
+|contractAccountSetHash|合约集哈希|
+|adminAccountHash|管理员集哈希|
+|dataAccountSetHash|数据账户集哈希|
+
+### 3.2 根据区块哈希获取区块详细信息
+
+```http
+GET /ledgers/{ledger}/blocks/hash/{block_hash}
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串|
+|path|block_hash|是|区块哈希|字符串|
+
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/blocks/hash/67XsKWgqZTBz1NsytKGpyNWHMbMRENWcBj8PEDYQnWiDL
+```
+
+#### 返回实例
+
+[参考](#block-detail)
+
+
+### 3.3 根据区块高度获取区块详细信息
+
+```http
+GET /ledgers/{ledger}/blocks/height/{block_height}
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串|
+|path|block_height|是|区块高度|数字|
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/blocks/height/66
+```
+
+#### 返回实例
+
+[参考](#block-detail)
+
+
+### 3.4 根据哈希查询区块总数
+
+```http
+ GET /ledgers/{ledger}/blocks/count/search?keyword={keyword}
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型|
+|---|---|---|---|---|
+|**path**|**ledger**|是|所要搜索的账本,需要完整的账本哈希|string|
+|**query**|**keyword**|是| 区块哈希的全部或者一部分|string|
+
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/blocks/count/search?keyword=6D5M
+```
+
+#### 返回实例
+
+```json
+{
+ "data": 26,
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|data|查询到的区块总数|
+
+### 3.5 根据哈希查询区块
+
+```http
+ GET /ledgers/{ledger}/blocks/search?keyword={keyword}&fromIndex={start_index}&count={count}
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型|
+|---|---|---|---|---|
+|**path**|**ledger**|是|所要搜索的账本,需要完整的账本哈希|string|
+|**query**|**keyword**|是| 区块哈希的全部或者一部分|string|
+|**query**|**start_index**|否| 查询区块结果起始序号,默认为0|string|
+|**query**|**count**|否| 查询区块结果返回数量,默认最大值为100,小于0或大于100均返回最大可返回结果集|string|
+
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/blocks/search?keyword=6D5M&fromIndex=0&count=-1
+```
+
+
+#### 返回实例
+
+```json
+{
+ "data": {
+ "blocks": [
+ {
+ "hash": "6D5MJZnybT69bXET5QdCZdLGT16rZBJEjxLkANmDuykcb"
+ }
+ ]
+ },
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|blocks|查询到的区块列表|
+|hash|区块哈希值|
+|height|区块高度|
+|txCount|区块内交易数量|
+
+## 4 交易
+
+### 4.1 获取账本交易总数
+
+```http
+GET /ledgers/{ledger}/txs/count
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/txs/count
+```
+
+##### 返回实例
+
+```json
+{
+ "data": 688,
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|data|交易数量|
+
+### 4.2 根据区块高度查询区块内的交易数量
+
+```http
+GET /ledgers/{ledger}/blocks/height/{block_height}/txs/additional-count
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串|
+|path|block_height|是|区块高度|数字|
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/blocks/height/66/txs/additional-count
+
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/blocks/hash/6D5MJZnybT69bXET5QdCZdLGT16rZBJEjxLkANmDuykcb/txs/additional-count
+```
+
+#### 返回实例
+
+```json
+{
+ "data": 86,
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|data|交易数量|
+
+
+### 4.3 根据区块哈希查询区块内的交易数量
+
+```http
+GET /ledgers/{ledger}/blocks/hash/{block_hash}/txs/additional-count
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串|
+|path|block_hash|是|区块哈希|字符串|
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/blocks/hash/6D5MJZnybT69bXET5QdCZdLGT16rZBJEjxLkANmDuykcb/txs/additional-count
+```
+
+#### 返回实例
+
+```json
+{
+ "data": 86,
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|data|交易数量|
+
+
+### 4.4 获取指定高度的区块交易列表
+
+```http
+GET /ledgers/{ledger}/blocks/height/{height}/txs?fromIndex={start_index}&count={count}
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串
+|path|height|是|区块高度|数字|
+|query|start_index|否|查询交易的起始序号,默认为0|数字|
+|query|count|否|查询返回交易的数量,默认最大返回值为100,小于0或大于100均返回最大可返回结果集|数字|
+
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/blocks/height/66/txs?fromIndex=0&count=-1
+```
+
+#### 返回实例
+
+```json
+{
+ "data": [
+ {
+ "blockHeight": 1,
+ "executionState": "SUCCESS",
+ "transactionContent": {
+ "ledgerHash": {
+ "value": "657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs"
+ },
+ "operations": [
+ {
+ "userID": {
+ "address": {
+ "value": "5SmBgzsrnY6u9Y7DgSSkXfTkCgp83hiFin3v"
+ },
+ "pubKey": {
+ "value": "mb5kukaqjWtXyAerfHU1JDtVwabSeBU5c3khMZbNh7R8VJ"
+ }
+ }
+ },
+ {
+ "accountID": {
+ "address": {
+ "value": "5SmA98VknTbZ1Z7fmbNPHBuN2pbD89ogy8Ha"
+ },
+ "pubKey": {
+ "value": "mbC8hzmYBz2SsLLqwoBXAJiGeHrCnByBEvcaUZWscAiPqR"
+ }
+ }
+ },
+ {
+ "contractID": {
+ "address": {
+ "value": "5SmA98VknTbZ1Z7fmbNPHBuN2pbD89ogy8Ha"
+ },
+ "pubKey": {
+ "value": "mbC8hzmYBz2SsLLqwoBXAJiGeHrCnByBEvcaUZWscAiPqR"
+ }
+ },
+ "chainCode": "----------"
+ },
+ {
+ "contractAddress": {
+ "value": "mbC8hzmYBz2SsLLqwoBXAJiGeHrCnByBEvcaUZWscAiPqR"
+ },
+ "event": "----------",
+ "args": "----------"
+ },
+ {
+ "writeSet": [{
+ "key": "jdchain",
+ "value": {
+ "type": "TEXT",
+ "value": {
+ "value": "----------"
+ }
+ },
+ "expectedVersion": 0
+ }],
+ "accountAddress": {
+ "value": "mbC8hzmYBz2SsLLqwoBXAJiGeHrCnByBEvcaUZWscAiPqR"
+ }
+ }
+ ],
+ "hash": {
+ "value": "6BLtM1agb7ERKoN5AJgZKiTjzdS7BpjgzQNYK8ZeDqotA"
+ }
+ },
+ "endpointSignatures": [
+ {
+ "digest": {
+ "value": "42pbfM5YKnf39Gitr4UsjTCzhhnJjwNyi8MnLFYgP4VKewTLzHitzArHEMrCt3hZYUe5ex9XvqtmiCoWpeAbdc31F"
+ },
+ "pubKey": {
+ "value": "mb5kbwzACnhK9P1dVxgMPB2ySJLFyJKQbHpH7T9oRK3LpS"
+ }
+ }
+ ],
+ "nodeSignatures": [
+ {
+ "digest": {
+ "value": "66SQ95SbDaApAJhN2NsFx5sfAQTxsWhMW26D5iPqXc1jZU9rJEhRnqT1nzt62ZAcCvsfrjEsay3MxqXYA5tWPoA2U"
+ },
+ "pubKey": {
+ "value": "mb5kbwzACnhK9P1dVxgMPB2ySJLFyJKQbHpH7T9oRK3LpS"
+ }
+ }
+ ]
+ }
+ ],
+ "success": true
+}
+```
+
+
+说明
+
+|名称|说明|
+|---|---|
+|executionState|交易执行结果|
+|transactionContent.hash|交易的哈希|
+|transactionContent.operations|交易的操作列表|
+|endpointSignatures|终端签名列表|
+|nodeSignatures|节点的签名列表|
+
+### 4.5 获取指定哈希的区块的交易列表
+
+```http
+GET /ledgers/{ledger}/blocks/hash/{block_hash}/txs?fromIndex={start_index}&count={count}
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串
+|path|block_hash|是|区块哈希|字符串|
+|query|start_index|否|查询交易的起始序号,默认为0|数字|
+|query|count|否|查询返回交易的数量,默认最大返回值为100,小于0或大于100均返回最大可返回结果集|数字|
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/blocks/hash/6D5MJZnybT69bXET5QdCZdLGT16rZBJEjxLkANmDuykcb/txs?fromIndex=0&count=-1
+```
+
+#### 返回实例
+
+[参考](#tx-list)
+
+
+### 4.6 获取交易详细信息
+
+```http
+GET /ledgers/{ledger}/txs/hash/{tx_hash}
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串
+|path|tx_hash|是|交易哈希|字符串|
+
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/txs/hash/6BLtM1agb7ERKoN5AJgZKiTjzdS7BpjgzQNYK8ZeDqotA
+```
+
+#### 返回实例
+
+```json
+{
+ "data": {
+ "blockHeight": 1,
+ "executionState": "SUCCESS",
+ "transactionContent": {
+ "ledgerHash": {
+ "value": "657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs"
+ },
+ "operations": [
+ {
+ "userID": {
+ "address": {
+ "value": "5SmBgzsrnY6u9Y7DgSSkXfTkCgp83hiFin3v"
+ },
+ "pubKey": {
+ "value": "mb5kukaqjWtXyAerfHU1JDtVwabSeBU5c3khMZbNh7R8VJ"
+ }
+ }
+ },
+ {
+ "accountID": {
+ "address": {
+ "value": "5SmA98VknTbZ1Z7fmbNPHBuN2pbD89ogy8Ha"
+ },
+ "pubKey": {
+ "value": "mbC8hzmYBz2SsLLqwoBXAJiGeHrCnByBEvcaUZWscAiPqR"
+ }
+ }
+ },
+ {
+ "contractID": {
+ "address": {
+ "value": "5SmA98VknTbZ1Z7fmbNPHBuN2pbD89ogy8Ha"
+ },
+ "pubKey": {
+ "value": "mbC8hzmYBz2SsLLqwoBXAJiGeHrCnByBEvcaUZWscAiPqR"
+ }
+ },
+ "chainCode": "----------"
+ },
+ {
+ "contractAddress": {
+ "value": "mbC8hzmYBz2SsLLqwoBXAJiGeHrCnByBEvcaUZWscAiPqR"
+ },
+ "event": "----------",
+ "args": "----------"
+ },
+ {
+ "writeSet": [{
+ "key": "jdchain",
+ "value": {
+ "type": "TEXT",
+ "value": {
+ "value": "----------"
+ }
+ },
+ "expectedVersion": 0
+ }],
+ "accountAddress": {
+ "value": "mbC8hzmYBz2SsLLqwoBXAJiGeHrCnByBEvcaUZWscAiPqR"
+ }
+ }
+ ],
+ "hash": {
+ "value": "6BLtM1agb7ERKoN5AJgZKiTjzdS7BpjgzQNYK8ZeDqotA"
+ }
+ },
+ "endpointSignatures": [
+ {
+ "digest": {
+ "value": "42pbfM5YKnf39Gitr4UsjTCzhhnJjwNyi8MnLFYgP4VKewTLzHitzArHEMrCt3hZYUe5ex9XvqtmiCoWpeAbdc31F"
+ },
+ "pubKey": {
+ "value": "mb5kbwzACnhK9P1dVxgMPB2ySJLFyJKQbHpH7T9oRK3LpS"
+ }
+ }
+ ],
+ "nodeSignatures": [
+ {
+ "digest": {
+ "value": "66SQ95SbDaApAJhN2NsFx5sfAQTxsWhMW26D5iPqXc1jZU9rJEhRnqT1nzt62ZAcCvsfrjEsay3MxqXYA5tWPoA2U"
+ },
+ "pubKey": {
+ "value": "mb5kbwzACnhK9P1dVxgMPB2ySJLFyJKQbHpH7T9oRK3LpS"
+ }
+ }
+ ]
+ },
+ "success": true
+}
+```
+
+说明
+
+[参考](#tx-keyword)
+
+
+### 4.7 根据哈希查询交易总数
+
+```http
+ GET /ledgers/{ledgers}/txs/count/search?keyword={keyword}
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型|
+|---|---|---|---|---|
+|**path**|**ledgers**|是|所要搜索的账本范围,需要完整的账本哈希|string|
+|**query**|**keyword**|是|交易哈希,签名者公钥,或者节点公钥的全部或者部分的|string|
+
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/txs/search?keyword=6BLt
+```
+
+#### 返回实例
+
+```json
+{
+ "data": 36,
+ "success": true
+}
+```
+
+
+说明
+
+|名称|说明|
+|---|---|
+|data|指定交易数量|
+
+
+### 4.8 根据哈希查询交易
+
+```http
+ GET /ledgers/{ledgers}/txs/search?keyword={keyword}&fromIndex={start_index}&count={count}
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型|
+|---|---|---|---|---|
+|**path**|**ledgers**|是|所要搜索的账本范围,需要完整的账本哈希|string|
+|**query**|**keyword**|是|交易哈希,签名者公钥,或者节点公钥的全部或者部分的|string|
+|**query**|**start_index**|否|查询交易的起始序号,默认为0|数字|
+|**query**|**count**|否|查询返回交易的数量,默认最大返回值为100,小于0或大于100均返回最大可返回结果集|数字|
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/txs/search?keyword=6BLt
+```
+
+
+#### 返回
+
+```json
+{
+ "data": {
+ "txs": [
+ {
+ "hash": "6L3ehswCmC1jqBfvGJP9vaPx8qxkLsieu2aRgYepmkiw3"
+ }
+ ]
+ },
+ "success": true
+}
+```
+
+## 5 用户
+
+### 5.1 获取用户总数
+
+```http
+GET /ledgers/{ledger}/users/count
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串
+
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/users/count
+```
+
+#### 返回实例
+
+```json
+{
+ "data": 4,
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|data|用户总数|
+
+
+### 5.2 获取用户列表
+
+```http
+GET /ledgers/{ledger}/users?fromIndex={start_index}&count={count}
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串
+|query|start_index|否|查询用户的起始序号,默认为0|数字|
+|query|count|否|查询返回用户的数量,默认最大返回值为100,小于0或大于100均返回最大可返回结果集|数字|
+
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/users?fromIndex=0&count=-1
+```
+
+#### 返回实例
+
+```json
+{
+ "data":[{
+ "address": {
+ "value": "5SmFzgFtHtpbJwMCsmWTwjNGTk6SeMKU1522"
+ },
+ "pubKey": {
+ "value": "mb5kbwzACnhK9P1dVxgMPB2ySJLFyJKQbHpH7T9oRK3LpS"
+ },
+ "rootHash": {
+ "value": "5SmFzgFtHtpbJwMCsmWTwjNGTk6SeMKU1522"
+ }
+ }],
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|address.value|用户地址|
+|pubKey.value|用户公钥|
+
+
+### 5.3 获取用户详细信息
+
+```http
+GET /ledgers/{ledger}/users/address/{address}
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串
+|path|address|是|用户地址|字符串
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/users/address/55SmFzgFtHtpbJwMCsmWTwjNGTk6SeMKU1522
+```
+
+#### 返回实例
+
+```json
+{
+ "data": {
+ "address": {
+ "value": "5SmFzgFtHtpbJwMCsmWTwjNGTk6SeMKU1522"
+ },
+ "pubKey": {
+ "value": "mb5kbwzACnhK9P1dVxgMPB2ySJLFyJKQbHpH7T9oRK3LpS"
+ },
+ "rootHash": {
+ "value": "5SmFzgFtHtpbJwMCsmWTwjNGTk6SeMKU1522"
+ }
+ },
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|address.value|用户地址|
+|pubKey.value|用户公钥|
+|rootHash.value|用户根Hash|
+
+
+### 5.4 用户查询数量
+
+```http
+ GET /ledgers/{ledger}/users/count/search?keyword={keyword}
+```
+
+#### 说明
+
+用户有公钥和地址两个属性,可以通过公钥或者地址查找特定用户数量,也可以返回全部用户的数量
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型|
+|---|---|---|---|---|
+|**path**|**ledger**|是|所要搜索的账本,需要完整的账本哈希|string|
+|**query**|**keyword**|是| 用户的公钥或者地址的全部或者部分|string|
+|**query**|**start_index**|否|查询用户的起始序号,默认为0|数字|
+|**query**|**count**|否|查询返回用户的数量,默认最大返回值为100,小于0或大于100均返回最大可返回结果集|数字|
+
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/users/count/search?keyword=5Sm
+```
+
+#### 返回实例
+
+```json
+{
+ "data": 4,
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|data|用户数量|
+
+### 5.5 用户查询
+
+```http
+ GET /ledgers/{ledger}/users/search?keyword={keyword}&fromIndex={start_index}&count={count}
+```
+
+#### 说明
+
+用户有公钥和地址两个属性,可以通过公钥或者地址查找特定用户,也可以返回全部用户的列表
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型|
+|---|---|---|---|---|
+|**path**|**ledger**|是|所要搜索的账本,需要完整的账本哈希|string|
+|**query**|**keyword**|是| 用户的公钥或者地址的全部或者部分|string|
+|**query**|**start_index**|否|查询用户的起始序号,默认为0|数字|
+|**query**|**count**|否|查询返回用户的数量,默认最大返回值为100,小于0或大于100均返回最大可返回结果集|数字|
+
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/users/search?keyword=5Sm&fromIndex=0&count=-1
+```
+
+
+#### 返回实例
+
+```json
+{
+ "data": {
+ "users": [
+ {
+ "address": {
+ "value": "5SmAGKgmXyj5VsVvJgHbYCJ67iTizwSkNpw1"
+ },
+ "pubKey": {
+ "value": "mb97eG4bba2EjrgjXYiD9chAstjg4HaNuV5xgCtSHc5TeB"
+ }
+ }
+ ]
+ },
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|address.value|用户地址|
+|pubKey.value|用户公钥|
+|rootHash.value|用户根Hash|
+
+## 6 数据账户
+
+### 6.1 获取账户列表
+
+```http
+GET /ledgers/{ledger}/accounts?fromIndex={start_index}&count={count}
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串
+|query|start_index|否|查询数据账户的起始序号,默认为0|数字|
+|query|count|否|查询返回数据账户的数量,默认最大返回值为100,小于0或大于100均返回最大可返回结果集|数字|
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/accounts?fromIndex=0&count=-1
+```
+
+#### 返回实例
+
+```json
+{
+ "data":[{
+ "address": {
+ "value": "5Sm4gWXrNpDWW9Boi4xZCzZMHboRvEDm29Fa"
+ },
+ "rootHash": {
+ "value": "6GiAH2PBRLnoE724ia83bKVijkKsNuNU5danA4AAi5qMM"
+ },
+ "pubKey": {
+ "value": "mavweXqvKGUAJzSxE9S15pV7c7qe9bgUn5R1HwpqmXVTUs"
+ }
+ }],
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|address.value|账户地址|
+|pubKey.value|账户公钥|
+|rootHash.value|默克尔树根哈希|
+
+
+### 6.2 获取账户详细信息
+
+```http
+GET /ledgers/{ledger}/accounts/address/{address}
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串
+|path|address|是|账户地址|字符串
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/accounts/address/5Sm4gWXrNpDWW9Boi4xZCzZMHboRvEDm29Fa
+```
+
+#### 返回实例
+
+```json
+{
+ "data": {
+ "address": {
+ "value": "5Sm4gWXrNpDWW9Boi4xZCzZMHboRvEDm29Fa"
+ },
+ "rootHash": {
+ "value": "6GiAH2PBRLnoE724ia83bKVijkKsNuNU5danA4AAi5qMM"
+ },
+ "pubKey": {
+ "value": "mavweXqvKGUAJzSxE9S15pV7c7qe9bgUn5R1HwpqmXVTUs"
+ }
+ },
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|address.value|账户地址|
+|pubKey.value|账户公钥|
+|rootHash.value|默克尔树根哈希|
+
+
+### 6.3 获取账户总数
+
+```http
+GET /ledgers/{ledger}/accounts/count
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串
+
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/accounts/count
+```
+
+#### 返回实例
+
+```json
+{
+ "data": 18,
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|data|账户数量|
+
+
+### 6.4 查询数据账户匹配的数量
+
+```http
+GET /ledgers/{ledger}/accounts/count/search?keyword={keyword}
+```
+
+#### 说明
+
+通过账户的公钥和地址的全部或者部分查询特定账户的总数量,也可以通过KV值的Key来查询含有该Key的账户的总数量
+
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|**path**|**ledger**|是|所要搜索的账本,需要完整的账本哈希|字符串
+|**query**|**keyword**|是|数据账户的公钥或者地址的全部或者部分,或者是KV值的key|字符串
+
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/accounts/count/search?keyword=jd
+```
+
+#### 返回实例
+
+```json
+{
+ "data": 2,
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|data|账户数量|
+
+
+### 6.5 查询数据账户
+
+```http
+ GET /ledgers/{ledger}/accounts/search?keyword={keyword}&fromIndex={start_index}&count={count}
+```
+
+#### 说明
+
+通过账户的公钥和地址的全部或者部分查询特定账户,也可以通过KV值的Key来查询含有该Key的账户
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型|
+|---|---|---|---|---|
+|**path**|**ledger**|是|所要搜索的账本,需要完整的账本哈希|string|
+|**query**|**keyword**|是| 数据账户的公钥或者地址的全部或者部分,或者是KV值的key|string|
+|**query**|**start_index**|否|查询数据账户的起始序号,默认为0|数字|
+|**query**|**count**|否|查询返回数据账户的数量,默认最大返回值为100,小于0或大于100均返回最大可返回结果集|数字|
+
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/accounts/search?keyword=5Sm5V&fromIndex=0&count=-1
+```
+
+
+#### 返回实例
+
+```json
+{
+ "data": {
+ "accounts": [
+ {
+ "address": {
+ "value": "5Sm4gWXrNpDWW9Boi4xZCzZMHboRvEDm29Fa"
+ },
+ "pubKey": {
+ "value": "mavweXqvKGUAJzSxE9S15pV7c7qe9bgUn5R1HwpqmXVTUs"
+ }
+ }
+ ]
+ },
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|address.value|账户地址|
+|pubKey.value|账户公钥|
+|rootHash.value|数据账户根Hash|
+
+
+### 6.6 获取某数据账户KV总数
+
+```http
+ GET /ledgers/{ledger}/accounts/address/{address}/entries/count
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串
+|path|address|是|账户地址|字符串
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/accounts/address/5Sm4gWXrNpDWW9Boi4xZCzZMHboRvEDm29Fa/entries/count
+```
+
+#### 返回实例
+
+```json
+{
+ "data": 66,
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|data|KV总数|
+
+
+### 6.7 获取某数据账户KV详情
+
+```http
+ GET/POST /ledgers/{ledger}/accounts/address/{address}/entries?fromIndex={start_index}&count={count}
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串
+|path|address|是|账户地址|字符串
+|form|keys|是|key详细内容列表|字符串
+|query|start_index|否|查询数据账户对应KV的起始序号,默认为0|数字|
+|query|count|否|查询返回数据账户对应KV的数量,默认最大返回值为100,小于0或大于100均返回最大可返回结果集|数字|
+
+
+> keys说明:
+ 1)keys使用表单方式提交,且keys为需要查询Key的列表,列表中每个Key都需要为完整Key
+ 2)Key提交方式使用GET或POST均可
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/accounts/address/5Sm4gWXrNpDWW9Boi4xZCzZMHboRvEDm29Fa/entries
+```
+
+说明:表单提交参数为keys={"jd", "jdchain"}
+
+
+#### 返回实例
+
+```json
+{
+ "data": [
+ {
+ "key": "jd",
+ "version": 0,
+ "type": "TEXT",
+ "value": "www.jd.com"
+ },
+ {
+ "key": "jdchain",
+ "version": 0,
+ "type": "TEXT",
+ "value": "www.blockchain.com"
+ }],
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|key|键|
+|version|版本号|
+|type|value类型|
+|value|值|
+
+
+
+
+### 6.8 获取某数据账户KV整个历史详情
+
+```http
+ GET/POST /ledgers/{ledger}/accounts/{address}/entries-version
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串
+|path|address|是|账户地址|字符串
+|form|KVInfoVO|是|Key相关信息|对象
+
+KVInfoVO对应格式如下:
+
+```json
+
+{
+ "data": [{
+ "key": "zhangsan",
+ "version": [0, 1, 2]
+ }, {
+ "key": "lisi",
+ "version": [0, 1]
+ }]
+}
+
+```
+
+KVInfoVO说明:
+ + 1)支持多个Key作为入参;
+
+ + 2)每个Key支持多个version;
+
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/accounts/5Sm4gWXrNpDWW9Boi4xZCzZMHboRvEDm29Fa/entries-version
+```
+
+
+#### 返回实例
+
+```json
+{
+ "data": [
+ {
+ "key": "jd",
+ "version": 0,
+ "type": "TEXT",
+ "value": "www.jd.com"
+ },
+ {
+ "key": "jdchain",
+ "version": 0,
+ "type": "TEXT",
+ "value": "www.blockchain.com"
+ }],
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|key|键|
+|version|版本号|
+|type|value类型|
+|value|值|
+
+
+## 7 搜索
+
+### 7.1 搜索区块链
+
+```http
+ GET /ledgers/{ledger}/all/search?keyword={keyword}&fromIndex={start_index}&count={count}
+```
+
+#### 说明
+
+通过关键字搜索区块数据,支持区块哈希,交易哈希,用户公钥和地址,合约公钥和地址,数据账户哈希和地址的搜索
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型|
+|---|---|---|---|---|
+|**path**|**ledger**|是|所要搜索的账本,需要完整的账本哈希|string|
+|**query**|**keyword**|是|关键字|string|
+|**query**|**start_index**|否|查询匹配结果的起始序号,默认为0|数字|
+|**query**|**count**|否|查询匹配结果的数量,默认最大返回值为100,小于0或大于100均返回最大可返回结果集|数字|
+
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/all/search?keyword=5Sm5V&fromIndex=0&count=-1
+```
+
+#### 返回实例
+
+```json
+{
+ "message": "OK",
+ "code": 0,
+ "data": {
+ "blocks": ...,
+ "txs": ...,
+ "users": ...,
+ "accounts": ...,
+ "contracts": ...,
+ },
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|blocks|[参考](#query-blocks-result)|
+|txs|[参考](#query-txs-result)|
+|users|[参考](#query-users-result)|
+|accounts|[参考](#query-accounts-result)|
+|contracts|[参考](#query-contracts-result)|
+
+## 8 合约
+
+### 8.1 获取合约列表
+
+```http
+GET /ledgers/{ledger}/contracts?fromIndex={start_index}&count={count}
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串
+|query|start_index|否|查询合约的起始序号,默认为0|数字|
+|query|count|否|查询返回合约的数量,默认最大返回值为100,小于0或大于100均返回最大可返回结果集|数字|
+
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/contracts?fromIndex=0&count=-1
+```
+
+#### 返回实例
+
+```json
+{
+ "data": [{
+ "address": {
+ "value": "5Sm4gWXrNpDWW9Boi4xZCzZMHboRvEDm29Fa"
+ },
+ "rootHash": {
+ "value": "6GiAH2PBRLnoE724ia83bKVijkKsNuNU5danA4AAi5qMM"
+ },
+ "pubKey": {
+ "value": "mavweXqvKGUAJzSxE9S15pV7c7qe9bgUn5R1HwpqmXVTUs"
+ }
+ }],
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|address.value|账户地址|
+|pubKey.value|账户公钥|
+|rootHash.value|默克尔树根哈希|
+
+
+### 8.2 获取合约详细信息
+
+```http
+GET /ledgers/{ledger}/contracts/address/{address}
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串
+|path|address|是|合约地址|字符串
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/contracts/address/5Sm4gWXrNpDWW9Boi4xZCzZMHboRvEDm29Fa
+```
+
+#### 返回实例
+
+```json
+{
+ "data": {
+ "address": {
+ "value": "5Sm4gWXrNpDWW9Boi4xZCzZMHboRvEDm29Fa"
+ },
+ "rootHash": {
+ "value": "6GiAH2PBRLnoE724ia83bKVijkKsNuNU5danA4AAi5qMM"
+ },
+ "pubKey": {
+ "value": "mavweXqvKGUAJzSxE9S15pV7c7qe9bgUn5R1HwpqmXVTUs"
+ }
+ },
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|address.value|账户地址|
+|pubKey.value|账户公钥|
+|rootHash.value|默克尔树根哈希|
+
+### 8.3 获取合约总数
+
+```http
+GET /ledgers/{ledger}/contracts/count
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型
+|---|---|---|---|---|
+|path|ledger|是|账本哈希|字符串
+
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/contracts/count
+```
+
+#### 返回实例
+
+```json
+{
+ "data": 27,
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|data|合约数量|
+
+
+### 8.4 查询指定合约数量
+
+```http
+GET /ledgers/{ledger}/contracts/count/search?keyword={keyword}
+```
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型|
+|---|---|---|---|---|
+|**path**|**ledger**|是|所要搜索的账本范围,需要完整的账本哈希|string|
+|**query**|**keyword**|是| 合约的公钥或者地址的全部或者一部分|string|
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/contracts/count/search?keyword=5Sm2
+```
+
+#### 返回实例
+
+```json
+{
+ "data": 2,
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|data|合约数量|
+
+### 8.5 合约查询
+
+```http
+ GET /ledgers/{ledger}/contracts/search?keyword={keyword}&fromIndex={start_index}&count={count}
+```
+
+#### 说明
+
+合约有公钥和地址两个属性,可以通过合约的这两个属性查询特定合约,也可以返回一个当前所有合约的列表
+
+#### 参数
+
+|请求类型|名称|是否必需|说明|数据类型|
+|---|---|---|---|---|
+|**path**|**ledger**|是|所要搜索的账本范围,需要完整的账本哈希|string|
+|**query**|**keyword**|是| 合约的公钥或者地址的全部或者一部分|string|
+|**query**|**start_index**|否|查询合约的起始序号,默认为0|数字|
+|**query**|**count**|否|查询返回合约的数量,默认最大返回值为100,小于0或大于100均返回最大可返回结果集|数字|
+
+
+#### 请求实例
+```http
+http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/contracts/earch?keyword=5Sm2&fromIndex=0&count=-1
+```
+
+
+#### 返回
+
+```json
+{
+ "data": {
+ "contracts": [
+ {
+ "address": {
+ "value": "5Sm4gWXrNpDWW9Boi4xZCzZMHboRvEDm29Fa"
+ },
+ "rootHash": {
+ "value": "6GiAH2PBRLnoE724ia83bKVijkKsNuNU5danA4AAi5qMM"
+ },
+ "pubKey": {
+ "value": "mavweXqvKGUAJzSxE9S15pV7c7qe9bgUn5R1HwpqmXVTUs"
+ }
+ }
+ ]
+ },
+ "success": true
+}
+```
+
+说明
+
+|名称|说明|
+|---|---|
+|address.value|合约地址|
+|pubKey.value|合约公钥|
+|rootHash|合约根Hash|
diff --git a/source/deployment/deployment-peer/src/main/resources/config/init/ledger.init b/source/deployment/deployment-peer/src/main/resources/config/init/ledger.init
index 057e9966..e9895ce2 100644
--- a/source/deployment/deployment-peer/src/main/resources/config/init/ledger.init
+++ b/source/deployment/deployment-peer/src/main/resources/config/init/ledger.init
@@ -10,7 +10,7 @@ created-time=2019-08-01 14:26:58.069+0800
#共识服务提供者;必须;
consensus.service-provider=com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider
-#共识服务的参数配置;必须;
+#共识服务的参数配置;推荐使用绝对路径;必须;
consensus.conf=classpath:bftsmart.config
#密码服务提供者列表,以英文逗点“,”分隔;必须;
diff --git a/source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitProperties.java b/source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitProperties.java
index 5a6ed045..fa29ba71 100644
--- a/source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitProperties.java
+++ b/source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitProperties.java
@@ -141,7 +141,8 @@ public class LedgerInitProperties {
public static LedgerInitProperties resolve(String initSettingFile) {
Properties props = FileUtils.readProperties(initSettingFile, "UTF-8");
- return resolve(props);
+ File realFile = new File(initSettingFile);
+ return resolve(realFile.getParentFile().getPath(), props);
}
public static LedgerInitProperties resolve(InputStream in) {
@@ -150,6 +151,10 @@ public class LedgerInitProperties {
}
public static LedgerInitProperties resolve(Properties props) {
+ return resolve(null, props);
+ }
+
+ public static LedgerInitProperties resolve(String dir, Properties props) {
String hexLedgerSeed = PropertiesUtils.getRequiredProperty(props, LEDGER_SEED).replace("-", "");
byte[] ledgerSeed = HexUtils.decode(hexLedgerSeed);
LedgerInitProperties initProps = new LedgerInitProperties(ledgerSeed);
@@ -166,7 +171,7 @@ public class LedgerInitProperties {
initProps.consensusProvider = PropertiesUtils.getRequiredProperty(props, CONSENSUS_SERVICE_PROVIDER);
String consensusConfigFilePath = PropertiesUtils.getRequiredProperty(props, CONSENSUS_CONFIG);
try {
- File consensusConfigFile = ResourceUtils.getFile(consensusConfigFilePath);
+ File consensusConfigFile = FileUtils.getFile(dir, consensusConfigFilePath);
initProps.consensusConfig = FileUtils.readProperties(consensusConfigFile);
} catch (FileNotFoundException e) {
throw new IllegalArgumentException(
diff --git a/source/utils/utils-common/src/main/java/com/jd/blockchain/utils/io/FileUtils.java b/source/utils/utils-common/src/main/java/com/jd/blockchain/utils/io/FileUtils.java
index 0d4d86e1..17ed444f 100644
--- a/source/utils/utils-common/src/main/java/com/jd/blockchain/utils/io/FileUtils.java
+++ b/source/utils/utils-common/src/main/java/com/jd/blockchain/utils/io/FileUtils.java
@@ -16,6 +16,7 @@ import java.io.Reader;
import java.util.ArrayList;
import java.util.Properties;
+import com.jd.blockchain.utils.PathUtils;
import org.springframework.util.ResourceUtils;
/**
@@ -482,4 +483,26 @@ public class FileUtils {
}
return path.delete();
}
+
+ /**
+ * 获取指定路径和位置的文件信息
+ *
+ * @param dir
+ * 指定路径,不要以"/"结尾
+ * @param resourceLocation
+ * 文件位置信息,可支持绝对路径、相对路径(相对dir)、classpath:前缀
+ * @return
+ *
+ * @throws FileNotFoundException
+ */
+ public static File getFile(String dir, String resourceLocation) throws FileNotFoundException {
+ if (resourceLocation.startsWith(ResourceUtils.CLASSPATH_URL_PREFIX)) {
+ return ResourceUtils.getFile(resourceLocation);
+ }
+ if (resourceLocation.startsWith(PathUtils.PATH_SEPERATOR)) {
+ return new File(resourceLocation);
+ }
+ String totalPath = PathUtils.concatPaths(dir, resourceLocation);
+ return new File(totalPath);
+ }
}