diff --git a/deploy/docker/docker-demo/pom.xml b/deploy/docker/docker-demo/pom.xml
new file mode 100644
index 00000000..a6b6ef36
--- /dev/null
+++ b/deploy/docker/docker-demo/pom.xml
@@ -0,0 +1,134 @@
+
+
+
+ docker
+ com.jd.blockchain
+ 1.3.0.RELEASE
+
+ 4.0.0
+ docker-demo
+
+
+
+ com.jd.blockchain
+ docker-sdk
+ ${project.version}
+
+
+
+
+ jdchain-demo
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.1
+
+ 1.8
+ 1.8
+ UTF-8
+ false
+ true
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ maven-resources-plugin
+ 3.0.2
+
+
+ copy-resources
+ validate
+
+ copy-resources
+
+
+
+ UTF-8
+ ${project.basedir}/src/main/docker/zip
+ false
+
+
+ ${project.basedir}/../../deploy-peer/target/
+ false
+
+ jdchain-peer-${project.version}.zip
+
+
+
+
+ ${project.basedir}/../../deploy-gateway/target/
+ false
+
+ jdchain-gateway-${project.version}.zip
+
+
+
+
+
+ ${project.basedir}/../docker-sdk/target/
+ false
+
+ docker-sdk-${project.version}.jar
+
+
+
+
+
+
+
+
+
+
+ com.spotify
+ docker-maven-plugin
+ 1.2.2
+
+
+
+
+ build-image
+
+ package
+
+ build
+
+
+
+
+
+
+ jdchain-demo
+ ${docker.tag}
+
+ ${project.basedir}/src/main/docker
+
+
+
+
+
+
\ No newline at end of file
diff --git a/deploy/docker/docker-demo/src/main/docker/Dockerfile b/deploy/docker/docker-demo/src/main/docker/Dockerfile
new file mode 100644
index 00000000..c6d8edde
--- /dev/null
+++ b/deploy/docker/docker-demo/src/main/docker/Dockerfile
@@ -0,0 +1,37 @@
+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
+
diff --git a/deploy/docker/docker-demo/src/main/docker/script/shutdown.sh b/deploy/docker/docker-demo/src/main/docker/script/shutdown.sh
new file mode 100644
index 00000000..8cf6d207
--- /dev/null
+++ b/deploy/docker/docker-demo/src/main/docker/script/shutdown.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+ps -ef|grep 'jdchain'|grep -v grep|cut -c 9-15|xargs kill -9
+
diff --git a/deploy/docker/docker-demo/src/main/docker/script/start.sh b/deploy/docker/docker-demo/src/main/docker/script/start.sh
new file mode 100644
index 00000000..c55380b6
--- /dev/null
+++ b/deploy/docker/docker-demo/src/main/docker/script/start.sh
@@ -0,0 +1,34 @@
+#!/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
diff --git a/deploy/docker/docker-demo/src/main/docker/zip/conf.zip b/deploy/docker/docker-demo/src/main/docker/zip/conf.zip
new file mode 100644
index 00000000..dc8dffb1
Binary files /dev/null and b/deploy/docker/docker-demo/src/main/docker/zip/conf.zip differ
diff --git a/deploy/docker/docker-demo/src/main/resources/docker-compose-all.yaml b/deploy/docker/docker-demo/src/main/resources/docker-compose-all.yaml
new file mode 100644
index 00000000..b42268f9
--- /dev/null
+++ b/deploy/docker/docker-demo/src/main/resources/docker-compose-all.yaml
@@ -0,0 +1,36 @@
+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
diff --git a/deploy/docker/docker-demo/src/main/resources/start-net.sh b/deploy/docker/docker-demo/src/main/resources/start-net.sh
new file mode 100644
index 00000000..7eafc55d
--- /dev/null
+++ b/deploy/docker/docker-demo/src/main/resources/start-net.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+echo "停止network"
+docker-compose -f docker-compose-all.yaml down
+echo "启动jdchain"
+docker-compose -f docker-compose-all.yaml up -d
diff --git a/deploy/docker/docker-demo/src/main/resources/zip.sh b/deploy/docker/docker-demo/src/main/resources/zip.sh
new file mode 100644
index 00000000..3305c646
--- /dev/null
+++ b/deploy/docker/docker-demo/src/main/resources/zip.sh
@@ -0,0 +1,9 @@
+#/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
diff --git a/deploy/docker/docker-sdk/pom.xml b/deploy/docker/docker-sdk/pom.xml
new file mode 100644
index 00000000..acd99c8c
--- /dev/null
+++ b/deploy/docker/docker-sdk/pom.xml
@@ -0,0 +1,66 @@
+
+
+
+ docker
+ com.jd.blockchain
+ 1.3.0.RELEASE
+
+ 4.0.0
+
+ docker-sdk
+
+
+
+ com.jd.blockchain
+ crypto-classic
+ ${project.version}
+
+
+ com.jd.blockchain
+ crypto-sm
+ ${project.version}
+
+
+ com.jd.blockchain
+ ledger-model
+ ${project.version}
+
+
+ com.jd.blockchain
+ sdk-client
+ ${project.version}
+
+
+
+
+
+
+ maven-assembly-plugin
+
+ false
+
+ jar-with-dependencies
+
+
+
+
+ com.jd.blockchain.SDKDemo
+
+
+
+
+
+ make-assembly
+ package
+
+ single
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/deploy/docker/docker-sdk/src/main/java/com/jd/blockchain/ContractParams.java b/deploy/docker/docker-sdk/src/main/java/com/jd/blockchain/ContractParams.java
new file mode 100644
index 00000000..b1464b4e
--- /dev/null
+++ b/deploy/docker/docker-sdk/src/main/java/com/jd/blockchain/ContractParams.java
@@ -0,0 +1,107 @@
+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;
+ }
+}
diff --git a/deploy/docker/docker-sdk/src/main/java/com/jd/blockchain/SDKDemo.java b/deploy/docker/docker-sdk/src/main/java/com/jd/blockchain/SDKDemo.java
new file mode 100644
index 00000000..5e02ccf1
--- /dev/null
+++ b/deploy/docker/docker-sdk/src/main/java/com/jd/blockchain/SDKDemo.java
@@ -0,0 +1,68 @@
+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));
+ }
+}
diff --git a/deploy/docker/docker-sdk/src/main/java/com/jd/blockchain/SDKDemo_Constant.java b/deploy/docker/docker-sdk/src/main/java/com/jd/blockchain/SDKDemo_Constant.java
new file mode 100644
index 00000000..ec7ec7c2
--- /dev/null
+++ b/deploy/docker/docker-sdk/src/main/java/com/jd/blockchain/SDKDemo_Constant.java
@@ -0,0 +1,46 @@
+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 = "3snPdw7i7PisoLpqqtETdqzQeKVjQReP2Eid9wYK67q9z6trvByGZs";
+ 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);
+ }
+ }
+}
diff --git a/deploy/docker/docker-sdk/src/main/java/com/jd/blockchain/SDK_Base_Demo.java b/deploy/docker/docker-sdk/src/main/java/com/jd/blockchain/SDK_Base_Demo.java
new file mode 100644
index 00000000..9f2e4754
--- /dev/null
+++ b/deploy/docker/docker-sdk/src/main/java/com/jd/blockchain/SDK_Base_Demo.java
@@ -0,0 +1,186 @@
+package com.jd.blockchain;
+
+import com.jd.blockchain.crypto.HashDigest;
+import com.jd.blockchain.ledger.*;
+import com.jd.blockchain.sdk.BlockchainService;
+import com.jd.blockchain.sdk.client.GatewayServiceFactory;
+import com.jd.blockchain.transaction.GenericValueHolder;
+import com.jd.blockchain.utils.Bytes;
+import com.jd.chain.contract.TransferContract;
+
+import static com.jd.blockchain.SDKDemo_Constant.readChainCodes;
+import static com.jd.blockchain.transaction.ContractReturnValue.decode;
+
+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 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;
+ }
+}
diff --git a/deploy/docker/docker-sdk/src/main/java/com/jd/chain/contract/TransferContract.java b/deploy/docker/docker-sdk/src/main/java/com/jd/chain/contract/TransferContract.java
new file mode 100644
index 00000000..a3a41529
--- /dev/null
+++ b/deploy/docker/docker-sdk/src/main/java/com/jd/chain/contract/TransferContract.java
@@ -0,0 +1,32 @@
+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);
+}
diff --git a/deploy/docker/docker-sdk/src/main/resources/contract-compile-1.3.0.RELEASE.car b/deploy/docker/docker-sdk/src/main/resources/contract-compile-1.3.0.RELEASE.car
new file mode 100644
index 00000000..cd7c3c82
Binary files /dev/null and b/deploy/docker/docker-sdk/src/main/resources/contract-compile-1.3.0.RELEASE.car differ
diff --git a/deploy/docker/pom.xml b/deploy/docker/pom.xml
new file mode 100644
index 00000000..81a492ab
--- /dev/null
+++ b/deploy/docker/pom.xml
@@ -0,0 +1,25 @@
+
+
+
+ deploy-root
+ com.jd.blockchain
+ 1.4.0-SNAPSHOT
+
+ 4.0.0
+ 1.3.0.RELEASE
+ pom
+
+ docker
+
+
+ 1.3.0
+
+
+
+ docker-sdk
+ docker-demo
+
+
+
\ No newline at end of file
diff --git a/deploy/docker/readme.md b/deploy/docker/readme.md
new file mode 100644
index 00000000..a83be9d4
--- /dev/null
+++ b/deploy/docker/readme.md
@@ -0,0 +1,44 @@
+# jdchain-demo镜像使用说明
+本镜像主要为快速构建JDChain测试环境使用,内嵌固定的公私钥,不可用于生产正式环境。
+JDChain在docker中的安装路径:/export/jdchain,网关对外端口为:8080。可通过docker-compose-all文件来修改端口。
+demo环境构建完成后执行sdk加载部分测试数据,区块高度:7,交易总数:8,用户总数:5,数据账户总数:2,合约总数:1。
+
+## 如何生成镜像
+1. 如果构建的docker镜像为当前开发版本,将docker模块中的和跟主版本对齐,然后在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=3snPdw7i7PisoLpqqtETdqzQeKVjQReP2Eid9wYK67q9z6trvByGZs
+#默认私钥的内容(加密的Base58编码数据);在 pk-path 和 pk 之间必须设置其一;
+keys.default.privkey=177gk2PbxhHeEdfAAqGfShJQyeV4XvGsJ9CvJFUbToBqwW1YJd5obicySE1St6SvPPaRrUP
+#默认私钥的解码密码;
+keys.default.privkey-password=8EjkXVSTxMFjCvNNsTo8RBMDEVQmk7gYkW4SCDuvdsBG
+````
+
+
+
diff --git a/deploy/pom.xml b/deploy/pom.xml
index 20df00f4..b59b12a0 100644
--- a/deploy/pom.xml
+++ b/deploy/pom.xml
@@ -20,6 +20,7 @@
../core
deploy-gateway
deploy-peer
-
+ docker
+