基于ChainMaker实现部署集群部署合约区块链服务(java)

Posted fish1208

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于ChainMaker实现部署集群部署合约区块链服务(java)相关的知识,希望对你有一定的参考价值。

安装软件

安装git

yum install git -y

持久化账号

git config --global credential.helper store

git config --global user.name "用户名"

git config --global user.password "密码"

安装go

解压

tar -C /usr/local -zxvf go1.17.2.linux-amd64.tar.gz

修改配置文件

vi /etc/profile

# 在最后一行添加

export GOROOT=/usr/local/go

export PATH=$PATH:$GOROOT/bin

source /etc/profile

查看版本

go version

安装docker

yum install -y yum-utils device-mapper-persistent-data lvm2

设置yum源

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

可以查看所有仓库中所有docker版本,并选择特定版本安装

yum list docker-ce --showduplicates | sort -r

安装

yum install docker-ce-18.06.3.ce-3.el7 -y

启动

systemctl enable docker

systemctl start docker

配置镜像加速器,通过修改daemon配置文件/etc/docker/daemon.json来使用加速器

mkdir -p /etc/docker

tee /etc/docker/daemon.json <<-'EOF'



  "registry-mirrors": ["https://ijdk512y.mirror.aliyuncs.com"]



EOF

systemctl daemon-reload

systemctl restart docker

查看版本

docker -v

安装docker-compose

运行此命令以下载 Docker Compose 的当前稳定版本

curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

二进制文件应用可执行权限

chmod +x /usr/local/bin/docker-compose

创建链接

ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

查看版本

docker-compose -version

安装net-tools tree gcc g++

yum install -y net-tools

yum install -y tree

yum install -y gcc g++

安装java

mkdir /usr/local/java

tar -C /usr/local/java -zxvf jdk-8u191-linux-x64.tar.gz

配置Java环境,编辑/etc/profile文件

vi /etc/profile

export JAVA_HOME=/usr/local/java/jdk1.8.0_191

export PATH=$JAVA_HOME/bin:$PATH

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

source /etc/profile

部署ChainMaker

创建目录

mkdir -p /opt/blockchain

下载chainmaker源码、证书生成工具源码到本地

cd /opt/blockchain

git clone https://git.chainmaker.org.cn/chainmaker/chainmaker-go.git

git clone https://git.chainmaker.org.cn/chainmaker/chainmaker-cryptogen.git

编译证书生成工具

cd chainmaker-cryptogen

make

软连接

将编译好的chainmaker-cryptogen,软连接到chainmaker-go/tools目录

cd chainmaker-go/tools

ln -s ../../chainmaker-cryptogen/ .

部署集群

使用原始的身份模式(即证书模式)部署。也可以选择其它身份模式部署,详细操作请参考长安链官网(https://chainmaker.org.cn/)。

cd /opt/blockchain/chainmaker-go/scripts

生成单链4节点集群的证书和配置

./prepare.sh 4 1

编译及安装包制作

执行build_release.sh脚本,将编译chainmaker-go模块,并打包生成安装,存于路径chainmaker-go/build/release中

./build_release.sh

查看

tree -L 1 ../build/release/

 启动节点集群

./cluster_quick_start.sh normal

查看节点启动使用正常

查看进程是否存在

ps -ef | grep chainmaker

查看端口是否监听

netstat -lptn | grep 1230

查看多节点达成共识

使用最旧的日志查看

cd /opt/blockchain/chainmaker-go/build/release/chainmaker-v2.1.0_alpha-wx-org1.chainmaker.org/log

cat system.log.2021120615 | grep "init blockchain\\[chain1\\] success\\|all necessary peers connected"

查看出块标记

使用最旧的日志查看

cd /opt/blockchain/chainmaker-go/build/release/chainmaker-v2.1.0_alpha-wx-org1.chainmaker.org/log

cat system.log.2021120615 | grep "ERROR\\|put block"

生成java-sdk的jar包

下载sdk源码到本地

cd /opt/blockchain

git clone https://git.chainmaker.org.cn/chainmaker/sdk-java.git

编译、生成jar包

cd sdk-java

./gradlew build

生成的jar包

cd build/libs

使用Rust进行智能合约开发

使用Docker镜像进行合约开发

拉取镜像

docker pull chainmakerofficial/chainmaker-rust-contract:2.1.0

设置本机的工作目录,挂载到docker容器中,以方便后续进行必要的文件拷贝

cd /opt/blockchain

mkdir -p contract/rust

运行docker容器并进入容器

docker run -it --name chainmaker-rust-contract -v /opt/blockchain/contract/rust:/home chainmakerofficial/chainmaker-rust-contract:2.1.0 bash

宿主机操作

合约地址:https://github.com/hongfish/fish1208-chainmaker-javasdk/tree/master/contract

将helloworld合约拷贝到/opt/blockchain/contract/rust目录下

编译合约(容器中操作)

进入容器

docker exec -it chainmaker-rust-contract bash

编译合约

cd /home/contract_helloworld
make build

生成的wasm文件存在于target/wasm32-unknown-unknown/release目录下

部署合约

生成cmc

cd /opt/blockchain/chainmaker-go/tools/cmc

go env -w GOPROXY=https://goproxy.io,direct

go build

./cmc --help

拷贝wasm文件(宿主机上操作)

cd /opt/blockchain/contract/rust/contract_helloworld/target/wasm32-unknown-unknown/release

cp contract_helloworld.wasm /opt/blockchain/chainmaker-go/tools/cmc/testdata/helloworld-wasm

拷贝crypto-config证书

cp -r /opt/blockchain/chainmaker-go/build/crypto-config /opt/blockchain/chainmaker-go/tools/cmc/testdata

部署合约

./cmc client contract user create \\

--contract-name=helloworld \\

--runtime-type=WASMER \\

--byte-code-path=./testdata/helloworld-wasm/contract_helloworld.wasm \\

--version=1.0 \\

--sdk-conf-path=./testdata/sdk_config.yml \\

--admin-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.key,./testdata/crypto-config/wx-org2.chainmaker.org/user/admin1/admin1.tls.key,./testdata/crypto-config/wx-org3.chainmaker.org/user/admin1/admin1.tls.key \\

--admin-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.crt,./testdata/crypto-config/wx-org2.chainmaker.org/user/admin1/admin1.tls.crt,./testdata/crypto-config/wx-org3.chainmaker.org/user/admin1/admin1.tls.crt \\

--sync-result=true \\

--params=""

结果:

response: message:"OK" contract_result:<result:"\\n\\nhelloworld\\022\\0031.0\\030\\002*<\\n\\026wx-org1.chainmaker.org\\020\\001\\032 WM-\\206\\255/WS\\241\\3422Z N\\271<PB\\302\\006zB^\\2638\\216^\\345Z" message:"OK" > tx_id:"d1d9c7e9ed4b44d582e76f0d3aaedfc7c15185e04d8d4651b81e4d33043a241d"

升级合约

./cmc client contract user upgrade \\

--contract-name=helloworld \\

--runtime-type=WASMER \\

--byte-code-path=./testdata/helloworld-wasm/contract_helloworld.wasm \\

--version=2.0 \\

--sdk-conf-path=./testdata/sdk_config.yml \\

--admin-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.key,./testdata/crypto-config/wx-org2.chainmaker.org/user/admin1/admin1.tls.key,./testdata/crypto-config/wx-org3.chainmaker.org/user/admin1/admin1.tls.key \\

--admin-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.crt,./testdata/crypto-config/wx-org2.chainmaker.org/user/admin1/admin1.tls.crt,./testdata/crypto-config/wx-org3.chainmaker.org/user/admin1/admin1.tls.crt \\

--sync-result=true \\

--params=""

执行合约

INVOKE contract

./cmc client contract user invoke \\

--contract-name=helloworld \\

--method=set \\

--sdk-conf-path=./testdata/sdk_config.yml \\

--params="\\"n\\":\\"Hello World2\\"" \\

--sync-result=true

结果:

INVOKE contract resp, [code:0]/[msg:OK]/[contractResult:gas_used:7086583 ]/[txId:ce99e71478944697b8596034b3e26e99c24103946ef14e92879545d58af3a54c]

QUERY contract

./cmc client contract user get \\

--contract-name=helloworld \\

--method=get \\

--sdk-conf-path=./testdata/sdk_config.yml \\

--params=""

结果:

QUERY contract resp: message:"SUCCESS" contract_result:<result:"\\"n\\":\\"Hello World2\\"" gas_used:17802379 > tx_id:"976c35496aee4564ba03ab92e629c2fa6b853695514d4a3bb93966e4cef366f6"

Java服务调用合约

使用java-sdk实现的区块链服务调用合约。

java服务地址: https://github.com/hongfish/fish1208-chainmaker-javasdk

HelloWorld合约set方法

 HelloWorld合约get方法

以上是关于基于ChainMaker实现部署集群部署合约区块链服务(java)的主要内容,如果未能解决你的问题,请参考以下文章

区块链入门Truffle 项目实战,Solidity IDE, 智能合约部署

长安链从零到一部署-chainmaker-v2.1.0

XuperChain 百度区块链简易学习帖

如何防止智能合约在区块链网络中被修改和部署?

基于区块链技术的供应链金融平台

区块链 节点专题SPV轻节点怎么用 chainmaker为例