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

  • Post author:
  • Post category: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方法




版权声明:本文为yuch_hong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。