{"content":{"title":"联盟区块链底层源代码分析","body":"#  第00讲 核心内容介绍以及预备工作\r\n\r\n## 引言\r\n\r\n随着区块链技术的热度不断升高，大量基于区块链的应用也逐步落地，也引领了很多来自网络安全等专业的高校学者对于这项技术的深入学习。然而，目前无论从市面上的书籍还是各种教程来看，大多数内容还停留在区块链的应用层。从以太坊到Hyperledger Fabric，再到现在的多链生态，不断完善的建链脚本使得区块链底层平台的搭建越来越方便快捷。因此，很多初学者的区块链学习路线基本上为“建链——学习一种智能合约语言——SDK的使用——学习前后端——构建完整DAPP——应用场景下的问题解决”。这种学习路线固然符合当今区块链在金融、医疗、产业链、交通等方面火热的应用趋势，但也造成了一些问题。例如，很多初学者仅仅将区块链当作一种特殊的数据库来使用，将\"上链\"等同于“存储数据”，虽然开发了很多区块链DAPP，但是只对于区块链节点、智能合约、SDK等应用层方面的技术要素有所了解，而对于底层的共识算法、密码学原理、数据落盘、网络构建等底层逻辑并不熟悉。而在今天，除了区块链在各行各业的应用之外，跨链技术、DAG区块链、并行隐私合约、后量子/量子区块链等技术也是非常重要的研究内容，如果对于区块链底层的知识缺乏了解，则在这些技术的学习上难免会遇到瓶颈。\r\n\r\n前文已经阐述了学习区块链底层技术实现的必要性，那么当今在底层技术的教学上的现状又是如何呢？首先纵观市面上数不胜数的区块链书籍，技术类或理论类的书籍基本上会介绍一部分区块链的基础理论，但是相对简略，读者看完后或许对于几个要素的名称有了印象，但仍然不知道一个区块链平台底层到底是如何实现的。再看当今的一些区块链课程，大多课程主要围绕“介绍一种链——如何部署这种链——编写智能合约——构建DAPP”的讲授路线。事实上，这是非常好理解，也十分正确的。对于学生而言，这种路线能够快速让初学者入门，通过短时间学习就能够建链并搭建自己的DAPP，不断看到学习的效果也能够激发学者的兴趣；对于老师而言，如果过于集中于区块链底层源代码的讲解，则会使得课程过于枯燥，报名课程的学生也相对较少，毕竟能把《以太坊黄皮书》完整读下来，并把每个实现细节都看懂的人也不多。\r\n\r\n而笔者认为，将源代码融入基础概念的讲解是一种较为合适的授课方法。笔者希望通过本教程能够激发高校师生或者企业技术开发者对于阅读源码的兴趣，并善于在将底层实现逻辑烂熟于心的基础上，改造并创造自己的一套区块链架构。笔者深知这种教程的撰写难度很大，例如，全网有数不胜数的视频在讲Solidity智能合约编程，但能讲Solidity的C++实现源代码的教程又有多少。为了让读者更易理解，本套教程将集中于区块链底层原理并聚焦一种区块链的源代码实现来完整阐述底层实现逻辑。考虑到目前高校的计算机类专业，在低年级阶段开设C/C++程序设计课程较多，而很多高校学生对于像Golang这种编写底层更多的语言还比较生疏，因此本教程首先将基于由C++编写的FISCO BCOS展开。讲完FISCO BCOS源代码后，将针对SDK、中间件等技术源代码进行讲解。此外，随着量子计算机的发展，当前区块链所基于的散列函数和ECDSA数字签名算法可能会受到安全威胁，为了更好地助力研究后量子区块链的科研人员，本教程中也会着力介绍底层数字签名的源码实现部分。\r\n\r\n以上详细分析了本教程的意义所在，本文为本系列教程第0讲，主要介绍基础的准备工作，后续的讲义将陆续更新。由于目前笔者刚刚入驻本社区，还没有通过讲师认证，因此教程暂时以讲义的形式展现，后续若能通过认证的话，会上线配套的视频课程。\r\n\r\n## 准备工作\r\n\r\n### 下载源代码\r\n\r\n首先从github上下载对应的FISCO BCOS源代码，由于目前最新的FISCO BCOS 3.1.1版[Release FISCO BCOS v3.1.1 · FISCO-BCOS/FISCO-BCOS · GitHub](https://github.com/FISCO-BCOS/FISCO-BCOS/releases/tag/v3.1.1)包含了微服务架构，并划分为Air、Pro和Max三种体系，相对复杂，不利于初学者学习，因此本教程选择FISCO BCOS 2.9.1[GitHub - FISCO-BCOS/FISCO-BCOS at master-2.0](https://github.com/FISCO-BCOS/FISCO-BCOS/tree/master-2.0)，相对于FISCO BCOS 3.0的源码更为简单。如图所示，页面包含了一些基本的介绍信息，滚动页面到最下方，找到对应的源代码。\r\n\r\n\r\n![image-20221225122549821.png](https://img.learnblockchain.cn/attachments/2022/12/iDGe4G8b63a7e40d1f3f8.png)\r\n\r\n如下图所示，这里选择一种压缩格式的压缩包进行下载。\r\n\r\n\r\n![image-20221225122611837.png](https://img.learnblockchain.cn/attachments/2022/12/6BXwxm5H63a7e42ef0780.png)\r\n\r\n此时可以首先看一下CMakeLists.txt文件，可以看到项目还是非常庞大的，包括很多库，在后续的代码解析中，我们将针对各个模块进行讲解。因此，稍微埋个伏笔，后面编译的过程也会相对漫长。\t\r\n\r\n```C++\r\n# install dependencies\r\ninclude(ProjectTBB)\r\ninclude(ProjectSnappy)\r\ninclude(ProjectLevelDB)\r\ninclude(ProjectRocksDB)\r\ninclude(ProjectMHD)\r\ninclude(ProjectCryptopp)\r\ninclude(ProjectSecp256k1)\r\ninclude(ProjectJsonCpp)\r\ninclude(ProjectJsonRpcCpp)\r\ninclude(ProjectBoost)\r\ninclude(ProjectLibzdb)\r\ninclude(ProjectTCMalloc)\r\ninclude(ProjectLibFF)\r\ninclude(ProjectPaillier)\r\ninclude(ProjectEVMC)\r\ninclude(ProjectVRF)\r\ninclude(ProjectEVMONE)\r\ninclude(ProjectTASSL)\r\ninclude(ProjectGroupSig)\r\n\r\nif(USE_HSM_SDF)\r\n  include(ProjectSDF)\r\nendif()\r\n\r\ninclude_directories(\"${CMAKE_SOURCE_DIR}\")\r\n\r\nadd_subdirectory(libchannelserver)\r\nadd_subdirectory(libdevcore)\r\nadd_subdirectory(libdevcrypto)\r\nadd_subdirectory(libethcore)\r\n# add_subdirectory(libinterpreter)\r\nadd_subdirectory(libstat)\r\nadd_subdirectory(libflowlimit)\r\nadd_subdirectory(libtxpool)\r\nadd_subdirectory(libstorage)\r\nadd_subdirectory(libprecompiled)\r\nadd_subdirectory(libnetwork)\r\nadd_subdirectory(libp2p)\r\nadd_subdirectory(libexecutive)\r\nadd_subdirectory(libmptstate)\r\nadd_subdirectory(libblockverifier)\r\nadd_subdirectory(libstoragestate)\r\nadd_subdirectory(libblockchain)\r\nadd_subdirectory(libsync)\r\nadd_subdirectory(libconsensus)\r\nadd_subdirectory(libledger)\r\nadd_subdirectory(librpc)\r\nadd_subdirectory(libinitializer)\r\nadd_subdirectory(libsecurity)\r\nadd_subdirectory(libeventfilter)\r\n# generate executable binary fisco-bcos\r\nadd_subdirectory(fisco-bcos)\r\n```\r\n\r\n在阅读源代码前，可以回看一下FISCO BCOS官方文档中，对于源代码阅读这部分的提示。在官方文档中，有一篇由FISCO BCOS高级架构师李老师所撰写的文章《带你读源码：四大视角多维走读区块链源码》[带你读源码：四大视角多维走读区块链源码 — FISCO BCOS v2.9.0 文档 (fisco-bcos-documentation.readthedocs.io)](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/articles/2_required/go_through_sourcecode.html)。这篇文章对于多维走读源代码的不同视角进行了总结，主要包括功能视角、系统视角、用户视角、以及开发视角。本教程主要基于文中总结的走读逻辑，进一步将源码解拆为几大模块，结合文中的功能视角和系统视角展开。\r\n\r\n下面简要介绍阅读C++源代码所用的开发环境的搭建，如果读者已经有C/C++的相关编程经验，则可以跳过本文的后续部分，继续学习第01讲内容。为了迎合初学者，本教程采用最新的Visual Studio 2022，在官网下载即可。遇到下载错误可以参考[Visual Studio下载失败解决方法（明明有网却下载不动）_冷淡少年的博客-CSDN博客_visual studio下载不动](https://blog.csdn.net/weixin_47153828/article/details/118963863)。\r\n\r\n![image-20221223165436485.png](https://img.learnblockchain.cn/attachments/2022/12/3hXja6v763a7e4759f4cc.png)\r\n\r\n将FISCO BCOS项目用VS打开如下，在打开文件时，要点击CMakeLists.txt文件。\r\n\r\n![image-20221225124546086.png](https://img.learnblockchain.cn/attachments/2022/12/5BLgC0JF63a7e45d89fa7.png)\r\n### C++20新特性\r\n\r\n在FISCO BCOS的C++源代码中，用到了相当多的C++20的知识，相对于学校里学过的C++11等标准有一定的出入，在此笔者建议在开启后续的学习之前，先大体了解一下C++20的新特性，以利于后续代码的阅读。提供参考的学习资料如下[10分钟速览 C++20 新增特性 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/137646370)、[C++20 新特性全在这一张图里了 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/472805041)、[C++20 - cppreference.com](https://en.cppreference.com/w/cpp/20)。\r\n\r\n这部分内容，后续会根据各位的建议，逐步添加。\r\n\r\n### 源码编译\r\n\r\n课程核心在于源码解读，因此了解如何基于源代码进行编译，并生成二进制可执行文件十分重要。下面基于FISCO BCOS官方文档[FISCO BCOS 源码编译 — FISCO BCOS v2.9.0 文档 (fisco-bcos-documentation.readthedocs.io)](https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/tutorial/compile.html)对于如何进行源码编译进行详细讲解。\r\n\r\n在操作系统方面，官方文档中提供了**Ubuntu**、**CentOS**和**macOS**三种系统，出于便利性的考虑，本教程选择Ubuntu 20.04.5。初学者可能会更喜欢用Ubuntu 22.04版本，但是从实际体验角度来看，Ubuntu 22.04预装的工具版本比较高，在执行一些操作时，难免出现一些不兼容的情况。为了避免后续重装工具的麻烦，本文选择了Ubuntu 20.04.5。配置操作系统的过程不再具体赘述，可以参考[Ubuntu（Linux）虚拟机的安装教程（最为详细）_杂货店的阿猿的博客-CSDN博客_ubuntu虚拟机安装教程](https://blog.csdn.net/weixin_45877759/article/details/107017669)。下面依次进行源码编译的三个步骤。\r\n\r\n（1）安装构建工具和依赖包\r\n\r\n考虑到后续讲解FISCO BCOS 3.0的需求，这里将依赖一次性安装好，执行命令行如下\r\n\r\n```shell\r\nsudo apt install -y wget python3-dev git curl zip unzip tar\r\n```\r\n\r\n![image-20221224105356718.png](https://img.learnblockchain.cn/attachments/2022/12/Q1IErTzp63a7e4d791b2f.png)\r\n\r\n```shell\r\nsudo apt install -y --no-install-recommends clang make build-essential cmake libssl-dev zlib1g-dev ca-certificates libgmp-dev flex bison patch libzstd-dev ninja-build pkg-config\r\n```\r\n\r\n![image-20221224105616308.png](https://img.learnblockchain.cn/attachments/2022/12/cGMNpH9k63a7e4e894d9e.png)\r\n\r\n```shell\r\n# 安装rust\r\ncurl https://sh.rustup.rs -sSf | bash -s -- -y\r\nsource $HOME/.cargo/env\r\n```\r\n\r\n![image-20221224105901293.png](https://img.learnblockchain.cn/attachments/2022/12/rJHejFEt63a7e4f8e6238.png)\r\n```shell\r\n#安装cmake\r\n#请勿使用语句sudo apt-get install make，因为版本要求3.22这种下载方式会导致后续命令报错\r\n#先检查是否已经存在cmake\r\nwhich cmake\r\ncmake --version\r\n#如图所示，此时cmake版本太低，需要先卸载cmake再重装\r\n```\r\n\r\n\r\n![image-20221224143103973.png](https://img.learnblockchain.cn/attachments/2022/12/K1jjxpcE63a7e6f532e84.png)\r\n\r\n\r\n```shell\r\n# 卸载cmake\r\nsudo apt-get remove cmake\r\n# 拉取安装包\r\nwget https://cmake.org/files/v3.22/cmake-3.22.2.tar.gz\r\n# 解压\r\ntar -zxvf cmake-3.22.2.tar.gz\r\ncd cmake\r\n./bootstrap\r\nmake\r\nsudo make install\r\n# 检查是否安装成功\r\ncmake --version\r\n# 显示cmake version 3.22.2则安装成功\r\n# 若未正常显示版本，执行export PATH=$PATH:/usr/local/bin/cmake\r\n```\r\n\r\n![image-20221224151309119.png](https://img.learnblockchain.cn/attachments/2022/12/XbSiXQT863a7e53ce9dd3.png)\r\n\r\n\r\n![image-20221224151540772.png](https://img.learnblockchain.cn/attachments/2022/12/EfcVwD8c63a7e7515ba45.png)\r\n\r\n![image-20221224155832084.png](https://img.learnblockchain.cn/attachments/2022/12/hrwQYBsB63a7e763239a9.png)\r\n\r\n\r\n（2）克隆代码\r\n\r\n```shell\r\n# 创建源码编译目录\r\nmkdir -p ~/fisco && cd ~/fisco\r\n\r\n# 克隆代码\r\ngit clone https://github.com/FISCO-BCOS/FISCO-BCOS.git -b master-2.0\r\n\r\n# 若因为网络问题导致长时间无法执行上面的命令，请尝试下面的命令：\r\ngit clone https://github.com/FISCO-BCOS/FISCO-BCOS.git -b master-2.0\r\n\r\n# 切换到源码目录\r\ncd FISCO-BCOS\r\n```\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2022/12/XuUJAu0S63a7e7baced43.png)\r\n\r\n（3）编译源码\r\n\r\n```shell\r\n# 创建编译目录\r\nmkdir -p build && cd build\r\n# 编译依赖\r\ncmake ..\r\nmake -j2\r\n```\r\n\r\n![image-20221225125546029.png](https://img.learnblockchain.cn/attachments/2022/12/bxABQVu363a7e61de2f26.png)\r\n\r\n![image-20221225125623407.png](https://img.learnblockchain.cn/attachments/2022/12/Ry4XFlaB63a7e62a79fa2.png)\r\n出现以下结果即为编译成功\r\n\r\n![image-20221225133152394.png](https://img.learnblockchain.cn/attachments/2022/12/XD7KxECY63a7e63523faa.png)\r\n\r\n 编译完成后二进制文件位于build/bin/fisco-bcos，可以找到可执行文件，验证fisco-bcos版本如下\r\n\r\n![image-20221225133259202.png](https://img.learnblockchain.cn/attachments/2022/12/VxkBoHmG63a7e63ecff01.png)"},"author":{"user":"https://learnblockchain.cn/people/11990","address":null},"history":null,"timestamp":1671948458,"version":1}