diff --git a/docs/api.md b/docs/api.md deleted file mode 100644 index 2c6822fe..00000000 --- a/docs/api.md +++ /dev/null @@ -1,2924 +0,0 @@ -# 网关API - -[账本](#2-账本) -- [获取账本总数](#21-获取账本总数) -- [获取账本列表](#22-获取账本列表) -- [获取账本详细信息](#23-获取账本详细信息) -- [获取账本参与方总数](#24-获取账本参与方总数) -- [获取账本参与方列表](#25-获取账本参与方列表) -- [获取账本元数据信息](#26-获取账本元数据信息) -- [获取账本初始化配置信息](#27-获取账本初始化配置信息) -- [获取账本管理数据信息](#28-获取账本管理数据信息) - -[区块](#3-区块) -- [获取最新区块](#31-获取最新区块) -- [根据区块哈希获取区块详细信息](#32-根据区块哈希获取区块详细信息) -- [根据区块高度获取区块详细信息](#33-根据区块高度获取区块详细信息) - -[交易](#4-交易) -- [获取账本交易总数](#41-获取账本交易总数) -- [根据区块高度查询交易数量](#42-根据区块高度查询交易数量) -- [根据区块哈希查询交易数量](#43-根据区块哈希查询交易数量) -- [根据区块高度查询区块内的交易数量](#44-根据区块高度查询区块内的交易数量) -- [根据区块哈希查询区块内的交易数量](#45-根据区块哈希查询区块内的交易数量) -- [获取指定区块高度的交易列表](#46-获取指定区块高度的交易列表) -- [获取指定哈希的区块的交易列表](#47-获取指定哈希的区块的交易列表) -- [获取交易详细信息](#48-获取交易详细信息) - -[用户](#5-用户) -- [获取用户总数](#51-获取用户总数) -- [获取用户列表](#52-获取用户列表) -- [获取用户详细信息](#53-获取用户详细信息) -- [获取指定高度的区块的用户总数](#54-获取指定高度的区块的用户总数) -- [获取指定哈希的区块的用户总数](#55-获取指定哈希的区块的用户总数) -- [根据区块高度查询区块内的用户数量](#56-根据区块高度查询区块内的用户数量) -- [根据区块哈希查询区块内的用户数量](#57-根据区块哈希查询区块内的用户数量) -- [查询最新区块新增用户数量](#58-查询最新区块新增用户数量) - -[角色权限](#6-角色权限) -- [根据角色获取权限信息](#61-根据角色获取权限信息) -- [根据用户获取权限信息](#62-根据用户获取权限信息) - -[数据账户](#7-数据账户) -- [获取账户列表](#71-获取账户列表) -- [获取账户详细信息](#72-获取账户详细信息) -- [获取账户总数](#73-获取账户总数) -- [获取指定高度的区块的数据账户总数](#74-获取指定高度的区块的数据账户总数) -- [获取指定哈希的区块的数据账户总数](#75-获取指定哈希的区块的数据账户总数) -- [根据区块高度查询区块内的数据账户数量](#76-根据区块高度查询区块内的数据账户数量) -- [根据区块哈希查询区块内的数据账户数量](#77-根据区块哈希查询区块内的数据账户数量) -- [获取某数据账户KV总数](#78-获取某数据账户KV总数) -- [获取某数据账户KV详情](#79-获取某数据账户KV详情) -- [获取某数据账户KV详情](#710-获取某数据账户KV详情) -- [获取某数据账户KV整个历史详情](#711-获取某数据账户KV整个历史详情) - -[合约](#8-合约) -- [获取合约总数](#81-获取合约总数) -- [获取指定区块高度的合约总数](#82-获取指定区块高度的合约总数) -- [获取指定区块哈希的合约总数](#83-获取指定区块哈希的合约总数) -- [根据区块高度查询区块内的合约总数](#84-根据区块高度查询区块内的合约总数) -- [根据区块哈希查询区块内的合约总数](#85-根据区块哈希查询区块内的合约总数) -- [获取合约列表](#86-获取合约列表) -- [获取合约详细信息](#87-获取合约详细信息) - -[事件](#9-用户自定义事件) - -- [获取事件账户列表](#91-获取事件账户列表) -- [获取事件账户](#92-获取事件账户) -- [获取事件账户总数](#93-获取事件账户总数) -- [获取事件名数量](#94-获取事件名数量) -- [获取事件名列表](#95-获取事件名列表) -- [获取最新事件](#96-获取最新事件) -- [获取事件数量](#97-获取事件数量) -- [获取事件列表](#98-获取事件列表) - -## 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 -} - -[comment]: <> (```) - -说明 - - - success 值为 false 表明api调用成功 - - errorCode 为异常代码 - - errorMessage 为错误提示 - -## 2 账本 - -### 2.1 获取账本总数 - -​```http -GET /ledgers/count -``` - -#### 参数 -无 - - -#### 请求实例 -```http -http://localhost:8080/ledgers/count -``` - -#### 返回实例 - -```json -{ - "data": 2, - "success": true -} -``` - -说明 - -|名称|说明| -|---|---| -|data|账本总数| - - -### 2.2 获取账本列表 - -```http -GET /ledgers -``` - -#### 参数 -无 - - -#### 请求实例 -```http -http://localhost:8080/ledgers -``` - -#### 返回实例 - -```json -{ - "data" : [ - "j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp" - ], - "success" : true -} -``` - -说明 - -|名称|说明| -|---|---| -|data|账本哈希列表| - -### 2.3 获取账本详细信息 - -```http -GET /ledgers/{ledger} -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型 | -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串 | - - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp -``` - -#### 返回实例 - -```json -{ - "success" : true, - "data" : { - "hash" : "j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp", - "latestBlockHeight" : 0, - "latestBlockHash" : "j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp" - } -} -``` - -说明 - -|名称|说明| -|---|---| -|data|账本信息| -|hash|账本哈希| -|latestBlockHash | 最新区块哈希 | -|latestBlockHeight| 最新账本高度 | - - -### 2.4 获取账本参与方总数 - -```http -GET /ledgers/{ledger}/participants/count -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型 | -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串 | - - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/participants/count -``` - -#### 返回实例 - -```json -{ - "data": 4, - "success": true -} -``` - -说明 - -|名称|说明| -|---|---| -|data|账本参与方总数| - - -### 2.5 获取账本参与方列表 - -```http -GET /ledgers/{ledger}/participants -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型 | -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串 | - - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/participants -``` - -#### 返回实例 - -```json -{ - "data" : [ - { - "pubKey" : "7VeRFF1ednwhrFoe5cngKwPUJ2N4iFKD9Jt53GxSCc1MmPQ6", - "participantNodeState" : "CONSENSUS", - "id" : 2, - "address" : { - "value" : "LdeNwsiuo7n6HULWhNKc87PBXJXAfGKFon9RE" - }, - "name" : "2" - }, - { - "participantNodeState" : "CONSENSUS", - "pubKey" : "7VeREmuT4fF9yRPEMbSSaNLKbLa3qoTpfGHRgwpnSWUn5tqW", - "id" : 1, - "name" : "1", - "address" : { - "value" : "LdeNiXZbsBCsTc2ZGp1PGBX81aUxPekhwEwmY" - } - }, - { - "pubKey" : "7VeRJpb2XX8XKAaC7G5zQg9DbgKM8gmLhUBtGFmerFbhJTZn", - "participantNodeState" : "CONSENSUS", - "address" : { - "value" : "LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw" - }, - "name" : "0", - "id" : 0 - }, - { - "id" : 3, - "address" : { - "value" : "LdeP2ji8PR1DPsLt5NoFeiBnhpckrLHgCJge6" - }, - "name" : "3", - "pubKey" : "7VeRGE4V9MR7HgAqTrkxGvJvaaKRZ3fAjHUjYzpNBGcjfAvr", - "participantNodeState" : "CONSENSUS" - } - ], - "success" : true -} -``` - -说明 - -|名称|说明| -|---|---| -|id|参与方唯一标识| -|name|参与方名称| -|address.value|参与方地址| -|pubKey|参与方公钥| -|participantNodeState|参与方状态| - -`ParticipantNodeState` 参与方状态: - -- `READY` 就绪,在此状态下,参与方的账户可以作为网关节点接入终端的交易请求 -- `CONSENSUS` 共识,在此状态下,参与方的账户可以作为共识节点参与共识,也可以作为网关节点接入终端的交易请求 -- `DEACTIVATED` 停用,在此状态下,参与方的账户既不能作为共识节点参与共识,也不能作为网关节点接入终端的交易请求 - -### 2.6 获取账本元数据信息 - -```http -GET /ledgers/{ledger}/metadata -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型 | -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串 | - - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/metadata -``` - -#### 返回实例 - -```json -{ - "success" : true, - "data" : { - "participantsHash" : "j5qzkZgpGMczBDNKXRGJdyPTndkxPvB7Gdrfiqy6LvG7P5", - "userRolesHash" : "j5rggjQQtcjMTSwxFyDedcxPSxVVfjAB3khJDvgdiGFhiB", - "seed" : "NiSpjQVYRMMEA+1bnyU2eA==", - "settingsHash" : "j5iNkXJptLJrJcFL1YJpuvbJCh6H3iioBNJG7QKPESUUif", - "rolePrivilegesHash" : "j5hBCfTVv77mTyM5WHoGnw1cezgzB3QDqojqjhg5qmuECn", - "ledgerStructureVersion" : 0 - } -} -``` - -说明 - -|名称|说明| -|---|---| -|seed|账本生成种子| -|participantsHash|成员数据集哈希| -|userRolesHash|用户角色集哈希| -|settingsHash|配置数据集哈希| -|rolePrivilegesHash|角色权限数据集哈希| -|ledgerStructureVersion|账本结构版本| - - -### 2.7 获取账本初始化配置信息 - -```http -GET /ledgers/{ledger}/settings -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| - - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/settings -``` - -#### 返回实例 - -```json -{ - "data": { - "ledgerStructureVersion": 0, - "participantsHash": "j5qzkZgpGMczBDNKXRGJdyPTndkxPvB7Gdrfiqy6LvG7P5", - "seed": "3624a98d-055844c3-0403ed5b-9f253678", - "consensusProtocol": "com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider", - "consensusSettings": { - "systemConfigs": [ - { - "name": "system.bft", - "value": "true" - }, - { - "value": "true", - "name": "system.communication.defaultkeys" - }, - { - "value": "500000", - "name": "system.communication.inQueueSize" - }, - { - "value": "500000", - "name": "system.communication.outQueueSize" - }, - { - "name": "system.communication.send.retryCount", - "value": "100" - }, - { - "name": "system.communication.send.retryInterval", - "value": "2000" - }, - { - "name": "system.communication.useMACs", - "value": "1" - }, - { - "name": "system.communication.useSenderThread", - "value": "true" - }, - { - "value": "0", - "name": "system.communication.useSignatures" - }, - { - "value": "0", - "name": "system.debug" - }, - { - "value": "0,1,2,3", - "name": "system.initial.view" - }, - { - "name": "system.servers.f", - "value": "1" - }, - { - "value": "4", - "name": "system.servers.num" - }, - { - "value": "true", - "name": "system.shutdownhook" - }, - { - "name": "system.totalordermulticast.checkpoint_period", - "value": "1000" - }, - { - "name": "system.totalordermulticast.checkpoint_to_disk", - "value": "false" - }, - { - "value": "120000", - "name": "system.totalordermulticast.global_checkpoint_period" - }, - { - "name": "system.totalordermulticast.highMark", - "value": "10000" - }, - { - "name": "system.totalordermulticast.log", - "value": "true" - }, - { - "value": "false", - "name": "system.totalordermulticast.log_parallel" - }, - { - "name": "system.totalordermulticast.log_to_disk", - "value": "true" - }, - { - "name": "system.totalordermulticast.maxbatchsize", - "value": "2000" - }, - { - "value": "10", - "name": "system.totalordermulticast.nonces" - }, - { - "value": "10", - "name": "system.totalordermulticast.revival_highMark" - }, - { - "name": "system.totalordermulticast.state_transfer", - "value": "true" - }, - { - "name": "system.totalordermulticast.sync_ckp", - "value": "false" - }, - { - "value": "false", - "name": "system.totalordermulticast.sync_log" - }, - { - "value": "3000000", - "name": "system.totalordermulticast.timeTolerance" - }, - { - "name": "system.totalordermulticast.timeout", - "value": "60000" - }, - { - "name": "system.totalordermulticast.timeout_highMark", - "value": "200" - }, - { - "value": "false", - "name": "system.totalordermulticast.verifyTimestamps" - }, - { - "name": "system.ttp.id", - "value": "2001" - } - ], - "viewId": 0, - "nodes": [ - { - "id": 0, - "networkAddress": { - "host": "127.0.0.1", - "port": 10080, - "secure": false - }, - "pubKey": "7VeRJpb2XX8XKAaC7G5zQg9DbgKM8gmLhUBtGFmerFbhJTZn", - "address": "LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw" - }, - { - "pubKey": "7VeREmuT4fF9yRPEMbSSaNLKbLa3qoTpfGHRgwpnSWUn5tqW", - "address": "LdeNiXZbsBCsTc2ZGp1PGBX81aUxPekhwEwmY", - "id": 1, - "networkAddress": { - "host": "127.0.0.1", - "port": 10082, - "secure": false - } - }, - { - "id": 2, - "networkAddress": { - "host": "127.0.0.1", - "port": 10084, - "secure": false - }, - "address": "LdeNwsiuo7n6HULWhNKc87PBXJXAfGKFon9RE", - "pubKey": "7VeRFF1ednwhrFoe5cngKwPUJ2N4iFKD9Jt53GxSCc1MmPQ6" - }, - { - "networkAddress": { - "host": "127.0.0.1", - "port": 10086, - "secure": false - }, - "id": 3, - "pubKey": "7VeRGE4V9MR7HgAqTrkxGvJvaaKRZ3fAjHUjYzpNBGcjfAvr", - "address": "LdeP2ji8PR1DPsLt5NoFeiBnhpckrLHgCJge6" - } - ] - }, - "cryptoSetting": { - "supportedProviders": [ - { - "algorithms": [ - { - "name": "AES", - "code": -32230 - }, - { - "name": "ED25519", - "code": 16661 - }, - { - "code": 16662, - "name": "ECDSA" - }, - { - "name": "RSA", - "code": -16105 - }, - { - "name": "RIPEMD160", - "code": 8217 - }, - { - "name": "SHA256", - "code": 8216 - }, - { - "name": "JVM-SECURE-RANDOM", - "code": 4123 - } - ], - "name": "com.jd.blockchain.crypto.service.classic.ClassicCryptoService" - }, - { - "name": "com.jd.blockchain.crypto.service.sm.SMCryptoService", - "algorithms": [ - { - "code": -16126, - "name": "SM2" - }, - { - "name": "SM3", - "code": 8195 - }, - { - "name": "SM4", - "code": -32252 - } - ] - } - ], - "hashAlgorithm": 8216, - "autoVerifyHash": false - }, - "participantNodes": [ - { - "participantNodeState": "CONSENSUS", - "pubKey": "7VeRFF1ednwhrFoe5cngKwPUJ2N4iFKD9Jt53GxSCc1MmPQ6", - "address": { - "value": "LdeNwsiuo7n6HULWhNKc87PBXJXAfGKFon9RE" - }, - "name": "2", - "id": 2 - }, - { - "id": 1, - "participantNodeState": "CONSENSUS", - "pubKey": "7VeREmuT4fF9yRPEMbSSaNLKbLa3qoTpfGHRgwpnSWUn5tqW", - "address": { - "value": "LdeNiXZbsBCsTc2ZGp1PGBX81aUxPekhwEwmY" - }, - "name": "1" - }, - { - "id": 0, - "address": { - "value": "LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw" - }, - "name": "0", - "participantNodeState": "CONSENSUS", - "pubKey": "7VeRJpb2XX8XKAaC7G5zQg9DbgKM8gmLhUBtGFmerFbhJTZn" - }, - { - "id": 3, - "participantNodeState": "CONSENSUS", - "pubKey": "7VeRGE4V9MR7HgAqTrkxGvJvaaKRZ3fAjHUjYzpNBGcjfAvr", - "address": { - "value": "LdeP2ji8PR1DPsLt5NoFeiBnhpckrLHgCJge6" - }, - "name": "3" - } - ] - }, - "success": true -} -``` - -说明 - -|名称|说明| -|---|---| -|ledgerStructureVersion|账本种子信息| -|participantsHash|参与方数据集哈希| -|seed|账本种子信息| -|consensusProtocol|共识协议,以字符串方式显示| -|consensusSettings|共识配置| -|cryptoSetting|加密算法配置| -|participantNodes|参与方节点信息| - -### 2.8 获取账本管理数据信息 - -```http -GET /ledgers/{ledger}/admininfo -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型 | -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串 | - - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/admininfo -``` - -#### 返回实例 - -```json -{ - "data" : { - "participants" : [ - { - "id" : 2, - "pubKey" : "7VeRFF1ednwhrFoe5cngKwPUJ2N4iFKD9Jt53GxSCc1MmPQ6", - "name" : "2", - "participantNodeState" : "CONSENSUS", - "address" : { - "value" : "LdeNwsiuo7n6HULWhNKc87PBXJXAfGKFon9RE" - } - }, - { - "name" : "1", - "pubKey" : "7VeREmuT4fF9yRPEMbSSaNLKbLa3qoTpfGHRgwpnSWUn5tqW", - "id" : 1, - "participantNodeState" : "CONSENSUS", - "address" : { - "value" : "LdeNiXZbsBCsTc2ZGp1PGBX81aUxPekhwEwmY" - } - }, - { - "id" : 0, - "name" : "0", - "pubKey" : "7VeRJpb2XX8XKAaC7G5zQg9DbgKM8gmLhUBtGFmerFbhJTZn", - "address" : { - "value" : "LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw" - }, - "participantNodeState" : "CONSENSUS" - }, - { - "participantNodeState" : "CONSENSUS", - "address" : { - "value" : "LdeP2ji8PR1DPsLt5NoFeiBnhpckrLHgCJge6" - }, - "name" : "3", - "pubKey" : "7VeRGE4V9MR7HgAqTrkxGvJvaaKRZ3fAjHUjYzpNBGcjfAvr", - "id" : 3 - } - ], - "participantCount" : 4, - "metadata" : { - "ledgerStructureVersion" : 0, - "seed" : "NiSpjQVYRMMEA+1bnyU2eA==", - "userRolesHash" : "j5rggjQQtcjMTSwxFyDedcxPSxVVfjAB3khJDvgdiGFhiB", - "settingsHash" : "j5iNkXJptLJrJcFL1YJpuvbJCh6H3iioBNJG7QKPESUUif", - "participantsHash" : "j5qzkZgpGMczBDNKXRGJdyPTndkxPvB7Gdrfiqy6LvG7P5", - "rolePrivilegesHash" : "j5hBCfTVv77mTyM5WHoGnw1cezgzB3QDqojqjhg5qmuECn" - }, - "settings" : { - "cryptoSetting" : { - "supportedProviders" : [ - { - "algorithms" : [ - { - "name" : "AES", - "code" : -32230 - }, - { - "name" : "ED25519", - "code" : 16661 - }, - { - "code" : 16662, - "name" : "ECDSA" - }, - { - "name" : "RSA", - "code" : -16105 - }, - { - "name" : "RIPEMD160", - "code" : 8217 - }, - { - "name" : "SHA256", - "code" : 8216 - }, - { - "name" : "JVM-SECURE-RANDOM", - "code" : 4123 - } - ], - "name" : "com.jd.blockchain.crypto.service.classic.ClassicCryptoService" - }, - { - "name" : "com.jd.blockchain.crypto.service.sm.SMCryptoService", - "algorithms" : [ - { - "code" : -16126, - "name" : "SM2" - }, - { - "name" : "SM3", - "code" : 8195 - }, - { - "name" : "SM4", - "code" : -32252 - } - ] - } - ], - "hashAlgorithm" : 8216, - "autoVerifyHash" : false - }, - "consensusProvider" : "com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider", - "consensusSetting" : { - "value" : "11u5FERE3JChMzbiFcGwjdyyegB6Dq6Nn3s1zB7U9AFs9xaphxosYGwQ2NAAXi2fM2NKf1WKpuvaWz51gsfWRSm7SJiAX9B26hxwmjwtSuGwcSJTZkDcScAFV5Pvv4pnbeZwvzcygEE4PGRYw835PN65eaaFX9114UjmaKeGBexzKwGYDAfc5hGPtpqmeuNurc6yHycRnRV1NNq9ZMUSiSpquiJgh1a8XtaYW9nakSH6jJKYSsX8axhYjMpta8CdBwkMZPZDCMcDojwzdzDQyaovTarACtxUWCdYz88U986k8SB3y5Z3PvU9QpSufCZEMPgLEGThi4PNhCSmdmcCJPEGvrfqfTTXMPDvPxLBZLKkpLHpXvmDiLot2pTCkPRicLhF7bnACW5CbNBkB73TRvdnAgFYBqKqQHuMxoTFyrABGdtWT5niFp8DXsTvv2sKSMxFZWgdDt2x5ax1xVCogzJTgxAQrd2ykDd32dkCdzKQJ6RpA3cJABguKXs6txXoeY2VPCg19mZCezNUW1SvhMVw7Dy1a8HHT2xMZ77MwHTXXfn2bEKNJCAv1PRM1re2Upnqo55am8ssoeAvABMCogKQAM56YsekyuusoYierZmi7pD7o4oNQaPGbzgHs2R9XDjLr2esNvDiJbVkr725PUw5Zgs9nqKg2vo11Z42eyXQxzw3Czg4FNts5xm7BeMwJXkT337cZHT2mJkUp58SUxmEB2TcGnzHXvz7qqdJ5NZRQaY87KgrEzo2xTwm8VW9AegiUNgExo5xxJXsGM1p24NCxgodjGnqx6FhB6JDjubDiU2oC7HAnqhwUF6AKgAQpdhGhvs2ts4dxYu8vEoZ5eyQaM2NXfUbm5jTAUvCaafd4oXZDXik4Jv79oUGtncVg52oj3MKZ4nqicMwoAz7esxDX9BWwyR1fEbU7vGPn9FPh87kdqh5koMF2BLhqnd5puobFsL38wtpmwA62DNtuekvTcTFjE97QMqpRKwzos2Kjnah6k6CyJ9DXkaUT7KE1fjWxuTv9794J93wVzheKjEy5nRqhWKHpj1AEPmrfPB9kS1TRUWGEN5aRSjWUgzydcpXutrPfm4wg3Xhgme5fURvE9Pm8F7pTdKaWS6dXDDm5bqWbQ38mMnmkvta54RL563bRPLS3fqmaRyshjN8V5nfec7LF4Fxj1PJhJ5XWR8tmHSD3Yd311BjZ8HaqtaCb74uvjGzjd6M1bh1KU8r96wMcY31Ldc2551iXU7hx2tmBKCAnJekvfQKRv7NvUphfSLJ5AqhAiibFbuQupkz9RgbcpD4Agm6Vv36CiiTDR9PNneP7xjYifuzSUL5hhJwoEpc9Zr6cdhbkAn7sePDkPMo1WCvvJPV9gR4MufSjCN1uxGTXF2fQCmucZemBJ7gTXc5uuATYyip1DRq4m8zpWQ9sz1wyMbqHVSnFKbcApDYhcxPmuF4FTm36gYbCU3q4TuMQvXUoz4Zfjc5y4kaR7im8ocuPFBCXbYgpUjeta52LTJbw2xtNG7EPdjGPXcvqNj4yQSrdGirGJc7dXoUhsJSki1j2dm2T3hdWXsu5oLmxfadoqQXqazhrd7bQJBViEYri51vkMkf8BJCJF8y8wEdZsDcusYYqSZn1mYToHKjAbu4oxGLnp7AM6TSpMjqdsxNBTCgD4u9Q2GvFKEW5S3W5fQvkPhEYSS5Q12K7oHTi2Cs22oQRADXw5FxRedzvSfuQdeA3RN8XgbSHr72mQXzso6SvLQda4Xnfz9M2hSsxg8QRsQm4dBsZ5aSGnZw45dHKHBNRv2RxmHntFbcc1JwCPhbbBxwE8zWp28pEdF1K1qRSRbNMorXvvNBQZPvjoztLc15u2KcQK3Xczvdmc5naBpqoPWmUxcntsX9STCz5ep7sjf5KAkLxq2XQjruC2mbbVNVvZ6o4vnpQxGDVegMigATbSrNWipCp6mqJA7RDdKomdb21apSANr8V3s2nCjDrqMSjgwSxnUMAfS1BuDuhBF8pJB5YnmWJ2WTFCJKndU5D1UnZPawPmtxpG9m2jxKka1DRBJrWGN4UNYZHmqwpy6pAGiFAjg1Yak5cwsPAyHvaP6AFjVqpZbphccWmch1rKhah2BKhC3Jt2WoCmdYKJB6yNJHXgyNmaesUqYTKuq6yJk12QqQGAsHw9H3PYYTARaEHt1qPo76LB8vzUmcUV9dov6Q1Laa2XvUTkdor5XNycVW5Y4SpiqHwGDAY2ujHnte5E241FEYVXfyJBgMLZwnBXFtZm38WENifVQEk1nDsfoRCMZWyg4KyPUNSCvnqq7BtjrDfGQm4X5pMoHm1MuKeL4bJP" - } - } - }, - "success" : true -} -``` - -说明 - -|名称|说明| -|---|---| -|participants|参与方列表| -|participantCount|参与方数量| -|metadata|元数据| -|settings|配置信息| -|consensusProvider|共识协议| -|consensusSetting|共识配置| - - -## 3 区块 - -### 3.1 获取最新区块 - -```http -GET /ledgers/{ledger}/blocks/latest -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型 | -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串 | - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/blocks/latest -``` - -#### 返回实例 - -```json -{ - "data" : { - "timestamp" : 1615261725429, - "transactionSetHash" : "j5ssSG7LQC2CgU7fLbMCs2m2JtwN26j5kj2buE2u8F9miP", - "userAccountSetHash" : "j5hzkPPBJAqKs4rLWbEiFhbh1VW6Jc2xk878X5A6JywPnC", - "previousHash" : "j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp", - "hash" : "j5irFH5SJBaCSa6R3QYhbWYMUA2Wos3gvXYUyDYAHVhG23", - "adminAccountHash" : "j5maavFZShDorv36Sj5W8ijm1wkm2z9GtfdiVvUcfzvwv8", - "height" : 1, - "ledgerHash" : "j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp", - "dataAccountSetHash" : "j5poz1Ced486LxYbcotGvihT42CTiQym98Mg1By8DHZBxJ" - }, - "success" : true -} -``` - -说明 - -|名称|说明| -|---|---| -|hash|区块哈希| -|height|区块高度| -|timestamp|区块创建时间戳| -|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:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/blocks/hash/j5irFH5SJBaCSa6R3QYhbWYMUA2Wos3gvXYUyDYAHVhG23 -``` - -#### 返回实例 - -同 [3.1](3.1-获取最新区块) - - -### 3.3 根据区块高度获取区块详细信息 - -```http -GET /ledgers/{ledger}/blocks/height/{block_height} -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|path|block_height|是|区块高度|数字| - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/blocks/height/1 -``` - -#### 返回实例 - -同 [3.1](3.1-获取最新区块) - -## 4 交易 - -### 4.1 获取账本交易总数 - -```http -GET /ledgers/{ledger}/txs/count -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/txs/count -``` - -##### 返回实例 - -```json -{ - "data": 2, - "success": true -} -``` - -说明 - -|名称|说明| -|---|---| -|data|交易数量| - -### 4.2 根据区块高度查询交易数量 - -**包含当前区块以及之前区块数据** - -```http -GET /ledgers/{ledgerHash}/blocks/height/{block_height}/txs/count -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|path|block_height|是|区块高度|数字| - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/blocks/height/66/txs/count -``` - -#### 返回实例 - -```json -{ - "data": 1, - "success": true -} -``` - -说明 - -|名称|说明| -|---|---| -|data|交易数量| - -### 4.3 根据区块哈希查询交易数量 - -**包含当前区块以及之前区块数据** - -```http -GET /ledgers/{ledger}/blocks/hash/{block_hash}/txs/count -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|path|block_hash|是|区块哈希|字符串| - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/blocks/hash/j5irFH5SJBaCSa6R3QYhbWYMUA2Wos3gvXYUyDYAHVhG23/txs/additional-count -``` - -#### 返回实例 - -```json -{ - "data": 1, - "success": true -} -``` - -说明 - -|名称|说明| -|---|---| -|data|交易数量| - -### 4.4 根据区块高度查询区块内的交易数量 - -**仅包含当前区块数据** - -```http -GET /ledgers/{ledger}/blocks/height/{block_height}/txs/additional-count -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|path|block_height|是|区块高度|数字| - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/blocks/height/66/txs/additional-count -``` - -#### 返回实例 - -```json -{ - "data": 1, - "success": true -} -``` - -说明 - -|名称|说明| -|---|---| -|data|交易数量| - -### 4.5 根据区块哈希查询区块内的交易数量 - -**仅包含当前区块数据** - -```http -GET /ledgers/{ledger}/blocks/hash/{block_hash}/txs/additional-count -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|path|block_hash|是|区块哈希|字符串| - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/blocks/hash/j5irFH5SJBaCSa6R3QYhbWYMUA2Wos3gvXYUyDYAHVhG23/txs/additional-count -``` - -#### 返回实例 - -```json -{ - "data": 1, - "success": true -} -``` - -说明 - -|名称|说明| -|---|---| -|data|交易数量| - -### 4.6 获取指定区块高度的交易列表 - -**包含当前区块以及之前区块数据** - -```http -GET /ledgers/{ledger}/blocks/height/{height}/txs?fromIndex={fromIndex}&count={count} -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|path|height|是|区块高度|数字| -|query|fromIndex|否|查询交易的起始序号,默认为0|数字| -|query|count|否|查询返回交易的数量,默认最大返回值为100,小于0或大于100均返回最大可返回结果集|数字| - - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/blocks/height/66/txs?fromIndex=1&count=1 -``` - -#### 返回实例 - -```json -{ - "data" : [ - { - "request" : { - "transactionContent" : { - "timestamp" : 1615261725387, - "ledgerHash" : "j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp", - "operations" : [ - { - "@type" : "com.jd.blockchain.ledger.DataAccountRegisterOperation", - "accountID" : { - "pubKey" : "7VeRBZLMWAxcgL9DTjGWn9FHWny54bzDzrgeAH6pCFvEJ5eT", - "address" : { - "value" : "LdeNscE3MP9a1vgyVUg9LgxQx6yzkUEUS65Rn" - } - } - }, - { - "writeSet" : [ - { - "value" : { - "type" : "TEXT", - "bytes" : { - "value" : "EMeAB7i" - } - }, - "expectedVersion" : -1, - "key" : "key" - } - ], - "@type" : "com.jd.blockchain.ledger.DataAccountKVSetOperation", - "accountAddress" : { - "value" : "LdeNscE3MP9a1vgyVUg9LgxQx6yzkUEUS65Rn" - } - } - ] - }, - "nodeSignatures" : [ - { - "pubKey" : "7VeRJpb2XX8XKAaC7G5zQg9DbgKM8gmLhUBtGFmerFbhJTZn", - "digest" : "SMJHE64z77GSkBkC8Zw45r8zRhCq3KWgyGMxRo7KXZ1JWjnBBj1WkPGBdS3AUAX3UoWK5ymGxeqaskjTVgHxGtC768" - } - ], - "transactionHash" : "j5siSjjv7H6s61zsMajkGfyhASFnKpthveNDptCrM2gmui", - "endpointSignatures" : [ - { - "digest" : "SMJHE64z77GSkBkC8Zw45r8zRhCq3KWgyGMxRo7KXZ1JWjnBBj1WkPGBdS3AUAX3UoWK5ymGxeqaskjTVgHxGtC768", - "pubKey" : "7VeRJpb2XX8XKAaC7G5zQg9DbgKM8gmLhUBtGFmerFbhJTZn" - } - ] - }, - "result" : { - "executionState" : "SUCCESS", - "dataSnapshot" : { - "adminAccountHash" : "j5maavFZShDorv36Sj5W8ijm1wkm2z9GtfdiVvUcfzvwv8", - "userAccountSetHash" : "j5hzkPPBJAqKs4rLWbEiFhbh1VW6Jc2xk878X5A6JywPnC", - "dataAccountSetHash" : "j5poz1Ced486LxYbcotGvihT42CTiQym98Mg1By8DHZBxJ" - }, - "blockHeight" : 1, - "transactionHash" : "j5siSjjv7H6s61zsMajkGfyhASFnKpthveNDptCrM2gmui" - } - } - ], - "success" : true -} -``` - - -说明 - -|名称|说明| -|---|---| -|request|请求数据| -|request.transactionContent|交易内容| -|request.transactionContent.timestamp|交易时间戳,毫秒| -|request.transactionContent.ledgerHash|账本哈希| -|request.transactionContent.operations|操作列表| -|request.nodeSignatures|参与方签名列表| -|request.endpointSignatures|终端用户签名列表| -|request.transactionHash|交易哈希| -|result|交易结果| -|result.executionState|交易执行状态,SUCCESS(成功)| -|result.dataSnapshot|交易执行后数据快照| -|result.blockHeight|最新区块高度| -|result.transactionHash|交易哈希| - -### 4.7 获取指定哈希的区块的交易列表 - -```http -GET /ledgers/{ledger}/blocks/hash/{block_hash}/txs?fromIndex={fromIndex}&count={count} -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|path|block_hash|是|区块哈希|字符串| -|query|fromIndex|否|查询交易的起始序号,默认为0|数字| -|query|count|否|查询返回交易的数量,默认最大返回值为100,小于0或大于100均返回最大可返回结果集|数字| - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/blocks/hash/j5irFH5SJBaCSa6R3QYhbWYMUA2Wos3gvXYUyDYAHVhG23/txs?fromIndex=1&count=1 -``` - -#### 返回实例 - -[同 4.4](#4.4-获取指定区块高度的交易列表) - - -### 4.8 获取交易详细信息 - -```http -GET /ledgers/{ledger}/txs/hash/{tx_hash} -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|path|tx_hash|是|交易哈希|字符串| - - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/txs/hash/j5siSjjv7H6s61zsMajkGfyhASFnKpthveNDptCrM2gmui -``` - -#### 返回实例 - -```json -{ - "success" : true, - "data" : { - "result" : { - "dataSnapshot" : { - "dataAccountSetHash" : "j5poz1Ced486LxYbcotGvihT42CTiQym98Mg1By8DHZBxJ", - "userAccountSetHash" : "j5hzkPPBJAqKs4rLWbEiFhbh1VW6Jc2xk878X5A6JywPnC", - "adminAccountHash" : "j5maavFZShDorv36Sj5W8ijm1wkm2z9GtfdiVvUcfzvwv8" - }, - "transactionHash" : "j5siSjjv7H6s61zsMajkGfyhASFnKpthveNDptCrM2gmui", - "blockHeight" : 1, - "executionState" : "SUCCESS" - }, - "request" : { - "nodeSignatures" : [ - { - "pubKey" : "7VeRJpb2XX8XKAaC7G5zQg9DbgKM8gmLhUBtGFmerFbhJTZn", - "digest" : "SMJHE64z77GSkBkC8Zw45r8zRhCq3KWgyGMxRo7KXZ1JWjnBBj1WkPGBdS3AUAX3UoWK5ymGxeqaskjTVgHxGtC768" - } - ], - "endpointSignatures" : [ - { - "pubKey" : "7VeRJpb2XX8XKAaC7G5zQg9DbgKM8gmLhUBtGFmerFbhJTZn", - "digest" : "SMJHE64z77GSkBkC8Zw45r8zRhCq3KWgyGMxRo7KXZ1JWjnBBj1WkPGBdS3AUAX3UoWK5ymGxeqaskjTVgHxGtC768" - } - ], - "transactionHash" : "j5siSjjv7H6s61zsMajkGfyhASFnKpthveNDptCrM2gmui", - "transactionContent" : { - "timestamp" : 1615261725387, - "operations" : [ - { - "@type" : "com.jd.blockchain.ledger.DataAccountRegisterOperation", - "accountID" : { - "address" : { - "value" : "LdeNscE3MP9a1vgyVUg9LgxQx6yzkUEUS65Rn" - }, - "pubKey" : "7VeRBZLMWAxcgL9DTjGWn9FHWny54bzDzrgeAH6pCFvEJ5eT" - } - }, - { - "accountAddress" : { - "value" : "LdeNscE3MP9a1vgyVUg9LgxQx6yzkUEUS65Rn" - }, - "@type" : "com.jd.blockchain.ledger.DataAccountKVSetOperation", - "writeSet" : [ - { - "value" : { - "bytes" : { - "value" : "EMeAB7i" - }, - "type" : "TEXT" - }, - "expectedVersion" : -1, - "key" : "key" - } - ] - } - ], - "ledgerHash" : "j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp" - } - } - } -} -``` - -说明 - -[同 4.4](#4.4-获取指定区块高度的交易列表) - -## 5 用户 - -### 5.1 获取用户总数 - -```http -GET /ledgers/{ledger}/users/count -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| - - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/users/count -``` - -#### 返回实例 - -```json -{ - "data": 4, - "success": true -} -``` - -说明 - -|名称|说明| -|---|---| -|data|用户总数| - - -### 5.2 获取用户列表 - -```http -GET /ledgers/{ledger}/users?fromIndex={fromIndex}&count={count} -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|query|fromIndex|否|查询用户的起始序号,默认为0|数字| -|query|count|否|查询返回用户的数量,默认最大返回值为100,小于0或大于100均返回最大可返回结果集|数字| - - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/users?fromIndex=0&count=2 -``` - -#### 返回实例 - -```json -{ - "success" : true, - "data" : [ - { - "pubKey" : "7VeRJpb2XX8XKAaC7G5zQg9DbgKM8gmLhUBtGFmerFbhJTZn", - "address" : { - "value" : "LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw" - } - }, - { - "pubKey" : "7VeREmuT4fF9yRPEMbSSaNLKbLa3qoTpfGHRgwpnSWUn5tqW", - "address" : { - "value" : "LdeNiXZbsBCsTc2ZGp1PGBX81aUxPekhwEwmY" - } - } - ] -} -``` - -说明 - -|名称|说明| -|---|---| -|address.value|用户地址| -|pubKey|用户公钥| - - -### 5.3 获取用户详细信息 - -```http -GET /ledgers/{ledger}/users/address/{address} -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|path|address|是|用户地址|字符串| - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/users/address/LdeNiXZbsBCsTc2ZGp1PGBX81aUxPekhwEwmY -``` - -#### 返回实例 - -```json -{ - "success" : true, - "data" : { - "pubKey" : "7VeREmuT4fF9yRPEMbSSaNLKbLa3qoTpfGHRgwpnSWUn5tqW", - "iD" : { - "pubKey" : "7VeREmuT4fF9yRPEMbSSaNLKbLa3qoTpfGHRgwpnSWUn5tqW", - "address" : { - "value" : "LdeNiXZbsBCsTc2ZGp1PGBX81aUxPekhwEwmY" - } - }, - "dataRootHash" : "j5uJfAqLw1ptaZYJyKVZm37zZybboqxMPpS6Mv59rNd4xF", - "headerRootHash" : "j5oYeBmoBJ4jLpijwi6eoKAqh4BsQ3RWHzxdBnTvvTqSK6", - "dataset" : { - "dataCount" : 0, - "updated" : false, - "readonly" : false, - "rootHash" : "j5uJfAqLw1ptaZYJyKVZm37zZybboqxMPpS6Mv59rNd4xF" - }, - "address" : { - "value" : "LdeNiXZbsBCsTc2ZGp1PGBX81aUxPekhwEwmY" - } - } -} -``` - -说明 - -|名称|说明| -|---|---| -|address.value|用户地址| -|pubKey|用户公钥| -|dataset.rootHash|用户根Hash| - -### 5.4 获取指定高度的区块的用户总数 - -**包含当前区块以及之前区块数据** - -```http -GET /ledgers/{ledger}/blocks/height/{block_height}/users/count -``` - -#### 参数 - -| 请求类型 | 名称 | 是否必需 | 说明 | 数据类型 | -| -------- | ------------ | -------- | -------- | -------- | -| path | ledger | 是 | 账本哈希 | 字符串 | -| path | block_height | 是 | 区块高度 | 数字 | - -#### 请求实例 - -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/users/height/1/users/count -``` - -#### 返回实例 - -```json -{ - "data": 4, - "success": true -} -``` - -说明 - -| 名称 | 说明 | -| ---- | ------------ | -| data | 数据账户数量 | - -### 5.5 获取指定哈希的区块的用户总数 - -**包含当前区块以及之前区块数据** - -```http -GET /ledgers/{ledger}/blocks/hash/{block_hash}/users/count -``` - -#### 参数 - -| 请求类型 | 名称 | 是否必需 | 说明 | 数据类型 | -| -------- | ---------- | -------- | -------- | -------- | -| path | ledger | 是 | 账本哈希 | 字符串 | -| path | block_hash | 是 | 区块哈希 | 字符串 | - -#### 请求实例 - -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/blocks/hash/j5opzRbH2fB6YmjvEdMLQ8VHVeZoUuKyVWzExCtJF1wecw/users/count -``` - -#### 返回实例 - -```json -{ - "data": 4, - "success": true -} -``` - -说明 - -| 名称 | 说明 | -| ---- | ------------ | -| data | 数据账户数量 | - -### 5.6 根据区块高度查询区块内的用户数量 - -**仅包含当前区块数据** - -```http -GET /ledgers/{ledger}/blocks/height/{block_height}/users/additional-count -``` - -#### 参数 - -| 请求类型 | 名称 | 是否必需 | 说明 | 数据类型 | -| -------- | ------------ | -------- | -------- | -------- | -| path | ledger | 是 | 账本哈希 | 字符串 | -| path | block_height | 是 | 区块高度 | 数字 | - -#### 请求实例 - -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/blocks/height/2/users/additional-count -``` - -#### 返回实例 - -```json -{ - "data": 1, - "success": true -} -``` - -说明 - -| 名称 | 说明 | -| ---- | -------- | -| data | 用户数量 | - -### 5.7 根据区块哈希查询区块内的用户数量 - -**仅包含当前区块数据** - -```http -GET /ledgers/{ledger}/blocks/hash/{block_hash}/users/additional-count -``` - -#### 参数 - -| 请求类型 | 名称 | 是否必需 | 说明 | 数据类型 | -| -------- | ---------- | -------- | -------- | -------- | -| path | ledger | 是 | 账本哈希 | 字符串 | -| path | block_hash | 是 | 区块哈希 | 字符串 | - -#### 请求实例 - -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/blocks/hash/j5irFH5SJBaCSa6R3QYhbWYMUA2Wos3gvXYUyDYAHVhG23/users/additional-count -``` - -#### 返回实例 - -```json -{ - "data": 1, - "success": true -} -``` - -说明 - -| 名称 | 说明 | -| ---- | -------- | -| data | 用户数量 | - -### 5.8 查询最新区块新增用户数量 - -**仅包含最新区块数据** - -```http -GET /ledgers/{ledger}/blocks/users/additional-count -``` - -#### 参数 - -| 请求类型 | 名称 | 是否必需 | 说明 | 数据类型 | -| -------- | ------ | -------- | -------- | -------- | -| path | ledger | 是 | 账本哈希 | 字符串 | - -#### 请求实例 - -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/blocks/users/additional-count -``` - -#### 返回实例 - -```json -{ - "data": 0, - "success": true -} -``` - -说明 - -| 名称 | 说明 | -| ---- | -------- | -| data | 用户数量 | - -## 6 角色权限 - -有关用户/角色/权限说明参照[用户文档](user.md) - -### 6.1 根据角色获取权限信息 -```http -GET /ledgers/{ledger}/authorization/role/{roleName} -``` - -#### 参数 - -| 请求类型 | 名称 | 是否必需 | 说明 | 数据类型 | -| -------- | -------- | -------- | -------- | -------- | -| path | ledger | 是 | 账本哈希 | 字符串 | -| path | roleName | 是 | 角色名 | 字符串 | - - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5pSJLyVpS8QG2wL95fiDWHHnweh2YdqNhgmnb64SBMjUh/authorization/role/DEFAULT -``` - -#### 返回实例 - -```json -{ - "success" : true, - "data" : { - "roleName" : "DEFAULT", - "transactionPrivilege" : { - "privilege" : [ - "DIRECT_OPERATION", - "CONTRACT_OPERATION" - ], - "permissionCount" : 2 - }, - "version" : 0, - "ledgerPrivilege" : { - "privilege" : [ - "CONFIGURE_ROLES", - "AUTHORIZE_USER_ROLES", - "SET_CONSENSUS", - "SET_CRYPTO", - "REGISTER_PARTICIPANT", - "REGISTER_USER", - "REGISTER_DATA_ACCOUNT", - "REGISTER_CONTRACT", - "UPGRADE_CONTRACT", - "SET_USER_ATTRIBUTES", - "WRITE_DATA_ACCOUNT", - "APPROVE_TX", - "CONSENSUS_TX", - "REGISTER_EVENT_ACCOUNT", - "WRITE_EVENT_ACCOUNT" - ], - "permissionCount" : 15 - } - } -} -``` - -说明 - -| 名称 | 说明 | -| ------------------------------------ | ----------------- | -| roleName | 角色名称 | -| transactionPrivilege | 交易权限 | -| transactionPrivilege.privilege | 交易权限.权限类别 | -| transactionPrivilege.permissionCount | 交易权限.权限总数 | -| ledgerPrivilege | 账本权限 | -| ledgerPrivilege.privilege | 账本权限.权限类别 | -| ledgerPrivilege.permissionCount | 账本权限.权限总数 | - -### 6.2 根据用户获取权限信息 - -```http -GET /ledgers/{ledger}/authorization/user/{userAddress} -``` - -#### 参数 - -| 请求类型 | 名称 | 是否必需 | 说明 | 数据类型 | -| -------- | ----------- | -------- | -------- | -------- | -| path | ledger | 是 | 账本哈希 | 字符串 | -| path | userAddress | 是 | 用户地址 | 字符串 | - - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5pSJLyVpS8QG2wL95fiDWHHnweh2YdqNhgmnb64SBMjUh/authorization/user/LdeP2ji8PR1DPsLt5NoFeiBnhpckrLHgCJge6 -``` - -#### 返回实例 - -```json -{ - "data" : { - "userAddress" : { - "value" : "LdeP2ji8PR1DPsLt5NoFeiBnhpckrLHgCJge6" - }, - "userRole" : [ - "DEFAULT" - ], - "ledgerPrivilegesBitset" : { - "privilege" : [ - "CONFIGURE_ROLES", - "AUTHORIZE_USER_ROLES", - "SET_CONSENSUS", - "SET_CRYPTO", - "REGISTER_PARTICIPANT", - "REGISTER_USER", - "REGISTER_DATA_ACCOUNT", - "REGISTER_CONTRACT", - "UPGRADE_CONTRACT", - "SET_USER_ATTRIBUTES", - "WRITE_DATA_ACCOUNT", - "APPROVE_TX", - "CONSENSUS_TX", - "REGISTER_EVENT_ACCOUNT", - "WRITE_EVENT_ACCOUNT" - ], - "permissionCount" : 15 - }, - "transactionPrivilegesBitset" : { - "permissionCount" : 2, - "privilege" : [ - "DIRECT_OPERATION", - "CONTRACT_OPERATION" - ] - } - }, - "success" : true -} -``` - -说明 - -| 名称 | 说明 | -| --------------------------- | ---------- | -| userRole | 用户角色 | -| transactionPrivilegesBitset | 交易权限集 | -| ledgerPrivilegesBitset | 账本权限集 | - -> 请求链上不存在的用户地址,会返回DEFAULT角色权限列表 - -## 7 数据账户 - -### 7.1 获取账户列表 - -```http -GET /ledgers/{ledger}/accounts?fromIndex={fromIndex}&count={count} -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|query|fromIndex|否|查询数据账户的起始序号,默认为0|数字| -|query|count|否|查询返回数据账户的数量,默认最大返回值为100,小于0或大于100均返回最大可返回结果集|数字| - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/accounts?fromIndex=0&count=-1 -``` - -#### 返回实例 - -```json -{ - "data" : [ - { - "address" : { - "value" : "LdeNscE3MP9a1vgyVUg9LgxQx6yzkUEUS65Rn" - }, - "pubKey" : "7VeRBZLMWAxcgL9DTjGWn9FHWny54bzDzrgeAH6pCFvEJ5eT" - } - ], - "success" : true -} -``` - -说明 - -|名称|说明| -|---|---| -|address.value|账户地址| -|pubKey|账户公钥| - - -### 7.2 获取账户详细信息 - -```http -GET /ledgers/{ledger}/accounts/address/{address} -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|path|address|是|账户地址|字符串| - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/accounts/address/LdeNscE3MP9a1vgyVUg9LgxQx6yzkUEUS65Rn -``` - -#### 返回实例 - -```json -{ - "data" : { - "dataset" : { - "updated" : false, - "readonly" : false, - "dataCount" : 1, - "rootHash" : "j5vjKBpdFncVW9dYnjefiKgs858QKNc98XAvy5pFXmgLKp" - }, - "headerRootHash" : "j5jUf96A8678xdggUdAZUtADL43WFsFu76gWxT9KkknjLf", - "dataRootHash" : "j5vjKBpdFncVW9dYnjefiKgs858QKNc98XAvy5pFXmgLKp", - "pubKey" : "7VeRBZLMWAxcgL9DTjGWn9FHWny54bzDzrgeAH6pCFvEJ5eT", - "iD" : { - "pubKey" : "7VeRBZLMWAxcgL9DTjGWn9FHWny54bzDzrgeAH6pCFvEJ5eT", - "address" : { - "value" : "LdeNscE3MP9a1vgyVUg9LgxQx6yzkUEUS65Rn" - } - }, - "address" : { - "value" : "LdeNscE3MP9a1vgyVUg9LgxQx6yzkUEUS65Rn" - } - }, - "success" : true -} -``` - -说明 - -|名称|说明| -|---|---| -|address.value|账户地址| -|pubKey|账户公钥| - - -### 7.3 获取账户总数 - -```http -GET /ledgers/{ledger}/accounts/count -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| - - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/accounts/count -``` - -#### 返回实例 - -```json -{ - "data": 1, - "success": true -} -``` - -说明 - -|名称|说明| -|---|---| -|data|账户数量| - -### 7.4 获取指定高度的区块的数据账户总数 - -**包含当前区块以及之前区块数据** - -```http -GET /ledgers/{ledger}/blocks/height/{block_height}/accounts/count -``` - -#### 参数 - -| 请求类型 | 名称 | 是否必需 | 说明 | 数据类型 | -| -------- | ------------ | -------- | -------- | -------- | -| path | ledger | 是 | 账本哈希 | 字符串 | -| path | block_height | 是 | 区块高度 | 数字 | - -#### 请求实例 - -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/blocks/height/1/accounts/count -``` - -#### 返回实例 - -```json -{ - "data": 1, - "success": true -} -``` - -说明 - -| 名称 | 说明 | -| ---- | ------------ | -| data | 数据账户数量 | - -### 7.5 获取指定哈希的区块的数据账户总数 - -**包含当前区块以及之前区块数据** - -```http -GET /ledgers/{ledger}/blocks/hash/{block_hash}/accounts/count -``` - -#### 参数 - -| 请求类型 | 名称 | 是否必需 | 说明 | 数据类型 | -| -------- | ---------- | -------- | -------- | -------- | -| path | ledger | 是 | 账本哈希 | 字符串 | -| path | block_hash | 是 | 区块哈希 | 字符串 | - -#### 请求实例 - -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/blocks/hash/j5opzRbH2fB6YmjvEdMLQ8VHVeZoUuKyVWzExCtJF1wecw/accounts/count -``` - -#### 返回实例 - -```json -{ - "data": 1, - "success": true -} -``` - -说明 - -| 名称 | 说明 | -| ---- | ------------ | -| data | 数据账户数量 | - -### 7.6 根据区块高度查询区块内的数据账户数量 - -**仅包含当前区块数据** - -```http -GET /ledgers/{ledger}/blocks/height/{block_height}/accounts/additional-count -``` - -#### 参数 - -| 请求类型 | 名称 | 是否必需 | 说明 | 数据类型 | -| -------- | ------------ | -------- | -------- | -------- | -| path | ledger | 是 | 账本哈希 | 字符串 | -| path | block_height | 是 | 区块高度 | 数字 | - -#### 请求实例 - -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/blocks/height/1/accounts/additional-count -``` - -#### 返回实例 - -```json -{ - "data": 1, - "success": true -} -``` - -说明 - -| 名称 | 说明 | -| ---- | ------------ | -| data | 数据账户数量 | - -### 7.7 根据区块哈希查询区块内的数据账户数量 - -**仅包含当前区块数据** - -```http -GET /ledgers/{ledger}/blocks/hash/{block_hash}/accounts/additional-count -``` - -#### 参数 - -| 请求类型 | 名称 | 是否必需 | 说明 | 数据类型 | -| -------- | ---------- | -------- | -------- | -------- | -| path | ledger | 是 | 账本哈希 | 字符串 | -| path | block_hash | 是 | 区块哈希 | 字符串 | - -#### 请求实例 - -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/blocks/hash/j5irFH5SJBaCSa6R3QYhbWYMUA2Wos3gvXYUyDYAHVhG23/accounts/additional-count -``` - -#### 返回实例 - -```json -{ - "data": 1, - "success": true -} -``` - -说明 - -| 名称 | 说明 | -| ---- | ------------ | -| data | 数据账户数量 | - -### 7.8 获取某数据账户KV总数 - -```http - GET /ledgers/{ledger}/accounts/address/{address}/entries/count -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|path|address|是|账户地址|字符串| - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/accounts/address/LdeNscE3MP9a1vgyVUg9LgxQx6yzkUEUS65Rn/entries/count -``` - -#### 返回实例 - -```json -{ - "data": 1, - "success": true -} -``` - -说明 - -|名称|说明| -|---|---| -|data|KV总数| - - -### 7.9 获取某数据账户KV详情 - -```http -GET /ledgers/{ledger}/accounts/address/{address}/entries?fromIndex={fromIndex}&count={count} -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|path|address|是|账户地址|字符串| -|query|fromIndex|否|查询数据账户对应KV的起始序号,默认为0|数字| -|query|count|否|查询返回数据账户对应KV的数量,默认最大返回值为100,小于0或大于100均返回最大可返回结果集|数字| -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/accounts/address/LdeNscE3MP9a1vgyVUg9LgxQx6yzkUEUS65Rn/entries?fromIndex=0&count=1 -``` - -#### 返回实例 - -```json -{ - "data" : [ - { - "type" : "TEXT", - "version" : 0, - "key" : "key", - "value" : "value" - } - ], - "success" : true -} -``` - -说明 - -|名称|说明| -|---|---| -|key|键| -|version|版本号| -|type|value类型| -|value|值| - -> 数据类型参照[数据账户](data_account.md)中描述。 - -### 7.10 获取某数据账户KV详情 - -```http -GET/POST /ledgers/{ledger}/accounts/{address}/entries?keys={keys} -``` - -#### 参数 - -| 请求类型 | 名称 | 是否必需 | 说明 | 数据类型 | -| -------- | ------- | -------- | --------------- | -------- | -| path | ledger | 是 | 账本哈希 | 字符串 | -| path | address | 是 | 账户地址 | 字符串 | -| form | keys | 是 | key详细内容列表 | 字符串 | - -#### 请求实例 - -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/accounts/LdeNscE3MP9a1vgyVUg9LgxQx6yzkUEUS65Rn/entries?keys=key,key1 -``` - - -#### 返回实例 - -```json -{ - "success" : true, - "data" : [ - { - "key" : "key", - "value" : 1024, - "version" : 2, - "type" : "INT64" - }, - { - "type" : "NIL", - "version" : -1, - "key" : "key1" - } - ] -} -``` - -说明 - -| 名称 | 说明 | -| ------- | --------- | -| key | 键 | -| version | 版本号 | -| type | value类型 | -| value | 值 | - - -### 7.11 获取某数据账户KV整个历史详情 - -```http - GET/POST /ledgers/{ledger}/accounts/{address}/entries-version -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|path|address|是|账户地址|字符串| -|body|kvInfoVO|是|Key相关信息|对象| - -KVInfoVO对应格式如下: - -```json - -{ - "data": [{ - "key": "key", - "version": [0, 1] - } -} - -``` - -kvInfoVO说明: - - 支持多个Key作为入参; - - 每个Key支持多个version; - - -#### 请求实例 -```curl -curl -H 'Content-Type:application/json' --data '{"data":[{"key":"key","version":[0,1]}]}' 'http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/accounts/LdeNscE3MP9a1vgyVUg9LgxQx6yzkUEUS65Rn/entries-version' -``` - -#### 返回实例 - -```json -{ - "data" : [ - { - "type" : "TEXT", - "key" : "key", - "value" : "value", - "version" : 0 - }, - { - "type" : "BYTES", - "version" : 1, - "value" : "Ynl0ZXM=", - "key" : "key" - } - ], - "success" : true -} -``` - -说明 - -|名称|说明| -|---|---| -|key|键| -|version|版本号| -|type|value类型| -|value|值,BASE64编码| - -## 8 合约 - -### 8.1 获取合约总数 - -```http -GET /ledgers/{ledger}/contracts/count -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| - - -#### 请求实例 - -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/contracts/count -``` - -#### 返回实例 - -```json -{ - "data": 1, - "success": true -} -``` - -说明 - -| 名称 | 说明 | -| ---- | -------- | -| data | 合约数量 | - -### 8.2 获取指定区块高度的合约总数 - -**包含当前区块以及之前区块数据** - -```http -GET /ledgers/{ledger}/blocks/height/{blockHeight}/contracts/count -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|path|blockHeight|是|区块高度|数字| - -#### 请求实例 - -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/blocks/height/7/contracts/count -``` - -#### 返回实例 - -```json -{ - "data": 2, - "success": true -} -``` - -说明 - -| 名称 | 说明 | -| ---- | -------- | -| data | 合约数量 | - - - -### 8.3 获取指定区块哈希的合约总数 - -**包含当前区块以及之前区块数据** - -```http -GET /ledgers/{ledger}/blocks/hash/{blockHash}/contracts/count -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|path|blockHash|是|区块哈希|字符串| - - -#### 请求实例 - -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/blocks/hash/j5hhTQPyZQHqkvP5UBq3sAaqxq8QUda6asJLzZ2VFUhvQ8/contracts/count -``` - -#### 返回实例 - -```json -{ - "data": 2, - "success": true -} -``` - -说明 - -| 名称 | 说明 | -| ---- | -------- | -| data | 合约数量 | - -### 8.4 根据区块高度查询区块内的合约总数 - -**仅包含当前区块数据** - -```http -GET /ledgers/{ledger}/blocks/height/{blockHeight}/contracts/additional-count -``` - -#### 参数 - -| 请求类型 | 名称 | 是否必需 | 说明 | 数据类型 | -| -------- | ----------- | -------- | -------- | -------- | -| path | ledger | 是 | 账本哈希 | 字符串 | -| path | blockHeight | 是 | 区块高度 | 数字 | - -#### 请求实例 - -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/blocks/height/7/contracts/additional-count -``` - -#### 返回实例 - -```json -{ - "data": 1, - "success": true -} -``` - -说明 - -| 名称 | 说明 | -| ---- | -------- | -| data | 合约数量 | - - - -### 8.5 根据区块哈希查询区块内的合约总数 - -**仅包含当前区块数据** - -```http -GET /ledgers/{ledger}/blocks/hash/{blockHash}/contracts/additional-count -``` - -#### 参数 - -| 请求类型 | 名称 | 是否必需 | 说明 | 数据类型 | -| -------- | --------- | -------- | -------- | -------- | -| path | ledger | 是 | 账本哈希 | 字符串 | -| path | blockHash | 是 | 区块哈希 | 字符串 | - - -#### 请求实例 - -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/blocks/hash/j5hhTQPyZQHqkvP5UBq3sAaqxq8QUda6asJLzZ2VFUhvQ8/contracts/additional-count -``` - -#### 返回实例 - -```json -{ - "data": 1, - "success": true -} -``` - -说明 - -| 名称 | 说明 | -| ---- | -------- | -| data | 合约数量 | - -### 8.6 获取合约列表 - -```http -GET /ledgers/{ledger}/contracts?fromIndex={fromIndex}&count={count} -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|query|fromIndex|否|查询合约的起始序号,默认为0|数字| -|query|count|否|查询返回合约的数量,默认最大返回值为100,小于0或大于100均返回最大可返回结果集|数字| - - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/contracts?fromIndex=0&count=-1 -``` - -#### 返回实例 - -```json -{ - "data" : [ - { - "pubKey" : "7VeRCfSaoBW3uRuvTqVb26PYTNwvQ1iZ5HBY92YKpEVN7Qht", - "address" : { - "value" : "LdeNr7H1CUbqe3kWjwPwiqHcmd86zEQz2VRye" - } - }, - { - "pubKey" : "7VeRALfcPigCTSEPHSwz7U7TDNLoet85z3nRfr5cYspUWLAR", - "address" : { - "value" : "LdeNwApbVMHqTCzNKuynUtJXH7vN2rG8gxHN5" - } - } - ], - "success" : true -} - -``` - -说明 - -|名称|说明| -|---|---| -|address.value|账户地址| -|pubKey|账户公钥| - - -### 8.7 获取合约详细信息 - -```http -GET /ledgers/{ledger}/contracts/address/{address} -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|path|address|是|合约地址|字符串| - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/contracts/address/LdeNr7H1CUbqe3kWjwPwiqHcmd86zEQz2VRye -``` - -#### 返回实例 - -```json -{ - "success" : true, - "data" : { - "dataRootHash" : "j5uJfAqLw1ptaZYJyKVZm37zZybboqxMPpS6Mv59rNd4xF", - "chainCode" : "package com.jdchain.samples.contract;\n\nimport com.jd.blockchain.contract.*;\nimport utils.*;\nimport com.jd.blockchain.crypto.*;\nimport com.jd.blockchain.ledger.*;\n\npublic class SampleContractImpl implements EventProcessingAware, SampleContract\n{\n private ContractEventContext eventContext;\n \n public void setKVWithVersion(final String address, final String key, final String value, final long version) {\n this.eventContext.getLedger().dataAccount(Bytes.fromBase58(address)).setText(key, value, version);\n }\n \n public void setKV(final String address, final String key, final String value) {\n final TypedKVEntry[] entries = this.eventContext.getUncommittedLedger().getDataEntries(address, new String[] { key });\n long version = -1L;\n if (null != entries && entries.length > 0) {\n version = entries[0].getVersion();\n }\n this.eventContext.getLedger().dataAccount(Bytes.fromBase58(address)).setText(key, value, version);\n }\n \n public String registerUser(final String seed) {\n final CryptoAlgorithm algorithm = Crypto.getAlgorithm(\"ed25519\");\n final SignatureFunction signFunc = Crypto.getSignatureFunction(algorithm);\n final AsymmetricKeypair cryptoKeyPair = signFunc.generateKeypair(seed.getBytes());\n final BlockchainKeypair keypair = new BlockchainKeypair(cryptoKeyPair.getPubKey(), cryptoKeyPair.getPrivKey());\n this.eventContext.getLedger().users().register(keypair.getIdentity());\n return keypair.getAddress().toBase58();\n }\n \n public String registerDataAccount(final String seed) {\n final CryptoAlgorithm algorithm = Crypto.getAlgorithm(\"ed25519\");\n final SignatureFunction signFunc = Crypto.getSignatureFunction(algorithm);\n final AsymmetricKeypair cryptoKeyPair = signFunc.generateKeypair(seed.getBytes());\n final BlockchainKeypair keypair = new BlockchainKeypair(cryptoKeyPair.getPubKey(), cryptoKeyPair.getPrivKey());\n this.eventContext.getLedger().dataAccounts().register(keypair.getIdentity());\n return keypair.getAddress().toBase58();\n }\n \n public String registerEventAccount(final String seed) {\n final CryptoAlgorithm algorithm = Crypto.getAlgorithm(\"ed25519\");\n final SignatureFunction signFunc = Crypto.getSignatureFunction(algorithm);\n final AsymmetricKeypair cryptoKeyPair = signFunc.generateKeypair(seed.getBytes());\n final BlockchainKeypair keypair = new BlockchainKeypair(cryptoKeyPair.getPubKey(), cryptoKeyPair.getPrivKey());\n this.eventContext.getLedger().eventAccounts().register(keypair.getIdentity());\n return keypair.getAddress().toBase58();\n }\n \n public void publishEventWithSequence(final String address, final String topic, final String content, final long sequence) {\n this.eventContext.getLedger().eventAccount(Bytes.fromBase58(address)).publish(topic, content, sequence);\n }\n \n public void publishEvent(final String address, final String topic, final String content) {\n final Event event = this.eventContext.getUncommittedLedger().getLatestEvent(address, topic);\n long sequence = -1L;\n if (null != event) {\n sequence = event.getSequence();\n }\n this.eventContext.getLedger().eventAccount(Bytes.fromBase58(address)).publish(topic, content, sequence);\n }\n \n public void beforeEvent(final ContractEventContext eventContext) {\n this.eventContext = eventContext;\n }\n \n public void postEvent(final ContractEventContext eventContext, final Exception error) {\n }\n}\n", - "address" : { - "value" : "LdeNr7H1CUbqe3kWjwPwiqHcmd86zEQz2VRye" - }, - "headerRootHash" : "j5r72A4PMdDrAU4zhniJNRWM5nKV8kAKMdt6naNrtjRp3A", - "chainCodeVersion" : 0, - "pubKey" : "7VeRCfSaoBW3uRuvTqVb26PYTNwvQ1iZ5HBY92YKpEVN7Qht" - } -} -``` - -说明 - -|名称|说明| -|---|---| -|address.value|账户地址| -|pubKey|账户公钥| -|chainCode|合约源代码| - - - -## 9 用户自定义事件 - -### 9.1 获取事件账户列表 - -```http -GET /ledgers/{ledger}/events/user/accounts?fromIndex={fromIndex}&count={count} -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|query|fromIndex|否|查询的起始序号,默认为0|数字| -|query|count|否|查询返回事件账户的数量,默认最大返回值为100,小于0或大于100均返回最大可返回结果集|数字| - - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/events/user/accounts?fromIndex=0&count=-1 -``` - -#### 返回实例 - -```json -{ - "data" : [ - { - "address" : { - "value" : "LdeNqYND7M82fxrej7ffRPXZwahQZEoUSoUzz" - }, - "pubKey" : "7VeRJe66QNfuacfSVPzTfXPooFcRmMJKXPYqkUsn4r9v8DqA" - }, - { - "pubKey" : "7VeRMwxWNcpMszstXtaxJ1fupauuJpwedB81nMJJQB93LiAJ", - "address" : { - "value" : "LdeNiAPuZ5tpYZVrrbELJNjqdvB51PBpNd8QA" - } - } - ], - "success" : true -} -``` - -说明 - -|名称|说明| -|---|---| -|address.value|账户地址| -|pubKey|账户公钥| - -### 9.2 获取事件账户 - -```http -GET /ledgers/{ledger}/events/user/accounts/{address} -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|address|账户地址|是|事件账户地址|字符串| - - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/events/user/accounts/LdeNqYND7M82fxrej7ffRPXZwahQZEoUSoUzz -``` - -#### 返回实例 - -```json -{ - "success" : true, - "data" : { - "address" : { - "value" : "LdeNqYND7M82fxrej7ffRPXZwahQZEoUSoUzz" - }, - "pubKey" : "7VeRJe66QNfuacfSVPzTfXPooFcRmMJKXPYqkUsn4r9v8DqA" - } -} -``` - -说明 - -|名称|说明| -|---|---| -|address.value|账户地址| -|pubKey|账户公钥| - -### 9.3 获取事件账户总数 - -```http -GET /ledgers/{ledger}/events/user/accounts/count -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| - - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/events/user/accounts/count -``` - -#### 返回实例 - -```json -{ - "success" : true, - "data" : 2 -} -``` - -说明 - -|名称|说明| -|---|---| -|data|事件账户数量| - -### 9.4 获取事件名数量 - -```http -GET /ledgers/{ledger}/events/user/accounts/{address}/names/count -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|path|address|是|事件账户地址|字符串| - - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/events/user/accounts/LdeNiAPuZ5tpYZVrrbELJNjqdvB51PBpNd8QA/names/count -``` - -#### 返回实例 - -```json -{ - "data" : 5, - "success" : true -} -``` - -说明 - -|名称|说明| -|---|---| -|data|事件名数量| - -### 9.5 获取事件名列表 - -```http -GET /ledgers/{ledger}/events/user/accounts/{address}/names?fromIndex={fromIndex}&count={count} -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|path|address|是|事件账户地址|字符串| -|query|fromIndex|否|查询的起始序号,默认为0|数字| -|query|count|否|查询返回事件账户的数量,默认最大返回值为100,小于0或大于100均返回最大可返回结果集|数字| - - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/events/user/accounts/LdeNiAPuZ5tpYZVrrbELJNjqdvB51PBpNd8QA/names?fromIndex=0&count=-1 -``` - -#### 返回实例 - -```json -{ - "data" : [ - "topic4", - "topic3", - "topic", - "topic1", - "topic2" - ], - "success" : true -} -``` - -说明 - -|名称|说明| -|---|---| -|data|事件名数量数组| - -### 9.6 获取最新事件 - -```http -GET /ledgers/{ledger}/events/user/accounts/{address}/names/{event_name}/latest -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|path|address|是|事件账户地址|字符串| -|path|event_name|是|事件名|字符串| - - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/events/user/accounts/LdeNiAPuZ5tpYZVrrbELJNjqdvB51PBpNd8QA/names/topic/latest -``` - -#### 返回实例 - -```json -{ - "success" : true, - "data" : { - "sequence" : 0, - "blockHeight" : 8, - "transactionSource" : "j5p868BwtU4w5BxG7gnuhQCFqpAgddVzTWNEKMAzZ8bnrF", - "eventAccount" : { - "value" : "LdeNiAPuZ5tpYZVrrbELJNjqdvB51PBpNd8QA" - }, - "name" : "topic", - "contractSource" : "", - "content" : { - "bytes" : { - "value" : "4mZ4ZZRGDZ" - }, - "nil" : false, - "value" : "content", - "type" : "TEXT" - } - } -} -``` - -说明 - -|名称|说明| -|---|---| -|sequence|事件序列| -|transactionSource|交易哈希| -|blockHeight|时间产生区块高度| -|contractSource|合约地址| -|eventAccount.value|事件账户地址| -|name|事件名| -|content.nil|事件内容是否为空| -|content.bytes.value|事件内容字节,BASE64编码| -|content.type|事件内容类型| -|content.value|事件内容| - -### 9.7 获取事件数量 - -```http -GET /ledgers/{ledger}/events/user/accounts/{address}/names/{event_name}/count -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|path|address|是|事件账户地址|字符串| -|path|event_name|是|事件名|字符串| - - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/events/user/accounts/LdeP1yuk8Medq3Sph5ur9y1yE6nJ71XRVPPx1/names/topic/count -``` - -#### 返回实例 - -```json -{ - "data": 1, - "success": true -} -``` - -说明 - -|名称|说明| -|---|---| -|data|事件数量| - -### 9.8 获取事件列表 - -```http -GET /ledgers/{ledger}/events/user/accounts/{address}/names/{event_name}?fromSequence={fromSequence}&count={count} -``` - -#### 参数 - -|请求类型|名称|是否必需|说明|数据类型| -|---|---|---|---|---| -|path|ledger|是|账本哈希|字符串| -|path|address|是|事件账户地址|字符串| -|path|event_name|是|事件名|字符串| -|query|fromSequence|否|查询的起始序号,默认为0|数字| -|query|count|否|查询返回事件的数量,默认最大返回值为100,小于0或大于100均返回最大可返回结果集|数字| - - -#### 请求实例 -```http -http://localhost:8080/ledgers/j5hQrVB8y78xXbDR9vB92WBjiJShH36G7YLdQYsxtRxkpp/events/user/accounts/LdeNiAPuZ5tpYZVrrbELJNjqdvB51PBpNd8QA/names/topic?fromSequenct=0&count=-1 -``` - -#### 返回实例 - -```json -{ - "data" : [ - { - "content" : { - "value" : "content", - "nil" : false, - "type" : "TEXT", - "bytes" : { - "value" : "4mZ4ZZRGDZ" - } - }, - "eventAccount" : { - "value" : "LdeNiAPuZ5tpYZVrrbELJNjqdvB51PBpNd8QA" - }, - "contractSource" : "", - "name" : "topic", - "sequence" : 0, - "transactionSource" : "j5p868BwtU4w5BxG7gnuhQCFqpAgddVzTWNEKMAzZ8bnrF", - "blockHeight" : 8 - } - ], - "success" : true -} -``` - -说明 - -|名称|说明| -|---|---| -|data|事件列表| -|sequence|事件序列| -|transactionSource|交易哈希| -|blockHeight|时间产生区块高度| -|contractSource|合约地址| -|eventAccount.value|事件账户地址| -|name|事件名| -|content.nil|事件内容是否为空| -|content.bytes.value|事件内容字节,BASE64编码| -|content.type|事件内容类型| -|content.value|事件内容| \ No newline at end of file diff --git a/docs/block.md b/docs/block.md deleted file mode 100644 index 552f156c..00000000 --- a/docs/block.md +++ /dev/null @@ -1,80 +0,0 @@ -## 区块 - -采用`BFT-SMaRt`共识协议,即时出块,单个区块交易数限制默认为`2000`(`bftsmart.config`中参数`system.totalordermulticast.maxbatchsize`) - -### 结构 - -- `LedgerBlock`: - -```java -@DataContract(code = DataCodes.BLOCK) -public interface LedgerBlock extends BlockBody { - - /** - * 区块哈希; - */ - @DataField(order = 1, primitiveType = PrimitiveType.BYTES) - HashDigest getHash(); - -} -``` - -- `BlockBody`: - -```java -@DataContract(code= DataCodes.BLOCK_BODY) -public interface BlockBody extends LedgerDataSnapshot{ - - // 上一个区块哈希 - @DataField(order=2, primitiveType = PrimitiveType.BYTES) - HashDigest getPreviousHash(); - - // 账本哈希 - @DataField(order=3, primitiveType = PrimitiveType.BYTES) - HashDigest getLedgerHash(); - - // 区块高度 - @DataField(order=4, primitiveType= PrimitiveType.INT64) - long getHeight(); - - // 交易数据集哈希 - @DataField(order=5, primitiveType = PrimitiveType.BYTES) - HashDigest getTransactionSetHash(); - - // 区块时间戳,毫秒 - @DataField(order=6, primitiveType = PrimitiveType.INT64) - long getTimestamp(); -} -``` - -- `LedgerDataSnapshot`: - -```java -@DataContract(code=DataCodes.DATA_SNAPSHOT) -public interface LedgerDataSnapshot { - - // 管理数据集哈希 - @DataField(order=1, primitiveType = PrimitiveType.BYTES) - HashDigest getAdminAccountHash(); - - // 用户集哈希 - @DataField(order=2, primitiveType = PrimitiveType.BYTES) - HashDigest getUserAccountSetHash(); - - // 数据账户集哈希 - @DataField(order=3, primitiveType = PrimitiveType.BYTES) - HashDigest getDataAccountSetHash(); - - // 合约集哈希 - @DataField(order=4, primitiveType = PrimitiveType.BYTES) - HashDigest getContractAccountSetHash(); - - // 系统事件集哈希 - @DataField(order=5, primitiveType = PrimitiveType.BYTES) - HashDigest getSystemEventSetHash(); - - // 用户事件集哈希 - @DataField(order=6, primitiveType = PrimitiveType.BYTES) - HashDigest getUserEventSetHash(); -} -``` \ No newline at end of file diff --git a/docs/ca.md b/docs/ca.md deleted file mode 100644 index 9da00075..00000000 --- a/docs/ca.md +++ /dev/null @@ -1,150 +0,0 @@ -## 证书 - -`JD Chain`身份认证支持两种模式:`KEYPAIR`(默认)/`CA`,即公私钥对和证书。 - -证书模式采用`X.509`标准的数字证书作为用户标识,证书字段中,附加组织和角色等信息。 - -`JD Chain`使用`jdchain-cli`/`openssl`生成的自签名证书,也支持使用`CFCA`等国家认可的第三方`CA`颁发的外部证书。 - -`JD Chain` `CA`支持`RSA 2048`/`ECDSA P-256`/`SM2 SM3WithSM2`/`ED25519`四种签名算法。 - - -### 类别 - -`JD Chain`证书体系分`ROOT`,`CA`,`PEER`,`GW`,`USER`几个类别。 - -使用证书`Subject`中`OU`字段区分。 - -#### ROOT - -根证书,可用于签发证书及账本初始化时作为账本证书。 - -#### CA - -中间证书,可用于签发证书及账本初始化时作为账本证书。 - -#### PEER - -共识节点证书,注册参与方时需要提供`PEER`类型证书。 - -#### GW - -网关证书,网关所配置公私钥对应账户信息在链上必须存储有`GW`类型的证书。 - -#### USER - -普通用户证书 - -### 实现 - -`JD Chain`证书使用链上存储方式。主要存储于两个地方: -- 元数据区,存储账本初始化时配置的根证书列表 -- 用户账户头部,存储用户注册时提供的证书 - -> 根证书支持列表,即支持多个参与机构使用不同的证书链,且根证书可使用`ROOT`证书,也可使用`CA`(中间)证书,但节点/网关/用户证书必须由配置在`JD Chain`根证书列表中的证书直接签出。 - -#### 账本初始化 - -*`ledger.init`* -较`KEYPAIR`模式有如下修改: - -1. `identity-mode` -```properties -identity-mode=CA -``` -`identity-mode`身份认证模式,`KEYPAIR`(默认)/`CA` - -2. `root-ca-path` -```properties -root-ca-path=/**/ledger1.crt,/**/ledger2.crt -``` -`root-ca-path`根证书列表,使用`ROOT`或者`CA`类型证书,多个根证书使用半角逗号分割。初始化完成后,证书信息会上链存储,通过[2.7 获取账本初始化配置信息](api.md#27-获取账本初始化配置信息)可查。 - -3. `cons_parti.*.ca-path` - -**CA 模式参与方需要增加配置网关信息,网关节点IP和端口不需要填写** - -节点公钥配置改为证书地址: - -```properties -// KEYPAIR -// cons_parti.0.pubkey-path= -// cons_parti.0.pubkey= - -// CA -cons_parti.0.ca-path=/**/peer0.crt -``` - -*`local.conf`* -较`KEYPAIR`模式有如下修改: -```properties -#当前参与方的公钥,用于非证书模式 -# local.parti.pubkey= -#当前参与方的证书信息,用于证书模式 -local.parti.ca-path= - -#当前参与方的私钥文件,PEM格式,用于证书模式 -local.parti.privkey-path= -``` - -#### 节点运行 - -节点启动和运行时会校验证书类型,时间有效性以及是否由某个根证书签出等,一旦校验失败会阻止网关接入,不再对外服务。 - -#### 网关接入 - -*gateway.conf* -```properties -#默认公钥的内容(Base58编码数据),非CA模式下必填; -keys.default.pubkey= -#默认网关证书路径(X509,PEM),CA模式下必填; -keys.default.ca-path=/home/imuge/jd/nodes/peer0/config/keys/gw1.crt -#默认私钥的路径;在 pk-path 和 pk 之间必须设置其一; -keys.default.privkey-path=/home/imuge/jd/nodes/peer0/config/keys/gw1.key -#默认私钥的内容(加密的Base58编码数据);在 pk-path 和 pk 之间必须设置其一; -keys.default.privkey= -``` - -网关接入网络需要配置`GW`类型证书及对应的私钥信息,证书类型必须是`GW`。 - -网关接入时会做如下认证: -- 证书类型包含`GW` -- 根证书列表存在类型正确且有效证书 -- 网关证书由根证书列表中某个证书签出(此证书类型正确且有效) - -#### 交易认证 - -交易时使用证书持有者私钥签名,交易内容不包含签名用户证书信息。 -交易执行前会校验所有账本根证书,签名终端用户和节点用户的证书类型及有效性。 - -> 请务必在证书到期前更新证书有效期 - -#### 证书更新 - -1. 根证书 - -`SDK`方式: -```java -TransactionTemplate txTemp = blockchainService.newTransaction(ledger); -txTemp.metaInfo().ca(X509Utils.resolveCertificate("*.crt")); -``` - -命令行方式:[更新账本根证书](cli/tx.md#更新账本根证书) - -2. 节点/网关/普通用户证书 - -> 在`JD Chain`中,共识节点,网关配置的接入账户和普通用户本质都是用户账户类型,它们对应的证书管理方式一致。 - -`SDK`方式: - -```java -txTemp.user("user address").ca(X509Utils.resolveCertificate("*.crt")); -``` - -命令行方式:[更新用户证书](cli/tx.md#更新用户证书) - -### 证书生成 - -使用`jdchain-cli`提供的[keys](cli/keys.md)和[ca](cli/ca.md)指令工具创建公私钥对以及签发证书。 - -其中[ca-test](cli/ca.md#生成测试证书)可一键生成账本初始化所需的所有证书外加可用的普通用户证书。 \ No newline at end of file diff --git a/docs/cli/ca.md b/docs/cli/ca.md deleted file mode 100644 index a8a8699e..00000000 --- a/docs/cli/ca.md +++ /dev/null @@ -1,248 +0,0 @@ -### 证书管理 - -`jdchain-cli`提供**`ED25519`,`RSA`,`ECDSA`,`SM2`**密钥算法的证书签发工具:[证书列表](#证书列表),[显示证书](#显示证书),[CSR](#CSR),[CRT](#CRT),[更新证书](#更新证书),[生成测试证书](#生成测试证书) - -> 目前支持创建`ED25519`,RSA`,`ECDSA`,`SM2`四种签名算法,请使用对应算法的公私钥 - -```bash -:bin$ ./jdchain-cli.sh ca -h -Usage: jdchain-cli ca [-hV] [--pretty] [--home=] [COMMAND] -List, create, update certificates. - -h, --help Show this help message and exit. - --home= Set the home directory. - Default: ../ - --pretty Pretty json print - -V, --version Print version information and exit. -Commands: - list List all the certificates. - show Show certificate. - csr Create certificate signing request. - crt Create new certificate. - renew Update validity period. - test Create certificates for a testnet. - help Displays help information about the specified command -``` -- `home`,指定密钥和证书存储相关目录,`${home}/config/keys` - -#### 证书列表 -```bash -:bin$ ./jdchain-cli.sh ca list -h -List all the certificates. -Usage: jdchain-cli ca list [-hV] [--pretty] [--home=] - -h, --help Show this help message and exit. - --home= Set the home directory. - --pretty Pretty json print - -V, --version Print version information and exit. -``` - -如: -```bash -:bin$ ./jdchain-cli.sh keys list -NAME ALGORITHM ADDRESS PUBKEY -``` -- `NAME`,名称 -- `ALGORITHM`,算法 -- `ADDRESS`,地址 -- `PUBKEY`,公钥 - -#### 显示证书 -```bash -:bin$ ./jdchain-cli.sh ca show -h -Show certificate. -Usage: jdchain-cli ca show [-hV] [--pretty] [--home=] -n= - -h, --help Show this help message and exit. - --home= Set the home directory. - -n, --name= Name of the certificate - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `name`,证书名称 - -如显示`${home}/config/keys`下名为`G1`的证书信息: -```bash -:bin$ ./jdchain-cli.sh ca show -n G1 -./jdchain-cli.sh ca show -n G1 -NAME ALGORITHM TYPE ROLE PUBKEY -G1 SM2 ROLE-TODO [GW] SFZ6LjGKVz6wdU4G9PAraojyzCYPJ1BXAg1XBwSPCMC6Ug6u5oom5zcLPUzWtz42aCp9PLGXpHweBjSu3EW2aDzsa4JoT - [0] Version: 3 - SerialNumber: 440724497 - IssuerDN: O=JDT,OU=ROOT,C=CN,ST=BJ,L=BJ,CN=ROOT,E=imuge@jd.com - Start Date: Fri Sep 03 16:43:01 GMT+08:00 2021 - Final Date: Thu May 30 16:43:01 GMT+08:00 2024 - SubjectDN: O=JDT,OU=GW,C=CN,ST=BJ,L=BJ,CN=G1,E=imuge@jd.com - Public Key: EC Public Key [c0:b9:58:d1:35:3d:a9:bc:1d:85:2a:ea:bf:57:80:39:e9:f6:57:6d] - X: 67e4a4afe0a5beb1e5fb6e915314a9ed94b74f449cc4f50314ff78ecf62ba786 - Y: 2d5c233bfcd582f0c1098dbe4f1319db074fcf00023fdc9f3461a8d01488d9f2 - - Signature Algorithm: SM3WITHSM2 - Signature: 3046022100b70107554a723ec96569bbb23c65cb - ac6d7934f47722aa50f18a5e9ca3a978b9022100 - 9b68e5f3bd14bf103248c8516c493e5e1d9a872c - 39841c3704686ca85311bac0 -``` - -#### CSR - -生成证书请求文件 -```bash -:bin$ ./jdchain-cli.sh ca csr -h -Create certificate signing request. -Usage: jdchain-cli ca csr [-hV] [--pretty] [--home=] [-n=] - [--priv=] [--pub=] - -h, --help Show this help message and exit. - --home= Set the home directory. - -n, --name= Name of the key - --pretty Pretty json print - --priv= Path of the private key file - --pub= Path of the public key file - -V, --version Print version information and exit. -``` - -- `name`,密钥对名称,创建公私钥请参照[keys](keys.md)文档说明 - -如使用`${home}/config/keys`下名为`ROOT`的公私钥信息创建`CSR`: -```bash -:bin$ ./jdchain-cli.sh ca csr -n ROOT -// 选择证书角色,输入对应数字即可,多个角色使用半角逗号相隔 -input certificate roles (0 for ROOT, 1 for CA, 2 for PEER, 3 for GW, 4 for USER. multi values use ',' split): -> 1 -input country: -> CN -input locality: -> BJ -input province: -> BJ -input organization name: -> JDT -input email address: -> imuge@jd.com -// 输入ROOT私钥密码 -input password of the key: -> 1 -create [${home}/config/keys/ROOT.csr] success -``` -成功后会创建`${home}/config/keys/ROOT.csr`文件。 - -#### CRT - -签发证书: -```bash -:bin$ ./jdchain-cli.sh ca crt -h -Create new certificate. -Usage: jdchain-cli ca crt [-hV] [--pretty] [--csr=] --days= - [--home=] [--issuer-crt=] - [--issuer-name=] - [--issuer-priv=] [-n=] - --csr= Path of the certificate signing request file - --days= Days of certificate validity - -h, --help Show this help message and exit. - --home= Set the home directory. - --issuer-crt= - Path of the issuer certificate file - --issuer-name= - Name of the issuer key - --issuer-priv= - Path of the issuer private key file - -n, --name= Name of the certificate signing request file - --pretty Pretty json print - -V, --version Print version information and exit. -``` - -- `name`,`CSR`文件名,不为空时要求在`${home}/config/keys`目录下存在`${name.csr}`文件 -- `csr`,`CSR`文件路径,与`name`二选一,优先使用`name`参数 -- `days`,证书有效天数,当前签发时间开始计算 -- `issuer-name`,签发者公私钥对名称,不为空时需要`${home}/config/keys`目录下至少存在`${issuer-name}.priv`,`${issuer-name}.crt` -- `issuer-crt`,签发者证书文件 -- `issuer-priv`,签发者私钥文件 -> `issuer-name`为空时,`issuer-crt`和`issuer-priv`必须同时提供 - - -如使用`${home}/config/keys`下名为`ROOT`签发自签名证书: -```bash -./jdchain-cli.sh ca crt -n CA --issuer-name ROOT --days 1000 -// 输入签发者私钥密码 -input password of the issuer: -> 1 -create [${home}/config/keys/ROOT.crt] success -``` - -#### 更新证书 - -仅可更新证书有效天数 -```bash -Update validity period. -Usage: jdchain-cli ca renew [-hV] [--pretty] [--crt=] --days= - [--home=] [--issuer-crt=] - [--issuer-name=] - [--issuer-priv=] [-n=] - --crt= File of the certificate - --days= Days of certificate validity - -h, --help Show this help message and exit. - --home= Set the home directory. - --issuer-crt= - Path of the issuer certificate file - --issuer-name= - Name of the issuer key - --issuer-priv= - Path of the issuer private key file - -n, --name= Name of the certificate - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `name`,`CRT`文件名,不为空时要求在`${home}/config/keys`目录下存在`${name.crt}`文件 -- `crt`,`CRT`文件路径,与`name`二选一,优先使用`name`参数 -- `days`,证书有效天数,当前签发时间开始计算 -- `issuer-name`,签发者公私钥对名称,不为空时需要`${home}/config/keys`目录下至少存在`${issuer-name}.priv`,`${issuer-name}.crt` -- `issuer-crt`,签发者证书文件 -- `issuer-priv`,签发者私钥文件 -> `issuer-name`为空时,`issuer-crt`和`issuer-priv`必须同时提供 - -如更新`${home}/config/keys`下名为`ROOT`证书有效期: -```bash -./jdchain-cli.sh ca crt -n ROOT --issuer-name ROOT --days 2000 -input password of the issuer: -> 1 -renew [${home}/config/keys/ROOT.crt] success success -``` - -#### 生成测试证书 - -一键生成可用于初始化`JD Chain`网络及使用需要的证书 -```bash -:bin$ ./jdchain-cli.sh ca test -h -Create certificates for a testnet. -Usage: jdchain-cli ca test [-hV] [--pretty] [-a=] - --country= --email= [--gws=] - [--home=] --locality= - [--nodes=] --org= - [-p=] --province= - [--users=] - -a, --algorithm= - Crypto algorithm - --country= Country - --email= Email address - --gws= Gateway size - -h, --help Show this help message and exit. - --home= Set the home directory. - --locality= Locality - --nodes= Node size - --org= Organization name - -p, --password= Password of the key - --pretty Pretty json print - --province= Province - --users= Available user size - -V, --version Print version information and exit. -``` -- `algorithm`,签名算法,默认`ED25519`,仅支持传入`ED25519`, `RSA`,`ECDSA`,`SM2`之一 -- `nodes`,共识节点个数,生成`nodes`个`PEER`类型的证书,可用于节点使用。默认:`4` -- `gws`,网关节点个数,生成`gws`个`GW`类型的证书,可用于网关使用。默认:`1` -- `users`,用户个数,生成`users`可个可用于普通用户使用的证书。默认:`10` - -如创建基于`SM2`签名算法的一个`ROOT`类型证书,`4`个节点证书,`1`个网关证书,`10`个用户证书: -```bash -:bin$ ./jdchain-cli.sh ca test --org JDT --country CN --locality BJ --province BJ --email jdchain@jd.com -input private key password: -// 输入操作过程中生成的私钥加密密码 -> 1 -create test certificates in [${home}/config/keys] success -``` \ No newline at end of file diff --git a/docs/cli/keys.md b/docs/cli/keys.md deleted file mode 100644 index 64305d1c..00000000 --- a/docs/cli/keys.md +++ /dev/null @@ -1,146 +0,0 @@ -### 密钥管理 - -`jdchain-cli`提供基于本地目录的密钥管理:[密钥对列表](#密钥对列表),[显示密钥对](#显示密钥对),[添加密钥对](#添加密钥对),[更新私钥密码](#更新私钥密码),[删除密钥对](#删除密钥对) - -```bash -:bin$ ./jdchain-cli.sh keys -h -Usage: git status [...] [--] [...] -List, create, update or delete keypairs. - -h, --help Show this help message and exit. - --home= Set the home directory. - Default: ../ - --pretty Pretty json print - -V, --version Print version information and exit. -Commands: - list List all the keypairs. - show Show keypair. - add Create a new keypair. - update Update privkey password. - delete Delete keypair. - help Displays help information about the specified command -``` - -#### 密钥对列表 -```bash -:bin$ ./jdchain-cli.sh keys list -h -List all the keypairs. -Usage: jdchain-cli keys list [-hV] [--pretty] [--home=] - -h, --help Show this help message and exit. - --home= Set the home directory. - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `home`,指定密钥存储相关目录,`${home}/config/keys` - -如: -```bash -:bin$ ./jdchain-cli.sh keys list -NAME ALGORITHM ADDRESS PUBKEY -``` -- `NAME`,名称 -- `ALGORITHM`,算法 -- `ADDRESS`,地址 -- `PUBKEY`,公钥 - -#### 显示密钥对 -```bash -:bin$ ./jdchain-cli.sh keys show -h -Show the keypair. -Usage: jdchain-cli keys show [-hV] [--pretty] [--home=] -n= - -h, --help Show this help message and exit. - --home= Set the home directory. - -n, --name= Name of the key - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `name`,密钥对名称 - -如: -```bash -:bin$ ./jdchain-cli.sh keys show -n k1 -input the password: -> 1 -NAME ALGORITHM ADDRESS PUBKEY PRIVKEY PASSWORD -k1 ED25519 LdeNwzRRuF33BNkyzbMuzKV3zFNGMrYBsRXvm 7VeRPc4QsYJX7qpzHBBJTzwvvmXXFVvP1MwmdU7WCBv9Uvc5 177gk2XHAsWRMXyHLLcJsig2jvXWpgo4ZVg2HYgGaiXauAZqPcnsETNeLUeRShw2BKgHVbN 8EjkXVSTxMFjCvNNsTo8RBMDEVQmk7gYkW4SCDuvdsBG -``` -会显示`k1`所有信息 - -#### 添加密钥对 -```bash -:bin$ ./jdchain-cli.sh keys add -h -Create a new keypair. -Usage: jdchain-cli keys add [-hV] [--pretty] [-a=] [--home=] - -n= - -a, --algorithm= - Crypto algorithm - -h, --help Show this help message and exit. - --home= Set the home directory. - -n, --name= Name of the key - --pretty Pretty json print - -p, --password= - Password of the key - -V, --version Print version information and exit. -``` - -- `a`/`algorithm`,密钥算法:`SM2`,`ED25519`等,默认`ED25519` -- `name`,密钥对名称 - -如: -```bash -:bin$ ./jdchain-cli.sh keys add -n k1 -please input password: > -// 输入私钥密码 -1 -NAME ALGORITHM ADDRESS PUBKEY -k1 ED25519 LdeP1iczD3zpmcayKAxTfSywict9y2r6Jpq6n 7VeRBamwPeMb7jzTNg3Ap2DscBiy3QE3PK5NqBvv9tUjQVk4 -``` - -#### 更新私钥密码 - -```bash -:bin$ ./jdchain-cli.sh keys update -h -Update privkey password. -Usage: jdchain-cli keys update [-hV] [--pretty] [--home=] -n= - -h, --help Show this help message and exit. - --home= Set the home directory. - -n, --name= Name of the key - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `name`,密钥对名称 - -如: -```bash -:bin$ ./jdchain-cli.sh keys update -n k1 -input the current password: -// 输入当前密码 -> 1 -input new password: -// 输入新密码 -> 2 -NAME ALGORITHM ADDRESS PUBKEY -k1 ED25519 LdeP1iczD3zpmcayKAxTfSywict9y2r6Jpq6n 7VeRBamwPeMb7jzTNg3Ap2DscBiy3QE3PK5NqBvv9tUjQVk4 -``` - -#### 删除密钥对 - -```bash -:bin$ ./jdchain-cli.sh keys delete -h -Delete keypair. -Usage: jdchain-cli keys delete [-hV] [--pretty] [--home=] -n= - -h, --help Show this help message and exit. - --home= Set the home directory. - -n, --name= Name of the key - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `name`,密钥对名称 - -如: -```bash -:bin$ ./jdchain-cli.sh keys delete -n k1 -input the current password: > -// 输入当前密码 -2 -[k1] deleted -``` \ No newline at end of file diff --git a/docs/cli/participant.md b/docs/cli/participant.md deleted file mode 100644 index 7f6eb7c7..00000000 --- a/docs/cli/participant.md +++ /dev/null @@ -1,219 +0,0 @@ -### 共识节点变更 - -借助`BFT-SMaRt`共识提供的Reconfig操作元语,`JD Chain`实现了在不停机的情况下快速更新共识网络拓扑,实现添加共识节点,移除共识节点,更新共识信息 等功能。 -```bash -:bin$ ./jdchain-cli.sh participant -h -Usage: jdchain-cli participant [-hV] [--pretty] [--home=] [COMMAND] -Add, update or delete participant. - -h, --help Show this help message and exit. - --home= Set the home directory. - Default: ../ - --pretty Pretty json print - -V, --version Print version information and exit. -Commands: - register Register new participant. - active Active participant. - update Update participant. - inactive Inactive participant. - help Displays help information about the specified command -``` -- `register` [注册新节点](#注册新节点) -- `active` [激活节点](#激活节点) -- `active` [更新节点](#更新节点) -- `inactive` [移除节点](#移除节点) - -#### 注册新节点 - -```bash -:bin$ ./jdchain-cli.sh participant register -h -Register new participant. -Usage: jdchain-cli participant register [-hV] [--ca-mode] [--pretty] - [--crt=] [--gw-host=] - [--gw-port=] [--home=] - [-n=] - --participant-name= - [--pubkey=] - --ca-mode Register with CA - --crt= File of the X509 certificate - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - -n, --name= Name of the key - --participant-name= - Name of the participant - --pretty Pretty json print - --pubkey= Pubkey of the user - -V, --version Print version information and exit. -``` -- `participant-name`,新节点名称 -- `ca-mode`,身份认证模式是否为证书(`CA`)模式,默认`false` -- `name`,当`ca-mode`为`true`时会读取本地`${home}/config/keys/${name}.crt`文件,反之读取`${home}/config/keys/${name}.pub` -- `crt`,证书文件路径 -- `pubkey`,`Base58`编码公钥信息,仅在非`ca-mode`情况下使用 - -注册新节点: -```bash -:bin$ ./jdchain-cli.sh participant register --participant-name node4 --name node4 -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -// 选择账本 -> 0 -// 选择此交易签名用户(必须是链上存在的用户,且有相应操作权限) -select keypair to sign tx, input the index: -0 k1 LdeNq3862vtUCeptww1T5mVvLbAeppYqVNdqD -1 1627618939 LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw -2 node4 LdeNwG6ECEGz57o2ufhwSbnW4C35TvPqANK7T -1 -input password of the key: -> 1 -register participant: [LdeNwG6ECEGz57o2ufhwSbnW4C35TvPqANK7T] -``` -成功在账本`j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg`中注册了新的节点`LdeNwG6ECEGz57o2ufhwSbnW4C35TvPqANK7T` - -可通过[共识节点列表](query.md#共识节点列表)查看新的账本列表: -```bash -:bin$ ./jdchain-cli.sh query participants -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -[{"address":"LdeNwsiuo7n6HULWhNKc87PBXJXAfGKFon9RE","id":2,"name":"2","participantNodeState":"CONSENSUS","pubKey":"7VeRFF1ednwhrFoe5cngKwPUJ2N4iFKD9Jt53GxSCc1MmPQ6"},{"address":"LdeNiXZbsBCsTc2ZGp1PGBX81aUxPekhwEwmY","id":1,"name":"1","participantNodeState":"CONSENSUS","pubKey":"7VeREmuT4fF9yRPEMbSSaNLKbLa3qoTpfGHRgwpnSWUn5tqW"},{"address":"LdeNwG6ECEGz57o2ufhwSbnW4C35TvPqANK7T","id":4,"name":"node4","participantNodeState":"READY","pubKey":"7VeRKiWHcHjNoYH9kJk2fxoJxgBrstVJ7bHRecKewJAKcvUD"},{"address":"LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw","id":0,"name":"0","participantNodeState":"CONSENSUS","pubKey":"7VeRJpb2XX8XKAaC7G5zQg9DbgKM8gmLhUBtGFmerFbhJTZn"},{"address":"LdeP2ji8PR1DPsLt5NoFeiBnhpckrLHgCJge6","id":3,"name":"3","participantNodeState":"CONSENSUS","pubKey":"7VeRGE4V9MR7HgAqTrkxGvJvaaKRZ3fAjHUjYzpNBGcjfAvr"}] -register participant: [LdeNwG6ECEGz57o2ufhwSbnW4C35TvPqANK7T] -``` -可以看出`node4`注册成功,地址为`LdeNwG6ECEGz57o2ufhwSbnW4C35TvPqANK7T` - -#### 激活节点 - -激活节点前请正确配置并启动新节点,以下以刚注册成功的`node4`为例 - -1. 配置`node4` - -解压`peer`压缩包,复制待加入账本其他节点中数据最新的节点数据库数据,然后修改`config/ledger-binding.conf`: -```bash -# Base58编码的账本哈希 -ledger.bindings=<账本hash> -# 账本名字,与账本相关的其他其他peer保持一致 -binding.<账本HASH>.name=<节点名称> -# peer4的名名称,与[向现有共识网络注册新的参与方]操作中保持一致 -binding.<账本hash>.parti.name=<节点名称> -# peer4的用户地址 -binding.<账本hash>.parti.address= -# 新参与方base58编码的私钥,与[向现有共识网络注册新的参与方]操作中保持一致 -binding.<账本hash>.parti.pk=<新参与方base58编码的私钥> -# 新参与方base58编码的私钥读取密码,与[向现有共识网络注册新的参与方]操作中保持一致 -binding.<账本hash>.parti.pwd=<新参与方base58编码的私钥读取密码> -# 新参与方对应的账本数据库连接uri,即peer4的账本数据库存放位置,参照其他peer修改,不可与其他peer混用 -binding.<账本hash>.db.uri=<账本数据库连接> -``` - -2. 启动`node4` -| **一定注意在启动新参与方节点进程之前确保完成了账本数据库的复制工作** - -执行`peer4`中`bin`目录下`peer-startup.sh`脚本启动启动新参与方`peer4`节点进程: -```bash -./peer-startup.sh -``` - -3. 激活新节点 -```bash -:bin$ ./jdchain-cli.sh participant active -h -Active participant. -Usage: jdchain-cli participant active [-hV] [--pretty] [--shutdown] - --consensus-port= - [--home=] --host= - --ledger= --port= - --syn-host= --syn-port= - --consensus-port= - Set the participant consensus port. - -h, --help Show this help message and exit. - --home= Set the home directory. - --host= Set the participant host. - --ledger= Set the ledger. - --port= Set the participant service port. - --pretty Pretty json print - --shutdown Restart the node server. - --syn-host= Set synchronization participant host. - --syn-port= Set synchronization participant port. - -V, --version Print version information and exit. -``` -- `ledger`,账本哈希 -- `host`,新节点地址 -- `port`,新节点服务端口 -- `consensus-port`,新节点共识端口 -- `syn-host`,数据同步节点地址 -- `syn-port`,数据同步节点服务端口 - -在账本`j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg`中激活`node4`(以步骤2中启动的服务地址和端口为`127.0.0.1`和`7084`例),共识端口设置为`10088`,同步节点地址和端口为`127.0.0.1`和`7080`为例: -```bash -:bin$./jdchain-cli.sh participant active --ledger j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg --host 127.0.0.1 --port 7084 --consensus-port 10088 --syn-host 127.0.0.1 --syn-port 7080 -participant activated -``` - -成功后可通过[共识节点列表](query.md#共识节点列表)查询最新共识节点列表状态,`node4`为`CONSENSUS` - -#### 更新节点 - -通过[激活节点](#激活节点)操作除了激活新增的节点外,还可以动态修改已经处于激活状态的共识节点的`IP`和`共识端口`信息,从而实现本机的共识端口变更,不同机器之间进行`账本迁移`。 - -| **在进行节点信息变更时,要求暂停向共识网络中发起新的业务数据上链请求** - -1. 变更共识端口 - -| **操作前请确保变更到的端口未被占用** - -如将`node4`共识端口由`10088`修改为`10188`,操作指令如下: - -```bash -:bin$./jdchain-cli.sh participant update --ledger j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg --host 127.0.0.1 --port 7084 --consensus-port 10188 --syn-host 127.0.0.1 --syn-port 7080 -participant updated -``` -指令成功执行后,`peer1`的共识端口将自动变更为`10188` - -2. 账本迁移 - -账本迁移指将一台机器(`IP`)上的共识节点迁移到另一台机器(`IP`)上,主要操作流程如下: - -| **操作前请确保变更到的端口未被占用** - -如将`node4`共识`IP`由`127.0.0.1`修改为`192.168.1.100`(另一台机器),操作指令如下: - -```bash -:bin$./jdchain-cli.sh participant update --ledger j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg --host 192.168.1.100 --port 7084 --consensus-port 10188 --syn-host 127.0.0.1 --syn-port 7080 -shutdown -participant updated -``` - -**特别注意**:`-shutdown`会停止当前运行的当前账本共识服务,为必填选项,否则可能将导致整个网络需要重启。 - -#### 移除节点 - -``` -:bin$ ./jdchain-cli.sh participant inactive -h -Inactive participant. -Usage: jdchain-cli participant inactive [-hV] [--pretty] --address=
- [--home=] --host= - --ledger= --port= - --syn-host= - --syn-port= - --address=
Set the participant address. - -h, --help Show this help message and exit. - --home= Set the home directory. - --host= Set the participant host. - --ledger= Set the ledger. - --port= Set the participant service port. - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `ledger`,账本哈希 -- `address`,待移除节点共识端口 -- `host`,待移除节点服务地址 -- `port`,待移除节点服务端口 - -如移除`node4`: -```bash -:bin$ ./jdchain-cli.sh participant inactive --ledger j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg --address LdeNwG6ECEGz57o2ufhwSbnW4C35TvPqANK7T --host 127.0.0.1 --port 7084 -participant inactivated -``` - -成功后可通过[共识节点列表](query.md#共识节点列表)查询最新共识节点列表状态,`node4`为`DEACTIVATED` \ No newline at end of file diff --git a/docs/cli/query.md b/docs/cli/query.md deleted file mode 100644 index b1110dae..00000000 --- a/docs/cli/query.md +++ /dev/null @@ -1,915 +0,0 @@ -### 链上信息查询 - -```bash -:bin$ ./jdchain-cli.sh query -h -Usage: jdchain-cli query [-hV] [--pretty] [--gw-host=] - [--gw-port=] [--home=] [COMMAND] -Query commands. - --gw-host= Set the gateway host. Default: 127.0.0.1 - Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - Default: ../ - --pretty Pretty json print - -V, --version Print version information and exit. -Commands: - ledgers Query ledgers. - ledger Query ledger. - participants Query participants. - block Query block. - txs-count Query transactions count. - txs Query transactions. - tx Query transaction. - users Query users. - users-count Query users count. - user Query user. - role-privileges Query role privileges. - user-privileges Query user privileges. - data-accounts-count Query data accounts count. - data-accounts Query data accounts. - data-account Query data account. - kvs-count Query key-values count. - kvs Query kvs. - kv Query kv. - user-event-accounts-count Query user event accounts count. - user-event-accounts Query user event accounts. - user-event-account Query user event account. - user-event-names-count Query user event names count. - user-event-names Query user event names. - user-events-count Query user events count. - user-events Query user events. - latest-user-event Query latest user event. - contracts-count Query contracts count. - contracts Query contracts. - contract Query contract. - help Displays help information about the specified command -``` -查询命令:[账本列表](#账本列表),[账本详情](#账本详情),[共识节点列表](#共识节点列表),[区块详情](#区块详情),[交易总数](#交易总数),[交易列表](#交易列表),[交易详情](#交易详情),[用户总数](#用户总数),[用户列表](#用户列表),[用户详情](#用户详情),[角色权限](#角色权限),[用户权限](#用户权限),[数据账户总数](#数据账户总数),[数据账户列表](#数据账户列表),[数据账户详情](#数据账户详情),[KV总数](#KV总数),[KV列表](#KV列表),[KV详情](#KV详情),[用户事件账户总数](#用户事件账户总数),[用户事件账户列表](#用户事件账户列表),[用户事件账户详情](#用户事件账户详情),[用户事件名总数](#用户事件名总数),[用户事件名列表](#用户事件名列表),[用户事件总数](#用户事件总数),[用户事件列表](#用户事件列表),[最新用户事件](#最新用户事件),[合约总数](#合约总数),[合约列表](#合约列表),[合约详情](#合约详情) - -#### 账本列表 - -```bash -:bin$ ./jdchain-cli.sh query ledgers -j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -``` -返回当前网关服务所有账本列表 - -#### 账本详情 - -选择账本,打印当前账本详细信息: -```bash -:bin$ ./jdchain-cli.sh query ledger -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -{"hash":"j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg","latestBlockHash":"j5n8KGMFsRM7jzf99XK1jDK342fauj3myKcdgPJyLYyxws","latestBlockHeight":18} -``` - -可添加`--pretty`格式化输出`json`数据 - -#### 共识节点列表 - -查询共识节点列表: -```bash -:bin$ ./jdchain-cli.sh query participants -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -[{"address":"LdeNwsiuo7n6HULWhNKc87PBXJXAfGKFon9RE","id":2,"name":"2","participantNodeState":"CONSENSUS","pubKey":"7VeRFF1ednwhrFoe5cngKwPUJ2N4iFKD9Jt53GxSCc1MmPQ6"},{"address":"LdeNiXZbsBCsTc2ZGp1PGBX81aUxPekhwEwmY","id":1,"name":"1","participantNodeState":"CONSENSUS","pubKey":"7VeREmuT4fF9yRPEMbSSaNLKbLa3qoTpfGHRgwpnSWUn5tqW"},{"address":"LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw","id":0,"name":"0","participantNodeState":"CONSENSUS","pubKey":"7VeRJpb2XX8XKAaC7G5zQg9DbgKM8gmLhUBtGFmerFbhJTZn"},{"address":"LdeP2ji8PR1DPsLt5NoFeiBnhpckrLHgCJge6","id":3,"name":"3","participantNodeState":"CONSENSUS","pubKey":"7VeRGE4V9MR7HgAqTrkxGvJvaaKRZ3fAjHUjYzpNBGcjfAvr"}] -``` -账本`j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg`中有四个共识节点,均为`CONSENSUS`状态 - -#### 区块详情 - -```bash -:bin$ ./jdchain-cli.sh query block -h -Query block. -Usage: jdchain-cli query block [-hV] [--pretty] [--gw-host=] - [--gw-port=] [--hash=] - [--height=] [--home=] - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --hash= Block hash - --height= Block height. - --home= Set the home directory. - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `height`,区块高度,默认`-1`查询当前最高区块 - -如: -```bash -:bin$ ./jdchain-cli.sh query block --pretty -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -{ - "adminAccountHash":"j5p5z4es9RPrQWFu2nSJBQFT68byeGqAdUDu63qa5xV8Df", - "contractAccountSetHash":"j5kbvGQ1tFH2GXgk8ThF1co7H2gCrFdeZn7Nibva7Md72P", - "dataAccountSetHash":"j5fSmQkk8tb9v9SYDmaAko3oJJqmCm54HGbQwgbV2nTCVk", - "hash":"j5n8KGMFsRM7jzf99XK1jDK342fauj3myKcdgPJyLYyxws", - "height":18, - "ledgerHash":"j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg", - "previousHash":"j5motWQdmckqTxkG3x8DcE6quv2oGteKzsHqoV89Lfo4Mj", - "timestamp":1627703544928, - "transactionSetHash":"j5rc9PV5p9C8mXDAt8p9MR4QY3VAr4wQNG7zC3MSvFpcGG", - "userAccountSetHash":"j5haZvthy9gGaJ8M3mEbwtpeUg9Z113ifZbcWtzAeQcQdu", - "userEventSetHash":"j5nke9ZAnVRf1Qgg4u9Ske8RoZFbFVzVrKQid14qcqXaAn" -} -``` -返回当前最高区块详情 - -#### 交易总数 - -```bash -:bin$ ./jdchain-cli.sh query txs-count -h -Query transactions count. -Usage: jdchain-cli query txs-count [-hV] [--in-block] [--pretty] - [--gw-host=] [--gw-port=] - --height= [--home=] - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --height= Block height. - --home= Set the home directory. - --in-block In the given block. - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `height`,区块高度 -- `in-block`,是否只统计`height`参数指定区块数据 - -如查询高度`10`区块交易总数(会统计区块`0-10`内所有交易): -```bash -:bin$ ./jdchain-cli.sh query txs-count --height 10 -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -11 -``` - -查询高度`10`区块内交易总数(仅统计区块`10`交易): -```bash -:bin$ ./jdchain-cli.sh query txs-count --height 10 --in-block -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -1 -``` - -#### 交易列表 - -```bash -:bin$ ./jdchain-cli.sh query txs -h -Query transactions. -Usage: jdchain-cli query txs [-hV] [--in-block] [--pretty] --count= - [--gw-host=] [--gw-port=] - [--height=] [--home=] --index= - --count= Transaction item count - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --height= Block height. - --home= Set the home directory. - --in-block In the given block. - --index= Transaction item index - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `height`,区块高度 -- `in-block`,是否只统计`height`参数指定区块数据 -- `index`,查询起始位置 -- `count`,最大返回 - -如查询高度`10`区块交易列表(会统计区块`0-10`内所有交易),从第`0`条开始,最大返回`1`条: -```bash -:bin$ ./jdchain-cli.sh query txs --height 10 --index 0 --count 1 -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -[{"request":{"endpointSignatures":[],"nodeSignatures":[{"digest":"SMHYntB7uTm3N4mReke4srWHhpDkjDFGRuz7Bis8quJt19igevwA4rEwNmZqFGGLMExgmrPvdGrxgRrhLhpxUo1KGW","pubKey":"7VeRJpb2XX8XKAaC7G5zQg9DbgKM8gmLhUBtGFmerFbhJTZn"},{"digest":"SMHbyCLcvds5sRKaWPptSjixxoaiwkQfM1noLGpLSvsmxwUSg4J55UhJtK1ZWiQp3rxy5FEMZpwHGkywexYuwXEWHo","pubKey":"7VeREmuT4fF9yRPEMbSSaNLKbLa3qoTpfGHRgwpnSWUn5tqW"},{"digest":"SMGP3a7GHW6qWbQY3ZXX5UBhHNFLrSkUzRLLfCFA9Gu6CJVoYVvBQjjCEzaYq9ox38DvyZJQFuLWPirV2G6VMeARqQ","pubKey":"7VeRFF1ednwhrFoe5cngKwPUJ2N4iFKD9Jt53GxSCc1MmPQ6"},{"digest":"SMHGzmEVzZPKyvN3zC6nLbVypufWEfd6cFvnMMjuEXFk5WncLeUx4CyAohTnNLP21ksJ6r15usowbkRFeaUYQgJkre","pubKey":"7VeRGE4V9MR7HgAqTrkxGvJvaaKRZ3fAjHUjYzpNBGcjfAvr"}],"transactionContent":{"operations":[{"@type":"com.jd.blockchain.ledger.LedgerInitOperation","initSetting":{"consensusParticipants":[{"address":"LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw","id":0,"name":"0","participantNodeState":"CONSENSUS","pubKey":"7VeRJpb2XX8XKAaC7G5zQg9DbgKM8gmLhUBtGFmerFbhJTZn"},{"address":"LdeNiXZbsBCsTc2ZGp1PGBX81aUxPekhwEwmY","id":1,"name":"1","participantNodeState":"CONSENSUS","pubKey":"7VeREmuT4fF9yRPEMbSSaNLKbLa3qoTpfGHRgwpnSWUn5tqW"},{"address":"LdeNwsiuo7n6HULWhNKc87PBXJXAfGKFon9RE","id":2,"name":"2","participantNodeState":"CONSENSUS","pubKey":"7VeRFF1ednwhrFoe5cngKwPUJ2N4iFKD9Jt53GxSCc1MmPQ6"},{"address":"LdeP2ji8PR1DPsLt5NoFeiBnhpckrLHgCJge6","id":3,"name":"3","participantNodeState":"CONSENSUS","pubKey":"7VeRGE4V9MR7HgAqTrkxGvJvaaKRZ3fAjHUjYzpNBGcjfAvr"}],"consensusProvider":"com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider","consensusSettings":"115kLavjaNTn9Grf9orxPmABexqr5Dvac5LEyhWXbQCd4vEScsxxGTEtyrgDfCwLsNBGYQBj8UGkEPCZNsWNMrH8H2naZUsszwbwnSka6jgahxJepH6jDRMP4X31qxksorr23dpwfemhezwVUbTNyvu54HW76wmtvAyCk7m3DKE1CJhLtDTXAWt8LjqE3xhNXfKZJLT2np69nKDqi41hGVYjZfPz4ZmUzuo34ae3syvgKDPYJCNscSP7UoJgvk142x7ggy8KX2bbENZSUSdbV9qLzPDfsdnkLFDzyDJjd6wMxdzV4Tb9fh5WvkciYyh1SE2Ew7peoaLmUDEULd9LKCKmJYXhPCmbbjxecLYvtcUoarGMHKpHKxDAQZjsX3ik5o8B1WwnQG8VazZEZbepDVtX8p1T7TGryXJUZfGZ6ajKX8shE2PpvkjWTMXgW1ebwPKLziqpzxcBLy1pBTtwztgnexbzCGCUYTgS9FiEfn3aRuhHKhzHfAe6gH6Lkk4PQWeAKScPrG1PzQKNRpxJfxZJV3ZBEesDvV85i2HT829tvATUfdUK8s5Zhy9TT33ZrkkC3QWH6saFBCCHyq9gUGrMgWXi5jn5D2GqNwWFJSvDXRNzYArvqkcqCB5gzfP23kYq9RKVvonvtmhww5hdLGzHdSU19dghHkyvbYi4VSFT57QQET7z7qvQYSNxDbCWNfn2osNipdMmFWY7AVetZvkowQPEZqr5xYV8j9pawam4WETomeeEPb11BhXXmyBbhuJx3xpNPcfFHE2Y52NcM7LdLxpmkdBgpFTdLh5Y3mGup6opJWp8WzXzi5zHsM5eXxyfq2uQ9ttQB5KPwTi1wgAskDdcgYRtH3MmVMB1MBHVAGAu2asZpRWXnZT39iPzshzJRck1PC2yhiYq8We5wfMgoA4KDPxp55wwWNtPpC1fBpjsNuLtqiHYSdZxTy32dASA1Zmm3XPFhPm6vcbCcod2n4uUSK2Vv9gMtzVVmprstVoB47whfhvgerfPiHMEJemeG5sF5vKcxMrpAxZtM4sHNMJf9xPucMTUzyWcSbyvSsRshFjnHRAEhSGHSCzRrjsTiLo2KZyLrzyBBc6DqdwdNC1RnmgirS1baaL2xTg3jkQystmH5VNJ5EQRVPqKQeSDXw9tUAHqMyknmL4zdZJjkfnw7rRXueQayHsfH4FGodGoNxJdYkbyjrYyrQZM8BeCLYHEqEyxKyAJHGm2kt96Cj8v6z9Ezv6CRh8ZZgnQBSvVvWtK1NWmjA1ZAf6fNv3KAEUsXfM6fy37HrThd9tqH32S25b3GeFJh8evnVou33hqK7JNwEk6o4ymwNWjuWMzqjp4Ag7jrFe5h5HG1J8NZg1KZKLvK2PChyR1oyNz1dH6RkguEz6XENhWLnmiuzPPbN4RrXSWWbgtjjbgM7megLEB5J8AqBnKR7RM1Gt3KB41xQx1F3yLCkhVXwYFUijdMtCNwCQKdBRSB9K6fBoSXbFcxzBFhNVc4x6g3CdZzC8F2Yewa1eZubcsZYyeVCSX6x1wBeocpZwsy2b9KxTQevuHuhJ1fpLjTLBFcfqbaC3NxGr2Q391fPzUsNTNvybsh7vySRyFtskYJ4ZJnUrviHUgnk7AbsBjKMxweaMur3ykm5dGgvTJT2EgbuqCNFPpcV2w1v6fFnALYMipvHWtszY4JSC8T5JERVhttBY9esq1dzoddpMNuKJvqkASaRDADJ6muMjDgXUeYkNtqftCohLxNPz4r49jbmeaFJgqdNCWEbdE4SqBeJpLjsUUfcpeNRXmJkCD8G9kV4njBniJP5pgoU1CDNYjDgAjvXx6kzSnEmtYGdzRCbmkUUPEJaXMVi3UnjmbRWcnkt979xwepW7KyhpvrWmxHrsqge6YfPLNbfNB5xohVuAbQkJgS5b1S8SJGDs1DEG1hxzEpby4HVBDehyzUZjSKKfJeh3NzkJ9khswYJ5jCZgjrwndf8kLKNbgVpTxoipSVPyswavLpE6BQ271GHatniVZFyRqFD4NnZ6a9LvwB5LdfRziXoUUF6wejAx7oy6yw5bF1LzAuZogAjRVbGXZ2wR4LYf4FszM8R2G6UEzNGW3jiXNG7iUJJV1orfjgdJHAFh2miDojxi3iRL1WnQSuYcj5jtse85m2iMWsB7USrMoFzkSuh7ST4VoNvLEr2SugYxuek8pcVCKvKiBbZXTwEEDSh59R2cYSZJ6uGSKy2BJyizb3ShUdbp8gMzVN9jdbDnTkfFyz8jzySes58gs8M8J9m4P1cxNYNXm7aZLroUZhw2iUS5tzq5ttxYVT7oQoBUrQiAwfzGv55Pbthbq4A7NaiihbhUHFGAFpkmLM9T4vMWsi7","createdTime":1627618941000,"cryptoSetting":{"autoVerifyHash":true,"hashAlgorithm":8216,"supportedProviders":[{"algorithms":[{},{},{},{},{},{},{}],"name":"com.jd.blockchain.crypto.service.classic.ClassicCryptoService"},{"algorithms":[{},{},{}],"name":"com.jd.blockchain.crypto.service.sm.SMCryptoService"}]},"ledgerSeed":"kULN7uzXyZuC7rD9BMLIgA==","ledgerStructureVersion":-1}},{"@type":"com.jd.blockchain.ledger.UserRegisterOperation","userID":{"address":"LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw","pubKey":"7VeRJpb2XX8XKAaC7G5zQg9DbgKM8gmLhUBtGFmerFbhJTZn"}},{"@type":"com.jd.blockchain.ledger.UserRegisterOperation","userID":{"address":"LdeNiXZbsBCsTc2ZGp1PGBX81aUxPekhwEwmY","pubKey":"7VeREmuT4fF9yRPEMbSSaNLKbLa3qoTpfGHRgwpnSWUn5tqW"}},{"@type":"com.jd.blockchain.ledger.UserRegisterOperation","userID":{"address":"LdeNwsiuo7n6HULWhNKc87PBXJXAfGKFon9RE","pubKey":"7VeRFF1ednwhrFoe5cngKwPUJ2N4iFKD9Jt53GxSCc1MmPQ6"}},{"@type":"com.jd.blockchain.ledger.UserRegisterOperation","userID":{"address":"LdeP2ji8PR1DPsLt5NoFeiBnhpckrLHgCJge6","pubKey":"7VeRGE4V9MR7HgAqTrkxGvJvaaKRZ3fAjHUjYzpNBGcjfAvr"}},{"@type":"com.jd.blockchain.ledger.RolesConfigureOperation","roles":[{"disableLedgerPermissions":[],"disableTransactionPermissions":[],"enableLedgerPermissions":["CONFIGURE_ROLES","AUTHORIZE_USER_ROLES","SET_CONSENSUS","SET_CRYPTO","REGISTER_PARTICIPANT","REGISTER_USER","REGISTER_DATA_ACCOUNT","REGISTER_CONTRACT","UPGRADE_CONTRACT","SET_USER_ATTRIBUTES","WRITE_DATA_ACCOUNT","APPROVE_TX","CONSENSUS_TX","REGISTER_EVENT_ACCOUNT","WRITE_EVENT_ACCOUNT"],"enableTransactionPermissions":["DIRECT_OPERATION","CONTRACT_OPERATION"],"roleName":"DEFAULT"}]},{"@type":"com.jd.blockchain.ledger.UserAuthorizeOperation","userRolesAuthorizations":[{"authorizedRoles":[],"policy":"UNION","unauthorizedRoles":[],"userAddresses":["LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw"]}]},{"@type":"com.jd.blockchain.ledger.UserAuthorizeOperation","userRolesAuthorizations":[{"authorizedRoles":[],"policy":"UNION","unauthorizedRoles":[],"userAddresses":["LdeNiXZbsBCsTc2ZGp1PGBX81aUxPekhwEwmY"]}]},{"@type":"com.jd.blockchain.ledger.UserAuthorizeOperation","userRolesAuthorizations":[{"authorizedRoles":[],"policy":"UNION","unauthorizedRoles":[],"userAddresses":["LdeNwsiuo7n6HULWhNKc87PBXJXAfGKFon9RE"]}]},{"@type":"com.jd.blockchain.ledger.UserAuthorizeOperation","userRolesAuthorizations":[{"authorizedRoles":[],"policy":"UNION","unauthorizedRoles":[],"userAddresses":["LdeP2ji8PR1DPsLt5NoFeiBnhpckrLHgCJge6"]}]}],"timestamp":1627618941000},"transactionHash":"j5vJGDBQLi6Vo5Gxtsab1vyL2TFaf1NoXDi6Xv2uvCcj9T"},"result":{"blockHeight":0,"dataSnapshot":{"adminAccountHash":"j5u4gqeAkKb3DoELpXP9bDgAxCVRQgKsguPvE1Wc9re1UT","userAccountSetHash":"j5hzkPPBJAqKs4rLWbEiFhbh1VW6Jc2xk878X5A6JywPnC"},"executionState":"SUCCESS","transactionHash":"j5vJGDBQLi6Vo5Gxtsab1vyL2TFaf1NoXDi6Xv2uvCcj9T"}}] -``` - -查询高度`10`区块内交易列表(仅统计区块`10`交易),从第`0`条开始,最大返回`1`: -```bash -:bin$ ./jdchain-cli.sh query txs --height 10 --index 0 --count 1 --in-block -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -[{"request":{"endpointSignatures":[{"digest":"SMKgce34AxQ8JEDDZY3x7iMvbL5QymiC93XPWqSirUB2AN8rvx18ynDS9f1zFA6QyXQNowA1XNhaLWnArrt7JHHxhY","pubKey":"7VeRJpb2XX8XKAaC7G5zQg9DbgKM8gmLhUBtGFmerFbhJTZn"}],"nodeSignatures":[{"digest":"SMKgce34AxQ8JEDDZY3x7iMvbL5QymiC93XPWqSirUB2AN8rvx18ynDS9f1zFA6QyXQNowA1XNhaLWnArrt7JHHxhY","pubKey":"7VeRJpb2XX8XKAaC7G5zQg9DbgKM8gmLhUBtGFmerFbhJTZn"}],"transactionContent":{"ledgerHash":"j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg","operations":[{"@type":"com.jd.blockchain.ledger.DataAccountKVSetOperation","accountAddress":"LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC","writeSet":[{"expectedVersion":-1,"key":"k1","value":{"bytes":"djE=","type":"TEXT"}}]}],"timestamp":1627632026435},"transactionHash":"j5fo2aAwp2tsneHm4wE8AnWLV7CKyax7BLWJqJm2V3WsrD"},"result":{"blockHeight":10,"dataSnapshot":{"adminAccountHash":"j5p5z4es9RPrQWFu2nSJBQFT68byeGqAdUDu63qa5xV8Df","dataAccountSetHash":"j5fSmQkk8tb9v9SYDmaAko3oJJqmCm54HGbQwgbV2nTCVk","userAccountSetHash":"j5mwiewVaxPLYQciovrB9nShWD5nr7YYFopbmWx28jqiFH","userEventSetHash":"j5wf9v6ixDDSD2gRi47r3vomkmTaRCqSLNbaNxrKcVdtD7"},"executionState":"SUCCESS","transactionHash":"j5fo2aAwp2tsneHm4wE8AnWLV7CKyax7BLWJqJm2V3WsrD"}}] -``` - -#### 交易详情 - -```bash -e:bin$ ./jdchain-cli.sh query tx -h -Query transaction. -Usage: jdchain-cli query tx [-hV] [--pretty] [--gw-host=] - [--gw-port=] [--hash=] [--home=] - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --hash= Transaction hash - --home= Set the home directory. - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `hash`,交易哈希 - -如查询交易`j5fo2aAwp2tsneHm4wE8AnWLV7CKyax7BLWJqJm2V3WsrD`详情: -```bash -:bin$ ./jdchain-cli.sh query tx --hash j5fo2aAwp2tsneHm4wE8AnWLV7CKyax7BLWJqJm2V3WsrD -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -{"request":{"endpointSignatures":[{"digest":"SMKgce34AxQ8JEDDZY3x7iMvbL5QymiC93XPWqSirUB2AN8rvx18ynDS9f1zFA6QyXQNowA1XNhaLWnArrt7JHHxhY","pubKey":"7VeRJpb2XX8XKAaC7G5zQg9DbgKM8gmLhUBtGFmerFbhJTZn"}],"nodeSignatures":[{"digest":"SMKgce34AxQ8JEDDZY3x7iMvbL5QymiC93XPWqSirUB2AN8rvx18ynDS9f1zFA6QyXQNowA1XNhaLWnArrt7JHHxhY","pubKey":"7VeRJpb2XX8XKAaC7G5zQg9DbgKM8gmLhUBtGFmerFbhJTZn"}],"transactionContent":{"ledgerHash":"j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg","operations":[{"@type":"com.jd.blockchain.ledger.DataAccountKVSetOperation","accountAddress":"LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC","writeSet":[{"expectedVersion":-1,"key":"k1","value":{"bytes":"djE=","type":"TEXT"}}]}],"timestamp":1627632026435},"transactionHash":"j5fo2aAwp2tsneHm4wE8AnWLV7CKyax7BLWJqJm2V3WsrD"},"result":{"blockHeight":10,"dataSnapshot":{"adminAccountHash":"j5p5z4es9RPrQWFu2nSJBQFT68byeGqAdUDu63qa5xV8Df","dataAccountSetHash":"j5fSmQkk8tb9v9SYDmaAko3oJJqmCm54HGbQwgbV2nTCVk","userAccountSetHash":"j5mwiewVaxPLYQciovrB9nShWD5nr7YYFopbmWx28jqiFH","userEventSetHash":"j5wf9v6ixDDSD2gRi47r3vomkmTaRCqSLNbaNxrKcVdtD7"},"executionState":"SUCCESS","transactionHash":"j5fo2aAwp2tsneHm4wE8AnWLV7CKyax7BLWJqJm2V3WsrD"}} -``` - -#### 用户总数 - -查询用户总数: -```bash -:bin$ ./jdchain-cli.sh query users-count -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -10 -``` -当前区块链网络共有`10`个用户 - -#### 用户列表 - -```bash -:bin$ ./jdchain-cli.sh query users -h -Query users. -Usage: jdchain-cli query users [-hV] [--pretty] --count= - [--gw-host=] [--gw-port=] - [--home=] --index= - --count= User item count - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --index= User item index - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `index`,起始位置 -- `count`,最大返回 - -如分页查询用户列表,从第`0`个开始,最大返回`10`条: -```bash -:bin$ ./jdchain-cli.sh query users --index 0 --count 10 -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -ADDRESS PUBKEY -LdeP2ji8PR1DPsLt5NoFeiBnhpckrLHgCJge6 7VeRGE4V9MR7HgAqTrkxGvJvaaKRZ3fAjHUjYzpNBGcjfAvr -LdeNq3862vtUCeptww1T5mVvLbAeppYqVNdqD 7VeRGuwP2iUykAL4beftP1DuDTj7y2uFGEM6mx3Dy7YSm2j1 -LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC 7VeRFk4ANQHjWjAmAoL7492fuykTpXujihJeAgbXT2J9H9Yk -LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw 7VeRJpb2XX8XKAaC7G5zQg9DbgKM8gmLhUBtGFmerFbhJTZn -LdeNwTWpyzqioLURrHQuoGcnwA6YLiFWn3LNn 7VeRH7BsRntvJmomjw7YvF5HZVsSMb48GKzPnAP7iekRCLGq -LdeNiXZbsBCsTc2ZGp1PGBX81aUxPekhwEwmY 7VeREmuT4fF9yRPEMbSSaNLKbLa3qoTpfGHRgwpnSWUn5tqW -LdeNisM5oTypwPYv9tnhFNosRjCyXzzViU4SA 7VeREyEcDcY85DRdWAEsmJ4Moh89eE21AU2LEDbYG3t3MrGo -LdeNqvSjL4izfpMNsGpQiBpTBse4g6qLxZ6j5 7VeRFd2LB8ZmYnVNc2pux5TwVqHv3pwT6JXoF3fzDon9bSXK -LdeNwsiuo7n6HULWhNKc87PBXJXAfGKFon9RE 7VeRFF1ednwhrFoe5cngKwPUJ2N4iFKD9Jt53GxSCc1MmPQ6 -LdeNufGZewrvS7sE4VWC9m1SFkPqVwjBN87LB 7VeRMGBMMBQVoZQTU3mcJYGgbVcQzxXiq6NK69TaCjEoktLf -``` -返回`10`个用户的地址和公私钥信息 - -| 由于`JD Chain`网络并不保证用户(数据账户/事件账户/合约账户)按创建顺序排列,所以当有新的用户注册后,前后两次相同参数的查询数据可能不一致!!! - -#### 用户详情 - -```bash -:bin$ ./jdchain-cli.sh query user -h -Query user. -Usage: jdchain-cli query user [-hV] [--pretty] --address=
- [--gw-host=] [--gw-port=] - [--home=] - --address=
User address - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `address`,用户地址 - -根据地址`LdeNufGZewrvS7sE4VWC9m1SFkPqVwjBN87LB`查询用户详情: -```bash -:bin$ ./jdchain-cli.sh query user --address LdeNufGZewrvS7sE4VWC9m1SFkPqVwjBN87LB -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -{"address":"LdeNufGZewrvS7sE4VWC9m1SFkPqVwjBN87LB","pubKey":"7VeRMGBMMBQVoZQTU3mcJYGgbVcQzxXiq6NK69TaCjEoktLf"} -``` - -#### 角色权限 - -```bash -:bin$ ./jdchain-cli.sh query role-privileges -h -Query role privileges. -Usage: jdchain-cli query role-privileges [-hV] [--pretty] [--gw-host=] - [--gw-port=] [--home=] --role= - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --pretty Pretty json print - --role= Role name - -V, --version Print version information and exit. -``` -- `role`,角色名称 - -查询角色`ROLE1`权限信息: -```bash -:bin$ ./jdchain-cli.sh query role-privileges --role ROLE1 -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -{"ledgerPrivilege":{"permissionCount":2,"privilege":["REGISTER_USER","REGISTER_DATA_ACCOUNT"]},"transactionPrivilege":{"permissionCount":2,"privilege":["DIRECT_OPERATION","CONTRACT_OPERATION"]}} -``` - -#### 用户权限 - -```bash -:bin$ ./jdchain-cli.sh query user-privileges -h -Query user privileges. -Usage: jdchain-cli query user-privileges [-hV] [--pretty] --address=
- [--gw-host=] [--gw-port=] [--home=] - --address=
User address - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `address`,用户地址 - -查询用户`LdeNufGZewrvS7sE4VWC9m1SFkPqVwjBN87LB`权限信息: -```bash -:bin$ ./jdchain-cli.sh query user-privileges --address LdeNufGZewrvS7sE4VWC9m1SFkPqVwjBN87LB -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -{"ledgerPrivilegesBitset":{"privilege":["CONFIGURE_ROLES","AUTHORIZE_USER_ROLES","SET_CONSENSUS","SET_CRYPTO","REGISTER_PARTICIPANT","REGISTER_USER","REGISTER_DATA_ACCOUNT","REGISTER_CONTRACT","UPGRADE_CONTRACT","SET_USER_ATTRIBUTES","WRITE_DATA_ACCOUNT","APPROVE_TX","CONSENSUS_TX","REGISTER_EVENT_ACCOUNT","WRITE_EVENT_ACCOUNT"]},"transactionPrivilegesBitset":{"privilege":["DIRECT_OPERATION","CONTRACT_OPERATION"]},"userAddress":"LdeNufGZewrvS7sE4VWC9m1SFkPqVwjBN87LB","userRole":["DEFAULT"]} -``` - -#### 数据账户总数 - -查询数据账户总数: -```bash -:bin$ ./jdchain-cli.sh query data-accounts-count -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -1 -``` -当前账本共有一个数据账户 - -#### 数据账户列表 - -```bash -:bin$ ./jdchain-cli.sh query data-accounts -h -Query data accounts. -Usage: jdchain-cli query data-accounts [-hV] [--pretty] --count= - [--gw-host=] - [--gw-port=] [--home=] - --index= - --count= Data account item count - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --index= Data account item index - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `index`,起始位置 -- `count`,最大返回 - -如分页查询数据账户列表,从第`0`个开始,最大返回`10`条: -```bash -:bin$ ./jdchain-cli.sh query data-accounts --index 0 --count 10 -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -ADDRESS PUBKEY -LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC 7VeRFk4ANQHjWjAmAoL7492fuykTpXujihJeAgbXT2J9H9Yk -``` -返回数据账户的地址和公私钥信息 - -#### 数据账户详情 - -```bash -:bin$ ./jdchain-cli.sh query data-account -h -Query data account. -Usage: jdchain-cli query data-account [-hV] [--pretty] --address=
- [--gw-host=] [--gw-port=] - [--home=] - --address=
Data account address - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `address`,数据账户地址 - -查询数据账户`LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC`详情: -```bash -:bin$ ./jdchain-cli.sh query data-account --address LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -{"address":"LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC","dataRootHash":"j5vyv6SmvSXQNKyjsEVCQJsyqXxKGZMBU62fKvtdJm2W4y","headerRootHash":"j5sA2KPgY9vidgTUCjCJiscn2CXapgSJsVnWe54xXKohej","pubKey":"7VeRFk4ANQHjWjAmAoL7492fuykTpXujihJeAgbXT2J9H9Yk"} -``` - -#### KV总数 - -```bash -:bin$ ./jdchain-cli.sh query kvs-count -h -Query key-values count. -Usage: jdchain-cli query kvs-count [-hV] [--pretty] --address=
- [--gw-host=] [--gw-port=] - [--home=] - --address=
Data account address - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `address`,数据账户地址 - -查询数据账户`LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC`中`kv`数据总数: -```bash -:bin$ ./jdchain-cli.sh query kvs-count --address LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -1 -``` -共有一个`kv` - -#### KV列表 - -```bash -:bin$ ./jdchain-cli.sh query kvs -h -Query kvs. -Usage: jdchain-cli query kvs [-hV] [--pretty] --address=
- --count= [--gw-host=] - [--gw-port=] [--home=] - --index= - --address=
Data account address - --count= KV item count - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --index= KV item index - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `address`,数据账户地址 -- `index`,起始位置 -- `count`,最大返回 - -如分页查询数据账户`LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC`中`kv`列表,从第`0`个开始,最大返回`10`条: -```bash -:bin$ ./jdchain-cli.sh query kvs --address LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC --index 0 --count 10 -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -{"key":"k1","type":"TEXT","value":"v1","version":0} -``` - -#### KV详情 - -```bash -:bin$ ./jdchain-cli.sh query kv -h -Query kv. -Usage: jdchain-cli query kv [-hV] [--pretty] --address=
- [--gw-host=] [--gw-port=] - [--home=] --key= - --address=
Data account address - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --key= Key - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `address`,数据账户地址 -- `key`,`key` - -查询数据账户`LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC`中`k1`最新数据: -```bash -:bin$ ./jdchain-cli.sh query kv --address LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC --key k1 -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -{"key":"k1","type":"TEXT","value":"v1","version":0} -``` - -#### 用户事件账户总数 - -查询数据账户总数: -```bash -:bin$ ./jdchain-cli.sh query user-event-accounts-count -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -4 -``` -当前账本共有`4`个数据账户 - -#### 用户事件账户列表 - -```bash -:bin$ ./jdchain-cli.sh query user-event-accounts -h -Query user event accounts. -Usage: jdchain-cli query user-event-accounts [-hV] [--pretty] --count= - [--gw-host=] [--gw-port=] [--home=] --index= - --count= Event account item count - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --index= Event account item index - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `index`,起始位置 -- `count`,最大返回 - -如分页查询用户事件账户列表,从第`0`个开始,最大返回`10`条: -```bash -:bin$ ./jdchain-cli.sh query user-event-accounts --index 0 --count 10 -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -ADDRESS PUBKEY -LdeNhAxxXjbh56LqeB7xHpgZgHG6GDTZ45GgJ 7VeR82o3hZy1AVEjmxfNpHHW3d1zabbELmJUnijGkKJNDXu5 -LdeP33nxsYxYgaELQUkd8tBsTmwrkySiqnAVF 7VeRBA5zD2EDCiRtsiHzMQUEPf52hjKwhAi6PfNCgoiRQrSw -LdeNnDJyqYgxDernBf6Vh68CkM5FbJNYtQCPA 7VeRB71W3anhCBretEP2R9YjiFB7ne2o5qhsivPo3XmHZ7cJ -LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC 7VeRFk4ANQHjWjAmAoL7492fuykTpXujihJeAgbXT2J9H9Yk -``` -返回用户事件账户的地址和公私钥信息 - -#### 用户事件账户详情 - -```bash -:bin$ ./jdchain-cli.sh query user-event-account -h -Query user event account. -Usage: jdchain-cli query user-event-account [-hV] [--pretty] - --address=
[--gw-host=] [--gw-port=] - [--home=] - --address=
Event account address - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `address`,用户事件账户地址 - -查询事件账户`LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC`详情: -```bash -:bin$ ./jdchain-cli.sh query user-event-account --address LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -{"address":"LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC","pubKey":"7VeRFk4ANQHjWjAmAoL7492fuykTpXujihJeAgbXT2J9H9Yk"} -``` - -#### 用户事件名总数 - -```bash -:bin$ ./jdchain-cli.sh query user-event-names-count -h -Query user event names count. -Usage: jdchain-cli query user-event-names-count [-hV] [--pretty] - --address=
[--gw-host=] [--gw-port=] - [--home=] - --address=
Event account address - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `address`,用户事件账户地址 - -查询事件账户`LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC`事件名总数: -```bash -:bin$ ./jdchain-cli.sh query user-event-names-count --address LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -1 -``` - -#### 用户事件名列表 - -```bash -:bin$ ./jdchain-cli.sh query user-event-names -h -Query user event names. -Usage: jdchain-cli query user-event-names [-hV] [--pretty] --address=
- --count= [--gw-host=] [--gw-port=] - [--home=] --index= - --address=
Event account address - --count= Event name item count - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --index= Event name item index - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `address`,事件账户地址 -- `index`,起始位置 -- `count`,最大返回 - -如分页查询用户事件账户`LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC`事件名列表,从第`0`个开始,最大返回`10`条: -```bash -:bin$ ./jdchain-cli.sh query user-event-names --address LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC --index 0 --count 10 -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -t1 -``` -当前事件账户仅有一个事件名 - -#### 用户事件总数 - -```bash -:bin$ ./jdchain-cli.sh query user-events-count -h -Query user events count. -Usage: jdchain-cli query user-events-count [-hV] [--pretty] --address=
- [--gw-host=] [--gw-port=] [--home=] --name= - --address=
Event account address - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --name= Event name - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `address`,事件账户地址 -- `name`,事件名 - -查询事件账户`LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC`事件名`t1`中事件总数: -```bash -:bin$ ./jdchain-cli.sh query user-events-count --address LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC --name t1 -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -1 -``` -当前事件名仅有一个事件 - -#### 用户事件列表 - -```bash -:bin$ ./jdchain-cli.sh query user-events -h -Query user events. -Usage: jdchain-cli query user-events [-hV] [--pretty] --address=
- --count= [--gw-host=] - [--gw-port=] [--home=] - --index= --name= - --address=
Event account address - --count= Event name item count - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --index= Event name item index - --name= Event name - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `address`,事件账户地址 -- `name`,事件名 -- `index`,起始位置 -- `count`,最大返回 - -分页查询用户事件账户`LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC`事件名`t1`中事件,从第`0`个开始,最大返回`10`条: -```bash -:bin$ ./jdchain-cli.sh query user-events --address LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC --name t1 --index 0 --count 10 -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -{"blockHeight":12,"content":{"bytes":"YzE=","type":"TEXT"},"contractSource":"","eventAccount":"LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC","name":"t1","sequence":0,"transactionSource":"j5jSszhiJUTbCGtFgxd6uBWyxj56CEHRyhDF6nAnUvJTp7"} -``` - -#### 最新用户事件 - -```bash -:bin$ ./jdchain-cli.sh query latest-user-event -h -Query latest user event. -Usage: jdchain-cli query latest-user-event [-hV] [--pretty] --address=
- [--gw-host=] [--gw-port=] [--home=] --name= - --address=
Event account address - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --name= Event name - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `address`,时间账户地址 -- `name`,事件名 - -查询用户事件账户`LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC`事件名`t1`最新事件: -```bash -:bin$ ./jdchain-cli.sh query latest-user-event --address LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC --name t1 -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -{"blockHeight":12,"content":{"bytes":"YzE=","type":"TEXT"},"contractSource":"","eventAccount":"LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC","name":"t1","sequence":0,"transactionSource":"j5jSszhiJUTbCGtFgxd6uBWyxj56CEHRyhDF6nAnUvJTp7"} -``` - -#### 合约总数 - -查询合约总数: -```bash -:bin$ ./jdchain-cli.sh query contracts-count -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -1 -``` -当前账本仅有一个合约 - -#### 合约列表 - -```bash -:bin$ ./jdchain-cli.sh query contracts -h -Query contracts. -Usage: jdchain-cli query contracts [-hV] [--pretty] --count= - [--gw-host=] [--gw-port=] - [--home=] --index= - --count= Contract item count - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --index= Contract item index - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `index`,起始位置 -- `count`,最大返回 - -分页查询合约,从第`0`个开始,最大返回`10`条: -```bash -:bin$ ./jdchain-cli.sh query contracts --index 0 --count 10 -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -ADDRESS PUBKEY -LdeNyF6jdNry5iCqmHdAFTQPvC8UkbJ9avoXH 7VeRFZEqSdXWQxaLUFaAgJVdVTssuwQdBg4KPGgCCTbrzqxA -``` -返回合约地址和公钥信息 - -#### 合约详情 - -```bash -e:bin$ ./jdchain-cli.sh query contract -h -Query contract. -Usage: jdchain-cli query contract [-hV] [--pretty] --address=
- [--gw-host=] [--gw-port=] - [--home=] - --address=
Contract address - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `address`,合约地址 - -查询合约`LdeNyF6jdNry5iCqmHdAFTQPvC8UkbJ9avoXH`详情: -```bash -:bin$ ./jdchain-cli.sh query contract --address LdeNyF6jdNry5iCqmHdAFTQPvC8UkbJ9avoXH -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -package com.jdchain.samples.contract; - -import com.jd.blockchain.contract.*; -import utils.*; -import com.jd.blockchain.crypto.*; -import com.jd.blockchain.ledger.*; - -public class SampleContractImpl implements EventProcessingAware, SampleContract -{ - private ContractEventContext eventContext; - - public void setKVWithVersion(final String address, final String key, final String value, final long version) { - this.eventContext.getLedger().dataAccount(Bytes.fromBase58(address)).setText(key, value, version); - } - - public void setKV(final String address, final String key, final String value) { - final TypedKVEntry[] entries = this.eventContext.getUncommittedLedger().getDataEntries(address, new String[] { key }); - long version = -1L; - if (null != entries && entries.length > 0) { - version = entries[0].getVersion(); - } - this.eventContext.getLedger().dataAccount(Bytes.fromBase58(address)).setText(key, value, version); - } - - public String registerUser(final String seed) { - final CryptoAlgorithm algorithm = Crypto.getAlgorithm("ed25519"); - final SignatureFunction signFunc = Crypto.getSignatureFunction(algorithm); - final AsymmetricKeypair cryptoKeyPair = signFunc.generateKeypair(seed.getBytes()); - final BlockchainKeypair keypair = new BlockchainKeypair(cryptoKeyPair.getPubKey(), cryptoKeyPair.getPrivKey()); - this.eventContext.getLedger().users().register(keypair.getIdentity()); - return keypair.getAddress().toBase58(); - } - - public String registerDataAccount(final String seed) { - final CryptoAlgorithm algorithm = Crypto.getAlgorithm("ed25519"); - final SignatureFunction signFunc = Crypto.getSignatureFunction(algorithm); - final AsymmetricKeypair cryptoKeyPair = signFunc.generateKeypair(seed.getBytes()); - final BlockchainKeypair keypair = new BlockchainKeypair(cryptoKeyPair.getPubKey(), cryptoKeyPair.getPrivKey()); - this.eventContext.getLedger().dataAccounts().register(keypair.getIdentity()); - return keypair.getAddress().toBase58(); - } - - public String registerEventAccount(final String seed) { - final CryptoAlgorithm algorithm = Crypto.getAlgorithm("ed25519"); - final SignatureFunction signFunc = Crypto.getSignatureFunction(algorithm); - final AsymmetricKeypair cryptoKeyPair = signFunc.generateKeypair(seed.getBytes()); - final BlockchainKeypair keypair = new BlockchainKeypair(cryptoKeyPair.getPubKey(), cryptoKeyPair.getPrivKey()); - this.eventContext.getLedger().eventAccounts().register(keypair.getIdentity()); - return keypair.getAddress().toBase58(); - } - - public void publishEventWithSequence(final String address, final String topic, final String content, final long sequence) { - this.eventContext.getLedger().eventAccount(Bytes.fromBase58(address)).publish(topic, content, sequence); - } - - public void publishEvent(final String address, final String topic, final String content) { - final Event event = this.eventContext.getUncommittedLedger().getLatestEvent(address, topic); - long sequence = -1L; - if (null != event) { - sequence = event.getSequence(); - } - this.eventContext.getLedger().eventAccount(Bytes.fromBase58(address)).publish(topic, content, sequence); - } - - public void beforeEvent(final ContractEventContext eventContext) { - this.eventContext = eventContext; - } - - public void postEvent(final ContractEventContext eventContext, final Exception error) { - } -} - -``` \ No newline at end of file diff --git a/docs/cli/tx.md b/docs/cli/tx.md deleted file mode 100644 index e253542b..00000000 --- a/docs/cli/tx.md +++ /dev/null @@ -1,872 +0,0 @@ -### 交易 - -```bash -:bin$ ./jdchain-cli.sh tx -h -Usage: jdchain-cli tx [-hV] [--pretty] [--export=] [--gw-host=] - [--gw-port=] [--home=] [COMMAND] -Build, sign or send transaction. - --export= Transaction export directory - --gw-host= Set the gateway host. Default: 127.0.0.1 - Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - Default: ../ - --pretty Pretty json print - -V, --version Print version information and exit. -Commands: - root-ca Update ledger root certificates. - user-register Register new user. - user-ca Update user certificate. - user-state Update user(certificate) state. - role Create or config role. - authorization User role authorization. - data-account-register Register new data account. - data-account-permission Update data account permission. - kv Set key-value. - event-account-register Register event account. - event-account-permission Update event account permission. - event Publish event. - event-listen Subscribe event. - contract-deploy Deploy or update contract. - contract-permission Update contract permission. - contract Call contract method. - contract-state Update contract state. - sign Sign transaction. - send Send transaction. - help Displays help information about the specified - command -``` - -参数: -- `export`,导出交易到指定位置,用于离线交易相关命令 -- `gw-host`,网关服务地址,默认`127.0.0.1` -- `gw-port`,网关服务端口,默认`8080` -- `home`,指定密钥存储相关目录,`${home}/config/keys` - -命令: -- `root-ca`,[更新账本根证书](#更新账本根证书) -- `user-register`,[注册用户](#注册用户) -- `user-ca`,[更新用户证书](#更新用户证书) -- `user-state`,[更新用户(证书)状态](#更新用户(证书)状态) -- `role`,[角色管理](#角色管理) -- `authorization`,[权限配置](#权限配置) -- `data-account-register`,[注册数据账户](#注册数据账户) -- `data-account-permission`,[修改数据账户权限](#修改数据账户权限) -- `kv`,[KV设值](#KV设值) -- `event-account-register`,[注册事件账户](#注册事件账户) -- `event-account-permission`,[修改事件账户权限](#修改事件账户权限) -- `event`,[发布事件](#发布事件) -- `event-listen`,[监听事件](#监听事件) -- `contract-deploy`,[部署合约](#部署合约) -- `contract-permission`,[修改合约权限](#修改合约权限) -- `contract`,[合约调用](#合约调用) -- `contract-state`,[更新合约状态](#更新合约状态) -- `sign`,[离线交易签名](#离线交易签名) -- `send`,[离线交易发送](#离线交易发送) - -#### 更新账本根证书 - -```bash -:bin$ ./jdchain-cli.sh tx root-ca -h -Update ledger root certificates. -Usage: jdchain-cli tx ledger-ca-update [-hV] [--pretty] --crt= - [--export=] [--gw-host=] - [--gw-port=] [--home=] - --crt= File of the X509 certificate - --operation Operation for this certificate. Optional values: ADD,UPDATE,REMOVE - --export= Transaction export directory - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `crt`,证书文件路径 -- `operation`,操作类型:`ADD`,`UPDATE`,`REMOVE` - -如: -```bash -:bin$ $ ./jdchain-cli.sh tx root-ca --crt /home/imuge/jd/nodes/peer0/config/keys/ledger.crt --operation UPDATE -select ledger, input the index: -INDEX LEDGER -0 j5pFrMigE47t6TobQJXsztnoeA29H31v1vHHF1wqCp4rzi -// 选择账本,当前网关服务只有上面一个可用账本 -> 0 -select keypair to sign tx: -INDEX KEY ADDRESS -0 peer0 LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W -// 选择链上已存在且有注册用户权限的用户所对应的公私钥对,用于交易签名 -> 0 -input password of the key: -// 输入签名私钥密码 -> 1 -ledger ca: [7VeRBQ9jpsgNXje2NYXU5MhyGKVRj462RtkJ8f6FNL1oxYbX](pubkey) updated -``` -会更新链上公钥为`7VeRBQ9jpsgNXje2NYXU5MhyGKVRj462RtkJ8f6FNL1oxYbX`的账本证书信息。 - - -#### 注册用户 - -```bash -:bin$ ./jdchain-cli.sh tx user-register -h -Register new user. -Usage: jdchain-cli tx user-register [-hV] [--ca-mode] [--pretty] - [--crt=] [--export=] - [--gw-host=] [--gw-port=] - [--home=] [-n=] - [--pubkey=] - --ca-mode Register with CA - --crt= File of the X509 certificate - --export= Transaction export directory - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - -n, --name= Name of the key - --pretty Pretty json print - --pubkey= Pubkey of the user - -V, --version Print version information and exit. -``` -- `ca-mode`,身份认证模式是否为证书(`CA`)模式,默认`false` -- `name`,当`ca-mode`为`true`时会读取本地`${home}/config/keys/${name}.crt`文件,反之读取`${home}/config/keys/${name}.pub` -- `crt`,证书文件路径 -- `pubkey`,`Base58`编码公钥信息,仅在非`ca-mode`情况下使用 - -从`${home}/config/keys`目录下密钥对选择密钥注册到网关服务对应的区块链网络。 - -如: -```bash -:bin$ ./jdchain-cli.sh tx user-register -name k1 -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -// 选择账本,当前网关服务只有上面一个可用账本 -> 0 -select keypair to sign tx: -INDEX KEY ADDRESS -0 peer0 LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw -1 k1 LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC -// 选择链上已存在且有注册用户权限的用户所对应的公私钥对,用于交易签名 -> 0 -input password of the key: -// 输入签名私钥密码 -> 1 -register user: [LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC] -``` -会在链上注册地址为`LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC`的用户账户信息。 - -#### 更新用户证书 - -```bash -:bin$ ./jdchain-cli.sh tx user-ca -h -Update user certificate. -Usage: jdchain-cli tx user-ca [-hV] [--pretty] [--crt=] - [--export=] [--gw-host=] - [--gw-port=] [--home=] - --crt= File of the X509 certificate - --export= Transaction export directory - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `crt`,证书文件路径 - -如: -```bash -:bin$ $ ./jdchain-cli.sh tx user-ca --crt /home/imuge/jd/nodes/peer0/config/keys/peer0.crt -select ledger, input the index: -INDEX LEDGER -0 j5pFrMigE47t6TobQJXsztnoeA29H31v1vHHF1wqCp4rzi -// 选择账本,当前网关服务只有上面一个可用账本 -> 0 -select keypair to sign tx: -INDEX KEY ADDRESS -0 peer0 LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W -// 选择链上已存在且有注册用户权限的用户所对应的公私钥对,用于交易签名 -> 0 -input password of the key: -// 输入签名私钥密码 -> 1 -user: [LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W] ca updated -``` -会更新链上地址为`LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W`的用户证书信息。 - -#### 更新用户(证书)状态 - -```bash -:bin$ ./jdchain-cli.sh tx user-state -h -Update user(certificate) state. -Usage: jdchain-cli tx user-state [-hV] [--pretty] --address=
- [--export=] - [--gw-host=] - [--gw-port=] [--home=] - --state= - --address=
User address - --export= Transaction export directory - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --pretty Pretty json print - --state= User state,Optional values: FREEZE,NORMAL,REVOKE - -V, --version Print version information and exit. -``` -- `address`,用户地址 -- `state`,用户状态,可选值:FREEZE,NORMAL,REVOKE - -如冻结用户`LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W`: -```bash -:bin$ $ ./jdchain-cli.sh tx user-state --address LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W --state FREEZE -select ledger, input the index: -INDEX LEDGER -0 j5pFrMigE47t6TobQJXsztnoeA29H31v1vHHF1wqCp4rzi -// 选择账本,当前网关服务只有上面一个可用账本 -> 0 -select keypair to sign tx: -INDEX KEY ADDRESS -0 peer0 LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W -// 选择链上已存在且有注册用户权限的用户所对应的公私钥对,用于交易签名 -> 0 -input password of the key: -// 输入签名私钥密码 -> 1 -user: [LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W] revoked -``` -会冻结链上地址为`LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W`的用户(证书),此用户无法再接入使用此网络。 - -#### 角色管理 -```bash -:bin$ ./jdchain-cli.sh tx role -h -Create or config role. -Usage: jdchain-cli tx role [-hV] [--pretty] [--export=] - [--gw-host=] [--gw-port=] - [--home=] --name= - [--disable-ledger-perms=[, - ...]]... - [--disable-transaction-perms=[,...]]... - [--enable-ledger-perms=[, - ...]]... - [--enable-transaction-perms= - [,...]]... - --disable-ledger-perms=[,...] - Disable ledger permissions - --disable-transaction-perms=[, - ...] - Disable transaction permissions - --enable-ledger-perms=[,...] - Enable ledger permissions - --enable-transaction-perms=[, - ...] - Enable transaction permissions - --export= Transaction export directory - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --name= Role name - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `name`,角色名称,不存在则创建 -- `disable-ledger-perms`,禁用的账本权限列表,半角逗号分割 -- `disable-transaction-perms`,禁用的交易权限列表,半角逗号分割 -- `enable-ledger-perms`,的账本权限列表,半角逗号分割 -- `enable-transaction-perms`,禁用的交易权限列表,半角逗号分割 - -如: -```bash -:bin$ ./jdchain-cli.sh tx role --name ROLE1 --enable-ledger-perms REGISTER_USER,REGISTER_DATA_ACCOUNT --enable-transaction-perms DIRECT_OPERATION,CONTRACT_OPERATION -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -// 选择账本 -> 0 -select keypair to sign tx: -INDEX KEY ADDRESS -0 peer0 LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw -1 k1 LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC -// 选择签名账户 -> 0 -input password of the key: -// 输入签名账户私钥密码 -> 1 -Role config success! -``` - -#### 权限配置 - -```bash -:bin$ ./jdchain-cli.sh tx authorization -h -User role authorization. -Usage: jdchain-cli tx authorization [-hV] [--pretty] --address=
- [--export=] [--gw-host=] - [--gw-port=] [--home=] - [--policy=] - [--authorize=[, - ...]]... - [--unauthorize=[, - ...]]... - --address=
User address - --authorize=[,...] - Authorize roles - --export= Transaction export directory - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --policy= Role policy - --pretty Pretty json print - --unauthorize=[,...] - Unauthorize roles - -V, --version Print version information and exit. -``` -- `address`,用户地址 -- `authorize`,赋予角色列表,半角逗号分割 -- `unauthorize`,移除角色列表,半角逗号分割 -- `policy`,角色策略,`UNION`/`INTERSECT`,默认`UNION`合并所有角色权限 - -如: -```bash -:bin$ ./jdchain-cli.sh tx authorization --address LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC --authorize ROLE1 -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -select keypair to sign tx: -INDEX KEY ADDRESS -0 peer0 LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw -1 k1 LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC -> 0 -input password of the key: -> 1 -Authorization config success! -``` - -#### 注册数据账户 - -```bash -:bin$ ./jdchain-cli.sh tx data-account-register -h -Register new data account. -Usage: jdchain-cli tx data-account-register [-hV] [--pretty] - [--export=] [--gw-host=] [--gw-port=] - [--home=] [--pubkey=] - --export= Transaction export directory - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --pretty Pretty json print - --pubkey= The pubkey of the exist data account - -V, --version Print version information and exit. -``` -- `pubkey`,待注册数据账户公钥 - -如: -```bash -:bin$ ./jdchain-cli.sh tx data-account-register --pubkey 7VeRFk4ANQHjWjAmAoL7492fuykTpXujihJeAgbXT2J9H9Yk -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -select keypair to sign tx: -INDEX KEY ADDRESS -0 peer0 LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw -1 k1 LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC -> 0 -input password of the key: -> 1 -register data account: [LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC] -``` -会在链上注册地址为`LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC`的数据账户信息。 - -#### 修改数据账户权限 - -```bash -:bin$ ./jdchain-cli.sh tx data-account-permission -h -Update data account permission. -Usage: jdchain-cli tx data-account-permission [-hV] [--pretty] - [--address=
] [--export=] [--gw-host=] - [--gw-port=] [--home=] [--mode=] [--role=] - --address=
Address of the data account - --export= Transaction export directory - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --mode= Mode value of the data account - --pretty Pretty json print - --role= Role of the data account - -V, --version Print version information and exit. -``` -- `address`,数据账户地址 -- `role`,数据账户所属角色 -- `mode`,数据账户权限值 - -如: -```bash -:bin$ ./jdchain-cli.sh tx data-account-permission --address LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC --role ROLE1 --mode 777 -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -select keypair to sign tx: -INDEX KEY ADDRESS -0 peer0 LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw -> 0 -input password of the key: -> 1 -update data account: [LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC] permission -``` -将修改数据账户`LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC`所属角色为`ROLE1`,权限值为`777`(所有用户可读可写)。 - -#### KV设值 - -```bash -:bin$ ./jdchain-cli.sh tx kv -h -Set key-value. -Usage: jdchain-cli tx kv [-hV] [--pretty] --address=
- [--export=] [--gw-host=] - [--gw-port=] [--home=] --key= - --value= [--ver=] - --address=
Data account address - --export= Transaction export directory - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --key= Key to set - --pretty Pretty json print - -V, --version Print version information and exit. - --value= Value to set - --ver= Version of the key-value -``` -- `address`,数据账户地址 -- `key`,键 -- `value`,值 -- `ver`,版本 - -如向账户地址`LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC`写入`k1`:`v1`:`-1`键值对数据: -```bash -:bin$ ./jdchain-cli.sh tx kv --address LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC --key k1 --value v1 --ver -1 -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -select keypair to sign tx: -INDEX KEY ADDRESS -0 peer0 LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw -1 k1 LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC -> 0 -input password of the key: -> 1 -set kv success -``` - -#### 注册事件账户 - -```bash -:bin$ ./jdchain-cli.sh tx event-account-register -h -Register event account. -Usage: jdchain-cli tx event-account-register [-hV] [--pretty] - [--export=] [--gw-host=] [--gw-port=] - [--home=] [--pubkey=] - --export= Transaction export directory - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --pretty Pretty json print - --pubkey= The pubkey of the exist event account - -V, --version Print version information and exit. -``` -- `pubkey`,待注册事件账户私钥 - -如: -```bash -:bin$ ./jdchain-cli.sh tx event-account-register --pubkey 7VeRFk4ANQHjWjAmAoL7492fuykTpXujihJeAgbXT2J9H9Yk -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -select keypair to sign tx: -INDEX KEY ADDRESS -0 peer0 LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw -1 k1 LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC -> 0 -input password of the key: -> 1 -register event account: [LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC] -``` -会在链上注册地址为`LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC`的事件账户信息。 - -#### 修改事件账户权限 - -```bash -:bin$ ./jdchain-cli.sh tx event-account-permission -h -Update event account permission. -Usage: jdchain-cli tx event-account-permission [-hV] [--pretty] - [--address=
] [--export=] [--gw-host=] - [--gw-port=] [--home=] [--mode=] [--role=] - --address=
Address of the event account - --export= Transaction export directory - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --mode= Mode value of the event account - --pretty Pretty json print - --role= Role of the event account - -V, --version Print version information and exit. -``` -- `address`,事件账户地址 -- `role`,事件账户所属角色 -- `mode`,事件账户权限值 - -如: -```bash -:bin$ ./jdchain-cli.sh tx event-account-permission --address LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC --role ROLE1 --mode 777 -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -select keypair to sign tx: -INDEX KEY ADDRESS -0 peer0 LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw -> 0 -input password of the key: -> 1 -update event account: [LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC] permission -``` -将修改事件账户`LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC`所属角色为`ROLE1`,权限值为`777`(所有用户可读可写)。 - -#### 发布事件 -```bash -:bin$ ./jdchain-cli.sh tx event -h -Publish event. -Usage: jdchain-cli tx event [-hV] [--pretty] --address=
- --content= [--export=] - [--gw-host=] [--gw-port=] - [--home=] [--sequence=] - --name= - --address=
Contract address - --content= Event content - --export= Transaction export directory - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --pretty Pretty json print - --sequence= Sequence of the event - --name= Event name - -V, --version Print version information and exit. -``` -- `address`,事件账户地址 -- `name`,事件名 -- `content`,事件内容 -- `sequence`,事件序号 - -如向账户地址`LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC`发布事件`n1`:`c1`:`-1`: -```bash -:bin$ ./jdchain-cli.sh tx event --address LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC --name n1 --content c1 --sequence -1 -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -select keypair to sign tx: -INDEX KEY ADDRESS -0 peer0 LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw -1 k1 LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC -> 0 -input password of the key: -> 1 -event publish success -``` - -#### 监听事件 -```bash -:bin$ ./jdchain-cli.sh tx event-listen -h -Subscribe event. -Usage: jdchain-cli tx event-listen [-hV] [--pretty] [--address=
] - [--export=] [--gw-host=] - [--gw-port=] [--home=] - --name= [--sequence=] - --address=
Event address - --export= Transaction export directory - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --name= Event name - --pretty Pretty json print - --sequence= Sequence of the event - -V, --version Print version information and exit. -``` -- `address`,事件账户地址,不传则表示监听系统事件 -- `name`,事件名,系统事件目前仅支持:`new_block_created` -- `sequence`,起始监听序号 - -如监听系统新区块事件: -```bash -:bin$ ./jdchain-cli.sh tx event-listen --name new_block_created --sequence 0 -select ledger, input the index: -INDEX LEDGER -0 j5mXXoNsmh6qadnWLjxFMXobyNGsXT1PmTNzXiHyiYMxoP -> 0 -# 会打印新区块事件:区块高度:最新区块高度 -New block:0:12 -New block:1:12 -New block:2:12 -``` - -#### 部署合约 - -```bash -:bin$ ./jdchain-cli.sh tx contract-deploy -h -Deploy or update contract. -Usage: jdchain-cli tx contract-deploy [-hV] [--pretty] --car= - [--export=] [--gw-host=] - [--gw-port=] [--home=] - [--pubkey=] - --car= The car file path - --export= Transaction export directory - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --pretty Pretty json print - --pubkey= The pubkey of the exist contract - -V, --version Print version information and exit. -``` -- `pubkey`,合约公钥,更新合约时使用 -- `car`,合约`car`文件 - -如将`contract-samples-1.5.0.RELEASE.car`文件中的合约部署上链: -```bash -:bin$ ./jdchain-cli.sh tx contract-deploy --car /home/imuge/Desktop/jdchain-cli/1.5.0/contract-samples-1.5.0.RELEASE.car -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -select keypair to sign tx: -INDEX KEY ADDRESS -0 peer0 LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw -1 k1 LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC -> 0 -input password of the key: -> 1 -deploy contract: [LdeNyF6jdNry5iCqmHdAFTQPvC8UkbJ9avoXH] -``` -合约地址:`LdeNyF6jdNry5iCqmHdAFTQPvC8UkbJ9avoXH` - -#### 修改合约权限 - -```bash -:bin$ ./jdchain-cli.sh tx contract-permission -h -Update contract permission. -Usage: jdchain-cli tx contract-permission [-hV] [--pretty] - [--address=
] [--export=] [--gw-host=] - [--gw-port=] [--home=] [--mode=] [--role=] - --address=
Address of the contract - --export= Transaction export directory - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --mode= Mode value of the contract - --pretty Pretty json print - --role= Role of the contract - -V, --version Print version information and exit. -``` -- `address`,合约地址 -- `role`,合约所属角色 -- `mode`,合约权限值 - -如: -```bash -:bin$ ./jdchain-cli.sh tx contract-permission --address LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC --role ROLE1 --mode 777 -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -select keypair to sign tx: -INDEX KEY ADDRESS -0 peer0 LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw -> 0 -input password of the key: -> 1 -update contract: [LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC] permission -``` -将修改合约`LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC`所属角色为`ROLE1`,权限值为`777`(所有用户可读可写)。 - -#### 合约调用 - -```bash -:bin$ ./jdchain-cli.sh tx contract -h -Call contract method. -Usage: jdchain-cli tx contract [-hV] [--pretty] --address=
- [--export=] [--gw-host=] - [--gw-port=] [--home=] - --method= [--args=[,...]]... - --address=
Contract address - --args=[,...] - Method arguments - --export= Transaction export directory - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --method= Contract method - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `address`,合约地址 -- `method`,合约方法 -- `args`,合约参数,半角逗号分割,命令行中会将所有参数处理为字符串,非字符串参数方法调用暂无法通过命令行工具调用 - -如调用合约`LdeNyF6jdNry5iCqmHdAFTQPvC8UkbJ9avoXH`中`registerUser`方法,传参`ed386a148fcb48b281b325f66103c805`: -```bash -:bin$ ./jdchain-cli.sh tx contract --address LdeNyF6jdNry5iCqmHdAFTQPvC8UkbJ9avoXH --method registerUser --args ed386a148fcb48b281b325f66103c805 -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -select keypair to sign tx: -INDEX KEY ADDRESS -0 peer0 LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw -1 k1 LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC -> 0 -input password of the key: -> 1 -call contract success -return string: LdeNqvSjL4izfpMNsGpQiBpTBse4g6qLxZ6j5 -``` -调用成功并返回了字符串:`LdeNqvSjL4izfpMNsGpQiBpTBse4g6qLxZ6j5` - -#### 更新合约状态 - -```bash -:bin$ ./jdchain-cli.sh tx contract-state -h -Update contract state. -Usage: jdchain-cli tx contract-state [-hV] [--pretty] - --address=
[--export=] [--gw-host=] - [--gw-port=] [--home=] --state= - --address=
Contract address - --export= Transaction export directory - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --pretty Pretty json print - --state= Contract state,Optional values: FREEZE,NORMAL, - REVOKE - -V, --version Print version information and exit. -``` -- `address`,合约地址 -- `state`,合约状态,可选值:FREEZE,NORMAL,REVOKE - -如冻结合约`LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W`: -```bash -:bin$ $ ./jdchain-cli.sh tx contract-state --address LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W --state FREEZE -select ledger, input the index: -INDEX LEDGER -0 j5pFrMigE47t6TobQJXsztnoeA29H31v1vHHF1wqCp4rzi -// 选择账本,当前网关服务只有上面一个可用账本 -> 0 -select keypair to sign tx: -INDEX KEY ADDRESS -0 peer0 LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W -// 选择链上已存在且有注册用户权限的用户所对应的公私钥对,用于交易签名 -> 0 -input password of the key: -// 输入签名私钥密码 -> 1 -contract: [LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W] revoked -``` -会冻结链上地址为`LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W`的合约,此合约不能再被调用。 - - -#### 离线交易签名 - -1. 离线交易 - -执行以上所有交易时,若`export`参数不为空,则会执行交易写入本地操作,而非签名并发送交易 - -如构造合约调用操作交易并保存到本地: -```bash -:bin$ ./jdchain-cli.sh tx contract --address LdeNyF6jdNry5iCqmHdAFTQPvC8UkbJ9avoXH --method registerUser --args ed386a148fcb48b281b325f66103c810 --export /txs -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -export transaction success: /txs/j5xR8ty8YbujTYKNRshmbfMYsL4jfe3yRUtMparmeHppd3 -``` -交易内容会被序列化保存在`/txs/j5xR8ty8YbujTYKNRshmbfMYsL4jfe3yRUtMparmeHppd3`中,其中`j5xR8ty8YbujTYKNRshmbfMYsL4jfe3yRUtMparmeHppd3`是该交易哈希。 - -2. 离线签名 - -```bash -:bin$ ./jdchain-cli.sh tx sign -h -Sign transaction. -Usage: jdchain-cli tx sign [-hV] [--pretty] [--export=] - [--gw-host=] [--gw-port=] - [--home=] [--tx=] - --export= Transaction export directory - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --tx= Local transaction file - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `tx`,离线交易路径 - -如对步骤1中创建的离线交易添加终端用户(此用户需是链上存在的且有相关权限的用户)签名: -```bash -:bin$ ./jdchain-cli.sh tx sign --tx /txs/j5xR8ty8YbujTYKNRshmbfMYsL4jfe3yRUtMparmeHppd3 -select keypair to sign tx: -INDEX KEY ADDRESS -0 peer0 LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw -1 k1 LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC -> 0 -input password of the key: -> 1 -Sign transaction success! -``` - -#### 离线交易发送 - -发送本地已经签名完成的交易 -```bash -:bin$ ./jdchain-cli.sh tx send -h -Send transaction. -Usage: jdchain-cli tx send [-hV] [--pretty] [--export=] - [--gw-host=] [--gw-port=] - [--home=] [--tx=] - --export= Transaction export directory - --gw-host= Set the gateway host. Default: 127.0.0.1 - --gw-port= Set the gateway port. Default: 8080 - -h, --help Show this help message and exit. - --home= Set the home directory. - --tx= Local transaction file - --pretty Pretty json print - -V, --version Print version information and exit. -``` -- `tx`,离线交易路径 - -如发送`/txs/j5xR8ty8YbujTYKNRshmbfMYsL4jfe3yRUtMparmeHppd3`中包含的交易数据: -```bash -:bin$ ./jdchain-cli.sh tx send --tx /home/imuge/Desktop/jdchain-cli/1.5.0/txs/j5xR8ty8YbujTYKNRshmbfMYsL4jfe3yRUtMparmeHppd3 -select ledger, input the index: -INDEX LEDGER -0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg -> 0 -Send transaction success: j5xR8ty8YbujTYKNRshmbfMYsL4jfe3yRUtMparmeHppd3 -``` \ No newline at end of file diff --git a/docs/configs.md b/docs/configs.md deleted file mode 100644 index f7c0ed6a..00000000 --- a/docs/configs.md +++ /dev/null @@ -1,362 +0,0 @@ -## 配置 - -### ledger.init - -```properties -#账本的种子;一段16进制字符,最长可以包含64个字符;可以用字符“-”分隔,以便更容易读取; -ledger.seed=932dfe23-fe23232f-283f32fa-dd32aa76-8322ca2f-56236cda-7136b322-cb323ffe - -#账本的描述名称;此属性不参与共识,仅仅在当前参与方的本地节点用于描述用途; -ledger.name= - -#身份认证模式:KEYPAIR/CA,默认KEYPAIR即公私钥对模式 -identity-mode=KEYPAIR - -#账本根证书路径,identity-mode 为 CA 时,此选项不能为空,支持多个,半角逗号相隔 -root-ca-path= - -#声明的账本创建时间;格式为 “yyyy-MM-dd HH:mm:ss.SSSZ”,表示”年-月-日 时:分:秒:毫秒时区“;例如:“2019-08-01 14:26:58.069+0800”,其中,+0800 表示时区是东8区 -created-time=2019-08-01 14:26:58.069+0800 - -#账本数据底层结构,分为:MERKLE_TREE, KV两种,默认MERKLE_TREE -ledger.data.structure=MERKLE_TREE - -#----------------------------------------------- -# 初始的角色名称列表;可选项; -# 角色名称不区分大小写,最长不超过20个字符;多个角色名称之间用半角的逗点“,”分隔; -# 系统会预置一个默认角色“DEFAULT”,所有未指定角色的用户都以赋予该角色的权限;若初始化时未配置默认角色的权限,则为默认角色分配所有权限; -# -# 注:如果声明了角色,但未声明角色对应的权限清单,这会忽略该角色的初始化; -# -#security.roles=DEFAULT, ADMIN, MANAGER, GUEST - -# 赋予角色的账本权限清单;可选项; -# 可选的权限如下; -# AUTHORIZE_ROLES, SET_CONSENSUS, SET_CRYPTO, REGISTER_PARTICIPANT, -# REGISTER_USER, REGISTER_DATA_ACCOUNT, REGISTER_CONTRACT, UPGRADE_CONTRACT, -# SET_USER_ATTRIBUTES, WRITE_DATA_ACCOUNT, -# APPROVE_TX, CONSENSUS_TX -# 多项权限之间用逗点“,”分隔; -# -#security.role.DEFAULT.ledger-privileges=REGISTER_USER, REGISTER_DATA_ACCOUNT - -# 赋予角色的交易权限清单;可选项; -# 可选的权限如下; -# DIRECT_OPERATION, CONTRACT_OPERATION -# 多项权限之间用逗点“,”分隔; -# -#security.role.DEFAULT.tx-privileges=DIRECT_OPERATION, CONTRACT_OPERATION - -# 其它角色的配置示例; -# 系统管理员角色:只能操作全局性的参数配置和用户注册,只能执行直接操作指令; -#security.role.ADMIN.ledger-privileges=CONFIGURE_ROLES, AUTHORIZE_USER_ROLES, SET_CONSENSUS, SET_CRYPTO, REGISTER_PARTICIPANT, REGISTER_USER -#security.role.ADMIN.tx-privileges=DIRECT_OPERATION - -# 业务主管角色:只能够执行账本数据相关的操作,包括注册用户、注册数据账户、注册合约、升级合约、写入数据等;能够执行直接操作指令和调用合约; -#security.role.MANAGER.ledger-privileges=CONFIGURE_ROLES, AUTHORIZE_USER_ROLES, REGISTER_USER, REGISTER_DATA_ACCOUNT, REGISTER_CONTRACT, UPGRADE_CONTRACT, SET_USER_ATTRIBUTES, WRITE_DATA_ACCOUNT, -#security.role.MANAGER.tx-privileges=DIRECT_OPERATION, CONTRACT_OPERATION - -# 访客角色:不具备任何的账本权限,只有数据读取的操作;也只能够通过调用合约来读取数据; -#security.role.GUEST.ledger-privileges= -#security.role.GUEST.tx-privileges=CONTRACT_OPERATION - -#----------------------------------------------- -#共识服务提供者;必须; -consensus.service-provider=com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider - -#共识服务的参数配置;推荐使用绝对路径;必须; -consensus.conf=bftsmart.config - -#密码服务提供者列表,以英文逗点“,”分隔;必须; -crypto.service-providers=com.jd.blockchain.crypto.service.classic.ClassicCryptoService,com.jd.blockchain.crypto.service.sm.SMCryptoService - -#从存储中加载账本数据时,是否校验哈希;可选; -crypto.verify-hash=true - -#哈希算法; -crypto.hash-algorithm=SHA256 - -#参与方的个数,后续以 cons_parti.id 分别标识每一个参与方的配置; -cons_parti.count=4 - -#--------------------- -#第0个参与方的名称; -cons_parti.0.name= -#第0个参与方的公钥文件路径; -cons_parti.0.pubkey-path= -#第0个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数; -cons_parti.0.pubkey= -#第1个参与方的证书路径,identity-mode 为 CA 时,此选项不能为空 -cons_parti.0.ca-path= - -#第0个参与方的角色清单;可选项; -#cons_parti.0.roles=ADMIN, MANAGER -#第0个参与方的角色权限策略,可选值有:UNION(并集),INTERSECT(交集);可选项; -#cons_parti.0.roles-policy=UNION - -#第0个参与方的账本初始服务的主机; -cons_parti.0.initializer.host=127.0.0.1 -#第0个参与方的账本初始服务的端口; -cons_parti.0.initializer.port=8800 -#第0个参与方的账本初始服务是否开启安全连接; -cons_parti.0.initializer.secure=false - -#--------------------- -#第1个参与方的名称; -cons_parti.1.name= -#第1个参与方的公钥文件路径; -cons_parti.1.pubkey-path= -#第1个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数; -cons_parti.1.pubkey= -#第1个参与方的证书路径,identity-mode 为 CA 时,此选项不能为空 -cons_parti.1.ca-path= - -#第1个参与方的角色清单;可选项; -#cons_parti.1.roles=MANAGER -#第1个参与方的角色权限策略,可选值有:UNION(并集),INTERSECT(交集);可选项; -#cons_parti.1.roles-policy=UNION - -#第1个参与方的账本初始服务的主机; -cons_parti.1.initializer.host=127.0.0.1 -#第1个参与方的账本初始服务的端口; -cons_parti.1.initializer.port=8810 -#第1个参与方的账本初始服务是否开启安全连接; -cons_parti.1.initializer.secure=false - -#--------------------- -#第2个参与方的名称; -cons_parti.2.name= -#第2个参与方的公钥文件路径; -cons_parti.2.pubkey-path= -#第2个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数; -cons_parti.2.pubkey= -#第1个参与方的证书路径,identity-mode 为 CA 时,此选项不能为空 -cons_parti.2.ca-path= - -#第2个参与方的角色清单;可选项; -#cons_parti.2.roles=MANAGER -#第2个参与方的角色权限策略,可选值有:UNION(并集),INTERSECT(交集);可选项; -#cons_parti.2.roles-policy=UNION - -#第2个参与方的账本初始服务的主机; -cons_parti.2.initializer.host=127.0.0.1 -#第2个参与方的账本初始服务的端口; -cons_parti.2.initializer.port=8820 -#第2个参与方的账本初始服务是否开启安全连接; -cons_parti.2.initializer.secure=false - -#--------------------- -#第3个参与方的名称; -cons_parti.3.name= -#第3个参与方的公钥文件路径; -cons_parti.3.pubkey-path= -#第3个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数; -cons_parti.3.pubkey= -#第1个参与方的证书路径,identity-mode 为 CA 时,此选项不能为空 -cons_parti.3.ca-path= - -#第3个参与方的角色清单;可选项; -#cons_parti.3.roles=GUEST -#第3个参与方的角色权限策略,可选值有:UNION(并集),INTERSECT(交集);可选项; -#cons_parti.3.roles-policy=INTERSECT - -#第3个参与方的账本初始服务的主机; -cons_parti.3.initializer.host=127.0.0.1 -#第3个参与方的账本初始服务的端口; -cons_parti.3.initializer.port=8830 -#第3个参与方的账本初始服务是否开启安全连接; -cons_parti.3.initializer.secure=false -``` - -- `ledger.data.structure`,账本数据底层结构。 -> `MERKLE_TREE`:区块内各类根哈希和具体数据之间的锚定关系通过复杂的多叉默克尔树来实现,账本数据库内存储默克尔树构建过程中的所有中间节点状态,对交易的任何恶意篡改都涉及到对所有默克尔树中间节点状态的修改,篡改代价极大,安全性高;但复杂的数据结构以及对于KV数据的膨胀存储严重影响了整个系统的性能;适用于对安全性要求较高,而对性能要求不高的业务场景; -> `KV`:在不改变交易处理流程的情况下,简化了区块内根哈希与数据锚定的默克尔树结构,仅通过通用的二叉默克尔树来保证账本数据的不可篡改,计算默克尔根哈希的中间节点状态不上链,降低了`KV`数据存储带来的读写膨胀,在效率与安全性上进行了权衡,折中。安全性上与`MERKLE_TREE`类型相比有所降低,适用于对性能要求较高的安全组织联盟中。`KV`类型还可保证数据的顺序性。 - -### local.conf - -```properties -#当前参与方的 id,与ledger.init文件中cons_parti.id一致,默认从0开始 -local.parti.id=0 - -#当前参与方的公钥,用于非证书模式 -local.parti.pubkey= -#当前参与方的证书信息,用于证书模式 -local.parti.ca-path= - -#当前参与方的私钥(密文编码) -local.parti.privkey= -#当前参与方的私钥文件,PEM格式,用于证书模式 -local.parti.privkey-path= - -#当前参与方的私钥解密密钥(原始口令的一次哈希,Base58格式),如果不设置,则启动过程中需要从控制台输入; -local.parti.pwd= - -#账本初始化完成后生成的"账本绑定配置文件"的输出目录 -#推荐使用绝对路径,相对路径以当前文件(local.conf)所在目录为基准 -ledger.binding.out=../ - -#账本数据库的连接字符 -#rocksdb数据库连接格式:rocksdb://{path},例如:rocksdb:///export/App08/peer/rocks.db/rocksdb0.db -#redis数据库连接格式:redis://{ip}:{prot}/{db},例如:redis://127.0.0.1:6379/0 -#kvdb数据库连接格式:kvdb://{ip}:{prot}/{db},例如:kvdb://127.0.0.1:7078/test -ledger.db.uri= - -#账本数据库的连接口令 -ledger.db.pwd= -``` - -### bftsmart.config - -```properties -############################################ -###### #Consensus Participant0 ###### -############################################ - -system.server.0.network.host=127.0.0.1 -system.server.0.network.port=16000 -system.server.0.network.secure=false - -############################################ -###### #Consensus Participant1 ###### -############################################ - -system.server.1.network.host=127.0.0.1 -system.server.1.network.port=16010 -system.server.1.network.secure=false - -############################################ -###### #Consensus Participant2 ###### -############################################ - -system.server.2.network.host=127.0.0.1 -system.server.2.network.port=16020 -system.server.2.network.secure=false - -############################################ -###### #Consensus Participant3 ###### -############################################ - -system.server.3.network.host=127.0.0.1 -system.server.3.network.port=16030 -system.server.3.network.secure=false - - -############################################ -####### Communication Configurations ####### -############################################ - -#HMAC algorithm used to authenticate messages between processes (HmacMD5 is the default value) -#This parameter is not currently being used -#system.authentication.hmacAlgorithm = HmacSHA1 - -#Specify if the communication system should use a thread to send data (true or false) -#system.communication.useSenderThread = true //unused property; - -#Force all processes to use the same public/private keys pair and secret key. This is useful when deploying experiments -#and benchmarks, but must not be used in production systems. -system.communication.defaultkeys = true - -############################################ -### Replication Algorithm Configurations ### -############################################ - -#Number of servers in the group -system.servers.num = 4 - -#Maximum number of faulty replicas -system.servers.f = 1 - -#Timeout to asking for a client request -#system.totalordermulticast.timeout = 60000 - -#Allowable time tolerance range(millisecond) -system.totalordermulticast.timeTolerance = 3000000 - -#Maximum batch size (in number of messages) -system.totalordermulticast.maxbatchsize = 2000 - -#Number of nonces (for non-determinism actions) generated -system.totalordermulticast.nonces = 10 - -#if verification of leader-generated timestamps are increasing -#it can only be used on systems in which the network clocks -#are synchronized -system.totalordermulticast.verifyTimestamps = false - -#Quantity of messages that can be stored in the receive queue of the communication system -system.communication.inQueueSize = 500000 - -# Quantity of messages that can be stored in the send queue of each replica -system.communication.outQueueSize = 500000 - -#The time interval for retrying to send message after connection failure. In milliseconds; -system.communication.send.retryInterval=2000 - -#The number of retries to send message after connection failure. -system.communication.send.retryCount=100 - -#Set to 1 if SMaRt should use signatures, set to 0 if otherwise -system.communication.useSignatures = 0 - -#Set to 1 if SMaRt should use MAC's, set to 0 if otherwise -system.communication.useMACs = 1 - -#Set to 1 if SMaRt should use the standard output to display debug messages, set to 0 if otherwise -system.debug = 0 - -#Print information about the replica when it is shutdown -system.shutdownhook = true - -############################################ -###### State Transfer Configurations ####### -############################################ - -#Activate the state transfer protocol ('true' to activate, 'false' to de-activate) -system.totalordermulticast.state_transfer = true - -#Maximum ahead-of-time message not discarded -system.totalordermulticast.highMark = 10000 - -#Maximum ahead-of-time message not discarded when the replica is still on EID 0 (after which the state transfer is triggered) -system.totalordermulticast.revival_highMark = 10 - -#Number of ahead-of-time messages necessary to trigger the state transfer after a request timeout occurs -system.totalordermulticast.timeout_highMark = 200 - -############################################ -###### Log and Checkpoint Configurations ### -############################################ - -system.totalordermulticast.log = true -system.totalordermulticast.log_parallel = false -system.totalordermulticast.log_to_disk = true -system.totalordermulticast.sync_log = false - -#Period at which BFT-SMaRt requests the state to the application (for the state transfer state protocol) -system.totalordermulticast.checkpoint_period = 1000 -system.totalordermulticast.global_checkpoint_period = 120000 - -system.totalordermulticast.checkpoint_to_disk = false -system.totalordermulticast.sync_ckp = false - - -############################################ -###### Reconfiguration Configurations ###### -############################################ - -#Replicas ID for the initial view, separated by a comma. -# The number of replicas in this parameter should be equal to that specified in 'system.servers.num' -system.initial.view = 0,1,2,3 - -#The ID of the trust third party (TTP) -system.ttp.id = 2001 - -#This sets if the system will function in Byzantine or crash-only mode. Set to "true" to support Byzantine faults -system.bft = true - -#Custom View Storage; -#view.storage.handler=bftsmart.reconfiguration.views.DefaultViewStorage - -# 延迟打包时间,单位毫秒,默认50。此参数对性能有影响,实际环境调整此参数可提高整体性能。 -#system.epoch.delay=50 -``` \ No newline at end of file diff --git a/docs/contract.md b/docs/contract.md deleted file mode 100644 index d95bc638..00000000 --- a/docs/contract.md +++ /dev/null @@ -1,549 +0,0 @@ -# 智能合约 - -### 1. 简介 - -JD Chain 智能合约系统由5个部分组成:合约代码语言、合约引擎、合约账户、合约开发框架、合约开发插件。 - -合约代码语言是用来编写智能合约的编程语言,合约引擎是解释和执行合约代码的虚拟机。 - -JD Chain 账本中以合约账户的方式对合约代码进行管理。一份部署上链的合约代码需要关联到一个唯一的公钥上,并生成与公钥对应的区块链账户地址,在账本中注册为一个合约账户。在执行之前,系统从账本中读出合约代码并将其加载到合约引擎,由交易执行器调用合约引擎触发合约执行。 - -JD Chain 账本定义了一组标准的账本操作指令,合约代码的执行过程实质上是向账本输出一串操作指令序列,这些指令对账本中的数据产生了变更,形成合约执行的最终结果。 - -合约开发框架定义了进行合约代码开发中需要依赖的一组编程接口和类库。合约开发插件提供了更方便与IDE集成的合约编译、部署工具,可以简化操作,并与持续集成过程结合。 - -JD Chain 以 Java 语言作为合约代码语言,合约引擎是基于 JVM 构建的安全沙盒。为了实现与主流的应用开发方式无缝兼容, JD Chain 支持以 Maven 来管理合约代码的工程项目,并提供相应的 maven 插件来简化合约的编译和部署。 - ->智能合约是一种可以由计算机执行的合同/协议。不同于现实生活中的合同是由自然语言来编写并约定相关方的权利和义务,智能合约是用合约代码语言来编写,以合约代码的形式存在和被执行。通过账本中的数据状态来表示合同/协议相关条款信息,合约代码的运行过程体现了合同/协议条款的执行,并记录相应的结果。 - -### 2. 快速入门 - -#### 2.1. 准备开发环境 - -按照正常的 Java 应用开发环境要求进行准备,以 Maven 作为代码工程的构建管理工具,无其它特殊要求。 - ->检查 JDK 版本不低于 1.8 ,Maven 版本不低于 3.0。 - -#### 2.2. 创建合约代码工程 -创建一个普通的 Java Maven 工程,打开 pom.xml 把 packaging 设为 contract . - -```xml - - 4.0.0 - your.group.id - your.project - 0.0.1-SNAPSHOT - - contract - - - - - - - - - - - -``` - -> 注:合约代码工程也是一个普通的 Java Maven 工程,因此尽管不同 IDE 创建 Maven 工程有不同的操作方式,由于对于合约开发而言并无特殊要求,故在此不做详述。 - -#### 2.3. 加入合约开发依赖 - -在合约代码工程 pom.xml 加入对合约开发 SDK 的依赖: - - ```xml - - com.jd.blockchain - contract-starter - ${jdchain.version} - - ``` - -#### 2.4. 加入合约插件 - -在合约代码工程的 pom.xml 加入 contract-maven-plugin 插件: - ```xml - - com.jd.blockchain - contract-maven-plugin - ${jdchain.version} - true - - ``` - -完整的 pom.xml 如下: - - ```xml - - 4.0.0 - your.group.id - your.project - 0.0.1-SNAPSHOT - - contract - - - 1.6.0.RELEASE - - - - - - com.jd.blockchain - contract-starter - ${jdchain.version} - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.1 - - 1.8 - 1.8 - UTF-8 - false - true - false - false - - - - - - com.jd.blockchain - contract-maven-plugin - ${jdchain.version} - true - - - - - ``` - -#### 2.5. 编写合约代码 - -2.5.1. **注意事项** - -1. 不允许合约(包括合约接口和合约实现类)使用com.jd.blockchain开头的package; -2. 必须有且只有一个接口使用@Contract注解,且其中的event必须大于等于一个; -3. 使用@Contract注解的接口有且只有一个实现类; -4. 黑名单调用限制(具体黑名单可查看配置文件),需要注意的是,黑名单分析策略会递归分析类实现的接口和父类,也就是说调用一个实现了指定黑名单接口的类也是不允许的; - - -目前设置的黑名单如下: -```conf -java.io.File -java.io.InputStream -java.io.OutputStream -java.io.DataInput -java.io.DataOutput -java.io.Reader -java.io.Writer -java.io.Flushable -java.nio.channels.* -java.nio.file.* -java.net.* -java.sql.* -java.lang.reflect.* -java.lang.Class -java.lang.ClassLoader -java.util.Random -java.lang.System-currentTimeMillis -java.lang.System-nanoTime -com.jd.blockchain.ledger.BlockchainKeyGenerator -``` - -2.5.2. **声明合约** - -```java -/** - * 声明合约接口; -**/ -@Contract -public interface AssetContract { - - @ContractEvent(name = "transfer") - String transfer(String address, String from, String to, long amount); - -} -``` - -2.5.3. **实现合约** - -```java -/** - * 实现合约; - * - * 实现 EventProcessingAware 接口是可选的,目的获得 ContractEventContext 上下文对象, - * 通过该对象可以进行账本操作; - */ -public class AssetContractImpl implements AssetContract, EventProcessingAware { - - // 合约事件上下文; - private ContractEventContext eventContext; - - /** - * 执行交易请求中对 AssetContract 合约的 transfer 调用操作; - */ - public String transfer(String address, String from, String to, long amount) { - //当前账本的哈希; - HashDigest ledgerHash = eventContext.getCurrentLedgerHash(); - //当前账本上下文; - LedgerContext ledgerContext = eventContext.getLedger(); - - //做操作; - // ledgerContext. - - //返回合约操作的结果; - return "success"; - } - - /** - * 准备执行交易中的合约调用操作; - */ - @Override - public void beforeEvent(ContractEventContext eventContext) { - this.eventContext = eventContext; - } - - /** - * 完成执行交易中的合约调用操作; - */ - @Override - public void postEvent(ContractEventContext eventContext, Exception error) { - this.eventContext = null; - } -} -``` - -**账本数据可见范围**: - -`ContractEventContext`中`getUncommittedLedger`方法可访问执行中的未提交区块数据,此方法的合理使用可以解决客户并发调用合约方法涉及数据版本/事件序列冲突的问题。 -```java -/** - * 当前包含未提交区块数据账本查询上下文; - */ -LedgerQueryService getUncommittedLedger(); -``` - -`ContractEventContext`中`getLedger`方法访问的是链上已提交的最新区块数据,不包含未提交交易,所以存在未提交交易中多个合约方法调用操作间数据不可见,导致并发时数据版本等冲突问题。 -```java -/** - * 账本操作上下文; - */ -LedgerContext getLedger(); -``` - -合约方法中对账本的操作通过调用`LedgerContext`中相关方法,可参照[示例合约](https://github.com/blockchain-jd-com/jdchain/tree/master/samples/contract-samples/src/main/java/com/jdchain/samples/contract) - -#### 2.6. 编译打包合约代码 - -合约代码工程的编译打包操作与普通的 maven 工程是相同的,在工程的根目录下输入以下命令: - -```bash -mvn clean package -``` - -执行成功之后,在 target 目录中输出合约代码文件 \.\.car 。 - -如果合约代码加入了除 com.jd.blockchain:contract-starter 之外的其它依赖,默认配置下,第三方依赖包将与 .car 文件一起打包一起部署。(也可以把第三方依赖包独立打包,具体参见以下 “3. 合约插件详细配置” - -> 注意:合约代码虽然利用了 Java 语言,遵照 Java 语法进行编写,但本质上是作为一种运行于受限环境(合约虚拟机)的语言来使用,因而一些 Java 语法和 SDK 的 API 是不被允许使用的,在编译过程中将对此进行检查。 - -#### 2.7. 部署合约代码 - -##### 2.7.1. 在项目中部署合约代码 - -如果希望在构建打包的同时将合约代码部署到指定的区块链网络,可以在合约代码工程 pom.xml 的 contract-maven-plugin 插件配置中加入合约部署相关的信息(具体更详细的配置可以参考“3. 合约插件详细配置”)。 - -```xml - - com.jd.blockchain - contract-maven-plugin - 1.2.0.RELEASE - true - - - - - j5rpuGWVxSuUbU3gK7MDREfui797AjfdHzvAMiSaSzydu7 - - - - 192.168.10.10 - 8081 - - - - - 7VeRMpXVeTY4cqPogUHeNoZNk86CGAejBh9Xbd5ndFZXNFj3 - - - - - 7VeRLdGtSz1Y91gjLTqEdnkotzUfaAqdap3xw6fQ1yKHkvVq - 177gjzHTznYdPgWqZrH43W3yp37onm74wYXT4v9FukpCHBrhRysBBZh7Pzdo5AMRyQGJD7x - DYu3G8aGTMBW1WrTw76zxQJQU4DHLw9MLyy7peG4LKkY - - - - -``` - -加入部署配置信息之后,对工程执行编译打包操作,输出的合约代码(.car)将自动部署到指定的区块链网络。 - -```bash -mvn clean deploy -``` -##### 2.7.2. 发布已编译好的car -如果已经通过插件的打包方式,编译打包完成一个合约文件(.car),可通过命令行的方式进行发布,命令行要求与开发环境一致的Maven环境(包括环境变量及Setting都已配置完成)。 - -```bash -mvn com.jd.blockchain:contract-maven-plugin:${version}:deploy - -DcarPath= - -Dledger= - -DgatewayHost= - -DgatewayPort= - -DcontractPubKey= - -DcontractAddress= - -DsignerPubKey= - -DsignerPrivKey= - -DsignerPrivKeyPwd= -``` - -各参数说明如下: - -| 参数名 | 含义 |是否必填| -| ---- | ---- | ---- | -| ${version} | 合约插件的版本号 | 否,系统会自动选择发布的最新的RELEASE版本,SNAPSHOT版本必须填写 | -| carPath | 合约文件所在路径 | 是 | -| ledger | 账本Hash(Base58编码) | 否,会自动选择线上第一个账本| -| gatewayHost | 可访问的网关节点地址,域名或IP地址 | 是| -| gatewayPort | 网关节点监听端口 | 是 | -| contractPubKey | 合约账户的公钥(Base58编码)| 否,会自动创建 | -| contractAddress | 合约账户的地址(Base58编码)|否,会根据contractPubKey生成| -| signerPubKey | 合约签名公钥信息(Base58编码)|是| -| signerPrivKey | 合约签名私钥信息(Base58编码)|是| -| signerPrivKeyPwd | 合约签名私钥解密密钥(Base58编码)|是| - - -下面是一个示例,供参考: - -```bash -mvn com.jd.blockchain:contract-maven-plugin:1.2.0.RELEASE:deploy \ - -DcarPath=/root/jdchain/contracts/contract-test-1.0-SNAPSHOT.car \ - -Dledger=j5tW5HUvMjEtm2yB7E6MHoSByoH1DXvMwvF2HurEgMSaLW \ - -DgatewayHost=127.0.0.1 \ - -DgatewayPort=11000 \ - -DcontractPubKey= 7VeRBsHM2nsGwP8b2ufRxz36hhNtSqjKTquzoa4WVKWty5sD \ - -DcontractAddress= LdeNt7sEmTirh9PmE7axKvA2txTrbB9kxz6KB \ - -DsignerPubKey=7VeRLdGtSz1Y91gjLTqEdnkotzUfaAqdap3xw6fQ1yKHkvVq \ - -DsignerPrivKey=177gjzHTznYdPgWqZrH43W3yp37onm74wYXT4v9FukpCHBrhRysBBZh7Pzdo5AMRyQGJD7x \ - -DsignerPrivKeyPwd=DYu3G8aGTMBW1WrTw76zxQJQU4DHLw9MLyy7peG4LKkY -``` - -> 重点说明: -命令行中输入参数的优先级高于配置文件,就是说通过2.7.1方式发布合约时也可以采用命令行的参数(指-D相关配置),其优先级高于配置文件。 - -### 3. 合约插件详细配置 - -```xml - - com.jd.blockchain - contract-maven-plugin - 1.2.0.RELEASE - true - - - - - - false - - - - - 1 - - - MB - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - -
-
-
-``` - -### 4. 最简化合约插件配置示例 - -在pom.xml中有部分配置是非必填项,下面是一份最简化的合约发布(deploy)配置示例,供参考: - - -```xml - - com.jd.blockchain - contract-maven-plugin - 1.2.0.RELEASE - true - - - - - - 127.0.0.1 - 8081 - - - - - 7VeRLdGtSz1Y91gjLTqEdnkotzUfaAqdap3xw6fQ1yKHkvVq - 177gjzHTznYdPgWqZrH43W3yp37onm74wYXT4v9FukpCHBrhRysBBZh7Pzdo5AMRyQGJD7x - DYu3G8aGTMBW1WrTw76zxQJQU4DHLw9MLyy7peG4LKkY - - - - -``` - -### 5. 合约SDK - -除上述使用 maven 命令方式部署合约外,JD Chain SDK 提供了 Java 和 Go 语言的合约部署/升级,合约调用等方法。 -以下以 Java SDK 为例讲述主要步骤,完整代码参照[JD Chain Samples](https://github.com/blockchain-jd-com/jdchain/tree/master/samples)合约部分。 - -#### 5.1 合约部署 - -```java -// 新建交易 -TransactionTemplate txTemp = blockchainService.newTransaction(ledger); -// 生成合约账户 -BlockchainKeypair contractAccount = BlockchainKeyGenerator.getInstance().generate(); -System.out.println("合约地址:" + contractAccount.getAddress()); -// 部署合约 -txTemp.contracts().deploy(contractAccount.getIdentity(), FileUtils.readBytes("src/main/resources/contract-samples-1.4.2.RELEASE.car")); -``` - -#### 5.2 合约升级 - -```java -// 新建交易 -TransactionTemplate txTemp = blockchainService.newTransaction(ledger); -// 解析合约身份信息 -BlockchainIdentity contractIdentity = new BlockchainIdentityData(KeyGenUtils.decodePubKey("7VeRCfSaoBW3uRuvTqVb26PYTNwvQ1iZ5HBY92YKpEVN7Qht")); -System.out.println("合约地址:" + contractIdentity.getAddress()); -// 指定合约地址,升级合约,如合约地址不存在会创建该合约账户 -txTemp.contracts().deploy(contractIdentity, FileUtils.readBytes("src/main/resources/contract-samples-1.4.2.RELEASE.car")); -``` - -#### 5.3 合约调用 - -5.3.1 动态代理方式 - -基于动态代理方式合约调用,需要依赖合约接口 - -```java -// 新建交易 -TransactionTemplate txTemp = blockchainService.newTransaction(ledger); - -// 一次交易中可调用多个(多次调用)合约方法 -// 调用合约的 registerUser 方法 -SampleContract sampleContract = txTemp.contract("LdeNr7H1CUbqe3kWjwPwiqHcmd86zEQz2VRye", SampleContract.class); -GenericValueHolder userAddress = ContractReturnValue.decode(sampleContract.registerUser(UUID.randomUUID().toString())); - -// 准备交易 -PreparedTransaction ptx = txTemp.prepare(); -// 交易签名 -ptx.sign(adminKey); -// 提交交易 -TransactionResponse response = ptx.commit(); -Assert.assertTrue(response.isSuccess()); - -// 获取返回值 -System.out.println(userAddress.get()); -``` - -5.3.2 非动态代理方式 - -不需要依赖合约接口及实现,传入参数构造合约调用操作 - -```java -// 新建交易 -TransactionTemplate txTemp = blockchainService.newTransaction(ledger); - -ContractEventSendOperationBuilder builder = txTemp.contract(); - -// 一次交易中可调用多个(多次调用)合约方法 -// 调用合约的 registerUser 方法,传入合约地址,合约方法名,合约方法参数列表 -builder.send("LdeNr7H1CUbqe3kWjwPwiqHcmd86zEQz2VRye", "registerUser", - new BytesDataList(new TypedValue[]{ - TypedValue.fromText(UUID.randomUUID().toString()) - }) -); -// 准备交易 -PreparedTransaction ptx = txTemp.prepare(); -// 交易签名 -ptx.sign(adminKey); -// 提交交易 -TransactionResponse response = ptx.commit(); -Assert.assertTrue(response.isSuccess()); - -Assert.assertEquals(1, response.getOperationResults().length); -// 解析合约方法调用返回值 -for (int i = 0; i < response.getOperationResults().length; i++) { - BytesValue content = response.getOperationResults()[i].getResult(); - switch (content.getType()) { - case TEXT: - System.out.println(content.getBytes().toUTF8String()); - break; - case INT64: - System.out.println(BytesUtils.toLong(content.getBytes().toBytes())); - break; - case BOOLEAN: - System.out.println(BytesUtils.toBoolean(content.getBytes().toBytes()[0])); - break; - default: // byte[], Bytes - System.out.println(content.getBytes().toBase58()); - break; - } -} -``` \ No newline at end of file diff --git a/docs/data_account.md b/docs/data_account.md deleted file mode 100644 index b27366cd..00000000 --- a/docs/data_account.md +++ /dev/null @@ -1,63 +0,0 @@ -## 数据账户 - -`JD Chain`存放`KV`数据的数据结构。 - -### 1. 基本概念 - -可类比传统数据库的表的概念,上层应用需要保存的应用数据最终都应表现为`KV`类型数据写入到数据账户中。 - -写入`KV`数据之前,需要创建或使用已存在数据账户。 - -一个账本可以创建无限多个数据账户,一个数据账户中可以写入无限多个`KV`数据。 - -`KV`数据有`Version`(数据版本)的概念,以`KEY`作为唯一标识,`VALUE`的更新写入需要提供当前该`KEY`的最高版本,`KEY`不存在时为`-1`。 - -### 2. SDK - -以下只描述主要步骤,完整示例代码可参照[JD Chain Samples](samples.md)数据账户部分。 - -#### 2.1 注册数据账户 - -创建数据账户: -```java -BlockchainKeypair dataAccount = BlockchainKeyGenerator.getInstance().generate(); -System.out.println("数据账户地址:" + dataAccount.getAddress()); -// 注册数据账户 -txTemp.dataAccounts().register(dataAccount.getIdentity()); -``` - -从已存在数据账户公钥恢复: -```java -PubKey pubKey = KeyGenUtils.decodePubKey("7VeRLdGtSz1Y91gjLTqEdnkotzUfaAqdap3xw6fQ1yKHkvVq"); -BlockchainIdentity dataAccountIdentity = new BlockchainIdentityData(pubKey); -System.out.println("数据账户地址:" + dataAccountIdentity.getAddress()); -// 注册数据账户 -txTemp.dataAccounts().register(dataAccountIdentity); -``` - -#### 2.2 写入数据 - -```java -TransactionTemplate txTemp = blockchainService.newTransaction(ledger); - -txTemp.dataAccount("LdeNr7H1CUbqe3kWjwPwiqHcmd86zEQz2VRye") - .setText("key1", "value1", -1) - .setText("key1", "value1", 0) - .setInt64("key2", 1, -1) - .setJSON("key3", "{}", -1) - .setBytes("key4", Bytes.fromInt(2), -1); -``` - -支持写入数据类型: - -- `setText`,字符类型 -- `setInt64`,长整型 -- `setJSON`,`JSON`串 -- `setBytes`,字节数组 -- `setTimestamp`,时间戳,长整型 -- `setXML`,`XML`文本 -- `setImage`,图片字节数据 - -> 本质上仅支持`String/Long/[]byte`这三种数据类型,`JSON/XML/Image/Timestamp`等起标识作用,用于扩展差异化数据展示等场景需求 - -`setText("key1", "value1", -1)`中第三个参数即为数据版本,需要传入`JD Chain`网络中当前`key1`的最高数据版本,首次写入时传入`-1`。 \ No newline at end of file diff --git a/docs/data_permission.md b/docs/data_permission.md deleted file mode 100644 index 04701652..00000000 --- a/docs/data_permission.md +++ /dev/null @@ -1,94 +0,0 @@ -## 账户级别权限 - -数据账户,事件账户以及合约账户数据权限设计。 - -**数据读取完全开放**,本文档讨论全新变更仅对数据写入和合约调用生效。 - -### 权限定义 - -类似`linux`文件权限,使用用10位数据表示账户数据权限信息: -`0 123 456 789` - -- `0`: 数据集或者合约, `-`或`c` -- `123`: 所有者列表, `read(-/r)`, `write(-/w)` 以及 `execute(-/x)` -- `456`: 所属角色, `read(-/r)`, `write(-/w)` 以及 `execute(-/x)` -- `789`: 其他用户, `read(-/r)`, `write(-/w)` 以及 `execute(-/x)` - -> 当前实现数据账户仅对`write`权限更新有效;事件账户仅对`write`权限更新有效;合约仅对`execute`权限更新有效。 - -### 实现 - -权限数据存储与数据集头信息中,`SecurityPolicy`中增加: -```java -// 查询/写入/执行 权限校验 -void checkDataPermission(DataPermission permission, DataPermissionType permissionType) throws LedgerSecurityException; - -// 账户创建者校验,只有创建者才能修改数据权限 -void checkDataOwners(DataPermission permission, MultiIDsPolicy midPolicy) throws LedgerSecurityException; -``` - -在数据写入/合约方法调用前进行权限校验 - - - -数据账户,事件账户,合约账户均实现`PermissionAccount`接口: -```java -public interface PermissionAccount { - -DataPermission getPermission(); - -void setPermission(DataPermission permission); - -void setModeBits(AccountModeBits modeBits); - -void setRole(String role); -} -``` - -增加`AccountPermissionSetOperation`账户数据权限设置操作及其处理逻辑 - -### SDK - -统一使用风格 - -#### 数据账户 - -```java -txTemp.dataAccount("LdeNrUrMGxkG1R5mDNwrUvkFdRdD91xH1Pcvd") -.permission() // 创建权限修改操作构造器 -.mode(777) // 设置权限值,与 linux chmod 操作类似 -.role("ADMIN"); // 设置账户数据所属角色 -``` - -#### 事件账户 - -```java -txTemp.eventAccount("LdeNrUrMGxkG1R5mDNwrUvkFdRdD91xH1Pcvd") -.permission() // 创建权限修改操作构造器 -.mode(777) // 设置权限值,与 linux chmod 操作类似 -.role("ADMIN"); // 设置账户数据所属角色 -``` - -#### 合约账户 - -```java -txTemp.contract("LdeNrUrMGxkG1R5mDNwrUvkFdRdD91xH1Pcvd") -.permission() // 创建权限修改操作构造器 -.mode(777) // 设置权限值,与 linux chmod 操作类似 -.role("ADMIN"); // 设置账户数据所属角色 -``` - -### JD Chain Cli - - -#### 数据账户 - -[更新数据账户权限](cli/tx.md#修改数据账户权限) - -#### 事件账户 - -[更新数据账户权限](cli/tx.md#修改事件账户权限) - -#### 合约账户 - -[更新合约权限](cli/tx.md#修改合约权限) diff --git a/docs/event.md b/docs/event.md deleted file mode 100644 index a753f7f5..00000000 --- a/docs/event.md +++ /dev/null @@ -1,185 +0,0 @@ -## 事件 - -`JD Chain`账本中设计了事件数据集,用以存储事件账户,事件数据。 - -`事件账户`与`用户`,`数据账户`,`合约账户`是相互独立的,所承载的数据也是相互隔离的。 - -`JD Chain`事件分为两类:[系统事件](#系统事件),[用户事件](#用户事件) - -`JD Chain SDK` 针对事件数据集开发了[事件发布](#事件发布),[事件监听](#事件监听)实现。 - -### 1. 系统事件 - -系统运行期间产生的事件,目前仅定义了`新区块产生`这一个: - -```java -/** - * 系统事件类型 - */ -public enum SystemEvent { - // 新区块 - NEW_BLOCK_CREATED("new_block_created"); -} -``` - -### 2. 用户事件 - -用户自定义事件类型,需要创建`事件账户`,用户自定义事件名 - -`事件账户`数量没有限制,一个事件账户内`Topic`(事件名)数量没有限制 - -同一个`事件账户`的同一个`Topic`所指向的`Content`(事件内容)有`Sequence`(事件序号)的概念,以`Topic`作为唯一标识,同一个`Topic`的更新发布需要提供当前该`Topic`的最高序号,`Topic`不存在时为`-1`。 - -### 3. 事件结构 - -```java -/** - * 事件; - * - */ -@DataContract(code = DataCodes.EVENT_MESSAGE) -public interface Event { - /** - * 事件名; - * - * @return - */ - @DataField(order = 1, primitiveType = PrimitiveType.TEXT) - String getName(); - - /** - * 事件序号; - * - * @return - */ - @DataField(order = 2, primitiveType = PrimitiveType.INT64) - long getSequence(); - - /** - * 事件内容; - * - * @return - */ - @DataField(order=3, refContract = true) - BytesValue getContent(); - - /** - * 产生事件的交易哈希;  - * - * @return - */ - @DataField(order = 4, primitiveType = PrimitiveType.BYTES) - HashDigest getTransactionSource(); - - /** - * 产生事件的合约地址; - * - * @return - */ - @DataField(order = 5, primitiveType = PrimitiveType.TEXT) - String getContractSource(); - - /** - * 产生事件的区块高度 - * - * @return - */ - @DataField(order = 6, primitiveType = PrimitiveType.INT64) - long getBlockHeight(); - - /** - * 事件账户地址,系统事件此字段为空 - * - * @return - */ - @DataField(order = 7, primitiveType = PrimitiveType.BYTES) - Bytes getEventAccount(); -} -``` - -### 4. SDK - -`JD Chain`事件监听是`SDK`端以`拉`的方式实现,消息可重复消费,需要使用者自行保存消费位置。 - -以下只描述主要步骤,完整示例代码可参照[JD Chain Samples](samples.md)事件相关部分。 - -#### 4.1 生成事件账户 - -> 用户事件才有事件账户 - -```java -// 新建交易 -TransactionTemplate txTemp = blockchainService.newTransaction(ledger); -// 生成事件账户 -BlockchainKeypair eventAccount = BlockchainKeyGenerator.getInstance().generate(); -System.out.println("事件账户地址:" + eventAccount.getAddress()); -// 注册事件账户 -txTemp.eventAccounts().register(eventAccount.getIdentity()); -``` - -#### 4.2 事件发布 - -> 系统事件由系统运行期间自动产生,用户事件可通过SDK发布 - -```java -// 新建交易 -TransactionTemplate txTemp = blockchainService.newTransaction(ledger); - -txTemp.eventAccount(Bytes.fromBase58("LdeNr7H1CUbqe3kWjwPwiqHcmd86zEQz2VRye")) - .publish("topic1", "content1", -1) - .publish("topic1", "content2", 0) - .publish("topic1", "content3", 1) - .publish("topic2", "content", -1) - .publish("topic3", 1, -1) - .publish("topic4", Bytes.fromInt(1), -1); -``` - -支持发布数据类型: - -- `Text`,字符类型 -- `Int64`,长整型 -- `JSON`,`JSON`串 -- `Bytes`,字节数组 -- `Timestamp`,时间戳,长整型 -- `XML`,`XML`文本 -- `Image`,图片字节数据 - -> 本质上仅支持`String/Long/[]byte`这三种数据类型,`JSON/XML/Image/Timestamp`等起标识作用,用于扩展差异化数据展示等场景需求 - -`publish("topic1", "content1", -1)`中第三个参数即为事件序号,需要传入`JD Chain`网络中当前`topic1`的最高序号,首次写入时传入`-1`。 - -#### 4.3 事件监听 - -- 监听系统事件 -```java -// 目前仅有新区快产生事件 -blockchainService.monitorSystemEvent(ledger, - SystemEvent.NEW_BLOCK_CREATED, 0, (eventMessages, eventContext) -> { - for (Event eventMessage : eventMessages) { - // content中存放的是当前链上最新高度 - System.out.println("New block:" + eventMessage.getSequence() + ":" + BytesUtils.toLong(eventMessage.getContent().getBytes().toBytes())); - } - }); -``` - -- 监听用户事件: -```java -blockchainService.monitorUserEvent(ledger, "LdeNr7H1CUbqe3kWjwPwiqHcmd86zEQz2VRye", "sample-event", 0, (eventMessage, eventContext) -> { - - BytesValue content = eventMessage.getContent(); - switch (content.getType()) { - case TEXT: - case XML: - case JSON: - System.out.println(eventMessage.getName() + ":" + eventMessage.getSequence() + ":" + content.getBytes().toUTF8String()); - break; - case INT64: - case TIMESTAMP: - System.out.println(eventMessage.getName() + ":" + eventMessage.getSequence() + ":" + BytesUtils.toLong(content.getBytes().toBytes())); - break; - default: // byte[], Bytes - System.out.println(eventMessage.getName() + ":" + eventMessage.getSequence() + ":" + new String(content.getBytes().toBytes())); - break; - } -}); -``` \ No newline at end of file diff --git a/docs/gateway.md b/docs/gateway.md deleted file mode 100644 index e691ba52..00000000 --- a/docs/gateway.md +++ /dev/null @@ -1,57 +0,0 @@ -## 网关服务 - -`JD Chain`的网关服务是应用的接入层。 -终端接入是`JD Chain`网关的基本功能,在确认终端身份的同时提供连接节点、转发消息和隔离共识节点与客户端等服务。网关确认客户端的合法身份,接收并验证交易;网关根据初始配置文件与对应的共识节点建立连接,并转发交易数据。 - -### 1. 配置 - -网关配置在文件`gateway.conf`中: - -```properties -#网关的HTTP服务地址; -http.host=0.0.0.0 -#网关的HTTP服务端口; -http.port=8080 -#网关的HTTP服务上下文路径,可选; -#http.context-path= - -#共识节点的服务地址(与该网关节点连接的Peer节点的IP地址); -peer.host=127.0.0.1 -#共识节点的服务端口(与该网关节点连接的Peer节点的端口,即在Peer节点的peer-startup.sh中定义的端口); -peer.port=7080 -#共识节点的服务是否启用安全证书; -peer.secure=false - -#账本节点拓扑信息落盘,默认false。配置为true后重启网关节点时将直接使用存储中的拓扑连接; -topology.store=false - -#是否开启动态感知,默认true,即根据初始共识节点获取整个共识网络拓扑连接,网关保持对所有共识节点连接,发送交易和查询会自动选择区块高度最新的节点; -topology.aware=true - -#共识节点的服务提供解析器 -#BftSmart共识Provider:com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider -#简单消息共识Provider:com.jd.blockchain.consensus.mq.MsgQueueConsensusProvider -peer.providers=com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider - -#数据检索服务对应URL,格式:http://{ip}:{port},例如:http://127.0.0.1:10001 -#若该值不配置或配置不正确,则浏览器模糊查询部分无法正常显示 -data.retrieval.url= -schema.retrieval.url= - -#默认公钥的内容(Base58编码数据),非CA模式下必填; -keys.default.pubkey= -#默认网关证书路径(X509,PEM),CA模式下必填; -keys.default.ca-path= -#默认私钥的路径;在 pk-path 和 pk 之间必须设置其一; -keys.default.privkey-path= -#默认私钥的内容;在 pk-path 和 pk 之间必须设置其一; -keys.default.privkey= -#默认私钥的解码密码; -keys.default.privkey-password= -``` - -其中: - -- `data.retrieval.url`与`schema.retrieval.url`分别与[Argus(高级检索)](https://github.com/blockchain-jd-com/jdchain-indexer)中的[区块链基础数据检索服务](https://github.com/blockchain-jd-com/jdchain-indexer#%E5%90%AF%E5%8A%A8%E5%8C%BA%E5%9D%97%E9%93%BE%E5%9F%BA%E7%A1%80%E6%95%B0%E6%8D%AE%E7%B4%A2%E5%BC%95%E6%A3%80%E7%B4%A2%E6%9C%8D%E5%8A%A1)和[`Schema`服务](https://github.com/blockchain-jd-com/jdchain-indexer#%E5%90%AF%E5%8A%A8value%E7%B4%A2%E5%BC%95%E6%9C%8D%E5%8A%A1)相对应,只有启动并正确配置了`Argus`,`JD Chain`浏览器才能正常使用搜索功能。 - -- `keys.default`几个参数代表接入`JD Chain`网络的身份信息,只有处于非停用(`DEACTIVATED`)状态的参与方身份才可作为此处的配置。 \ No newline at end of file diff --git a/docs/indexer.md b/docs/indexer.md deleted file mode 100644 index da642c8f..00000000 --- a/docs/indexer.md +++ /dev/null @@ -1,15 +0,0 @@ -# 高级检索 - -## Argus - -穿透式检索Argus提供JD Chain区块链基础数据索引,自定义键值索引服务 - -源码已开源,请参照[Argus](https://github.com/blockchain-jd-com/jdchain-indexer)首页说明安装使用。 - -## JD Chain + Argus - -修改JD Chain网关配置文件`gateway.conf`中: -- `data.retrieval.url` 对应`Argus`中区块链基础数据检索服务 -- `schema.retrieval.url` 对应`Argus`中`Schema`服务 - -重启网关后可在区块连浏览器中使用搜索功能 \ No newline at end of file diff --git a/docs/jdchain_cli.md b/docs/jdchain_cli.md deleted file mode 100644 index 74bcc153..00000000 --- a/docs/jdchain_cli.md +++ /dev/null @@ -1,32 +0,0 @@ -## JD Chain Cli - -JD Chain 命令行工具集,提供密钥管理,实时交易,链上信息查询,离线交易,共识节点变更等操作。 - -```bash -:bin$ ./jdchain-cli.sh -h -Usage: jdchain-cli [-hV] [--pretty] [--home=] [COMMAND] -JDChain Cli is a convenient tool to manage jdchain keys, sign and send -transactions to jdchain network, query data from jdchain network. - -h, --help Show this help message and exit. - --home= Set the home directory. - --pretty Pretty json print - -V, --version Print version information and exit. - -Commands: - -The most commonly used commands are: - keys List, create, update or delete keypairs. - ca List, create, update certificates. - tx Build, sign or send transaction. - query Query commands. - participant Add, update or delete participant. - help Displays help information about the specified command - -See 'jdchain-cli help ' to read about a specific subcommand or concept. -``` - -- `keys` [密钥管理](cli/keys.md) -- `tx` [交易](cli/tx.md) -- `ca` [证书](cli/ca.md) -- `query` [链上信息查询](cli/query.md) -- `participant` [共识节点变更](cli/participant.md) \ No newline at end of file diff --git a/docs/kvdb.md b/docs/kvdb.md deleted file mode 100644 index 4774f20a..00000000 --- a/docs/kvdb.md +++ /dev/null @@ -1,365 +0,0 @@ -## RocksDB as a server - -### 1.简介 - -`KVDB`是一个简单的`NoSQL`数据库,支持简单的“键值”读写操作。 - -`KVDB`包装了`RocksDB`作为数据库引擎,实现了单机部署和集群部署。 - -`KVDB`的集群是一个分布式的分片服务集群,每个分片节点是一个`KVDB`的数据库服务实例,采用对等模式部署,没有主节点。 - -### 2.安装 - -> java 版本>= 1.8 - -下载源代码,执行: -```bash -mvn clean package -``` -`kvdb-server`模块`target`下会生成`kvdb-***.zip`,解压缩安装包,结构如下: -```bash -bin # 脚本文件目录 - start # 启动本机的数据库服务的脚本文件 - stop # 停止本机的数据库服务的脚本文件 - kvdb-cli # 连接本机的数据库服务控制台的脚本文件 - kvdb-benchmark # 基准测试 -conf # 配置文件目录 - kvdb.conf # 本机的数据库服务配置 - cluster.conf # 数据库集群的配置 -libs # 数据库服务的代码库目录 -system # 系统数据目录 - dblist # 文件记录了本数据库服务实例装载的数据库列表 - pid # 文件记录了本数据库服务实例的运行进程ID;当服务实例运行时创建,服务实例退出后删除 -``` - -### 3.部署配置 - -#### 3.1 `kvdb.conf` - -```bash -# 数据库服务的本机监听地址; -server.host=0.0.0.0 - -# 数据库服务的本机监听端口; -server.port=7078 - -# 管理控制台的端口; -# 注:管理控制台总是绑定到环回地址 127.0.0.1,只允许本机访问; -manager.port=7060 - -# 数据库实例默认的根目录 -dbs.rootdir=/usr/kvdb/dbs - -# 数据库实例默认的本地分区数 -dbs.partitions=4 - -# 是否禁用WAL -wal.disable=false - -# WAL刷新机制,-1跟随系统,0实时刷新,n(n>0)秒刷新一次 -wal.flush=1 -``` - -> `WAL`写入成功,但`RocksDB`写入失败,服务器将在后续所有数据库读写操作前根据`WAL`进行重试操作,直至成功。 - -#### 3.2 `cluster.conf` -```bash -# 数据库集群的分片数,每一个分片都赋予唯一的编号,分片编号最小为 0,所有分片的编号必须连续递增 -# ‘’表示集群名称,只允许用字母、数字、下划线组成; -cluster..partitions=3 - -# 数据库集群 ‘’ 的第 1 个分片的数据库实例地址(URL格式); -cluster..0=kvdb://:/ - -# 数据库集群 ‘’ 的第 2 个分片的数据库实例地址(URL格式); -cluster..1=kvdb://:/ - -# 数据库集群 ‘’ 的第 3 个分片的数据库实例地址(URL格式); -cluster..2=kvdb://:/ - -# 指定多个不同的集群 -#cluster..partitions=3 -... -``` -> 一个数据库实例只能加入唯一的集群;一旦加入集群,则不能再被客户端以单库连接方式访问,对该库实例的连接自动转为集群连接。集群中配置的数据库必须在`dblist`中已存在且设置为`true` -> 所有`host`使用明确的可通畅连接的地址,不同服务器节点中同一集群配置必须完全一致 - -#### 3.3 `dblist` -```bash -# 是否激活数据库 ‘’ ;如果为`true`,则创建或加载该数据库并提供访问; -# ‘’表示数据库名称,只允许用字母、数字、下划线组成; -# db..enable=true - -# 数据库 的根目录;如果未配置,则从默认目录加载(由`conf/kvdb.conf`指定了默认配置${dbs.rootdir}/); -# db.test.rootdir= - -# 数据库 的本地分区数;如果未配置,则采用`conf/kvdb.conf`中指定的默认配置${dbs.partitions} -# db.test.partitions= -``` -> `dblist`中配置的数据库会在`kvdb-server`启动时自动创建。在`kvdb-server`启动完成后由管理工具执行`create database `创建数据库,创建成功的数据库会追加到`dblist`中。使用`kvdb-cli`命令行工具执行数据库实例更新操作。 - -#### 3.4 日志 - -1. `kvdb-server` - -修改`bin`目录下,`start.sh`文件: -```bash -LOG_SET="-Dlogging.path="$HOME/logs" -Dlogging.level=ERROR" -``` -默认日志路径:程序解压缩后主目录下`logs`目录 -默认日志等级:`ERROR` - -可配置日志等级:`ALL`,`TRACE`,`DEBUG`,`INFO`,`WARN`,`ERROR`,`FATAL`,`OFF` - -2. `kvdb-cli` - -修改`bin`目录下,`kvdb-cli.sh`文件: -```bash -LOG_SET="-Dlogging.path="$HOME/logs" -Dlogging.level.root=error" -``` -默认日志路径:程序解压缩后主目录下`logs`目录 -默认日志等级:`error` - -#### 3.5 启动 - -```bash -./start.sh -``` -#### 停止 -```bash -./stop.sh -``` - -### 4.SDK - -1. 依赖 -```maven - - com.jd.blockchain - kvdb-client - ${project.version} - -``` - -2. 创建客户端连接 -```java -// `host`、`port`为服务器地址和端口,`database`为数据库名称 -KVDBClient client = new KVDBClient("kvdb://:/"); -# KVDBClient client = new KVDBClient(new KVDBURI("kvdb://:/")); -# KVDBClient client = new KVDBClient(new ClientConfig(host, port, db)); -``` - -> 对于集群的连接,客户端将开启`WAL`,在`WAL`写入成功,部分服务器失败的情况下,客户端在执行后续所有操作前都将根据`WAL`日志执行重试操作,直至成功。 - -3. 操作 - -```java -/** - * 存在性查询 - * - * @param key - * @return - * @throws KVDBException - */ -boolean exists(Bytes key) throws KVDBException; - -/** - * 存在性查询,支持多个键值 - * - * @param keys - * @return - * @throws KVDBException - */ -boolean[] exists(Bytes... keys) throws KVDBException; - -/** - * 键值获取 - * - * @param key - * @return - * @throws KVDBException - */ -Bytes get(Bytes key) throws KVDBException; - -/** - * 键值获取,支持多个键值 - * - * @param keys - * @return - * @throws KVDBException - */ -Bytes[] get(Bytes... keys) throws KVDBException; - -/** - * 设置键值对 - * - * @param key - * @param value - * @return - * @throws KVDBException - */ -boolean put(Bytes key, Bytes value) throws KVDBException; - -/** - * 设置键值对 - * - * @param key - * @param value - * @param aSync - * @return - * @throws KVDBException - */ -boolean put(Bytes key, Bytes value, boolean aSync) throws KVDBException; - -/** - * 开启批处理 - * - * @return - * @throws KVDBException - */ -boolean batchBegin() throws KVDBException; - -/** - * 取消批处理 - * - * @return - * @throws KVDBException - */ -boolean batchAbort() throws KVDBException; - -/** - * 提交批处理,服务器掉线重连后会丢失未提交批处理数据 - *

- * 未提交的`batch`对其他客户端连接不可见。 - * - * @return - * @throws KVDBException - */ -boolean batchCommit() throws KVDBException; - -/** - * 提交批处理 - * - * @param size 此次批处理操作去重后的key数量 - * @return - * @throws KVDBException - */ -boolean batchCommit(long size) throws KVDBException; - -/** - * 关闭 - */ -void close(); -``` - -### 5.管理工具 - -`kvdb-cli`是基于[`SDK`](#SDK)的命令行工具实现: - -```bash -./kvdb-cli.sh -h -p -db -t