Browse Source

Merge commit '5a895f61620c0666ac274b40764f57897c015ed2' into release/1.4.0

* commit '5a895f61620c0666ac274b40764f57897c015ed2':
  add docker-sdk;
  add the docker's module to optimize the constructure of docker-demo;
  update the log4j2.xml;
  add docker-sdk;
  add docker-sdk;
  modify the md for: how to generate the image;
  check the zip and sdk.jar;
  add the dos2unix for win;
  add docker-sdk;
  add docker-sdk;
  add docker-sdk;
  add the docker-demo submodule;
tags/1.4.0^2
huanghaiquan 4 years ago
parent
commit
2b0399ab2f
18 changed files with 835 additions and 1 deletions
  1. +134
    -0
      deploy/docker/docker-demo/pom.xml
  2. +37
    -0
      deploy/docker/docker-demo/src/main/docker/Dockerfile
  3. +4
    -0
      deploy/docker/docker-demo/src/main/docker/script/shutdown.sh
  4. +34
    -0
      deploy/docker/docker-demo/src/main/docker/script/start.sh
  5. BIN
      deploy/docker/docker-demo/src/main/docker/zip/conf.zip
  6. +36
    -0
      deploy/docker/docker-demo/src/main/resources/docker-compose-all.yaml
  7. +5
    -0
      deploy/docker/docker-demo/src/main/resources/start-net.sh
  8. +9
    -0
      deploy/docker/docker-demo/src/main/resources/zip.sh
  9. +66
    -0
      deploy/docker/docker-sdk/pom.xml
  10. +107
    -0
      deploy/docker/docker-sdk/src/main/java/com/jd/blockchain/ContractParams.java
  11. +68
    -0
      deploy/docker/docker-sdk/src/main/java/com/jd/blockchain/SDKDemo.java
  12. +46
    -0
      deploy/docker/docker-sdk/src/main/java/com/jd/blockchain/SDKDemo_Constant.java
  13. +186
    -0
      deploy/docker/docker-sdk/src/main/java/com/jd/blockchain/SDK_Base_Demo.java
  14. +32
    -0
      deploy/docker/docker-sdk/src/main/java/com/jd/chain/contract/TransferContract.java
  15. BIN
      deploy/docker/docker-sdk/src/main/resources/contract-compile-1.3.0.RELEASE.car
  16. +25
    -0
      deploy/docker/pom.xml
  17. +44
    -0
      deploy/docker/readme.md
  18. +2
    -1
      deploy/pom.xml

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

@@ -0,0 +1,134 @@
<?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.3.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>
<version>3.8.1</version>
<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>${docker.tag}</imageTags>
<!-- 指定 Dockerfile 路径-->
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
</configuration>
</plugin>
</plugins>
</build>

</project>

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

@@ -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


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

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

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


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

@@ -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

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


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

@@ -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

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

@@ -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

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

@@ -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

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

@@ -0,0 +1,66 @@
<?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.3.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>${project.version}</version>
</dependency>
<dependency>
<groupId>com.jd.blockchain</groupId>
<artifactId>crypto-sm</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.jd.blockchain</groupId>
<artifactId>ledger-model</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.jd.blockchain</groupId>
<artifactId>sdk-client</artifactId>
<version>${project.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>

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

@@ -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;
}
}

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

@@ -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));
}
}

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

@@ -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);
}
}
}

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

@@ -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<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;
}
}

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

@@ -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);
}

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


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

@@ -0,0 +1,25 @@
<?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>deploy-root</artifactId>
<groupId>com.jd.blockchain</groupId>
<version>1.4.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<version>1.3.0.RELEASE</version>
<packaging>pom</packaging>

<artifactId>docker</artifactId>

<properties>
<docker.tag>1.3.0</docker.tag>
</properties>

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

</project>

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

@@ -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模块中的<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=3snPdw7i7PisoLpqqtETdqzQeKVjQReP2Eid9wYK67q9z6trvByGZs
#默认私钥的内容(加密的Base58编码数据);在 pk-path 和 pk 之间必须设置其一;
keys.default.privkey=177gk2PbxhHeEdfAAqGfShJQyeV4XvGsJ9CvJFUbToBqwW1YJd5obicySE1St6SvPPaRrUP
#默认私钥的解码密码;
keys.default.privkey-password=8EjkXVSTxMFjCvNNsTo8RBMDEVQmk7gYkW4SCDuvdsBG
````




+ 2
- 1
deploy/pom.xml View File

@@ -20,6 +20,7 @@
<module>../core</module>
<module>deploy-gateway</module>
<module>deploy-peer</module>
</modules>
<module>docker</module>
</modules>

</project>

Loading…
Cancel
Save