比特币学习笔记与理解

一、比特币相关概念理解

1、比特币解决的核心问题——“双重支付”

可以说比特币最大的创新是用非中心的方式解决了“双重支付”问题。之前已存在的交易系统,都是中心化的,由一个中心化的机构(例如银行)来管理记录一个账本,可以说非常简单粗暴的解决了“双重支付”,其安全保证是这个中心机构自身非常强大,很难攻破。而比特币解决这个问题,不是依靠单个节点的强大,而是依靠整个网络,通过整个网络维护一个公共的账本。

可以这样理解,中心化机构解决“双重支付”,不是因为它是中心化机构,不是因为它自身强大安全系数高,而是因为它知道所有人的交易。同一笔钱,A发B,A又发给C,系统因为掌握了所有的交易,所以能够检测出第二笔交易是非法交易。但是这个中心化机构的安全成本是非常高的。比特币为了解决“双重支付”,它的思路是,既然我单个节点不足以保证安全性,我就依靠整个网络来保证,我将每笔交易都告诉网络上所有的人(交易创建后会广播到全网),把整个网络看为一个中心化系统。这样这个网络知道所有的交易,问题就解决了。但是一个新的问题是,这么多节点(网络中可能存在恶意节点),到底谁说了算,于是POW共识算法诞生,由POW算法,随机的从分布式网络中选取一个节点,由这个节点处理交易(出新块,广播到全网,经过验证后加到最长链中,如果分叉,较短的链会被抛弃)。由于诚实节点拥有系统大部分的算力,恶意攻击者的拥有的算力少,其攻击链长度是很难超过正常链攻击成功的。其系统安全性,由整个网络的算力保证。如果要成功攻击,攻击者至少需要控制整个网络51%的算力,而这个攻击成本是非常巨大的。另外比特币为了维护网络的运行及鼓励诚实节点,设有挖矿、交易费等经济奖励机制,鼓励拥有算力的节点自觉维护网络而不是攻击网络。

2、51%攻击

比特币的安全性由整个系统的庞大算力保证,如果要成功的攻击比特币,攻击者生成的区块高度要高于正常链区块的高度,并且要持续生成攻击区块保持是分叉链分支中的最长链(否则会被抛弃,攻击失败),才有可能攻击成功。所以攻击者就需要掌握超出系统诚实节点的算力,即至少要51%,才有大概率攻击成功。也不是绝对的,少于51%的算力也可能攻击成功,只是概率上可能性非常低,具体的分析,在比特币的论文的结尾有数学推理计算。

补充一点,在分叉的链上,一个新的区块加入到那个分叉链上,是通过区块头部中前一区块哈希值决定的。所以,攻击者制作的攻击分支,后面的攻击区块也会加入到攻击分支链中,但这条攻击链除非掌握巨大算力支持,否则是跑不过正常分支链的,攻击分支会被抛弃。

3、新区块校验

一个新区块生成并广播后,并不直接加入到最长链中,而是需要经过校验后才可以。即每个新区块都需要通过网络中每个节点的校验。当新区块在网络中传播时,每一个节点在将它转发到其节点之前,会进行一系列的测试去验证它。这确保了只有有效的区块会在网络中传播。独立校验还确保了诚实的矿工生成的区块可以被纳入到区块链中,从而获得奖励。行为不诚实的矿工所产生的区块将被拒绝,这不但使他们失去了奖励,而且也浪费了本来可以去寻找工作量证明解的机会,因而导致其电费亏损。当一个节点接收到一个新的区块,它将对照一个长长的标准清单对该区块进行验证,若没有通过验证,这个区块将被拒绝。

每一个节点对每一个新区块的独立校验,确保了矿工无法欺诈。为什么矿工不为他们自己记录一笔交易去获得数以千计的比特币?这是因为每一个节点根据相同的规则对区块进行校验。一个无效的coinbase交易将使整个区块无效,这将导致该区块被拒绝,因此,该交易就不会成为总账的一部分。矿工们必须构建一个完美的区块,基于所有节点共享的规则,并且根据正确工作量证明的解决方案进行挖矿,他们要花费大量的电力挖矿才能做到这一点。如果他们作弊,所有的电力和努力都会浪费。这就是为什么独立校验是去中心化共识的重要组成部分。

4、区块链创造信任?

经常看到有区块链创造了信任这种观点,我是这样理解的,并不是区块链创造了信任,而是区块链在一定程度上取代了原有中心化机构的职能。在安全性上,区块链系统并不一定优于中心化的机构。

5、比特币实现宏观理解

比特币核心实现由链、共识算法、P2P网络三大部分组成。链负责处理交易的生成,交易验证,维护交易内存池,区块上链,区块验证,同步,处理孤块,分叉等。共识算法POW,负责产生新块。P2P网络负责连接比特币的其他节点,转发交易与区块等信息。

对于链,初始完成创世块创建后,一般先会进入一个同步阶段(涉及获取其他节点的块数据,还有验证,所以这个阶段比较慢),一直同步到最新块,关于同步目前由两种主要方法,区块优先和区块头优先。因为POW共识可能会产生分叉,区块链还要处理分叉这种情况。对交易,一般会将交易放在内存池中,完成交易验证,优先级处理等,因为是放在内存中同时有优先级的问题,所以,有可能会有交易没有上链节点就关闭了。补充一点,验证无处不在,在这部分,验证工作占了很大的比重。

对于共识算法,如果熟悉传统分布式共识算法,POW可以理解为利用HASH函数的难题友好性随机的从所有参与共识的节点中选举出一个leader,由这个节点决定新块,再广播到所有节点。POW可能会使链产生分叉,所以交易的确认时间较长,如果当前节点发现了一条更长的链,现有较短的链将被废除,区块中的交易将会回退到交易内存池中。

对于P2P网络,比特币节点会首先连接到一个已知的节点(也可以是种子节点),进而获取到更多的节点信息,保存到本地,下次连接时可首先从本地获取其他节点信息。

如果要更多比特币实现细节,可参考Bitcoin Developer Guide。中文翻译比特币开发者指南。

6、比特币源码

整体理解比特币的宏观概念后,就可以开始阅读比特币源码,比特币源码是使用C++开发的,数据库方面使用Google的LevelDB数据库存储区块链元数据,网络相关方面使用ZeroMQ、libevent,钱包图像界面使用Qt,密码学方面应用openssl库,还有一部分是自己实现的,主要涉及椭圆曲线算法secp256k1,哈希函数SHA256,RIPED160等。

比特币源码分析可参考比特币源码解读之前期准备,这里有关于源码分析的一系列文章,讲解的很好。作为阅读源码的开始,比特币的main函数在bitcoind.cpp中。获取源码git clone https://github.com/bitcoin/bitcoin.git。打开bitcoind.cpp,main函数如下所示:

int main(int argc, char* argv[]) {
    SetupEnvironment();

    // Connect bitcoind signal handlers
    noui_connect();

    return (AppInit(argc, argv) ? EXIT_SUCCESS : EXIT_FAILURE);
}

初始化部分的代码看完后,可以围绕交易来屡思路,毕竟比特币这个系统是为交易服务的,可以从交易的产生,广播,验证,产生新块,入链这一交易的生命周期来走。

7、比特币组织流程简图

下图是从网络中截取的比比特币组织流程简图:
比特币学习笔记与理解_第1张图片

二、比特币架构

比特币架构图如下所示:
比特币学习笔记与理解_第2张图片

简单说明:

  • 钱包——钱包保存用户的私钥数据库,管理用户余额,提供比特币交易功能。
  • 区块链管理——涉及初始区块链下载、连接区块、断开区块、校验区块、保存区块以及发现最长链条的顶区块。
  • 内存池管理——比特币内存池管理也就是交易池管理。节点将通过验证的交易放在一个交易池中,准备放在一个挖到的区块中。当矿工挖到一个合格的区块后,他将按一定的优先级次序从交易池中选出交易放到区块中。当区块填满后,剩下的交易会留在内存池,等待下一个区块的到来。
  • 邻节点管理——下面有一小节单独说明邻节点管理。
  • 密码模块——主要是处理比特币地址,采用RIMEMD和SHA-256算法以及Base-58编码来生成比特币地址。
    这里写图片描述
1、节点管理

当一个新比特币节点做初始启动(bootstrap)的时候,它需要发现网络中的其他节点,并与至少一个节点连接。一般是与一个已知的节点在8333端口建立TCP连接。连接的“握手”流程发送一个版本信息,包括:P2P协议版本,本节点支持的服务,当前时间,对方节点IP地址,本节点IP地址,比特币软件版本,以及本节点当前区块链长度。对方节点收到握手信息后会回复一个收到确认的消息。

新节点如何发现邻节点?

  • 第一个方法是用一些“DNS种子”查询DNS。“DNS种子”是提供比特币节点地址的DNS服务器。比特币核心带有5个不同的”DNS种子“。DNS种子可提供稳定的比特币节点地址。
  • 第二个方法是直接把一个已知的邻节点作为种子节点,然后通过它发现更多的邻节点。当发现新的邻节点后,新节点一般将断开和种子节点的连接。新节点将其地址信息发给邻节点,邻节点会继续将新节点的地址转发给它们的邻节点,这样新的节点会在网络上被其他节点知道,并保持其在网络上连接的畅通。新节点启动结束后,会记住最近连上的邻节点的地址。当它重新启动的时候,就能很快地完成完成和已知邻节点的连接。如果一个节点和邻节点的连接在90分钟里没有联系,该邻节点会被认为下线,节点会寻找一个新的邻节点来进行连接。因此,无需中心控制,网络节点可以自由加入或离开网络,比特币网络能动态地调节节点的连接,以保证比特币网络的正常运行。
2、P2P网络管理

P2P网络管理的代码主要是在P2P网络上实现和其他邻节点的通信功能。包括:发现邻节点;连接并管理与邻节点的Socket连接;与邻节点交换不同的P2P消息。比特币节点的缺省配置是主动连接8个邻节点,同时允许最多125个其他节点发起连接请求。

3、ZMQ队列管理

比特币采用Zero MQ作为消息队列管理和消息分发工具。ZMQ是一个简单好用的传输层,像框架一样的一个socket library,他使得Socket编程更加简单、简洁和性能更高。

你可能感兴趣的:(区块链)