如何通过长安链快速部署区块链系统
文章目录
- 长安链从零到一源码部署
- 一、环境及概念
- 1.1、环境依赖
- 1.2、相关概念
- 二、环境安装
- 2.1、配置sudo权限
- 2.2、修改源
- 2.3、安装git
- 2.4、安装golang
- 2.5、安装docker
- 2.6、安装GLIBC_2.18【先不安装,若运行时找不到glibc2.1.8则安装】
- 2.7、安装GCC7.3+【若运行时gcc版本过低则安装】
- 三、单机部署
- 3.1、下载源码
- 3.2、编译证书管理工具
- 3.3、证书及配置文件生成
- 3.4、编译及安装包制作
- 3.5、启动
- 3.6、查看启动情况
- 四、智能合约开发
- 4.1、拉取合约环境镜像
- 4.2、编译合约
- 五、部署合约
- 5.1、编译命令行工具
- 5.2、执行创建合约
- 5.3、执行合约方法
- 5.4、查询合约
- 六、常见问题
- 6.1 编译时错误
- unknown revision v2.0.0
- misssing go.sum entry
- 6.2 启动时错误
- not found GLIBC_2.18
- restart.sh 权限不足
- 6.3 运行时错误
- syscall/js.valueGet not exported
- runtime type error | byte code validation failed
- 返回成功,但实际执行失败
- 6.4 其他关键信息
- 出块标记是什么
- 组网成功标记是什么
- 七、多机部署
- 7.1、多机部署与单机部署区别
- 7.2、单机&多机部署对照表
长安链从零到一源码部署
此处以centos7 chainmaker-v2.3.2 为例
长安链·ChainMaker官方文档:https://docs.chainmaker.org.cn/index.html
长安链·ChainMaker门户网站:https://chainmaker.org.cn/
长安链·ChainMaker仓库地址:https://git.chainmaker.org.cn/
一、环境及概念
1.1、环境依赖
依赖软件以centos为例:
名称 | 用途 |
---|---|
git | 下载源码 https://git.chainmaker.org.cn/explore |
docker | 智能合约编译环境(tinygo/rust/c++/solidity/golang) |
golang | go语言编译环境 |
gcc7.3+ | rust编译依赖 |
具有sudo权限的用户 | 安装依赖 |
1.2、相关概念
名称 | 说明 |
---|---|
区块(Block) | 区块是区块链中存储交易和交易相关的数据的单元,通常由区块头和区块体组成。 |
区块链(Blockchain) | 使用密码技术链接将共识确认过的区块按顺序追加而形成的分布式账本。 |
智能合约(SmartContract) | 以数字形式定义的能够自动执行条款的合约。 |
交易(Transaction) | 也称为事务,区块链上的一次原子性账本数据状态变更及其过程和结果记录。 |
交易哈希(TransactionHash) | 交易上链成功后,产生的唯一哈希值。 |
交易ID(TransactionId) | 交易的唯一ID,可由用户指定。 |
chainmaker可执行文件 | 长安链项目chainmaker-go源码编译后生成的可执行二进制文件 执行make命令后将生成在chainmaker-go/bin目录下 |
长安链SDK(chainmaker sdk) | 用于与长安链交互(发送交易,订阅等)的软件开发工具 |
合约SDK(contract sdk) | 用于开发智能合约的软件开发工具,使编译的wasm文件可与长安链进行交互 |
wasm文件(webassembly file) | 本文指长安链的智能合约编译后生成的文件。 wasm指通过各自符合WebAssembly规范的编译器编译出来的以.wasm结尾的文件。 c++: emmake make rust: wasm-pack build tinygo: tinygo build -no-debug -opt=s -o main.wasm -target wasm |
长安链CA | 指使用长安链配套证书管理工具chainmaker-cryptogen管理的密钥体系 |
二、环境安装
以centos7为例
2.1、配置sudo权限
sudo usermod -G admin -a taifu
2.2、修改源
# 查看源cat /etc/yum.repos.d/CentOS-Base.repo# 备份cd /etc/yum.repos.d/sudo mv CentOS-Base.repo CentOS-Base.repo.bak# 下载阿里源sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo# 清理缓存sudo yum clean all# 生成新的缓存sudo yum makecache
2.3、安装git
sudo yum install git -ygit --version
2.4、安装golang
https://studygolang.com/dl
https://golang.org/doc/install
linux
# 解压缩wget https://go.dev/dl/go1.18.10.linux-amd64.tar.gz # wget https://studygolang.com/dl/golang/go1.18.10.linux-amd64.tar.gzsudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.18.10.linux-amd64.tar.gz # 配置环境变量sudo vim /etc/profileexport PATH=$PATH:/usr/local/go/binexport GOROOT=/usr/local/goexport GOPATH=/home/taifu/goexport GOPROXY=https://goproxy.io,directsource /etc/profile# 查看版本 >=1.16go version
2.5、安装docker
# 查看安装版本docker version# 删除旧版本sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine# 安装工具包sudo yum install -y yum-utils# 添加docker源sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 搜索docker软件列表yum list docker-ce --showduplicates | sort -r# 安装dockersudo yum install -y docker-ce docker-ce-cli containerd.io# 启动sudo systemctl start docker# 设置开机启动sudo systemctl enable docker# 查看开机启动sudo systemctl list-unit-files|grep dockerdocker versionsudo groupadd docker#添加docker用户组sudo gpasswd -a $USER docker#将当前用户添加至docker用户组newgrp docker #更新docker用户组# 命令自动补全sudo yum -y install bash-completion source /etc/profile.d/bash_completion.sh# 安装7zsudo yum install -y zip unzip p7zip p7zip-plugins
2.6、安装GLIBC_2.18【先不安装,若运行时找不到glibc2.1.8则安装】
linux依赖
注意:GLIBC是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc,一旦安装失败系统将不可用,请谨慎操作。此处仅列举一种安装示例(在CentOS Linux release 7.6.1810安装成功),并不一定使用您的系统,请根据您的系统及gcc环境自行选择相应的安装方法。
# 查看GLIBC版本ldd --versionstrings /lib64/libc.so.6 | grep "^GLIBC_"# 进入chainmaker-go/script/3rd安装 在其他分支有,最新分支已移除cd chainmaker-go/script/3rdsh install.sh
2.7、安装GCC7.3+【若运行时gcc版本过低则安装】
通过安装devtoolset-7的方式间接升级为gcc7.x版本
# 查看gcc版本gcc --version# 升级gccyum install centos-release-sclyum install devtoolset-7scl enable devtoolset-7 bashgcc --version
三、单机部署
3.1、下载源码
chainmaker-go官方git仓库:
https://git.chainmaker.org.cn
# 下载源码cd ~/workspacegit clone -b v2.3.2 --depth=1 https://git.chainmaker.org.cn/chainmaker/chainmaker-go.gitgit clone -b v2.3.0 --depth=1 https://git.chainmaker.org.cn/chainmaker/chainmaker-cryptogen.git
3.2、编译证书管理工具
# 编译长安链CA证书管理工具cd chainmaker-cryptogenmake# make 或 go build 没有反应,可以检查下网络和代理
3.3、证书及配置文件生成
# 将证书管理工具软连接关联到tools目录下cd ../chainmaker-go/toolsln -s ../../chainmaker-cryptogen/ .cd ../scriptspwd# 生成节点及证书配置,4个组织1条链,每个组织各1个共识节点# p2p端口号为11301 11302 11303 11304 节点内部通信# grpc端口号为 12301 12302 12303 12304 对外提供服务# 默认共识:tbft默认日志级别:INFO# 0-SOLO,1-TBFT,4-RAFT./prepare.sh 4 1 11301 12301# 查看证书及节点配置tree -L 2 ../build/tree -L 3 ../build/
3.4、编译及安装包制作
# 编译./build_release.sh# 查看tree ../build/release/# 所有的证书及安装包都在# chainamerk-go/build/目录下
3.5、启动
# 启动# 注意,此处为解压缩然后启动,若改了配置文件,那么会被覆盖。我们可以在第一次启动后,备份安装包(*.gz)到其他目录./cluster_quick_start.sh normal# 停止./cluster_quick_stop.sh
3.6、查看启动情况
ps -ef|grep chainmaker | grep -v grepnetstat -lptn | grep "1230\|1130"cat ../build/release/chainmaker-*/bin/panic.logcat ../build/release/chainmaker*/log/system.log|grep "ERROR\|put block\|all necessary"
四、智能合约开发
此处示例为tinygo合约编写,其他语言见官方文档:1. 智能合约
go原生语言 docker-go 合约,也可以采用在线编辑器:https://ide230.chainmaker.org.cn/
4.1、拉取合约环境镜像
# 拉取镜像docker pull chainmakerofficial/chainmaker-go-contract:2.1.0docker images# 运行镜像docker run -d--name chainmaker-go-contract -v ~/workspace/chainmaker-go-contract/:/home chainmakerofficial/chainmaker-go-contract:2.1.0 bash -c "while true; do echo hello world; sleep 5;done"docker run -d--name chainmaker-go-contract -v /data/workspace/chainmaker-go-contract:/home chainmakerofficial/chainmaker-go-contract:2.1.0 bash -c "while true; do echo hello world; sleep 5;done"
4.2、编译合约
# 进入容器内部docker exec -it chainmaker-go-contract bashcd /home/# 解压缩合约SDK源码tar xvf /data/contract_go_template.tar.gzcd contract_tinygo# 编译main.go合约sh build.sh# 生成合约的字节码文件在/home/contract_tinygo/chainmaker-contract-go.wasm
五、部署合约
5.1、编译命令行工具
见官方文档: 命令行工具
实际生产系统还是用SDK方式:SDK
cd ~/workspacegit clone -b v2.3.2 https://git.chainmaker.org.cn/chainmaker/chainmaker-go.gitcd chainmaker-go/tools/cmcgo mod tidygo build#拷贝sdk的配置文件和示例里cmc命令行需要使用的文件cp -r ~/workspace/chainmaker-go/build/crypto-config/ ./testdata
5.2、执行创建合约
# --byte-code-path 可以是一个 wasm文件,也可以是一个go语言的docker-go虚拟机引擎的7z文件./cmc client contract user create \--contract-name=fact \--runtime-type=WASMER \--byte-code-path=./testdata/claim-wasm-demo/rust-fact-2.0.0.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="{}"
5.3、执行合约方法
./cmc client contract user invoke \--contract-name=fact \--method=save \--sdk-conf-path=./testdata/sdk_config.yml \--params="{\"file_name\":\"name007\",\"file_hash\":\"ab3456df5799b87c77e7f88\",\"time\":\"6543234\"}" \--sync-result=true
5.4、查询合约
./cmc client contract user get \--contract-name=fact \--method=find_by_file_hash \--sdk-conf-path=./testdata/sdk_config.yml \--params="{\"file_hash\":\"ab3456df5799b87c77e7f88\"}"
六、常见问题
此处介绍部署、运行可能遇到的常见问题
6.1 编译时错误
编译chainmaker-go及chainmaker-cryptogen时可能出现的错误
unknown revision v2.0.0
Q:
go: chainmaker.org/chainmaker/pb-go@v2.0.0+incompatible: reading chainmaker.org/chainmker/pb-go/go.mod at revision v2.0.0: unknown revision v2.0.0
go: chainmaker.org/chainmaker/common@v2.0.0+incompatible: reading chainmaker.org/chainmker/common/go.mod at revision v2.0.0: unknown revision v2.0.0
go: chainmaker.org/chainmaker/protocol@v2.0.0+incompatible: reading chainmaker.org/chainmker/protocol/go.mod at revision v2.0.0: unknown revision v2.0.0
A:
原因:chainmaker.org域名可能记录为其他主机地址了,删除~/.ssh/known_hosts文件
重试即可
misssing go.sum entry
Q:
如果执行 ./build_release.sh 时或者在启动时报错:misssing go.sum entry: to add it,分别在 chainmaker-go chainmaker-go/tools/cmc 下执行 go mod tidy,执行完后再重试
A:
原因:go1.16 版本 执行go build时会自动下载依赖,会更新mod文档,在go 1.16版本这一行为被禁止了。想要安装、更新依赖只能使用go get, go mod download, go mod tidy等命令,go build和go test将不会再做这类工作。
在go1.16版本中,想要自动更新依赖可以使用 go build -mod=mod,
进入对应go.mod
文件所在目录执行go mod download
# chainmaker-go项目cdchainmaker-go/maingo mod downloadcdchainmaker-go/commongo mod downloadcdchainmaker-go/tools/cmcgo mod download# # chainmaker-cryptogen项目cdchainmaker-cryptogen/srcgo mod download
6.2 启动时错误
not found GLIBC_2.18
Q:
若出现错误
./chainmaker: /lib64/libc.so.6: version
GLIBC_2.18’ not found (required by /root/git-code/chainmaker-go/module/vm/wasmer/wasmer-go/libwasmer.so)`
A:
在linux下可进入chainmaker-go/scripts/3rd目录安装glibc-2.18.tar.gz依赖
# 注:此操作为安装替换GCC版本,请慎重操作。一旦出错系统将不可用。cd scripts/3rdsh install.sh
restart.sh 权限不足
Q:
[root@localhost scripts]# ./cluster_quick_start.sh normal ===> Staring chainmaker cluster START ==> /home/wx/chainmaker/chainmaker-go/build/release/chainmaker-v2.0.0-wx-org1.chainmaker.org ./cluster_quick_start.sh: line 51: ./restart.sh: Permission denied
A:
如果启动时出现restart.sh 权限不足问题,给restart.sh 增加执行权限
给项目源文件添加执行权限
cd chainmaker-go/script/binchmod +x *.sh
给部署文件添加执行权限
# 进入四个节点的bin目录下 执行下面命令(以第一个节点 org1 为例)cd chainmaker-go/build/release/chainmaker-V2.0.0-wx-org1.chainmaker.org/binchmod +x *.sh
6.3 运行时错误
syscall/js.valueGet not exported
Q:
执行gasm合约时报错:resolve imports: syscall/js.valueGet not exported in module env
A:
tinygo不支持fmt等函数
runtime type error | byte code validation failed
Q:
发送交易成功,但链打印错误信息:contract invoke failed, runtime type error, expect rust:[2], but got 4。同时根据该交易id查询到交易错误信息。
failed to create vm runtime, contract: contract_test, [contract_test], byte code validation failed
A:
执行交易时异步的(查询类交易除外),返回的状态为链成功接收到交易的状态。执行合约是,runtimeType选择错误,需要根据自己的合约语言选择对应的runtimeType。
byte code validation failed:可能原因:1、运行类型错误;2、wasm文件损坏;3、wasm文件非官网指定渠道编译
语言 | 类型 |
---|---|
系统合约 | RuntimeType_NATIVE = 1 |
rust | RuntimeType_WASMER = 2 |
c++ | RuntimeType_WXVM = 3 |
tinygo | RuntimeType_GASM = 4 |
solidity | RuntimeType_EVM = 5 |
golang | RuntimeType_DOCKER_GO = 6 |
返回成功,但实际执行失败
Q:
使用sdk执行安装、调用合约时,SDK 返回message为ok,但链和交易显示执行失败
A:
交易的执行是异步的。SDK返回的成功信息指的是链成功接收到该交易。
获取查看交易实际结果的方式:
- 根据txId查询该交易,解析出结果。
- 使用SDK是选择同步发送交易,等待执行结果。
6.4 其他关键信息
出块标记是什么
进入log目录,查看日志文件 筛选
put block
即可
cat system.log|grep "ERROR\|put block"
其中一行解释如下:
2021-11-04 15:55:06.351 [INFO] [Storage] @chain1 blockstore_impl.go:363 chain[chain1]: put block[1] (txs:1 bytes:15946), time used (mashal:0, log:1, blockdb:0, statedb:0, historydb:0, resultdb:0, contractdb:0, batchChan:0, total:1)
时间 [日志级别] [模块] @链名称 文件名.go:行数 链chain[链名称]:put block[区块高度](txs:交易个数 bytes:区块大小), 使用时间毫秒(mashal:0, log:1, blockdb:0, statedb:0, historydb:0, resultdb:0, contractdb:0, batchChan:0, total:1)
组网成功标记是什么
组网成功后,即可发送交易。此时接收到的交易将进入到交易池当中,并且会广播给网络的每一个节点(共识、同步节点、轻节点),随后等待共识成功选举leader开始打包区块。
启动成功日志:init blockchain[chain1] success
多节点时,组网成日志:all necessary peers connected
SOLO共识
cat system.log|grep "init blockchain\[chain1\] success"
其他多节点共识
cat system.log|grep "init blockchain\[chain1\] success\|all necessary peers connected"
七、多机部署
7.1、多机部署与单机部署区别
1、执行prepare.sh之前需要修改
配置指定端口(可不改)
配置指定IP
2、./prepare.sh
3、./build_release.sh
4、后续上传各节点安装包,到指定的服务器上,部署解压后使用。
5、进入解压文件夹 bin目录,执行 ./restart.sh
如果需要配置自拉起方式启动,请参考:【自拉起服务】
- 配置指定端口
配置文件路径:
chainmaker-go/config/config_tpl/chainmaker.yml
使用prepare.sh
脚本会自动生成端口号,如果实际环境需要固定端口,可以通过修改下面的配置,将{xxx}
修改为指定的端口,后续执行脚本时,就不会进行端口的修改。
rpc: port: {rpc_port}net: listen_addr: /ip4/0.0.0.0/tcp/{net_port}
- 配置指定IP
配置文件路径:
chainmaker-go/config/config_tpl/bc_xxx.yml
,xxx
是节点数,根据需要,选择特定节点数的模板。
将127.0.0.1
修改为集群各个节点实际所在机器的IP地址。也可使用域名
#共识配置consensus:# 共识类型(0-SOLO,1-TBFT,2-MBFT,3-HOTSTUFF,4-RAFT,10-POW)type: {consensus_type}# 共识节点列表,组织必须出现在trust_roots的org_id中,每个组织可配置多个共识节点,节点地址采用libp2p格式nodes:- org_id: "{org1_id}"address:- "/ip4/127.0.0.1/tcp/{org1_port}/p2p/{org1_peerid}"- org_id: "{org2_id}"address:- "/ip4/127.0.0.1/tcp/{org2_port}/p2p/{org2_peerid}"- org_id: "{org3_id}"address:- "/ip4/127.0.0.1/tcp/{org3_port}/p2p/{org3_peerid}"- org_id: "{org4_id}"address:- "/ip4/127.0.0.1/tcp/{org4_port}/p2p/{org4_peerid}"
7.2、单机&多机部署对照表
操作 | 单机 | 多机 |
---|---|---|
同步时间 | / | 手动同步时间,不需要太精确1分钟以内 |
下载源码 | git clone xxx-chainmaer-go git clone xxx-chainmaker-cryptogen | 一致 |
编译证书工具 | cd chainmaker-cryptogen make cd chainmaker-go/tools ln -s …/…/chainmaker-cryptogen/ . | 一致 |
进入脚本目录 | cd chainmaker-go/scripts | 一致 |
生成证书 | ./prepare.sh | chainmaker-go/config/config_tpl/chainmaker.yml 配置指定端口 chainmaker-go/config/config_tpl/bc_xxx.yml 配置指定IP ./prepare.sh |
生成节点安装包 | ./build_release.sh | 一致 |
启动节点 | ./cluster_quick_start.sh normal | 上传chainmaker-xxxx-x86_64.tar.gz到各自服务器 解压缩 进入到chainmaker-xxxx/bin目录 sh restart.sh |