长安链---从零到一部署Chainmaker-2.0.0

长安链部署

简介

长安链·ChainMaker具备自主可控、灵活装配、软硬一体、开源开放的突出特点,由北京微芯研究院、清华大学、北京航空航天大学、腾讯、百度和京东等知名高校、企业共同研发。取名“长安链”,喻意“长治久安、再创辉煌、链接世界”。

长安链作为区块链开源底层软件平台,包涵区块链核心框架、丰富的组件库和工具集,致力于为用户高效、精准地解决差异化区块链实现需求,构建高性能、高可信、高安全的新型数字基础设施,同时也是国内首个自主可控区块链软硬件技术体系。

长安链的应用场景,涵盖供应链金融、碳交易、食品追溯等一系列关乎国计民生的重大领域。

长安链官网地址

关键技术

长安链·ChainMaker秉承开源开放、共建共享的理念,已开放程序源码。“长安链·ChainMaker”坚持自主研发,秉承开源开放、共建共享的理念,面向大规模节点组网、高交易处理性能、强数据安全隐私等下一代区块链技术需求,融合区块链专用加速芯片硬件和可装配底层软件平台,为构建高性能、高可信、高安全的数字基础设施提供新的解决方案。

并行调度
在提案-验证整体框架下,支持基于DAG的块内交易并行调度提案和并行验证;调度支持确定性调度和随机调度等多种并行调度算法。

广域网络
基于PubSub机制,支持多链隔离下P2P网络的复用与数据隔离; 支持NAT穿透,复杂网络拓扑下的大规模节点组网,支持网络节点动态治理。

多链架构
支持并行多链实现不同参与方间的数据隔离; 可根据场景灵活扩展子链以支持业务和吞吐量的需求。

权限管理
为链上每个操作定义访问权限,支持细粒度权限管理策略; 结合组织、角色等提供灵活的身份权限配置方案。

技术优势

自主可控
面向世界科技前沿,秉持自主创新原则,汇聚国内顶级工程师和科学家团队,长安链·ChainMaker构建了全球独创的底层技术框架,关键技术模块全部自研,成为国际区块链技术发展的新动能,为国家“新基建”提供自主、可控、安全的区块链数字经济基础设施。独创深度模块化、可装配、高性能并行执行的区块链底层技术架构;

覆盖国产密码算法、基于国密证书的加密通讯和国产CA证书颁发认证机构。

开源开放
自诞生起,长安链践行开源、开放的理念,最大范围联合产、学、研、用各类科研力量,由顶尖高校、知名企业等优势力量共同开发,同时广泛拥抱个人和企业开发者,打造标准规范体系,共建开源开放充满活力的区块链技术生态;

采用友好的开源协议,开放软件源代码,推动多项技术体系标准化,建立标准化下的开发生态。

性能领先
长安链拥有高效并行调度算法、高性能可信安全智能合约执行引擎、流水线共识算法等国际领先的区块链底层技术,具备高并发、低延时、大规模节点组网等先进技术优势,交易吞吐能力可达10万TPS,位居全球领先水平;
支持基于内存的数据系统,提升交易处理性能。

灵活装配
长安链将区块链执行流程标准化、模块化,推进区块链技术从手工作业模式演进到自动装配生产模式,方便用户根据不同的业务需求搭建区块链系统,为技术的规模化应用提供基础;

可插拔、可分离的自主可控核心框架,可快速接入优势底层模块/单一定制化开发模块。

长安链简介-核心特色

基础术语说明

基础术语说明

功能清单说明

功能清单说明

编写语言

编写语言

版本迭代说明

1.x版本

长安链ChainMaker自v1.0.0版本发布以来经过6个版本的迭代,截止v1.2.4版本中已经支持:

  • 四种合约引擎:支持GASM、WASMER、WXVM、EVM四种合约引擎;
  • 四种合约语言:支持Golang、Rust、C++、Solidity四种合约语言;
  • 五种共识算法:支持Solo、RAFT、TBFT、HotStuff、dPoS;
  • 三种存储引擎:支持LevelDB、RocksDB、MySQL。

在v1.2.x版本中长安链ChainMaker支持go、java、nodejs的链sdk,支持spv轻节点和跨链;支持合约内执行sql语句,合约支持基于paillier的半同态运算和bulletproofs的范围证明;支持区块链浏览器、CMC命令行工具、CA服务管理、chainmaker-cryptogen证书生成工具等。

至此长安链ChainMaker v1.2.x版本作为区块链底层技术平台,已经在政务、金融、能源及食品溯源等行业得到应用,成为数字经济、数字社会和数字政府建设的基础底座。

2.x版本

在最新发布的长安链 v2.x版本中,我们将着重在长安链的易用性、稳定性、安全性三方面做更多工作。除丰富产品工具集以外,长安链特有的可装配性将进一步体现出来。

此次更新的 v2.0.0版本中侧重对数据模型、代码结构的调整,我们进行了如下升级:

1、对区块、交易等数据结构进行了重构

章节见:v2.0.0技术文档>技术设计文档>3.数据结构

升级对数据模型主要做了以下三方面的调整:

1.1数据类型更准确,更易扩展。比如区块高度字段,在实际中从创世区块(Genesis)高度为0开始递增,不可能为负数,所以将数据类型从int64调整为uint64。再比如合约参数KeyValuePair,之前Value为string类型,传入二进制数据时需要进行hex或base64编码及解码操作,使得交易变大且合约逻辑变复杂,所以本次升级将其改为bytes类型。

交易数据模型重构。在v1.x版本中,交易请求内容分为多种并使用TxType区分,每种交易请求使用不同的数据结构,并序列化后放入交易的Payload字段。在v2.x中,将合约安装、用户合约调用、系统合约调用、链配置更改、查询链数据、订阅消息等等各种行为都统一为合约调用,只是被调用的合约名、方法名和参数不同,因此可以用统一的Payload并简化TxType。一方面统一了用户行为,另一方面减少了序列化、反序列化的次数。

为多个数据模型增加了新字段,以适应新的需求的扩展。以交易的Payload对象为例,在原有基础上增加了Limit和Sequence字段,BlockHeader增加了BlockType,SerializedMember增加了MemberType字段等,这些字段都为v2.x中可装配性提供了扩展能力。

2、身份权限、系统合约等模块代码重构

在不影响原有功能的前提下,对身份权限、系统合约等模块的代码进行重构,提升代码质量。其中,身份权限模块一方面调整整体接口框架,为之后增加公钥身份、DID身份提供扩展能力;另一方面将原有整体流程中分步鉴权的代码进行收拢,进一步理清鉴权逻辑,并支持根据系统合约的合约名加方法名进行更细粒度权限控制。系统合约模块,一方面根据合约内容对系统合约进行归类,使整体结构更加清晰;另一方面,将合约管理逻辑从原来的合约模块移入系统合约中,与系统合约定位相符。

3、拆分部分模块为独立项目,并启用go mod代替原有的git submodule

本次升级中将common、pb、pb-go、protocol、sdk-go作为chainmaker-go的依赖包,以go mod的形式引入,代替原有的git submodule模式。Go mod模式是go语言官方推荐的包管理模式,长安链各组件以go mod包的形式被引入,可以更好的做到依赖包的版本管理,从而方便长安链在可装配性和自定义模块的扩展能力。

4、增加外部证书兼容

章节见:v2.0.0技术文档>技术设计文档>9.身份权限管理>9.3权限管理>9.3.4外部证书兼容

长安链v1.x版本中,若采用数字证书作为用户标识,需要在证书O和OU字段中,附加组织和角色等信息,无法复用参与方原有的数字证书。因此在v2.0.0中,增加了对外部证书的兼容支持,用户可将已有的第三方CA颁发的数字证书作为区块链节点或用户的签名证书,从而支持更灵活易用的证书体系。

1、单节点部署(Docker)

环境依赖

环境依赖

测试机器

2C 2G 30G

软件依赖

软件依赖

注:如有操作过程问题请参考常见问题!!!

1.1 安装Git

yum install -y git curl-devel expat-devel gettext-devel openssl-devel zlib-devel vim lrzsz wget bash-completion
#编译安装git前,它需要依赖这些curl-devel expat-devel gettext-devel openssl-devel zlib-devel依赖包。一般直接用yum命令安装一下就行了。这里提前下载好所需依赖包,打成tar包。
# 内网服务器不连外网,直接通过另一台可以连外网的服务器,将所需的依赖通过yum命令下载下来,将所有下载下来的rpm包都上传到这台服务器上安装
# 上传准备好的git-1.8.3.1.tar.gz及依赖包到soft下解压
# 强制安装
[root@localhost git]# rpm -Uvh --force --nodeps *.rpm
# 查看git
[root@localhost git-1.8.3.1]# git --version
git version 1.8.3.1

1.2 安装Golang

# 下载地址
wget https://golang.google.cn/dl/go1.16.7.linux-amd64.tar.gz
# 上go1.16.7.linux-amd64.tar.gz到/data/soft下
# 解压到/usr/loacal下
tar xf go1.16.7.linux-amd64.tar.gz -C /usr/local/
[root@localhost soft]# ln -s /usr/local/go/bin/* /usr/bin/
# 配置环境变量
# 执行该命令打开文件,在 profile 文件最后添加如下内容
vim /etc/profile
export PATH=$PATH:/usr/local/go/bin
export GOPATH=/data/go
# 使环境变量生效
source /etc/profile
# 查看版本
go version
go version go1.16.7 linux/amd64

# 外网可以打开,内网没用
# 开启Go的MODULE支持
go env -w GO111MODULE=auto
# 软件源替换
go env -w GOPROXY=https://goproxy.cn,direct

1.3 安装docker

# yum安装
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce
systemctl start docker

# 或者上传docker-19.03.9.tgz到soft下
# 下载地址https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz
# 解压到data下
tar xf soft/docker-19.03.9.tgz -C /data/
# 拷贝docker下文件到/usr/bin/
cp /data/docker/* /usr/bin/
# 配置systemd管理docker
vim /lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target
# 创建加速配置文件,内网可配置harbor地址
mkdir /etc/docker
vim /etc/docker/daemon.json
{
    
    
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn","https://mirror.ccs.tencentyun.com","https://hub-mirror.c.163.com","https://xkhndtby.mirror.aliyuncs.com"]
}
#启动并设置开机启动
systemctl daemon-reload
systemctl start docker
systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
# 查看版本
docker --version
Docker version 19.03.9, build 9d988398e7

# 命令自动补全
yum -y install bash-completion
source /etc/profile.d/bash_completion.sh

1.4 安装docker-compose

# 下载地址
wget https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-linux-x86_64
# 上传docker-compose到soft下
# 移动到/usr/local/bin/下并改名docker-compose
mv docker-compose-linux-x86_64  /usr/local/bin/docker-compose
# 赋予权限
chmod +x /usr/local/bin/docker-compose
# 查看版本
docker-compose -v
Docker Compose version v2.2.2

1.5 安装Gcc

# 如果可用yum就直接下载即可
yum -y install gcc net-tools tree gcc-c++ kernel-devel

# 可以找一台能连接外网的虚机下载rpm包,完成之后保存上传到内网安装,后面组件同样适用
# 命令如下,下载gcc及依赖,下载不安装
yum install --downloadonly --downloaddir=/root/soft/gcc gcc*
# 后边所有文件都在/data/soft下,所有提前创建好/data目录,gcc放到/data/soft/下
mkdir /data/soft -p
# 把准备好的gcc.tar包上传到此目录下/data/soft下
# 解压gcc
tar xf soft/gcc.tar.gz -C .
cd gcc
# 强制安装此目录下所有rpm,不检索依赖
[root@localhost gcc]# rpm -Uvh --force --nodeps *.rpm
# 安装完成后查看gcc版本
[root@localhost gcc]# gcc –version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36)

1.6 安装Glibc

注意:GLIBC是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运
行库都会依赖于glibc,一旦安装失败系统将不可用,请谨慎操作。此处仅列举一种安装示例(在
CentOS Linux release 7.6.1810安装成功),并不一定使用您的系统,请根据您的系统及gcc环境
自行选择相应的安装方法。
# 查看GLIBC版本
ldd --version
strings /lib64/libc.so.6 | grep "^GLIBC_"
# 下载chainmaker-go源码后,进入chainmaker-go/script/3rd安装
cd chainmaker-go/scripts/3rd/
sh install.sh

1.7 源码下载

长安链官网下载源码:https://git.chainmaker.org.cn/chainmaker/chainmaker-go

各版本源码下载地址

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

当前为私有仓库,需要先进行账号注册

  • 下载chainmaker源码到本地,部署不通版本更改版本号即可v2.0.0
git clone -b v2.0.0 https://git.chainmaker.org.cn/chainmaker/chainmaker-go.git
# 输入账号
# 下载证书生成工具源码到本地
git clone -b v2.0.0 https://git.chainmaker.org.cn/chainmaker/chainmaker-cryptogen.git

1.8 源码编译

  • 编译证书生成工具
cd chainmaker-cryptogen
make
# 等待编译完成
go: downloading github.com/spf13/cobra v1.1.1
go: downloading github.com/spf13/viper v1.7.0
go: downloading chainmaker.org/chainmaker/common/v2 v2.0.0
.....
chainmaker-cryptogen/
chainmaker-cryptogen/bin/
chainmaker-cryptogen/bin/chainmaker-cryptogen
chainmaker-cryptogen/config/
chainmaker-cryptogen/config/crypto_config_template.yml

1.9 证书及配置文件生成

  • 将编译好的chainmaker-cryptogen,软连接到chainmaker-go/tools目录
# 进入工具目录
cd ../chainmaker-go/tools/

# 软连接chainmaker-cryptogen到tools目录下
ln -s ../../chainmaker-cryptogen/ .
  • 进入chainmaker-go/scripts目录,执行prepare.sh脚本生成单链4节点集群配置,存于路径chainmaker-go/build

    prepare.sh脚本支持生成solo模式节点证书和配置,以及4/7/10/13/16节点的证书和配置

# 进入脚本目录
cd ../scripts

# 查看脚本帮助
./prepare.sh -h
invalid params
Usage:  
  prepare.sh node_cnt(1/4/7/10/13/16) chain_cnt(1-4) p2p_port(default:11301) rpc_port(default:12301)
    eg1: prepare.sh 4 1
    eg2: prepare.sh 4 1 11301 12301

# 生成单链1节点集群的证书和配置
./prepare.sh 1 1
# 生成的节点配置及证书在build文件下
cd ../build/
tree -L 3
.
├── config
│ └── node1
│     ├── certs	# 自己证书的信息
│     ├── chainconfig	# 链的配置文件
│     ├── chainmaker.yml	# 节点的配置
│     └── log.yml			# 日志的配置
├── crypto-config		# 证书的配置信息
│ └── wx-org.chainmaker.org
│     ├── ca
│     ├── node
│     └── user
└── crypto_config.yml

9 directories, 3 files
------------------------------------------
tree -L 3 config/node1/
config/node1/
├── certs
│   ├── ca	# 创世块的ca
│   │   └── wx-org.chainmaker.org
│   ├── node # 自己的证书信息
│   │   ├── common1
│   │   └── consensus1
│   └── user	# 用户的证书信息
│       ├── admin1
│       ├── client1
│       └── light1
├── chainconfig
│   └── bc1.yml
├── chainmaker.yml
└── log.ym
-------------------------------------------
tree -L 3 crypto-config/
crypto-config/
└── wx-org.chainmaker.org
    ├── ca	# 自己的ca证书信息
    │   ├── ca.crt
    │   └── ca.key
    ├── node	 # 自己节点的证书信息
    │   ├── common1
    │   └── consensus1
    └── user	# 自己用户的信息证书
        ├── admin1
        ├── client1
        └── light1
  • 关于自动生成的端口说明

通过prepare.sh脚本生成的配置,默认是在单台服务器上部署,故自动生成的端口号,是从一个起始端口号开始依次递增,可以通过命令行参数修改起始端口号。

主要有2个端口,p2p端口(用于节点互联)和rpc端口(用于客户端与节点通信),p2p起始端口为11301rpc起始端口为12301

如果生成4个节点的配置,p2p端口分别为:11301、11302、11303、11304rpc端口分别为:12301、12302、12303、12304

如果是在多机部署,希望生成固定的端口号,请参考:【多机部署】

1.10 启动节点

# 这里是一个节点
pwd
/data/chainmaker-go/build/config/node1
[root@localhost node1]# ll
总用量 12
drwxr-xr-x. 5 root root   40 119 15:24 certs
drwxr-xr-x. 2 root root   21 119 15:24 chainconfig
-rw-r--r--. 1 root root 5417 119 15:24 chainmaker.yml
-rw-r--r--. 1 root root 1638 119 15:24 log.yml

# 拉取镜像
docker pull chainmakerofficial/chainmaker:v2.0.0

# 启动
docker run -d --name chainmaker --restart=always \
-p 11301:11301 -p 12301:12301 \
-v /data/chainmaker-go/build/config/node1:/chainmaker-go/config/wx-org.chainmaker.org \
-v /data/chainmaker/node_data:/chainmaker-go/data \
-v /data/chainmaker/logs:/chainmaker-go/log \
chainmakerofficial/chainmaker:v2.0.0 \
/chainmaker-go/bin/chainmaker start -c /chainmaker-go/config/wx-org.chainmaker.org/chainmaker.yml

# 解释
--restart=always   关机自动重启节点
-p 11301:11301 p2p端口
-p 12301:12301 rpc端口
-v /data/chainmaker-go/build/config/node1	把生成的配置文件映射到容器内部,如果路径不对,会起不来
-v /data/chainmaker/node_data 数据目录
-v /data/chainmaker/logs 日志目录
chainmakerofficial/chainmaker:v2.0.0 镜像
/chainmaker-go/bin/chainmaker start -c /chainmaker-go/config/wx-org.chainmaker.org/chainmaker.yml 指定配置文件启动

# 查看启动日志
tail -100f /data/chainmaker/logs/system.log
# 出现此图形为启动成功

image-20220119154836434

tail -1000f /data/chainmaker/logs/system.log |grep "ERROR\|put block\|all necessary"

日志说明:
2022-01-19 15:46:50.719	[INFO]	[Storage] @chain1	store/blockstore_impl.go:179	chain[chain1]: put block[0] hash[98848a1f1eb928606c7202d169104f84f7f586623903a833578a5b1f741a0cc6] (txs:1 bytes:5551), 
时间 [日志级别] [模块] @链名称 文件名.go:行数 链chain[链名称]:put block[区块高度](txs:交易个数 bytes:区块大小), 使用时间毫秒(mashal:0, log:1, blockdb:0, statedb:0, historydb:0, resultdb:0, contractdb:0, batchChan:0, total:1)

image-20220119155038647

2、智能合约示例

见官方文档

2.1 拉取合约环境镜像

# 拉取镜像
docker pull chainmakerofficial/chainmaker-go-contract:2.0.0
docker images
# 运行镜像
docker run -d --name chainmaker-go-contract -v /data/chainmaker-go-contract/:/home chainmakerofficial/chainmaker-go-contract:2.0.0 bash -c "while true; do echo hello chainmaker; sleep 5;done"

# 查看日志,5秒打印一行日志
docker logs -f chainmaker-go-contract
hello chainmaker
hello chainmaker
hello chainmaker
hello chainmaker

2.2、编译合约

 进入容器内部
docker exec -it chainmaker-go-contract bash
cd /home/
tar xvf /data/contract_go_template.tar.gz	# 解压缩合约SDK源码
cd contract_tinygo
sh build.sh		# 编译main.go合约
# 生成合约的字节码文件在
/home/contract_tinygo/chainmaker-contract-go.wasm

ls -l
total 104
-rw-r--r--. 1  501 staff    84 Sep  7 12:19 Makefile
-rw-r--r--. 1  501 staff    73 Sep  7 12:19 build.sh	# 编译脚本
-rw-r--r--. 1  501 staff  4149 Sep  7 12:19 bulletproofs.go	# 合约SDK基于bulletproofs的范围证明接口实现
-rwxr-xr-x. 1 root root  36226 Jan 19 08:04 chainmaker-contract-go.wasm	# 合约
-rw-r--r--. 1  501 staff 19677 Sep  7 12:19 chainmaker.go	# 合约SDK主要接口及实现
-rw-r--r--. 1  501 staff  4221 Sep  7 12:19 chainmaker_rs.go	# 合约SDK sql接口实现
drwxr-xr-x. 2  501 staff    47 Jan 19 08:04 convert
-rw-r--r--. 1  501 staff 11761 Sep  7 12:19 easycodec.go	# 序列化工具类
-rw-r--r--. 1  501 staff    55 Sep  7 12:19 go.mod
-rw-r--r--. 1  501 staff  3634 Sep  7 12:19 main.go		# 存证示例代码
-rw-r--r--. 1  501 staff  1992 Sep  7 12:19 paillier.go	# 合约SDK基于paillier的半同态运算接口实现

3、部署合约

3.1 编译命令行工具

官方文档

实际生产系统还是用SDK方式

cd /data/chainmaker-go/tools/cmc
go build
go: downloading chainmaker.org/chainmaker/pb-go/v2 v2.0.0
....

#使用chainmaker-cryptogen生成的测试链的证书,软连接过来
cd testdata/
ln -s ../../../build/crypto-config .

./cmc --help
# 主要参数说明
sdk配置文件flag
  --sdk-conf-path:指定cmc使用sdk的配置文件路径

  admin签名者flags,此类flag的顺序及个数必须保持一致,且至少传入一个admin
  --admin-crt-file-paths: admin签名者的tls crt文件的路径列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割
      比如 ./wx-org1.chainmaker.org/admin1.tls.crt,./wx-org2.chainmaker.org/admin1.tls.crt
  --admin-key-file-paths: admin签名者的tls key文件的路径列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割
      比如 ./wx-org1.chainmaker.org/admin1.tls.key,./wx-org2.chainmaker.org/admin1.tls.key

  覆盖sdk配置flags,不传则使用sdk配置,如果想覆盖sdk的配置,则以下六个flag都必填
  --org-id: 指定发送交易的用户所属的组织Id, 会覆盖sdk配置文件读取的配置
  --chain-id: 指定链Id, 会覆盖sdk配置文件读取的配置
  --user-tlscrt-file-path: 指定发送交易的用户tls证书文件路径, 会覆盖sdk配置文件读取的配置
  --user-tlskey-file-path: 指定发送交易的用户tls私钥路径, 会覆盖sdk配置文件读取的配置
  --user-signcrt-file-path: 指定发送交易的用户sign证书文件路径, 会覆盖sdk配置文件读取的配置
  --user-signkey-file-path: 指定发送交易的用户sign私钥路径, 会覆盖sdk配置文件读取的配置

  其他flags
  --byte-code-path:指定合约的wasm文件路径
  --contract-name:指定合约名称
  --method:指定调用的合约方法名称
  --runtime-type:指定合约执行虚拟机环境,包含:GASM、EVM、WASMER、WXVM、NATIVE
  --version:指定合约的版本号,在发布和升级合约时使用
  --sync-result:指定是否同步等待交易执行结果,默认为false,如果设置为true,在发送完交易后会主动查询交易执行结果
  --params:指定发布合约或调用合约时的参数信息
  --concurrency:指定调用合约并发的go routine,用于压力测试
  --total-count-per-goroutine:指定单个go routine发送的交易数量,用于压力测试,和--concurrency配合使用
  --block-height:指定区块高度
  --tx-id:指定交易Id
  --with-rw-set:指定获取区块时是否附带读写集,默认是false
  --abi-file-path:调用evm合约时需要指定被调用合约的abi文件路径,如:--abi-file-path=./testdata/balance-evm-demo/ledger_balance.abi

3.2 执行创建合约

# 由于是单节点,所以要修改客户端证书的路径
# 修改sdk_config.yml文件
# /data/chainmaker-go/tools/cmc/testdata
vim sdk_config.yml
---
# 组织ID:
原:wx-org1.chainmaker.org
现:wx-org.chainmaker.org
# 客户端用户私钥路径:
原:./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.key
现:./testdata/crypto-config/wx-org.chainmaker.org/user/client1/client1.tls.key
# 客户端用户证书路径
原:./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.crt
现:./testdata/crypto-config/wx-org.chainmaker.org/user/client1/client1.tls.crt
# 客户端用户交易签名私钥路径
原:./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.sign.key
现:./testdata/crypto-config/wx-org.chainmaker.org/user/client1/client1.sign.key
# 客户端用户交易签名证书路径
原:./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.sign.crt
现:./testdata/crypto-config/wx-org.chainmaker.org/user/client1/client1.sign.crt
# 节点地址
原:node_addr: "127.0.0.1:12301"
现:node_addr: "192.168.88.135:12301"
# 信任证书池路径
原:./testdata/crypto-config/wx-org.chainmaker.org/ca
现:./testdata/crypto-config/wx-org.chainmaker.org/ca


cd ..
./cmc client contract user create \
--contract-name=chain_001 \
--runtime-type=GASM \
--byte-code-path=/data/chainmaker-go-contract/contract_tinygo/chainmaker-contract-go.wasm \
--version=1.0 \
--sdk-conf-path=./testdata/sdk_config.yml \
--admin-key-file-paths=./testdata/crypto-config/wx-org.chainmaker.org/user/admin1/admin1.tls.key \
--admin-crt-file-paths=./testdata/crypto-config/wx-org.chainmaker.org/user/admin1/admin1.tls.crt \
--sync-result=true \
--params="{}"

# 返回结果
response: message:"OK" contract_result:<result:"\n\tchain_001\022\0031.0\030\004*;\n\025wx-org.chainmaker.org\020\001\032 \026\315\355Q\031osB\201\013\326\3434Ruq\300\232\27393s%\204C\221\264\360\242\3542\306" message:"OK" > tx_id:"53282716d4f342b7b5ee2a1e7b98c5531ae12d92f2b947a69ebca0bb33841fb3"

# 参数说明
--admin-key-file-paths=签名证书
--client-crt-file-paths=连接证书
--org-id=组织id
--byte-code-path=二进制字节码wasm文件路径
--contract-name=合约名称
--runtime-type=类型
--sdk-conf-path=sdk配置文件
--version=版本号
--sync-result=是否返回结果

# put block 只要有读写操作区块高度就会递增

image-20220119162353500

image-20220119162412662

3.3 执行合约方法

./cmc client contract user invoke \
--contract-name=chain_001 \
--method=save \
--sdk-conf-path=./testdata/sdk_config.yml \
--params="{
    
    \"file_name\":\"hello chainmaker\",\"file_hash\":\"ab3456df5799b87c77e7f88\",\"time\":\"6543234\"}" \
--sync-result=true

# 结果
INVOKE contract resp, [code:0]/[msg:OK]/[contractResult:result:"hello chainmakerab3456df5799b87c77e7f88" gas_used:13568342 contract_event:<topic:"topic_vx" tx_id:"bcd40a1cb41d48c89960517a824ad4fbe49dd7b46a704bbf9f1ed5a28b9165ee" contract_name:"chain_001" contract_version:"1.0" event_data:"ab3456df5799b87c77e7f88" event_data:"hello chainmaker" > ]/[txId:bcd40a1cb41d48c89960517a824ad4fbe49dd7b46a704bbf9f1ed5a28b9165ee]

--method=save	方法
--params=传参数

image-20220119162844328

image-20220119162927155

3.4 查询合约

# 根据file_hash查询
./cmc client contract user get \
--contract-name=chain_001 \
--method=find_by_file_hash \
--sdk-conf-path=./testdata/sdk_config.yml \
--params="{
    
    \"file_hash\":\"ab3456df5799b87c77e7f88\"}"

# 结果
QUERY contract resp: message:"SUCCESS" contract_result:<result:"{
    
    \"fileHash\":\"ab3456df5799b87c77e7f88\",\"fileName\":\"hello chainmaker\",\"time\":6543234}" gas_used:15977125 > tx_id:"8cd37ca511c243c08784beb128ee459b025bea7a483d45068a47a9a051e0e06a"

image-20220119163137258

下面还有升级合约,冻结合约,解冻合约,吊销合约,交易等

具体操作请看官网说明

下面长安链管理台和区块链浏览器选一即可,也可两个都部署,可以比较差异

4、长安链管理台

本产品定位为供开源社区区块链开发者,区块链产品经理使用,以便在初步接触长安链时,通过本平台可单机快速部署长安链用于产品体验和测试,并对长安链的技术架构,功能模块有一个初步了解。

本产品支持私有化部署,详细部署流程参考安装指南。

4.1 安装指南

版本支持

目前支持长安链v1.2.4v2.0.0v2.1.0版本,因长安链1.X版本和2.X版本底层数据结构不同,目前相互之间不兼容。

环境依赖

docker版本为20.10.7或以上 docker-compose版本为1.29.2或以上

下载地址:

  • https://docs.docker.com/engine/install/
  • https://docs.docker.com/compose/install/

若已安装,请通过命令查看版本:

docker -v
Docker version 20.10.12, build e91ed57
docker-compose -v
Docker Compose version v2.2.2

4.2 代码下载

下载地址: https://git.chainmaker.org.cn/chainmaker/management-backend 下载代码:

cd /data
git clone -b v2.0.0 https://git.chainmaker.org.cn/chainmaker/management-backend.git
# 提前下载镜像
docker pull mysql:5.7
docker pull chainmakerofficial/management-backend:v2.0.0
docker pull chainmakerofficial/management-web:v2.0.0
# 下载完后端代码后,进入management-backend目录,执行以下命令
cd management-backend
docker-compose up -d
# 我这里为了防止后面端口冲突修改了端口
# 添加一个mysql端口
    ports:
      - "3306:3306"
  cm_mgmt_server:
    ports:
      - "9998:9999"
  cm_mgmt_web:
    ports:
      - "9997:80"

启动成功后,浏览器访问loaclhost即可,如果发现启动过程中有端口被占用的情况,请修改docker-compose.yml文件中的端口

http://192.168.88.135:9997

账号:admin

密码:a123456

image-20220119171206490

登录后什么也没有,需要导入节点证书

按照官网操作

4.3 导入已有链

如果您已经有正在运行中的链,可将之导入到本管理台进行管理,主要流程如下

1、需要在证书管理先将该链上的某一组织、节点、用户证书导入到本管理台。

2、在区块链管理模块,使用所导入的组织、节点、用户信息订阅链。

3、订阅成功后,您可以通过所配置的节点与链建立联系,并且支持在管理台上部署管理合约,发送交易,通过浏览器查看链上信息

4.4 导入证书

# 把/data/chainmaker-go/build/crypto-config证书目录拷贝下来
# 上传
# 组织ID写chainmaker.yml文件内
org_id:            wx-org.chainmaker.org

导入组织证书

image-20220119171950893

导入节点证书,两个使用那个都可以

image-20220120141953746

image-20220119172612684

导入用户证书

image-20220119172808676

4.5 订阅区块链

选择区块链管理-订阅区块链

image-20220119173013328

image-20220119173036362

image-20220119173115339

上面合约为前面部署的合约

image-20220119173237745

下图区块信息为上面做的操作

使用合约进行交易

因为没有方法不能交易,所以添加方法

image-20220119173514083

添加三个值

方法:save

key:file_hash,file_name,time

添加的为官方合约定义的方法

4.6 发起上链交易

file_hash:ab3456df5799b87c77e7f88

file_name:chainmaker

time:6543234 时间戳

使用的是官网的值

image-20220119174119983

image-20220119174426462

image-20220119174445898

image-20220119174539993

5、多节点部署(docker)

环境依赖

环境依赖

测试机器

192.168.88.138

2C 2G 30G

软件依赖

软件依赖

注:如有操作过程问题请参考常见问题!!!

5.1 源码下载

长安链官网下载源码:https://git.chainmaker.org.cn/chainmaker/chainmaker-go

各版本源码下载地址

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

当前为私有仓库,需要先进行账号注册

  • 下载chainmaker源码到本地,部署不通版本更改版本号即可v2.0.0
git clone -b v2.0.0 https://git.chainmaker.org.cn/chainmaker/chainmaker-go.git
# 输入账号
# 下载证书生成工具源码到本地
git clone -b v2.0.0 https://git.chainmaker.org.cn/chainmaker/chainmaker-cryptogen.git

5.2 源码编译

  • 编译证书生成工具
cd chainmaker-cryptogen
make
# 等待编译完成
go: downloading github.com/spf13/cobra v1.1.1
go: downloading github.com/spf13/viper v1.7.0
go: downloading chainmaker.org/chainmaker/common/v2 v2.0.0
.....
chainmaker-cryptogen/
chainmaker-cryptogen/bin/
chainmaker-cryptogen/bin/chainmaker-cryptogen
chainmaker-cryptogen/config/
chainmaker-cryptogen/config/crypto_config_template.yml

5.3 证书及配置文件生成

  • 将编译好的chainmaker-cryptogen,软连接到chainmaker-go/tools目录
# 进入工具目录
cd ../chainmaker-go/tools/

# 软连接chainmaker-cryptogen到tools目录下
ln -s ../../chainmaker-cryptogen/ .
  • 进入chainmaker-go/scripts目录,执行prepare.sh脚本生成单链4节点集群配置,存于路径chainmaker-go/build

    prepare.sh脚本支持生成solo模式节点证书和配置,以及4/7/10/13/16节点的证书和配置

# 进入脚本目录
cd ../scripts

# 查看脚本帮助
./prepare.sh -h
invalid params
Usage:  
  prepare.sh node_cnt(1/4/7/10/13/16) chain_cnt(1-4) p2p_port(default:11301) rpc_port(default:12301)
    eg1: prepare.sh 4 1
    eg2: prepare.sh 4 1 11301 12301

# 如果需要修改证书的类型和组织的数量请按照文档操作https://docs.chainmaker.org.cn/dev/%E8%AF%81%E4%B9%A6%E7%94%9F%E6%88%90%E5%B7%A5%E5%85%B7.html#id4
# 我这里为默认
# 生成单链4节点集群的证书和配置,需要几个节点写几个
./prepare.sh 4 1
# 生成的节点配置及证书在build文件下
  • 关于自动生成的端口说明

通过prepare.sh脚本生成的配置,默认是在单台服务器上部署,故自动生成的端口号,是从一个起始端口号开始依次递增,可以通过命令行参数修改起始端口号。

主要有2个端口,p2p端口(用于节点互联)和rpc端口(用于客户端与节点通信),p2p起始端口为11301rpc起始端口为12301

如果生成4个节点的配置,p2p端口分别为:11301、11302、11303、11304rpc端口分别为:12301、12302、12303、12304

如果是在多机部署,希望生成固定的端口号,请参考:【多机部署】

5.4 启动节点

# 进入到节点目录下
cd ../build/config
pwd
/data/chainmaker-go/build/config
ll
总用量 0
drwxr-xr-x. 4 root root 75 120 15:32 node1
drwxr-xr-x. 4 root root 75 120 15:32 node2
drwxr-xr-x. 4 root root 75 120 15:32 node3
drwxr-xr-x. 4 root root 75 120 15:32 node4

# 因为前面chain ID为 chain1 所以在这里需要改动四个节点的chain ID
# 修改 chainmaker.yml文件
blockchain:
  - chainId: chain2
  
  
  seeds: # 修改127.0.0.1为机器IP,如果为不同机器就写不同机器IP,具体可以看官方多机部署那一块
    - "/ip4/192.168.88.138/tcp/11301/p2p/Qmb7qWamtRFqDbZMyiYVVtzEJfLAuLVwyTh1ZWs3MWeBU5"
    - "/ip4/192.168.88.138/tcp/11302/p2p/QmWPKakMjzUWjYEZP9KerjZJcN9smaZQJLokBxLby9b2F8"
    - "/ip4/192.168.88.138/tcp/11303/p2p/QmezXTxgWhqBbgJELLtY9RL3ZsFsWuyWAKwRnh1uqT8zKo"
    - "/ip4/192.168.88.138/tcp/11304/p2p/QmUArvyxZGUC5k5HVG5HeyvCZqZj5YVF3HGCUm2xwiVKZ4"

# node1/chainconfig/bc1.yml文件
chain_id: chain2    # 链标识


# node1
docker run -d --name chainmaker1 --restart=always \
-p 11301:11301 -p 12301:12301 \
-v /data/chainmaker-go/build/config/node1:/chainmaker-go/config/wx-org1.chainmaker.org \
-v /data/chainmaker/node1_data:/chainmaker-go/data \
-v /data/chainmaker/node1_data/logs:/chainmaker-go/log \
chainmakerofficial/chainmaker:v2.0.0 \
/chainmaker-go/bin/chainmaker start -c /chainmaker-go/config/wx-org1.chainmaker.org/chainmaker.yml

# node2
docker run -d --name chainmaker2 --restart=always \
-p 11302:11302 -p 12302:12302 \
-v /data/chainmaker-go/build/config/node2:/chainmaker-go/config/wx-org2.chainmaker.org \
-v /data/chainmaker/node2_data:/chainmaker-go/data \
-v /data/chainmaker/node2_data/logs:/chainmaker-go/log \
chainmakerofficial/chainmaker:v2.0.0 \
/chainmaker-go/bin/chainmaker start -c /chainmaker-go/config/wx-org2.chainmaker.org/chainmaker.yml

# node3
docker run -d --name chainmaker3 --restart=always \
-p 11303:11303 -p 12303:12303 \
-v /data/chainmaker-go/build/config/node3:/chainmaker-go/config/wx-org3.chainmaker.org \
-v /data/chainmaker/node3_data:/chainmaker-go/data \
-v /data/chainmaker/node3_data/logs:/chainmaker-go/log \
chainmakerofficial/chainmaker:v2.0.0 \
/chainmaker-go/bin/chainmaker start -c /chainmaker-go/config/wx-org3.chainmaker.org/chainmaker.yml

# node4
docker run -d --name chainmaker4 --restart=always \
-p 11304:11304 -p 12304:12304 \
-v /data/chainmaker-go/build/config/node4:/chainmaker-go/config/wx-org4.chainmaker.org \
-v /data/chainmaker/node4_data:/chainmaker-go/data \
-v /data/chainmaker/node4_data/logs:/chainmaker-go/log \
chainmakerofficial/chainmaker:v2.0.0 \
/chainmaker-go/bin/chainmaker start -c /chainmaker-go/config/wx-org4.chainmaker.org/chainmaker.yml

# 查看节点node1的日志,可以看到成功启动了,节点也在加入
tail -1000f /data/chainmaker/node1_data/logs/system.log
# 查看put block 为0
tail -1000f /data/chainmaker/node1_data/logs/system.log |grep put

image-20220120170358090

image-20220120170501980

5.4 智能合约示例

见官方文档

拉取合约环境镜像

# 上面的单节点为另一台机器的合约,新的机器不能和合约冲突,所以重新生成一个官方合约示例
# 拉取镜像
docker pull chainmakerofficial/chainmaker-go-contract:2.0.0
docker images
# 运行镜像
docker run -d --name chainmaker-go-contract -v /data/chainmaker-go-contract/:/home chainmakerofficial/chainmaker-go-contract:2.0.0 bash -c "while true; do echo hello chainmaker; sleep 5;done"

# 查看日志,5秒打印一行日志
docker logs -f chainmaker-go-contract
hello chainmaker
hello chainmaker
hello chainmaker
hello chainmaker

5.5 编译合约

进入容器内部
docker exec -it chainmaker-go-contract bash
cd /home/
tar xvf /data/contract_go_template.tar.gz	# 解压缩合约SDK源码
cd contract_tinygo
sh build.sh		# 编译main.go合约
# 生成合约的字节码文件在
/home/contract_tinygo/chainmaker-contract-go.wasm
# 本机在/data/chainmaker-go-contract/目录下
# 下载下来,用这个合约在咱上面部署的长安链管理台里面部署合约,不使用cmc命令做操作了。想使用的可以看上面部署合约部分,下面的都会在管理台操作。

5.6 导入证书

# 组织ID查看每个配置文件chainmaker.yml
org_id:            wx-org1.chainmaker.org
org_id:            wx-org2.chainmaker.org
org_id:            wx-org3.chainmaker.org
org_id:            wx-org4.chainmaker.org
# 组织名称,使用同一个组织
org1
org2
org3
org4

导入节点的证书即可,如果导入失败请去数据库删除。

导入chainmaker1的ca证书

image-20220126160647277

导入chainmaker1的节点证书

image-20220126160932504

导入chainmaker1的用户证书

image-20220126161139998

后边相同的方法导入chainmaker2、chainmaker3、chainmaker4节点的证书

导入完毕结果

image-20220126162515885

image-20220126162549043

image-20220126162557716

5.7 订阅区块链

选择保存即可

image-20220126162626792

image-20220126162647686

5.8 部署合约

选择区块链管理-chain2-合约管理-部署合约

image-20220126163210528

image-20220126163245967

需要去投票通过才能使用

image-20220126163304870

image-20220126163431897

image-20220126163512991

image-20220126163850947

投票成功,也可以使用cmc部署合约(官网说明投票规则为Majority,大于50%投票就生效,就会通过,不需要全部参与投票)

修改成共识节点后,可以看到节点信息,我猜测需要修改node_id为chainmaker.yml中 node.cert_file证书对应的nodeid为同步节点的nodeid,修改完全部对应的nodeid之后导入同步节点会正常出现同步节点,后边会实验。

同步节点nodeid路径:certs/node/common1/common1.nodeid

共识节点nodeid路径:certs/node/consensus1/consensus1.nodeid

image-20220127090952567

image-20220127091026829

证书详解

5.9 cmc部署合约

cd /data/chainmaker-go/tools/cmc
go build
go: downloading chainmaker.org/chainmaker/pb-go/v2 v2.0.0
....

#使用chainmaker-cryptogen生成的测试链的证书,软连接过来
cd testdata/
ln -s ../../../build/crypto-config .
# 修改vim sdk_config.yml
# 链ID
  chain_id: "chain2"
  nodes:
    - # 节点地址,格式为:IP:端口:连接数
      node_addr: "192.168.88.138:12301"


# 部署合约
./cmc client contract user create \
--contract-name=chain_002 \
--runtime-type=GASM \
--byte-code-path=/data/chainmaker/chainmaker-go-v2.0.0/tools/cmc/chainmaker-contract-go.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,./testdata/crypto-config/wx-org4.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,./testdata/crypto-config/wx-org4.chainmaker.org/user/admin1/admin1.tls.crt \
--sync-result=true \
--params="{}"

image-20220120175610311

image-20220120175630337

到管理后台查看合约

image-20220120175704071

5.10 发起上链交易

添加方法,继续沿用上面单节点方法

添加三个值

方法:save

key:file_hash,file_name,time

image-20220120180148553

file_hash:ab3456df5799b87c77e7f88

file_name:chainmaker1

time:6543234 时间戳

image-20220120180208295

6、区块链浏览器

官网文档

环境依赖

docker版本为20.10.7或以上 docker-compose版本为1.29.2或以上

下载地址:

  • https://docs.docker.com/engine/install/
  • https://docs.docker.com/compose/install/

若已安装,请通过命令查看版本:

docker -v
Docker version 20.10.12, build e91ed57
docker-compose -v
Docker Compose version v2.2.2

6.1 浏览器部署

前置环境

浏览器部署需要依赖一个ChainMaker运行环境。具体的ChainMaker环境安装部署请参考对应的文档《快速入门》

6.2 代码下载

下载地址: https://git.chainmaker.org.cn/chainmaker/chainmaker-explorer

代码版本:v2.1.0

# 下载代码:
git clone https://git.chainmaker.org.cn/chainmaker/chainmaker-explorer.git

6.3 配置调整

浏览器配置文件:它的配置内容包括四部分,以下是详细说明:

# 修改docker-compose.yml
# 添加mysql映射端口
    ports:
      - "3306:3306"
# 修改端口,防止端口冲突
  cm_mgmt_web:
      ports:
        - "8887:8080"
        
        
# configs/config.yml
web:
  address:  0.0.0.0
  port:     9999
  cross_domain:     true

node:
  #  链和节点更新时间
  update_time: 30
  #  节点断开连接时间和新增链时间
  sync_time:   30


db:
  host: 192.168.88.138
  port: 3306
  database: chainmaker_explorer_dev
  user:   chainmaker
  passwd: Baec&chainmaker

image-20220120113450043

image-20220120180926539

6.4 启动运行

修改完config.yml文件后,启动容器,命令如下执行

docker-compose up -d
# 等待拉取镜像并启动

访问:http://192.168.88.135:8887

image-20220120115047932

6.5 订阅单节点链

填写信息上面的单节点的信息以及上传证书

ca.crt admin1.sign.crt admin1.sign.key

image-20220121092147125

image-20220120115440684

image-20220120115448311

6.6 订阅多节点

image-20220121092644046

选择订阅

填写完毕就行

image-20220121092832895

image-20220121092905967

如有问题请指正。
如有侵权请联系删除。
共同进步!

猜你喜欢

转载自blog.csdn.net/YourMr/article/details/122721448