比特币学习与理解

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

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

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

51%攻击

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

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

新区块校验

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

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

区块链创造信任?

经常看到有区块链创造了信任这种观点,我是这样理解的,并不是区块链创造了信任,而是区块链在一定程度上取代了原有中心化机构的职能。在安全性上,区块链系统并不一定优于中心化的机构。另外经常看到一些夸大“区块链”的信息,它们夸大的最大可能原因动机是它们是利益相关方,就像销售人员夸大产品一样。

比特币实现宏观理解

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

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

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

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

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


比特币源码

整体理解比特币的宏观概念后,就可以开始阅读比特币源码,比特币源码是使用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);
}

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

比特币架构

下图是从网络中截取的比特币架构图,较为清晰的描述了比特币的各个组成部分。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/s_lisheng/article/details/80670076