区块链从入门到精通(区块链入门推荐!共读《精通编程》)

  区块链从入门到精通(区块链入门推荐!共读《精通区块链编程》)

从比特币的基础技术概念、应用、用户和场景解析入门,深入浅出地剖析了区块链行业发展的基础逻辑,具有极强的实操性和指导性。特别适合区块链行业从业者、爱好者作为入门读物,文章最后附上精选报告链接,我们一起打开区块链世界的大门吧!

  

作者:安德烈亚斯·M。安东波罗斯

  

◆ 第1章 比特币介绍

  

比特币既是构成数字货币生态系统基础概念和技术的总称,又是比特币网络中参与者存储和传输的货币单位。
比特币协议还规定每4年新发行比特币的数量减半,并将所有发行的比特币总数限制在2100万以内。因此可流通的比特币数量是一个非常容易预测的曲线,到2140年将接近2100万。由于比特币递减的发行率,长期来看,比特币货币是通货紧缩的,此外比特币不能通过“增发”超过预定发行率的新钱而导致通货膨胀。
比特币这四个创新包括:·一个去中心化的点对点网络(比特币协议)·一本公开的交易总账(区块链)·一套可独立校验交易和发行货币的规则(共识规则)·一种通过全球去中心化对有效的区块链达成共识的机制(工作量证明算法)
加密数字签名使用户能够对数字资产或交易进行签名来证明对该资产的所有权。采用适当的架构,数字签名也可以用于解决双重支付问题。

  

◆ 1。4。1 选择比特币钱包

  

比特币钱包可以分成几个组合,其中最常见的三种是桌面全节点客户端、手机轻量级钱包和网络第三方钱包。

  

◆ 1。4。2 快速入门

  

事实上,在大多数钱包中,比特币地址和任何外部可识别的信息(包括用户的身份)之间不存在关联关系。在该地址被引用作为比特币总账的交易中的收款者之前,这个比特币地址只是在比特币中有效的海量地址中的一个,只有与交易相关联后才能成为网络中已知地址的一部分。

  

◆ 1。4。3 获取比特币

  

比特币交易是不可撤销的。大多数电子支付网络如信用卡、借记卡、PayPal和银行账户转账都是可撤销的。

  

◆ 第2章 比特币的工作原理

  

与传统银行和支付系统不同,比特币系统以去中心化信任为基础。

  

◆ 2。1。1 比特币概述

  

比特币系统是由用户、交易和矿工三方构成的。
区块链浏览器是一种具有比特币搜索引擎作用的网络应用,通过它你可以搜寻地址、交易和区块,还能看到它们之间的关系和流动。

  

◆ 2。2。1 交易输入和输出

  

输出的总额要略小于输入总额,两者的差额代表了一笔默认的交易费用,这笔小额费用由矿工收取,他负责将这笔交易记录在账簿里。
交易以一种所有者电子签名的形式包含了每笔被消费的比特币金额(输入)的所有权证明,这些证明可以被任何人独立验证。

  

◆ 2。2。2 交易链

  

交易形成了一条链条,在链条上,最近交易的输入对应之前交易的输出。

  

◆ 2。2。3 找零

  

许多比特币交易都包含指向新持有者的地址和现持有者的地址,亦被称作“找零”地址的输出。
交易将价值从交易输入转移到交易输出。一个输入是对之前一笔交易输出的参照,展示价值从何处来。一个交易输出将一笔特定价值指向一个新持有者的比特币地址,还可以包括一个找零的输出指向原持有者。一笔交易的输出可以在一笔新交易中作为输入,随着价值从一个持有者导向另一个持有者,创造出一条持有者链条

  

◆ 2。3 交易的构建

  

钱包应用甚至可以在完全离线时建立交易

  

◆ 2。3。3 将交易加入账簿

  

比特币网络是一个点对点网络,每个比特币客户端通过连接到若干个其他比特币客户端来参与这个网络。比特币网络的目的是将交易和区块传播给所有参与者。

  

◆ 2。4 比特币挖矿

  

比特币系统的信任是建立在计算的基础上的。交易被打包进区块,打包的过程需要大量的计算来证明,但检验已被证明仅需要很少的计算量。

  

◆ 第4章 密钥和地址

  

  

“加密”并不是比特币的重要部分,因为比特币的通信和交易数据并没有加密,也不需要通过加密来保护资金。

  

◆ 4。1 简介

  

数字密钥实际上并不存储在网络中,而是由用户创建,并且存储在一个叫作钱包的文件或者简单的数据库中。
大多数比特币交易都需要一个有效的数字签名才能被存储到区块链上。只有有效的密钥才能产生有效的数字签名,因此任何人只要拥有密钥副本就拥有了对该账户的比特币控制权。
一般情况下,比特币地址由一个公钥生成并对应于这个公钥。然而,并非所有比特币地址都代表公钥;它们也可以代表其他受益者,如脚本,我们将在本章后面提及。

  

◆ 4。1。1 公钥密码学和加密货币

  

密钥对包含一个私钥和从它派生出来的一个唯一的公钥。公钥用于接收比特币,而私钥用于为比特币支付进行交易签名。
支付比特币时,比特币的当前所有者需要在交易中展示其公钥和签名(每次交易的签名都不同,但均从同一个私钥创建)。
在大多数钱包实现中,为了方便起见,私钥和公钥被一起存储为密钥对。但是,可以从私钥计算公钥,所以只存储私钥也是可以的。

  

◆ 4。1。2 私钥和公钥

  

为什么在比特币中使用非对称加密?它并不被用于对比特币交易“加密”(保密)。相反,非对称加密技术最有用的特性是能够生成数字签名。可以将私钥应用到比特币交易的数字指纹上,以生成数字签名。该签名只能由拥有私钥的人生成。但是任何可以访问其公钥和交易指纹的人都可以使用它们来验证签名的真伪。这种非对称加密的有用特性使得任何人都可以验证每个交易上的每个签名,同时确保只有私钥的所有者才能生成有效的签名。

  

◆ 4。1。3 私钥

  

比特币私钥只是一个数字。
生成密钥的第一步也是最重要的一步,是要找到足够安全的熵源,即随机性来源。
不要自己写代码或使用编程语言提供的简易随机数生成器来获得一个随机数。

  

◆ 4。1。4 公钥

  

私钥的所有者可以容易地创建公钥,然后放心地与全世界共享,确信没有人可以从公钥中逆向计算得出私钥。这个数学技巧成为证明比特币所有权的不可伪造和安全的数字签名的基础。

  

◆ 4。1。6 创建公钥

  

此数学方法是单向的,所以私钥可以转换为公钥,但公钥不能反向转换回私钥。

  

◆ 4。2 比特币地址

  

比特币地址可由公钥经过单向的加密散列算法得到。
比特币地址与公钥不同。比特币地址是由公钥经过单向的散列函数生成的。
图4-5描述了如何从公钥生成比特币地址。

  

◆ 4。2。2 密钥的格式

  

压缩格式公钥渐渐成为各种不同的比特币客户端的默认
格式,它可以大大减少交易所需的字节数,同时也节约存储区块链所需的磁盘空间。
这在钱包软件导入另一个钱包软件的私钥时就会变得尤其重要,因为新钱包需要扫描区块链并找到所有与这些被导入私钥相关的交易。比特币钱包应该扫描哪个比特币地址呢?不论是通过压缩的公钥产生的比特币地址,还是通过非压缩的公钥产生的地址,都是合法的比特币地址,都可以被私钥签名,但是它们是不同的比特币地址。
“压缩格式私钥”是一个不当用词!私钥不是压缩的。WIF压缩格式的私钥只是用来表明它们只能被生成压缩格式的公钥和对应的比特币地址。相反,“WIF压缩”编码的私钥还多出一个字节,因为这种私钥多了后缀“01”。该后缀是用来区分“非压缩格式”私钥和“压缩格式”私钥。

  

◆ 4。4。4 纸钱包

  

纸钱包是打印在纸张上的比特币私钥。有时为了方便起见,纸钱包也包括相应的比特币地址,但这不是必要的,因为地址可以从私钥中导出。纸钱包是一个非常有效的建立备份或者线下存储比特币(即“冷存储”)的方式。
虽然你可以多次存款到纸钱包中,但是你最好一次性提取里面所有的资金。因为如果你提取的金额少于其中的总金额的话,有些钱包可能会生成一个找零地址。并且,如果你所用的电脑被病毒感染,那么就有可能泄露私钥。一次性提走所有余款可以减少私钥泄露的风险,如果你所需的金额比较少,那么请把余额发送到一个新的纸钱包里。

  

◆ 5。1 钱包技术概述

  

比特币钱包只包含私钥,而不包含比特币。每个用户都有一个包含多个密钥的钱包。钱包实际上是包含私钥/公钥对的钥匙串(请参阅4。1。2节)。用户使用私钥签名交易,从而证明他们拥有交易(比特币)转账所有权。比特币以交易记录(通常记为vout或txout)的形式存储在区块链中。
有两种主要类型的钱包,区别在于它们包含的多个私钥是否相互关联。

  

◆ 5。2。1 助记词编码标准(BIP-39)

  

助记词经常与“脑钱包”混淆。它们是不一样的,主要区别在于脑钱包由用户选择的单词组成,而助记词是由钱包随机创建并展现给用户的。这个重要的区别使助记词更加安全,因为人类生成随机数的能力非常弱。
密钥延伸函数计算2048次散列是一种非常有效的保护,可以防止对助记词或密码的暴力攻击。它使得攻击代价非常昂贵(从计算的角度),需要尝试成千上万个密码和助记词的组合,而密钥延伸函数可以产生的种子是海量的(2512)。

  

◆ 5。2。2 从种子中创造HD钱包

  

HD钱包中的所有私钥都是从这个根种子确定性地派生出来的,这使得在任何兼容的HD钱包中都可以从该种子重新创建整个钱包。这使得备份、恢复、导出和导入包含数千甚至数百万个密钥的HD钱包变得很容易,只需传输根种子的助记词即可。

  

◆ 第6章 交易

  

比特币区块链是一本全球复式记账总账簿,每笔交易都是在比特币区块链上的一个公开记录。

  

◆ 6。3 交易的输出和输入

  

一笔比特币交易可以是任意金额,但必须从用户可用的UTXO(不管UTXO的面额是多少)中创建出来。用户不能再把UTXO面额进一步拆分,就像不能把一元纸币撕开而继续当货币使用一样。用户的钱包应用通常会从用户可用的UTXO中进行合适的挑选,来拼凑出一个大于或等于交易所需的金额。

  

◆ 6。3。3 交易费

  

任何创建交易的比特币服务,包括钱包、交易所、零售应用等,都必须实现交易费动态计算功能。交易费动态计算可以通过第三方费用估算服务或内置的费用估算算法来实现。
固定费用在比特币网络上不再可行。设置固定费用的钱包将导致用户体验不佳,因为交易往往会被“卡住”,并不被确认。不了解比特币交易和费用的用户因交易被“卡住”而感到沮丧,因为他们认为自己已经丢失资金。

  

◆ 6。3。4 把交易费加到交易中

  

[插图]
如果你忘了在手动构建的交易中增加找零的输出,系统会把找零当作交易费来处理。“不用找了!”也许不是你的真实意愿。

  

◆ 6。4 交易脚本和脚本语言

  

比特币的交易验证并不是静态不变的,而是通过脚本语言的执行来实现的。这种脚本语言允许表达几乎无限的各种条件。这也是比特币作为一种“可编程的货币”所拥有的力量。

  

◆ 6。4。1 非图灵完备性

  

每一笔交易都会被网络中的全节点验证,受限制的语言能防止交易验证机制被作为一个漏洞而加以利用。

  

◆ 6。5 数字签名(ECDSA)

  

数字签名在比特币中有三种用途。第一,签名证明私钥的所有者,即资金所有者,已经授权支出这些资金。第二,授权证明是不可否认的(不可否认性)。第三,签名证明交易(或交易的特定部分)在签名之后没有也不能被任何人修改。
交易的每个输入都是独立签名的。这一点至关重要,因为多个签名和输入都不属于同一位“所有者”或被同一位“所有者”使用。事实上,一个名为“CoinJoin”的特定交易方案(多人混合交易方案)就使用这个特性来创建多方交易来保护隐私。
交易的每个输入和它可能包含的任何签名完全独立于任何其他输入或签名。多方可以协作构建交易,并各自仅签一个输入。
数字签名是用于证明数字消息或文档的真实性的数学方案。有效的数字签名给了一个容易接受的理由去相信:1)该消息是由已知的发送者(身份认证性)创建的;2)发送方不能否认已发送消息(不可否认性;3)消息在传输中未被更改(完整性)。

  

◆ 6。5。1 数字签名如何工作

  

数字签名是一种由两部分组成的数学方案:第一部分是使用私钥(签名密钥)从消息(交易)创建签名的算法;第二部分是允许任何人在给定消息和公钥时验证签名合法性的算法。

  

◆ 6。5。5 随机性在签名中的重要性

  

k是临时私钥

  

如果在两个不同的交易中,在签名算法中使用相同的值k,则私钥可以被计算并暴露给世界!
如果在两个不同的交易中,在签名算法中使用相同的值k,则私钥可以被计算并暴露给世界!
人们由于无意中重复使用k值而导致资金被窃取。重用k值的最常见原因是随机数生成器未正确初始化。

  

◆ 6。6 比特币地址、余额和其他摘要

  

交易本身并不包含比特币地址,而是通过锁定和解锁比特币面值的脚本进行操作。区块链系统中的任何地方都不存在余额,而每个钱包应用程序都明明白白地显示了用户钱包的余额。
通过钱包应用程序、区块链浏览器和其他比特币用户界面呈现给用户的信息通常源于更高层次的抽象概念组成,这些概念通过搜索许多不同的交易,检查其内容以及整合其中包含的数据而构成。

  

◆ 7。4 数据记录输出(RETURN操作符)

  

比特币的去中心特点和时间戳账本机制,即区块链技术,其潜在用途将大大超出支付领域。许多开发者试图充分发挥交易脚本语言的安全性和灵活性优势,将其运用于电子公证服务、股票证券和智能合约等领域。

  

◆ 7。5 时间锁

  

时间锁(Timelocks)是只允许在某个时间点之后才可以被支出的交易或输出。比特币从一开始就有一个交易级的时间锁定功能。
时间锁对于后期交易和将资金锁定到将来的日期非常有用。更重要的是,时间锁将比特币脚本延伸到时间的维度,为复杂的多级智能合同打开了大门。

  

◆ 第8章 比特币网络

  

比特币是在互联网之上依照点对点网络架构来设计的。点对点(peer-to-peer),或者说P2P,是指参与网络的每台计算机都是平等的,不存在“特殊”节点,所有节点分担提供网络服务的压力。网络节点以一种“扁平”拓扑结构在网状网络中相互连通。在P2P网络中不存在服务器,没有中心化的服务,也不存在层级结构。一个P2P网络中的各节点同时提供服务和消费服务,这种互惠运作就是他们参与的动机。
“比特币网络”指的是运行比特币P2P协议的节点集合。在比特币P2P协议之外,比特币网络还包含其他的协议,例如Stratum,被用于挖矿,轻量级或者移动钱包。基于比特币协议访问比特币网络的网管路由器提供这些额外协议,将网络扩展到运行其他协议的节点

  

◆ 8。2 节点类型和角色

  

一个比特币节点是一个功能集合:路由、区块链数据库、挖矿和钱包服务。
一些节点维护了一份完整、最新的区块链副本,它们被称为“全节点”。全节点可以无须任何外部参照地自主验证任何交易。一些节点仅仅维护了区块链的一个子集,它们通过一种叫作“简易支付验证”(Simplified payment Verification,SPV)的方法验证交易。这些节点被称为SPV节点或轻量节点。

  

◆ 8。4 比特币中继网络

  

比特币中继网络是一个尝试最小化在矿工之间传送区块延时的网络。

  

◆ 8。5 网络发现

  

当一个新的节点启动后,为了参与网络协同,它必须发现网络中其他的比特币节点。为了开始这个过程,一个新节点必须至少发现一个现存网络节点并连接上它。因为比特币网络拓扑不以地理位置定义,其他节点的地理位置是完全无关的,所以任意现有比特币节点可以随机选取。
为了连接到一个已知节点,节点间要建立一个TCP连接,通常在8333端口上(这个端口号通常就被当作比特币使用的),或者如果有指定端口也可以使用指定端口。在建立连接时,节点会通过发送一个包含基本识别信息的版本消息开始一次“握手”

  

◆ 8。6 全节点

  

全区块链节点维护了一份完整的、最新的包含全部交易的比特币区块链副本。这份副本由节点独立构建和检验,从最初的第一个区块(创世区块)开始一直构建到网络中的最新已知区块。一个全区块链节点可以独立可信地验证任何交易,而无须求助于或者依赖于其他节点或是信息源。全区块链节点依赖网络来接收关于新交易区块的更新,在验证之后合并到它本地的区块链副本中。
运行一个全区块链节点给你一个纯正的比特币体验:独立验证所有交易而无须依赖或者信任任何其他系统。可以很容易地判断出你是否运行了一个全节点,因为它需要超过100GB的永久存储(硬盘空间)来保存全区块链。如果你需要很多硬盘,并且同步一次到主网需要两到三天时间,那么你在运行一个全节点,这是与中央集权完全相反的独立自由的代价。

  

◆ 8。8 简易支付验证(SPV)节点

  

随着比特币使用的兴起,SPV节点变成了比特币节点最常见的形式,尤其是对比特币钱包来说。
SPV节点仅下载区块头而不下载每个区块内包括的交易。由此得到的不包含交易的区块链,比完整区块链要小1000倍。SPV节点无法构建所有可用的UTXO的全貌,因为它们不知道网络上的全部交易。SPV节点的交易验证方法略有不同,它们依赖于对等节点按需提供区块链相关部分的局部视图。
一个全区块链节点通过检查整条链上在它自己之下成千上万的区块以确保UTXO未被花费,从而验证一笔交易。而一个SPV节点通过检查自己之上的若干个区块来验证自己被埋的深度。
监控网络的第三方可以跟踪在SPV节点上的钱包所请求的全部交易,用它们来把钱包用户和这个比特币地址联系起来,从而破坏了用户隐私。在引入了SPV轻量节点之后,比特币开发者增加了一个叫作bloom过滤器的功能来解决SPV节点的隐私风险。Bloom过滤器通过使用概率而非固定模式的过滤方法,允许SPV节点在不需要精确指定它们关心的地址的情况下接收一个交易子集。

  

◆ 8。9 Bloom过滤器

  

Bloom过滤器是一个概率搜索过滤器,它是一种通过描述所需模式而不需要精确表达的过滤方法。Bloom过滤器提供了一种有效的方法在保护隐私的同时表述一个搜索模式。SPV节点使用它们来向对等节点请求符合一定模式的交易,而不需要表露它们在搜索哪个地址、密钥或者交易。
Bloom过滤器通过允许一个SPV节点指定一个针对交易的搜索模式。这个模式能够根据精度或者隐私的考虑被调节来实现这个功能。一个更特指的bloom过滤器会产出准确的结果,但是代价就是暴露了SPV节点关注的是什么模式,从而暴露了用户钱包所拥有的地址。一个更笼统的bloom过滤器会针对更多的交易产出更多的数据,很多都是和这个节点无关的,但是这样允许节点维护更好的隐私性。

  

◆ 8。10 SPV节点如何使用Bloom过滤器

  

一个SPV节点会将一个bloom过滤器初始化为“空”;该状态下bloom过滤器不匹配任何模式。之后SPV节点会列出它感兴趣的所有地址、密钥和散列值。它通过从钱包控制的任意UTXO来提取公钥散列值、脚本散列值和交易ID,进而生成这些列表。SPV节点会把这些信息都加入bloom过滤器,这样bloom过滤器可以判断一笔交易是否与这些模式“匹配”而不用泄露模式本身。

  

◆ 8。12。1 Tor传输

  

Tor代表了洋葱路由网络(The Onion Routing network),它是一个通过匿名、不可追溯和隐私性的随机网络路径来提供数据加密和封装的软件项目和网络。

  

◆ 8。12。2 P2P认证和加密

  

认证可以被用来创建受信比特币节点的网络,防止中间人攻击。最后,如果P2P加密被广泛部署,会加强比特币对流量分析和侵犯到隐私的监视的抵抗能力,尤其是在互联网使用受到严格控制和监控的极权国家。

  

◆ 8。13 交易池

  

几乎比特币网络上的每个节点都维护了一个叫作内存池或者交易池的未确认交易临时列表。节点用这个池子来跟踪已经被网络感知但还没有被包括到区块链的交易。举个例子,一个钱包节点使用交易池来跟踪已经被网络接收但还没被确认的进入用户钱包的支付。

  

◆ 第9章 区块链

  

区块链数据结构是一个有序的,反向链接的交易块列表。区块链可以作为平面文件(Flat File)存储,也可以存储在简单的数据库中。
每个子区块都将指向同一父区块,并且在“父区块散列值”字段中具有相同的(父区块)散列值。
尽管协议总是允许一条链被一条更长的链取代,所以任何区块被反转的可能性总是存在的,但是这种事件发生的可能性会随着时间流逝而减少,直至永不可能。

  

◆ 9。2 区块结构

  

区块由一个包含元数据的区块头和紧跟其后的构成区块主体的一长串交易组成。区块头为80个字节,而平均每个交易至少为250个字节,平均每个区块包含超过500个交易。因此,一个包含所有交易的完整区块比区块头大1000倍。

  

◆ 9。4 区块标识符:区块头散列值和区块高度

  

区块的区块散列值总能唯一标识一个区块。区块也总有一个特定的区块高度。但是,特定区块高度并不总是能够识别某个特定区块。相反,两个或多个区块可能会在区块链中争夺一个位置。

  

◆ 9。5 创世区块

  

区块链中的第一个区块被称为创世区块,产生于2009年。它是区块链中所有区块的共同祖先,这意味着如果你从任何区块开始并按时序回溯区块链的话,最终都将到达创世区块。

  

◆ 9。6 链接区块链中的区块

  

比特币的全节点在本地保存了区块链从创世区块起的完整副本。区块链的本地副本会随着新区块的发现并用于扩展区块链而不断更新。当一个节点从网络接收传入的区块时,它会验证这些区块,然后将它们链接到现有的区块链。为建立一个连接,一个节点将检查传入的区块头并寻找该区块的“父区块散列值”。

  

◆ 9。9。1 testnet——比特币的试验场

  

testnet是测试区块链、网络和货币的总称。testnet是一个功能齐全的在线P2P网络,包括钱包,测试比特币(testnet币),挖矿以及类似主干网的所有其他功能。实际上它和主干网只有两个区别:testnet币是毫无价值的,挖掘难度足够低,任何人都可以相对容易地挖到testnet币。

  

◆ 9。9。2 segnet——隔离见证测试网

  

在2016年,启动了一个特殊用途的测试网络,以帮助开发和测试隔离见证(Segregated Witness)(也称为segwit,见附录D)。该测试区块链称为segnet,可以通过运行Bitcoin Core的特殊版本(分支)来连接。

  

◆ 9。9。3 regtest——本地区块链

  

regtest代表“回归测试”(Regression Testing),是一种比特币核心功能,允许你创建本地区块链以进行测试。与testnet3(它是一个公共和共享的测试区块链)不同,regtest区块链旨在作为本地测试的封闭系统运行。你从头开始启动regtest区块链,创建一个本地的创世区块。你可以将其他节点添加到网络中,或者使用单个节点运行它来测试Bitcoin Core软件。

  

◆ 第10章 挖矿和共识

  

“挖矿”这个词有点误导。一般意义的挖矿类似贵金属的提取,于是人们将更多的注意力集中到创造每个区块后获得的奖励。虽然挖矿行为会被这种奖励所激励,但挖矿的主要目的不是这个奖励或者产生的新币。挖矿过程中会创建新币,但是挖矿不是最终目的,更多的是一种激励手段。挖矿是一种去中心化的交易清算机制,通过这种机制,交易得到验证和清算。挖矿是使得比特币与众不同的发明,它实现去中心化的安全机制,是P2P数字货币的基础。
挖矿的目的不是创造新的比特币,这是激励机制,能够实现去中心化的安全。
矿工们验证每笔新的交易并把它们记录在总账簿上。平均每10分钟就会有一个新的区块被“挖掘”出来,每个区块里包含着从上一个区块产生到目前这段时间内发生的所有交易,这些交易被依次添加到区块链中。
挖矿保证了系统的安全,矿工们在挖矿过程中会得到两种类型的奖励:创建新区块的新币奖励,以及该区块中所有交易的交易费。
挖矿之所以被称为挖矿,是因为它的奖励机制被设计为收益递减模式,这类似于贵重金属的挖矿过程。
矿工通过创造一个新区块得到的比特币数量大约每四年(或准确说是每210000个块)减少一半。
换句话说在2140年之后,不会再有新的比特币产生。
矿工们同时也会获取交易费。每笔交易都可能包含一笔交易费,交易费是每笔交易记录的输入和输出的差额。
在2140年之后,矿工的所有收益都将由交易费构成。
比特币挖矿奖励的上限是挖矿允许发行的最大数量。在实际情况中,矿工可能故意挖出一个低于全额奖励的区块。已经有类似的区块被挖出来了,未来可能会有更多这样的区块被挖出来,而这会导致货币总发行量的减少
比特币的通缩并非因经济快速衰退而引起,这样的通缩可以防范通货膨胀并防止货币贬值。关于这样的通缩究竟是一个问题还是一种优势,仍有待观察。

  

◆ 10。2 去中心化共识

  

比特币没有中心机构,几乎所有的完整节点都有一份公共总账的备份,这份总账可以被视为权威记录。
比特币的去中心化共识由所有网络节点的4种独立过程相互作用而产生:
·每个全节点依据规范清单对每个交易进行独立验证。
·通过完成工作量证明算法的验算,挖矿节点将交易记录独立打包进新区块。
·每个节点独立对新区块进行校验并组装进区块链。
·每个节点对区块链进行独立选择,在工作量证明机制下选择累计工作量最大的区块链。

  

◆ 10。4 挖矿节点

  

矿机是专门设计用于挖比特币的计算机硬件系统。

  

◆ 10。5 打包交易至区块

  

验证交易后,比特币节点会将这些交易添加到自己的内存池中。内存池也称作交易池,用来暂存尚未被加入到区块的交易记录。

  

◆ 10。7。3 重定目标实现调整难度

  

寻找一个比特币区块需要整个网络花费大约10分钟来处理,每产生2016个区块时,会根据这2016个区块完成的时间对难度进行调整。
当比特币的规模变得更大,使用它的人数更多时,即使散列算力保持当前的水平,比特币的安全性也不会受到影响。
挖矿市场的关键因素就是每度电转换为比特币的价格,因为这决定着挖矿活动的盈利能力,也因此刺激着人们选择进入或退出挖矿市场。

  

◆ 10。9 验证新区块

  

矿工必须根据所有节点遵循的共同规则构建一个完美的区块,并通过正确的工作量证明方案来挖掘它。为此,他们在采矿中耗费大量的电力,如果他们作弊,所有的电力和努力都会浪费。这就是为什么独立验证是去中心化共识的重要组成部分。

  

◆ 10。10 区块链的组装与选择

  

比特币去中心化共识机制的最后一步是将区块组装入链,并选择最大工作量证明的链。一旦一个节点验证了一个新的区块,它会尝试将新的区块连接到现存的区块链,将它们组装起来。
任何时候,主链都是所有有效链中累计了最多工作量证明的那条区块链。在一般情况下,主链也是包含最多区块的那个链,也存在有两个等长的链,但是必定其中有一个有更多的工作量证明。
如果备用链比主链积累了更多的工作量,节点将收敛于备用链,意味着节点将选择备用链作为其新的主链,而之前那个老的主链则成为备用链。如果节点是一个矿工,它将开始构造新的区块,来延长这个更新更长的区块链。
区块有可能在不同时间到达不同节点,导致节点有不同的区块链全貌。解决的办法是,每一个节点总是选择并尝试延长累计了最大工作量证明的区块链,也就是最长的或最大累计工作量链。
比特币将区块间隔设计为10分钟,是在更快速的交易确认(交易结算)和更低的分叉概率间做出的妥协。更短的区块产生间隔会让交易清算更快完成,也会导致更加频繁的区块链分叉。与之相对地,更长的间隔会减少分叉数量,却会导致更长的结算时间。

  

◆ 10。11。2 矿池

  

矿池通过专用挖矿协议协调成百上千的矿工。个人矿工在建立矿池账号后,设置他们的矿机连接到矿池服务器。他们的挖矿设备在挖矿时保持和矿池服务器的连接,与其他矿工同步各自的工作。这样,矿池中的矿工分享挖矿任务,之后分享奖励。
成功出块的奖励支付到矿池的比特币地址,而不是单个矿工的。一旦奖励达到一个特定的阈值,矿池服务器便会定期支付奖励到矿工的比特币地址。通常情况下,矿池服务器会为提供矿池服务收取一定百分比的费用。
当矿池中有人成功挖出一个区块,矿池获得奖励,并按照矿工们做出算力贡献的份额的比例给他们分配奖励。

  

◆ 10。12 共识攻击

  

至少理论上,比特币的共识机制是容易被矿工(或矿池)试图使用自己的算力实行欺骗破坏进行攻击的。
比特币的共识机制依赖于这样一个前提,那就是绝大多数的矿工,出于自己利益最大化的考虑,都会通过诚实地挖矿来维持整个比特币系统。比特币购买然而,当一个或者一群矿工拥有了整个系统中大量算力之后,他们就可以通过攻击比特币的共识机制来达到破坏比特币网络的安全性和可靠性的目的。
共识攻击只能影响最近的区块,通过拒绝服务来破坏未来区块的生成。
共识攻击的一个典型场景就是“51%攻击”。想象这么一个场景,一群矿工控制了整个比特币网络51%的算力,他们联合起来打算攻击整个比特币系统。由于这群矿工可以生成绝大多数的区块,他们就可以通过故意制造区块链分叉来实现“双重支付”或者通过拒绝服务的方式来阻止特定的交易或者攻击特定的钱包地址。
双重支付可以有两种方式:要么是在交易被确认之前,要么攻击者通过区块链分叉来撤销几个区块。进行51%攻击的人,可以取消在旧链上的交易记录,然后在新分叉链上重新生成一个同样金额的交易,从而实现双重支付。
共识攻击中除了“双重支付”攻击,还有一种攻击场景就是拒绝为某个特定参与者(特定比特币地址)提供服务。
需要注意的是,51%攻击并不是像它的命名说的那样,攻击者需要至少51%的算力才能发起,实际上,即使其拥有不到51%的系统算力,依然可以尝试发起这种攻击。之所以命名为51%攻击,只是因为在攻击者的算力达到51%这个阈值的时候,其发起的攻击尝试几乎肯定会成功。
矿池操作者控制了候选区块的生成,同时也控制哪些交易会被放到新生成的区块中。这样一来,矿池操作者就拥有了剔除特定交易或者双重支付的权力。如果这种权力被矿池操作者以微妙而有节制的方式滥用,那么矿池操作者就可以在不为人知的情况下发动共识攻击并获益。
随着比特币网络的算力呈指数级快速增长,上述这些理论上可行的攻击场景,实际操作起来已经越来越困难了。
比特币系统和相关软件也一直在持续改进,所以比特币社区也势必会对任何一次共识攻击快速做出响应,以使整个比特币系统比以往更加稳健和可靠。

  

◆ 10。13。1 硬分叉

  

在“区块链分叉”一节中,我们研究了比特币网络如何短暂地分叉,网络中的两个部分在短时间内处于区块链的两个不同分支。我们看到这个过程是如何自然发生的,作为网络的正常运行的一部分,以及如何在一个或多个区块被挖掘之后,网络在一个统一的区块链上重新收敛。
网络也可能会分叉到两条链,这是由于共识规则的变化。这种分叉称为硬分叉,因为这种分叉后,网络不会重新收敛到单个区块链上。相反,这两条区块链独立发展。当比特币网络的一部分节点按照与网络的其余部分节点不同的共识规则运行。

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

评论