速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

带你读源码:四大视角多维走读区块链源码

  • 2020-05-29
  • 本文字数:3005 字

    阅读完需:约 10 分钟

带你读源码:四大视角多维走读区块链源码

引子

区块链作为「新基建」的重要组成部分,越来越受技术爱好者关注。区块链极客信奉“code is law”,相信通过代码可以构筑一个可信的世界。


而作为一门综合学科技术,区块链建立在数学、密码学、计算机原理、分布式网络和博弈论等众多基础学科之上,底层代码动辄数十万行,如果没有摸清门道,要完全掌握这些代码是极具挑战的。


本文希望给读者一个走读区块链源码的方法,让读者面对区块链底层项目时可以从容地说出“show me the code”。

基础知识储备

区块链是一门综合学科,涉及多个专业领域,涵括多方面的基础知识,在深度研究区块链之前需要做一定广度的知识储备。注意,这里说的是广度,并非深度,也就是说你只需要大概知道这些基础知识的基本原理与作用即可。



  • 密码学相关:理解哈希、对称加密、非对称加密以及数字签名的基本原理和作用;

  • 计算机操作系统相关:理解多进程、多线程、互斥、并行等相关概念和作用;

  • 数据结构相关:理解队列、堆栈、树等基本数据结构和使用场景;

  • 计算机网络相关:理解 TCP/IP、心跳包、消息流等基本概念;

  • 数据库相关:理解数据库基本概念,了解 KV 数据库的基本原理;

  • 计算机原理相关:理解程序编译、解析、执行和字节码、虚拟机等概念;

  • 分布式系统相关:理解点对点网络、分布式一致性、CAP 等相关概念和基本原理;

  • 程序开发相关:掌握相关的编程语言、构建工具等,理解项目构建基本流程。

多维走读

在储备了相关的基础知识之后,你就可以打开一份真正的区块链底层代码了,一般通过 git clone 可以快速下载到项目代码。


但是,面对数十万行的代码,该从何看起呢?


庖丁为文惠君解牛,手之所触,肩之所倚,足之所履,膝之所踦,砉然向然,奏刀𬴃然,莫不中音:合于《桑林》之舞,乃中《经首》之会。

—出自《庄子·养生主》


一个优秀的区块链底层项目,必然有一份优秀的工程代码,这份代码有其合理的组织结构与纹理逻辑。走读代码应效仿庖丁解牛,先摸清区块链的基本结构和逻辑,再开始走读,可以达到事半功倍的效果。


本文推荐要从四个不同视角进行走读,站在自己的需求角度出发去看代码,而不要被巨量的代码所左右。这四个角度为功能视角、系统视角、用户视角和开发视角,分别从逻辑层面、运行层面、使用层面和开发层面厘清代码架构和关键算法。


功能视角

在深入一份区块链底层代码之前,首先要通过其官网、技术文档、github wiki 等渠道获取项目设计文档,了解其基本功能设计。


一般每个项目都会提供核心功能列表、总体架构图、功能模块图等介绍文档,通过这些介绍可以掌握项目基本功能。即使你真的找不到也不打紧,大部分区块链底层项目在功能设计层面的差异较小,核心功能模块也大致相同。



以 FISCO BCOS 为例,基础层代码如下:



核心层核心代码如下:



接口层核心代码如下:



从功能视角出发,先定位核心功能模块的代码位置,再仔细深入各个功能代码,从单个功能模块内,也可继续递归采用功能视角拆分法,广度遍历直至了解全貌。

系统视角

系统视角从整个区块链网络运行角度,关注区块链节点全生命周期所参与的系统行为。


关注点包括从敲下启动节点的命令开始,节点经历了哪些初始化环节,之后又是如何与其他节点建立点对点网络,以及完成分布式协作的。


由于不同区块链在部署架构上略有差异,系统运行方式也有所不同,但万变不离其宗,系统视角来看,每个区块链系统都要经历节点初始化、建立点对点网络、完成分布式交互的过程。



从系统视角看区块链,首先要关注初始化工作。以 FISCO BCOS 为例,区块链节点启动从 main 函数入口进入,通过 libinitializer 模块初始化并启动各模块,启动顺序如下:



通过启动顺序可以知道 FISCO BCOS 的一个重要特性——支持多群组账本,每个群组是一个独立的 Ledger 模块,每个 Ledger 具有独立的存储、同步、共识处理功能。


完成初始化工作同时,系统将会启动若干线程(或者进程、协程,原理类似),这些线程包括网络监听、共识、消息同步等,可以结合代码分析与系统命令查看运行节点配合确定有哪些关键线程,搞清楚关键线程的工作机制就可以基本掌握区块链系统运行机制。


以 FISCO BCOS 为例,节点启动之后的关键线程以及他们之间的关系如下:



初始化完成之后,网络模块的 Host 线程将根据配置列表,主动与其他节点建立连接,并且持续监听来自其他节点的连接;Sync 线程开始相互发送区块高度,发现高度低于其他节点则开启下载逻辑;RPC 与 Channel 线程等待客户端发送请求,将收到的交易塞入 txpool;Sealer 线程从 txpool 获取交易,Consensus 线程则开始处理共识消息包。


如此,整个区块链系统有条不紊地运转,完成客户端请求与分布式协作。

用户视角

用户视角关注操作接口和交易生命周期,关注访问区块链的接口和协议设计、编解码方式、核心数据结构、错误码规范等,还会关注如何发送一笔交易到链上,交易在链上又经历了哪些处理流程,直到达成全网共识。


一般区块链底层项目都会给出交互协议的说明文档,通常实现包括 JsonRPC、gRPC、Restful 等不同类型的交互协议。


不同项目的交互接口会有所不同,但大都会包含发送交易、部署合约、调用合约、查看区块、查看交易以及回执、查看区块链状态等接口。不同项目的数据编码也会有所不同,有些采用 Json,有些采用 protobuf 等。


当从技术文档中了解清楚交互协议、接口、编解码和错误码等设计细节之后,接下来最重要的是通过发送交易、部署合约、调用合约这些关键接口,对代码进行抽丝剥茧,贯穿交易整个生命周期,从而搞清楚区块链底层最核心的逻辑。


以 FISCO BCOS 为例,通过多个模块相互协作,完成交易整个生命周期的处理:


开发视角

开发视角关注的是整个代码工程,包括第三方依赖,源码模块之间的相互关系,单元测试框架和测试用例,编译和构建方式,持续集成和 benchmark,以及如何参与社区源码贡献等等。


不同语言都有相应推荐的编译构建方式以及单测框架,通常在区块链项目源码目录可以快速定位到第三方依赖库,比如以 cmake 构建的 C++项目有 CmakeLists.txt 文件,go 项目有 go.mod 文件,rust 项目有 cargo.toml 文件等。



以 FISCO BCOS 为例,从 CmakeLists.txt 可以看到依赖库包括:



项目核心源码包括 fisco-bcos 程序入口代码,以及 libxxx 的各模块代码,根据模块的名字可以快速识别其对应功能,这里也体现了一个项目源码质量的高低,高质量的代码应该是“代码即注释”。


单元测试代码在 test 目录,采用 boost 的单元测试框架,子目录 unittests 中单测代码与源码目录一一对应,非常容易找到源码对应的单元测试代码。


构建和持续集成工具代码在 tools 目录,子目录 ci 中维护了多个不同场景的持续集成用例,在 github 提交的每一个 pr(pull request)都会触发这些持续集成用例,当且仅当每个用例成功通过方可允许合入 pr。


关于 FISCO BCOS 的代码规范和贡献方式,在 CODING_STYLE.md 和 CONTRIBUTING.md 文件中有详细描述,鼓励社区用户积极参与贡献。

总结

区块链涉及领域和知识较多,需要深入源码细节,才能真正完全掌握区块链核心技术。所谓“重剑无锋,大巧不工”,掌握源码走读的基本方法论,才能在巨量代码前,面不改色心不跳。


本文提出从功能、系统、用户和开发四个不同视角进行区块链底层代码走读的方法,一般来说,依次选择不同视角进行走读是比较推荐的方式,也可以根据个人喜好和能力模型选择视角顺序。


最后,本文所举示例皆为 FISCO BCOS,但这套走读方法可以适用于任何其他区块链底层项目,希望本文对你有所帮助。

关于作者

李辉忠,FISCO BCOS 高级架构师。


2020-05-29 11:474170

评论 1 条评论

发布
用户头像
很关注这么美的图是怎么画出来的?😁
2020-05-31 23:41
回复
没有更多了
  • 深入理解 Go 语言中的封装机制

    封装,也就是所谓的信息隐藏,是面向对象编程的一个重要方面。封装被定义为将数据包裹在一个单一的单元下。它是将代码和它所操作的数据绑定在一起的机制。从另一个角度来说,封装是一个保护罩,防止数据被这个保护罩外的代码访问。

    2023-04-23

  • 04|网络:如何设计高性能的网络模块?

    网络模块的性能很大程度上决定了消息传输的能力和整体性能。

    2023-06-28

  • 10|从基础功能拆解 RabbitMQ 的架构设计与实现

    分析 RabbitMQ 在通信协议、网络模块、存储模块、生产者、消费者等五个模块的设计思路。

    2023-07-12

  • 已膜拜,GitHub 大佬的微服务资源库太强了,每份学习手册都优质详细

    在面试的时候,项目考题的重要性不言而喻。分布式和微服务则是在项目考察中难以越过的点。以一个项目的初期到成熟期为例,循序渐进深入到分布式系统中,层层递进剥开项目的本质,并且还要具备围绕这个本质去深度思考的能力。而微服务则是基于分而治之的思想演

    2023-05-31

  • 07|数据获取:什么是 Scrapy 框架?

    这节课我们来深入了解一下Python中的常见爬虫框架:Scrapy框架。我们将学习什么是Scrapy框架、它的特点是什么以及如何安装和使用它。

    2023-04-24

  • 6. 消息队列代码实战

    2023-09-26

  • 4. Scala 的各种数据结构

    2023-09-08

  • Nautilus Chain NautDID NFT 将上主网,Layer3 数字身份时代开启

    Nautilus Chain 是行业内首个模块化 Layer3 链,其采用Celestia模块化底层,并通过ZK Rollup 技术来增加隐私。Nautilus Chain 允许开发者以定制化的方式,通过 Nnautilus 开发者可以更广泛化的在一揽子的模块中,选择适合自己的方案,从而选择发展DAPP-Chain

    2023-07-16

  • 解析架构设计:构建可靠、高效的软件系统

    软件架构是指系统的顶级结构,对于复杂的系统,往往很难表达清楚,涵盖的功能和应用太多,为了便于开发者和用户理解,减少沟通成本,降低因理解不一致带来的偏差。故而采用“分而治之”的方法,从不同视角来描述系统,也就是说,每一种架构图,都是一种视角。

    2023-07-31

  • 2023 年低代码发展新趋势

    在数字化转型、新冠疫情、全球经济环境动荡等多因素驱动下,低代码开发平台市场规模和场景化落地实现快速增长。Gartner调查发现,到2025年,整体LCAP市场规模将达到290亿美元,年复合增长率超过20%以上。越来越多的本地和全球参与者从不同的群体中涌现出来,

    2023-02-10

  • 前端 AST 详解,手写 babel 插件

    抽象语法树(Abstract Syntax Tree,AST),是源代码(不仅限于JavaScript,同时还应用于其他语言,例如: Python,Rust等)语法结构的⼀种抽象表示。它以树状的形式表现编程语⾔的语法结构,树上的每个节点都表示源代码中的⼀种结构。

    2023-06-07

  • Apipost 接口自动化测试功能详解

    要测试多个接口,需要有一定的逻辑关系,哪个接口先执行、哪个接口后执行、哪个接口需要多次执行、哪个接口需要等待执行等,在postman中是无法实现的。Apipost不需要写脚本代码,只需要简单的“点点点”,就能实现复杂逻辑的自动化测试。

    2023-01-06

  • 干货 | 接口自动化测试分层设计与实践总结

    本文以笔者当前使用的自动化测试项目为例,浅谈分层设计的思路,不涉及到具体的代码细节和某个框架的实现原理,重点关注在分层前后的使用对比,可能会以一些伪代码为例来说明举例。

    2022-10-12

  • 6.RocketMQ 源码启动服务

    2023-09-29

  • 图解 KafkaConsumer SyncGroupRequest 请求流程

    当我们JoinGroup完成之后, 消费者客户端收到了Response, 然后就会立马发起SyncGroupRequest 相关代码如下

    2022-11-16

  • OP 链质押挖矿系统开发源码搭建

    区块链技术作为一种分布式的去中心化技术【系统I8I 开發-2591 合约3365】已经被广泛应用于金融、物联网等领域。而DApp(去中心化应用)则是区块链技术的重要应用方向之一。和传统的应用开发不同,DApp开发采用了零撸代码的新模式。

    2023-10-10

  • MetaForce 佛萨奇系统开发技术流程(成熟代码)佛萨奇 2.0 源码部署教程

      在Hyperledger Fabric中,链码一般分为:(刘森-180-2857-8624)

    2023-02-01

发现更多内容

先到先得!Alibaba甩出第四次更新的JDK源码高级笔记(终极版)

热爱java的分享家

Java 源码 jdk 面试 经验分享

Java开发基础之开发环境搭建

@零度

JAVA开发

架构实战营模块 9 作业指导

华仔

架构实战营

龙智携手Atlassian亮相GOPS全球运维大会,助力企业高效开发与运维

龙智—DevSecOps解决方案

运维 运维大会 GOPS大会

使用kubeadm快速搭建K8s环境

walker12138

ETL工具算法构建企业级数据仓库五步法

大数据技术指南

11月日更

智慧园区一体化管理平台开发,园区智能化集成系统

电微13828808271

CWE4.6标准中加入 OWASP 2021 TOP10

华为云开发者联盟

漏洞 cwe 软件安全 CWE4.6 OWASP

【干货】大数据开发之Spark总结

@零度

大数据 spark

HBase 的协处理器详细剖析

五分钟学大数据

11月日更

《致命愿望》:与魔鬼签订契约

爱奇艺技术产品团队

Kvrocks 发布 Exporter 工具

Kvrocks

redis Prometheus kvrocks

基于CarbonData的电信时空大数据探索

华为云开发者联盟

大数据 网络 电信 CarbonData 无线通信网络

Linux学习有用吗?《Linux一学就会》教你如何学会Linux

侠盗安全

Linux 运维 云计算架构师 linux电子书

Java 项目中使用 Resilience4j 框架实现异步超时处理

码语者

Java TimeLimiter 超时管理

10年阿里人告诉你:秒杀系统设计就该这么玩

热爱java的分享家

Java 架构 程序人生 编程语言 经验分享

基于内存通信的gRPC调用

Robert Lu

gRPC Go 语言

本周话题:元宇宙到底是不是未来?

InfoQ写作社区官方

话题讨论 元宇宙

高可用是什么意思啊?行云管家支持高可用部署吗?

行云管家

高可用 服务器 IT运维

模块四 千万级学生管理系统的考试试卷存储方案

微信 ClickHouse 实时数仓的最佳实践

科技热闻

Tapdata “设擂招贤”携手 LeetCode 举办全球极客技术竞赛

tapdata

质量基础设施“一站式”线上平台搭建,NQI一站式综合平台解决方案

电微13828808271

前端开发规范之代码规范

@零度

大前端

「Oracle」Oracle 数据库基本概念

恒生LIGHT云社区

数据库 oracle

【活动预告】Apache ShardingSphere 5.0.0 全新 Database Plus 架构演进

SphereEx

开源社区 ShardingSphere TiDB SphereEx 线下沙龙

加速云原生应用落地,焱融 YRCloudFile 与天翼云完成兼容性认证

焱融科技

云计算 分布式 云原生 高性能 文件存储

破解数据匮乏现状:纵向联邦学习场景下的逻辑回归(LR)

华为云开发者联盟

联邦学习 数据隐私 数据安全 逻辑回归 纵向联邦学习

【活动预告】下一代数据平台走向何方?

SphereEx

大数据 大前端 ShardingSphere SphereEx 线上沙龙

Apache Tomcat 7.x安全加固指南

喀拉峻

网络安全 安全 信息安全

下单延迟10s撤单性能测试

FunTester

性能测试 延迟队列 接口测试 测试框架 FunTester

带你读源码:四大视角多维走读区块链源码_语言 & 开发_李辉忠_InfoQ精选文章