主页 > imtoken钱包哪个版本好 > 比特币源代码研究---开端

比特币源代码研究---开端

imtoken钱包哪个版本好 2023-03-24 05:15:54

比特币源码开发自己的币_比特币源码是什么语言_比特币矿池源码

比特币.png

0x00 为什么读

如果说18年前看懂比特币代码就是价值投资的基本操作,那么今年再看一遍绝对是信仰问题。 比特币作为虚拟货币的鼻祖,已经运行了近10年。 在没有集中架构的运作下,几乎没有发生过重大事故。 相信BAT的产品都不敢吹牛,所以作为技术人员,读读比特币代码是修炼内功的绝佳选择。 由于比特币代码不同于我们之前开发的C(B)/S结构,所以总是会比较难理解。 一件美妙的事情。 一次偶然的机会,我认识了中国第一批研究比特币代码的大师@鲜量子。 经过几次沟通,他组织我们一起做这件事。 特别感谢!

0x01 阅读思路

按照我以前的习惯,要想学习一门技术,首先要学会使用这门技术。 也就是说,学习使用比特币的成本还是相当高的。 按照今天的市场行情,一个BTC的价格在4万多人民币。 不过没关系,我们还有很多其他山寨币,它们的运作方式都是一样的。 3个月的时间,从交易所到钱包,从公链到侧链,从炒币到各种DAPP,我几乎玩遍了。 这个时候,我会学习区块链技术,知道如何过滤信息。 我身边的同事会越来越多。 当我遇到问题时,我将能够游刃有余地解决它们。

在开始阅读代码之前,《比特币白皮书》和《精通比特币》这两本资料是必须阅读的,是的,必须的。 看不懂也没关系,至少从宏观上对比特币技术有一个大概的了解,在脑海中对区块链有一个模糊的认识是非常重要的。 如果一开始就从某个技术细节入手,比如Cryptography、P2P,很容易走入死胡同,最后无疾而终。

比特币源码开发自己的币_比特币源码是什么语言_比特币矿池源码

比特币矿池源码_比特币源码是什么语言_比特币源码开发自己的币

精通比特币.jpg

0x02 环境搭建

工欲善其事,必先利其器。 首先,让我们选择一个版本。 我使用 Bitcoin Core Daemon 版本 v0.16.99.0-b1dc39d。 在开始阅读代码之前,我们先来搭建一下环境。 由于我常年在windows下开发,尝试过搭建bitcoin windows环境,网上也可以搜索教程,但是不建议大家这样做,因为这是一个巨大的坑,所以我不会详细介绍。 我选择的系统环境是Ubuntu 14.04 Server LTS,不太喜欢用桌面版。 具体的搭建教程可以在网上找到@南瓜子的教程,很详细,一步一步来吧。 sublime、vscode,甚至Idea,我都试过几个IDE,但是我觉得都不好用。 最重要的是“代码引用”功能没有得到很好的支持。 最后只好求助于Visual Studio,但是VS导入文件夹的功能不是很友好,只好先去Create Filter,再导入文件。 最后,我想强调一点关于代码调试。 可能很多朋友喜欢用Log来调试。 我个人喜欢调试。 我用的是gdb,但是需要注意的是,所有目录下的makefile一定要在make文件之前修改。 禁用编译优化,即将g++编译选项-O2改为-O0,这样就可以跟踪代码的完整执行过程。

比特币源码开发自己的币_比特币源码是什么语言_比特币矿池源码

图形数据库.jpg

0x03 目录结构&数据结构

比特币源码是什么语言_比特币源码开发自己的币_比特币矿池源码

整个项目的目录结构可以参考下图(图片来自网络)

比特币源码开发自己的币_比特币源码是什么语言_比特币矿池源码

目录结构.png

看了学长们的研究代码,基本都是从函数入口引入,根据函数跳转分析,也就是我们平时调试的callstack。 我的处理方式略有不同,从整个比特币数据结构开始。 我们都知道比特币代码是基于区块链技术的,我们脑子里都有链表的概念,都是通过指针一个一个连接起来的。 如果我们知道每个节点中的数据结构,甚至是内存布局,然后分析每个数据结构在代码中的作用,每个数据结构的组织方式,是Has-A还是Is-A,按照这一行想着读代码,你会更轻松,更快乐,更快乐。

首先我们来分析一下chain.h和chain.cpp这两个文件,其中包含了这样的类。

CBlock索引

比特币矿池源码_比特币源码是什么语言_比特币源码开发自己的币

CDiskBlockIndex

C链

该类的关系成员变量及关系图如下:

比特币源码开发自己的币_比特币源码是什么语言_比特币矿池源码

BlockIndex.jpg

我们来分析一下block.h和block.cpp这两个文件,其中包含以下类。

比特币矿池源码_比特币源码开发自己的币_比特币源码是什么语言

C块头

C座

C块定位器

该类的关系成员变量及关系图如下:

比特币源码开发自己的币_比特币源码是什么语言_比特币矿池源码

方块.jpg

比特币源码开发自己的币_比特币源码是什么语言_比特币矿池源码

从上面的分析可以看出,CBlockIndex是Block的内存索引,Block的详细数据是延迟加载(lazy-load)的比特币源码开发自己的币,只有在使用的时候才从硬盘数据中读取。 Block在硬盘上序列化的数据除了类中的成员变量外,还有一些额外的数据,如下图所示。 这些是不是很熟悉? 刚开始接触windows PE文件的时候比特币源码开发自己的币,思路和这个差不多。

比特币源码开发自己的币_比特币源码是什么语言_比特币矿池源码

区块数据库.jpg

有网友总结了一张比较简单粗暴的图,如下(图片来自网络),我很喜欢这张图,哈哈哈。

比特币源码开发自己的币_比特币源码是什么语言_比特币矿池源码

细节.png

0x04 摘要

本开篇主要介绍研究BTC代码的动机和方法。 立个Flag做一件事可能很容易,但坚持下去却不容易。 由于本人能力有限,文中有一些不恰当的描述。 , 请多多包涵。 下一节主要讲交易的数据结构,到时候见!