一篇文章读懂比特币

一篇文章读懂比特币_第1张图片

虽然我一直建议大家阅读原版的《精通比特币》,但对于大部分非技术人员来说阅读原版书籍还是很有难度的,因此我在《走进区块链》一书中将比特币的精华内容重新梳理成三篇文章,分别是《一篇文章读懂比特币》、《怎样进行转账》、《怎样防止双重支付》。读懂这三篇文章大部分就可以深入全面的理解比特币了。

提到区块链不得不说到比特币,比特币是世界上第一个成功的区块链应用,由于比特币的成功人们才开始关注它背后的技术区块链。

2008年的时候,中本聪发表了《比特币:一种点对点式的电子现金系统》的论文。2009年,他发布了首个比特币系统,正式启动了比特币金融系统。2010年,中本聪神秘消失,他将这个项目交给了社群的其他成员。

中本聪的伟大之处是他将区块链技术应用在了金融系统,并发明了比特币世界上第一个区块链资产,建造了一个面向全球世界银行。

比特币对全球的金融的颠覆已经成为事实,比特币代表了数十年密码学和分布式系统的巅峰之作,这是一个独特而强大的系统,它不只是货币,更重要的是一个去中心化的点对点网络,一个公共的交易账簿,一个去中心化的数学和确定性的货币发行系统,一个去中心化的交易验证系统。

在《走进区块链》前面的章节里,我们已经学习了区块链中的核心技术分布式、共识机制、密码学、P2P网络,这个章节我们通比特币学习一下怎样通过交易、区块、共识机制、P2P网络搭建一个区块链的基本架构。

一篇文章读懂比特币_第2张图片

在比特币系统中,有三个非常重要的数据结构,分别是交易、区块和区块链。

交易是最一个很重要的概念,其它都是为了确保交易可以被生成、能在网络中得以传播和通过验证,并最终添加入交易总账簿中。交易的本质是数据结构,为了方便对交易记录进行管理,设计了一个容器叫区块。区块是存储了大量交易信息数据结构。区块链则是一个从后向前连接的数据结构,可以被存储在数据中,在比特币中使用了Google的LevelDB数据库存储区块链元数据。区块被从后向前有序地链接在这个链条里,每个区块都指向前一个区块。

为了便于理解我们使用集装箱来进行类比。我们可以将交易理解为商品,而区块就是箱子,方便比特币系统进行交易数据的管理,区块链则是一节节连接在一起的集装箱。与集装箱不同的地方是区块之间首尾相连,而不是上下堆砌。区块被从后向前有序地链接在这个链条里,每个区块都指向前一个区块。

区块链经常被视为一个垂直的栈,第一个区块作为栈底的首区块,随后每个区块都被放置在其他区块之上。用栈来形象化表示区块依次堆叠这一概念后,我们便可以使用一些术语,例如:“高度”来表示区块与首区块之间的距离;以及“顶部”或“顶端”来表示最新添加的区块。

交易、区块和区块链就构成了区块链世界里的基本数据结构即比特币的总账簿。有了交易、区块及区块链这些概念,如果只把区块链当成一个数据库来看,使用这些概念我们就可以构造一个区块链系统了。我们可以用交易的数据结构存储交易数据(支票、博客等),通过区块打包交易数据,最后通过计算区块头哈希将区块连接起来,这就是我们通常说的区块链。
智能合约与事务都是存储在区块链上,与事务不同的地方是,智能合约是将代码存储在区块链上。由于比特币是非图灵完备的公链,不涉及智能合约,后面我们在讲其它公链再详细介绍。

由于区块链是去中心化的,怎样保证系统安全,防止欺诈交易,避免双重支付,双重支付是指多次花费同一笔比特币,这里面就引入了区块链技术里最重要的概念共识机制。

在比特币系统使用的是工作量证明机制(POW)。它的工作原理有点类似打麻将,四个矿工自发的组织在一起,通过掷骰子(碰撞一个随机数)确定谁来记账,谁获得了记账权谁就得到了相应的奖励,其它三个矿工对这笔账目进行确认。

为了保证系统的安全,共识机制在交易验证、交易打包到区块、区块组装到区块链以及选择那一条链的过程中都发挥了重要的作用,这也有效保证了系统从产生交易到上链整个过程的安全。

至此,一个区块链系统的基本架构我们就讲完了。当然为了保证系统不存在任何中心化服务器,我们还需要依托于P2P网络架构。由于P2P网络具有天生的伸缩性、去中心化和开放的特点,因此P2P也是区块链技术的基石。

区块

在比特币系统中,为了对交易记录进行管理,设计了一个容器叫区块。

区块是一种被包含在公开账簿(区块链)里的聚合了交易信息的容器数据结构。它由一个包含元数据的区块头和紧跟其后的构成区块主体的一长串交易组成。区块头是80字节,而平均每个交易至少是250字节,而且平均每个区块至少包含超过500个交易。因此,一个包含所有交易的完整区块比区块头的1000倍还要大。具体结构见下图。

一篇文章读懂比特币_第3张图片

区块头由三组区块元数据组成。首先是一组引用父区块哈希值的数据,这组元数据用于将该区块与区块链中前一区块相连接。第二组元数据,即难度、时间戳和nonce,与挖矿竞争相关。第三组元数据是merkle树根(一种用来有效地总结区块中所有交易的数据结构。具体结构见下图。

一篇文章读懂比特币_第4张图片

为了方便进行区块的识别,通常采用以下两种方式进行区块识别:

第一种识别方式,区块的加密哈希值,一个通过SHA256算法对区块头进行二次哈希计算而得到的数字指纹。产生的32字节哈希值被称为区块哈希值。

第二种识别区块的方式是通过该区块在区块链中的位置,即“区块高度(blockheight)”。
一个区块的区块哈希值总是能唯一地识别出一个特定区块。一个区块也总是有特定的区块高度。但是,一个特定的区块高度并不一定总是能唯一地识别出一个特定区块。更确切地说,两个或者更多数量的区块也许会为了区块链中的一个位置而竞争。

比特币里的第一个区块创建于2009年,被称为创世区块。它是比特币系统里所有区块的共同祖先,这意味着你从任一区块,循链向后回溯,最终都将到达创世区块。

区块链

区块链是由包含交易信息的区块从后向前有序链接起来的数据结构。它可以被存储为flatfile(一种包含没有相对关系记录的文件),或是存储在一个简单数据库中。比特币核心客户端使用Google的LevelDB数据库存储区块链元数据。区块被从后向前有序地链接在这个链条里,每个区块都指向前一个区块。

区块链经常被视为一个垂直的栈,第一个区块作为栈底的首区块,随后每个区块都被放置在其他区块之上。用栈来形象化表示区块依次堆叠这一概念后,我们便可以使用一些术语,例如:“高度”来表示区块与首区块之间的距离;以及“顶部”或“顶端”来表示最新添加的区块。

对每个区块进行SHA256加密哈希,可生成一个哈希值。通过这个哈希值,可以识别出区块链中的对应区块。同时,每一个区块都可以通过其区块头的“父区块哈希值”字段引用前一区块(父区块)。也就是说,每个区块头都包含它的父区块哈希值。这样把每个区块链接到各自父区块的哈希值序列就创建了一条一直可以追溯到第一个区块(创世区块)的链条。

由于区块头里面包含“父区块哈希值”字段,所以当前区块的哈希值因此也受到该字段的影响。如果父区块的身份标识发生变化,子区块的身份标识也会跟着变化。当父区块有任何改动时,父区块的哈希值也发生变化。父区块的哈希值发生改变将迫使子区块的“父区块哈希值”字段发生改变,从而又将导致子区块的哈希值发生改变。而子区块的哈希值发生改变又将迫使孙区块的“父区块哈希值”字段发生改变,又因此改变了孙区块哈希值,等等以此类推。

一旦一个区块有很多代以后,这种瀑布效应将保证该区块不会被改变,除非强制重新计算该区块所有后续的区块。正是因为这样的重新计算需要耗费巨大的计算量,所以一个长区块链的存在可以让区块链的历史不可改变,这也是比特币安全性的一个关键特征。

你可以把区块链想象成地质构造中的地质层。表层可能会随着季节而变化,甚至在沉积之前就被风吹走了。但是越往深处,地质层就变得越稳定。到了几百英尺深的地方,你看到的将是保存了数百万年但依然保持历史原状的岩层。在区块链里,最近的几个区块可能会由于区块链分叉所引发的重新计算而被修改。最新的六个区块就像几英寸深的表土层。但是,超过这六块后,区块在区块链中的位置越深,被改变的可能性就越小。在100个区块以后,区块链已经足够稳定,这时Coinbase交易(包含新挖出的比特币的交易)可以被支付。几千个区块(一个月)后的区块链将变成确定的历史,永远不会改变。

在比特币系统中,比特币完整节点保存了区块链从创世区块起的一个本地副本。区块通过引用父区块的区块头哈希值的方式,以链条的形式进行相连。

挖矿

有了交易、区块及区块链这些概念,如果只把区块链当成一个数据库来看,使用这些概念我们就可以构造一个区块链系统了。我们可以用交易的数据结构存储交易数据(支票、博客等),通过区块打包交易数据,最后通过区块哈希将区块连接起来,这就是我们通常说的区块链。

但是这样设计出来的区块链只是一个数据库,没有办法保证数据不可篡改。所以缺乏共识机制的区块链不是区块链,区块链一定要有共识机制支撑。比特币中的共识机制是通过挖矿来保证的。

在第一章中我们介绍到在比特币诞生之前,数字货币已经经历了十几年的发展历史。这期间包括 e-Cash、HashCash、B-money等相关的数字货币,这个期间属于数字货币的发展阶段。虽然数字货币经过了十几年的发展,但没有人提出去中心化数字货币系统的实现。由于数字货币是一串字符串复制成本非常低,因此去中心化电子货币实现的难点是怎样避免数字货币被同时两次或两次以上的支付,也就是我经常说的双花(double spend)。(对于这个翻译我不敢苟同,我个人觉着翻译成双重支付更贴近原意,也更容易理解。)

在比特币系统中,挖矿是增加比特币货币供应的一个过程,同时还保护着比特币系统的安全,防止欺诈交易,避免双重支付(双重支付是指多次花费同一笔比特币)。

矿工们通过为比特币网络提供算力来换取获得比特币奖励的机会。矿工们验证每笔新的交易并把它们记录在总帐簿上。每10分钟就会有一个新的区块被“挖掘”出来,每个区块里包含着从上一个区块产生到目前这段时间内发生的所有交易,这些交易被依次添加到区块链中。我们把包含在区块内且被添加到区块链上的交易称为“确认”交易,交易经过“确认”之后,新的拥有者才能够花费他在交易中得到的比特币。

矿工们在挖矿过程中会得到两种类型的奖励:创建新区块的新币奖励,以及区块中所含交易的交易费。 为了得到这些奖励,矿工们争相完成一种基于加密哈希算法的数学难题,这些难题的答案包括在新区块中,作为矿工的计算工作量的证明,被称为”“工作量证明”。该算法的竞争的机制以及获胜者有权在区块链上进行交易的机制是比特币安全的基石。

“挖矿”这个词有一定的误导性。它容易引起对贵重金属采矿的联想,从而使我们的注意力都集中在每个新区块产生的奖励上。尽管挖矿带来的奖励是一种激励,但它最主要的目的并不是奖励本身或者新币的产生。

如果只把挖矿看作生产新币的过程,那你是把手段(激励措施)当成了目的。挖矿是一种将结算所去中心化的过程,每个结算所需要对处理的交易进行验证和结算。

挖矿保护了比特币系统的安全,并且实现了在没有中心机构的情况下,也能使整个比特币网络达成共识。

工作量证明机制

POW(Proof of Work)工作量证明机制是比特币采用的共识机制,在这种共识机制里,各个节点需要解决复杂的数学问题,耗费大量的算力(比较耗电)来限制提案个数。从概率上来讲,即使有人想搞破坏,也要付出比绝大数诚实节点多的算力才能达到结果。由于比特币是全球节点参与工作,因此搞破坏是需要付出巨大代价的。但严格意义上来讲,比特币没有办法完全杜绝作恶。比如现在各大矿池已经拥有了绝大多数的算力,一旦他们联手,有可能又变成了另外一种中心化机构。

区块链是一本记录所有交易的公开总帐簿,比特币网络中的每个参与者都把它看作一本所有权的权威记录。在不考虑相信任何人的情况下,比特币网络中的所有参与者如何达成对任意一个所有权的共识呢?

中本聪的主要贡献是在比特币系统中实现了去中心化的自发共识机制。这种自发,是指没有经过明确选举或者没有固定达成的共识的时间。换句话说,共识是数以千计的独立节点遵守了简单的规则通过异步交互自发形成的产物。所有的比特币属性,包括货币、交易、支付以及不依靠中心机构和信任的安全模型等都是这个机制的衍生。

比特币的去中心化共识机制是由所有网络节点的4个独立过程相互作用而产生。
1)每个全节点依据一个校验列表对每个交易进行独立验证。
2)通过完成工作量证明算法的验算,挖矿节点将交易记录独立打包进新区块。
3)每个节点独立的对新区块进行校验并组装进区块链。
4)每个节点对区块链进行独立选择,在工作量证明机制下选择累计工作量最大的区块链。

重点讲一下工作量证明算法。挖矿就是重复计算区块头的哈希值,不断修改该参数,直到与哈希值匹配的一个过程。哈希函数的输入数据的长度是任意的,将产生一个长度固定且绝不雷同的值,可将其视为输入的数字指纹。通过修改数字可以构建不同的哈希。

简单打个比方,想象人们不断扔一对色子以得到小于一个特定点数的游戏。第一局,目标是12,只要你不扔出两个6,你就会赢。然后下一局目标为11,玩家只能扔10或更小的点数才能赢,不过也很简单。假如几局之后目标降低为了5。现在有一半机率以上扔出来的色子加起来点数会超过5,因此无效。随着目标越来越小,要想赢的话,扔色子的次数会指数级的上升。最终当目标为2时(最小可能点数),只有一个人平均扔36次或2%扔的次数中,他才能赢。

在一个完全去中心化的网络中,上面的调整是如何做到的呢?难度的调整是在每个完整节点中独立自动发生的。每2,016个区块中的所有节点都会调整难度。难度的调整公式是由最新2,016个区块的花费时长与20,160分钟(两周,即这些区块以10分钟一个速率所期望花费的时长)比较得出的。难度是根据实际时长与期望时长的比值进行相应调整的(或变难或变易)。简单来说,如果网络发现区块产生速率比10分钟要快时会增加难度。如果发现比10分钟慢时则降低难度。

共识机制是是比特币赖以生存的必要条件。通过交易、区块构建了完整的区块链数据,通过挖矿和共识机制确保比特币在没有中心化机构可以正常运营。

P2P网络及节点

比特币采用了基于互联网的P2P网络架构。P2P网络中每一个节点彼此对等,各个节点共同提供服务,不存在任何特殊节点。P2P网络中不存在任何服务器、中心化服务及层级结构。P2P网络具有天生的伸缩性、去中心化和开放的特点。比特币被设计为一种点对点的数字现金系统,它的网络架构既是这种核心特性的反映,也是该特性的基石。去中心化控制是设计时的核心原则,它只能通过维持一种扁平化、去中心化的P2P共识网络来实现。

虽然P2P网络中各个节点相关对等,但根据各个节点功能不同,各个节点会有不同的分工,在比特币系统中,每个比特币节点都是路由、区块链数据库、挖矿、钱包服务的功能集合,一个全节点包含钱包、矿工、完整区块链、网络路由节点。

一篇文章读懂比特币_第5张图片

一些节点保有一份完整的、最新的区块链拷贝,这样的节点被称为“全节点”。全节点能够独立自主地校验所有交易,而不需借由任何外部参照。另外还有一些节点只保留了区块链的一部分,它们通过一种名为“简易支付验证(SPV)”的方式来完成交易验证,这样的节点被称为“SPV节点”,又叫“轻量级节点”。

挖矿节点通过运行在特殊硬件设备上的工作量证明(proof-of-work)算法,以相互竞争的方式创建新的区块。一些挖矿节点同时也是全节点,保有区块链的完整拷贝;还有一些参与矿池挖矿的节点是轻量级节点,它们必须依赖矿池服务器维护的全节点进行工作。

用户钱包也可以作为全节点的一部分,这在桌面比特币客户端中比较常见。当前,越来越多的用户钱包都是SPV节点,尤其是运行于诸如智能手机等资源受限设备上的比特币钱包应用。比如我们现在使用的Bither就属于这类SPV节点。

在比特币P2P协议中,除了这些主要的节点类型之外,还有一些服务器及节点也在运行着其他协议,例如特殊矿池挖矿协议、轻量级客户端访问协议等。

目前比特币主网络由大约上万个运行着不同版本比特币核心客户端(BitcoinCore)的监听节点、以及几百个运行着各类比特币P2P协议的应用(例如BitcoinJ、Libbitcoin、btcd等)的节点组成。

许多连接到比特币网络的大型公司运行着基于Bitcoin核心客户端的全节点客户端,它们具有区块链的完整拷贝及网络节点,但不具备挖矿及钱包功能。这些节点是网络中的边缘路由器(edgerouters),通过它们可以搭建其他服务,例如交易所、钱包、区块浏览器、商家支付处理(merchantpayment processing)等。

对比特币有了系统全面的理解之后,下一篇文章我们会一起学习比特币是怎样进行转账的。

你可能感兴趣的:(一篇文章读懂比特币)