3. 区块链浏览器
3.1. 版本记录
是:需要使用新的数据库重新订阅,以确保获取最新的数据和功能。
否:不需要更改数据库,现有数据库可以继续使用。
| 版本号 | 修改点 | 更新数据库 |
|---|---|---|
| v4.0.0 | - 前端:前端页面全部改版,UI / 交互 / 视觉风格全面升级。 - 后端:订阅模块重构,引入双订阅架构(实时订阅 + 延迟订阅):实时处理保持原订阅链路不变;延迟处理(历史区块同步)显著加快历史数据同步速度。 - 不兼容升级:本版本不支持平滑升级,必须重新部署浏览器并重新订阅所有链。 |
是 |
| v2.3.9 | - 主子链:新增同步模式。 - 跨链交易列表:修改跨链交易列表字段,增加模式字段,同步交易数,链名称修改为链id。 - 子链列表:子链列表调整为链列表显示子链+主链,去掉链名称。 - 跨链交易详情:增加同步模式交易详情页 - 子链详情:链名称调整为链id - 区块详情:增加交易依赖关系图 - 合约验证:go合约验证支持开源ide编译:https://ide230.chainmaker.org.cn - dquery-backend服务:优化数据库连接,优化替换源数据后需要重创建任务的问题 |
是 |
| v2.3.8 | - 合约列表:增加合约类型检索。 - 新增跨合约调用功能:显示合约直接的相互调用关系和合约方法调用合约的关系。 - 新增统计合约调用频率:增加合约调用频率列表,支持时间,合约检索。 - 新增api数据解析功能:按照给出的abi示例文件上传合约abi文件,系统根据abi文件继续合约事件数据,并且支持解析数据检索功能。 - 数据看板:新增合约频率统计看板 |
是 |
| v2.3.7 | - 合约验证功能优化:增加dockerGo合约验证功能,注意compiler服务配置的docker_go_ide_url要和部署的合约是在同一个地址下编译的才支持验证。 - 新增did数据解析功能:解析did相关数据。 - 新增多个图表查询:支持多种图表展示。 - 链账户优化:更加精准统计链上相关账户信息。 - 自定义查询优化:增加暂停查询功能,临时释放资源。 增加临时表功能,支持基于临时表数据二次解析 |
是 |
| v2.3.6 | - 合约详情页优化:增加交易列表的复杂查询功能,支持在海量数据下进行复杂查询(注意:性能可能较低)。 - 交易详情页改进:增加读写集合约名称的展示,提升用户理解;优化跨合约名称的展示,便于查看相关信息。 - 节点列表功能增强:支持全量节点的展示,提供更全面的网络节点情况;新增节点与区块的映射查询功能。 - EVM合约验证功能:新增EVM合约的验证功能,增强合约安全性。 - 统计功能优化:优化交易数量和事件数量的统计功能,提供更准确的数据反馈。 |
是 |
| v2.3.5 | XXXX | 否 |
3.2. 概述
区块链浏览器项目致力于提供高效、全面的区块链数据展示与交互能力,支持主链与子链的多链架构需求。通过创新的技术架构设计与功能优化,项目能够精准呈现区块、交易、流转、持仓等多维度数据,并支持多种主流合约解析,包括ERC20、ERC721、DockerGo合约、存证合约、身份认证合约及数据资产合约等,进一步增强用户的交互体验。同时,浏览器还提供链上合约验证与源码查看功能,为区块链开发与透明性提供了强有力的支持。
该浏览器主要由前端、后端及数据库三部分组成。数据库支持mysql, pgsql,人大金仓,clickhouse等,后端使用Go语言开发,前端则基于React框架,确保系统的高效性与可扩展性。
浏览器采用前后端分离部署模式:后端(chainmaker-explorer-backend)、前端(chainmaker-explorer)、自主查询服务(dquery-backend)和合约编译服务(contract-compiler-service)分别由独立仓库维护和发布,配套的 docker-compose 编排、自带数据库 / Redis 等依赖统一放在前端仓库的 docker/ 目录。v4.0.0 起,订阅模块升级为双订阅架构(实时订阅 + 延迟订阅):实时处理保持原订阅链路不变,延迟处理(历史区块同步)由原来的 RPC 拉取改造为基于订阅数据的批量处理,显著加快了历史数据同步速度。
3.3. 安装指南
3.3.1. 常见问题速查(FAQ)
在开始部署之前,请先了解以下常见问题:
| 问题 | 答案 |
|---|---|
| 需要单独安装MySQL吗? | ❌ 不需要。Docker一键启动脚本已包含MySQL容器,会自动创建数据库 |
| 需要单独安装Redis吗? | ❌ 不需要。Docker一键启动脚本已包含Redis容器 |
| 需要单独安装Nginx吗? | ❌ 不需要。前端服务容器内置了Nginx |
| 只想查看数据,不验证合约可以吗? | ✅ 可以。合约编译服务(cm_compiler_server)仅用于合约验证功能,不使用该功能时可以忽略 |
| 有多个config.yml,以哪个为准? | 每个服务有独立的config.yml,互不影响,详见下方说明 |
3.3.2. 架构说明(必读)
区块链浏览器采用 Docker 一键部署,所有服务都已容器化,无需单独安装任何依赖。
┌─────────────────────────────────────────────────────────────────┐
│ Docker 容器组(一键启动) │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│ │ MySQL │ │ Redis │ │ 前端服务 (内置Nginx) │ │
│ │ (数据库) │ │ (缓存) │ │ 端口: 9996 │ │
│ │ 端口: 33061 │ │ │ └──────────────────────┘ │
│ └──────────────┘ └──────────────┘ │
│ │
│ ┌──────────────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ 浏览器后端服务 │ │ 自主查询服务 │ │ 合约编译服务 │ │
│ │(cm_explorer_server)│ │(cm_dquery) │ │ (可选,仅合约验证)│ │
│ └──────────────────┘ └──────────────┘ └──────────────────────┘│
└─────────────────────────────────────────────────────────────────┘
配置文件说明(各服务独立配置,互不干扰):
| 配置文件路径 | 所属服务 | 主要用途 |
|---|---|---|
cm_explorer_server/config.yml |
浏览器后端服务 | 核心配置:订阅链信息、数据库连接、节点地址等 |
cm_dquery/config.yml |
自主查询服务 | SQL查询功能配置 |
cm_compiler/config.yml |
合约编译服务 | 合约验证功能配置(可选) |
cm_explorer_web/_config.json |
前端服务 | 前端功能开关配置 |
💡 重点提示:大多数用户只需要修改
cm_explorer_server/config.yml中的链节点地址和证书路径即可!
3.3.3. 环境依赖
唯一依赖:Docker 和 Docker Compose
docker版本为20.10.7或以上
# 以centos7为例,其他安装方式见下方官网
$ 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
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
docker-compose版本为1.29.2或以上
# 以centos7为例,其他安装方式见下方官网
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
下载地址:
若已安装,请通过命令查看版本:
$ docker -v
$ docker-compose -v
3.3.4. 浏览器部署(详细步骤)
3.3.4.1. 前置条件
浏览器部署需要依赖一个已运行的 ChainMaker 区块链网络。具体的 ChainMaker 环境安装部署请参考对应的文档通过命令行体验链。
⚠️ 确保您的区块链节点已经正常运行,否则浏览器将无法订阅数据!
代码版本:v4.0.0
3.3.4.2. 第一步:下载浏览器代码
$ git clone -b v4.0.0 --depth=1 https://git.chainmaker.org.cn/chainmaker/chainmaker-explorer.git
# 进入docker目录
$ cd chainmaker-explorer/docker
下载完成后,目录结构如下:
chainmaker-explorer/docker/
├── docker-compose.yml # Docker编排文件(一键启动所有服务)
├── restart.sh # 重启脚本
├── cm_explorer_server/ # 浏览器后端配置目录
│ ├── config.yml # ⭐ 核心配置文件(建议修改管理员密码)
│ ├── crypto-config/ # 证书目录(仅"配置文件订阅"方式需要)
│ └── log/ # 日志目录
├── cm_dquery/ # 自主查询服务配置目录
│ └── config.yml # 查询服务配置
├── cm_compiler/ # 合约编译服务配置目录
│ └── config.yml # 编译服务配置
└── cm_explorer_web/ # 前端服务配置目录
├── default.conf # Nginx配置
├── _config.json # 前端功能开关
└── assets/ # 静态资源(可替换logo等)
3.3.4.3. 相关仓库源码地址
浏览器由以下三个仓库协同构成,部署时只需下载上面 chainmaker-explorer 仓库即可,docker/ 目录下的编排文件会自动拉取其它两个服务的官方镜像;下方地址仅供需要二次开发 / 调试源码的同学参考:
| 仓库 | 说明 | 地址 | 最新版本 |
|---|---|---|---|
chainmaker-explorer |
浏览器后端 + docker-compose 编排 + 图表初始化脚本 | https://git.chainmaker.org.cn/chainmaker/chainmaker-explorer | v4.0.0 |
chainmaker-explorer-backend |
浏览器前端 | https://git.chainmaker.org.cn/19132027458/chainmaker-explorer-web | v4.0.0 |
dquery-backend |
自主查询服务(图表数据查询 / 自定义 SQL) | https://git.chainmaker.org.cn/chainmaker/dquery-backend | v2.3.9 |
contract-compiler-service |
合约编译服务(合约验证) | https://git.chainmaker.org.cn/chainmaker/contract-compiler-service | v2.3.9 |
3.3.4.4. 启动运行
提示: 若以前启动过浏览器则需要将以前数据清除, 可以使用
docker-compose -f docker-compose.yml down -v
3.3.4.4.1. 启动docker
cd chainmaker-explorer/docker
# 常规启动(快速)----如果没有特殊情况,配置文件基本不需要更改
docker-compose -f docker-compose.yml up -d
# PostgreSQL(人大金仓)版本
# docker-compose -f docker-compose-pgsql.yml up -d
# ARM 架构版本
# docker-compose -f docker-compose-arm.yml up -d
3.3.4.5. 第二步:配置订阅链信息
浏览器支持 两种订阅方式,请根据您的需求选择:
| 方式 | 适用场景 | 操作难度 | 是否需要修改配置文件 |
|---|---|---|---|
| 方式A:页面订阅(推荐新手) | 快速体验、临时订阅 | ⭐ 简单 | ❌ 不需要 |
| 方式B:配置文件订阅 | 生产环境、固定订阅 | ⭐⭐ 中等 | ✅ 需要 |
3.3.4.5.1. 方式A:页面订阅(推荐新手)✅
💡 最简单的方式:直接启动浏览器,然后在页面上添加链订阅,无需修改任何配置文件!
此方式下,您只需修改管理员密码即可:
编辑 cm_explorer_server/config.yml:
web:
admin_password: passw0rd # 改成您自己的密码(用于登录浏览器后台)
不需要修改的配置:
❌ 不需要配置
chains:部分❌ 不需要复制证书到
crypto-config/目录
配置修改完成后,可直接跳到 第三步:一键启动所有服务 启动浏览器,然后在浏览器页面上进行链的订阅操作。
页面订阅操作步骤:
启动浏览器后,访问 http://localhost:9996
登录管理员账号(密码:您设置的admin_password)
进入「链管理」或「订阅管理」页面
点击「添加链」,填写链信息(链ID、节点地址等)
上传用户证书文件(通过页面上传,无需手动复制)
点击「订阅」即可
3.3.4.5.2. 方式B:配置文件订阅
💡 适用于生产环境:预先配置好链信息,浏览器启动后自动订阅。
3.3.4.5.2.1. B.1 复制链的证书文件
将您的 ChainMaker 链的用户证书复制到 cm_explorer_server/crypto-config/ 目录下:
# 示例:从chainmaker链目录复制证书
$ cp -r /path/to/chainmaker-go/build/crypto-config/* ./cm_explorer_server/crypto-config/
3.3.4.5.2.2. B.2 修改后端配置文件
编辑 cm_explorer_server/config.yml,修改以下配置:
# ===== 修改点1:管理员密码(用于浏览器登录)=====
web:
admin_password: passw0rd # 改成您自己的密码
# ===== 修改点2:链ID =====
chain:
main_chain_id: chainmaker_pk # 改成您的链ID(如:chain1)
# ===== 修改点3:订阅链配置(最重要)=====
chains:
- chain_id: chainmaker_pk # 改成您的链ID
auth_type: public # 链的认证模式:public(公钥模式) 或 permissioned(证书模式)
hash_type: SM3 # 哈希算法:SM3 或 SHA256
tls: false # 是否开启TLS(根据您的链配置)
user:
# ⭐ 证书路径:相对于容器内的路径,确保证书已复制到crypto-config目录
user_sign_key_file_path: ../configs/crypto-config/node1/user/client1/client1.key
user_sign_crt_file_path: # 证书模式需要填写
nodes:
# ⭐ 节点地址:改成您的区块链节点地址
- tls_host: chainmaker.org
remotes: 127.0.0.1:12301 # 改成您的节点IP:端口
- tls_host: chainmaker.org
remotes: 127.0.0.1:12302 # 可配置多个节点
不同认证模式的配置示例:
📌 公钥模式 (public) 配置示例
chains:
- chain_id: chain1
auth_type: public
hash_type: SM3
tls: false
user:
user_sign_key_file_path: ../configs/crypto-config/node1/user/client1/client1.key
nodes:
- tls_host: chainmaker.org
remotes: 192.168.1.100:12301
📌 证书模式 (permissionedwithcert) 配置示例
chains:
- chain_id: chain1
auth_type: permissionedwithcert
org_id: wx-org1.chainmaker.org
hash_type: SHA256
tls: true
user:
user_sign_key_file_path: ../configs/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.sign.key
user_sign_crt_file_path: ../configs/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.sign.crt
user_tls_key_file_path: ../configs/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.key
user_tls_crt_file_path: ../configs/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.crt
nodes:
- tls_host: chainmaker.org
ca_paths: ../configs/crypto-config/wx-org1.chainmaker.org/ca/ca.crt
remotes: 192.168.1.100:12301
3.3.4.6. 第三步:一键启动所有服务
# 进入docker目录
$ cd chainmaker-explorer/docker
# 一键启动(包含MySQL、Redis、前端、后端等所有服务)
$ docker-compose up -d
# 或使用重启脚本
$ ./restart.sh
💡 说明:首次启动会自动拉取Docker镜像,可能需要几分钟时间。
3.3.4.6.1. 查看服务状态
# 查看所有容器运行状态
$ docker-compose ps
# 应该看到以下5个服务都是 Up 状态:
# cm_explorer_db (MySQL数据库)
# redis (Redis缓存)
# cm_explorer_server (浏览器后端)
# cm_dquery_server (自主查询服务)
# cm_compiler_server (合约编译服务)
# cm_explorer_web (前端服务)
3.3.4.6.2. 查看日志(排查问题)
# 查看后端服务日志
$ docker logs -f --tail 200 docker-cm_explorer_server-1
# 查看前端服务日志
$ docker logs -f --tail 200 docker-cm_explorer_web-1
# 查看数据库日志
$ docker logs -f --tail 200 docker-cm_explorer_db-1
3.3.4.7. 第四步:访问浏览器
浏览器访问:http://localhost:9996
如果是远程服务器,将
localhost替换为服务器IP地址
3.3.4.8. 第五步:初始化图表数据(可选)
⚠️ 前提条件:浏览器已正常启动,并且已成功订阅链且同步到最新区块后,才能执行此步骤!
图表数据初始化用于展示首页的统计图表,如果不需要图表功能可以跳过此步骤。
v4.0.0 起,图表初始化脚本已迁移至
chainmaker-explorer仓库的scripts/chart_dquery/目录,不再需要单独拉取dquery-backend仓库,随浏览器仓库一起发布。
3.3.4.8.1. 5.1 修改初始化配置
修改 chainmaker-explorer/scripts/chart_dquery/run_chart_tasks.sh 顶部配置区域,将以下配置修改成本地环境数据
ChainID="chainmaker_pk" # 链ID
TablePrefix="" # 表前缀,与 config.yml 中 db.prefix 保持一致
ADMIN_PASSWORD="passw0rd" # 请替换为实际的管理员登录密码
EXPLORER_HOST='http://127.0.0.1:9996' # 本地浏览器环境
INIT_SLEEP_TIME=300 # 等待初始数据清洗完成的时间(秒),数据量大的情况需适当增大
3.3.4.8.2. 5.2 修改初始化 SQL(可选)
mysql/
chart_init_chain.yaml # 第一阶段:基础数据统计,落地临时表
chart_second_chain.yaml # 第二阶段:单链聚合统计(日/周/月)
chart_second_cross_chain.yaml # 第二阶段:跨链聚合统计
pgsql/
chart_init_chain.yaml
chart_second_chain.yaml
chart_second_cross_chain.yaml
chart_second_risk_guardian.yaml # 风险防护相关统计(PostgreSQL 专属)
增加、修改、删除上述文件中的 sql 来适应自己自定义开发环境,如图表未调整可以不用修改。其中 chart_init_chain.yaml 为第一阶段初始化数据,chart_second_chain.yaml 为第二阶段聚合数据,需要依赖第一阶段的执行结果。
3.3.4.8.3. 5.3 执行初始化脚本
mysql数据库:
cd chainmaker-explorer/scripts/chart_dquery
./run_chart_tasks.sh mysql
pgsql数据库:
cd chainmaker-explorer/scripts/chart_dquery
./run_chart_tasks.sh pgsql
3.3.5. 停止与清理
# 停止所有服务
$ docker-compose down
# 停止并清除所有数据(重新部署时使用)
$ docker-compose down -v
3.3.6. 配置调整(如果没有特殊情况,配置文件基本不需要更改)
💡 提示:以下是各配置文件的详细说明,通常情况下使用默认配置即可,仅供高级用户参考。
3.3.6.1. 各服务配置文件说明
| 服务 | 配置文件 | 核心配置项 | 修改场景 |
|---|---|---|---|
| 浏览器后端 | cm_explorer_server/config.yml |
数据库连接、Redis连接、订阅链配置 | 需要连接自定义链时必须修改 |
| 自主查询 | cm_dquery/config.yml |
数据库连接、查询超时时间 | 使用SQL查询功能时 |
| 合约编译 | cm_compiler/config.yml |
数据库连接、IDE地址 | 使用合约验证功能时 |
| 前端服务 | cm_explorer_web/_config.json |
功能开关 | 需要隐藏某些功能时 |
3.3.6.1.1. 浏览器后端服务配置
浏览器配置文件:cm_explorer_server/config.yml,它的配置内容包括五部分,以下是详细说明:
web:
# Web监听网卡地址
address: 0.0.0.0
# Web监听端口
port: 9997
# evm合约编译服务,http://127.0.0.1:8888
contract_compile_url: http://cm_compiler_server:9999
# prometheus监控端口
monitor_port: 13582
#管理后台密钥,用于管理后台调用浏览器接口校验
manage_backend_api_key: AdSGavFKmbrzesqkZPQaVD2UGnqbbC
# 登录过期时间,单位:天
login_expire_time: 7
# admin账户登录密码
admin_password: passw0rd
#是否开启pprof
pprof:
is_open: false
port: 16660
#mysql配置信息
db:
#数据库连接信息
host: cm_explorer_db
#数据库端口
port: 3306
#数据库用户名
username: root
#数据库密码
password: chainmaker
#数据库名称
database: chainmaker_explorer
# 表/索引-名称前缀(用于同一个数据库启动不同浏览器)
prefix:
#db类型: ClickHouse / Mysql / Pgsql
db_provider: Mysql
#批量插入最大字节数(单位kb),默认256kb
max_byte_size: 1024
#单表插入,更新线程池最大并发数,默认10,最大50.
max_pool_size: 10
# redis缓存信息
db_redis:
#cluster:集群/node:单机
type: node
host:
- redis:6379
username:
password: explorer_redis
chain:
# 是否订阅链
subscribe: true
#是否主链
is_main_chain: true
#主链名称
main_chain_name: 国家级区块链网络主网络
#主链ID
main_chain_id: chainmaker_pk
#链子did合约名称,默认使用第一个did合约
# 订阅链配置
chains:
- chain_id: chainmaker_pk
auth_type: public
org_id:
hash_type: SM3
tls_model: 0 #0:单证书模式,1:双证书模式
tls: false #是否开启tls,ture/false
user:
user_sign_key_file_path: ../configs/crypto-config/node1/user/client1/client1.key
user_sign_crt_file_path:
user_tls_key_file_path:
user_tls_crt_file_path:
user_enc_key_file_path:
user_enc_crt_file_path:
nodes:
- tls_host: chainmaker.org
ca_paths:
remotes: pre-chain1.cnbn.org.cn:12391
- tls_host: chainmaker.org
ca_paths:
remotes: pre-chain2.cnbn.org.cn:12392
# 敏感词过滤腾讯云服务
sensitive:
enable: false
secret_id: 123456
secret_key: 123456
# 告警
alarmer:
# 开启企业微信告警
wechat_enable: false
# 开启钉钉告警
ding_enable: false
# 企业应用token
wechat_access_token: 0f4b72d5-09dc-4e7e-afa3-5e8258d1a1da
# 钉钉应用token
ding_access_token: 123456
# 告警信息前缀
prefix: 123456
# 监控(告警信息请填写alarmer)
monitor:
# 是否启用
enable: false
# 敏感词过滤预警返回最大交易数
safe_word_limit: 10
# 单用户短期大批量交易监控
monitor_tx:
# 间隔期内用户最大发交易数
max_tx_num: 10000
# 单次查询交易数
tx_limit: 1000
# 节点间允许最大区块高度差
max_height_diff: 10
# 最大尝试连接节点次数
try_conn_num: 3
# 触发间隔 (min) 至少10min
interval: 1
# 监控节点信息
chains:
- chain_id: chainmaker_pk
auth_type: public
org_id:
hash_type: SM3
tls_model: 1 #0:单证书模式,1:双证书模式
tls: false #是否开启tls,ture/false
user:
user_sign_key_file_path: ../configs/crypto-config/node1/user/client1/client1.key
user_sign_crt_file_path:
user_tls_key_file_path:
user_tls_crt_file_path:
user_enc_key_file_path:
user_enc_crt_file_path:
nodes:
- tls_host: chainmaker.org
ca_paths:
remotes: pre-chain1.cnbn.org.cn:12391
- tls_host: chainmaker.org
ca_paths:
remotes: pre-chain2.cnbn.org.cn:12392
3.3.6.1.2. 浏览器自主查询服务配置
浏览器配置文件:cm_dquery/config.yml,它的配置内容包括五部分,以下是详细说明:
web:
# Web监听网卡地址
address: 0.0.0.0
# Web监听端口
port: 9998
# prometheus监控端口
monitor_port: 13582
pprof:
is_open: false
port: 16660
#定时任务配置
performance:
max_query_goroutine_pool: 20 # 定时任务允许的SQL并发查询量
max_query_user: 200 # 每个用户允许创建的最大的SQL查询语句
max_query_result_size: 10 # SQL查询结果的最大size,单位M
#服务存储配置
db:
host: cm_explorer_db
port: 3306
username: root
password: chainmaker
#数据库
database: chainmaker_dquery
#db类型: ClickHouse / Mysql
db_provider: Mysql
db_redis:
#cluster:集群/node:单机
type: node
host:
- redis:6379
username:
password: explorer_redis
prefix: dquery_
#自主查询数据库配置信息(浏览器链存储配置)
chainmaker_db:
#浏览器链存储数据库
host: cm_explorer_db
port: 3306
#链数据库账户信息,为了数据库安全需要配置成只读账户
username: root
password: chainmaker
#链存储DB
database: chainmaker_explorer
#链存储数据库类型,ClickHouse / Mysql/ Pgsql
db_provider: Mysql
#sql语句单次查询超时时间,单位秒,超出后自定停止,防止慢查询占用资源
query_timeout: 300
#需要查询的链列表,支持多链
chain_list:
#链ID
- chain_id: chainmaker_pk
#链表的前缀,用来过滤同一个数据库订阅多条链的情况,基本和chain_id保持一致就可以
prefix: chainmaker_pk
为了数据安全,需要将chainmaker_db中的username配置成只读账户
3.3.6.1.3. 浏览器合约编译服务配置
编译服务配置文件:cm_compiler/config.yml,该服务主要用于合约验证功能,将合约源码编译成合约执行文件,然后比对执行文件进行合约验证。
web:
# Web监听网卡地址
address: 0.0.0.0
# Web监听端口
port: 9999
# 是否开启跨域:
cross_domain: true
# prometheus监控端口
monitor_port: 13582
#dockergo合约IDE地址
docker_go_ide_url: https://ide230.chainmaker.org.cn
#mysql配置信息
db:
host: cm_explorer_db
port: 3306
username: root
password: chainmaker
#数据库
database: contract_compile
#db类型: ClickHouse / Mysql/ Pgsql
db_provider: Mysql
db_redis:
#cluster:集群/node:单机
type: node
host:
- redis:6379
username:
password: explorer_redis
3.3.6.1.4. 浏览器前端服务配置
浏览器前端配置文件:
cm_explorer_web/_config.json{ "APP_IS_SHOW_DB_QUERY": true, "APP_IS_SHOW_TRANSACTION_ADVANCED_SEARCH": false }
参数说明:
APP_IS_SHOW_DB_QUERY: 是否显示数据库查询功能(true:显示,false:隐藏)
APP_IS_SHOW_TRANSACTION_ADVANCED_SEARCH: 是否显示合约详情中交易列表高级搜索功能(true:显示,false:隐藏)
浏览器前端配置文件:
cm_explorer_web/assetsassets目录下支持替换如下静态资源(可选项,默认长安链图片): - logo.png: 浏览器logo - favicon.ico: 浏览器图标 配置图标则会替换浏览器默认资源,替换时请确保文件命名(包含格式)一致。
浏览器前端配置文件:
cm_explorer_web/default.confgzip on; gzip_http_version 1.1; gzip_comp_level 5; gzip_min_length 256; gzip_proxied any; gzip_vary on; gzip_types application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml application/octet-stream font/opentype image/svg+xml image/x-icon text/css text/plain text/x-component; server { listen 9996 http2; root /usr/share/nginx/html; index index.html; client_max_body_size 10m; gzip on; gzip_vary on; gzip_types text/plain application/javascript application/x-javascript text/css text/xml application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; location / { try_files $uri $uri/ /index.html; } location ^~ /assets/ { try_files /override$uri $uri =404; add_header Cache-Control max-age=2592000; } location ~* \.(css|js|png|jpg|jpeg|gif|gz|svg|mp4|ogg|ogv|webm|htc|xml|woff)$ { add_header Cache-Control max-age=2592000; } #浏览器后端服务 location /chainmaker/ { add_header 'Access-Control-Allow-Origin' "$http_origin" always; add_header 'Access-Control-Allow-Headers' '*' always; add_header 'Access-Control-Allow-Methods' '*' always; if ($request_method = 'OPTIONS') { return 204; } proxy_read_timeout 300; proxy_pass http://cm_explorer_server:9997/chainmaker; } #自主查询服务 location /dquery/sqlQuery { add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-Headers' '*' always; add_header 'Access-Control-Allow-Methods' '*' always; if ($request_method = 'OPTIONS') { return 204; } proxy_read_timeout 300; proxy_pass http://cm_dquery_server:9998/dquery/sqlQuery; } }
Docker配置文件:docker-composer.yml
包括mysql,redis服务,浏览器前端,后端服务,编译服务,自主查询服务
services:
cm_explorer_db:
image: hub-dev.cnbn.org.cn/tools/mysql:8.0.28
volumes:
- ./explorer_db/mysql:/var/lib/mysql
- ./mysql-config/my.cnf:/etc/mysql/my.cnf:ro
restart: always
environment:
MYSQL_ROOT_PASSWORD: chainmaker
MYSQL_USER: chainmaker # 可选:在容器启动时创建用户
MYSQL_PASSWORD: chainmaker # 可选:为用户设置密码
TZ: Asia/Shanghai # 设置时区为东八区
ports:
- "33061:3306"
redis:
image: hub-dev.cnbn.org.cn/tools/redis:7.4.1
volumes:
- ./explorer_db/redis:/data
restart: always
command: redis-server --requirepass explorer_redis
cm_explorer_server:
image: hub-dev.cnbn.org.cn/opennet/chainmaker-explorer-backend:v4.0.0
depends_on:
- cm_explorer_db
- redis
- cm_compiler_server
- cm_dquery_server
restart: always
volumes:
- ./cm_explorer_server/config.yml:/chainmaker-explorer-backend/configs/config.yml
- ./cm_explorer_server/crypto-config:/chainmaker-explorer-backend/configs/crypto-config
- ./cm_explorer_server/log/:/chainmaker-explorer-backend/log/
cm_dquery_server:
image: hub-dev.cnbn.org.cn/opennet/dquery-backend:v2.3.9
depends_on:
- cm_explorer_db
- redis
restart: always
volumes:
- ./cm_dquery/config.yml:/dquery-backend/configs/config.yml
- ./cm_dquery/log/:/dquery-backend/log/
cm_compiler_server:
image: hub-dev.cnbn.org.cn/opennet/compiler-service:v2.3.9
depends_on:
- cm_explorer_db
- redis
restart: always
volumes:
- ./cm_compiler/config.yml:/compiler-service/configs/config.yml
- ./cm_compiler/log/:/compiler-service/log/
cm_explorer_web:
image: hub-dev.cnbn.org.cn/opennet/explorer_front:v4.0.0
depends_on:
- cm_compiler_server
- cm_dquery_server
- cm_explorer_server
ports:
- "9996:9996"
restart: always
command: /bin/sh -c "sleep 10 && nginx -g 'daemon off;'" # 延迟 10 秒启动
volumes:
- ./cm_explorer_web/default.conf:/etc/nginx/conf.d/default.conf
- ./cm_explorer_web/_config.json:/usr/share/nginx/html/_config.json
- ./cm_explorer_web/assets:/usr/share/nginx/html/override/assets
编排文件位于 chainmaker-explorer/docker/ 目录下,包含三套:
docker-compose.yml:默认编排(MySQL + Redis),x86 架构。docker-compose-pgsql.yml:PostgreSQL(人大金仓)编排。docker-compose-arm.yml:ARM 架构编排。
启动时通过 -f 指定对应文件即可,例如:
docker-compose -f docker-compose.yml up -d # 默认 MySQL 版本
docker-compose -f docker-compose-pgsql.yml up -d # PostgreSQL/人大金仓
docker-compose -f docker-compose-arm.yml up -d # ARM 架构
3.3.7. 常见问题排查
3.3.7.1. 问题1:无法拉取Docker镜像
现象:执行 docker-compose up -d 时报错,提示镜像拉取失败
解决方案:
# 检查网络连接
$ ping hub-dev.cnbn.org.cn
# 如果网络不通,可以尝试手动拉取镜像
$ docker pull hub-dev.cnbn.org.cn/opennet/chainmaker-explorer-backend:v2.3.9
3.3.7.2. 问题2:浏览器无法订阅链数据
现象:浏览器启动成功,但首页没有数据
排查步骤:
检查区块链节点是否正常运行
检查
cm_explorer_server/config.yml中的节点地址是否正确检查证书路径是否正确,证书是否已复制到
crypto-config目录查看后端日志:
docker logs -f docker-cm_explorer_server-1
3.3.7.3. 问题3:访问 http://localhost:9996 无响应
排查步骤:
# 检查容器是否正常运行
$ docker-compose ps
# 检查端口是否被占用
$ netstat -tlnp | grep 9996
# 查看前端服务日志
$ docker logs -f docker-cm_explorer_web-1
3.3.7.4. 问题4:数据库连接失败
现象:后端日志显示数据库连接错误
解决方案:
Docker 内部服务使用容器名
cm_explorer_db作为数据库地址(已在默认配置中设置)等待数据库容器完全启动后再启动其他服务(docker-compose 会自动处理依赖顺序)
3.3.8. 浏览器版本升级
3.3.8.1. 升级到 v4.0.0(重要:不支持平滑升级,必须重新部署并重新订阅)
v4.0.0 重写了订阅模块(双订阅架构),数据库表结构、订阅任务模型、数据存储格式均发生了不兼容变更,因此不支持通过
upgrader.bin原地升级到 v4.0.0,必须完全卸载旧版、清理数据、按 v4.0.0 文档全新部署并重新订阅所有链。原有的 v2.3.8 → v2.3.9 upgrader 升级链路在 v4.0.0 上不再适用。
升级步骤如下:
停止旧版浏览器
# 切到旧版 chainmaker-explorer/docker 目录 cd chainmaker-explorer/docker # 同时清空数据卷(v4.0.0 数据库结构不兼容) docker-compose down -v
清理历史数据目录(防止残留数据影响 v4.0.0)
# 删除 v2.3.x 留下的 MySQL/Redis 数据 rm -rf chainmaker-explorer/docker/explorer_db/ # 若使用了 PostgreSQL(人大金仓)版本 rm -rf chainmaker-explorer/docker/explorer_db/sql_data/ # 若升级前手动挂载过证书 / 日志目录,按需清理 # rm -rf chainmaker-explorer/docker/cm_explorer_server/crypto-config
拉取 v4.0.0 源码并启动
# 浏览器前端 + docker-compose 编排 git clone -b v4.0.0 --depth=1 https://git.chainmaker.org.cn/chainmaker/chainmaker-explorer.git cd chainmaker-explorer/docker # 如需后端源码调试,可选拉取 # git clone -b v4.0.0 --depth=1 https://git.chainmaker.org.cn/chainmaker/chainmaker-explorer-backend.git # 一键启动 v4.0.0 docker-compose up -d
在浏览器前端「区块链管理」页面重新订阅所有需要的链(v4.0.0 不会自动继承 v2.3.x 的订阅配置)。
图表数据需要重新初始化:
cd chainmaker-explorer/scripts/chart_dquery # 修改 run_chart_tasks.sh 顶部 ChainID/ADMIN_PASSWORD/EXPLORER_HOST/INIT_SLEEP_TIME ./run_chart_tasks.sh mysql # 或 pgsql
提示:v4.0.0 的
docker/目录随chainmaker-explorer仓库一起发布,升级时无需单独从chainmaker-explorer-backend仓库拷贝 docker 文件。
3.3.8.2. v2.3.8 升级 v2.3.9(历史升级路径,仅作参考)
注意:v2.3.x 内部的 upgrader 升级链路已被 v4.0.0 替代,下列步骤仅适用于 v2.3.8 → v2.3.9 的原地升级,无法用于升级到 v4.0.0。升级到 v4.0.0 请使用上一节”完全重新部署”方案。
停止订阅链数据:修改
chainmaker-explorer/docker/cm_explorer_server/config.yml中的chain.subscribe=false,停止订阅数据。进入容器执行升级命令:
# 进入容器(docker-cm_explorer_server-1 替换为自己的容器名)
docker exec -it -w /chainmaker-explorer-backend docker-cm_explorer_server-1 bash
# 执行升级命令(chain1 为链 id)
nohup ./bin/upgrader.bin chain1 v2.3.8 > upgrader.log 2>&1 &
# 等待升级结束,查看 upgrader.log 中是否输出:
# ======success %s====TotalCrossTx %d=======
升级结束后重新开启订阅:修改
chainmaker-explorer/docker/cm_explorer_server/config.yml中的chain.subscribe=true,开始订阅。
3.4. 使用手册
v4.0.0 对前端页面进行了全面改版(UI / 交互 / 视觉风格全面升级),下文中涉及页面截图的内容主要基于 v2.3.x 旧版界面,整体功能模块(首页 / 订阅 / 区块 / 交易 / 合约 / 组织 / 节点 / 链账户 / 数据看板 / 自定义查询 / 合约验证等)保持不变,功能使用方式仍可参考。

3.4.1. 初始化

初始化时,需要先订阅一条链,请确保所填写的信息和要订阅的链是一致的,并且用来订阅的节点的网络连接是通畅的。
如需订阅多条链,后续可在区块链管理处继续添加订阅。
参数说明
区块链ID:使用命令行创建的链默认链ID为chain1
节点ip和端口:ip为部署链的机器ip,port使用对应节点的rpc地址,一般默认为12301
组织ID:可以从每个节点对应的配置文件chainmaker.yml(
chainmaker-go/build/config/node1/chainmaker.yml)获取TLS:请根据您的链的实际情况,选择是否开启TLS。目前通过官方开源文档教程上起的链,默认TLS(路径:
chainmaker-go/build/config/node1/chainmaker.yml对应的参数net.tls.enabled)是开启的,默认的TLSHostname为chainmaker.org,如您自定义修改过,请按照实际情况填写。组织ca证书:根据选择的组织id,从对应的节点中拿到对应组织下的ca.crt(eg:组织id为wx-org1.chainmaker.org的证书路径
chainmaker-go/build/config/node1/certs/ca/wx-org1.chainmaker.org/ca.crt)用户证书、私钥:需要使用sign证书和私钥,一般默认使用admin.sign.crt和admin.sign.key(路径:
chainmaker-go/build/config/node1/certs/user/)
3.4.2. 首页

通过右上角可以切换跳转到已经订阅的其他链的浏览器页面,也可继续添加订阅链。
在搜索框左边的下拉框可筛选搜索类型,搜索类型包含区块哈希、区块高度、交易ID、合约名称、合约地址
点击左下角统计当前链的相关数据,如区块高度,交易数等,点击将跳转到对应的区块列表页、交易列表页、合约列表页、组织列表页、节点列表页、账户列表页等。
首页将展示当前最新的区块信息,包含每个区块的区块高度、包含交易数、出块节点。
首页将展示当前最新的区块信息,包含每笔交易的交易id、交易发起者、所调用的合约以及交易发起时间。
首页将展示当前最新的区块信息,包含每个合约的合约名称、合约创建者、合约版本、合约部署时间。
3.4.3. 订阅区块链

支持同时订阅多条链,再订阅链时,请确保所填写的信息和要订阅的链是一致的,并且用来订阅的节点的网络连接是通畅的。
支持订阅Cert,和Public两种账户模式的链。
不允许同时订阅同一条链,也不允许同时订阅ChainID相同的链。
如果订阅后,所订阅的节点运行出现异常,如停机了,或者被踢出网络了,则浏览器也将无法获取信息,您可以通过重新订阅按钮,修改到正常运行的节点,恢复订阅。
支持删除订阅,删除后,将不会再获取该链的信息,且原来的已经订阅的数据都会被删除,如需重新获取,需要再次订阅。
3.4.4. 区块信息

此处展示区块列表,点击查看,可以查看该区块的详情。

支持查看某一区块的具体信息,包括区块哈希,读写集哈希,DAG信息,以及本区块内的交易信息。
3.4.5. 交易信息

此处展示交易列表,支持通过实际时间维度筛选交易,点击查看,可以查看该交易的详情。

支持查看某一条交易详情,包括交易的所属区块信息,交易发起人信息,交易所调用的合约执行情况。
3.4.6. 合约信息

此处展示合约列表,默认进入全部合约,点击可切换Token类和NFT类,点击可以查看该合约的详情。
如果安装了长安链Web3插件v1.5.2+,可以直接把合约订阅到插件内。
3.4.6.1. 合约详情

支持查看合约信息,包括合约的地址,合约的创建者信息
可以切换查看交易信息、合约源码、流转记录、持有者、事件记录和版本记录。
3.4.6.2. CMDFA合约详情


如果所订阅的合约符合长安链合约标准协议规范,类型为CMDFA则浏览器处会额外展示CMDFA内的合约资产的流转记录和持有者记录。
3.4.6.3. CMNFA合约详情


如果所订阅的合约符合长安链合约标准协议规范,类型为CMNFA则浏览器处会额外展示CMNFA内的合约资产的流转记录、持有者和NFT总览。
以及可以查看合约内的数字藏品资产详情。
注意,相关数字藏品的metadata信息必须符合长安链合约标准规范否则将解析失败。具体如下:
{
"author":"凌风出品",
"orgName":"北京美好景象图片有限公司",
"name":"Lionel Messi",
"description":"利昂内尔·安德烈斯·“利奥”·梅西·库奇蒂尼,简称梅西(西班牙语:Lionel Messi),生于阿根廷圣菲省罗萨里奥,现正效力于法甲俱乐部巴黎圣日耳曼,同时担任阿根廷国家足球队队长,司职边锋、前锋及前腰。目前他共获得7座金球奖、6次世界足球先生及6座欧洲金靴奖。",
"image":"https://www.strikers.auction/images/cards/000.png",
"seriesHash":"5fabfb28760f946a233b58e99bfac43f3c53b19afa41d26ea75a3a58cbfc1491"
}
请注意metadata必须是一段标准的json,且字段名称需与上述例子保持一致,否则将无法解析到对应的数据。其中
作品URL为该NFT图片资源存放的地址,
作品哈希为该图片对应的sha256哈希值,通过将资源哈希值上链进行存证,确保就算是存储在中心化云服务的NFT也不可被篡改。
3.4.6.4. 合约自定义解析(ABI解析)

合约类型为OTHER时,点击”ABI解析“入口,密码登录/插件钱包登陆后,上传ABI文件

ABI信息详情页中,左上角可以切换版本号,查看不同版本号下的ABI详情
3.4.6.5. 跨合约调用统计


跨合约调用标签下,从两个纬度展示了该合约的跨合约调用关系。“合约级调用关系”,展示了合约执行时跨合约之间的依赖关系即调用了哪些合约,又被哪些合约所调用;而“方法级调用关系”展示了目标合约下的所有的合约方法,合约方法的依赖关系,即每个方法依赖了哪些合约
3.4.7. 组织信息

此处展示参与该区块链的组织信息。
因public模式的链没有组织概念,故而该模式下不展示组织信息模块。
3.4.8. 节点信息

此处展示参与该区块链的节点信息。
3.4.9. 链账户信息

此处展示该区块链目前已经发送过或者接收过交易的用户信息,同步展示交易信息、持有Token信息和持有NFT信息。
无论是证书账号还是公钥账户都有其对应的链账户地址。
3.4.10. 数据看板


● 点击“更多”进入数据看板详情页
● 数据看板分为”节点“、”交易“、”合约“和”自定义”四个板块
● “节点”板块下,交易贡献率统计各共识节点处理的交易数量占总比,反映节点的性能和可靠性;同理,区块贡献率统计每个节点在单位时间内产出区块数量,反映节点的参与度和贡献量

● “交易”板块下,“交易确认时间-单链”统计从交易发起到被确认所需的时间,评估网络的响应速度;“交易速率-单链”测量每秒处理的交易数量(TPS),即系统的吞吐量;”交易耗时情况统计“统计交易耗时的比例,反映网络拥堵情况

● “Top 10交易链账户”统计交易数量排名前十的链账户,定位活跃链账户

● “合约”板块,“合约验证数”和“部署合约数”直观展现一定时间内合约验证数和部署合约数的起伏变化,可以反应区块链的生态活跃度

统计被调用频率最频繁的前十个合约,点击右下角“查看列表”可进入合约调用详情

合约调用频率统计列表,统计被调用频率最频繁的前十个合约详情信息包括合约地址、合约名等
3.4.11. 自定义查询

首页点击进入自定义查询(即链上数据sql查询)

用户必须先用长安链Web3插件钱包登陆。如果不登陆,仅可以查看“公共”的sql查询结果,且无法新建自己的sql查询表

成功登陆后,点击新建查询表

用户可以选取数据库中的字段名,在右侧输入查询条件

点击运行,下方返回查询结果后,用户可以点击“保存查询结果”

保存查询结果时,除了输入标题之外,可以选择查询结果是否公开,如果公开,所有人可见;如果不公开,只有当你登陆Web3插件钱包后,才能看到该查询结果。
除此之外,定时执行代表每隔XX小时,浏览器会自动更新查询结果
3.4.12. 合约验证

进入一个尚未验证合约的合约详情页面,下方选择合约源码标签,点击合约验证。

进入合约验证的详情页面,填写合约地址、程序执行入口、合约版本、编译器版本、开源许可类型并上传合约源码之后,点击提交

提交验证后,页面会弹出验证结果。在合约详情的版本记录标签下,可以查看合约所有版本的验证结果。

对于已经通过验证的合约,可以在合约详情页的合约源码标签下,查看合约源码、Contract ABI等信息