3. 区块链浏览器
3.1. 版本记录
是:需要使用新的数据库重新订阅,以确保获取最新的数据和功能。
否:不需要更改数据库,现有数据库可以继续使用。
| 版本号 | 修改点 | 更新数据库 |
|---|---|---|
| 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框架,确保系统的高效性与可扩展性。
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 环境安装部署请参考对应的文档通过命令行体验链。
⚠️ 确保您的区块链节点已经正常运行,否则浏览器将无法订阅数据!
3.3.4.2. 第一步:下载浏览器代码
# 下载代码(v2.3.9版本)
$ git clone -b v2.3.9 --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. 第二步:配置订阅链信息
浏览器支持 两种订阅方式,请根据您的需求选择:
| 方式 | 适用场景 | 操作难度 | 是否需要修改配置文件 |
|---|---|---|---|
| 方式A:页面订阅(推荐新手) | 快速体验、临时订阅 | ⭐ 简单 | ❌ 不需要 |
| 方式B:配置文件订阅 | 生产环境、固定订阅 | ⭐⭐ 中等 | ✅ 需要 |
3.3.4.3.1. 方式A:页面订阅(推荐新手)✅
💡 最简单的方式:直接启动浏览器,然后在页面上添加链订阅,无需修改任何配置文件!
此方式下,您只需修改管理员密码即可:
编辑 cm_explorer_server/config.yml:
web:
admin_password: passw0rd # 改成您自己的密码(用于登录浏览器后台)
不需要修改的配置:
❌ 不需要配置
chains:部分❌ 不需要复制证书到
crypto-config/目录
配置修改完成后,可直接跳到 第三步:一键启动所有服务 启动浏览器,然后在浏览器页面上进行链的订阅操作。
页面订阅操作步骤:
启动浏览器后,访问 http://localhost:9996
登录管理员账号(密码:您设置的admin_password)
进入「链管理」或「订阅管理」页面
点击「添加链」,填写链信息(链ID、节点地址等)
上传用户证书文件(通过页面上传,无需手动复制)
点击「订阅」即可
3.3.4.3.2. 方式B:配置文件订阅
💡 适用于生产环境:预先配置好链信息,浏览器启动后自动订阅。
3.3.4.3.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.3.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.4. 第三步:一键启动所有服务
# 进入docker目录
$ cd chainmaker-explorer/docker
# 一键启动(包含MySQL、Redis、前端、后端等所有服务)
$ docker-compose up -d
# 或使用重启脚本
$ ./restart.sh
💡 说明:首次启动会自动拉取Docker镜像,可能需要几分钟时间。
3.3.4.4.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.4.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.5. 第四步:访问浏览器
浏览器访问:http://localhost:9996
如果是远程服务器,将
localhost替换为服务器IP地址
首次访问时,需要在页面上完成链的订阅配置(也可以使用配置文件中预设的链信息自动订阅)。
3.3.4.6. 第五步:初始化图表数据(可选)
⚠️ 前提条件:浏览器已正常启动,并且已成功订阅链且同步到最新区块后,才能执行此步骤!
图表数据初始化用于展示首页的统计图表,如果不需要图表功能可以跳过此步骤。
3.3.4.6.1. 5.1 下载初始化脚本
$ git clone -b v2.3.9 --depth=1 https://git.chainmaker.org.cn/chainmaker/dquery-backend.git
$ cd dquery-backend/scripts
3.3.4.6.2. 5.2 修改初始化配置
编辑 init_chat_dquery.sh 文件:
ChainID="chain1" # 改成您的链ID
ADMIN_PASSWORD="passw0rd" # 改成浏览器的管理员密码
EXPLORER_HOST='http://127.0.0.1:9996' # 浏览器访问地址
INIT_SLEEP_TIME=300 # 等待初始化的时间(秒)
3.3.4.6.3. 5.3 执行初始化
# MySQL数据库
$ ./init_chat_dquery.sh mysql
# 或 PostgreSQL数据库
$ ./init_chat_dquery.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
# 是否开启跨域:
cross_domain: true
#对外暴露地址(公网)
third_apply_url: http://127.0.0.1:9996
#主子链服务地址
relay_cross_chain_url: http://subchain-service:8888
# 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
#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
prefix: explorer_
chain:
# 是否订阅链
subscribe: true
#是否主链
is_main_chain: true
#主链名称
main_chain_name: 国家级区块链网络主网络
#主链ID
main_chain_id: chainmaker_pk
#链子did合约名称,默认使用第一个did合约
contract_config:
- chain_id: chainmaker_pk
# 主did合约名称,用于多个did合约操作同一账户时,确认使用哪一个did合约,默认使用第一个did合约
main_did_contract_name: DID
# 订阅链配置
chains:
# 链ID
- chain_id: chainmaker_pk
auth_type: public
# 组织ID
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:
# 客户端用户加密私钥路径(tls加密证书对应私钥,应用于国密GMTLS双证书体系;若未设置仅使用单证书)
user_enc_key_file_path:
# 客户端用户加密证书路径(tls加密证书,应用于国密GMTLS双证书体系;若未设置仅使用单证书)
user_enc_crt_file_path:
nodes:
# TLS hostname
- tls_host: chainmaker.org
# 信任证书池路径
ca_paths:
# RPC节点地址,格式为:IP:端口
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
# 是否开启跨域:
cross_domain: true
# prometheus监控端口
monitor_port: 13582
#定时任务配置
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
#数据库DB
database: chainmaker_dquery
#db类型: ClickHouse / Mysql/ Pgsql
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服务,浏览器前端,后端服务,编译服务,自主查询服务
version: "3.9"
services:
cm_explorer_db:
image: hub-dev.cnbn.org.cn/tools/mysql:8.0.28
volumes:
- ./explorer_db/mysql:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: chainmaker
MYSQL_USER: chainmaker # 可选:在容器启动时创建用户
MYSQL_PASSWORD: chainmaker # 可选:为用户设置密码
TZ: Asia/Shanghai # 设置时区为东八区
command: [ 'mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci', '--default-time-zone=Asia/Shanghai' ]
ports:
- "33061:3306"
redis:
image: hub-dev.cnbn.org.cn/tools/redis:latest
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:v2.3.9
depends_on:
- cm_explorer_db
- redis
- cm_compiler_server
- cm_dquery_server
ports:
- "9997:9997"
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
ports:
- "9998:9998"
restart: always
volumes:
- ./cm_dquery/config.yml:/dquery-backend/configs/config.yml
- ./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
ports:
- "9999:9999"
restart: always
volumes:
- ./cm_compiler/config.yml:/compiler-service/configs/config.yml
- ./cm_compiler/log/:/compiler-service/log/
cm_explorer_web:
depends_on:
- cm_explorer_server
image: hub-dev.cnbn.org.cn/opennet/explorer_front:v2.3.9
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
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. 完全重新订阅
停止旧版浏览器:在旧版本项目
chainmaker-explorer/docker目录下执行:docker-compose down;删除历史数据:删除上面docker-composer.yml配置的数据文件夹。
按照上方教程启动新版浏览器;
重新订阅所需要的链。
3.3.8.2. v2.3.8升级v2.3.9
停止订阅链数据: 修改
chainmaker-explorer/docker/m_explorer_server/config.yml中的chain.subscribe=false,停止订阅数据升级服务:
1、进入容器:(docker-cm_explorer_server-1替换为自己的容器)
docker exec -it -w /chainmaker-explorer-backend docker-cm_explorer_server-1 bash
2、执行升级命令:(chain1为链id)
nohup ./bin/upgrader.bin chain1 v2.3.8 > upgrader.log 2>&1 &
3、等待升级结束:
查看upgrader.log日志是否输出成功的日志
======success %s====TotalCrossTx %d=======
升级结束后重新开启订阅: 修改
chainmaker-explorer/docker/m_explorer_server/config.yml中的chain.subscribe=true,开始订阅
3.4. 使用手册

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等信息