From 6e24f268b09fce01667cb7dd5f064ab91a5cf6f4 Mon Sep 17 00:00:00 2001 From: huanghaiquan Date: Sat, 16 May 2020 23:41:10 +0800 Subject: [PATCH 01/65] upgraded submodules to developing version; --- core | 2 +- explorer | 2 +- framework | 2 +- kvdb | 2 +- libs/bft-smart | 2 +- project | 2 +- test | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core b/core index 5afafb53..ebf1cac0 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 5afafb536796160f0f6644c7955e0dc56632d141 +Subproject commit ebf1cac03975df981908eab73704b0067c3f234c diff --git a/explorer b/explorer index da3b9c92..9129de3b 160000 --- a/explorer +++ b/explorer @@ -1 +1 @@ -Subproject commit da3b9c925d7bc263474baf2c72ff0cee5c8308e1 +Subproject commit 9129de3b334b9f8b719c7687b6b276d2aa45e8c2 diff --git a/framework b/framework index 7260fab6..9c232e66 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit 7260fab6ee0336e2a197ddef7bebf2daf9363844 +Subproject commit 9c232e668fa3fbe9d977d0982f33df6deeb47c18 diff --git a/kvdb b/kvdb index 6e541d84..5bcf2116 160000 --- a/kvdb +++ b/kvdb @@ -1 +1 @@ -Subproject commit 6e541d84081362c86430a89806c7dfcbb5fd8a71 +Subproject commit 5bcf2116e20a5b0b50d00ec8a5b3f0bfe51b8155 diff --git a/libs/bft-smart b/libs/bft-smart index 1a3c32c4..271f7c0b 160000 --- a/libs/bft-smart +++ b/libs/bft-smart @@ -1 +1 @@ -Subproject commit 1a3c32c4090e3cf7551998366a4d26a0160451ec +Subproject commit 271f7c0ba76dedb4874fbbceb0bcac3306c73c7c diff --git a/project b/project index ec38eec4..e95a8d77 160000 --- a/project +++ b/project @@ -1 +1 @@ -Subproject commit ec38eec4a6269e7abd35d9ea1b67417a97815bf9 +Subproject commit e95a8d77b3732717d25f97cda2494eb4fa08d483 diff --git a/test b/test index ee858192..05de1a70 160000 --- a/test +++ b/test @@ -1 +1 @@ -Subproject commit ee858192ff9b0cc4bb8c55d9c0baa83e02fc5ca0 +Subproject commit 05de1a7062ce80f28b31277f9473953ae9aef2f8 From ad6a8f1449269e232a77d15ccabe7f09e7c84fae Mon Sep 17 00:00:00 2001 From: huanghaiquan Date: Sun, 17 May 2020 00:11:24 +0800 Subject: [PATCH 02/65] upgraded submodule "core" to 1.3.0-SNAPSHOT; --- explorer | 2 +- framework | 2 +- kvdb | 2 +- libs/bft-smart | 2 +- project | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/explorer b/explorer index 9129de3b..da3b9c92 160000 --- a/explorer +++ b/explorer @@ -1 +1 @@ -Subproject commit 9129de3b334b9f8b719c7687b6b276d2aa45e8c2 +Subproject commit da3b9c925d7bc263474baf2c72ff0cee5c8308e1 diff --git a/framework b/framework index 9c232e66..7260fab6 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit 9c232e668fa3fbe9d977d0982f33df6deeb47c18 +Subproject commit 7260fab6ee0336e2a197ddef7bebf2daf9363844 diff --git a/kvdb b/kvdb index 5bcf2116..6e541d84 160000 --- a/kvdb +++ b/kvdb @@ -1 +1 @@ -Subproject commit 5bcf2116e20a5b0b50d00ec8a5b3f0bfe51b8155 +Subproject commit 6e541d84081362c86430a89806c7dfcbb5fd8a71 diff --git a/libs/bft-smart b/libs/bft-smart index 271f7c0b..1a3c32c4 160000 --- a/libs/bft-smart +++ b/libs/bft-smart @@ -1 +1 @@ -Subproject commit 271f7c0ba76dedb4874fbbceb0bcac3306c73c7c +Subproject commit 1a3c32c4090e3cf7551998366a4d26a0160451ec diff --git a/project b/project index e95a8d77..ec38eec4 160000 --- a/project +++ b/project @@ -1 +1 @@ -Subproject commit e95a8d77b3732717d25f97cda2494eb4fa08d483 +Subproject commit ec38eec4a6269e7abd35d9ea1b67417a97815bf9 From 60eb5524086469bdd3287712905312edbabfd799 Mon Sep 17 00:00:00 2001 From: huanghaiquan Date: Sun, 17 May 2020 00:23:32 +0800 Subject: [PATCH 03/65] fixed compilation errors; --- core | 2 +- deploy/deploy-peer/pom.xml | 6 ------ deploy/pom.xml | 2 +- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/core b/core index ebf1cac0..8eb96bd9 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit ebf1cac03975df981908eab73704b0067c3f234c +Subproject commit 8eb96bd9f656fdd4432066d7f5e9a1ec444a6d6a diff --git a/deploy/deploy-peer/pom.xml b/deploy/deploy-peer/pom.xml index ed269000..1b4aa424 100644 --- a/deploy/deploy-peer/pom.xml +++ b/deploy/deploy-peer/pom.xml @@ -62,12 +62,6 @@ ${core.version} - - com.jd.blockchain - storage-service - ${core.version} - - diff --git a/deploy/pom.xml b/deploy/pom.xml index e3bdb271..2dc5cff5 100644 --- a/deploy/pom.xml +++ b/deploy/pom.xml @@ -13,7 +13,7 @@ pom - 1.2.0.RELEASE + 1.3.0-SNAPSHOT From 7b250c310e8c06bedfbcccfce3ad16543dcd5026 Mon Sep 17 00:00:00 2001 From: huanghaiquan Date: Mon, 18 May 2020 11:08:36 +0800 Subject: [PATCH 04/65] upgraded test project; --- test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test b/test index 05de1a70..6fe0f667 160000 --- a/test +++ b/test @@ -1 +1 @@ -Subproject commit 05de1a7062ce80f28b31277f9473953ae9aef2f8 +Subproject commit 6fe0f66742648e0ac749ec8f2ec8cfa6fbce7a98 From 5bde8e4c6bbf07c98dea29c9e386d4e4918bd483 Mon Sep 17 00:00:00 2001 From: huanghaiquan Date: Mon, 18 May 2020 11:11:34 +0800 Subject: [PATCH 05/65] upgraded test project; --- test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test b/test index 6fe0f667..bd78673d 160000 --- a/test +++ b/test @@ -1 +1 @@ -Subproject commit 6fe0f66742648e0ac749ec8f2ec8cfa6fbce7a98 +Subproject commit bd78673d397932becaf670c240488dc5a0bee2fa From af88e44e8f893728507cbad7627b7fb2695f0efe Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Mon, 25 May 2020 18:04:42 +0800 Subject: [PATCH 06/65] use new Privilege VO, because if use the old privilege, json instance the object by using the {0,4,5,6,7}. not we expect the result; --- core | 2 +- framework | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core b/core index 8eb96bd9..c810111f 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 8eb96bd9f656fdd4432066d7f5e9a1ec444a6d6a +Subproject commit c810111f17cc417773fea55cbcf7b2226a3dbf53 diff --git a/framework b/framework index 7260fab6..9d8f46da 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit 7260fab6ee0336e2a197ddef7bebf2daf9363844 +Subproject commit 9d8f46da1440d1668649580babe3f758bffc0d8f From d05677b8f18f10936b84484dc52b248c2f39d935 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Tue, 26 May 2020 15:35:50 +0800 Subject: [PATCH 07/65] delete the cons_parti.0.consensus.host in ledger.init; modify the installAndDeploy.md by 1.2.0.RELEASE; --- .../main/resources/config/init/ledger.init | 29 ---- .../src/main/resources/docs/安装部署.MD | 142 +++++++++++++++--- 2 files changed, 122 insertions(+), 49 deletions(-) diff --git a/deploy/deploy-peer/src/main/resources/config/init/ledger.init b/deploy/deploy-peer/src/main/resources/config/init/ledger.init index 8f06ac57..f475f0e9 100644 --- a/deploy/deploy-peer/src/main/resources/config/init/ledger.init +++ b/deploy/deploy-peer/src/main/resources/config/init/ledger.init @@ -82,13 +82,6 @@ cons_parti.0.pubkey= #第0个参与方的角色权限策略,可选值有:UNION(并集),INTERSECT(交集);可选项; #cons_parti.0.roles-policy=UNION -#第0个参与方的共识服务的主机地址; -cons_parti.0.consensus.host=127.0.0.1 -#第0个参与方的共识服务的端口; -cons_parti.0.consensus.port=8900 -#第0个参与方的共识服务是否开启安全连接; -cons_parti.0.consensus.secure=false - #第0个参与方的账本初始服务的主机; cons_parti.0.initializer.host=127.0.0.1 #第0个参与方的账本初始服务的端口; @@ -96,7 +89,6 @@ cons_parti.0.initializer.port=8800 #第0个参与方的账本初始服务是否开启安全连接; cons_parti.0.initializer.secure=false - #--------------------- #第1个参与方的名称; cons_parti.1.name= @@ -110,13 +102,6 @@ cons_parti.1.pubkey= #第1个参与方的角色权限策略,可选值有:UNION(并集),INTERSECT(交集);可选项; #cons_parti.1.roles-policy=UNION -#第1个参与方的共识服务的主机地址; -cons_parti.1.consensus.host=127.0.0.1 -#第1个参与方的共识服务的端口; -cons_parti.1.consensus.port=8910 -#第1个参与方的共识服务是否开启安全连接; -cons_parti.1.consensus.secure=false - #第1个参与方的账本初始服务的主机; cons_parti.1.initializer.host=127.0.0.1 #第1个参与方的账本初始服务的端口; @@ -137,13 +122,6 @@ cons_parti.2.pubkey= #第2个参与方的角色权限策略,可选值有:UNION(并集),INTERSECT(交集);可选项; #cons_parti.2.roles-policy=UNION -#第2个参与方的共识服务的主机地址; -cons_parti.2.consensus.host=127.0.0.1 -#第2个参与方的共识服务的端口; -cons_parti.2.consensus.port=8920 -#第2个参与方的共识服务是否开启安全连接; -cons_parti.2.consensus.secure=false - #第2个参与方的账本初始服务的主机; cons_parti.2.initializer.host=127.0.0.1 #第2个参与方的账本初始服务的端口; @@ -164,13 +142,6 @@ cons_parti.3.pubkey= #第3个参与方的角色权限策略,可选值有:UNION(并集),INTERSECT(交集);可选项; #cons_parti.3.roles-policy=INTERSECT -#第3个参与方的共识服务的主机地址; -cons_parti.3.consensus.host=127.0.0.1 -#第3个参与方的共识服务的端口; -cons_parti.3.consensus.port=8930 -#第3个参与方的共识服务是否开启安全连接; -cons_parti.3.consensus.secure=false - #第3个参与方的账本初始服务的主机; cons_parti.3.initializer.host=127.0.0.1 #第3个参与方的账本初始服务的端口; diff --git a/deploy/deploy-peer/src/main/resources/docs/安装部署.MD b/deploy/deploy-peer/src/main/resources/docs/安装部署.MD index 573d4e48..b9be1ce9 100644 --- a/deploy/deploy-peer/src/main/resources/docs/安装部署.MD +++ b/deploy/deploy-peer/src/main/resources/docs/安装部署.MD @@ -1,6 +1,6 @@ # JDChain安装部署指南 -本部署指南基于JDChain1.0.0.RELEASE版本来构建。 +本部署指南基于JDChain1.2.0.RELEASE版本来构建。 ## 1. 部署环境 ### 1.1 系统部署结构 ![部署结构](imgs/structure.png) @@ -21,7 +21,7 @@ JDChain默认共识机制采用的是BFTSmart,该共识算法要求最低四 ### 1.2 服务器配置 #### 1.2.1 硬件配置 -为了更好的运行,JDChain推荐使用 **Linux** 操作系统,Peer节点自身运行对内存要求较低,但对于Rocksdb存储而言,其对运行环境有较高要求,以下为单Peer节点可正常运行 **亿级交易** 的参考指标: +为了更好的运行,JDChain推荐使用 **Linux** 操作系统,Peer节点自身运行对内存要求较低(单节点建议Xms>=4g),但对于Rocksdb存储而言,其对运行环境有较高要求,以下为单Peer节点可正常运行 **亿级交易** 的参考指标: + 内核2.7.x及以上; + CPU主频 ≥ 2.0GHz; + 内存 ≥ 64G; @@ -59,8 +59,10 @@ Peer打包程序解压完后的安装包结构如下: + bin - keygen.sh - ledger-init.sh - - startup.sh - - shutdown.sh + - peer-startup.sh + - peer-shutdown.sh + - manager-startup.sh + - manager-shutdown.sh + config - init + ledger.init @@ -71,7 +73,6 @@ Peer打包程序解压完后的安装包结构如下: + %.pub + %.pwd - ledger-binding.conf - - application.properties + docs + libs + system @@ -152,8 +153,9 @@ local.parti.pwd=DYu3G8aGTMBW1WrTw76zxQJQU4DHLw9MLyy7peG4LKkY ledger.binding.out=../config #账本数据库的连接字符,下为rocksdb样例 -#rocksdb数据库连接格式:rocksdb://{path} -#redis数据库连接格式:redis://{ip}:{prot}/{db} +#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=rocksdb:///export/app/peer/rocks.db/rocksdb0.db #账本数据库的连接口令 @@ -168,32 +170,86 @@ ledger.db.pwd= ledger.seed=932dfe23-fe23232f-283f32fa-dd32aa76-8322ca2f-56236cda-7136b322-cb323ffe #账本的描述名称;此属性不参与共识,仅仅在当前参与方的本地节点用于描述用途; -#ledger.name= - -#声明的账本创建时间;格式为 “yyyy-MM-dd HH:mm:ss.SSSZ”,表示”年-月-日 时:分:秒:毫秒时区“;例如:“2019-10-17 05:21:58.069+0800”,其中,+0800 表示时区是东8区 -created-time=2019-10-17 05:21:58.069+0800 - +ledger.name= + +#声明的账本创建时间;格式为 “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 + + +#----------------------------------------------- +# 初始的角色名称列表;可选项; +# 角色名称不区分大小写,最长不超过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=/export/app/peer/config/init/bftsmart.config +#共识服务的参数配置;推荐使用绝对路径;必须; 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= + +#第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个参与方的账本初始服务的端口; @@ -201,24 +257,71 @@ 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个参与方的角色清单;可选项; +#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= + +#第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= + +#第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 ``` 账本初始化过程中,需要其他Peer节点的公钥信息进行验证及保存,因此每个节点都需要获取其他Peer节点的公钥信息至本地。配置中cons_parti.N.*****中的N需按照实际每个参与方定义的序号配置(该配置为local.conf中的local.parti.id)。其他参数根据实际环境进行配置。 > 注意:上述config中只显示了两个参与方(Peer节点)的配置信息,其他参与方(默认是4个节点)的配置方式一致! -##### 2.3.1.1 bftsmart.config配置 +##### 2.3.1.3 bftsmart.config配置 ```config system.server.0.network.host=127.0.0.1 system.server.0.network.port=16000 @@ -250,13 +353,12 @@ cd bin 执行命令之后,会在 *config* 目录下生成ledger-binding.conf文件,该文件即账本初始化生成的文件,Peer节点启动时需要依赖该文件。 > 1)注意:因为JDChain支持多账本形式,若config/ledger-binding.conf文件在初始化之前就存在的话,初始化操作后不会覆盖其中的内容,会以追加的方式写入。若第一次创建账本,建议先将该文件删除再进行初始化! -> 2)注意:Peer节点会定时检测ledger-binding.conf,有新账本加入时会自动进行更新,不需要重启Peer节点!目前默认时间为封5自动更新,即:每个小时的5/15/25/35/45/55分钟会执行; +> 2)注意:Peer节点会定时检测ledger-binding.conf,有新账本加入时会自动进行更新,不需要重启Peer节点!目前默认时间每隔5秒钟自动更新; 账本初始化成功后,每个Peer节点对应的Rocksdb都会写入该账本相关的数据。 ### 2.4 Peer节点安装 -Peer节点启动依赖于 *config* 目录下ledger-binding.conf的配置,该文件由 *2.3章节* 操作生成,无须做任何修改;application.properties文件中主要用于配置Peer节点对外HTTP端口。 -> 注意:application.properties文件可能不存在,可手动创建。该文件中配置适用于SpringBoot2.x版本的相关参数,不限于目前内置的启动端口。 +Peer节点启动依赖于 *config* 目录下ledger-binding.conf的配置,该文件由 *2.3章节* 操作生成,无须做任何修改。 由于Peer节点启动后会自动与其他参与节点进行通信,因此需要同时启动4个Peer节点,只需要执行startup.sh即可,参考命令: ```shell @@ -265,7 +367,7 @@ cd bin ``` > 1)注意:startup.sh命令中可修改启动端口,默认为:-p 7080; -> 2)注意:Peer节点会与账本中涉及到的参与方进行通信,当通信不成功(例如有节点尚未启动)时,会自动进行重试,因此多个Peer节点启动可不必完全同时进行。目前默认设置为重试16次操作,每次间隔时间2秒。 +> 2)注意:Peer节点会与账本中涉及到的参与方进行通信,当通信不成功(例如有节点尚未启动)时,会自动进行重试,因此多个Peer节点启动可不必完全同时进行。目前默认设置为重试180次操作,每次间隔时间10秒。 ### 2.5 Gateway节点安装 GateWay(网关)节点可以认为是一个过滤节点,交易的提交及账本的查询都需要通过网关节点与Peer节点进行通信。 From 788f8ba507c2125f22ddb3260d4e02707bfe65fc Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Tue, 26 May 2020 15:59:35 +0800 Subject: [PATCH 08/65] update the installAndDeploy.md by 1.2.0.RELEASE; --- .../src/main/resources/docs/安装部署.MD | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/deploy/deploy-peer/src/main/resources/docs/安装部署.MD b/deploy/deploy-peer/src/main/resources/docs/安装部署.MD index b9be1ce9..a34995e6 100644 --- a/deploy/deploy-peer/src/main/resources/docs/安装部署.MD +++ b/deploy/deploy-peer/src/main/resources/docs/安装部署.MD @@ -79,7 +79,7 @@ Peer打包程序解压完后的安装包结构如下: 其中目录说明如下: + **bin** :相关命令操作目录; - + **config** :对应命令的配置目录,keys路径解压时不存在,会在执行keygen.sh脚本时自动创建;ledger-binding.conf文件解压时不存在,会在成功执行ledger-init.sh脚本后生成; + + **config** :对应命令的配置目录,keys路径解压时不存在,会在执行keygen.sh脚本时自动创建;ledger-binding.conf文件解压时不存在,会在成功执行ledger-init.sh脚本后生成; + **docs** :相关文档保存目录; + **libs** :项目运行依赖第三方及非system依赖包保存路径; + **system** :项目运行系统包保存路径; @@ -188,11 +188,11 @@ created-time=2019-08-01 14:26:58.069+0800 # 赋予角色的账本权限清单;可选项; # 可选的权限如下; # AUTHORIZE_ROLES, SET_CONSENSUS, SET_CRYPTO, REGISTER_PARTICIPANT, -# REGISTER_USER, REGISTER_DATA_ACCOUNT, REGISTER_CONTRACT, UPGRADE_CONTRACT, -# SET_USER_ATTRIBUTES, WRITE_DATA_ACCOUNT, +# 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 # 赋予角色的交易权限清单;可选项; @@ -208,7 +208,7 @@ created-time=2019-08-01 14:26:58.069+0800 #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.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 # 访客角色:不具备任何的账本权限,只有数据读取的操作;也只能够通过调用合约来读取数据; From 42348f4334e34f2f8cc98b14c123bfe6e8f8c5ec Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Tue, 26 May 2020 16:46:51 +0800 Subject: [PATCH 09/65] optimize the "2.3.2 init deploy"; --- .../src/main/resources/docs/安装部署.MD | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/deploy/deploy-peer/src/main/resources/docs/安装部署.MD b/deploy/deploy-peer/src/main/resources/docs/安装部署.MD index a34995e6..57098933 100644 --- a/deploy/deploy-peer/src/main/resources/docs/安装部署.MD +++ b/deploy/deploy-peer/src/main/resources/docs/安装部署.MD @@ -350,7 +350,16 @@ system.initial.view = 0,1,2,3 cd bin ./ledger-init.sh ``` -执行命令之后,会在 *config* 目录下生成ledger-binding.conf文件,该文件即账本初始化生成的文件,Peer节点启动时需要依赖该文件。 +执行命令之后,控制台会显示如下类似信息: +``` +------ Web controller of Ledger Initializer[127.0.0.1:30010] was started. ------ + +Init settings and sign permision... +[PERMISSION_READY] Ledger init permission has already prepared! Any key to continue... +``` +然后需要依次启动剩余节点的初始化脚本(*ledger-init.sh*),根据提示按任意键继续。 +如果其它节点没有准备好,控制台会展示“Connection refused”异常信息,不断进行重试操作。目前默认设置为重试180次操作,每次间隔时间10秒。 +执行成功后会在 *config* 目录下生成ledger-binding.conf文件,该文件即账本初始化生成的文件,Peer节点启动时需要依赖该文件。 > 1)注意:因为JDChain支持多账本形式,若config/ledger-binding.conf文件在初始化之前就存在的话,初始化操作后不会覆盖其中的内容,会以追加的方式写入。若第一次创建账本,建议先将该文件删除再进行初始化! > 2)注意:Peer节点会定时检测ledger-binding.conf,有新账本加入时会自动进行更新,不需要重启Peer节点!目前默认时间每隔5秒钟自动更新; @@ -367,7 +376,7 @@ cd bin ``` > 1)注意:startup.sh命令中可修改启动端口,默认为:-p 7080; -> 2)注意:Peer节点会与账本中涉及到的参与方进行通信,当通信不成功(例如有节点尚未启动)时,会自动进行重试,因此多个Peer节点启动可不必完全同时进行。目前默认设置为重试180次操作,每次间隔时间10秒。 +> 2)注意:Peer节点会与账本中涉及到的参与方进行通信,当通信不成功(例如有节点尚未启动)时,会自动进行重试,因此多个Peer节点启动可不必完全同时进行。 ### 2.5 Gateway节点安装 GateWay(网关)节点可以认为是一个过滤节点,交易的提交及账本的查询都需要通过网关节点与Peer节点进行通信。 From 1b7b60de3dc0f1b12957d653f1a4ade32828cb10 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Wed, 27 May 2020 10:51:53 +0800 Subject: [PATCH 10/65] startup.sh -> peer-startup.sh --- deploy/deploy-peer/src/main/resources/docs/安装部署.MD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/deploy-peer/src/main/resources/docs/安装部署.MD b/deploy/deploy-peer/src/main/resources/docs/安装部署.MD index 57098933..ea6432e9 100644 --- a/deploy/deploy-peer/src/main/resources/docs/安装部署.MD +++ b/deploy/deploy-peer/src/main/resources/docs/安装部署.MD @@ -372,7 +372,7 @@ Peer节点启动依赖于 *config* 目录下ledger-binding.conf的配置,该 由于Peer节点启动后会自动与其他参与节点进行通信,因此需要同时启动4个Peer节点,只需要执行startup.sh即可,参考命令: ```shell cd bin -./startup.sh +./peer-startup.sh ``` > 1)注意:startup.sh命令中可修改启动端口,默认为:-p 7080; From b726ca33f6821ed3e841733e664212d9c91fb9f9 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Thu, 4 Jun 2020 15:10:56 +0800 Subject: [PATCH 11/65] modify contract's manual; --- .../docs/design_contract-dev-manual.md | 436 ++++++++++++++++++ 1 file changed, 436 insertions(+) create mode 100644 deploy/deploy-gateway/src/main/resources/docs/design_contract-dev-manual.md diff --git a/deploy/deploy-gateway/src/main/resources/docs/design_contract-dev-manual.md b/deploy/deploy-gateway/src/main/resources/docs/design_contract-dev-manual.md new file mode 100644 index 00000000..619159b7 --- /dev/null +++ b/deploy/deploy-gateway/src/main/resources/docs/design_contract-dev-manual.md @@ -0,0 +1,436 @@ +# 智能合约开发手册 +版本|修改时间|修改人 +---|:--:|---: +V1.0|2020-04-17|huanghaiquan + +--- + + + +### 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.2.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、黑名单调用限制(具体黑名单可查看配置文件),需要注意的是,黑名单分析策略会递归分析类实现的接口和父类,也就是说调用一个实现了指定黑名单接口的类也是不允许的; + 目前设置的黑名单如下: + 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; + } + } + ``` + #### 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 + + + + + 3snPdw7i7Po4fYcXFxS4QztR8Dm4kLBdBpjsemuGPZRyZRBmtn5Z5u + + + + + 3snPdw7i7PjVKiTH2VnXZu5H8QmNaSXpnk4ei533jFpuifyjS5zzH9 + 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= 3snPdw7i7PajLB35tEau1kmixc6ZrjLXgxwKbkv5bHhP7nT5dhD9eX \ + -DcontractAddress= LdeNt7sEmTirh9PmE7axKvA2txTrbB9kxz6KB \ + -DsignerPubKey=3snPdw7i7PjVKiTH2VnXZu5H8QmNaSXpnk4ei533jFpuifyjS5zzH9 \ + -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 + + + + + 3snPdw7i7PjVKiTH2VnXZu5H8QmNaSXpnk4ei533jFpuifyjS5zzH9 + 177gjzHTznYdPgWqZrH43W3yp37onm74wYXT4v9FukpCHBrhRysBBZh7Pzdo5AMRyQGJD7x + DYu3G8aGTMBW1WrTw76zxQJQU4DHLw9MLyy7peG4LKkY + + + + + ``` \ No newline at end of file From bc3d20116a42656c2f7a0ec905f3d2351e3fb757 Mon Sep 17 00:00:00 2001 From: huanghaiquan Date: Mon, 29 Jun 2020 17:11:08 +0800 Subject: [PATCH 12/65] init release 1.3.0; --- core | 2 +- explorer | 2 +- framework | 2 +- kvdb | 2 +- libs/bft-smart | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core b/core index 8eb96bd9..b403fb2e 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 8eb96bd9f656fdd4432066d7f5e9a1ec444a6d6a +Subproject commit b403fb2efa5d91ff08a711fddaefd1485c8c3508 diff --git a/explorer b/explorer index da3b9c92..95c6dd67 160000 --- a/explorer +++ b/explorer @@ -1 +1 @@ -Subproject commit da3b9c925d7bc263474baf2c72ff0cee5c8308e1 +Subproject commit 95c6dd67e11745ce010ff3555e0a724a6ff86e5a diff --git a/framework b/framework index 7260fab6..8a15a216 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit 7260fab6ee0336e2a197ddef7bebf2daf9363844 +Subproject commit 8a15a21672afe69b8570875a6670e4fb2cbf6bdc diff --git a/kvdb b/kvdb index 6e541d84..410de249 160000 --- a/kvdb +++ b/kvdb @@ -1 +1 @@ -Subproject commit 6e541d84081362c86430a89806c7dfcbb5fd8a71 +Subproject commit 410de24918b6c7214bafe316f5cc734d87c5b433 diff --git a/libs/bft-smart b/libs/bft-smart index 1a3c32c4..7c8e11bb 160000 --- a/libs/bft-smart +++ b/libs/bft-smart @@ -1 +1 @@ -Subproject commit 1a3c32c4090e3cf7551998366a4d26a0160451ec +Subproject commit 7c8e11bb62f2230465ac4a8df9c53a26673e503d From e47d81508869ebc720f7a46a903ec36fd455b997 Mon Sep 17 00:00:00 2001 From: huanghaiquan Date: Mon, 29 Jun 2020 18:41:01 +0800 Subject: [PATCH 13/65] released 1.3.0; --- core | 2 +- deploy/deploy-kvdb/pom.xml | 12 ++++++------ deploy/pom.xml | 3 ++- framework | 2 +- test | 2 +- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/core b/core index b403fb2e..fc2dfc06 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit b403fb2efa5d91ff08a711fddaefd1485c8c3508 +Subproject commit fc2dfc06a193730e6e4fb1efa45cb4e17154361a diff --git a/deploy/deploy-kvdb/pom.xml b/deploy/deploy-kvdb/pom.xml index a1e02938..0f25a4a5 100644 --- a/deploy/deploy-kvdb/pom.xml +++ b/deploy/deploy-kvdb/pom.xml @@ -17,37 +17,37 @@ com.jd.blockchain kvdb-protocol - ${version} + ${kvdb.version} com.jd.blockchain kvdb-engine - ${version} + ${kvdb.version} com.jd.blockchain kvdb-server - ${version} + ${kvdb.version} com.jd.blockchain kvdb-cli - ${version} + ${kvdb.version} com.jd.blockchain kvdb-benchmark - ${version} + ${kvdb.version} com.jd.blockchain kvdb-client - ${version} + ${kvdb.version} diff --git a/deploy/pom.xml b/deploy/pom.xml index 2dc5cff5..8822d464 100644 --- a/deploy/pom.xml +++ b/deploy/pom.xml @@ -13,7 +13,8 @@ pom - 1.3.0-SNAPSHOT + 1.3.0.RELEASE + 1.0.1.RELEASE diff --git a/framework b/framework index 8a15a216..fd178c73 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit 8a15a21672afe69b8570875a6670e4fb2cbf6bdc +Subproject commit fd178c73d27abdc829e9b6c26f842237ab16482d diff --git a/test b/test index bd78673d..d6ba6b69 160000 --- a/test +++ b/test @@ -1 +1 @@ -Subproject commit bd78673d397932becaf670c240488dc5a0bee2fa +Subproject commit d6ba6b69b63136debd8e40543c85e60c9ec6352e From f767b259636ff2d971e78fc55a9a3f95a84e0353 Mon Sep 17 00:00:00 2001 From: huanghaiquan Date: Fri, 3 Jul 2020 15:57:12 +0800 Subject: [PATCH 14/65] marked 1.3.0.RELEASE; --- core | 2 +- framework | 2 +- test | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core b/core index fc2dfc06..3b49b41b 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit fc2dfc06a193730e6e4fb1efa45cb4e17154361a +Subproject commit 3b49b41b1c2a3ceb3603b52e9915d8a495a3bd3d diff --git a/framework b/framework index fd178c73..6b7812d0 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit fd178c73d27abdc829e9b6c26f842237ab16482d +Subproject commit 6b7812d084392330a5ad18194ccee1da7c0db2d2 diff --git a/test b/test index d6ba6b69..e84ea917 160000 --- a/test +++ b/test @@ -1 +1 @@ -Subproject commit d6ba6b69b63136debd8e40543c85e60c9ec6352e +Subproject commit e84ea91775a9c2d58a0d05844b2f69cac369cd5f From ecce5c10097b41dd77117b9ad950696f8cbcdd3a Mon Sep 17 00:00:00 2001 From: huanghaiquan Date: Fri, 3 Jul 2020 16:05:33 +0800 Subject: [PATCH 15/65] updated bftsmart to 0.6.3.RELEASE; --- libs/bft-smart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/bft-smart b/libs/bft-smart index 7c8e11bb..a50dba1c 160000 --- a/libs/bft-smart +++ b/libs/bft-smart @@ -1 +1 @@ -Subproject commit 7c8e11bb62f2230465ac4a8df9c53a26673e503d +Subproject commit a50dba1c54aa38d69380f97728081bfe5185c070 From 13b63babc59358d424211bd069b6f7d2a5535b8f Mon Sep 17 00:00:00 2001 From: zhangshuang Date: Fri, 3 Jul 2020 16:40:56 +0800 Subject: [PATCH 16/65] solve release compile error --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index 3b49b41b..6c03e690 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 3b49b41b1c2a3ceb3603b52e9915d8a495a3bd3d +Subproject commit 6c03e690a9443e78e15dcda5cc667668aaad4956 From d585905c20ee60443f8e670ac630c224745892bb Mon Sep 17 00:00:00 2001 From: zhangshuang Date: Fri, 3 Jul 2020 17:46:54 +0800 Subject: [PATCH 17/65] solve compile error --- core | 2 +- framework | 2 +- test | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core b/core index 6c03e690..aa00bc52 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 6c03e690a9443e78e15dcda5cc667668aaad4956 +Subproject commit aa00bc524d040470c62994b97d3a465d8c38ab3f diff --git a/framework b/framework index 6b7812d0..91c8aa0c 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit 6b7812d084392330a5ad18194ccee1da7c0db2d2 +Subproject commit 91c8aa0c21ef2f4fd81b60631ac25124e4cb5605 diff --git a/test b/test index e84ea917..e74d10c1 160000 --- a/test +++ b/test @@ -1 +1 @@ -Subproject commit e84ea91775a9c2d58a0d05844b2f69cac369cd5f +Subproject commit e74d10c11dd907b95eb3aace4d0be526c64963ff From d02ec0eac0fc41d9df494be1b4192ede1691a6ea Mon Sep 17 00:00:00 2001 From: zhangshuang Date: Fri, 3 Jul 2020 17:57:19 +0800 Subject: [PATCH 18/65] solve test error, delete non existed dependency --- test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test b/test index e74d10c1..ff39c597 160000 --- a/test +++ b/test @@ -1 +1 @@ -Subproject commit e74d10c11dd907b95eb3aace4d0be526c64963ff +Subproject commit ff39c5974b5d91d48ce9708dbf296f7c363c6758 From 1123450fd6f39d32cb85c67474515ebbafbb18bb Mon Sep 17 00:00:00 2001 From: zhangshuang Date: Fri, 3 Jul 2020 18:19:42 +0800 Subject: [PATCH 19/65] add sdk test sample for main project --- .../samples/SDKDemo_ActiveParticipant.java | 57 +++++++++ .../samples/SDKDemo_RegistParticipant.java | 87 ++++++++++++++ .../samples/SDK_RegistParticipant_Demo.java | 51 ++++++++ ...ateWay_Participant_State_Update_Test_.java | 113 ------------------ 4 files changed, 195 insertions(+), 113 deletions(-) create mode 100644 samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_ActiveParticipant.java create mode 100644 samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_RegistParticipant.java create mode 100644 samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDK_RegistParticipant_Demo.java delete mode 100644 samples/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java diff --git a/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_ActiveParticipant.java b/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_ActiveParticipant.java new file mode 100644 index 00000000..a00e8fb3 --- /dev/null +++ b/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_ActiveParticipant.java @@ -0,0 +1,57 @@ +package com.jd.blockchain.sdk.samples; + +import com.jd.blockchain.ledger.TransactionResponse; +import com.jd.blockchain.utils.http.ResponseConverter; +import com.jd.blockchain.utils.web.client.WebResponseConverter; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: zhangshuang + * @Date: 2020/5/27 5:18 PM + * Version 1.0 + */ +public class SDKDemo_ActiveParticipant { + + // 接受激活参与方操作的共识节点Http服务地址, 根据具体环境配置进行修改 + private static String httpIp = "127.0.0.1"; + private static String httpPort = "7085"; + + + public static void main(String[] args) { + + String url = "http://" + httpIp + ":" + httpPort + "/management/delegate/activeparticipant"; + + System.out.println("url = " + url); + + HttpPost httpPost = new HttpPost(url); + + List para=new ArrayList(); + + // 账本值根据具体情况进行修改 + BasicNameValuePair base58LedgerHash = new BasicNameValuePair("ledgerHash", "j5n3SmYT3rS5aDgwQbDUxBYUMEP9GvVfMiQK3Tcr3vxz3M"); + + para.add(base58LedgerHash); + + try { + httpPost.setEntity(new UrlEncodedFormEntity(para,"UTF-8")); + HttpClient httpClient = HttpClients.createDefault(); + + HttpResponse response = httpClient.execute(httpPost); + ResponseConverter responseConverter = new WebResponseConverter(TransactionResponse.class); + Object converterResponse = responseConverter.getResponse(null, response.getEntity().getContent(), null); + System.out.println("response result = " + ((TransactionResponse)converterResponse).getExecutionState()); + + } catch (Exception e) { + e.printStackTrace(); + System.out.println("Active participant post request error!"); + } + } +} diff --git a/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_RegistParticipant.java b/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_RegistParticipant.java new file mode 100644 index 00000000..dea45458 --- /dev/null +++ b/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_RegistParticipant.java @@ -0,0 +1,87 @@ +package com.jd.blockchain.sdk.samples; + +import com.jd.blockchain.binaryproto.DataContractRegistry; +import com.jd.blockchain.crypto.*; +import com.jd.blockchain.ledger.*; +import com.jd.blockchain.sdk.BlockchainService; +import com.jd.blockchain.sdk.client.GatewayServiceFactory; +import com.jd.blockchain.utils.net.NetworkAddress; + +/** + * @Author: zhangshuang + * @Date: 2020/5/27 5:18 PM + * Version 1.0 + */ +public class SDKDemo_RegistParticipant { + + public static void main(String[] args) { + PrivKey privKey; + PubKey pubKey; + + BlockchainKeypair CLIENT_CERT = null; + + String GATEWAY_IPADDR = null; + + int GATEWAY_PORT; + + boolean SECURE; + + BlockchainService service; + + //根据密码工具产生的公私钥 + String PUB = "3snPdw7i7PkdgqiGX7GbZuFSi1cwZn7vtjw4vifb1YoXgr9k6Kfmis"; + String PRIV = "177gjtZu8w1phqHFVNiFhA35cfimXmP6VuqrBFhfbXBWK8s4TRwro2tnpffwP1Emwr6SMN6"; + + privKey = SDKDemo_Params.privkey1; + pubKey = SDKDemo_Params.pubKey1; + + CLIENT_CERT = new BlockchainKeypair(SDKDemo_Params.pubKey0, SDKDemo_Params.privkey0); + GATEWAY_IPADDR = "127.0.0.1"; + GATEWAY_PORT = 11000; + SECURE = false; + GatewayServiceFactory serviceFactory = GatewayServiceFactory.connect(GATEWAY_IPADDR, GATEWAY_PORT, SECURE, + CLIENT_CERT); + service = serviceFactory.getBlockchainService(); + + DataContractRegistry.register(TransactionContent.class); + DataContractRegistry.register(TransactionContentBody.class); + DataContractRegistry.register(TransactionRequest.class); + DataContractRegistry.register(NodeRequest.class); + DataContractRegistry.register(EndpointRequest.class); + DataContractRegistry.register(TransactionResponse.class); + DataContractRegistry.register(ParticipantRegisterOperation.class); + DataContractRegistry.register(ParticipantStateUpdateOperation.class); + + HashDigest[] ledgerHashs = service.getLedgerHashs(); + // 在本地定义注册账号的 TX; + TransactionTemplate txTemp = service.newTransaction(ledgerHashs[0]); + + //existed signer + AsymmetricKeypair keyPair = new BlockchainKeypair(pubKey, privKey); + + privKey = KeyGenUtils.decodePrivKeyWithRawPassword(PRIV, SDKDemo_Constant.PASSWORD); + + pubKey = KeyGenUtils.decodePubKey(PUB); + + System.out.println("Address = " + AddressEncoding.generateAddress(pubKey)); + + BlockchainKeypair user = new BlockchainKeypair(pubKey, privKey); + + // 新参与方的共识网络地址 + NetworkAddress networkAddress = new NetworkAddress("127.0.0.1", 20000); + + // 注册参与方 + txTemp.participants().register("Peer4", user.getIdentity(), networkAddress); + + // TX 准备就绪; + PreparedTransaction prepTx = txTemp.prepare(); + + // 使用私钥进行签名; + prepTx.sign(keyPair); + + // 提交交易; + TransactionResponse transactionResponse = prepTx.commit(); + } + + +} diff --git a/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDK_RegistParticipant_Demo.java b/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDK_RegistParticipant_Demo.java new file mode 100644 index 00000000..4f880311 --- /dev/null +++ b/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDK_RegistParticipant_Demo.java @@ -0,0 +1,51 @@ +package com.jd.blockchain.sdk.samples; + +import com.jd.blockchain.crypto.AddressEncoding; +import com.jd.blockchain.crypto.KeyGenUtils; +import com.jd.blockchain.crypto.PrivKey; +import com.jd.blockchain.crypto.PubKey; +import com.jd.blockchain.ledger.*; +import com.jd.blockchain.utils.net.NetworkAddress; + +public class SDK_RegistParticipant_Demo extends SDK_Base_Demo { + + public static void main(String[] args) { + new SDK_RegistParticipant_Demo().regParticipant(); + } + + public void regParticipant() { + + //新参与方的公私钥 + String PUB = "3snPdw7i7PjVKiTH2VnXZu5H8QmNaSXpnk4ei533jFpuifyjS5zzH9"; + String PRIV = "177gjzHTznYdPgWqZrH43W3yp37onm74wYXT4v9FukpCHBrhRysBBZh7Pzdo5AMRyQGJD7x"; + + PrivKey privKey = KeyGenUtils.decodePrivKeyWithRawPassword(PRIV, SDKDemo_Constant.PASSWORD); + + PubKey pubKey = KeyGenUtils.decodePubKey(PUB); + + System.out.println("Address = " + AddressEncoding.generateAddress(pubKey)); + + BlockchainKeypair user = new BlockchainKeypair(pubKey, privKey); + + // 新参与方的共识网络地址 + NetworkAddress networkAddress = new NetworkAddress("127.0.0.1", 20000); + + // 定义交易模板 + TransactionTemplate txTpl = blockchainService.newTransaction(ledgerHash); + + // 注册参与方 + txTpl.participants().register("Peer4", user.getIdentity(), networkAddress); + + // TX 准备就绪; + PreparedTransaction prepTx = txTpl.prepare(); + + // 使用私钥进行签名; + prepTx.sign(adminKey); + + // 提交交易; + TransactionResponse transactionResponse = prepTx.commit(); + + System.out.println(transactionResponse.isSuccess()); + + } +} diff --git a/samples/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java b/samples/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java deleted file mode 100644 index d1ffb9e6..00000000 --- a/samples/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java +++ /dev/null @@ -1,113 +0,0 @@ -package test.com.jd.blockchain.sdk.test; - -import static org.junit.Assert.assertTrue; - -import org.junit.Before; -import org.junit.Test; - -import com.jd.blockchain.binaryproto.DataContractRegistry; -import com.jd.blockchain.crypto.AddressEncoding; -import com.jd.blockchain.crypto.AsymmetricKeypair; -import com.jd.blockchain.crypto.HashDigest; -import com.jd.blockchain.crypto.KeyGenUtils; -import com.jd.blockchain.crypto.PrivKey; -import com.jd.blockchain.crypto.PubKey; -import com.jd.blockchain.ledger.BlockchainKeypair; -import com.jd.blockchain.ledger.EndpointRequest; -import com.jd.blockchain.ledger.NodeRequest; -import com.jd.blockchain.ledger.ParticipantNodeState; -import com.jd.blockchain.ledger.ParticipantRegisterOperation; -import com.jd.blockchain.ledger.ParticipantStateUpdateOperation; -import com.jd.blockchain.ledger.PreparedTransaction; -import com.jd.blockchain.ledger.TransactionContent; -import com.jd.blockchain.ledger.TransactionContentBody; -import com.jd.blockchain.ledger.TransactionRequest; -import com.jd.blockchain.ledger.TransactionResponse; -import com.jd.blockchain.ledger.TransactionTemplate; -import com.jd.blockchain.sdk.BlockchainService; -import com.jd.blockchain.sdk.client.GatewayServiceFactory; -import com.jd.blockchain.sdk.samples.SDKDemo_Constant; -import com.jd.blockchain.utils.net.NetworkAddress; - -/** - * 参与方状态更新测试 - * @author zhangshuang - * @create 2019/7/18 - * @since 1.0.0 - */ -public class SDK_GateWay_Participant_State_Update_Test_ { - private PrivKey privKey; - private PubKey pubKey; - - private BlockchainKeypair CLIENT_CERT = null; - - private String GATEWAY_IPADDR = null; - - private int GATEWAY_PORT; - - private boolean SECURE; - - private BlockchainService service; - - //根据密码工具产生的公私钥 - static String PUB = "3snPdw7i7PkdgqiGX7GbZuFSi1cwZn7vtjw4vifb1YoXgr9k6Kfmis"; - String PRIV = "177gjtZu8w1phqHFVNiFhA35cfimXmP6VuqrBFhfbXBWK8s4TRwro2tnpffwP1Emwr6SMN6"; - - @Before - public void init() { - - privKey = SDK_GateWay_KeyPair_Para.privkey1; - pubKey = SDK_GateWay_KeyPair_Para.pubKey1; - - CLIENT_CERT = new BlockchainKeypair(SDK_GateWay_KeyPair_Para.pubKey0, SDK_GateWay_KeyPair_Para.privkey0); - GATEWAY_IPADDR = "127.0.0.1"; - GATEWAY_PORT = 11000; - SECURE = false; - GatewayServiceFactory serviceFactory = GatewayServiceFactory.connect(GATEWAY_IPADDR, GATEWAY_PORT, SECURE, - CLIENT_CERT); - service = serviceFactory.getBlockchainService(); - - DataContractRegistry.register(TransactionContent.class); - DataContractRegistry.register(TransactionContentBody.class); - DataContractRegistry.register(TransactionRequest.class); - DataContractRegistry.register(NodeRequest.class); - DataContractRegistry.register(EndpointRequest.class); - DataContractRegistry.register(TransactionResponse.class); - DataContractRegistry.register(ParticipantRegisterOperation.class); - DataContractRegistry.register(ParticipantStateUpdateOperation.class); - DataContractRegistry.register(ParticipantStateUpdateOperation.class); - } - - @Test - public void updateParticipantState_Test() { - HashDigest[] ledgerHashs = service.getLedgerHashs(); - // 在本地定义注册账号的 TX; - TransactionTemplate txTemp = service.newTransaction(ledgerHashs[0]); - - //existed signer - AsymmetricKeypair keyPair = new BlockchainKeypair(pubKey, privKey); - - PrivKey privKey = KeyGenUtils.decodePrivKeyWithRawPassword(PRIV, SDKDemo_Constant.PASSWORD); - - PubKey pubKey = KeyGenUtils.decodePubKey(PUB); - - System.out.println("Address = "+AddressEncoding.generateAddress(pubKey)); - - BlockchainKeypair user = new BlockchainKeypair(pubKey, privKey); - - NetworkAddress networkAddress = new NetworkAddress("127.0.0.1", 20000); - - txTemp.states().update(user.getIdentity(),networkAddress, ParticipantNodeState.ACTIVED); - - // TX 准备就绪; - PreparedTransaction prepTx = txTemp.prepare(); - - // 使用私钥进行签名; - prepTx.sign(keyPair); - - // 提交交易; - TransactionResponse transactionResponse = prepTx.commit(); - assertTrue(transactionResponse.isSuccess()); - - } -} From 6e439dca8e5c1ae5a565a219df31a79383127c10 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Mon, 6 Jul 2020 13:45:18 +0800 Subject: [PATCH 20/65] Merge branch 'release/1.3.0' into test/1.3.0 # Conflicts: # core # explorer # framework # libs/bft-smart --- deploy/deploy-peer/src/main/resources/docs/安装部署.MD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deploy/deploy-peer/src/main/resources/docs/安装部署.MD b/deploy/deploy-peer/src/main/resources/docs/安装部署.MD index b9be1ce9..b0daa476 100644 --- a/deploy/deploy-peer/src/main/resources/docs/安装部署.MD +++ b/deploy/deploy-peer/src/main/resources/docs/安装部署.MD @@ -1,6 +1,6 @@ # JDChain安装部署指南 -本部署指南基于JDChain1.2.0.RELEASE版本来构建。 +本部署指南基于JDChain1.3.0.RELEASE版本来构建。 ## 1. 部署环境 ### 1.1 系统部署结构 ![部署结构](imgs/structure.png) @@ -367,7 +367,7 @@ cd bin ``` > 1)注意:startup.sh命令中可修改启动端口,默认为:-p 7080; -> 2)注意:Peer节点会与账本中涉及到的参与方进行通信,当通信不成功(例如有节点尚未启动)时,会自动进行重试,因此多个Peer节点启动可不必完全同时进行。目前默认设置为重试180次操作,每次间隔时间10秒。 +> 2)注意:Peer节点会与账本中涉及到的参与方进行通信,当通信不成功(例如有节点尚未启动)时,会自动进行重试,因此多个Peer节点启动可不必完全同时进行。目前默认设置为重试601次操作,每次间隔时间3秒。 ### 2.5 Gateway节点安装 GateWay(网关)节点可以认为是一个过滤节点,交易的提交及账本的查询都需要通过网关节点与Peer节点进行通信。 From 2dc0eeeeaa5dc5b8fee1cfa2e844fa3070271658 Mon Sep 17 00:00:00 2001 From: huanghaiquan Date: Tue, 7 Jul 2020 16:56:23 +0800 Subject: [PATCH 21/65] upgraded core and framework; --- core | 2 +- framework | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core b/core index aa00bc52..37ea4d47 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit aa00bc524d040470c62994b97d3a465d8c38ab3f +Subproject commit 37ea4d47e1dee444673d07775d39a85fbde9324e diff --git a/framework b/framework index 91c8aa0c..ebaffbaa 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit 91c8aa0c21ef2f4fd81b60631ac25124e4cb5605 +Subproject commit ebaffbaaf3ca0dab5c08ad4caaef3a2c91650287 From 5f074dab21a5c887ad65e90262a337a568f721a5 Mon Sep 17 00:00:00 2001 From: shaozhuguang Date: Tue, 7 Jul 2020 17:39:44 +0800 Subject: [PATCH 22/65] modify header --- core | 2 +- framework | 2 +- test | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core b/core index 37ea4d47..20f0b6da 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 37ea4d47e1dee444673d07775d39a85fbde9324e +Subproject commit 20f0b6da79bc0152c53db2a69fbae2f535719378 diff --git a/framework b/framework index ebaffbaa..bc5783e8 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit ebaffbaaf3ca0dab5c08ad4caaef3a2c91650287 +Subproject commit bc5783e8709f53ef6cde003adc9eb4c40a7f578e diff --git a/test b/test index ff39c597..f8705658 160000 --- a/test +++ b/test @@ -1 +1 @@ -Subproject commit ff39c5974b5d91d48ce9708dbf296f7c363c6758 +Subproject commit f8705658a9b3a9a0a01bf340a0d95e229524ab8d From 6b527f3693b84bdf23e95bac47faf6200dbdfd80 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Tue, 7 Jul 2020 19:15:19 +0800 Subject: [PATCH 23/65] =?UTF-8?q?update=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core | 2 +- framework | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core b/core index 20f0b6da..46543c59 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 20f0b6da79bc0152c53db2a69fbae2f535719378 +Subproject commit 46543c59d3d3fa9636845ce543307e1d470319d5 diff --git a/framework b/framework index bc5783e8..0aa73602 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit bc5783e8709f53ef6cde003adc9eb4c40a7f578e +Subproject commit 0aa736029eb6a36d3ff04d7372138b6faed7d217 From 461149d93852895e1f4a1e091bcfab73b73b5868 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Tue, 7 Jul 2020 19:17:45 +0800 Subject: [PATCH 24/65] update --- explorer | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/explorer b/explorer index 95c6dd67..7e9c83c8 160000 --- a/explorer +++ b/explorer @@ -1 +1 @@ -Subproject commit 95c6dd67e11745ce010ff3555e0a724a6ff86e5a +Subproject commit 7e9c83c891dab9e9700c51b6fc6910c0a8b2d932 From 0a2dc646bfbe1d56a1f60145fdb2f9725bcd6835 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Wed, 8 Jul 2020 09:25:36 +0800 Subject: [PATCH 25/65] update to 1.3.0 --- deploy/deploy-gateway/pom.xml | 8 ++++---- deploy/deploy-kvdb/pom.xml | 4 ++-- deploy/deploy-peer/pom.xml | 18 +++++++++--------- deploy/pom.xml | 4 ++-- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/deploy/deploy-gateway/pom.xml b/deploy/deploy-gateway/pom.xml index fa321ac1..237523f3 100644 --- a/deploy/deploy-gateway/pom.xml +++ b/deploy/deploy-gateway/pom.xml @@ -5,10 +5,10 @@ com.jd.blockchain deploy-root - 1.2.0.RELEASE + 1.3.0.RELEASE deploy-gateway - + @@ -45,7 +45,7 @@ org.springframework.boot spring-boot-maven-plugin - @@ -91,4 +91,4 @@ - \ No newline at end of file + diff --git a/deploy/deploy-kvdb/pom.xml b/deploy/deploy-kvdb/pom.xml index 0f25a4a5..7a5438c3 100644 --- a/deploy/deploy-kvdb/pom.xml +++ b/deploy/deploy-kvdb/pom.xml @@ -10,7 +10,7 @@ 4.0.0 deploy-kvdb - 1.0.0.RELEASE + 1.0.1.RELEASE @@ -96,4 +96,4 @@ - \ No newline at end of file + diff --git a/deploy/deploy-peer/pom.xml b/deploy/deploy-peer/pom.xml index 9d3f0cc5..4c6640ec 100644 --- a/deploy/deploy-peer/pom.xml +++ b/deploy/deploy-peer/pom.xml @@ -5,7 +5,7 @@ com.jd.blockchain deploy-root - 1.2.0.RELEASE + 1.3.0.RELEASE deploy-peer @@ -62,13 +62,13 @@ - @@ -129,4 +129,4 @@ - \ No newline at end of file + diff --git a/deploy/pom.xml b/deploy/pom.xml index 8822d464..7be22fa3 100644 --- a/deploy/pom.xml +++ b/deploy/pom.xml @@ -9,7 +9,7 @@ ../project/parent deploy-root - 1.2.0.RELEASE + 1.3.0.RELEASE pom @@ -24,4 +24,4 @@ deploy-kvdb - \ No newline at end of file + From 1c6e7be67a5174f52a777dcdd03349e80a347c96 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Wed, 8 Jul 2020 09:27:25 +0800 Subject: [PATCH 26/65] update to 1.3.0 --- deploy/deploy-kvdb/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/deploy-kvdb/pom.xml b/deploy/deploy-kvdb/pom.xml index 7a5438c3..14e45781 100644 --- a/deploy/deploy-kvdb/pom.xml +++ b/deploy/deploy-kvdb/pom.xml @@ -5,7 +5,7 @@ deploy-root com.jd.blockchain - 1.2.0.RELEASE + 1.3.0.RELEASE 4.0.0 From f4fb6fa58fc014e7aa3b70de5563309a28f00dac Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Tue, 14 Jul 2020 09:19:37 +0800 Subject: [PATCH 27/65] update relation; --- core | 2 +- framework | 2 +- libs/bft-smart | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core b/core index 46543c59..c7428b2a 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 46543c59d3d3fa9636845ce543307e1d470319d5 +Subproject commit c7428b2a78e15156ccb0714cbc42c68086db0df2 diff --git a/framework b/framework index 0aa73602..09e373ab 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit 0aa736029eb6a36d3ff04d7372138b6faed7d217 +Subproject commit 09e373abb793f33771a7c2792e9967d9ca819bc5 diff --git a/libs/bft-smart b/libs/bft-smart index a50dba1c..81181e01 160000 --- a/libs/bft-smart +++ b/libs/bft-smart @@ -1 +1 @@ -Subproject commit a50dba1c54aa38d69380f97728081bfe5185c070 +Subproject commit 81181e0123698961e724fc36e3b989122b1e31fb From 4d9f4d673c3210dbb0f8c437e997347518ab0544 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Tue, 14 Jul 2020 15:28:51 +0800 Subject: [PATCH 28/65] merge privilege; --- core | 2 +- .../main/java/com/jd/blockchain/boot/peer/PeerBooter.java | 8 ++++---- framework | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core b/core index 53822bf0..7e70bad3 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 53822bf005a7a29958d82c4c9cd18d24248fbca8 +Subproject commit 7e70bad369b8edc76d9da8906b6628b6ecbb5b4b diff --git a/deploy/deploy-peer/src/main/java/com/jd/blockchain/boot/peer/PeerBooter.java b/deploy/deploy-peer/src/main/java/com/jd/blockchain/boot/peer/PeerBooter.java index c8784892..d465a4ba 100644 --- a/deploy/deploy-peer/src/main/java/com/jd/blockchain/boot/peer/PeerBooter.java +++ b/deploy/deploy-peer/src/main/java/com/jd/blockchain/boot/peer/PeerBooter.java @@ -1,5 +1,8 @@ package com.jd.blockchain.boot.peer; +import com.jd.blockchain.runtime.boot.HomeBooter; +import com.jd.blockchain.runtime.boot.HomeContext; + import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -11,12 +14,9 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; -import com.jd.blockchain.runtime.boot.HomeBooter; -import com.jd.blockchain.runtime.boot.HomeContext; - /** * Peer 启动器; - * + * * @author huanghaiquan * */ diff --git a/framework b/framework index 399ceeff..90332b9e 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit 399ceeff4de82edd3ee93446c79cf32b1ba4cc59 +Subproject commit 90332b9efb0515feefb25b57a376b13a4aa09acd From d2fa9203c299999709789c04697fce6079c06c51 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Tue, 14 Jul 2020 15:44:17 +0800 Subject: [PATCH 29/65] update; --- test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test b/test index f8705658..634f7ba6 160000 --- a/test +++ b/test @@ -1 +1 @@ -Subproject commit f8705658a9b3a9a0a01bf340a0d95e229524ab8d +Subproject commit 634f7ba68d70cdbf910284809f29cde7e3119544 From 7dfc25de1e7c1ba1ee7107284a6455ef698729f6 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Tue, 14 Jul 2020 17:37:40 +0800 Subject: [PATCH 30/65] delete the ledgerPrivilegeVO and TransactionPrivilegeVO; --- core | 2 +- framework | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core b/core index 7e70bad3..dc71a9d2 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 7e70bad369b8edc76d9da8906b6628b6ecbb5b4b +Subproject commit dc71a9d2c4c0686a39179c6977b9e53b941e2751 diff --git a/framework b/framework index 90332b9e..f5159638 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit 90332b9efb0515feefb25b57a376b13a4aa09acd +Subproject commit f51596386eb62681adcd0f932a644d07f45fdb88 From 7d47abee88c379432e930bc4ac238f1462354a81 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Tue, 14 Jul 2020 17:42:22 +0800 Subject: [PATCH 31/65] update; --- framework | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework b/framework index f5159638..4f16d4bc 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit f51596386eb62681adcd0f932a644d07f45fdb88 +Subproject commit 4f16d4bcde93b752c8c8002114385009b6a87666 From 60aa24f27543b2421eb7f4b41992e7b0c334f36c Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Tue, 14 Jul 2020 17:51:16 +0800 Subject: [PATCH 32/65] update; --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index dc71a9d2..89e84a61 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit dc71a9d2c4c0686a39179c6977b9e53b941e2751 +Subproject commit 89e84a615504de3f89922213038a24ceb50422cd From 6dbb284570d24e7acfc5c6b704cb345761858706 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Tue, 14 Jul 2020 19:02:54 +0800 Subject: [PATCH 33/65] if default role, return empty result; when get the userPrivilege, if an exist user, then get all. if not, then get empty result; --- core | 2 +- framework | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core b/core index 89e84a61..9cd7bbe9 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 89e84a615504de3f89922213038a24ceb50422cd +Subproject commit 9cd7bbe952127722b37e214c439a3f93f54337bd diff --git a/framework b/framework index 4f16d4bc..33f103b0 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit 4f16d4bcde93b752c8c8002114385009b6a87666 +Subproject commit 33f103b007ebb5350a3de0fd2e80d7ec08ad46ef From 7821b923cacbf6ac3170e5a0832890b941702db7 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Wed, 15 Jul 2020 17:02:05 +0800 Subject: [PATCH 34/65] optimize the code, make the best of the previous class, getRolePrivilege() return the PrivilegeSet; getUserPrivilege() return the UserPrivilegeSet(new class),comprehensive learning LedgerSecurityManagerImpl. --- core | 2 +- framework | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core b/core index 9cd7bbe9..83f648b4 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 9cd7bbe952127722b37e214c439a3f93f54337bd +Subproject commit 83f648b4dd0287a414443a736093a62a71ba39ec diff --git a/framework b/framework index 33f103b0..f07bb23c 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit 33f103b007ebb5350a3de0fd2e80d7ec08ad46ef +Subproject commit f07bb23cf9148bb8a97fab6dae0e0bff8e66ad53 From e32fb01e1da29a5ab4b9f0064a9592d97449e01b Mon Sep 17 00:00:00 2001 From: shaozhuguang Date: Thu, 16 Jul 2020 10:30:42 +0800 Subject: [PATCH 35/65] modify default config og gateway.conf --- .../src/main/resources/config/gateway.conf | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/deploy/deploy-gateway/src/main/resources/config/gateway.conf b/deploy/deploy-gateway/src/main/resources/config/gateway.conf index b0bcb4af..e19b82b9 100644 --- a/deploy/deploy-gateway/src/main/resources/config/gateway.conf +++ b/deploy/deploy-gateway/src/main/resources/config/gateway.conf @@ -1,16 +1,25 @@ -#网关的HTTP服务地址,建议直接使用0.0.0.0; +#网关的HTTP服务地址; http.host=0.0.0.0 #网关的HTTP服务端口; -http.port=8081 +http.port=8080 #网关的HTTP服务上下文路径,可选; #http.context-path= +#对端Peer节点的数量 +peer.size=2 #共识节点的服务地址(与该网关节点连接的Peer节点的IP地址); -peer.host=127.0.0.1 -#共识节点的服务端口(与该网关节点连接的Peer节点的端口); -peer.port=7080 +peer.0.host=127.0.0.1 +#共识节点的服务端口(与该网关节点连接的Peer节点的端口,即在Peer节点的peer-startup.sh中定义的端口); +peer.0.port=7080 #共识节点的服务是否启用安全证书; -peer.secure=false +peer.0.secure=false +#共识节点的服务地址(与该网关节点连接的Peer节点的IP地址); +peer.1.host=127.0.0.1 +#共识节点的服务端口(与该网关节点连接的Peer节点的端口,即在Peer节点的peer-startup.sh中定义的端口); +peer.1.port=7081 +#共识节点的服务是否启用安全证书; +peer.1.secure=false + #共识节点的服务提供解析器 #BftSmart共识Provider:com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider #简单消息共识Provider:com.jd.blockchain.consensus.mq.MsgQueueConsensusProvider @@ -18,7 +27,6 @@ peer.providers=com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider #数据检索服务对应URL,格式:http://{ip}:{port},例如:http://127.0.0.1:10001 #若该值不配置或配置不正确,则浏览器模糊查询部分无法正常显示 -#数据检索服务模块(Argus)需单独部署,若不部署其他功能仍可正常使用 data.retrieval.url=http://127.0.0.1:10001 schema.retrieval.url=http://127.0.0.1:8082 @@ -29,4 +37,4 @@ keys.default.privkey-path= #默认私钥的内容(加密的Base58编码数据);在 pk-path 和 pk 之间必须设置其一; keys.default.privkey= #默认私钥的解码密码; -keys.default.privkey-password= \ No newline at end of file +keys.default.privkey-password= From 925a83e90050935983ffdcb9bc160f2c029502f4 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Thu, 16 Jul 2020 19:11:24 +0800 Subject: [PATCH 36/65] getPermission by LedgerSecurityManagerImpl; optimize the code; --- core | 2 +- framework | 2 +- test | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core b/core index 83f648b4..f9bcd620 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 83f648b4dd0287a414443a736093a62a71ba39ec +Subproject commit f9bcd620151b634e07b23add63a8629aca9fde1c diff --git a/framework b/framework index f07bb23c..16e99ecd 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit f07bb23cf9148bb8a97fab6dae0e0bff8e66ad53 +Subproject commit 16e99ecdd0e280655ddeee096ae8e39eca06dc92 diff --git a/test b/test index 634f7ba6..0104801c 160000 --- a/test +++ b/test @@ -1 +1 @@ -Subproject commit 634f7ba68d70cdbf910284809f29cde7e3119544 +Subproject commit 0104801cfb4998c8f90bdd7e9e07d3b4dddeedfd From 140289f856d5cea0ee5b1657dc81987d022c494c Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Thu, 16 Jul 2020 19:57:25 +0800 Subject: [PATCH 37/65] if return null, then get ""; --- core | 2 +- framework | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core b/core index f9bcd620..572174ce 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit f9bcd620151b634e07b23add63a8629aca9fde1c +Subproject commit 572174ce4af367563f514bc6304bf139ca804247 diff --git a/framework b/framework index 16e99ecd..b7f5876d 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit 16e99ecdd0e280655ddeee096ae8e39eca06dc92 +Subproject commit b7f5876dd9454502d3b8c2361cbd1580b81d744d From 6f46dc0c0353d902041397086aabb1fb912d6541 Mon Sep 17 00:00:00 2001 From: zhangshuang Date: Fri, 17 Jul 2020 15:14:48 +0800 Subject: [PATCH 38/65] modify sdk test example --- samples/pom.xml | 2 +- .../blockchain/sdk/samples/SDKDemo_ActiveParticipant.java | 6 ++++++ .../blockchain/sdk/samples/SDKDemo_RegistParticipant.java | 5 +---- .../blockchain/sdk/samples/SDK_RegistParticipant_Demo.java | 6 +----- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/samples/pom.xml b/samples/pom.xml index ba6abb2e..ab981eb5 100644 --- a/samples/pom.xml +++ b/samples/pom.xml @@ -15,7 +15,7 @@ pom - 1.2.0.RELEASE + 1.3.0.RELEASE diff --git a/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_ActiveParticipant.java b/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_ActiveParticipant.java index a00e8fb3..1624cc92 100644 --- a/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_ActiveParticipant.java +++ b/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_ActiveParticipant.java @@ -38,7 +38,13 @@ public class SDKDemo_ActiveParticipant { // 账本值根据具体情况进行修改 BasicNameValuePair base58LedgerHash = new BasicNameValuePair("ledgerHash", "j5n3SmYT3rS5aDgwQbDUxBYUMEP9GvVfMiQK3Tcr3vxz3M"); + // 激活的新参与方的共识网络地址 + BasicNameValuePair host = new BasicNameValuePair("host", "127.0.0.1"); + BasicNameValuePair port = new BasicNameValuePair("port", "20000"); + para.add(base58LedgerHash); + para.add(host); + para.add(port); try { httpPost.setEntity(new UrlEncodedFormEntity(para,"UTF-8")); diff --git a/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_RegistParticipant.java b/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_RegistParticipant.java index dea45458..fa956312 100644 --- a/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_RegistParticipant.java +++ b/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_RegistParticipant.java @@ -67,11 +67,8 @@ public class SDKDemo_RegistParticipant { BlockchainKeypair user = new BlockchainKeypair(pubKey, privKey); - // 新参与方的共识网络地址 - NetworkAddress networkAddress = new NetworkAddress("127.0.0.1", 20000); - // 注册参与方 - txTemp.participants().register("Peer4", user.getIdentity(), networkAddress); + txTemp.participants().register("Peer4", user.getIdentity()); // TX 准备就绪; PreparedTransaction prepTx = txTemp.prepare(); diff --git a/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDK_RegistParticipant_Demo.java b/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDK_RegistParticipant_Demo.java index 4f880311..ea81ac09 100644 --- a/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDK_RegistParticipant_Demo.java +++ b/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDK_RegistParticipant_Demo.java @@ -5,7 +5,6 @@ import com.jd.blockchain.crypto.KeyGenUtils; import com.jd.blockchain.crypto.PrivKey; import com.jd.blockchain.crypto.PubKey; import com.jd.blockchain.ledger.*; -import com.jd.blockchain.utils.net.NetworkAddress; public class SDK_RegistParticipant_Demo extends SDK_Base_Demo { @@ -27,14 +26,11 @@ public class SDK_RegistParticipant_Demo extends SDK_Base_Demo { BlockchainKeypair user = new BlockchainKeypair(pubKey, privKey); - // 新参与方的共识网络地址 - NetworkAddress networkAddress = new NetworkAddress("127.0.0.1", 20000); - // 定义交易模板 TransactionTemplate txTpl = blockchainService.newTransaction(ledgerHash); // 注册参与方 - txTpl.participants().register("Peer4", user.getIdentity(), networkAddress); + txTpl.participants().register("Peer4", user.getIdentity()); // TX 准备就绪; PreparedTransaction prepTx = txTpl.prepare(); From 8298224b939115cc8c413d2933364d72342fff8d Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Fri, 17 Jul 2020 15:20:10 +0800 Subject: [PATCH 39/65] use info level; --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index 572174ce..73bb5d04 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 572174ce4af367563f514bc6304bf139ca804247 +Subproject commit 73bb5d04e37fdf5abe91af568fd3cbc8976cc385 From 785c4b0e98f178480ecf358098390e2f0f2f75f7 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Mon, 20 Jul 2020 10:37:48 +0800 Subject: [PATCH 40/65] delete the user-role interface; --- core | 2 +- framework | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core b/core index 73bb5d04..7d819b91 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 73bb5d04e37fdf5abe91af568fd3cbc8976cc385 +Subproject commit 7d819b918a3e87380fdd7f520834bfe8bf73ad73 diff --git a/framework b/framework index b7f5876d..9d47861c 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit b7f5876dd9454502d3b8c2361cbd1580b81d744d +Subproject commit 9d47861c8c79c0898126f0a5b4b5ed4b01869a06 From 78d89c8db050a8e2caba4adb8d31bb418ccd5828 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Mon, 20 Jul 2020 10:56:31 +0800 Subject: [PATCH 41/65] path use : authorization/role ; authorization/user; --- core | 2 +- framework | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core b/core index 7d819b91..d9f0ec6f 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 7d819b918a3e87380fdd7f520834bfe8bf73ad73 +Subproject commit d9f0ec6fabc0d15a023cd95cb1be098161a1b3af diff --git a/framework b/framework index 9d47861c..83441caa 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit 9d47861c8c79c0898126f0a5b4b5ed4b01869a06 +Subproject commit 83441caae79ffa1c49fbd34b37378a45e3094a95 From a7612e5ce2792cd2ed0bd8ea41aeec2a1024f5de Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Mon, 20 Jul 2020 11:36:00 +0800 Subject: [PATCH 42/65] new HashSet<>() --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index d9f0ec6f..cef087f0 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit d9f0ec6fabc0d15a023cd95cb1be098161a1b3af +Subproject commit cef087f01ec4711085e0f7671abc2154c8f312f7 From 656b931f24bd424f0e56247d124fda0940d2585a Mon Sep 17 00:00:00 2001 From: zhangshuang Date: Mon, 20 Jul 2020 15:34:45 +0800 Subject: [PATCH 43/65] refactor auto add node system config update, modify sdk sample --- .../jd/blockchain/sdk/samples/SDKDemo_ActiveParticipant.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_ActiveParticipant.java b/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_ActiveParticipant.java index 1624cc92..771f661e 100644 --- a/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_ActiveParticipant.java +++ b/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_ActiveParticipant.java @@ -39,8 +39,8 @@ public class SDKDemo_ActiveParticipant { BasicNameValuePair base58LedgerHash = new BasicNameValuePair("ledgerHash", "j5n3SmYT3rS5aDgwQbDUxBYUMEP9GvVfMiQK3Tcr3vxz3M"); // 激活的新参与方的共识网络地址 - BasicNameValuePair host = new BasicNameValuePair("host", "127.0.0.1"); - BasicNameValuePair port = new BasicNameValuePair("port", "20000"); + BasicNameValuePair host = new BasicNameValuePair("consensusHost", "127.0.0.1"); + BasicNameValuePair port = new BasicNameValuePair("consensusPort", "20000"); para.add(base58LedgerHash); para.add(host); From 58444c22e3f8152fbe8396e1cf929d6a6a42b3da Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Mon, 20 Jul 2020 16:58:42 +0800 Subject: [PATCH 44/65] update; --- test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test b/test index 0104801c..27184cc0 160000 --- a/test +++ b/test @@ -1 +1 @@ -Subproject commit 0104801cfb4998c8f90bdd7e9e07d3b4dddeedfd +Subproject commit 27184cc0e48ef69d7febdf4b1fedd6d9d38984b7 From 0065e9da7646abd09c2b9706876a68a921be147c Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Mon, 20 Jul 2020 17:02:16 +0800 Subject: [PATCH 45/65] update the relation; --- core | 2 +- framework | 2 +- libs/bft-smart | 2 +- test | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core b/core index c7428b2a..45ce56e1 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit c7428b2a78e15156ccb0714cbc42c68086db0df2 +Subproject commit 45ce56e1b08460a3c68956a7d8deffaf2676ebe0 diff --git a/framework b/framework index 09e373ab..109a979a 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit 09e373abb793f33771a7c2792e9967d9ca819bc5 +Subproject commit 109a979a4ac89d267109837b7047f3956028e87e diff --git a/libs/bft-smart b/libs/bft-smart index 81181e01..26482cf4 160000 --- a/libs/bft-smart +++ b/libs/bft-smart @@ -1 +1 @@ -Subproject commit 81181e0123698961e724fc36e3b989122b1e31fb +Subproject commit 26482cf43365583e5d303544ddf05d44a2ad4a41 diff --git a/test b/test index f8705658..27184cc0 160000 --- a/test +++ b/test @@ -1 +1 @@ -Subproject commit f8705658a9b3a9a0a01bf340a0d95e229524ab8d +Subproject commit 27184cc0e48ef69d7febdf4b1fedd6d9d38984b7 From 190063b66015d652e3fe9c31affe148800863fd1 Mon Sep 17 00:00:00 2001 From: zhangshuang Date: Tue, 21 Jul 2020 16:10:17 +0800 Subject: [PATCH 46/65] jira 433 , consensus settings update op data contract unregisted --- .../sdk/samples/SDKDemo_RegistParticipant.java | 1 + .../SDK_GateWay_Participant_Regist_Test_.java | 17 +++-------------- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_RegistParticipant.java b/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_RegistParticipant.java index fa956312..813cce1f 100644 --- a/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_RegistParticipant.java +++ b/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_RegistParticipant.java @@ -51,6 +51,7 @@ public class SDKDemo_RegistParticipant { DataContractRegistry.register(TransactionResponse.class); DataContractRegistry.register(ParticipantRegisterOperation.class); DataContractRegistry.register(ParticipantStateUpdateOperation.class); + DataContractRegistry.register(ConsensusSettingsUpdateOperation.class); HashDigest[] ledgerHashs = service.getLedgerHashs(); // 在本地定义注册账号的 TX; diff --git a/samples/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Regist_Test_.java b/samples/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Regist_Test_.java index 77c1e62e..634357f5 100644 --- a/samples/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Regist_Test_.java +++ b/samples/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Regist_Test_.java @@ -2,6 +2,7 @@ package test.com.jd.blockchain.sdk.test; import static org.junit.Assert.assertTrue; +import com.jd.blockchain.ledger.*; import org.junit.Before; import org.junit.Test; @@ -12,17 +13,6 @@ import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.KeyGenUtils; import com.jd.blockchain.crypto.PrivKey; import com.jd.blockchain.crypto.PubKey; -import com.jd.blockchain.ledger.BlockchainKeypair; -import com.jd.blockchain.ledger.EndpointRequest; -import com.jd.blockchain.ledger.NodeRequest; -import com.jd.blockchain.ledger.ParticipantRegisterOperation; -import com.jd.blockchain.ledger.ParticipantStateUpdateOperation; -import com.jd.blockchain.ledger.PreparedTransaction; -import com.jd.blockchain.ledger.TransactionContent; -import com.jd.blockchain.ledger.TransactionContentBody; -import com.jd.blockchain.ledger.TransactionRequest; -import com.jd.blockchain.ledger.TransactionResponse; -import com.jd.blockchain.ledger.TransactionTemplate; import com.jd.blockchain.sdk.BlockchainService; import com.jd.blockchain.sdk.client.GatewayServiceFactory; import com.jd.blockchain.sdk.samples.SDKDemo_Constant; @@ -76,6 +66,7 @@ public class SDK_GateWay_Participant_Regist_Test_ { DataContractRegistry.register(TransactionResponse.class); DataContractRegistry.register(ParticipantRegisterOperation.class); DataContractRegistry.register(ParticipantStateUpdateOperation.class); + DataContractRegistry.register(ConsensusSettingsUpdateOperation.class); } @Test @@ -95,10 +86,8 @@ public class SDK_GateWay_Participant_Regist_Test_ { BlockchainKeypair user = new BlockchainKeypair(pubKey, privKey); - NetworkAddress networkAddress = new NetworkAddress("127.0.0.1", 20000); - // 注册参与方 - txTemp.participants().register("Peer4", user.getIdentity(), networkAddress); + txTemp.participants().register("Peer4", user.getIdentity()); // TX 准备就绪; PreparedTransaction prepTx = txTemp.prepare(); From 2635fde7959f421d6b96979cb8e3232574791dc1 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Tue, 21 Jul 2020 17:07:17 +0800 Subject: [PATCH 47/65] udpate; --- framework | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework b/framework index 109a979a..741113b2 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit 109a979a4ac89d267109837b7047f3956028e87e +Subproject commit 741113b2f547e94d99ce68667554e9d3750d2e32 From a9e9def2d8b76dde56713060fb2939d8257c4f93 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Tue, 21 Jul 2020 18:19:51 +0800 Subject: [PATCH 48/65] update --- framework | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework b/framework index 741113b2..0657c65e 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit 741113b2f547e94d99ce68667554e9d3750d2e32 +Subproject commit 0657c65e354aa729b8202ddd12df52387ef5e0ca From db82a8244ac52c9fdacfabbea6080523fa440867 Mon Sep 17 00:00:00 2001 From: imuge Date: Tue, 21 Jul 2020 18:11:10 +0800 Subject: [PATCH 49/65] event sample and doc --- .../src/main/resources/docs/api_doc_cn_1.4.MD | 358 ++++++++++++++++++ .../src/main/resources/docs/code_example.MD | 357 +++++++++++++++++ .../sdk/samples/SDK_Event_Demo.java | 105 +++++ 3 files changed, 820 insertions(+) create mode 100644 deploy/deploy-gateway/src/main/resources/docs/code_example.MD create mode 100644 samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDK_Event_Demo.java diff --git a/deploy/deploy-gateway/src/main/resources/docs/api_doc_cn_1.4.MD b/deploy/deploy-gateway/src/main/resources/docs/api_doc_cn_1.4.MD index 017b97d2..c7185bcc 100644 --- a/deploy/deploy-gateway/src/main/resources/docs/api_doc_cn_1.4.MD +++ b/deploy/deploy-gateway/src/main/resources/docs/api_doc_cn_1.4.MD @@ -2132,3 +2132,361 @@ http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/contracts |address.value|合约地址| |pubKey.value|合约公钥| |rootHash|合约根Hash| + +## 9 用户自定义事件 + +### 9.1 获取事件账户列表 + +```http +GET /ledgers/{ledger}/events/user/accounts?fromIndex={start_index}&count={count} +``` + +#### 参数 + +|请求类型|名称|是否必需|说明|数据类型| +|---|---|---|---|---| +|path|ledger|是|账本哈希|字符串| +|query|start_index|否|查询的起始序号,默认为0|数字| +|query|count|否|查询返回事件账户的数量,默认最大返回值为100,小于0或大于100均返回最大可返回结果集|数字| + + +#### 请求实例 +```http +http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/events/user/accounts?fromIndex=0&count=-1 +``` + +#### 返回实例 + +```json +{ + "data":[ + { + "address":{ + "value":"LdeP1yuk8Medq3Sph5ur9y1yE6nJ71XRVPPx1" + }, + "pubKey":{ + "value":"7VeRBi3xDfT1E11vFs9q5Q9gFo23RR7SoobPzivqxw9Uubzq" + } + } + ], + "success":true +} +``` + +说明 + +|名称|说明| +|---|---| +|address.value|账户地址| +|pubKey.value|账户公钥| + +### 9.2 获取事件账户 + +```http +GET /ledgers/{ledger}/events/user/accounts/{address} +``` + +#### 参数 + +|请求类型|名称|是否必需|说明|数据类型| +|---|---|---|---|---| +|path|ledger|是|账本哈希|字符串| +|address|账户地址|是|事件账户地址|字符串| + + +#### 请求实例 +```http +http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/events/user/accounts/LdeP1yuk8Medq3Sph5ur9y1yE6nJ71XRVPPx1 +``` + +#### 返回实例 + +```json +{ + "data":[ + { + "address":{ + "value":"LdeP1yuk8Medq3Sph5ur9y1yE6nJ71XRVPPx1" + }, + "pubKey":{ + "value":"7VeRBi3xDfT1E11vFs9q5Q9gFo23RR7SoobPzivqxw9Uubzq" + } + } + ], + "success":true +} +``` + +说明 + +|名称|说明| +|---|---| +|address.value|账户地址| +|pubKey.value|账户公钥| + +### 9.3 获取事件账户总数 + +```http +GET /ledgers/{ledger}/events/user/accounts/count +``` + +#### 参数 + +|请求类型|名称|是否必需|说明|数据类型| +|---|---|---|---|---| +|path|ledger|是|账本哈希|字符串| + + +#### 请求实例 +```http +http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/events/user/accounts/count +``` + +#### 返回实例 + +```json +{ + "data": 1, + "success": true +} +``` + +说明 + +|名称|说明| +|---|---| +|data|事件账户数量| + +### 9.4 获取事件名数量 + +```http +GET /ledgers/{ledger}/events/user/accounts/{address}/names/count +``` + +#### 参数 + +|请求类型|名称|是否必需|说明|数据类型| +|---|---|---|---|---| +|path|ledger|是|账本哈希|字符串| +|path|address|是|事件账户地址|字符串| + + +#### 请求实例 +```http +http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/events/user/accounts/LdeP1yuk8Medq3Sph5ur9y1yE6nJ71XRVPPx1/names/count +``` + +#### 返回实例 + +```json +{ + "data": 2, + "success": true +} +``` + +说明 + +|名称|说明| +|---|---| +|data|事件名数量| + +### 9.5 获取事件名列表 + +```http +GET /ledgers/{ledger}/events/user/accounts/{address}/names?fromIndex={start_index}&count={count} +``` + +#### 参数 + +|请求类型|名称|是否必需|说明|数据类型| +|---|---|---|---|---| +|path|ledger|是|账本哈希|字符串| +|path|address|是|事件账户地址|字符串| +|query|start_index|否|查询的起始序号,默认为0|数字| +|query|count|否|查询返回事件账户的数量,默认最大返回值为100,小于0或大于100均返回最大可返回结果集|数字| + + +#### 请求实例 +```http +http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/events/user/accounts/LdeP1yuk8Medq3Sph5ur9y1yE6nJ71XRVPPx1/names?fromIndex=0&count=100 +``` + +#### 返回实例 + +```json +{ + "data": ["test1", "test2"], + "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/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/events/user/accounts/LdeP1yuk8Medq3Sph5ur9y1yE6nJ71XRVPPx1/names/test1/latest +``` + +#### 返回实例 + +```json +{ + "data": { + "sequence": 0, + "transactionSource": { + "value": "j5rENX3rsdEgi5toeNUUv7ycUUivjNxAUb9Fme6oLCU851" + }, + "blockHeight": 10, + "contractSource": "", + "eventAccount": { + "value": "LdeP1yuk8Medq3Sph5ur9y1yE6nJ71XRVPPx1" + }, + "name": "test1", + "content": { + "nil": false, + "bytes": { + "value": "Ctt6Eur" + }, + "type": "TEXT", + "value": "imuge" + } + }, + "success": true +} +``` + +说明 + +|名称|说明| +|---|---| +|sequence|事件序列| +|transactionSource.value|交易哈希| +|blockHeight|时间产生区块高度| +|contractSource|合约地址| +|eventAccount.value|事件账户地址| +|name|事件名| +|content.nil|事件内容是否为空| +|content.bytes.value|事件内容字节| +|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/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/events/user/accounts/LdeP1yuk8Medq3Sph5ur9y1yE6nJ71XRVPPx1/names/test1/count +``` + +#### 返回实例 + +```json +{ + "data": 1, + "success": true +} +``` + +说明 + +|名称|说明| +|---|---| +|data|事件数量| + +### 9.8 获取事件列表 + +```http +GET /ledgers/{ledger}/events/user/accounts/{address}/names/{event_name}?fromSequence={from_sequence}&count={count} +``` + +#### 参数 + +|请求类型|名称|是否必需|说明|数据类型| +|---|---|---|---|---| +|path|ledger|是|账本哈希|字符串| +|path|address|是|事件账户地址|字符串| +|path|event_name|是|事件名|字符串| +|query|from_sequence|否|查询的起始序号,默认为0|数字| +|query|count|否|查询返回事件的数量,默认最大返回值为100,小于0或大于100均返回最大可返回结果集|数字| + + +#### 请求实例 +```http +http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/events/user/accounts/LdeP1yuk8Medq3Sph5ur9y1yE6nJ71XRVPPx1/names/test1?fromSequenct=0&count=100 +``` + +#### 返回实例 + +```json +{ + "data": [{ + "sequence": 0, + "transactionSource": { + "value": "j5rENX3rsdEgi5toeNUUv7ycUUivjNxAUb9Fme6oLCU851" + }, + "blockHeight": 10, + "contractSource": "", + "eventAccount": { + "value": "LdeP1yuk8Medq3Sph5ur9y1yE6nJ71XRVPPx1" + }, + "name": "test1", + "content": { + "nil": false, + "bytes": { + "value": "Ctt6Eur" + }, + "type": "TEXT", + "value": "imuge" + } + }], + "success": true +} +``` + +说明 + +|名称|说明| +|---|---| +|data|事件列表| +|sequence|事件序列| +|transactionSource.value|交易哈希| +|blockHeight|时间产生区块高度| +|contractSource|合约地址| +|eventAccount.value|事件账户地址| +|name|事件名| +|content.nil|事件内容是否为空| +|content.bytes.value|事件内容字节| +|content.type|事件内容类型| +|content.value|事件内容| \ No newline at end of file diff --git a/deploy/deploy-gateway/src/main/resources/docs/code_example.MD b/deploy/deploy-gateway/src/main/resources/docs/code_example.MD new file mode 100644 index 00000000..49157dc4 --- /dev/null +++ b/deploy/deploy-gateway/src/main/resources/docs/code_example.MD @@ -0,0 +1,357 @@ +# 1. maven坐标 +```java + + com.jd.blockchain + sdk-client + ${ledger.version} + + + com.jd.blockchain + contract-starter + ${ledger.version} + + + com.jd.blockchain + crypto-classic + ${ledger.version} + + + + com.jd.blockchain + crypto-sm + ${ledger.version} + +``` +# 2. 数据快速上链 +## 2.1. 服务连接 + +```java + //创建服务代理 + public BlockchainKeypair CLIENT_CERT = BlockchainKeyGenerator.getInstance().generate(); + final String GATEWAY_IP = "127.0.0.1"; + final int GATEWAY_PORT = 80; + final boolean SECURE = false; + GatewayServiceFactory serviceFactory = GatewayServiceFactory.connect(GATEWAY_IP, GATEWAY_PORT, SECURE, + CLIENT_CERT); + // 创建服务代理; + BlockchainService service = serviceFactory.getBlockchainService(); + HashDigest[] ledgerHashs = service.getLedgerHashs(); + // 获取当前账本Hash + HashDigest ledgerHash = ledgerHashs[0]; +``` +## 2.2. 用户注册 +```java + // 创建服务代理; + BlockchainService service = serviceFactory.getBlockchainService(); + // 在本地定义注册账号的 TX; + TransactionTemplate txTemp = service.newTransaction(ledgerHash); + BlockchainKeypair user = BlockchainKeyGenerator.getInstance().generate(); + + txTemp.users().register(user.getIdentity()); + + // TX 准备就绪; + PreparedTransaction prepTx = txTemp.prepare(); + // 使用私钥进行签名; + prepTx.sign(CLIENT_CERT); + // 提交交易; + prepTx.commit(); +``` +## 2.3. 数据账户注册 +```java + // 创建服务代理; + BlockchainService service = serviceFactory.getBlockchainService(); + // 在本地定义注册账号的 TX; + TransactionTemplate txTemp = service.newTransaction(ledgerHash); + BlockchainKeypair dataAccount = BlockchainKeyGenerator.getInstance().generate(); + + txTemp.dataAccounts().register(dataAccount.getIdentity()); + + // TX 准备就绪; + PreparedTransaction prepTx = txTemp.prepare(); + // 使用私钥进行签名; + prepTx.sign(CLIENT_CERT); + + // 提交交易; + prepTx.commit(); +``` +## 2.4. 写入数据 +```java + // 创建服务代理; + BlockchainService service = serviceFactory.getBlockchainService(); + + // 在本地定义注册账号的 TX; + TransactionTemplate txTemp = service.newTransaction(ledgerHash); + + // -------------------------------------- + // 将商品信息写入到指定的账户中; + // 对象将被序列化为 JSON 形式存储,并基于 JSON 结构建立查询索引; + String commodityDataAccount = "GGhhreGeasdfasfUUfehf9932lkae99ds66jf=="; + txTemp.dataAccount(commodityDataAccount).setText("ASSET_CODE", "value1", -1); + + // TX 准备就绪; + PreparedTransaction prepTx = txTemp.prepare(); + + String txHash = Base64Utils.encodeToUrlSafeString(prepTx.getHash().toBytes()); + // 使用私钥进行签名; + prepTx.sign(CLIENT_CERT); + + // 提交交易; + prepTx.commit(); +``` +## 2.5. 查询数据 + +> 注:详细的查询可参考模块sdk-samples中SDK_GateWay_Query_Test_相关测试用例 + +```java + // 创建服务代理; + BlockchainService service = serviceFactory.getBlockchainService(); + + // 查询区块信息; + // 区块高度; + long ledgerNumber = service.getLedger(ledgerHash).getLatestBlockHeight(); + // 最新区块; + LedgerBlock latestBlock = service.getBlock(ledgerHash, ledgerNumber); + // 区块中的交易的数量; + long txCount = service.getTransactionCount(ledgerHash, latestBlock.getHash()); + // 获取交易列表; + LedgerTransaction[] txList = service.getTransactions(ledgerHash, ledgerNumber, 0, 100); + // 遍历交易列表 + for (LedgerTransaction ledgerTransaction : txList) { + TransactionContent txContent = ledgerTransaction.getTransactionContent(); + Operation[] operations = txContent.getOperations(); + if (operations != null && operations.length > 0) { + for (Operation operation : operations) { + operation = ClientResolveUtil.read(operation); + // 操作类型:数据账户注册操作 + if (operation instanceof DataAccountRegisterOperation) { + DataAccountRegisterOperation daro = (DataAccountRegisterOperation) operation; + BlockchainIdentity blockchainIdentity = daro.getAccountID(); + } + // 操作类型:用户注册操作 + else if (operation instanceof UserRegisterOperation) { + UserRegisterOperation uro = (UserRegisterOperation) operation; + BlockchainIdentity blockchainIdentity = uro.getUserID(); + } + // 操作类型:账本注册操作 + else if (operation instanceof LedgerInitOperation) { + + LedgerInitOperation ledgerInitOperation = (LedgerInitOperation)operation; + LedgerInitSetting ledgerInitSetting = ledgerInitOperation.getInitSetting(); + + ParticipantNode[] participantNodes = ledgerInitSetting.getConsensusParticipants(); + } + // 操作类型:合约发布操作 + else if (operation instanceof ContractCodeDeployOperation) { + ContractCodeDeployOperation ccdo = (ContractCodeDeployOperation) operation; + BlockchainIdentity blockchainIdentity = ccdo.getContractID(); + } + // 操作类型:合约执行操作 + else if (operation instanceof ContractEventSendOperation) { + ContractEventSendOperation ceso = (ContractEventSendOperation) operation; + } + // 操作类型:KV存储操作 + else if (operation instanceof DataAccountKVSetOperation) { + DataAccountKVSetOperation.KVWriteEntry[] kvWriteEntries = + ((DataAccountKVSetOperation) operation).getWriteSet(); + if (kvWriteEntries != null && kvWriteEntries.length > 0) { + for (DataAccountKVSetOperation.KVWriteEntry kvWriteEntry : kvWriteEntries) { + BytesValue bytesValue = kvWriteEntry.getValue(); + DataType dataType = bytesValue.getType(); + Object showVal = ClientResolveUtil.readValueByBytesValue(bytesValue); + System.out.println("writeSet.key=" + kvWriteEntry.getKey()); + System.out.println("writeSet.value=" + showVal); + System.out.println("writeSet.type=" + dataType); + System.out.println("writeSet.version=" + kvWriteEntry.getExpectedVersion()); + } + } + } + } + } + } + + // 根据交易的 hash 获得交易;注:客户端生成 PrepareTransaction 时得到交易hash; + HashDigest txHash = txList[0].getTransactionContent().getHash(); + Transaction tx = service.getTransactionByContentHash(ledgerHash, txHash); + // 获取数据; + String commerceAccount = "GGhhreGeasdfasfUUfehf9932lkae99ds66jf=="; + String[] objKeys = new String[] { "x001", "x002" }; + TypedKVEntry[] kvData = service.getDataEntries(ledgerHash, commerceAccount, objKeys); + + long payloadVersion = kvData[0].getVersion(); + + // 获取数据账户下所有的KV列表 + TypedKVEntry[] kvDatas = service.getDataEntries(ledgerHash, commerceAccount, 0, 100); + if (kvData != null && kvData.length > 0) { + for (TypedKVEntry kvDatum : kvDatas) { + System.out.println("kvData.key=" + kvDatum.getKey()); + System.out.println("kvData.version=" + kvDatum.getVersion()); + System.out.println("kvData.type=" + kvDatum.getType()); + System.out.println("kvData.value=" + kvDatum.getValue()); + } + } +``` + +## 2.6. 合约发布 + +```java + + // 创建服务代理; + BlockchainService service = serviceFactory.getBlockchainService(); + + // 在本地定义TX模板 + TransactionTemplate txTemp = service.newTransaction(ledgerHash); + + // 合约内容读取 + byte[] contractBytes = FileUtils.readBytes(new File("CONTRACT_FILE")); + + // 生成用户 + BlockchainKeypair contractKeyPair = BlockchainKeyGenerator.getInstance().generate(); + + // 发布合约 + txTemp.contracts().deploy(contractKeyPair.getIdentity(), contractBytes); + + // TX 准备就绪; + PreparedTransaction prepTx = txTemp.prepare(); + + // 使用私钥进行签名; + prepTx.sign(CLIENT_CERT); + + // 提交交易; + TransactionResponse transactionResponse = prepTx.commit(); + + assertTrue(transactionResponse.isSuccess()); + + // 打印合约地址 + System.out.println(contractKeyPair.getIdentity().getAddress().toBase58()); +``` + +## 2.7. 合约执行 + +```java + + // 创建服务代理; + BlockchainService service = serviceFactory.getBlockchainService(); + + // 在本地定义TX模板 + TransactionTemplate txTemp = service.newTransaction(ledgerHash); + + // 合约地址 + String contractAddress = ""; + + // 使用接口方式调用合约 + TransferContract transferContract = txTemp.contract(contractAddress, TransferContract.class); + + // 使用decode方式调用合约内部方法(create方法) + // 返回GenericValueHolder可通过get方法获取结果,但get方法需要在commit调用后执行 + String address = "address"; + String account = "fill account"; + long money = 100000000L; + GenericValueHolder result = ContractReturnValue.decode(transferContract.create(address, account, money)); + + PreparedTransaction ptx = txTemp.prepare(); + + ptx.sign(CLIENT_CERT); + + TransactionResponse transactionResponse = ptx.commit(); + + String cotractExecResult = result.get(); + + // TransactionResponse也提供了可供查询结果的接口 + OperationResult[] operationResults = transactionResponse.getOperationResults(); + + // 通过OperationResult获取结果 + for (int i = 0; i < operationResults.length; i++) { + OperationResult opResult = operationResults[i]; + System.out.printf("Operation[%s].result = %s \r\n", + opResult.getIndex(), BytesValueEncoding.decode(opResult.getResult())); + } +``` + +## 2.8. 事件账户注册 +```java + BlockchainService service = serviceFactory.getBlockchainService(); + TransactionTemplate txTemp = service.newTransaction(ledgerHash); + + BlockchainKeypair eventAccount = BlockchainKeyGenerator.getInstance().generate(); + txTemp.eventAccounts().register(eventAccount.getIdentity()); + + // TX 准备就绪; + PreparedTransaction prepTx = txTemp.prepare(); + // 使用私钥进行签名; + prepTx.sign(CLIENT_CERT); + + // 提交交易; + prepTx.commit(); +``` +## 2.9. 事件发布 +```java + BlockchainService service = serviceFactory.getBlockchainService(); + TransactionTemplate txTemp = service.newTransaction(ledgerHash); + + // 发布事件到指定的账户中; + String eventAccount = "GGhhreGeasdfasfUUfehf9932lkae99ds66jf=="; + txTemp.eventAccount(eventAccount).publish("event_name", "string", -1) + .publish("event_name", 0, 0) + .publish("event_name", "bytes".getBytes(), 1); + + // TX 准备就绪; + PreparedTransaction prepTx = txTemp.prepare(); + + // 使用私钥进行签名; + prepTx.sign(CLIENT_CERT); + + // 提交交易; + prepTx.commit(); +``` + +## 2.10. 事件监听 + +- 系统事件 +> 目前仅支持新区块产生事件 +```java + EventListenerHandle handler = blockchainService.monitorUserEvent(ledgerHash, eventAccount.getAddress().toBase58(), eventName, 0, new UserEventListener() { + @Override + public void onEvent(Event eventMessage, EventContext eventContext) { + BytesValue content = eventMessage.getContent(); + switch (content.getType()) { + case TEXT: + case XML: + case JSON: + System.out.println(content.getBytes().toUTF8String()); + break; + case INT64: + case TIMESTAMP: + System.out.println(BytesUtils.toLong(content.getBytes().toBytes())); + break; + default: + break; + } + + // 关闭监听的两种方式:1 + eventContext.getHandle().cancel(); + } + }); + + // 关闭监听的两种方式:2 + handler.cancel(); +``` + +- 用户自定义事件 +```java + EventListenerHandle handler = blockchainService.monitorSystemEvent(ledgerHash, SystemEvent.NEW_BLOCK_CREATED, 0, new SystemEventListener() { + @Override + public void onEvents(Event[] eventMessages, EventContext eventContext) { + for (Event eventMessage : eventMessages) { + BytesValue content = eventMessage.getContent(); + // content中存放的是当前链上最新高度 + System.out.println(BytesUtils.toLong(content.getBytes().toBytes())); + } + + // 关闭监听的两种方式:1 + eventContext.getHandle().cancel(); + } + }); + + // 关闭监听的两种方式:2 + handler.cancel(); +``` \ No newline at end of file diff --git a/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDK_Event_Demo.java b/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDK_Event_Demo.java new file mode 100644 index 00000000..f4d85dbe --- /dev/null +++ b/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDK_Event_Demo.java @@ -0,0 +1,105 @@ +package com.jd.blockchain.sdk.samples; + +import com.jd.blockchain.ledger.BlockchainKeyGenerator; +import com.jd.blockchain.ledger.BlockchainKeypair; +import com.jd.blockchain.ledger.BytesValue; +import com.jd.blockchain.ledger.Event; +import com.jd.blockchain.ledger.SystemEvent; +import com.jd.blockchain.ledger.TransactionTemplate; +import com.jd.blockchain.sdk.EventContext; +import com.jd.blockchain.sdk.EventListenerHandle; +import com.jd.blockchain.sdk.SystemEventListener; +import com.jd.blockchain.sdk.SystemEventPoint; +import com.jd.blockchain.sdk.UserEventListener; +import com.jd.blockchain.sdk.UserEventPoint; +import com.jd.blockchain.utils.io.BytesUtils; + +public class SDK_Event_Demo extends SDK_Base_Demo { + + // 注册事件账户 + private BlockchainKeypair createEventAccount() { + BlockchainKeypair eventAccount = BlockchainKeyGenerator.getInstance().generate(); + TransactionTemplate txTpl = blockchainService.newTransaction(ledgerHash); + txTpl.eventAccounts().register(eventAccount.getIdentity()); + commit(txTpl); + return eventAccount; + } + + /** + * 发布事件 + * + * @param eventAccount 事件账户 + */ + private void publishEvent(BlockchainKeypair eventAccount) { + TransactionTemplate txTpl = blockchainService.newTransaction(ledgerHash); + // sequence传递当前事件名链上最新序号,不存在时传-1 + Event event = blockchainService.getLatestEvent(ledgerHash, eventAccount.getAddress().toBase58(), "name"); + long sequence = null != event ? event.getSequence() : -1; + txTpl.eventAccount(eventAccount.getAddress()).publish("name", "bytes".getBytes(), sequence); + txTpl.eventAccount(eventAccount.getAddress()).publish("name", "string", sequence + 1); + txTpl.eventAccount(eventAccount.getAddress()).publish("name", 0, sequence + 2); + txTpl.eventAccount(eventAccount.getAddress()).publish("name", 1l, sequence + 3); + txTpl.eventAccount(eventAccount.getAddress()).publishXML("name", "", sequence + 4); + txTpl.eventAccount(eventAccount.getAddress()).publishJSON("name", "{}", sequence + 5); + txTpl.eventAccount(eventAccount.getAddress()).publishImage("name", "img".getBytes(), sequence + 6); + txTpl.eventAccount(eventAccount.getAddress()).publishTimestamp("name", System.currentTimeMillis(), sequence + 7); + commit(txTpl); + } + + /** + * 监听用户自定义事件 + * + * @param eventAccount 事件账户 + * @param eventName 事件名 + */ + private void monitorUserEvent(BlockchainKeypair eventAccount, String eventName) { + EventListenerHandle handler = blockchainService.monitorUserEvent(ledgerHash, eventAccount.getAddress().toBase58(), eventName, 0, new UserEventListener() { + @Override + public void onEvent(Event eventMessage, EventContext eventContext) { + BytesValue content = eventMessage.getContent(); + switch (content.getType()) { + case TEXT: + case XML: + case JSON: + System.out.println(content.getBytes().toUTF8String()); + break; + case INT64: + case TIMESTAMP: + System.out.println(BytesUtils.toLong(content.getBytes().toBytes())); + break; + default: + break; + } + + // 关闭监听的两种方式:1 + eventContext.getHandle().cancel(); + } + }); + + // 关闭监听的两种方式:2 + handler.cancel(); + } + + /** + * 监听新区块生成事件 + */ + private void monitorNewBlockCreatedEvent() { + EventListenerHandle handler = blockchainService.monitorSystemEvent(ledgerHash, SystemEvent.NEW_BLOCK_CREATED, 0, new SystemEventListener() { + @Override + public void onEvents(Event[] eventMessages, EventContext eventContext) { + for (Event eventMessage : eventMessages) { + BytesValue content = eventMessage.getContent(); + // content中存放的是当前链上最新高度 + System.out.println(BytesUtils.toLong(content.getBytes().toBytes())); + } + + // 关闭监听的两种方式:1 + eventContext.getHandle().cancel(); + } + }); + + // 关闭监听的两种方式:2 + handler.cancel(); + } + +} From 637b3513e543a3f3e1b286e30d4cf109d3a61d91 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Wed, 22 Jul 2020 10:49:16 +0800 Subject: [PATCH 50/65] upate relation; --- core | 2 +- framework | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core b/core index 45ce56e1..b8d014fc 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 45ce56e1b08460a3c68956a7d8deffaf2676ebe0 +Subproject commit b8d014fc7beea941b18440854f714bb15d53c782 diff --git a/framework b/framework index 0657c65e..c4892758 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit 0657c65e354aa729b8202ddd12df52387ef5e0ca +Subproject commit c4892758df80f2b07fed0a01d3baac7e43b5d53f From fc7a147f205bb7a76fbb14fb421f6d00e6f7428c Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Mon, 27 Jul 2020 09:43:34 +0800 Subject: [PATCH 51/65] update explorer; --- explorer | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/explorer b/explorer index 7e9c83c8..3c4141f6 160000 --- a/explorer +++ b/explorer @@ -1 +1 @@ -Subproject commit 7e9c83c891dab9e9700c51b6fc6910c0a8b2d932 +Subproject commit 3c4141f65828435ff271776f5cf7ac432c012a33 From e94491a603c67399dd66f219fe361c8456d1470c Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Mon, 27 Jul 2020 10:11:32 +0800 Subject: [PATCH 52/65] update; --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index b8d014fc..637b3eba 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit b8d014fc7beea941b18440854f714bb15d53c782 +Subproject commit 637b3eba85f5c31fd04add219ac84fef3fd1b063 From 857beadc139ff44b9ccd7689447d8ad64b0e6510 Mon Sep 17 00:00:00 2001 From: zhangshuang Date: Wed, 29 Jul 2020 14:13:37 +0800 Subject: [PATCH 53/65] fix jira 444, modify active participant sdk --- .../blockchain/sdk/samples/SDKDemo_ActiveParticipant.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_ActiveParticipant.java b/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_ActiveParticipant.java index 771f661e..c8a19209 100644 --- a/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_ActiveParticipant.java +++ b/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_ActiveParticipant.java @@ -42,9 +42,15 @@ public class SDKDemo_ActiveParticipant { BasicNameValuePair host = new BasicNameValuePair("consensusHost", "127.0.0.1"); BasicNameValuePair port = new BasicNameValuePair("consensusPort", "20000"); + // 指定已经启动的其他共识节点的HTTP管理端口 + BasicNameValuePair manageHost = new BasicNameValuePair("remoteManageHost", "127.0.0.1"); + BasicNameValuePair managePort = new BasicNameValuePair("remoteManagePort", "12000"); + para.add(base58LedgerHash); para.add(host); para.add(port); + para.add(manageHost); + para.add(managePort); try { httpPost.setEntity(new UrlEncodedFormEntity(para,"UTF-8")); From b72e345db26758ccef0ed402078865b0bc42b3fd Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Thu, 30 Jul 2020 09:13:09 +0800 Subject: [PATCH 54/65] update; --- core | 2 +- framework | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core b/core index 637b3eba..7a9554d6 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 637b3eba85f5c31fd04add219ac84fef3fd1b063 +Subproject commit 7a9554d6c82a4688a0bbde6d1e7931cde3b5ec0e diff --git a/framework b/framework index c4892758..919f1b04 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit c4892758df80f2b07fed0a01d3baac7e43b5d53f +Subproject commit 919f1b048e15c3b4038d80120ba7fb931730d9ea From 42be8510d3682ca73aac650c97760b3a49960270 Mon Sep 17 00:00:00 2001 From: imuge Date: Fri, 31 Jul 2020 14:24:01 +0800 Subject: [PATCH 55/65] Update code_example.MD --- .../src/main/resources/docs/code_example.MD | 712 +++++++++--------- 1 file changed, 356 insertions(+), 356 deletions(-) diff --git a/deploy/deploy-gateway/src/main/resources/docs/code_example.MD b/deploy/deploy-gateway/src/main/resources/docs/code_example.MD index 49157dc4..f5edfb13 100644 --- a/deploy/deploy-gateway/src/main/resources/docs/code_example.MD +++ b/deploy/deploy-gateway/src/main/resources/docs/code_example.MD @@ -1,357 +1,357 @@ -# 1. maven坐标 -```java - - com.jd.blockchain - sdk-client - ${ledger.version} - - - com.jd.blockchain - contract-starter - ${ledger.version} - - - com.jd.blockchain - crypto-classic - ${ledger.version} - - - - com.jd.blockchain - crypto-sm - ${ledger.version} - -``` -# 2. 数据快速上链 -## 2.1. 服务连接 - -```java - //创建服务代理 - public BlockchainKeypair CLIENT_CERT = BlockchainKeyGenerator.getInstance().generate(); - final String GATEWAY_IP = "127.0.0.1"; - final int GATEWAY_PORT = 80; - final boolean SECURE = false; - GatewayServiceFactory serviceFactory = GatewayServiceFactory.connect(GATEWAY_IP, GATEWAY_PORT, SECURE, - CLIENT_CERT); - // 创建服务代理; - BlockchainService service = serviceFactory.getBlockchainService(); - HashDigest[] ledgerHashs = service.getLedgerHashs(); - // 获取当前账本Hash - HashDigest ledgerHash = ledgerHashs[0]; -``` -## 2.2. 用户注册 -```java - // 创建服务代理; - BlockchainService service = serviceFactory.getBlockchainService(); - // 在本地定义注册账号的 TX; - TransactionTemplate txTemp = service.newTransaction(ledgerHash); - BlockchainKeypair user = BlockchainKeyGenerator.getInstance().generate(); - - txTemp.users().register(user.getIdentity()); - - // TX 准备就绪; - PreparedTransaction prepTx = txTemp.prepare(); - // 使用私钥进行签名; - prepTx.sign(CLIENT_CERT); - // 提交交易; - prepTx.commit(); -``` -## 2.3. 数据账户注册 -```java - // 创建服务代理; - BlockchainService service = serviceFactory.getBlockchainService(); - // 在本地定义注册账号的 TX; - TransactionTemplate txTemp = service.newTransaction(ledgerHash); - BlockchainKeypair dataAccount = BlockchainKeyGenerator.getInstance().generate(); - - txTemp.dataAccounts().register(dataAccount.getIdentity()); - - // TX 准备就绪; - PreparedTransaction prepTx = txTemp.prepare(); - // 使用私钥进行签名; - prepTx.sign(CLIENT_CERT); - - // 提交交易; - prepTx.commit(); -``` -## 2.4. 写入数据 -```java - // 创建服务代理; - BlockchainService service = serviceFactory.getBlockchainService(); - - // 在本地定义注册账号的 TX; - TransactionTemplate txTemp = service.newTransaction(ledgerHash); - - // -------------------------------------- - // 将商品信息写入到指定的账户中; - // 对象将被序列化为 JSON 形式存储,并基于 JSON 结构建立查询索引; - String commodityDataAccount = "GGhhreGeasdfasfUUfehf9932lkae99ds66jf=="; - txTemp.dataAccount(commodityDataAccount).setText("ASSET_CODE", "value1", -1); - - // TX 准备就绪; - PreparedTransaction prepTx = txTemp.prepare(); - - String txHash = Base64Utils.encodeToUrlSafeString(prepTx.getHash().toBytes()); - // 使用私钥进行签名; - prepTx.sign(CLIENT_CERT); - - // 提交交易; - prepTx.commit(); -``` -## 2.5. 查询数据 - -> 注:详细的查询可参考模块sdk-samples中SDK_GateWay_Query_Test_相关测试用例 - -```java - // 创建服务代理; - BlockchainService service = serviceFactory.getBlockchainService(); - - // 查询区块信息; - // 区块高度; - long ledgerNumber = service.getLedger(ledgerHash).getLatestBlockHeight(); - // 最新区块; - LedgerBlock latestBlock = service.getBlock(ledgerHash, ledgerNumber); - // 区块中的交易的数量; - long txCount = service.getTransactionCount(ledgerHash, latestBlock.getHash()); - // 获取交易列表; - LedgerTransaction[] txList = service.getTransactions(ledgerHash, ledgerNumber, 0, 100); - // 遍历交易列表 - for (LedgerTransaction ledgerTransaction : txList) { - TransactionContent txContent = ledgerTransaction.getTransactionContent(); - Operation[] operations = txContent.getOperations(); - if (operations != null && operations.length > 0) { - for (Operation operation : operations) { - operation = ClientResolveUtil.read(operation); - // 操作类型:数据账户注册操作 - if (operation instanceof DataAccountRegisterOperation) { - DataAccountRegisterOperation daro = (DataAccountRegisterOperation) operation; - BlockchainIdentity blockchainIdentity = daro.getAccountID(); - } - // 操作类型:用户注册操作 - else if (operation instanceof UserRegisterOperation) { - UserRegisterOperation uro = (UserRegisterOperation) operation; - BlockchainIdentity blockchainIdentity = uro.getUserID(); - } - // 操作类型:账本注册操作 - else if (operation instanceof LedgerInitOperation) { - - LedgerInitOperation ledgerInitOperation = (LedgerInitOperation)operation; - LedgerInitSetting ledgerInitSetting = ledgerInitOperation.getInitSetting(); - - ParticipantNode[] participantNodes = ledgerInitSetting.getConsensusParticipants(); - } - // 操作类型:合约发布操作 - else if (operation instanceof ContractCodeDeployOperation) { - ContractCodeDeployOperation ccdo = (ContractCodeDeployOperation) operation; - BlockchainIdentity blockchainIdentity = ccdo.getContractID(); - } - // 操作类型:合约执行操作 - else if (operation instanceof ContractEventSendOperation) { - ContractEventSendOperation ceso = (ContractEventSendOperation) operation; - } - // 操作类型:KV存储操作 - else if (operation instanceof DataAccountKVSetOperation) { - DataAccountKVSetOperation.KVWriteEntry[] kvWriteEntries = - ((DataAccountKVSetOperation) operation).getWriteSet(); - if (kvWriteEntries != null && kvWriteEntries.length > 0) { - for (DataAccountKVSetOperation.KVWriteEntry kvWriteEntry : kvWriteEntries) { - BytesValue bytesValue = kvWriteEntry.getValue(); - DataType dataType = bytesValue.getType(); - Object showVal = ClientResolveUtil.readValueByBytesValue(bytesValue); - System.out.println("writeSet.key=" + kvWriteEntry.getKey()); - System.out.println("writeSet.value=" + showVal); - System.out.println("writeSet.type=" + dataType); - System.out.println("writeSet.version=" + kvWriteEntry.getExpectedVersion()); - } - } - } - } - } - } - - // 根据交易的 hash 获得交易;注:客户端生成 PrepareTransaction 时得到交易hash; - HashDigest txHash = txList[0].getTransactionContent().getHash(); - Transaction tx = service.getTransactionByContentHash(ledgerHash, txHash); - // 获取数据; - String commerceAccount = "GGhhreGeasdfasfUUfehf9932lkae99ds66jf=="; - String[] objKeys = new String[] { "x001", "x002" }; - TypedKVEntry[] kvData = service.getDataEntries(ledgerHash, commerceAccount, objKeys); - - long payloadVersion = kvData[0].getVersion(); - - // 获取数据账户下所有的KV列表 - TypedKVEntry[] kvDatas = service.getDataEntries(ledgerHash, commerceAccount, 0, 100); - if (kvData != null && kvData.length > 0) { - for (TypedKVEntry kvDatum : kvDatas) { - System.out.println("kvData.key=" + kvDatum.getKey()); - System.out.println("kvData.version=" + kvDatum.getVersion()); - System.out.println("kvData.type=" + kvDatum.getType()); - System.out.println("kvData.value=" + kvDatum.getValue()); - } - } -``` - -## 2.6. 合约发布 - -```java - - // 创建服务代理; - BlockchainService service = serviceFactory.getBlockchainService(); - - // 在本地定义TX模板 - TransactionTemplate txTemp = service.newTransaction(ledgerHash); - - // 合约内容读取 - byte[] contractBytes = FileUtils.readBytes(new File("CONTRACT_FILE")); - - // 生成用户 - BlockchainKeypair contractKeyPair = BlockchainKeyGenerator.getInstance().generate(); - - // 发布合约 - txTemp.contracts().deploy(contractKeyPair.getIdentity(), contractBytes); - - // TX 准备就绪; - PreparedTransaction prepTx = txTemp.prepare(); - - // 使用私钥进行签名; - prepTx.sign(CLIENT_CERT); - - // 提交交易; - TransactionResponse transactionResponse = prepTx.commit(); - - assertTrue(transactionResponse.isSuccess()); - - // 打印合约地址 - System.out.println(contractKeyPair.getIdentity().getAddress().toBase58()); -``` - -## 2.7. 合约执行 - -```java - - // 创建服务代理; - BlockchainService service = serviceFactory.getBlockchainService(); - - // 在本地定义TX模板 - TransactionTemplate txTemp = service.newTransaction(ledgerHash); - - // 合约地址 - String contractAddress = ""; - - // 使用接口方式调用合约 - TransferContract transferContract = txTemp.contract(contractAddress, TransferContract.class); - - // 使用decode方式调用合约内部方法(create方法) - // 返回GenericValueHolder可通过get方法获取结果,但get方法需要在commit调用后执行 - String address = "address"; - String account = "fill account"; - long money = 100000000L; - GenericValueHolder result = ContractReturnValue.decode(transferContract.create(address, account, money)); - - PreparedTransaction ptx = txTemp.prepare(); - - ptx.sign(CLIENT_CERT); - - TransactionResponse transactionResponse = ptx.commit(); - - String cotractExecResult = result.get(); - - // TransactionResponse也提供了可供查询结果的接口 - OperationResult[] operationResults = transactionResponse.getOperationResults(); - - // 通过OperationResult获取结果 - for (int i = 0; i < operationResults.length; i++) { - OperationResult opResult = operationResults[i]; - System.out.printf("Operation[%s].result = %s \r\n", - opResult.getIndex(), BytesValueEncoding.decode(opResult.getResult())); - } -``` - -## 2.8. 事件账户注册 -```java - BlockchainService service = serviceFactory.getBlockchainService(); - TransactionTemplate txTemp = service.newTransaction(ledgerHash); - - BlockchainKeypair eventAccount = BlockchainKeyGenerator.getInstance().generate(); - txTemp.eventAccounts().register(eventAccount.getIdentity()); - - // TX 准备就绪; - PreparedTransaction prepTx = txTemp.prepare(); - // 使用私钥进行签名; - prepTx.sign(CLIENT_CERT); - - // 提交交易; - prepTx.commit(); -``` -## 2.9. 事件发布 -```java - BlockchainService service = serviceFactory.getBlockchainService(); - TransactionTemplate txTemp = service.newTransaction(ledgerHash); - - // 发布事件到指定的账户中; - String eventAccount = "GGhhreGeasdfasfUUfehf9932lkae99ds66jf=="; - txTemp.eventAccount(eventAccount).publish("event_name", "string", -1) - .publish("event_name", 0, 0) - .publish("event_name", "bytes".getBytes(), 1); - - // TX 准备就绪; - PreparedTransaction prepTx = txTemp.prepare(); - - // 使用私钥进行签名; - prepTx.sign(CLIENT_CERT); - - // 提交交易; - prepTx.commit(); -``` - -## 2.10. 事件监听 - -- 系统事件 -> 目前仅支持新区块产生事件 -```java - EventListenerHandle handler = blockchainService.monitorUserEvent(ledgerHash, eventAccount.getAddress().toBase58(), eventName, 0, new UserEventListener() { - @Override - public void onEvent(Event eventMessage, EventContext eventContext) { - BytesValue content = eventMessage.getContent(); - switch (content.getType()) { - case TEXT: - case XML: - case JSON: - System.out.println(content.getBytes().toUTF8String()); - break; - case INT64: - case TIMESTAMP: - System.out.println(BytesUtils.toLong(content.getBytes().toBytes())); - break; - default: - break; - } - - // 关闭监听的两种方式:1 - eventContext.getHandle().cancel(); - } - }); - - // 关闭监听的两种方式:2 - handler.cancel(); -``` - -- 用户自定义事件 -```java - EventListenerHandle handler = blockchainService.monitorSystemEvent(ledgerHash, SystemEvent.NEW_BLOCK_CREATED, 0, new SystemEventListener() { - @Override - public void onEvents(Event[] eventMessages, EventContext eventContext) { - for (Event eventMessage : eventMessages) { - BytesValue content = eventMessage.getContent(); - // content中存放的是当前链上最新高度 - System.out.println(BytesUtils.toLong(content.getBytes().toBytes())); - } - - // 关闭监听的两种方式:1 - eventContext.getHandle().cancel(); - } - }); - - // 关闭监听的两种方式:2 - handler.cancel(); +# 1. maven坐标 +```java + + com.jd.blockchain + sdk-client + ${ledger.version} + + + com.jd.blockchain + contract-starter + ${ledger.version} + + + com.jd.blockchain + crypto-classic + ${ledger.version} + + + + com.jd.blockchain + crypto-sm + ${ledger.version} + +``` +# 2. 数据快速上链 +## 2.1. 服务连接 + +```java + //创建服务代理 + public BlockchainKeypair CLIENT_CERT = BlockchainKeyGenerator.getInstance().generate(); + final String GATEWAY_IP = "127.0.0.1"; + final int GATEWAY_PORT = 80; + final boolean SECURE = false; + GatewayServiceFactory serviceFactory = GatewayServiceFactory.connect(GATEWAY_IP, GATEWAY_PORT, SECURE, + CLIENT_CERT); + // 创建服务代理; + BlockchainService service = serviceFactory.getBlockchainService(); + HashDigest[] ledgerHashs = service.getLedgerHashs(); + // 获取当前账本Hash + HashDigest ledgerHash = ledgerHashs[0]; +``` +## 2.2. 用户注册 +```java + // 创建服务代理; + BlockchainService service = serviceFactory.getBlockchainService(); + // 在本地定义注册账号的 TX; + TransactionTemplate txTemp = service.newTransaction(ledgerHash); + BlockchainKeypair user = BlockchainKeyGenerator.getInstance().generate(); + + txTemp.users().register(user.getIdentity()); + + // TX 准备就绪; + PreparedTransaction prepTx = txTemp.prepare(); + // 使用私钥进行签名; + prepTx.sign(CLIENT_CERT); + // 提交交易; + prepTx.commit(); +``` +## 2.3. 数据账户注册 +```java + // 创建服务代理; + BlockchainService service = serviceFactory.getBlockchainService(); + // 在本地定义注册账号的 TX; + TransactionTemplate txTemp = service.newTransaction(ledgerHash); + BlockchainKeypair dataAccount = BlockchainKeyGenerator.getInstance().generate(); + + txTemp.dataAccounts().register(dataAccount.getIdentity()); + + // TX 准备就绪; + PreparedTransaction prepTx = txTemp.prepare(); + // 使用私钥进行签名; + prepTx.sign(CLIENT_CERT); + + // 提交交易; + prepTx.commit(); +``` +## 2.4. 写入数据 +```java + // 创建服务代理; + BlockchainService service = serviceFactory.getBlockchainService(); + + // 在本地定义注册账号的 TX; + TransactionTemplate txTemp = service.newTransaction(ledgerHash); + + // -------------------------------------- + // 将商品信息写入到指定的账户中; + // 对象将被序列化为 JSON 形式存储,并基于 JSON 结构建立查询索引; + String commodityDataAccount = "GGhhreGeasdfasfUUfehf9932lkae99ds66jf=="; + txTemp.dataAccount(commodityDataAccount).setText("ASSET_CODE", "value1", -1); + + // TX 准备就绪; + PreparedTransaction prepTx = txTemp.prepare(); + + String txHash = Base64Utils.encodeToUrlSafeString(prepTx.getHash().toBytes()); + // 使用私钥进行签名; + prepTx.sign(CLIENT_CERT); + + // 提交交易; + prepTx.commit(); +``` +## 2.5. 查询数据 + +> 注:详细的查询可参考模块sdk-samples中SDK_GateWay_Query_Test_相关测试用例 + +```java + // 创建服务代理; + BlockchainService service = serviceFactory.getBlockchainService(); + + // 查询区块信息; + // 区块高度; + long ledgerNumber = service.getLedger(ledgerHash).getLatestBlockHeight(); + // 最新区块; + LedgerBlock latestBlock = service.getBlock(ledgerHash, ledgerNumber); + // 区块中的交易的数量; + long txCount = service.getTransactionCount(ledgerHash, latestBlock.getHash()); + // 获取交易列表; + LedgerTransaction[] txList = service.getTransactions(ledgerHash, ledgerNumber, 0, 100); + // 遍历交易列表 + for (LedgerTransaction ledgerTransaction : txList) { + TransactionContent txContent = ledgerTransaction.getTransactionContent(); + Operation[] operations = txContent.getOperations(); + if (operations != null && operations.length > 0) { + for (Operation operation : operations) { + operation = ClientResolveUtil.read(operation); + // 操作类型:数据账户注册操作 + if (operation instanceof DataAccountRegisterOperation) { + DataAccountRegisterOperation daro = (DataAccountRegisterOperation) operation; + BlockchainIdentity blockchainIdentity = daro.getAccountID(); + } + // 操作类型:用户注册操作 + else if (operation instanceof UserRegisterOperation) { + UserRegisterOperation uro = (UserRegisterOperation) operation; + BlockchainIdentity blockchainIdentity = uro.getUserID(); + } + // 操作类型:账本注册操作 + else if (operation instanceof LedgerInitOperation) { + + LedgerInitOperation ledgerInitOperation = (LedgerInitOperation)operation; + LedgerInitSetting ledgerInitSetting = ledgerInitOperation.getInitSetting(); + + ParticipantNode[] participantNodes = ledgerInitSetting.getConsensusParticipants(); + } + // 操作类型:合约发布操作 + else if (operation instanceof ContractCodeDeployOperation) { + ContractCodeDeployOperation ccdo = (ContractCodeDeployOperation) operation; + BlockchainIdentity blockchainIdentity = ccdo.getContractID(); + } + // 操作类型:合约执行操作 + else if (operation instanceof ContractEventSendOperation) { + ContractEventSendOperation ceso = (ContractEventSendOperation) operation; + } + // 操作类型:KV存储操作 + else if (operation instanceof DataAccountKVSetOperation) { + DataAccountKVSetOperation.KVWriteEntry[] kvWriteEntries = + ((DataAccountKVSetOperation) operation).getWriteSet(); + if (kvWriteEntries != null && kvWriteEntries.length > 0) { + for (DataAccountKVSetOperation.KVWriteEntry kvWriteEntry : kvWriteEntries) { + BytesValue bytesValue = kvWriteEntry.getValue(); + DataType dataType = bytesValue.getType(); + Object showVal = ClientResolveUtil.readValueByBytesValue(bytesValue); + System.out.println("writeSet.key=" + kvWriteEntry.getKey()); + System.out.println("writeSet.value=" + showVal); + System.out.println("writeSet.type=" + dataType); + System.out.println("writeSet.version=" + kvWriteEntry.getExpectedVersion()); + } + } + } + } + } + } + + // 根据交易的 hash 获得交易;注:客户端生成 PrepareTransaction 时得到交易hash; + HashDigest txHash = txList[0].getTransactionContent().getHash(); + Transaction tx = service.getTransactionByContentHash(ledgerHash, txHash); + // 获取数据; + String commerceAccount = "GGhhreGeasdfasfUUfehf9932lkae99ds66jf=="; + String[] objKeys = new String[] { "x001", "x002" }; + TypedKVEntry[] kvData = service.getDataEntries(ledgerHash, commerceAccount, objKeys); + + long payloadVersion = kvData[0].getVersion(); + + // 获取数据账户下所有的KV列表 + TypedKVEntry[] kvDatas = service.getDataEntries(ledgerHash, commerceAccount, 0, 100); + if (kvData != null && kvData.length > 0) { + for (TypedKVEntry kvDatum : kvDatas) { + System.out.println("kvData.key=" + kvDatum.getKey()); + System.out.println("kvData.version=" + kvDatum.getVersion()); + System.out.println("kvData.type=" + kvDatum.getType()); + System.out.println("kvData.value=" + kvDatum.getValue()); + } + } +``` + +## 2.6. 合约发布 + +```java + + // 创建服务代理; + BlockchainService service = serviceFactory.getBlockchainService(); + + // 在本地定义TX模板 + TransactionTemplate txTemp = service.newTransaction(ledgerHash); + + // 合约内容读取 + byte[] contractBytes = FileUtils.readBytes(new File("CONTRACT_FILE")); + + // 生成用户 + BlockchainKeypair contractKeyPair = BlockchainKeyGenerator.getInstance().generate(); + + // 发布合约 + txTemp.contracts().deploy(contractKeyPair.getIdentity(), contractBytes); + + // TX 准备就绪; + PreparedTransaction prepTx = txTemp.prepare(); + + // 使用私钥进行签名; + prepTx.sign(CLIENT_CERT); + + // 提交交易; + TransactionResponse transactionResponse = prepTx.commit(); + + assertTrue(transactionResponse.isSuccess()); + + // 打印合约地址 + System.out.println(contractKeyPair.getIdentity().getAddress().toBase58()); +``` + +## 2.7. 合约执行 + +```java + + // 创建服务代理; + BlockchainService service = serviceFactory.getBlockchainService(); + + // 在本地定义TX模板 + TransactionTemplate txTemp = service.newTransaction(ledgerHash); + + // 合约地址 + String contractAddress = ""; + + // 使用接口方式调用合约 + TransferContract transferContract = txTemp.contract(contractAddress, TransferContract.class); + + // 使用decode方式调用合约内部方法(create方法) + // 返回GenericValueHolder可通过get方法获取结果,但get方法需要在commit调用后执行 + String address = "address"; + String account = "fill account"; + long money = 100000000L; + GenericValueHolder result = ContractReturnValue.decode(transferContract.create(address, account, money)); + + PreparedTransaction ptx = txTemp.prepare(); + + ptx.sign(CLIENT_CERT); + + TransactionResponse transactionResponse = ptx.commit(); + + String cotractExecResult = result.get(); + + // TransactionResponse也提供了可供查询结果的接口 + OperationResult[] operationResults = transactionResponse.getOperationResults(); + + // 通过OperationResult获取结果 + for (int i = 0; i < operationResults.length; i++) { + OperationResult opResult = operationResults[i]; + System.out.printf("Operation[%s].result = %s \r\n", + opResult.getIndex(), BytesValueEncoding.decode(opResult.getResult())); + } +``` + +## 2.8. 事件账户注册 +```java + BlockchainService service = serviceFactory.getBlockchainService(); + TransactionTemplate txTemp = service.newTransaction(ledgerHash); + + BlockchainKeypair eventAccount = BlockchainKeyGenerator.getInstance().generate(); + txTemp.eventAccounts().register(eventAccount.getIdentity()); + + // TX 准备就绪; + PreparedTransaction prepTx = txTemp.prepare(); + // 使用私钥进行签名; + prepTx.sign(CLIENT_CERT); + + // 提交交易; + prepTx.commit(); +``` +## 2.9. 事件发布 +```java + BlockchainService service = serviceFactory.getBlockchainService(); + TransactionTemplate txTemp = service.newTransaction(ledgerHash); + + // 发布事件到指定的账户中; + String eventAccount = "GGhhreGeasdfasfUUfehf9932lkae99ds66jf=="; + txTemp.eventAccount(eventAccount).publish("event_name", "string", -1) + .publish("event_name", 0, 0) + .publish("event_name", "bytes".getBytes(), 1); + + // TX 准备就绪; + PreparedTransaction prepTx = txTemp.prepare(); + + // 使用私钥进行签名; + prepTx.sign(CLIENT_CERT); + + // 提交交易; + prepTx.commit(); +``` + +## 2.10. 事件监听 + +- 系统事件 +> 目前仅支持新区块产生事件 +```java + EventListenerHandle handler = blockchainService.monitorSystemEvent(ledgerHash, SystemEvent.NEW_BLOCK_CREATED, 0, new SystemEventListener() { + @Override + public void onEvents(Event[] eventMessages, EventContext eventContext) { + for (Event eventMessage : eventMessages) { + BytesValue content = eventMessage.getContent(); + // content中存放的是当前链上最新高度 + System.out.println(BytesUtils.toLong(content.getBytes().toBytes())); + } + + // 关闭监听的两种方式:1 + eventContext.getHandle().cancel(); + } + }); + + // 关闭监听的两种方式:2 + handler.cancel(); +``` + +- 用户自定义事件 +```java + EventListenerHandle handler = blockchainService.monitorUserEvent(ledgerHash, eventAccount.getAddress().toBase58(), eventName, 0, new UserEventListener() { + @Override + public void onEvent(Event eventMessage, EventContext eventContext) { + BytesValue content = eventMessage.getContent(); + switch (content.getType()) { + case TEXT: + case XML: + case JSON: + System.out.println(content.getBytes().toUTF8String()); + break; + case INT64: + case TIMESTAMP: + System.out.println(BytesUtils.toLong(content.getBytes().toBytes())); + break; + default: + break; + } + + // 关闭监听的两种方式:1 + eventContext.getHandle().cancel(); + } + }); + + // 关闭监听的两种方式:2 + handler.cancel(); ``` \ No newline at end of file From 06dd70329aed5a5f3916439797e57ece480e75f6 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Fri, 31 Jul 2020 16:01:58 +0800 Subject: [PATCH 56/65] modify the code_example.MD; --- .../src/main/resources/docs/code_example.MD | 40 +++++++++++-------- explorer | 2 +- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/deploy/deploy-gateway/src/main/resources/docs/code_example.MD b/deploy/deploy-gateway/src/main/resources/docs/code_example.MD index f5edfb13..3e35841a 100644 --- a/deploy/deploy-gateway/src/main/resources/docs/code_example.MD +++ b/deploy/deploy-gateway/src/main/resources/docs/code_example.MD @@ -3,36 +3,42 @@ com.jd.blockchain sdk-client - ${ledger.version} + 1.3.0.RELEASE com.jd.blockchain contract-starter - ${ledger.version} + 1.3.0.RELEASE com.jd.blockchain crypto-classic - ${ledger.version} + 1.3.0.RELEASE com.jd.blockchain crypto-sm - ${ledger.version} + 1.3.0.RELEASE ``` # 2. 数据快速上链 ## 2.1. 服务连接 ```java + //使用已注册用户信息进行连接; + String GW_PUB_KEY = "3snxxx"; + String GW_PRIV_KEY = "177xxx"; + String GW_PASSWORD = "xxx"; + PrivKey gwPrivkey0 = KeyGenUtils.decodePrivKey(GW_PRIV_KEY, GW_PASSWORD); + PubKey gwPubKey0 = KeyGenUtils.decodePubKey(GW_PUB_KEY); + BlockchainKeypair adminKey = new BlockchainKeypair(gwPubKey0, gwPrivkey0); //创建服务代理 - public BlockchainKeypair CLIENT_CERT = BlockchainKeyGenerator.getInstance().generate(); final String GATEWAY_IP = "127.0.0.1"; final int GATEWAY_PORT = 80; final boolean SECURE = false; GatewayServiceFactory serviceFactory = GatewayServiceFactory.connect(GATEWAY_IP, GATEWAY_PORT, SECURE, - CLIENT_CERT); + adminKey); // 创建服务代理; BlockchainService service = serviceFactory.getBlockchainService(); HashDigest[] ledgerHashs = service.getLedgerHashs(); @@ -52,7 +58,7 @@ // TX 准备就绪; PreparedTransaction prepTx = txTemp.prepare(); // 使用私钥进行签名; - prepTx.sign(CLIENT_CERT); + prepTx.sign(adminKey); // 提交交易; prepTx.commit(); ``` @@ -69,7 +75,7 @@ // TX 准备就绪; PreparedTransaction prepTx = txTemp.prepare(); // 使用私钥进行签名; - prepTx.sign(CLIENT_CERT); + prepTx.sign(adminKey); // 提交交易; prepTx.commit(); @@ -93,7 +99,7 @@ String txHash = Base64Utils.encodeToUrlSafeString(prepTx.getHash().toBytes()); // 使用私钥进行签名; - prepTx.sign(CLIENT_CERT); + prepTx.sign(adminKey); // 提交交易; prepTx.commit(); @@ -214,7 +220,7 @@ PreparedTransaction prepTx = txTemp.prepare(); // 使用私钥进行签名; - prepTx.sign(CLIENT_CERT); + prepTx.sign(adminKey); // 提交交易; TransactionResponse transactionResponse = prepTx.commit(); @@ -250,7 +256,7 @@ PreparedTransaction ptx = txTemp.prepare(); - ptx.sign(CLIENT_CERT); + ptx.sign(adminKey); TransactionResponse transactionResponse = ptx.commit(); @@ -278,14 +284,14 @@ // TX 准备就绪; PreparedTransaction prepTx = txTemp.prepare(); // 使用私钥进行签名; - prepTx.sign(CLIENT_CERT); + prepTx.sign(adminKey); // 提交交易; prepTx.commit(); ``` ## 2.9. 事件发布 ```java - BlockchainService service = serviceFactory.getBlockchainService(); + BlockchainService service = serviceFactory.getBlockchainService(); TransactionTemplate txTemp = service.newTransaction(ledgerHash); // 发布事件到指定的账户中; @@ -298,7 +304,7 @@ PreparedTransaction prepTx = txTemp.prepare(); // 使用私钥进行签名; - prepTx.sign(CLIENT_CERT); + prepTx.sign(adminKey); // 提交交易; prepTx.commit(); @@ -309,7 +315,8 @@ - 系统事件 > 目前仅支持新区块产生事件 ```java - EventListenerHandle handler = blockchainService.monitorSystemEvent(ledgerHash, SystemEvent.NEW_BLOCK_CREATED, 0, new SystemEventListener() { + EventListenerHandle handler = blockchainService.monitorSystemEvent(ledgerHash, + SystemEvent.NEW_BLOCK_CREATED, 0, new SystemEventListener() { @Override public void onEvents(Event[] eventMessages, EventContext eventContext) { for (Event eventMessage : eventMessages) { @@ -329,7 +336,8 @@ - 用户自定义事件 ```java - EventListenerHandle handler = blockchainService.monitorUserEvent(ledgerHash, eventAccount.getAddress().toBase58(), eventName, 0, new UserEventListener() { + EventListenerHandle handler = blockchainService.monitorUserEvent(ledgerHash, + eventAccount.getAddress().toBase58(), eventName, 0, new UserEventListener() { @Override public void onEvent(Event eventMessage, EventContext eventContext) { BytesValue content = eventMessage.getContent(); diff --git a/explorer b/explorer index 3c4141f6..2980611a 160000 --- a/explorer +++ b/explorer @@ -1 +1 @@ -Subproject commit 3c4141f65828435ff271776f5cf7ac432c012a33 +Subproject commit 2980611ae967e4095d9ad08bdcc4e2f167d6de54 From 292928c9fbd44028ff2faab4306b264fc4f47e8f Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Mon, 3 Aug 2020 16:14:52 +0800 Subject: [PATCH 57/65] update --- explorer | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/explorer b/explorer index 2980611a..8767213e 160000 --- a/explorer +++ b/explorer @@ -1 +1 @@ -Subproject commit 2980611ae967e4095d9ad08bdcc4e2f167d6de54 +Subproject commit 8767213eadf2a09e53842bccb9fbea455a447dfe From 2aa19a9929b6896a6939c4b8cfe8b693ba5b8930 Mon Sep 17 00:00:00 2001 From: imuge Date: Wed, 5 Aug 2020 11:59:44 +0800 Subject: [PATCH 58/65] update core --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index 7a9554d6..5bf77112 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 7a9554d6c82a4688a0bbde6d1e7931cde3b5ec0e +Subproject commit 5bf7711230df7d1a839a3260b434a8f026d97712 From bfb292d6fc176e678287108cdbe827017d33fc5b Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Wed, 5 Aug 2020 15:44:01 +0800 Subject: [PATCH 59/65] update for jira-446; --- explorer | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/explorer b/explorer index 8767213e..e1dfa9ef 160000 --- a/explorer +++ b/explorer @@ -1 +1 @@ -Subproject commit 8767213eadf2a09e53842bccb9fbea455a447dfe +Subproject commit e1dfa9ef62ced60a1b4333e7a07f79548e299604 From 85794dd1544a0e93721f3a80a45a0a09706ef278 Mon Sep 17 00:00:00 2001 From: imuge Date: Wed, 5 Aug 2020 19:04:33 +0800 Subject: [PATCH 60/65] update event --- core | 2 +- .../src/main/resources/docs/code_example.MD | 6 +----- framework | 2 +- .../com/jd/blockchain/sdk/samples/SDK_Event_Demo.java | 9 --------- test | 2 +- 5 files changed, 4 insertions(+), 17 deletions(-) diff --git a/core b/core index 5bf77112..212410cf 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 5bf7711230df7d1a839a3260b434a8f026d97712 +Subproject commit 212410cf260f60e82a3d3f9a6fc628db47069242 diff --git a/deploy/deploy-gateway/src/main/resources/docs/code_example.MD b/deploy/deploy-gateway/src/main/resources/docs/code_example.MD index 3e35841a..cdb599ff 100644 --- a/deploy/deploy-gateway/src/main/resources/docs/code_example.MD +++ b/deploy/deploy-gateway/src/main/resources/docs/code_example.MD @@ -297,8 +297,7 @@ // 发布事件到指定的账户中; String eventAccount = "GGhhreGeasdfasfUUfehf9932lkae99ds66jf=="; txTemp.eventAccount(eventAccount).publish("event_name", "string", -1) - .publish("event_name", 0, 0) - .publish("event_name", "bytes".getBytes(), 1); + .publish("event_name", 0, 0); // TX 准备就绪; PreparedTransaction prepTx = txTemp.prepare(); @@ -343,12 +342,9 @@ BytesValue content = eventMessage.getContent(); switch (content.getType()) { case TEXT: - case XML: - case JSON: System.out.println(content.getBytes().toUTF8String()); break; case INT64: - case TIMESTAMP: System.out.println(BytesUtils.toLong(content.getBytes().toBytes())); break; default: diff --git a/framework b/framework index 919f1b04..79459a3b 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit 919f1b048e15c3b4038d80120ba7fb931730d9ea +Subproject commit 79459a3b7e8a7c08418d52a91f1ec55b6d975212 diff --git a/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDK_Event_Demo.java b/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDK_Event_Demo.java index f4d85dbe..1685ecd7 100644 --- a/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDK_Event_Demo.java +++ b/samples/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDK_Event_Demo.java @@ -35,14 +35,8 @@ public class SDK_Event_Demo extends SDK_Base_Demo { // sequence传递当前事件名链上最新序号,不存在时传-1 Event event = blockchainService.getLatestEvent(ledgerHash, eventAccount.getAddress().toBase58(), "name"); long sequence = null != event ? event.getSequence() : -1; - txTpl.eventAccount(eventAccount.getAddress()).publish("name", "bytes".getBytes(), sequence); txTpl.eventAccount(eventAccount.getAddress()).publish("name", "string", sequence + 1); txTpl.eventAccount(eventAccount.getAddress()).publish("name", 0, sequence + 2); - txTpl.eventAccount(eventAccount.getAddress()).publish("name", 1l, sequence + 3); - txTpl.eventAccount(eventAccount.getAddress()).publishXML("name", "", sequence + 4); - txTpl.eventAccount(eventAccount.getAddress()).publishJSON("name", "{}", sequence + 5); - txTpl.eventAccount(eventAccount.getAddress()).publishImage("name", "img".getBytes(), sequence + 6); - txTpl.eventAccount(eventAccount.getAddress()).publishTimestamp("name", System.currentTimeMillis(), sequence + 7); commit(txTpl); } @@ -59,12 +53,9 @@ public class SDK_Event_Demo extends SDK_Base_Demo { BytesValue content = eventMessage.getContent(); switch (content.getType()) { case TEXT: - case XML: - case JSON: System.out.println(content.getBytes().toUTF8String()); break; case INT64: - case TIMESTAMP: System.out.println(BytesUtils.toLong(content.getBytes().toBytes())); break; default: diff --git a/test b/test index 27184cc0..f5057486 160000 --- a/test +++ b/test @@ -1 +1 @@ -Subproject commit 27184cc0e48ef69d7febdf4b1fedd6d9d38984b7 +Subproject commit f5057486324d0daf2f8ef9f223a04537d03edede From b91932f0aa34c840d47401d21bd5b839c0e35dc4 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Thu, 6 Aug 2020 16:28:23 +0800 Subject: [PATCH 61/65] update; --- explorer | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/explorer b/explorer index e1dfa9ef..e9dec485 160000 --- a/explorer +++ b/explorer @@ -1 +1 @@ -Subproject commit e1dfa9ef62ced60a1b4333e7a07f79548e299604 +Subproject commit e9dec48589354e6fb0e7d461e24d56ce609026aa From 9c8be6ac8081ceb35428fb53c60e93354d9ba352 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Fri, 7 Aug 2020 14:38:33 +0800 Subject: [PATCH 62/65] update; --- explorer | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/explorer b/explorer index e9dec485..2c84df92 160000 --- a/explorer +++ b/explorer @@ -1 +1 @@ -Subproject commit e9dec48589354e6fb0e7d461e24d56ce609026aa +Subproject commit 2c84df922b78b1f202209bf16ba0b40dcd3db494 From 6c957b366aac2250fc86c7fecb652cabf3a710e8 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Fri, 7 Aug 2020 15:43:09 +0800 Subject: [PATCH 63/65] udpate; --- explorer | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/explorer b/explorer index 2c84df92..52d040f0 160000 --- a/explorer +++ b/explorer @@ -1 +1 @@ -Subproject commit 2c84df922b78b1f202209bf16ba0b40dcd3db494 +Subproject commit 52d040f0bd0082b4284cefa87ab1d0797c39b8b7 From c1a12cbab2d0ad7dd2d1600ab59c05b2d36313b8 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Fri, 7 Aug 2020 17:24:02 +0800 Subject: [PATCH 64/65] add the part 10; --- .../src/main/resources/docs/api_doc_cn_1.4.MD | 129 +++++++++++++++++- 1 file changed, 128 insertions(+), 1 deletion(-) diff --git a/deploy/deploy-gateway/src/main/resources/docs/api_doc_cn_1.4.MD b/deploy/deploy-gateway/src/main/resources/docs/api_doc_cn_1.4.MD index c7185bcc..06fd228a 100644 --- a/deploy/deploy-gateway/src/main/resources/docs/api_doc_cn_1.4.MD +++ b/deploy/deploy-gateway/src/main/resources/docs/api_doc_cn_1.4.MD @@ -2489,4 +2489,131 @@ http://localhost/ledgers/657TQAw6ssVoeKniWGwbovk7njvCTvikPambM9eBv6ezs/events/us |content.nil|事件内容是否为空| |content.bytes.value|事件内容字节| |content.type|事件内容类型| -|content.value|事件内容| \ No newline at end of file +|content.value|事件内容| + +## 10.权限对外提供的API接口使用 +### 10.1根据角色获取权限信息 +```http +GET /ledgers/{ledgerHash}/authorization/role/{roleName} +``` + +#### 参数 + +|请求类型|名称|是否必需|说明|数据类型 +|---|---|---|---|---| +|get|ledger|是|账本哈希|字符串 +|--|roleName|是|角色名|字符串 + + +#### 请求实例 +```http +http://localhost:11000/ledgers/j5pSJLyVpS8QG2wL95fiDWHHnweh2YdqNhgmnb64SBMjUh/authorization/role/DEFAULT +``` + +#### 返回实例 + +```json +{ + "data": { + "roleName": "DEFAULT", + "transactionPrivilege": { + "privilege": [ + "DIRECT_OPERATION", + "CONTRACT_OPERATION" + ], + "permissionCount": 2 + }, + "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 + }, + "version": 0 + }, + "success": true +} +``` + +说明 + +|名称|说明| +|---|---| +|roleName|角色名称| +|transactionPrivilege|交易权限| +|transactionPrivilege -> privilege|交易权限->权限类别| +|transactionPrivilege -> permissionCount|交易权限->权限总数| +|ledgerPrivilege|账本权限| +|ledgerPrivilege -> privilege|账本权限->权限类别| +|ledgerPrivilege -> permissionCount|账本权限->权限总数| + +### 10.2根据用户获取权限信息 + +```http +GET /ledgers/{ledgerHash}/authorization/user/{userAddress} +``` + +#### 参数 + +|请求类型|名称|是否必需|说明|数据类型 +|---|---|---|---|---| +|get|ledger|是|账本哈希|字符串 +|--|userAddress|是|用户地址|字符串 + + +#### 请求实例 +```http +http://localhost:11000/ledgers/j5pSJLyVpS8QG2wL95fiDWHHnweh2YdqNhgmnb64SBMjUh/authorization/user/LdeNwH71wxtbf1UM8ExRG8qbPnu17MdnRSVva +``` + +#### 返回实例 + +```json +{ + "data": { + "userAddress": { + "value": "LdeNwH71wxtbf1UM8ExRG8qbPnu17MdnRSVva" + }, + "transactionPrivilegesBitset": { + "privilege": [ + "DIRECT_OPERATION" + ], + "permissionCount": 1 + }, + "userRole": [ + "MANAGER1", + "MANAGER0" + ], + "ledgerPrivilegesBitset": { + "privilege": [ + "CONFIGURE_ROLES", + "REGISTER_USER" + ], + "permissionCount": 2 + } + }, + "success": true +} +``` + +说明 + +|名称|说明| +|---|---| +|userRole|用户角色| +|transactionPrivilegesBitset|交易权限集| +|ledgerPrivilegesBitset|账本权限集| From 576b498476a6bcdf7db8bb714ad856efb6f688ca Mon Sep 17 00:00:00 2001 From: huanghaiquan Date: Fri, 7 Aug 2020 19:20:59 +0800 Subject: [PATCH 65/65] publish 1.3.0.RELEASE; --- core | 2 +- explorer | 2 +- framework | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core b/core index 212410cf..ec842b88 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 212410cf260f60e82a3d3f9a6fc628db47069242 +Subproject commit ec842b88f4ea19ffa8f9a00f31317e5e4dc5218b diff --git a/explorer b/explorer index 52d040f0..7baa8852 160000 --- a/explorer +++ b/explorer @@ -1 +1 @@ -Subproject commit 52d040f0bd0082b4284cefa87ab1d0797c39b8b7 +Subproject commit 7baa88521acd1043fa03408a693c0d0a2546ad93 diff --git a/framework b/framework index 79459a3b..b5e7aec4 160000 --- a/framework +++ b/framework @@ -1 +1 @@ -Subproject commit 79459a3b7e8a7c08418d52a91f1ec55b6d975212 +Subproject commit b5e7aec41425d85f6374c8bf2a604c69b6adad83