Browse Source

new version 1.6.0-SNAPSHOT

tags/1.6.0
imuge 3 years ago
parent
commit
a99f88244f
44 changed files with 695 additions and 899 deletions
  1. +1
    -1
      core
  2. +1
    -1
      deploy/deploy-gateway/pom.xml
  3. +4
    -2
      deploy/deploy-gateway/src/main/resources/config/gateway.conf
  4. +1
    -1
      deploy/deploy-peer/pom.xml
  5. +15
    -1
      deploy/deploy-peer/src/main/resources/config/init/ledger.init
  6. +6
    -2
      deploy/deploy-peer/src/main/resources/config/init/local.conf
  7. +0
    -135
      deploy/docker/docker-demo/pom.xml
  8. +0
    -37
      deploy/docker/docker-demo/src/main/docker/Dockerfile
  9. +0
    -4
      deploy/docker/docker-demo/src/main/docker/script/shutdown.sh
  10. +0
    -34
      deploy/docker/docker-demo/src/main/docker/script/start.sh
  11. BIN
      deploy/docker/docker-demo/src/main/docker/zip/conf.zip
  12. +0
    -36
      deploy/docker/docker-demo/src/main/resources/docker-compose-all.yaml
  13. +0
    -5
      deploy/docker/docker-demo/src/main/resources/start-net.sh
  14. +0
    -9
      deploy/docker/docker-demo/src/main/resources/zip.sh
  15. +0
    -66
      deploy/docker/docker-sdk/pom.xml
  16. +0
    -107
      deploy/docker/docker-sdk/src/main/java/com/jd/blockchain/ContractParams.java
  17. +0
    -68
      deploy/docker/docker-sdk/src/main/java/com/jd/blockchain/SDKDemo.java
  18. +0
    -46
      deploy/docker/docker-sdk/src/main/java/com/jd/blockchain/SDKDemo_Constant.java
  19. +0
    -192
      deploy/docker/docker-sdk/src/main/java/com/jd/blockchain/SDK_Base_Demo.java
  20. +0
    -32
      deploy/docker/docker-sdk/src/main/java/com/jd/chain/contract/TransferContract.java
  21. BIN
      deploy/docker/docker-sdk/src/main/resources/contract-compile-1.3.0.RELEASE.car
  22. +0
    -24
      deploy/docker/pom.xml
  23. +0
    -44
      deploy/docker/readme.md
  24. +3
    -4
      deploy/pom.xml
  25. +150
    -0
      docs/ca.md
  26. +248
    -0
      docs/cli/ca.md
  27. +2
    -0
      docs/cli/keys.md
  28. +18
    -18
      docs/cli/participant.md
  29. +228
    -14
      docs/cli/tx.md
  30. +3
    -1
      docs/jdchain_cli.md
  31. +1
    -1
      explorer
  32. +0
    -0
      feature/ledger-database/.gitkeep
  33. +1
    -1
      framework
  34. +1
    -1
      libs/bft-smart
  35. +1
    -1
      libs/binary-proto
  36. +1
    -1
      libs/httpservice
  37. +1
    -1
      libs/kvdb
  38. +1
    -1
      libs/utils
  39. +1
    -1
      pom.xml
  40. +1
    -1
      project
  41. +1
    -1
      samples/contract-samples/pom.xml
  42. +3
    -3
      samples/pom.xml
  43. +1
    -1
      samples/sdk-samples/pom.xml
  44. +1
    -1
      test

+ 1
- 1
core

@@ -1 +1 @@
Subproject commit c7160adc704c53766427ecdf70f130e43f6cac43
Subproject commit c6d05f98420213bf7ab1b4f431f6dcee2654bf5c

+ 1
- 1
deploy/deploy-gateway/pom.xml View File

@@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.jd.blockchain</groupId> <groupId>com.jd.blockchain</groupId>
<artifactId>deploy-root</artifactId> <artifactId>deploy-root</artifactId>
<version>1.5.0.RELEASE</version>
<version>1.6.0-SNAPSHOT</version>
</parent> </parent>
<artifactId>deploy-gateway</artifactId> <artifactId>deploy-gateway</artifactId>




+ 4
- 2
deploy/deploy-gateway/src/main/resources/config/gateway.conf View File

@@ -25,11 +25,13 @@ peer.providers=com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider
data.retrieval.url= data.retrieval.url=
schema.retrieval.url= schema.retrieval.url=


#默认公钥的内容(Base58编码数据);
#默认公钥的内容(Base58编码数据),非CA模式下必填
keys.default.pubkey= keys.default.pubkey=
#默认网关证书路径(X509,PEM),CA模式下必填;
keys.default.ca-path=
#默认私钥的路径;在 pk-path 和 pk 之间必须设置其一; #默认私钥的路径;在 pk-path 和 pk 之间必须设置其一;
keys.default.privkey-path= keys.default.privkey-path=
#默认私钥的内容(加密的Base58编码数据);在 pk-path 和 pk 之间必须设置其一;
#默认私钥的内容;在 pk-path 和 pk 之间必须设置其一;
keys.default.privkey= keys.default.privkey=
#默认私钥的解码密码; #默认私钥的解码密码;
keys.default.privkey-password= keys.default.privkey-password=

+ 1
- 1
deploy/deploy-peer/pom.xml View File

@@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.jd.blockchain</groupId> <groupId>com.jd.blockchain</groupId>
<artifactId>deploy-root</artifactId> <artifactId>deploy-root</artifactId>
<version>1.5.0.RELEASE</version>
<version>1.6.0-SNAPSHOT</version>
</parent> </parent>
<artifactId>deploy-peer</artifactId> <artifactId>deploy-peer</artifactId>




+ 15
- 1
deploy/deploy-peer/src/main/resources/config/init/ledger.init View File

@@ -4,6 +4,12 @@ ledger.seed=932dfe23-fe23232f-283f32fa-dd32aa76-8322ca2f-56236cda-7136b322-cb323
#账本的描述名称;此属性不参与共识,仅仅在当前参与方的本地节点用于描述用途; #账本的描述名称;此属性不参与共识,仅仅在当前参与方的本地节点用于描述用途;
ledger.name= ledger.name=


#身份认证模式:KEYPAIR/CA,默认KEYPAIR即公私钥对模式
identity-mode=KEYPAIR

#账本根证书路径,identity-mode 为 CA 时,此选项不能为空,支持多个,半角逗号相隔
root-ca-path=

#声明的账本创建时间;格式为 “yyyy-MM-dd HH:mm:ss.SSSZ”,表示”年-月-日 时:分:秒:毫秒时区“;例如:“2019-08-01 14:26:58.069+0800”,其中,+0800 表示时区是东8区 #声明的账本创建时间;格式为 “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 created-time=2019-08-01 14:26:58.069+0800


@@ -76,6 +82,8 @@ cons_parti.0.name=
cons_parti.0.pubkey-path= cons_parti.0.pubkey-path=
#第0个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数; #第0个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数;
cons_parti.0.pubkey= cons_parti.0.pubkey=
#第1个参与方的证书路径,identity-mode 为 CA 时,此选项不能为空
cons_parti.0.ca-path=


#第0个参与方的角色清单;可选项; #第0个参与方的角色清单;可选项;
#cons_parti.0.roles=ADMIN, MANAGER #cons_parti.0.roles=ADMIN, MANAGER
@@ -96,6 +104,8 @@ cons_parti.1.name=
cons_parti.1.pubkey-path= cons_parti.1.pubkey-path=
#第1个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数; #第1个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数;
cons_parti.1.pubkey= cons_parti.1.pubkey=
#第1个参与方的证书路径,identity-mode 为 CA 时,此选项不能为空
cons_parti.1.ca-path=


#第1个参与方的角色清单;可选项; #第1个参与方的角色清单;可选项;
#cons_parti.1.roles=MANAGER #cons_parti.1.roles=MANAGER
@@ -116,6 +126,8 @@ cons_parti.2.name=
cons_parti.2.pubkey-path= cons_parti.2.pubkey-path=
#第2个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数; #第2个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数;
cons_parti.2.pubkey= cons_parti.2.pubkey=
#第1个参与方的证书路径,identity-mode 为 CA 时,此选项不能为空
cons_parti.2.ca-path=


#第2个参与方的角色清单;可选项; #第2个参与方的角色清单;可选项;
#cons_parti.2.roles=MANAGER #cons_parti.2.roles=MANAGER
@@ -136,6 +148,8 @@ cons_parti.3.name=
cons_parti.3.pubkey-path= cons_parti.3.pubkey-path=
#第3个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数; #第3个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数;
cons_parti.3.pubkey= cons_parti.3.pubkey=
#第1个参与方的证书路径,identity-mode 为 CA 时,此选项不能为空
cons_parti.3.ca-path=


#第3个参与方的角色清单;可选项; #第3个参与方的角色清单;可选项;
#cons_parti.3.roles=GUEST #cons_parti.3.roles=GUEST
@@ -147,4 +161,4 @@ cons_parti.3.initializer.host=127.0.0.1
#第3个参与方的账本初始服务的端口; #第3个参与方的账本初始服务的端口;
cons_parti.3.initializer.port=8830 cons_parti.3.initializer.port=8830
#第3个参与方的账本初始服务是否开启安全连接; #第3个参与方的账本初始服务是否开启安全连接;
cons_parti.3.initializer.secure=false
cons_parti.3.initializer.secure=false

+ 6
- 2
deploy/deploy-peer/src/main/resources/config/init/local.conf View File

@@ -1,13 +1,17 @@
#当前参与方的 id,与ledger.init文件中cons_parti.id一致,默认从0开始 #当前参与方的 id,与ledger.init文件中cons_parti.id一致,默认从0开始
local.parti.id=0 local.parti.id=0


#当前参与方的公钥
#当前参与方的公钥,用于非证书模式
local.parti.pubkey= local.parti.pubkey=
#当前参与方的证书信息,用于证书模式
local.parti.ca-path=


#当前参与方的私钥(密文编码) #当前参与方的私钥(密文编码)
local.parti.privkey= local.parti.privkey=
#当前参与方的私钥文件,PEM格式,用于证书模式
local.parti.privkey-path=


#当前参与方的私钥解密密钥(原始口令的一次哈希,Base58格式),如果不设置,则启动过程中需要从控制台输入
#当前参与方的私钥解密密钥(原始口令的一次哈希,Base58格式),如果不设置,则启动过程中需要从控制台输入;
local.parti.pwd= local.parti.pwd=


#账本初始化完成后生成的"账本绑定配置文件"的输出目录 #账本初始化完成后生成的"账本绑定配置文件"的输出目录


+ 0
- 135
deploy/docker/docker-demo/pom.xml View File

@@ -1,135 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>docker</artifactId>
<groupId>com.jd.blockchain</groupId>
<version>1.5.0.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>docker-demo</artifactId>

<dependencies>
<dependency>
<groupId>com.jd.blockchain</groupId>
<artifactId>docker-sdk</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>

<build>
<finalName>jdchain-demo</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<optimize>false</optimize>
<debug>true</debug>
<showDeprecation>false</showDeprecation>
<showWarnings>false</showWarnings>
</configuration>
</plugin>

<!-- <plugin>-->
<!-- <groupId>org.apache.maven.plugins</groupId>-->
<!-- <artifactId>maven-dependency-plugin</artifactId>-->
<!-- <executions>-->
<!-- <execution>-->
<!-- <id>copy-dependencies</id>-->
<!-- <phase>package</phase>-->
<!-- <goals>-->
<!-- <goal>copy-dependencies</goal>-->
<!-- </goals>-->
<!-- <configuration>-->
<!-- <outputDirectory>${project.build.directory}/dependencies</outputDirectory>-->
<!-- <excludeTransitive>false</excludeTransitive>-->
<!-- <stripVersion>false</stripVersion>-->
<!-- <includeScope>runtime</includeScope>-->
<!-- </configuration>-->
<!-- </execution>-->
<!-- </executions>-->
<!-- </plugin>-->

<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<!-- 将资源文件拷贝到config目录下 -->
<encoding>UTF-8</encoding>
<outputDirectory>${project.basedir}/src/main/docker/zip</outputDirectory>
<overwrite>false</overwrite>
<resources>
<resource>
<directory>${project.basedir}/../../deploy-peer/target/</directory>
<filtering>false</filtering>
<includes>
<include>jdchain-peer-${project.version}.zip</include>
</includes>
</resource>

<resource>
<directory>${project.basedir}/../../deploy-gateway/target/</directory>
<filtering>false</filtering>
<includes>
<include>jdchain-gateway-${project.version}.zip</include>
</includes>
</resource>

<!-- sdk -->
<resource>
<directory>${project.basedir}/../docker-sdk/target/</directory>
<filtering>false</filtering>
<includes>
<include>docker-sdk-${project.version}.jar</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>

<!-- 使用Maven插件直接将应用打包为一个Docker镜像 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>

<!--将插件绑定在某个phase执行-->
<executions>
<execution>
<id>build-image</id>
<!--将插件绑定在package这个phase上。也就是说,用户只需执行mvn package ,就会自动执行mvn docker:build-->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>

<configuration>

<imageName>jdchain-demo</imageName>
<imageTags>
<imageTag>${project.version}</imageTag>
</imageTags>
<!-- 指定 Dockerfile 路径-->
<dockerDirectory>${project.basedir}/target</dockerDirectory>
</configuration>
</plugin>
</plugins>
</build>

</project>

+ 0
- 37
deploy/docker/docker-demo/src/main/docker/Dockerfile View File

@@ -1,37 +0,0 @@
FROM centos:8.2.2004

# install tools
RUN yum install wget -y \
&& wget -O /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo \
&& yum install java net-tools nc crontabs expect unzip -y \
&& yum install langpacks-zh_CN.noarch -y \
&& yum install dos2unix -y \
&& echo "LANG=zh_CN.utf8" >> /etc/locale.conf \
&& source /etc/locale.conf \
&& yum clean all

WORKDIR /export/jdchain
COPY zip/* /export/jdchain/

# env
ENV RELEASE_DIR=/export/jdchain
ENV RELEASE_VERSION=1.3.0
#ENV DATA_DIR=/shared
ENV NAME=conf
ENV SERVER_NAME_PEER=deploy-peer
ENV SERVER_NAME_GW=deploy-gateway

COPY script/* /export/jdchain/
RUN dos2unix /export/jdchain/*.sh
RUN chmod +x /export/jdchain/*.sh

# ports
EXPOSE 8080
#EXPOSE 16000
#EXPOSE 16010
#EXPOSE 16020
#EXPOSE 16030

#ENTRYPOINT ["/bin/sh","-c","/export/jdchain/start.sh"]
ENTRYPOINT sh /export/jdchain/start.sh


+ 0
- 4
deploy/docker/docker-demo/src/main/docker/script/shutdown.sh View File

@@ -1,4 +0,0 @@
#!/bin/bash

ps -ef|grep 'jdchain'|grep -v grep|cut -c 9-15|xargs kill -9


+ 0
- 34
deploy/docker/docker-demo/src/main/docker/script/start.sh View File

@@ -1,34 +0,0 @@
#!/bin/bash

cd $RELEASE_DIR

# check the files;
peer_file="./jdchain-peer-$RELEASE_VERSION.RELEASE.zip"
gw_file="./jdchain-gateway-$RELEASE_VERSION.RELEASE.zip"
sdk_file="./docker-sdk-$RELEASE_VERSION.RELEASE.jar"
if [[ ! -f $peer_file ]] || [[ ! -f $gw_file ]] || [[ ! -f $sdk_file ]] ; then
echo "not find $peer_file or $gw_file or $sdk_file in the $RELEASE_DIR, please check the image of jdchain-demo:$RELEASE_VERSION."
exit 1
fi

unzip -o conf.zip

for i in `seq 0 3`
do
unzip -n -d ./peer$i jdchain-peer-$RELEASE_VERSION.RELEASE.zip
chmod +x ./peer$i/bin/*
done

unzip -n -d ./gw jdchain-gateway-$RELEASE_VERSION.RELEASE.zip
chmod +x ./gw/bin/*

sh ./peer0/bin/peer-startup.sh
sh ./peer1/bin/peer-startup.sh
sh ./peer2/bin/peer-startup.sh
sh ./peer3/bin/peer-startup.sh
sleep 30
sh ./gw/bin/startup.sh
sleep 10
java -jar docker-sdk-1.3.0.RELEASE.jar > sdk.log

tail -f /dev/null

BIN
deploy/docker/docker-demo/src/main/docker/zip/conf.zip View File


+ 0
- 36
deploy/docker/docker-demo/src/main/resources/docker-compose-all.yaml View File

@@ -1,36 +0,0 @@
version: '2'

services:
demo:
image: "jdchain-demo:1.3.0"
container_name: jdchain-demo
networks:
jdchain_default:
aliases:
- demo
hostname: demo
restart: always
ports:
- "11010:11010"
- "7080:7080"
- "10080:10080"
- "10081:10081"
- "11011:11011"
- "7081:7081"
- "10082:10082"
- "10083:10083"
- "11012:11012"
- "7082:7082"
- "10084:10084"
- "10085:10085"
- "11013:11013"
- "7083:7083"
- "10086:10086"
- "10087:10087"
- "8080:8080"
# volumes:
# - "./logs:/export/jdchain/peer0/logs"

networks:
jdchain_default:
driver: bridge

+ 0
- 5
deploy/docker/docker-demo/src/main/resources/start-net.sh View File

@@ -1,5 +0,0 @@
#!/bin/bash
echo "停止network"
docker-compose -f docker-compose-all.yaml down
echo "启动jdchain"
docker-compose -f docker-compose-all.yaml up -d

+ 0
- 9
deploy/docker/docker-demo/src/main/resources/zip.sh View File

@@ -1,9 +0,0 @@
#/bin/bash

# all in one;
allIn1_file="./jdchain-demo_1.3.0.tar.gz"
if [ -f $allIn1_file ] ; then
rm -rf $allIn1_file
fi
docker save jdchain-demo:1.3.0 -o jdchain-demo_1.3.0.tar
gzip jdchain-demo_1.3.0.tar

+ 0
- 66
deploy/docker/docker-sdk/pom.xml View File

@@ -1,66 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.jd.blockchain</groupId>
<artifactId>docker</artifactId>
<version>1.5.0.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>docker-sdk</artifactId>

<dependencies>
<dependency>
<groupId>com.jd.blockchain</groupId>
<artifactId>crypto-classic</artifactId>
<version>${framework.version}</version>
</dependency>
<dependency>
<groupId>com.jd.blockchain</groupId>
<artifactId>crypto-sm</artifactId>
<version>${framework.version}</version>
</dependency>
<dependency>
<groupId>com.jd.blockchain</groupId>
<artifactId>ledger-model</artifactId>
<version>${framework.version}</version>
</dependency>
<dependency>
<groupId>com.jd.blockchain</groupId>
<artifactId>sdk-client</artifactId>
<version>${framework.version}</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<!-- 程序入口 -->
<mainClass>com.jd.blockchain.SDKDemo</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

</project>

+ 0
- 107
deploy/docker/docker-sdk/src/main/java/com/jd/blockchain/ContractParams.java View File

@@ -1,107 +0,0 @@
package com.jd.blockchain;

import com.jd.blockchain.ledger.BlockchainIdentity;
import com.jd.blockchain.ledger.BlockchainKeypair;

public class ContractParams {
String contractZipName;
BlockchainKeypair signAdminKey;
BlockchainIdentity contractIdentity;
boolean isDeploy;
boolean isExecute;
boolean hasVersion; //contract's version;
long version;
BlockchainIdentity dataAccount;
String key;
String value;

public String getContractZipName() {
return contractZipName;
}

public ContractParams setContractZipName(String contractZipName) {
this.contractZipName = contractZipName;
return this;
}

public BlockchainKeypair getSignAdminKey() {
return signAdminKey;
}

public ContractParams setSignAdminKey(BlockchainKeypair signAdminKey) {
this.signAdminKey = signAdminKey;
return this;
}

public BlockchainIdentity getContractIdentity() {
return contractIdentity;
}

public ContractParams setContractIdentity(BlockchainIdentity contractIdentity) {
this.contractIdentity = contractIdentity;
return this;
}

public boolean isDeploy() {
return isDeploy;
}

public ContractParams setDeploy(boolean deploy) {
isDeploy = deploy;
return this;
}

public boolean isExecute() {
return isExecute;
}

public ContractParams setExecute(boolean execute) {
isExecute = execute;
return this;
}

public boolean isHasVersion() {
return hasVersion;
}

public ContractParams setHasVersion(boolean hasVersion) {
this.hasVersion = hasVersion;
return this;
}

public long getVersion() {
return version;
}

public ContractParams setVersion(long version) {
this.version = version;
return this;
}

public BlockchainIdentity getDataAccount() {
return dataAccount;
}

public ContractParams setDataAccount(BlockchainIdentity dataAccount) {
this.dataAccount = dataAccount;
return this;
}

public String getKey() {
return key;
}

public ContractParams setKey(String key) {
this.key = key;
return this;
}

public String getValue() {
return value;
}

public ContractParams setValue(String value) {
this.value = value;
return this;
}
}

+ 0
- 68
deploy/docker/docker-sdk/src/main/java/com/jd/blockchain/SDKDemo.java View File

@@ -1,68 +0,0 @@
package com.jd.blockchain;

import com.jd.blockchain.ledger.*;
import org.apache.commons.codec.binary.Base64;

import java.util.Random;
import java.util.UUID;

public class SDKDemo extends SDK_Base_Demo{
public static void main(String[] args) {
SDKDemo sdkDemo = new SDKDemo();
//注册用户;
sdkDemo.registerUsers();
//构建数据账户;
sdkDemo.genDataAccount();
//发布和执行合约;
sdkDemo.deployContract();
}

//注册用户;
public void registerUsers(){
this.registerUser();
}

//构建数据账户;
public void genDataAccount(){
byte[] arr = new byte[1024];
new Random().nextBytes(arr);
String value = Base64.encodeBase64String(arr);
this.insertData(null,null,"key1",value,-1);
}

public BlockchainKeypair insertData(BlockchainKeypair dataAccount, BlockchainKeypair signAdminKey,
String key, String value, long version) {
// 在本地定义注册账号的 TX;
TransactionTemplate txTemp = blockchainService.newTransaction(ledgerHash);
//采用KeyGenerator来生成BlockchainKeypair;
if(dataAccount == null){
dataAccount = BlockchainKeyGenerator.getInstance().generate();
txTemp.dataAccounts().register(dataAccount.getIdentity());
}

System.out.println("current dataAccount=" + dataAccount.getAddress());
txTemp.dataAccount(dataAccount.getAddress()).setText(key, value, version);
txTemp.dataAccount(dataAccount.getAddress()).setTimestamp(UUID.randomUUID().toString(),System.currentTimeMillis(),-1);

// TX 准备就绪
commit(txTemp,signAdminKey);

//get the version
TypedKVEntry[] kvData = blockchainService.getDataEntries(ledgerHash,
dataAccount.getAddress().toBase58(), key);
System.out.println(String.format("key1 info:key=%s,value=%s,version=%d",
kvData[0].getKey(),kvData[0].getValue().toString(),kvData[0].getVersion()));

return dataAccount;
}

public void deployContract(){
ContractParams contractParams = new ContractParams();
contractParams.setContractZipName("contract-compile-1.3.0.RELEASE.car").setDeploy(true).setExecute(false);
BlockchainIdentity contractAddress =
this.contractHandle(contractParams);
contractParams.setContractIdentity(contractAddress);
this.contractHandle(contractParams);
this.contractHandle(contractParams.setExecute(true));
}
}

+ 0
- 46
deploy/docker/docker-sdk/src/main/java/com/jd/blockchain/SDKDemo_Constant.java View File

@@ -1,46 +0,0 @@
package com.jd.blockchain;

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 org.apache.commons.io.FileUtils;
import org.springframework.core.io.ClassPathResource;

import java.io.File;
import java.io.InputStream;

public class SDKDemo_Constant {

public static String GW_IPADDR = "localhost";
public static int GW_PORT = 8080;
public static String GW_PUB_KEY = "7VeRL1kWpYpvawkgFbM9N9ao1YiAE9HW65QpwLvpw6oPjCnZ";
public static String GW_PRIV_KEY = "177gk2PbxhHeEdfAAqGfShJQyeV4XvGsJ9CvJFUbToBqwW1YJd5obicySE1St6SvPPaRrUP";
public static String GW_PASSWORD = "8EjkXVSTxMFjCvNNsTo8RBMDEVQmk7gYkW4SCDuvdsBG";

public static PrivKey gwPrivkey0 = KeyGenUtils.decodePrivKey(GW_PRIV_KEY, GW_PASSWORD);
public static PubKey gwPubKey0 = KeyGenUtils.decodePubKey(GW_PUB_KEY);
public static BlockchainKeypair adminKey = new BlockchainKeypair(gwPubKey0, gwPrivkey0);

public static final byte[] readChainCodes(String contractZip) {
// 构建合约的字节数组;
try {
ClassPathResource contractPath = new ClassPathResource(contractZip);
// File contractFile = new File(contractPath.getURI());

InputStream in = contractPath.getInputStream();
// 将文件写入至config目录下
File directory = new File(".");
String configPath = directory.getAbsolutePath() + File.separator + "contract.jar";
File targetFile = new File(configPath);
// 先将原来文件删除再Copy
if (targetFile.exists()) {
FileUtils.forceDelete(targetFile);
}
FileUtils.copyInputStreamToFile(in, targetFile);
return FileUtils.readFileToByteArray(targetFile);
} catch (Exception e) {
throw new IllegalStateException(e);
}
}
}

+ 0
- 192
deploy/docker/docker-sdk/src/main/java/com/jd/blockchain/SDK_Base_Demo.java View File

@@ -1,192 +0,0 @@
package com.jd.blockchain;

import static com.jd.blockchain.SDKDemo_Constant.readChainCodes;
import static com.jd.blockchain.transaction.ContractReturnValue.decode;

import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.ledger.BlockchainIdentity;
import com.jd.blockchain.ledger.BlockchainKeyGenerator;
import com.jd.blockchain.ledger.BlockchainKeypair;
import com.jd.blockchain.ledger.PreparedTransaction;
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.transaction.GenericValueHolder;
import com.jd.chain.contract.TransferContract;

import utils.Bytes;

public abstract class SDK_Base_Demo {
protected BlockchainKeypair adminKey;

protected HashDigest ledgerHash;

protected BlockchainService blockchainService;

public SDK_Base_Demo() {
init();
}

public void init() {
// 生成连接网关的账号
adminKey = SDKDemo_Constant.adminKey;

// 连接网关
GatewayServiceFactory serviceFactory = GatewayServiceFactory.connect(SDKDemo_Constant.GW_IPADDR,
SDKDemo_Constant.GW_PORT, false, adminKey);

// 获取网关对应的Service处理类
blockchainService = serviceFactory.getBlockchainService();

HashDigest[] ledgerHashs = blockchainService.getLedgerHashs();
// 获取当前账本Hash
ledgerHash = ledgerHashs[0];
}

public TransactionResponse commit(TransactionTemplate txTpl){
return this.commitA(txTpl,null);
}

/**
* 默认使用A方式commit;
* @param txTpl
* @param signAdminKey
* @return
*/
public TransactionResponse commit(TransactionTemplate txTpl, BlockchainKeypair signAdminKey){
return commitA(txTpl, signAdminKey);
}

/**
* 采用A方式提交;
* @param txTpl
* @param signAdminKey
* @return
*/
public TransactionResponse commitA(TransactionTemplate txTpl, BlockchainKeypair signAdminKey) {
PreparedTransaction ptx = txTpl.prepare();

if(signAdminKey != null){
System.out.println("signAdminKey's pubKey = "+signAdminKey.getIdentity().getPubKey());
ptx.sign(signAdminKey);
}else {
System.out.println("adminKey's pubKey = "+adminKey.getIdentity().getPubKey());
ptx.sign(adminKey);
}
TransactionResponse transactionResponse = ptx.commit();

if (transactionResponse.isSuccess()) {
System.out.println(String.format("height=%d, ###OK#, contentHash=%s, executionState=%s",
transactionResponse.getBlockHeight(),
transactionResponse.getContentHash(), transactionResponse.getExecutionState().toString()));
} else {
System.out.println(String.format("height=%d, ###exception#, contentHash=%s, executionState=%s",
transactionResponse.getBlockHeight(),
transactionResponse.getContentHash(), transactionResponse.getExecutionState().toString()));
}
return transactionResponse;
}

/**
* 生成一个区块链用户,并注册到区块链;
*/
public BlockchainKeypair registerUser() {
return this.registerUser(null,null,null);
}

public BlockchainKeypair registerUser(String cryptoType, BlockchainKeypair signAdminKey, BlockchainKeypair userKeypair) {
// 在本地定义注册账号的 TX;
TransactionTemplate txTemp = blockchainService.newTransaction(ledgerHash);
if(userKeypair == null){
if("SM2".equals(cryptoType)){
userKeypair = BlockchainKeyGenerator.getInstance().generate(cryptoType);
}else {
userKeypair = BlockchainKeyGenerator.getInstance().generate();
}
}
System.out.println("user'address="+userKeypair.getAddress());
txTemp.users().register(userKeypair.getIdentity());
// TX 准备就绪;
commit(txTemp,signAdminKey);
return userKeypair;
}

public BlockchainKeypair registerUser(BlockchainKeypair signAdminKey, BlockchainKeypair userKeypair) {
return registerUser(null,signAdminKey,userKeypair);
}

/**
* 生成一个区块链用户,并注册到区块链;
*/
public BlockchainKeypair registerUserByNewSigner(BlockchainKeypair signer) {
return this.registerUser(signer,null);
}

public BlockchainIdentity createDataAccount() {
// 首先注册一个数据账户
BlockchainKeypair newDataAccount = BlockchainKeyGenerator.getInstance().generate();

TransactionTemplate txTpl = blockchainService.newTransaction(ledgerHash);
txTpl.dataAccounts().register(newDataAccount.getIdentity());
commit(txTpl);
return newDataAccount.getIdentity();
}

public String create1(Bytes contractAddress, String address, String account, String content) {
System.out.println(String.format("params,String address=%s, String account=%s, String content=%s, Bytes contractAddress=%s",
address,account,content,contractAddress.toBase58()));
TransactionTemplate txTpl = blockchainService.newTransaction(ledgerHash);
// 使用合约创建
TransferContract guanghu = txTpl.contract(contractAddress, TransferContract.class);
GenericValueHolder<String> result = decode(guanghu.putval(address, account, content, System.currentTimeMillis()));
commit(txTpl);
return result.get();
}

public BlockchainIdentity contractHandle(ContractParams contractParams) {
if(contractParams.getContractZipName() == null){
contractParams.setContractZipName("contract-JDChain-Contract.jar");
}
// 发布jar包
// 定义交易模板
TransactionTemplate txTpl = blockchainService.newTransaction(ledgerHash);
Bytes contractAddress = null;
if(contractParams.getContractIdentity() != null){
contractAddress = contractParams.getContractIdentity().getAddress();
}

if(contractParams.isDeploy){
// 将jar包转换为二进制数据
byte[] contractCode = readChainCodes(contractParams.getContractZipName());

// 生成一个合约账号
if(contractParams.getContractIdentity() == null){
contractParams.setContractIdentity(BlockchainKeyGenerator.getInstance().generate().getIdentity());
}
contractAddress = contractParams.getContractIdentity().getAddress();
System.out.println("contract's address=" + contractAddress);

// 生成发布合约操作
txTpl.contracts().deploy(contractParams.contractIdentity, contractCode);

// 生成预发布交易;
commit(txTpl,contractParams.getSignAdminKey());
}

if(contractParams.isExecute){
// 注册一个数据账户
if(contractParams.dataAccount == null){
contractParams.dataAccount = createDataAccount();
contractParams.key = "jd_zhangsan";
contractParams.value = "{\"dest\":\"KA006\",\"id\":\"cc-fin08-01\",\"items\":\"FIN001|3030\",\"source\":\"FIN001\"}";
}
// 获取数据账户地址x
String dataAddress = contractParams.dataAccount.getAddress().toBase58();
// 打印数据账户地址
System.out.printf("DataAccountAddress = %s \r\n", dataAddress);
System.out.println("return value = "+create1(contractAddress, dataAddress, contractParams.key, contractParams.value));
}
return contractParams.contractIdentity;
}
}

+ 0
- 32
deploy/docker/docker-sdk/src/main/java/com/jd/chain/contract/TransferContract.java View File

@@ -1,32 +0,0 @@
package com.jd.chain.contract;

import com.jd.blockchain.contract.Contract;
import com.jd.blockchain.contract.ContractEvent;

@Contract
public interface TransferContract {

@ContractEvent(name = "create")
String create(String address, String account, long money);

@ContractEvent(name = "transfer")
String transfer(String address, String from, String to, long money);

@ContractEvent(name = "read")
long read(String address, String account);

@ContractEvent(name = "readAll")
String readAll(String address, String account);

@ContractEvent(name = "putval1")
String putval(String address, String account, String content, Long time);

@ContractEvent(name = "putvalBif")
String putvalBifurcation(String address, String account, String content, String isHalf);

@ContractEvent(name = "getTxSigners")
String getTxSigners(String input);

@ContractEvent(name = "test")
String test(String input);
}

BIN
deploy/docker/docker-sdk/src/main/resources/contract-compile-1.3.0.RELEASE.car View File


+ 0
- 24
deploy/docker/pom.xml View File

@@ -1,24 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.jd.blockchain</groupId>
<artifactId>deploy-root</artifactId>
<version>1.5.0.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>

<artifactId>docker</artifactId>
<properties>
<framework.version>1.4.3.RELEASE</framework.version>
</properties>

<modules>
<module>docker-sdk</module>
<module>docker-demo</module>
</modules>

</project>

+ 0
- 44
deploy/docker/readme.md View File

@@ -1,44 +0,0 @@
# jdchain-demo镜像使用说明
本镜像主要为快速构建JDChain测试环境使用,内嵌固定的公私钥,不可用于生产正式环境。
JDChain在docker中的安装路径:/export/jdchain,网关对外端口为:8080。可通过docker-compose-all文件来修改端口。
demo环境构建完成后执行sdk加载部分测试数据,区块高度:7,交易总数:8,用户总数:5,数据账户总数:2,合约总数:1。

## 如何生成镜像
1. 如果构建的docker镜像为当前开发版本,将docker模块中的<version>和<docker-tag>跟主版本对齐,然后在deploy模块执行:mvn clean package即可。
如果镜像版本与所在开发版本不一致(举例说明:构建1.3.0的镜像版本,但当前开发版本是1.4.0),需要预先在deploy-peer和deploy-gateway的
target文件夹下放置相应版本zip安装包(jdchain-peer-xxx.zip,jdchain-gateway-xxx.zip),然后在docker模块执行:mvn clean package。
2. 在maven构建过程中,两个zip安装包和docker-sdk-xxx.jar,会放至docker-demo模块src/main/docker/zip文件夹下。
3. maven构建完成后,控制台执行:docker images,可看到构建的jdchain-peer镜像。
4. 生成镜像文件。执行docker-demo模块中src/main/resources/zip.sh,可生成镜像的tar.gz压缩包;

## 镜像快速使用
1.在已经安装docker工具的环境中,装入jdchain-demo镜像:
````
docker load -i jdchain-demo_1.3.0.tar.gz
````
2.启动脚本
每次执行启动脚本时,会删除原有的容器,然后重新构建全新的容器。
所以每次执行之后,会清除原先链上新增的区块。
````
sh start-net.sh
````
3.卸载容器
如果不再使用容器,在start-net.sh脚本所在路径下执行:
````
docker-compose -f docker-compose-all.yaml down
````

## SDK连接网关参数
````
ip=localhost
port=8080
#默认公钥的内容(Base58编码数据);
keys.default.pubkey=7VeRL1kWpYpvawkgFbM9N9ao1YiAE9HW65QpwLvpw6oPjCnZ
#默认私钥的内容(加密的Base58编码数据);在 pk-path 和 pk 之间必须设置其一;
keys.default.privkey=177gk2PbxhHeEdfAAqGfShJQyeV4XvGsJ9CvJFUbToBqwW1YJd5obicySE1St6SvPPaRrUP
#默认私钥的解码密码;
keys.default.privkey-password=8EjkXVSTxMFjCvNNsTo8RBMDEVQmk7gYkW4SCDuvdsBG
````




+ 3
- 4
deploy/pom.xml View File

@@ -5,22 +5,21 @@
<parent> <parent>
<groupId>com.jd.blockchain</groupId> <groupId>com.jd.blockchain</groupId>
<artifactId>jdchain-parent</artifactId> <artifactId>jdchain-parent</artifactId>
<version>1.1.5.RELEASE</version>
<version>1.1.6-SNAPSHOT</version>
<relativePath>../project/parent</relativePath> <relativePath>../project/parent</relativePath>
</parent> </parent>
<artifactId>deploy-root</artifactId> <artifactId>deploy-root</artifactId>
<version>1.5.0.RELEASE</version>
<version>1.6.0-SNAPSHOT</version>
<packaging>pom</packaging> <packaging>pom</packaging>


<properties> <properties>
<core.version>1.5.0.RELEASE</core.version>
<core.version>1.6.0-SNAPSHOT</core.version>
</properties> </properties>


<modules> <modules>
<module>../core</module> <module>../core</module>
<module>deploy-gateway</module> <module>deploy-gateway</module>
<module>deploy-peer</module> <module>deploy-peer</module>
<module>docker</module>
</modules> </modules>


</project> </project>

+ 150
- 0
docs/ca.md View File

@@ -0,0 +1,150 @@
## 证书

`JD Chain`身份认证支持两种模式:`KEYPAIR`(默认)/`CA`,即公私钥对和证书。

证书模式采用`X.509`标准的数字证书作为用户标识,证书字段中,附加组织和角色等信息。

`JD Chain`使用`jdchain-cli`/`openssl`生成的自签名证书,也支持使用`CFCA`等国家认可的第三方`CA`颁发的外部证书。

`JD Chain` `CA`支持`RSA 2048`/`ECDSA P-256`/`SM2 SM3WithSM2`/`ED25519`四种签名算法。


### 类别

`JD Chain`证书体系分`ROOT`,`CA`,`PEER`,`GW`,`USER`几个类别。

使用证书`Subject`中`OU`字段区分。

#### ROOT

根证书,可用于签发证书及账本初始化时作为账本证书。

#### CA

中间证书,可用于签发证书及账本初始化时作为账本证书。

#### PEER

共识节点证书,注册参与方时需要提供`PEER`类型证书。

#### GW

网关证书,网关所配置公私钥对应账户信息在链上必须存储有`GW`类型的证书。

#### USER

普通用户证书

### 实现

`JD Chain`证书使用链上存储方式。主要存储于两个地方:
- 元数据区,存储账本初始化时配置的根证书列表
- 用户账户头部,存储用户注册时提供的证书

> 根证书支持列表,即支持多个参与机构使用不同的证书链,且根证书可使用`ROOT`证书,也可使用`CA`(中间)证书,但节点/网关/用户证书必须由配置在`JD Chain`根证书列表中的证书直接签出。

#### 账本初始化

*`ledger.init`*
较`KEYPAIR`模式有如下修改:

1. `identity-mode`
```properties
identity-mode=CA
```
`identity-mode`身份认证模式,`KEYPAIR`(默认)/`CA`

2. `root-ca-path`
```properties
root-ca-path=/**/ledger1.crt,/**/ledger2.crt
```
`root-ca-path`根证书列表,使用`ROOT`或者`CA`类型证书,多个根证书使用半角逗号分割。初始化完成后,证书信息会上链存储,通过[2.7 获取账本初始化配置信息](api.md#27-获取账本初始化配置信息)可查。

3. `cons_parti.*.ca-path`

**CA 模式参与方需要增加配置网关信息,网关节点IP和端口不需要填写**

节点公钥配置改为证书地址:

```properties
// KEYPAIR
// cons_parti.0.pubkey-path=
// cons_parti.0.pubkey=

// CA
cons_parti.0.ca-path=/**/peer0.crt
```

*`local.conf`*
较`KEYPAIR`模式有如下修改:
```properties
#当前参与方的公钥,用于非证书模式
# local.parti.pubkey=
#当前参与方的证书信息,用于证书模式
local.parti.ca-path=

#当前参与方的私钥文件,PEM格式,用于证书模式
local.parti.privkey-path=
```

#### 节点运行

节点启动和运行时会校验证书类型,时间有效性以及是否由某个根证书签出等,一旦校验失败会阻止网关接入,不再对外服务。

#### 网关接入

*gateway.conf*
```properties
#默认公钥的内容(Base58编码数据),非CA模式下必填;
keys.default.pubkey=
#默认网关证书路径(X509,PEM),CA模式下必填;
keys.default.ca-path=/home/imuge/jd/nodes/peer0/config/keys/gw1.crt
#默认私钥的路径;在 pk-path 和 pk 之间必须设置其一;
keys.default.privkey-path=/home/imuge/jd/nodes/peer0/config/keys/gw1.key
#默认私钥的内容(加密的Base58编码数据);在 pk-path 和 pk 之间必须设置其一;
keys.default.privkey=
```

网关接入网络需要配置`GW`类型证书及对应的私钥信息,证书类型必须是`GW`。

网关接入时会做如下认证:
- 证书类型包含`GW`
- 根证书列表存在类型正确且有效证书
- 网关证书由根证书列表中某个证书签出(此证书类型正确且有效)

#### 交易认证

交易时使用证书持有者私钥签名,交易内容不包含签名用户证书信息。
交易执行前会校验所有账本根证书,签名终端用户和节点用户的证书类型及有效性。

> 请务必在证书到期前更新证书有效期

#### 证书更新

1. 根证书

`SDK`方式:
```java
TransactionTemplate txTemp = blockchainService.newTransaction(ledger);
txTemp.metaInfo().ca(X509Utils.resolveCertificate("*.crt"));
```

命令行方式:[更新账本证书](tx.md#更新账本证书)

2. 节点/网关/普通用户证书

> 在`JD Chain`中,共识节点,网关配置的接入账户和普通用户本质都是用户账户类型,它们对应的证书管理方式一致。

`SDK`方式:

```java
txTemp.user("user address").ca(X509Utils.resolveCertificate("*.crt"));
```

命令行方式:[更新用户证书](tx.md#更新用户证书)

### 证书生成

使用`jdchain-cli`提供的[keys](cli/keys.md)和[ca](cli/ca.md)指令工具创建公私钥对以及签发证书。

其中[ca-test](cli/ca.md#生成测试证书)可一键生成账本初始化所需的所有证书外加可用的普通用户证书。

+ 248
- 0
docs/cli/ca.md View File

@@ -0,0 +1,248 @@
### 证书管理

`jdchain-cli`提供**`ED25519`,`RSA`,`ECDSA`,`SM2`**密钥算法的证书签发工具:[证书列表](#证书列表),[显示证书](#显示证书),[CSR](#CSR),[CRT](#CRT),[更新证书](#更新证书),[生成测试证书](#生成测试证书)

> 目前支持创建`ED25519`,RSA`,`ECDSA`,`SM2`四种签名算法,请使用对应算法的公私钥

```bash
:bin$ ./jdchain-cli.sh ca -h
Usage: jdchain-cli ca [-hV] [--pretty] [--home=<path>] [COMMAND]
List, create, update certificates.
-h, --help Show this help message and exit.
--home=<path> Set the home directory.
Default: ../
--pretty Pretty json print
-V, --version Print version information and exit.
Commands:
list List all the certificates.
show Show certificate.
csr Create certificate signing request.
crt Create new certificate.
renew Update validity period.
test Create certificates for a testnet.
help Displays help information about the specified command
```
- `home`,指定密钥和证书存储相关目录,`${home}/config/keys`

#### 证书列表
```bash
:bin$ ./jdchain-cli.sh ca list -h
List all the certificates.
Usage: jdchain-cli ca list [-hV] [--pretty] [--home=<path>]
-h, --help Show this help message and exit.
--home=<path> Set the home directory.
--pretty Pretty json print
-V, --version Print version information and exit.
```

如:
```bash
:bin$ ./jdchain-cli.sh keys list
NAME ALGORITHM ADDRESS PUBKEY
```
- `NAME`,名称
- `ALGORITHM`,算法
- `ADDRESS`,地址
- `PUBKEY`,公钥

#### 显示证书
```bash
:bin$ ./jdchain-cli.sh ca show -h
Show certificate.
Usage: jdchain-cli ca show [-hV] [--pretty] [--home=<path>] -n=<name>
-h, --help Show this help message and exit.
--home=<path> Set the home directory.
-n, --name=<name> Name of the certificate
--pretty Pretty json print
-V, --version Print version information and exit.
```
- `name`,证书名称

如显示`${home}/config/keys`下名为`G1`的证书信息:
```bash
:bin$ ./jdchain-cli.sh ca show -n G1
./jdchain-cli.sh ca show -n G1
NAME ALGORITHM TYPE ROLE PUBKEY
G1 SM2 ROLE-TODO [GW] SFZ6LjGKVz6wdU4G9PAraojyzCYPJ1BXAg1XBwSPCMC6Ug6u5oom5zcLPUzWtz42aCp9PLGXpHweBjSu3EW2aDzsa4JoT
[0] Version: 3
SerialNumber: 440724497
IssuerDN: O=JDT,OU=ROOT,C=CN,ST=BJ,L=BJ,CN=ROOT,E=imuge@jd.com
Start Date: Fri Sep 03 16:43:01 GMT+08:00 2021
Final Date: Thu May 30 16:43:01 GMT+08:00 2024
SubjectDN: O=JDT,OU=GW,C=CN,ST=BJ,L=BJ,CN=G1,E=imuge@jd.com
Public Key: EC Public Key [c0:b9:58:d1:35:3d:a9:bc:1d:85:2a:ea:bf:57:80:39:e9:f6:57:6d]
X: 67e4a4afe0a5beb1e5fb6e915314a9ed94b74f449cc4f50314ff78ecf62ba786
Y: 2d5c233bfcd582f0c1098dbe4f1319db074fcf00023fdc9f3461a8d01488d9f2

Signature Algorithm: SM3WITHSM2
Signature: 3046022100b70107554a723ec96569bbb23c65cb
ac6d7934f47722aa50f18a5e9ca3a978b9022100
9b68e5f3bd14bf103248c8516c493e5e1d9a872c
39841c3704686ca85311bac0
```

#### CSR

生成证书请求文件
```bash
:bin$ ./jdchain-cli.sh ca csr -h
Create certificate signing request.
Usage: jdchain-cli ca csr [-hV] [--pretty] [--home=<path>] [-n=<name>]
[--priv=<privPath>] [--pub=<pubPath>]
-h, --help Show this help message and exit.
--home=<path> Set the home directory.
-n, --name=<name> Name of the key
--pretty Pretty json print
--priv=<privPath> Path of the private key file
--pub=<pubPath> Path of the public key file
-V, --version Print version information and exit.
```

- `name`,密钥对名称,创建公私钥请参照[keys](keys.md)文档说明

如使用`${home}/config/keys`下名为`ROOT`的公私钥信息创建`CSR`:
```bash
:bin$ ./jdchain-cli.sh ca csr -n ROOT
// 选择证书角色,输入对应数字即可,多个角色使用半角逗号相隔
input certificate roles (0 for ROOT, 1 for CA, 2 for PEER, 3 for GW, 4 for USER. multi values use ',' split):
> 1
input country:
> CN
input locality:
> BJ
input province:
> BJ
input organization name:
> JDT
input email address:
> imuge@jd.com
// 输入ROOT私钥密码
input password of the key:
> 1
create [${home}/config/keys/ROOT.csr] success
```
成功后会创建`${home}/config/keys/ROOT.csr`文件。

#### CRT

签发证书:
```bash
:bin$ ./jdchain-cli.sh ca crt -h
Create new certificate.
Usage: jdchain-cli ca crt [-hV] [--pretty] [--csr=<csrPath>] --days=<days>
[--home=<path>] [--issuer-crt=<issuerCrtPath>]
[--issuer-name=<issuerName>]
[--issuer-priv=<issuerPrivPath>] [-n=<name>]
--csr=<csrPath> Path of the certificate signing request file
--days=<days> Days of certificate validity
-h, --help Show this help message and exit.
--home=<path> Set the home directory.
--issuer-crt=<issuerCrtPath>
Path of the issuer certificate file
--issuer-name=<issuerName>
Name of the issuer key
--issuer-priv=<issuerPrivPath>
Path of the issuer private key file
-n, --name=<name> Name of the certificate signing request file
--pretty Pretty json print
-V, --version Print version information and exit.
```

- `name`,`CSR`文件名,不为空时要求在`${home}/config/keys`目录下存在`${name.csr}`文件
- `csr`,`CSR`文件路径,与`name`二选一,优先使用`name`参数
- `days`,证书有效天数,当前签发时间开始计算
- `issuer-name`,签发者公私钥对名称,不为空时需要`${home}/config/keys`目录下至少存在`${issuer-name}.priv`,`${issuer-name}.crt`
- `issuer-crt`,签发者证书文件
- `issuer-priv`,签发者私钥文件
> `issuer-name`为空时,`issuer-crt`和`issuer-priv`必须同时提供


如使用`${home}/config/keys`下名为`ROOT`签发自签名证书:
```bash
./jdchain-cli.sh ca crt -n CA --issuer-name ROOT --days 1000
// 输入签发者私钥密码
input password of the issuer:
> 1
create [${home}/config/keys/ROOT.crt] success
```

#### 更新证书

仅可更新证书有效天数
```bash
Update validity period.
Usage: jdchain-cli ca renew [-hV] [--pretty] [--crt=<crtPath>] --days=<days>
[--home=<path>] [--issuer-crt=<issuerCrtPath>]
[--issuer-name=<issuerName>]
[--issuer-priv=<issuerPrivPath>] [-n=<name>]
--crt=<crtPath> File of the certificate
--days=<days> Days of certificate validity
-h, --help Show this help message and exit.
--home=<path> Set the home directory.
--issuer-crt=<issuerCrtPath>
Path of the issuer certificate file
--issuer-name=<issuerName>
Name of the issuer key
--issuer-priv=<issuerPrivPath>
Path of the issuer private key file
-n, --name=<name> Name of the certificate
--pretty Pretty json print
-V, --version Print version information and exit.
```
- `name`,`CRT`文件名,不为空时要求在`${home}/config/keys`目录下存在`${name.crt}`文件
- `crt`,`CRT`文件路径,与`name`二选一,优先使用`name`参数
- `days`,证书有效天数,当前签发时间开始计算
- `issuer-name`,签发者公私钥对名称,不为空时需要`${home}/config/keys`目录下至少存在`${issuer-name}.priv`,`${issuer-name}.crt`
- `issuer-crt`,签发者证书文件
- `issuer-priv`,签发者私钥文件
> `issuer-name`为空时,`issuer-crt`和`issuer-priv`必须同时提供

如更新`${home}/config/keys`下名为`ROOT`证书有效期:
```bash
./jdchain-cli.sh ca crt -n ROOT --issuer-name ROOT --days 2000
input password of the issuer:
> 1
renew [${home}/config/keys/ROOT.crt] success success
```

#### 生成测试证书

一键生成可用于初始化`JD Chain`网络及使用需要的证书
```bash
:bin$ ./jdchain-cli.sh ca test -h
Create certificates for a testnet.
Usage: jdchain-cli ca test [-hV] [--pretty] [-a=<algorithm>]
--country=<country> --email=<email> [--gws=<gws>]
[--home=<path>] --locality=<locality>
[--nodes=<nodes>] --org=<organization>
[-p=<password>] --province=<province>
[--users=<users>]
-a, --algorithm=<algorithm>
Crypto algorithm
--country=<country> Country
--email=<email> Email address
--gws=<gws> Gateway size
-h, --help Show this help message and exit.
--home=<path> Set the home directory.
--locality=<locality> Locality
--nodes=<nodes> Node size
--org=<organization> Organization name
-p, --password=<password> Password of the key
--pretty Pretty json print
--province=<province> Province
--users=<users> Available user size
-V, --version Print version information and exit.
```
- `algorithm`,签名算法,默认`ED25519`,仅支持传入`ED25519`, `RSA`,`ECDSA`,`SM2`之一
- `nodes`,共识节点个数,生成`nodes`个`PEER`类型的证书,可用于节点使用。默认:`4`
- `gws`,网关节点个数,生成`gws`个`GW`类型的证书,可用于网关使用。默认:`1`
- `users`,用户个数,生成`users`可个可用于普通用户使用的证书。默认:`10`

如创建基于`SM2`签名算法的一个`ROOT`类型证书,`4`个节点证书,`1`个网关证书,`10`个用户证书:
```bash
:bin$ ./jdchain-cli.sh ca test --org JDT --country CN --locality BJ --province BJ --email jdchain@jd.com
input private key password:
// 输入操作过程中生成的私钥加密密码
> 1
create test certificates in [${home}/config/keys] success
```

+ 2
- 0
docs/cli/keys.md View File

@@ -77,6 +77,8 @@ Usage: jdchain-cli keys add [-hV] [--pretty] [-a=<algorithm>] [--home=<path>]
--home=<path> Set the home directory. --home=<path> Set the home directory.
-n, --name=<name> Name of the key -n, --name=<name> Name of the key
--pretty Pretty json print --pretty Pretty json print
-p, --password=<password>
Password of the key
-V, --version Print version information and exit. -V, --version Print version information and exit.
``` ```




+ 18
- 18
docs/cli/participant.md View File

@@ -27,35 +27,39 @@ Commands:
```bash ```bash
:bin$ ./jdchain-cli.sh participant register -h :bin$ ./jdchain-cli.sh participant register -h
Register new participant. Register new participant.
Usage: jdchain-cli participant register [-hV] [--pretty] [--gw-host=<gwHost>]
Usage: jdchain-cli participant register [-hV] [--ca-mode] [--pretty]
[--crt=<caPath>] [--gw-host=<gwHost>]
[--gw-port=<gwPort>] [--home=<path>] [--gw-port=<gwPort>] [--home=<path>]
--name=<name>
[-n=<name>]
--participant-name=<participantName>
[--pubkey=<pubkey>]
--ca-mode Register with CA
--crt=<caPath> File of the X509 certificate
--gw-host=<gwHost> Set the gateway host. Default: 127.0.0.1 --gw-host=<gwHost> Set the gateway host. Default: 127.0.0.1
--gw-port=<gwPort> Set the gateway port. Default: 8080 --gw-port=<gwPort> Set the gateway port. Default: 8080
-h, --help Show this help message and exit. -h, --help Show this help message and exit.
--home=<path> Set the home directory. --home=<path> Set the home directory.
--name=<name> Name of the participant
-n, --name=<name> Name of the key
--participant-name=<participantName>
Name of the participant
--pretty Pretty json print --pretty Pretty json print
--pubkey=<pubkey> Pubkey of the user
-V, --version Print version information and exit. -V, --version Print version information and exit.
``` ```
- `name`,新节点名称
- `participant-name`,新节点名称
- `ca-mode`,身份认证模式是否为证书(`CA`)模式,默认`false`
- `name`,当`ca-mode`为`true`时会读取本地`${home}/config/keys/${name}.crt`文件,反之读取`${home}/config/keys/${name}.pub`
- `crt`,证书文件路径
- `pubkey`,`Base58`编码公钥信息,仅在非`ca-mode`情况下使用


注册新节点: 注册新节点:
```bash ```bash
:bin$ ./jdchain-cli.sh participant register --name node4
:bin$ ./jdchain-cli.sh participant register --participant-name node4 --name node4
select ledger, input the index: select ledger, input the index:
INDEX LEDGER INDEX LEDGER
0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg 0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg
// 选择账本 // 选择账本
> 0 > 0
// 选择待注册节点公私钥(链上必须不存在此公私钥对应的用户)
select keypair to register, input the index:
0 k1 LdeNq3862vtUCeptww1T5mVvLbAeppYqVNdqD
1 1627618939 LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw
2 node4 LdeNwG6ECEGz57o2ufhwSbnW4C35TvPqANK7T
2
input password of the key:
> 1
// 选择此交易签名用户(必须是链上存在的用户,且有相应操作权限) // 选择此交易签名用户(必须是链上存在的用户,且有相应操作权限)
select keypair to sign tx, input the index: select keypair to sign tx, input the index:
0 k1 LdeNq3862vtUCeptww1T5mVvLbAeppYqVNdqD 0 k1 LdeNq3862vtUCeptww1T5mVvLbAeppYqVNdqD
@@ -199,20 +203,16 @@ Usage: jdchain-cli participant inactive [-hV] [--pretty] --address=<address>
--ledger=<ledger> Set the ledger. --ledger=<ledger> Set the ledger.
--port=<port> Set the participant service port. --port=<port> Set the participant service port.
--pretty Pretty json print --pretty Pretty json print
--syn-host=<synHost> Set synchronization participant host.
--syn-port=<synPort> Set synchronization participant port.
-V, --version Print version information and exit. -V, --version Print version information and exit.
``` ```
- `ledger`,账本哈希 - `ledger`,账本哈希
- `address`,待移除节点共识端口 - `address`,待移除节点共识端口
- `host`,待移除节点服务地址 - `host`,待移除节点服务地址
- `port`,待移除节点服务端口 - `port`,待移除节点服务端口
- `syn-host`,数据同步节点地址
- `syn-port`,数据同步节点服务端口


如移除`node4`: 如移除`node4`:
```bash ```bash
:bin$ ./jdchain-cli.sh participant inactive --ledger j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg --address LdeNwG6ECEGz57o2ufhwSbnW4C35TvPqANK7T --host 127.0.0.1 --port 7084 --syn-host 127.0.0.1 --syn-port 7080
:bin$ ./jdchain-cli.sh participant inactive --ledger j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg --address LdeNwG6ECEGz57o2ufhwSbnW4C35TvPqANK7T --host 127.0.0.1 --port 7084
participant inactivated participant inactivated
``` ```



+ 228
- 14
docs/cli/tx.md View File

@@ -2,7 +2,8 @@


```bash ```bash
:bin$ ./jdchain-cli.sh tx -h :bin$ ./jdchain-cli.sh tx -h
Usage: git status [<options>...] [--] [<pathspec>...]
Usage: jdchain-cli tx [-hV] [--pretty] [--export=<export>] [--gw-host=<gwHost>]
[--gw-port=<gwPort>] [--home=<path>] [COMMAND]
Build, sign or send transaction. Build, sign or send transaction.
--export=<export> Transaction export directory --export=<export> Transaction export directory
--gw-host=<gwHost> Set the gateway host. Default: 127.0.0.1 --gw-host=<gwHost> Set the gateway host. Default: 127.0.0.1
@@ -15,14 +16,19 @@ Build, sign or send transaction.
--pretty Pretty json print --pretty Pretty json print
-V, --version Print version information and exit. -V, --version Print version information and exit.
Commands: Commands:
ledger-ca-update Update ledger certificates.
user-register Register new user. user-register Register new user.
user-ca-update Update user certificate.
user-state-update Update user(certificate) state.
role Create or config role. role Create or config role.
authorization User role authorization. authorization User role authorization.
data-account-register Register new data account. data-account-register Register new data account.
kv Set key-value. kv Set key-value.
event Publish event. event Publish event.
event-listen Subscribe event.
contract-deploy Deploy or update contract. contract-deploy Deploy or update contract.
contract Call contract method. contract Call contract method.
contract-state-update Update contract state.
event-account-register Register event account. event-account-register Register event account.
sign Sign transaction. sign Sign transaction.
send Send transaction. send Send transaction.
@@ -36,53 +42,102 @@ Commands:
- `home`,指定密钥存储相关目录,`${home}/config/keys` - `home`,指定密钥存储相关目录,`${home}/config/keys`


命令: 命令:
- `ledger-ca-update`,[更新账本证书](#更新账本证书)
- `user-register`,[注册用户](#注册用户) - `user-register`,[注册用户](#注册用户)
- `user-ca-update`,[更新用户证书](#更新用户证书)
- `user-state-update`,[更新用户(证书)状态](#更新用户(证书)状态)
- `role`,[角色管理](#角色管理) - `role`,[角色管理](#角色管理)
- `authorization`,[权限配置](#权限配置) - `authorization`,[权限配置](#权限配置)
- `data-account-register`,[注册数据账户](#注册数据账户) - `data-account-register`,[注册数据账户](#注册数据账户)
- `kv`,[KV设值](#KV设值) - `kv`,[KV设值](#KV设值)
- `event-account-register`,[注册事件账户](#注册事件账户)
- `event-account-register`,[注册事件账户](#注册事件账户)
- `event`,[发布事件](#发布事件) - `event`,[发布事件](#发布事件)
- `event-listen`,[监听事件](#监听事件)
- `contract-deploy`,[部署合约](#部署合约) - `contract-deploy`,[部署合约](#部署合约)
- `contract`,[合约调用](#合约调用) - `contract`,[合约调用](#合约调用)
- `contract-state-update`,[更新合约状态](#更新合约状态)
- `sign`,[离线交易签名](#离线交易签名) - `sign`,[离线交易签名](#离线交易签名)
- `send`,[离线交易发送](#离线交易发送) - `send`,[离线交易发送](#离线交易发送)


#### 更新账本证书

```bash
:bin$ ./jdchain-cli.sh tx ledger-ca-update -h
Update ledger certificates.
Usage: jdchain-cli tx ledger-ca-update [-hV] [--pretty] --crt=<caPath>
[--export=<export>] [--gw-host=<gwHost>]
[--gw-port=<gwPort>] [--home=<path>]
--crt=<caPath> File of the X509 certificate
--operation Operation for this certificate. Optional values: ADD,UPDATE,REMOVE
--export=<export> Transaction export directory
--gw-host=<gwHost> Set the gateway host. Default: 127.0.0.1
--gw-port=<gwPort> Set the gateway port. Default: 8080
-h, --help Show this help message and exit.
--home=<path> Set the home directory.
--pretty Pretty json print
-V, --version Print version information and exit.
```
- `crt`,证书文件路径
- `operation`,操作类型:`ADD`,`UPDATE`,`REMOVE`

如:
```bash
:bin$ $ ./jdchain-cli.sh tx ledger-ca-update --crt /home/imuge/jd/nodes/peer0/config/keys/ledger.crt --operation UPDATE
select ledger, input the index:
INDEX LEDGER
0 j5pFrMigE47t6TobQJXsztnoeA29H31v1vHHF1wqCp4rzi
// 选择账本,当前网关服务只有上面一个可用账本
> 0
select keypair to sign tx:
INDEX KEY ADDRESS
0 peer0 LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W
// 选择链上已存在且有注册用户权限的用户所对应的公私钥对,用于交易签名
> 0
input password of the key:
// 输入签名私钥密码
> 1
ledger ca: [7VeRBQ9jpsgNXje2NYXU5MhyGKVRj462RtkJ8f6FNL1oxYbX](pubkey) updated
```
会更新链上公钥为`7VeRBQ9jpsgNXje2NYXU5MhyGKVRj462RtkJ8f6FNL1oxYbX`的账本证书信息。


#### 注册用户 #### 注册用户


```bash ```bash
:bin$ ./jdchain-cli.sh tx user-register -h :bin$ ./jdchain-cli.sh tx user-register -h
Register new user. Register new user.
Usage: jdchain-cli tx user-register [-hV] [--pretty] [--export=<export>]
Usage: jdchain-cli tx user-register [-hV] [--ca-mode] [--pretty]
[--crt=<caPath>] [--export=<export>]
[--gw-host=<gwHost>] [--gw-port=<gwPort>] [--gw-host=<gwHost>] [--gw-port=<gwPort>]
[--home=<path>]
[--home=<path>] [-n=<name>]
[--pubkey=<pubkey>]
--ca-mode Register with CA
--crt=<caPath> File of the X509 certificate
--export=<export> Transaction export directory --export=<export> Transaction export directory
--gw-host=<gwHost> Set the gateway host. Default: 127.0.0.1 --gw-host=<gwHost> Set the gateway host. Default: 127.0.0.1
--gw-port=<gwPort> Set the gateway port. Default: 8080 --gw-port=<gwPort> Set the gateway port. Default: 8080
-h, --help Show this help message and exit. -h, --help Show this help message and exit.
--home=<path> Set the home directory. --home=<path> Set the home directory.
-n, --name=<name> Name of the key
--pretty Pretty json print --pretty Pretty json print
--pubkey=<pubkey> Pubkey of the user
-V, --version Print version information and exit. -V, --version Print version information and exit.
``` ```
- `ca-mode`,身份认证模式是否为证书(`CA`)模式,默认`false`
- `name`,当`ca-mode`为`true`时会读取本地`${home}/config/keys/${name}.crt`文件,反之读取`${home}/config/keys/${name}.pub`
- `crt`,证书文件路径
- `pubkey`,`Base58`编码公钥信息,仅在非`ca-mode`情况下使用

从`${home}/config/keys`目录下密钥对选择密钥注册到网关服务对应的区块链网络。 从`${home}/config/keys`目录下密钥对选择密钥注册到网关服务对应的区块链网络。


如: 如:
```bash ```bash
:bin$ ./jdchain-cli.sh tx user-register
:bin$ ./jdchain-cli.sh tx user-register -name k1
select ledger, input the index: select ledger, input the index:
INDEX LEDGER INDEX LEDGER
0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg 0 j5sB3sVTFgTqTYzo7KtQjBLSy8YQGPpJpvQZaW9Eqk46dg
// 选择账本,当前网关服务只有上面一个可用账本 // 选择账本,当前网关服务只有上面一个可用账本
> 0 > 0
select keypair to register:
INDEX KEY ADDRESS
0 peer0 LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw
1 k1 LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC
// 选择公私钥对用于注册用户
> 1
input password of the key:
// 输入所选择公私钥对密钥密码
> 1
select keypair to sign tx: select keypair to sign tx:
INDEX KEY ADDRESS INDEX KEY ADDRESS
0 peer0 LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw 0 peer0 LdeNyibeafrAQXgHjBxgQxoLbna6hL4BcXZiw
@@ -96,6 +151,87 @@ register user: [LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC]
``` ```
会在链上注册地址为`LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC`的用户账户信息。 会在链上注册地址为`LdeNwQWabrf6WSjZ35saFo52MfQFhVKvm11aC`的用户账户信息。


#### 更新用户证书

```bash
:bin$ ./jdchain-cli.sh tx ledger-ca-update -h
Update user certificate.
Usage: jdchain-cli tx user-ca-update [-hV] [--pretty] [--crt=<caPath>]
[--export=<export>] [--gw-host=<gwHost>]
[--gw-port=<gwPort>] [--home=<path>]
--crt=<caPath> File of the X509 certificate
--export=<export> Transaction export directory
--gw-host=<gwHost> Set the gateway host. Default: 127.0.0.1
--gw-port=<gwPort> Set the gateway port. Default: 8080
-h, --help Show this help message and exit.
--home=<path> Set the home directory.
--pretty Pretty json print
-V, --version Print version information and exit.
```
- `crt`,证书文件路径

如:
```bash
:bin$ $ ./jdchain-cli.sh tx user-ca-update --crt /home/imuge/jd/nodes/peer0/config/keys/peer0.crt
select ledger, input the index:
INDEX LEDGER
0 j5pFrMigE47t6TobQJXsztnoeA29H31v1vHHF1wqCp4rzi
// 选择账本,当前网关服务只有上面一个可用账本
> 0
select keypair to sign tx:
INDEX KEY ADDRESS
0 peer0 LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W
// 选择链上已存在且有注册用户权限的用户所对应的公私钥对,用于交易签名
> 0
input password of the key:
// 输入签名私钥密码
> 1
user: [LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W] ca updated
```
会更新链上地址为`LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W`的用户证书信息。

#### 更新用户(证书)状态

```bash
:bin$ ./jdchain-cli.sh tx user-state-update -h
Update user(certificate) state.
Usage: jdchain-cli tx user-state-update [-hV] [--pretty] --address=<address>
[--export=<export>]
[--gw-host=<gwHost>]
[--gw-port=<gwPort>] [--home=<path>]
--state=<state>
--address=<address> User address
--export=<export> Transaction export directory
--gw-host=<gwHost> Set the gateway host. Default: 127.0.0.1
--gw-port=<gwPort> Set the gateway port. Default: 8080
-h, --help Show this help message and exit.
--home=<path> Set the home directory.
--pretty Pretty json print
--state=<state> User state,Optional values: FREEZE,NORMAL,REVOKE
-V, --version Print version information and exit.
```
- `address`,用户地址
- `state`,用户状态,可选值:FREEZE,NORMAL,REVOKE

如冻结用户`LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W`:
```bash
:bin$ $ ./jdchain-cli.sh tx user-state-update --address LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W --state FREEZE
select ledger, input the index:
INDEX LEDGER
0 j5pFrMigE47t6TobQJXsztnoeA29H31v1vHHF1wqCp4rzi
// 选择账本,当前网关服务只有上面一个可用账本
> 0
select keypair to sign tx:
INDEX KEY ADDRESS
0 peer0 LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W
// 选择链上已存在且有注册用户权限的用户所对应的公私钥对,用于交易签名
> 0
input password of the key:
// 输入签名私钥密码
> 1
user: [LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W] revoked
```
会冻结链上地址为`LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W`的用户(证书),此用户无法再接入使用此网络。


#### 角色管理 #### 角色管理
```bash ```bash
@@ -366,6 +502,42 @@ input password of the key:
event publish success event publish success
``` ```


#### 监听事件
```bash
:bin$ ./jdchain-cli.sh tx event-listen -h
Subscribe event.
Usage: jdchain-cli tx event-listen [-hV] [--pretty] [--address=<address>]
[--export=<export>] [--gw-host=<gwHost>]
[--gw-port=<gwPort>] [--home=<path>]
--name=<name> [--sequence=<sequence>]
--address=<address> Event address
--export=<export> Transaction export directory
--gw-host=<gwHost> Set the gateway host. Default: 127.0.0.1
--gw-port=<gwPort> Set the gateway port. Default: 8080
-h, --help Show this help message and exit.
--home=<path> Set the home directory.
--name=<name> Event name
--pretty Pretty json print
--sequence=<sequence> Sequence of the event
-V, --version Print version information and exit.
```
- `address`,事件账户地址,不传则表示监听系统事件
- `name`,事件名,系统事件目前仅支持:`new_block_created`
- `sequence`,起始监听序号

如监听系统新区块事件:
```bash
:bin$ ./jdchain-cli.sh tx event-listen --name new_block_created --sequence 0
select ledger, input the index:
INDEX LEDGER
0 j5mXXoNsmh6qadnWLjxFMXobyNGsXT1PmTNzXiHyiYMxoP
> 0
# 会打印新区块事件:区块高度:最新区块高度
New block:0:12
New block:1:12
New block:2:12
```

#### 部署合约 #### 部署合约


```bash ```bash
@@ -450,6 +622,48 @@ return string: LdeNqvSjL4izfpMNsGpQiBpTBse4g6qLxZ6j5
``` ```
调用成功并返回了字符串:`LdeNqvSjL4izfpMNsGpQiBpTBse4g6qLxZ6j5` 调用成功并返回了字符串:`LdeNqvSjL4izfpMNsGpQiBpTBse4g6qLxZ6j5`


#### 更新合约状态

```bash
:bin$ ./jdchain-cli.sh tx contract-state-update -h
Update contract state.
Usage: jdchain-cli tx contract-state-update [-hV] [--pretty]
--address=<address> [--export=<export>] [--gw-host=<gwHost>]
[--gw-port=<gwPort>] [--home=<path>] --state=<state>
--address=<address> Contract address
--export=<export> Transaction export directory
--gw-host=<gwHost> Set the gateway host. Default: 127.0.0.1
--gw-port=<gwPort> Set the gateway port. Default: 8080
-h, --help Show this help message and exit.
--home=<path> Set the home directory.
--pretty Pretty json print
--state=<state> Contract state,Optional values: FREEZE,NORMAL,
REVOKE
-V, --version Print version information and exit.
```
- `address`,合约地址
- `state`,合约状态,可选值:FREEZE,NORMAL,REVOKE

如冻结合约`LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W`:
```bash
:bin$ $ ./jdchain-cli.sh tx contract-state-update --address LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W --state FREEZE
select ledger, input the index:
INDEX LEDGER
0 j5pFrMigE47t6TobQJXsztnoeA29H31v1vHHF1wqCp4rzi
// 选择账本,当前网关服务只有上面一个可用账本
> 0
select keypair to sign tx:
INDEX KEY ADDRESS
0 peer0 LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W
// 选择链上已存在且有注册用户权限的用户所对应的公私钥对,用于交易签名
> 0
input password of the key:
// 输入签名私钥密码
> 1
contract: [LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W] revoked
```
会冻结链上地址为`LdeNpEmyh5DMwbAwamxNaiJgMVGn6aTtQDA5W`的合约,此合约不能再被调用。



#### 离线交易签名 #### 离线交易签名




+ 3
- 1
docs/jdchain_cli.md View File

@@ -14,8 +14,9 @@ transactions to jdchain network, query data from jdchain network.


Commands: Commands:


The most commonly used git commands are:
The most commonly used commands are:
keys List, create, update or delete keypairs. keys List, create, update or delete keypairs.
ca List, create, update certificates.
tx Build, sign or send transaction. tx Build, sign or send transaction.
query Query commands. query Query commands.
participant Add, update or delete participant. participant Add, update or delete participant.
@@ -26,5 +27,6 @@ See 'jdchain-cli help <command>' to read about a specific subcommand or concept.


- `keys` [密钥管理](cli/keys.md) - `keys` [密钥管理](cli/keys.md)
- `tx` [交易](cli/tx.md) - `tx` [交易](cli/tx.md)
- `ca` [证书](cli/ca.md)
- `query` [链上信息查询](cli/query.md) - `query` [链上信息查询](cli/query.md)
- `participant` [共识节点变更](cli/participant.md) - `participant` [共识节点变更](cli/participant.md)

+ 1
- 1
explorer

@@ -1 +1 @@
Subproject commit 5907ebd035217371050e101196cb947b85fa2dd7
Subproject commit ecbc519401ad29863a50c4d6cab1ff8604f4cab4

+ 0
- 0
feature/ledger-database/.gitkeep View File


+ 1
- 1
framework

@@ -1 +1 @@
Subproject commit a5dfbdfac61d2afac37b8b8bebf98be7c8f0e5c4
Subproject commit 2cf367601c10676d9cb7bc7088ff579562760788

+ 1
- 1
libs/bft-smart

@@ -1 +1 @@
Subproject commit 90e9666e469010979f2bfceed396265642ec5678
Subproject commit 972c19f4eab34c59361522abe2ea98ae043d042f

+ 1
- 1
libs/binary-proto

@@ -1 +1 @@
Subproject commit cd0f9eb99a6441874f8ddba7048d00ac6f8abeeb
Subproject commit d9666111bbb33cbbb0a34ff96ffcefba34f46c72

+ 1
- 1
libs/httpservice

@@ -1 +1 @@
Subproject commit c4265ebf3a30a1dbe518a40d5b0584ca760fb35a
Subproject commit a6cb4583fc6271ce62e2b8b1d6273c3bdd03b810

+ 1
- 1
libs/kvdb

@@ -1 +1 @@
Subproject commit c3de2e7da6e33ec502e1ba285ee042e467b06f84
Subproject commit 9a7235f1eb63f7f22bc1f5995778633c9a086c89

+ 1
- 1
libs/utils

@@ -1 +1 @@
Subproject commit dedda124dfeb4488ece714d1e6af24b8d5f0a17a
Subproject commit d2807e16e2c9a1104a712242733e3b04f3044ea8

+ 1
- 1
pom.xml View File

@@ -5,7 +5,7 @@


<groupId>com.jd.blockchain</groupId> <groupId>com.jd.blockchain</groupId>
<artifactId>jdchain-root</artifactId> <artifactId>jdchain-root</artifactId>
<version>1.5.0.RELEASE</version>
<version>1.6.0-SNAPSHOT</version>
<packaging>pom</packaging> <packaging>pom</packaging>
<description>jdchain root project</description> <description>jdchain root project</description>




+ 1
- 1
project

@@ -1 +1 @@
Subproject commit e6a91274cc35748ad903e432aaf34e41b3803702
Subproject commit 731ab7ec8602655d7b050516f05c194eb07f13d1

+ 1
- 1
samples/contract-samples/pom.xml View File

@@ -6,7 +6,7 @@
<parent> <parent>
<groupId>com.jd.blockchain</groupId> <groupId>com.jd.blockchain</groupId>
<artifactId>jdchain-samples</artifactId> <artifactId>jdchain-samples</artifactId>
<version>1.5.0.RELEASE</version>
<version>1.6.0-SNAPSHOT</version>
</parent> </parent>


<!-- 声明为合约代码工程,编译输出扩展名为".car"合约代码 --> <!-- 声明为合约代码工程,编译输出扩展名为".car"合约代码 -->


+ 3
- 3
samples/pom.xml View File

@@ -4,12 +4,12 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>com.jd.blockchain</groupId> <groupId>com.jd.blockchain</groupId>
<artifactId>jdchain-samples</artifactId> <artifactId>jdchain-samples</artifactId>
<version>1.5.0.RELEASE</version>
<version>1.6.0-SNAPSHOT</version>
<packaging>pom</packaging> <packaging>pom</packaging>


<properties> <properties>
<framework.version>1.5.0.RELEASE</framework.version>
<core.version>1.5.0.RELEASE</core.version>
<framework.version>1.6.0-SNAPSHOT</framework.version>
<core.version>1.6.0-SNAPSHOT</core.version>
</properties> </properties>


<modules> <modules>


+ 1
- 1
samples/sdk-samples/pom.xml View File

@@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.jd.blockchain</groupId> <groupId>com.jd.blockchain</groupId>
<artifactId>jdchain-samples</artifactId> <artifactId>jdchain-samples</artifactId>
<version>1.5.0.RELEASE</version>
<version>1.6.0-SNAPSHOT</version>
</parent> </parent>
<artifactId>sdk-samples</artifactId> <artifactId>sdk-samples</artifactId>


+ 1
- 1
test

@@ -1 +1 @@
Subproject commit 068665c9955ff2f577f0e48fd50cf25ed2767e3b
Subproject commit d51c036823918daef9199810817853b84836ac60

Loading…
Cancel
Save