@@ -1 +1 @@ | |||||
Subproject commit c7160adc704c53766427ecdf70f130e43f6cac43 | |||||
Subproject commit c6d05f98420213bf7ab1b4f431f6dcee2654bf5c |
@@ -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> | ||||
@@ -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= |
@@ -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> | ||||
@@ -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 |
@@ -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= | ||||
#账本初始化完成后生成的"账本绑定配置文件"的输出目录 | #账本初始化完成后生成的"账本绑定配置文件"的输出目录 | ||||
@@ -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> |
@@ -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 | |||||
@@ -1,4 +0,0 @@ | |||||
#!/bin/bash | |||||
ps -ef|grep 'jdchain'|grep -v grep|cut -c 9-15|xargs kill -9 | |||||
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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> |
@@ -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; | |||||
} | |||||
} |
@@ -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)); | |||||
} | |||||
} |
@@ -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); | |||||
} | |||||
} | |||||
} |
@@ -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; | |||||
} | |||||
} |
@@ -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); | |||||
} |
@@ -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> |
@@ -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 | |||||
```` | |||||
@@ -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> |
@@ -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#生成测试证书)可一键生成账本初始化所需的所有证书外加可用的普通用户证书。 |
@@ -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 | |||||
``` |
@@ -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. | ||||
``` | ``` | ||||
@@ -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 | ||||
``` | ``` | ||||
@@ -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`的合约,此合约不能再被调用。 | |||||
#### 离线交易签名 | #### 离线交易签名 | ||||
@@ -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 @@ | |||||
Subproject commit 5907ebd035217371050e101196cb947b85fa2dd7 | |||||
Subproject commit ecbc519401ad29863a50c4d6cab1ff8604f4cab4 |
@@ -1 +1 @@ | |||||
Subproject commit a5dfbdfac61d2afac37b8b8bebf98be7c8f0e5c4 | |||||
Subproject commit 2cf367601c10676d9cb7bc7088ff579562760788 |
@@ -1 +1 @@ | |||||
Subproject commit 90e9666e469010979f2bfceed396265642ec5678 | |||||
Subproject commit 972c19f4eab34c59361522abe2ea98ae043d042f |
@@ -1 +1 @@ | |||||
Subproject commit cd0f9eb99a6441874f8ddba7048d00ac6f8abeeb | |||||
Subproject commit d9666111bbb33cbbb0a34ff96ffcefba34f46c72 |
@@ -1 +1 @@ | |||||
Subproject commit c4265ebf3a30a1dbe518a40d5b0584ca760fb35a | |||||
Subproject commit a6cb4583fc6271ce62e2b8b1d6273c3bdd03b810 |
@@ -1 +1 @@ | |||||
Subproject commit c3de2e7da6e33ec502e1ba285ee042e467b06f84 | |||||
Subproject commit 9a7235f1eb63f7f22bc1f5995778633c9a086c89 |
@@ -1 +1 @@ | |||||
Subproject commit dedda124dfeb4488ece714d1e6af24b8d5f0a17a | |||||
Subproject commit d2807e16e2c9a1104a712242733e3b04f3044ea8 |
@@ -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 @@ | |||||
Subproject commit e6a91274cc35748ad903e432aaf34e41b3803702 | |||||
Subproject commit 731ab7ec8602655d7b050516f05c194eb07f13d1 |
@@ -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"合约代码 --> | ||||
@@ -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> | ||||
@@ -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 @@ | |||||
Subproject commit 068665c9955ff2f577f0e48fd50cf25ed2767e3b | |||||
Subproject commit d51c036823918daef9199810817853b84836ac60 |