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 +