作者 | 李辉忠

来源 | FISCO BCOS开源社区

封图 | CSDN下载自视觉中国

区块链作为「新基建」的重要组成部分,越来越受技术爱好者关注。区块链极客信奉“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,但这套走读方法可以适用于任何其他区块链底层项目,希望本文对你有所帮助。

6月2日20:00,CSDN 创始人&董事长、极客帮创投创始合伙人蒋涛携手全球顶级开源基金会主席、董事,聚焦中国开源现状,直面开发者在开源技术、商业上的难题,你绝不可错过的开源巅峰对谈!立即免费围观

推荐阅读

  • 没错,你离分布式搜索只差一个Elasticsearch入门!

  • Python开发之:Django基于Docker实现Mysql数据库读写分离、集群、主从同步详解 | 原力计划

  • 全球Python调查报告:Python 2正在消亡,PyCharm比VS Code更受欢迎

  • 无代码来了,还要程序员吗?

  • 再见,Eclipse | 原力计划

  • 区块链共识算法总结 | 原力计划

老铁们在看签个到

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

  1. 如何用php农场项目,2020全新亲测php农场游戏源码-金币菇种植理财区块链源码 带商城系统...

    2020全新亲测php农场游戏源码-金币菇种植理财区块链源码 带商城系统+抽奖系统+独家搭建教程 金币菇一款复利理财游戏,在这里大家可以更轻松.愉快的进行理财投资!本源码是一套理财游戏盘系统,蘑菇只是 ...

  2. php区块链源码带语音播报|区块链理财|区块链游戏l抽奖功能|自动分红

    介绍: php区块链源码带语音播报|区块链理财|区块链游戏|抽奖功能|自动分红: 亲测搭建完美运行,搭建方式如下 测试环境:Apache 2.4.46或 Linux+nginx1.15.10 数据库: ...

  3. 最新5G时代投资区块链源码全修复版+对接免签支付+搭建视频

    最新5G时代投资区块链源码全修复版+对接免签支付+搭建视频教程 [亲测修复版]10月最新5G时代投资风口投资 区块链 源码全修复版订制UI完美版本+对接免签 支付 +搭建视频教程 现在5G是个热词,这 ...

  4. Py区块链源码笔记 (1)挖矿

    昨晚听大佬小课堂,给我普及一晚上区块链相关各种知识,深深感觉到自己宛如一个智障,我不配说自己是学计算机的啊-- 膜拜之余,转载大佬的文章,像大佬学习! 文章出处:Py区块链源码笔记 (1)挖矿 也欢迎 ...

  5. 区块链源码,已布局能源领域

    能源区块链的优点: 促进多方间安全.去中心化的交易:增强安全性与互信,减少欺诈:促进多方交易中的透明度和效率--都适用于能源领域.相比于金融等其他领域,能源领域不仅涉及到价值的转移,物理产品本身(例如 ...

  6. 区块链-02-BTC-密码学原理

    目录 区块链与密码学 一.哈希(散列)函数 二.密码散列函数(Cryptographic hash function) Collision resistance Hiding digital comm ...

  7. 区块链扫码溯源防伪直购,重构新零售信任体系建设

    目前的电商企业,客户的数据都被存储在为数不多的中心化数据库内,一旦电子商务公司遭受了网络犯罪分子的攻击入侵,大量数据将会被窃取. 但是,基于区块链的电子商务平台,由于区块链平台是分散的,所以实际上不可 ...

  8. 新闻|智链万源CEO董宁倾情加盟“产业区块链场景应用大课”

    产业区块链场景应用大课 5月15日晚20:00,智链万源CEO董宁鼎力支持由算力智库旗下算力大学主办"产业区块链场景应用大课",与大家分享有关"提档升级,农业弯道超车迈向 ...

  9. 牧场养牛区块链源码+带积分商城/抽奖/会员特权

    正文: 服务器系统:Linux + Centos7.x + 宝塔 亲测环境:Nginx 1.18.0 + PHP5.6 + Mysql5.5 数据库配置文件:/Public/config.php 其他 ...

最新文章

  1. 多个网站共享一个mysql数据库_如何在多个Postgresql数据库之间共享表
  2. 如何查看Android设备上的分区信息
  3. 从“鞭打快牛”故事来看团队的领导力
  4. arcgis设置nodata值_新版白话空间统计(6):在ArcGIS中实现莫兰指数计算
  5. 图片怎么压缩图片大小_图片的体积怎么压缩?这三种方法你会吗?
  6. VS2015 代码左缩进
  7. 红利,本质上来自于供求关系的不平衡
  8. SPSS 26 资源及安装教程
  9. matlab 关联矩阵,(案例)利用Matlab实践关联矩阵与邻接矩阵的转换
  10. 虚拟机VMware的安装及使用
  11. 关卡二:Flex伸缩布局
  12. 郑州轻工业大学2021-2022(1)期末模拟测试二答案
  13. 央央家政解读:育儿嫂服务内容和标准
  14. 微信小程序接入环信客服
  15. 2020-01-04
  16. 【知识图谱】Neo4j Cypher查询语言详解
  17. 用python转换PDF/Word/Excel/PPT等!
  18. 仿JD商城UI布局达到90%——Android源码
  19. CentOS双网卡双IP设置
  20. Visual Studio 卸载 Visual Assist番茄助手

热门文章

  1. 7Z解压缩包软件命令行详解
  2. webDriver以及Selenium使用总结
  3. 6个使用的Python脚本
  4. 奈何天(电影刀锋 1937)铃声 奈何天(电影刀锋 1937)手机铃声免...
  5. 【Java Web】Quartz定时任务执行两次的解决方法
  6. Imagick使用教程
  7. PNG格式文件的分析
  8. 嵌入式Linux专家,100ask创始人韦东山是怎样炼成的?
  9. 苹果系统自带滑动返回功能
  10. 代码计算体重是否标准