# 基本架构和特性

从前面的讲解中可以看到，区块链服务平台能够有效加速对区块链技术的应用，解决企业和开发者进行手动运营管理的负担。但是这些方案都是商业用途，并且只能在线使用。

![Cello 典型应用场景](https://1489614170-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M5xTVjj6plOWgHcmTHq%2Fuploads%2Fgit-blob-fb9f2b77430460050d2a6f148fdf0364cdddde99%2Fcello.png?alt=media)

超级账本的 Cello 项目为本地搭建区块链服务管理平台提供了开源的解决方案，可以实现在多种类型的物理资源上实现区块链网络的生命周期管理。

正如 Cello 的名字所蕴意，它就像一把精巧的大提琴，以区块链为琴弦，可以奏出更加动人的乐章。

## 基本架构和特性

Cello 项目由笔者领导的 IBM 技术团队于 2017 年 1 月贡献到超级账本社区，主要基于 Python 和 Javascript 语言编写。该项目的定位为区块链管理平台，支持部署、运行时管理和数据分析等功能，可以实现一套完整的 BaaS 系统的快速搭建。其基本架构如下图所示。

![Cello 基本架构](https://1489614170-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M5xTVjj6plOWgHcmTHq%2Fuploads%2Fgit-blob-5ff8c8fe0bdae9b759055dd373f0c108dd2bdf2f%2Fcello_arch.png?alt=media)

在实现区块链环境快速部署的同时，Cello 也提供了不少对区块链平台进行运行时管理的特性，这些特性总结如下。

* 管理区块链的全生命周期，包括创建、配置、使用、健康检查、删除等。
* 支持多种基础架构作为底层资源池，包括裸机、虚拟机、容器云（Docker、Swarm、Kubernetes）等。
* 支持多种区块链平台及自定义配置（目前以支持超级账本 Fabric 为主）。
* 支持监控和分析功能，实现对区块链网络和智能合约的运行状况分析。
* 提供可插拔的框架设计，包括区块链平台、资源调度、监控、驱动代理等都很容易引入第三方实现。

下面具体介绍如何以 Docker 主机为资源池，用 Cello 快速搭建一个区块链服务平台。

## 环境准备

Cello 采用了典型的主从（Master-Worker）架构。用户可以自行准备一个 Master 物理节点和若干个 Worker 节点。

其中，Master 节点负责管理（例如，创建和删除）Worker 节点中的区块链集群，其通过 8080 端口对外提供网页 Dashboard，通过 80 端口对外提供 RESTful API。Worker 节点负责提供区块链集群的物理资源，例如基于 Docker 主机或 Swarm 的方式启动多个集群，作为提供给用户可选的多个区块链网络环境。

下图中展示了一个典型的 Master-Worker 部署拓扑。每个节点默认为 Linux（如 Ubuntu 22.04）服务器或虚拟机。

![Cello 部署拓扑示例](https://1489614170-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M5xTVjj6plOWgHcmTHq%2Fuploads%2Fgit-blob-11bc08732f3add160a3b3b94c54a3c3209c2d062%2Fcello_deployment_topo.png?alt=media)

为了支持区块链网络，Worker 和 Master 节点需要配备足够的物理资源。例如，如果希望在一个 Worker 节点上能够启动至少 10 个区块链集群，则建议节点配置至少为 8 CPU、16G 内存、100G 硬盘容量。

## 下载 Cello 源码

Cello 代码的官方仓库在 Github 上，读者可以获取代码。例如通过如下命令从官方仓库下载 Cello 源码。

```sh
$ git clone https://github.com/hyperledger-cello/cello.git && cd cello
```

## 配置 Worker 节点

### 安装和配置 Docker 服务

首先安装 Docker，推荐使用 1.12 或者更新的版本。可通过如下命令快速安装 Docker。

```sh
$ curl -fsSL https://get.docker.com/ | sh
```

安装成功后，修改 Docker 服务配置。更新 `/lib/systemd/system/docker.service` 文件如下。

```sh
[Service]
DOCKER_OPTS="$DOCKER_OPTS -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --api-cors-header='*' --default-ulimit=nofile=8192:16384 --default-ulimit=nproc=8192:16384"
EnvironmentFile=-/etc/default/docker
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS
```

修改后，需要通过如下命令重启 Docker 服务。

```sh
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker.service
```

### 下载 Docker 镜像

对于超级账本 Fabric v1.0 集群所需的镜像，可以使用如下命令进行自动下载。

```sh
$ cd scripts/worker_node_setup && bash download_images.sh
```

### 防火墙配置

为了确保 Worker 上的容器可以正常访问，通过如下命令确保主机开启 IP 转发。

```sh
$ sysctl -w net.ipv4.ip_forward=1
```

同时检查主机的 iptables 设置，确保必要的端口被打开（如 2375、7050\~10000 等）。

## 配置 Master 节点

### 准备环境与启动服务

首先确保安装了 Docker Compose V2。然后可以通过如下命令对 Master 节点进行配置，包括设置本地存储路径和启动服务。

```sh
$ export CELLO_STORAGE_PATH=$(pwd)/cello
$ make local
```

如果希望自行构建 Cello 所需的 Docker 镜像，可运行：

```sh
$ make docker
```

随后通过运行如下命令来启动 Cello 相关的组件服务，包括 `cello-agent-docker`、`postgres`、`cello-api-engine` 和 `cello-dashboard`。

```sh
$ make start
```

如果启动过程没有提示出现问题，则说明当前环境满足了运行条件。如果出现问题，可通过查看日志信息进行定位。可以在终端看到类似以下的容器输出，说明服务启动成功：

```sh
CONTAINER ID   IMAGE                            COMMAND                  CREATED         STATUS         PORTS                                                                                  NAMES
81e6459965ec   hyperledger/cello-agent-docker   "gunicorn server:app…"   4 seconds ago   Up 2 seconds   0.0.0.0:2375->2375/tcp, :::2375->2375/tcp, 0.0.0.0:5001->5001/tcp, :::5001->5001/tcp   cello.docker.agent
04367ab6bd5e   postgres:11.1                    "docker-entrypoint.s…"   4 seconds ago   Up 2 seconds   0.0.0.0:5432->5432/tcp, :::5432->5432/tcp                                              cello-postgres
29b56a279893   hyperledger/cello-api-engine     "/bin/sh -c 'bash /e…"   4 seconds ago   Up 2 seconds   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp                                              cello-api-engine
a272a06d8280   hyperledger/cello-dashboard      "bash -c 'nginx -g '…"   4 seconds ago   Up 2 seconds   80/tcp, 0.0.0.0:8081->8081/tcp, :::8081->8081/tcp                                      cello-dashboard
```

### 管理平台服务

运行 `make stop` 可以停止服务。

若希望停止并清理所有容器，可运行如下命令。

```sh
$ make clean
```

可以通过如下命令查看支持的所有 Make 操作规则。

```sh
$ make help
```

## 使用 Cello 管理区块链

Cello 服务启动后，管理员可以通过 Cello 的 Dashboard 页面管理区块链。

默认情况下，可通过 Master 节点的 8081 端口访问 Dashboard（例如 localhost:8081）。默认的登录用户名和密码为 `admin:pass`。

![Cello Dashboard](https://1489614170-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M5xTVjj6plOWgHcmTHq%2Fuploads%2Fgit-blob-fdf051699965438703b5a1d1d1df8211d688c96f%2Fcello_dashboard.png?alt=media)

如图，Dashboard 有多个页面，各页面的功能如下。

| 页面               | 功能                |
| ---------------- | ----------------- |
| Overview         | 展示系统整体状态          |
| System Status    | 展示一些统计信息          |
| Hosts            | 管理所有主机（Worker 节点） |
| Active Chains    | 管理资源池中的所有链        |
| Inused Chains    | 管理正在被用户占用的链       |
| Released History | 查看链的释放历史          |

### Hosts 页面

在 Hosts 页面，管理员可以管理所有资源池中已存在的主机，或添加新主机。表格中会显示主机的类型、状态、正在运行的区块链数量、区块链数量上限等。所有设定为 non-schedulable （不会自动分配给用户）的主机会用灰色背景标识，如下图所示。

![Hosts 页面](https://1489614170-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M5xTVjj6plOWgHcmTHq%2Fuploads%2Fgit-blob-20c8fc31eb51f87d88b626fb08d4e9d582a9bb56%2Fcello_dashboard_hosts.png?alt=media)

点击一个主机的 Action 下拉菜单，有如下选项可供操作该主机。

* Fillup：将主机运行的区块链数添加至上限。
* Clean：清理主机中所有未被用户占用的链。
* Config：更改主机配置，如名称和链数量上限。
* Reset：重置该主机，只有当该主机没有用户占用的链时可以使用。
* Delete：从资源池中删除该主机。

点击 Hosts 页面的 Add Host 按钮，可以向资源池中添加主机。需要设定该主机的名称、Daemon URL 地址（例如，Worker 节点的 docker daemon 监听地址和端口）、链数量上限、日志配置、是否启动区块链至数量上限、是否可向用户自动分配，如下图所示。

![添加主机](https://1489614170-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M5xTVjj6plOWgHcmTHq%2Fuploads%2Fgit-blob-b1d9163d4d9f9a06c5ec7087c1604add5c265b19%2Fcello_dashboard_addhost.png?alt=media)

### Active Chains 页面

Active Chains 页面会显示所有正在运行的链，包括链的名称、类型、状态、健康状况、规模、所属主机等信息。正在被用户占用的链会用灰色背景标识，如下图所示。

![Active Chains 页面](https://1489614170-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M5xTVjj6plOWgHcmTHq%2Fuploads%2Fgit-blob-1354ffecc9aeadd5bdce29630e05e019182afd5f%2Fcello_dashboard_activechains.png?alt=media)

点击一条链的 Actions 下拉菜单，有如下选项可供操作该链。

* Start：如果这条链处于停止状态，则启动。
* Stop：停止运行中的链。
* Restart：重新启动这条链。
* Delete：删除这条链。
* Release：将占用的链释放，随后会被删除。

点击 Active Chains 页面的 Add Chain 按钮，可以向资源池中添加更多链（如果还有未被占满的主机），如下图所示。

![添加链](https://1489614170-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M5xTVjj6plOWgHcmTHq%2Fuploads%2Fgit-blob-47d81909bd3cd1180ee7108a8abc036c67eff64c%2Fcello_dashboard_addcluster.png?alt=media)

## 用户控制台，申请使用Chain

用户可以登录User Dashboard来申请和使用Chain

![登录页面](https://1489614170-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M5xTVjj6plOWgHcmTHq%2Fuploads%2Fgit-blob-b1e8d24a85e072703db7f4851eeb2bf04bf31aab%2Fcello_user_dashboard_login.png?alt=media)

### Chain列表页面

Chain列表页面显示所有用户已经申请的链。

![Chain列表页面](https://1489614170-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M5xTVjj6plOWgHcmTHq%2Fuploads%2Fgit-blob-d51b4b276b953dd5d8301bf63a7bc6a3a8d7eb11%2Fcello_user_dashboard_chain_list.png?alt=media)

### Chain详情页面

Chain详情页面可以查看链的基本信息（链高度，channel数，链码安装/实例化个数，最近的block/transaction），操作历史记录。

![Chain详情页面](https://1489614170-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M5xTVjj6plOWgHcmTHq%2Fuploads%2Fgit-blob-38bfb025e96a93cf6ff55bdb68be2449ebfc1b5f%2Fcello_user_dashboard_chain_info.png?alt=media)

### 智能合约模板列表页面

这个页面列取用户自己上传的智能合约代码模板，支持多个版本管理。

![智能合约模板列取页面](https://1489614170-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M5xTVjj6plOWgHcmTHq%2Fuploads%2Fgit-blob-72da9d28cb9d27ab5af4173e74e66af71824a1d1%2Fcello_user_dashboard_chain_code_template.png?alt=media)

### 智能合约模板详情页面

在合约模板详情页面可以查看智能合约模板的详情，包括合约多版本列表，部署列表，部署合约。

![智能合约详情页面](https://1489614170-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M5xTVjj6plOWgHcmTHq%2Fuploads%2Fgit-blob-1ca7a5ddd1cd7f175e23a4bf2ae3ae4cd5f99e20%2Fcello_user_dashboard_chain_code_template_info.png?alt=media)

### 智能合约操作页面

在这个页面可以invoke/query已经部署好的智能合约。

![智能合约操作页面](https://1489614170-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M5xTVjj6plOWgHcmTHq%2Fuploads%2Fgit-blob-341462009489e20192c12543795a2058cf99ebac%2Fcello_user_dashboard_chain_code_operate.png?alt=media)

### 智能合约运行列表页面

这个页面可以查看所有已经部署，包括成功和失败的智能合约的列表。

![智能合约运行列表页面](https://1489614170-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M5xTVjj6plOWgHcmTHq%2Fuploads%2Fgit-blob-c2098c7ec4e88a81df96a38f773a9f6e7b75a675%2Fcello_user_dashboard_chain_code_running.png?alt=media)

## 基于 Cello 进行功能扩展

Cello 已经提供了完整的区块链管理功能，并提供了图形界面和 API。

用户可以通过向 Cello 的 Master 节点（默认为 80 端口）发送 RESTful API 来申请、释放区块链，或查看区块链相关信息，如其对外开放的接口，可供用户进行远程交互。RESTful API 的说明可在 Cello 的文档中查阅。

对于区块链服务提供者，可以利用这些 API 为用户呈现友好的区块链申请和操作界面，在 Cello 的基础之上构建和实现更多功能。
