长安链部署
长安链·ChainMaker具备自主可控、灵活装配、软硬一体、开源开放的突出特点,由北京微芯研究院、清华大学、北京航空航天大学、腾讯、百度和京东等知名高校、企业共同研发。取名“长安链”,喻意“长治久安、再创辉煌、链接世界”。
长安链作为区块链开源底层软件平台,包涵区块链核心框架、丰富的组件库和工具集,致力于为用户高效、精准地解决差异化区块链实现需求,构建高性能、高可信、高安全的新型数字基础设施,同时也是国内首个自主可控区块链软硬件技术体系。
长安链的应用场景,涵盖供应链金融、碳交易、食品追溯等一系列关乎国计民生的重大领域。
长安链官网地址
长安链·ChainMaker秉承开源开放、共建共享的理念,已开放程序源码。“长安链·ChainMaker”坚持自主研发,秉承开源开放、共建共享的理念,面向大规模节点组网、高交易处理性能、强数据安全隐私等下一代区块链技术需求,融合区块链专用加速芯片硬件和可装配底层软件平台,为构建高性能、高可信、高安全的数字基础设施提供新的解决方案。
并行调度
在提案-验证整体框架下,支持基于DAG的块内交易并行调度提案和并行验证;调度支持确定性调度和随机调度等多种并行调度算法。
广域网络
基于PubSub机制,支持多链隔离下P2P网络的复用与数据隔离; 支持NAT穿透,复杂网络拓扑下的大规模节点组网,支持网络节点动态治理。
多链架构
支持并行多链实现不同参与方间的数据隔离; 可根据场景灵活扩展子链以支持业务和吞吐量的需求。
权限管理
为链上每个操作定义访问权限,支持细粒度权限管理策略; 结合组织、角色等提供灵活的身份权限配置方案。
自主可控
面向世界科技前沿,秉持自主创新原则,汇聚国内顶级工程师和科学家团队,长安链·ChainMaker构建了全球独创的底层技术框架,关键技术模块全部自研,成为国际区块链技术发展的新动能,为国家“新基建”提供自主、可控、安全的区块链数字经济基础设施。独创深度模块化、可装配、高性能并行执行的区块链底层技术架构;
覆盖国产密码算法、基于国密证书的加密通讯和国产CA证书颁发认证机构。
开源开放
自诞生起,长安链践行开源、开放的理念,最大范围联合产、学、研、用各类科研力量,由顶尖高校、知名企业等优势力量共同开发,同时广泛拥抱个人和企业开发者,打造标准规范体系,共建开源开放充满活力的区块链技术生态;
采用友好的开源协议,开放软件源代码,推动多项技术体系标准化,建立标准化下的开发生态。
性能领先
长安链拥有高效并行调度算法、高性能可信安全智能合约执行引擎、流水线共识算法等国际领先的区块链底层技术,具备高并发、低延时、大规模节点组网等先进技术优势,交易吞吐能力可达10万TPS,位居全球领先水平;
支持基于内存的数据系统,提升交易处理性能。
灵活装配
长安链将区块链执行流程标准化、模块化,推进区块链技术从手工作业模式演进到自动装配生产模式,方便用户根据不同的业务需求搭建区块链系统,为技术的规模化应用提供基础;
可插拔、可分离的自主可控核心框架,可快速接入优势底层模块/单一定制化开发模块。
基础术语说明
功能清单说明
编写语言
长安链ChainMaker自v1.0.0版本发布以来经过6个版本的迭代,截止v1.2.4版本中已经支持:
在v1.2.x版本中长安链ChainMaker支持go、java、nodejs的链sdk,支持spv轻节点和跨链;支持合约内执行sql语句,合约支持基于paillier的半同态运算和bulletproofs的范围证明;支持区块链浏览器、CMC命令行工具、CA服务管理、chainmaker-cryptogen证书生成工具等。
至此长安链ChainMaker v1.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颁发的数字证书作为区块链节点或用户的签名证书,从而支持更灵活易用的证书体系。
环境依赖
环境依赖
测试机器
2C 2G 30G
软件依赖
软件依赖
注:如有操作过程问题请参考常见问题!!!
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
# 下载地址
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
# 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
# 下载地址
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
# 如果可用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)
注意: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
从长安链官网下载源码:https://git.chainmaker.org.cn/chainmaker/chainmaker-go
各版本源码下载地址
https://git.chainmaker.org.cn/chainmaker/chainmaker-go/-/tags
当前为私有仓库,需要先进行账号注册
chainmaker
源码到本地,部署不通版本更改版本号即可v2.0.0git 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
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
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
起始端口为11301
,rpc
起始端口为12301
。
如果生成4个节点的配置,p2p
端口分别为:11301、11302、11303、11304
,rpc
端口分别为:12301、12302、12303、12304
如果是在多机部署,希望生成固定的端口号,请参考:【多机部署】
# 这里是一个节点
pwd
/data/chainmaker-go/build/config/node1
[root@localhost node1]# ll
总用量 12
drwxr-xr-x. 5 root root 40 1月 19 15:24 certs
drwxr-xr-x. 2 root root 21 1月 19 15:24 chainconfig
-rw-r--r--. 1 root root 5417 1月 19 15:24 chainmaker.yml
-rw-r--r--. 1 root root 1638 1月 19 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
# 出现此图形为启动成功
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)
见官方文档
# 拉取镜像
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
进入容器内部
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的半同态运算接口实现
官方文档
实际生产系统还是用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
# 由于是单节点,所以要修改客户端证书的路径
# 修改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 只要有读写操作区块高度就会递增
./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=传参数
# 根据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"
下面还有升级合约,冻结合约,解冻合约,吊销合约,交易等
具体操作请看官网说明
下面长安链管理台和区块链浏览器选一即可,也可两个都部署,可以比较差异
本产品定位为供开源社区区块链开发者,区块链产品经理使用,以便在初步接触长安链时,通过本平台可单机快速部署长安链用于产品体验和测试,并对长安链的技术架构,功能模块有一个初步了解。
本产品支持私有化部署,详细部署流程参考安装指南。
版本支持
目前支持长安链v1.2.4
、v2.0.0
、v2.1.0
版本,因长安链1.X版本和2.X版本底层数据结构不同,目前相互之间不兼容。
环境依赖
docker
版本为20.10.7
或以上 docker-compose
版本为1.29.2
或以上
下载地址:
若已安装,请通过命令查看版本:
docker -v
Docker version 20.10.12, build e91ed57
docker-compose -v
Docker Compose version v2.2.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
登录后什么也没有,需要导入节点证书
按照官网操作
如果您已经有正在运行中的链,可将之导入到本管理台进行管理,主要流程如下
1、需要在证书管理先将该链上的某一组织、节点、用户证书导入到本管理台。
2、在区块链管理模块,使用所导入的组织、节点、用户信息订阅链。
3、订阅成功后,您可以通过所配置的节点与链建立联系,并且支持在管理台上部署管理合约,发送交易,通过浏览器查看链上信息
# 把/data/chainmaker-go/build/crypto-config证书目录拷贝下来
# 上传
# 组织ID写chainmaker.yml文件内
org_id: wx-org.chainmaker.org
导入组织证书
导入节点证书,两个使用那个都可以
导入用户证书
选择区块链管理-订阅区块链
上面合约为前面部署的合约
下图区块信息为上面做的操作
使用合约进行交易
因为没有方法不能交易,所以添加方法
添加三个值
方法:save
key:file_hash,file_name,time
添加的为官方合约定义的方法
file_hash:ab3456df5799b87c77e7f88
file_name:chainmaker
time:6543234 时间戳
使用的是官网的值
环境依赖
环境依赖
测试机器
192.168.88.138
2C 2G 30G
软件依赖
软件依赖
注:如有操作过程问题请参考常见问题!!!
从长安链官网下载源码:https://git.chainmaker.org.cn/chainmaker/chainmaker-go
各版本源码下载地址
https://git.chainmaker.org.cn/chainmaker/chainmaker-go/-/tags
当前为私有仓库,需要先进行账号注册
chainmaker
源码到本地,部署不通版本更改版本号即可v2.0.0git 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
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
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
起始端口为11301
,rpc
起始端口为12301
。
如果生成4个节点的配置,p2p
端口分别为:11301、11302、11303、11304
,rpc
端口分别为:12301、12302、12303、12304
如果是在多机部署,希望生成固定的端口号,请参考:【多机部署】
# 进入到节点目录下
cd ../build/config
pwd
/data/chainmaker-go/build/config
ll
总用量 0
drwxr-xr-x. 4 root root 75 1月 20 15:32 node1
drwxr-xr-x. 4 root root 75 1月 20 15:32 node2
drwxr-xr-x. 4 root root 75 1月 20 15:32 node3
drwxr-xr-x. 4 root root 75 1月 20 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
见官方文档
拉取合约环境镜像
# 上面的单节点为另一台机器的合约,新的机器不能和合约冲突,所以重新生成一个官方合约示例
# 拉取镜像
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
进入容器内部
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命令做操作了。想使用的可以看上面部署合约部分,下面的都会在管理台操作。
# 组织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证书
导入chainmaker1的节点证书
导入chainmaker1的用户证书
后边相同的方法导入chainmaker2、chainmaker3、chainmaker4节点的证书
导入完毕结果
选择保存即可
选择区块链管理-chain2-合约管理-部署合约
需要去投票通过才能使用
投票成功,也可以使用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
证书详解
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="{}"
到管理后台查看合约
添加方法,继续沿用上面单节点方法
添加三个值
方法:save
key:file_hash,file_name,time
file_hash:ab3456df5799b87c77e7f88
file_name:chainmaker1
time:6543234 时间戳
官网文档
环境依赖
docker
版本为20.10.7
或以上 docker-compose
版本为1.29.2
或以上
下载地址:
若已安装,请通过命令查看版本:
docker -v
Docker version 20.10.12, build e91ed57
docker-compose -v
Docker Compose version v2.2.2
前置环境
浏览器部署需要依赖一个ChainMaker
运行环境。具体的ChainMaker
环境安装部署请参考对应的文档《快速入门》。
下载地址: https://git.chainmaker.org.cn/chainmaker/chainmaker-explorer
代码版本:v2.1.0
# 下载代码:
git clone https://git.chainmaker.org.cn/chainmaker/chainmaker-explorer.git
浏览器配置文件:它的配置内容包括四部分,以下是详细说明:
# 修改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
修改完config.yml
文件后,启动容器,命令如下执行
docker-compose up -d
# 等待拉取镜像并启动
访问:http://192.168.88.135:8887
填写信息上面的单节点的信息以及上传证书
ca.crt admin1.sign.crt admin1.sign.key
选择订阅
填写完毕就行
如有问题请指正。
如有侵权请联系删除。
共同进步!