主页 > imtoken官网下载苹果版 > 比特币源码分析五:区块

比特币源码分析五:区块

imtoken官网下载苹果版 2023-06-29 14:48:56

比特币源代码分析一:概述

1.编译

1.环境准备

可以使用以下命令安装编译bitcoind所需的依赖库:

sudo apt-get install build-essential libtool autotools-dev autoconf automake libssl-dev libboost-all-dev libdb-dev libdb++-dev pkg-config libevent-devgit-core

2.复制比特币源代码并进入其目录

复制比特币源代码并使用以下命令进入其目录:

混帐克隆

CD比特币

3.编译bitcoind

首先生成编译源码所需的库配置,命令如下:

./autogen.sh

然后,生成makefile文件,命令如下:

./configure --without-gui

如果在生成makefile文件时遇到这样的提示:

配置:错误:找到 4.8 以外的 Berkeley DB,便携式钱包需要

然后你可以使用下面的命令:

./configure --without-gui --with-incompatible-bdb

如果关闭钱包接口功能,只提供比特币网络节点功能,使用以下命令:

./configure --without-gui --disable-wallet

接下来使用make进行编译,命令如下:

让-j

编译好的bitcoind、bitcoin-tx和bitcoin-cli在src目录下。

最后,使用以下命令安装已编译的二进制文件(可选):

安装

初期使用的主要有bitcoind(主要后台程序)和bitcoin-cli(用于与bitcoind交互的命令行程序)

二、跑

1.运行bitcoind –deamon后台运行程序(可以使用–help查看命令行),如果有调试需求比特币源代码有多少行,建议使用bitcoind –regtest命令启动,regtest是其中之一比特币的三种模式(mainnet、testnet和regtest),简单理解就是regtest是本地网络,策略都是自己控制的,而mainnet代表主链,testnet是测试链(区别于主链是挖矿更简单)

2.运行bitcoind-cli通过rpc消息与bitcoind进行交互

3.建筑

架构图

1)模块组成

1.p2p模块

代码主要分布在net.cpp和addrman.cpp中。 由于其运行也需要消息机制的支持,部分代码在net_processing.cpp中

该模块主要负责p2p网络,即底层通信,包括地址发现、地址维护、接收数据(消息)和发送消息等功能

2.消息处理模块

代码主要在net_processing.cpp

该模块主要负责接收、发送和处理消息

作者将其分为三种消息

1) VERSION、VERACK、ADDR、GETADDR、PING、PONG等p2p网络类型消息。

2)交易消息,如TX、INV、BLOCKTXN、GETBLOCKTXN、MEMPOOL等。

3)块消息,如SENDHEADERS、SENDCMPCT、INV、GETBLOCKS、GETHEADERS、CMPCTBLOCK、HEADERS、BLOCK等。

其中,交易和区块消息是理解整个系统工作的关键。 下图可以帮助整理代码

3.区块及交易验证模块

主要在validation.cpp

主要负责区块和交易的合法性验证(这里介绍的区块链的一些核心代码,包括脚本虚拟机、验证机制等非常重要)

4.交易池模块

主要在txmempool.cpp

该模块维护了一个交易池比特币源代码有多少行,池中的交易有多个来源

1) 通过网络发送的交易

2)本地产生的交易

3) 上链失败被送回拆分的交易(可能是工作量不够)

该模块是挖矿的源头,挖矿模块从该模块中选取交易生成区块

5.挖矿模块

主要在miner.cpp

该模块主要负责生成区块并尝试链接到主链(中间经过候选链)

主要负责根据手续费(手续费)、时间等从交易池中取出一些交易形成一个区块,生成符合标准的哈希(工作量证明),然后放入尝试链接到区块链的候选链

6. 候选区块链

是一个集合结构,变量是setBlockIndexCandidates,是一些经过验证的区块的集合,这是进入区块链(主链)的必经之路

7. 区块链

是一条链,变量是chainActive(validation.cpp),一条经过验证的主链,内部结构网上介绍的比较多,是由hash和prehash链接起来的链

2)工艺

1. 网络接收区块数据流

注:这里为了把流程的一些步骤说清楚,可能有些步骤过于简单甚至使用不当,后续系列会详细展开

2、挖矿过程

需要说明几点

1)区块的第一个tx是basetx,是本次挖矿的收益,即凭空产生一笔交易,没有输入,只有输出,输出到矿机的比特币地址所有者

2)挖矿是通过修改block header中的随机数和basetx中input script中的随机数(因为basetx不需要输入,input script可以添加其他信息,其中之一就是用于挖矿的随机数mining), 两个是由两个变量共同完成的。 许多资料只提到区块头中的随机数不正确。

3)挖矿是否成功是判断区块的哈希值是否符合标准。 简单的说就是前n位是否为0,n是根据历史挖矿时间确定的,称为挖矿难度。 如果平均出块时间大于10分钟,那么n就会变大,如果小于10分钟,n就会变小

下一篇文章将介绍比特币交易是如何通过非对称加密机制完成安全交易的。 欢迎互动,留下你想解释的问题和话题

由于作者能力有限,代码看了很久(没时间整理),可能写的有些错误,还请谅解