# 如何做一个区块链浏览器

By [Jerry Lee](https://paragraph.com/@jerry-lee) · 2021-12-19

---

对于区块链，所有的数据都是开放的，但不是每个人都能写代码去查看链上的交易，大多数人会通过一个公开的窗口来查看数据。这个公开的窗口就是区块链浏览器。

区块链上的数据会持续增加，对于数据的持久化和查询是浏览器的关键。本文会说明一种区块链浏览器的设计思路。

系统设计
----

当一笔交易上链之后，就会存储到链上的账本中，但是账本中的数据无法直接展示。所以需要对这些账本数据进行解析，并存储，然后再从不同的维度去做对数据进行展示。系统本身并不会很复杂，整体的设计如下：

![](https://storage.googleapis.com/papyrus_images/4ecb7655f4942d356434892547ae45e2c4837e730429f299375a23356efc6458.jpg)

整个系统做的事情就是将区块链上的数据拉取下来，放到数据库中，然后通过一个 API 服务

在系统中有两个部分很重要，一个是区块的解析器，一个是拉取区块的部分。

### 1.1 存储选型

数据存储的选型很重要，使用 MySQL 存储会带来一些问题，字段扩展困难，存储扩展不方便。除了存储之外，这些数据还需要能够支持多维度的搜索，这点 MySQL 显然也无法满足。

区块链通常使用 kv 数据库做存储，通常是 LevelDB、CauchDB、TiKV 等等，但是这类的数据库，对于搜索的支持比较差。而对于浏览器来说，搜索则是一个最重要的部分。

在这样的情况下， ElasticSearch 是一个很好的选择，ES 支持本身支持大量数据的存储，而且可以支持水平扩展。实时的搜索也能够满足前端数据展示的需要。

### 1.2 解析器的设计

区块链就是一个链状的结构，所有的区块通过计算前一个区块的 hash 连接在一起：

![](https://storage.googleapis.com/papyrus_images/9f1053b1b2acb0113d4637eee6748e1046bcf11b8c0066b48c54e99514e1a4e8.jpg)

每一个区块中则会打包一系列的交易：

![](https://storage.googleapis.com/papyrus_images/2a0ad01cdf7c81f845a0898e61c7fd14cc5ad965e4f6d084cf6b65a9431fee10.jpg)

在解析区块的时候，需要不断的将区块层层打开，直到将里面的每一笔交易都解析出来。然后按照不同的分类存储进 ES 中。看起来是一个挺复杂的过程，可以通过设计成单个接口来完成。

---

*Originally published on [Jerry Lee](https://paragraph.com/@jerry-lee/Oyjuh6dS4unkmOvS2Pul)*
