比特币那些事(1)——入门

概述

2008 年 11 月 1 日,中本聪(Satoshi Nakamoto)在 metzdowd 的加密技术邮件列表发布比特币白皮书:《BitCoin: A Peer-to-Peer Electronic Cash System》,首次提出比特币(BitCoin,BTC)的概念。

2009 年 1 月 3 日,中本聪在位于芬兰赫尔辛基(Helsinki)的一个小型服务器上挖出了第一批 50 个比特币。至此,比特币电子现金系统正式诞生。

比特币是一个完全去中心化的电子现金系统,它不依赖于中央机构进行货币发行、结算、验证交易。区块链 则是支持比特币系统的核心技术。

举例

下面,我们以一个具体例子来介绍比特币的工作原理以及相关概念。

假如,有 A、B、C、D 四个人,它们之间发生了三笔交易:

  • A 向 B 转账 10 比特币
  • B 向 C 转账 20 比特币
  • C 向 D 转账 30 比特币

那么,通过在比特币网络中进行广播,比特币网络中的 所有节点 都将获得这一系列交易信息。

这些交易信息最终会由 某个节点 负责组装到一个 区块(Block)中,并将该区块添加至 全局区块链 中。注意,每个节点都保存了完整的全局区块链

这里,就产生了三个问题:

  • 节点为何工作?
  • 如何选择节点?
  • 如何验证交易内容的真实性?

下面,我们依次来回答这几个问题,并引出相关概念。

节点为何工作?

比特币网络的节点为什么要创建并添加区块?因为,这是有奖励的,奖励包含两部分:

  • 每比交易提供的手续费
  • 系统提供的比特币奖励

关于系统的奖励规则,系统规定:

  • 每向全局区块链中添加一个区块,系统会奖励 50 个比特币,每 4 年奖励减半。
  • 平均每 10 分钟生成一个新的区块。

由此,我们可以通过计算得出系统总共包含的比特币数量。

1
比特币总数 = ((60 分钟 × 24 小时 × 365 天 × 4 年) / 10 分钟) × 50 比特币 × (1 + 1/2 + (1/2)² + (1/2)³ ...) ≈ 2100 万

如何选择节点?

如何选择节点?因为比特币是一个典型的分布式系统,分布式系统则是通过 共识算法(Consensus Algorithm)来进行节点选择。

分布式系统的共识算法有很多,常见的有以下这些:

  • Paxos
  • Raft
  • PoW(工作量证明,Proof-of-Work)
  • PBFT(practival Byzantine Fault Tolerance)
  • XFT(Cross Fault Tolerance)
  • ...

比特币系统采用的则是 工作量证明 共识算法。关于工作量证明的详细原理,我们需要先介绍哈希函数。

哈希函数

哈希函数可以对任意内容计算出一个长度相同的特征值。比特币区块链使用 SHA256 算法作为哈希函数,其哈希特征值长度为 256 位。无论原始内容是什么,最后都会计算出一个 256 位的二进制数值。如下所示,为字符串 123 基于 SHA256 算法的十六进制哈希值:

1
SHA256("123") = 0xa8fdc205a9f19cc1c7507a60c4f01b13d11d7fd0

哈希函数具有一个重要特征:

  • 正向计算容易,反向逆推困难

什么意思?以如下一道数学题为例,我们通过已知的 x 计算 y 的值是非常简单的。但是通过已知的 y 计算 x 的值则是非常困难的。所以,想要通过哈希值求解原始值只能通过暴力求解,挨个试。

1
x³ * ln(ln(x)) + x² * sin(x) = y

工作量证明

工作量证明要做的事情其实就是 逆推哈希值。由于只能使用暴力求解,所以这是一个非常耗时的过程。不过,一旦某个节点在整个比特币网络中第一个计算出正确值,那么它将会获得丰富的奖励,所以工作量证明也被称为 挖矿(Mining)。

那么工作量证明究竟要解决一道什么样的难题呢?我们需要先从区块的结构说起。

如下图所示,为区块链的基本结构——区块。区块主要包含两部分:

  • 区块头(Block Header)
    • 生成时间
    • 当前区块体的哈希值
    • 上一区块体的哈希值
    • . . .
  • 区块体(Block Body)
    • 交易内容

在了解了区块结构之后,我们再来看工作量证明到底要解决一道什么难题。题目如下所示:

1
SHA256(字符串) -> 符合某个条件的哈希值(小于某个目标值)
其中,字符串由 当前区块头 + 当前区块体 + 生成时间 + 某个随机数 组成。求解字符串中的 某个随机数,使得最终的哈希值小于某个目标值(Target)。这里的 某个随机数 也被称为 Nonce

Nonce 是一个 32 位的二进制值,非常难猜的,目前只能通过穷举法一个个试错。

难度系数

比特币系统中,难度系数(Difficulty)可以控制区块的生成速度。难度系数可以决定上述目标值的大小。

目标值和难度系数的计算关系如下,可见难度系数越大,目标值越小,因此符合条件哈希值范围越小,难度则越大。

1
目标值 = 理论最大哈希值 / 难度系数

速度恒定

比特币系统将区块的生成速度定为 每 10 分钟生成 1 个区块。那么,这是怎么做到的呢?

其实本质上就是难度系数的动态调整。由于目标值决定了符合条件的值范围,所以我们能够计算出任意一个随机数符合条件的概率为:

1
任意一个随机数符合条件的概率 = 目标值 / 理论最大哈希值 = 1 / 难度系数

那么,这又是如何做到对时间的控制呢?

假设,世界上有 10000 台矿机,每台矿机的计算速度是 20T/s,即每秒能够 20T 次哈希运算。因此可以计算出整个世界的算力是 2 × 10^17 次/s。那么 10 分钟的算力则是:

1
十分钟的算力 = 10 × 60 × 2 × 10^17 = 1.2 × 10^20 次哈希运算

因为 10 分钟内只能成功一次,所以我们可以得出以下等式,从而得出最终的难度系数。

1
2
3
4
5
6
10 分钟的算力 × 符合条件的概率 = 1 次

即:
1.2 × 10^20 × (1 / 难度系数) = 1

求解 -> 难度系数?

由于全世界的算力一直都在变化,为了能够将产出速度控制在 10 分钟,比特币系统规定:难度系数每两周调整一次。如果这两周内,区块的平均生成速度是 9 分钟(意味着比法定速度快 10 %),则将难度系数调高 10 %。反之亦然。

如何验证交易内容的真实性?

以示例为例,交易内容的真实性主要包含两个问题:

  • A 向 B 转账 10 BTC 是否真的是 A 发出的消息?
  • A 是否真的有 10 BTC 以上资产?

针对第一个问题,我们需要简单了解一下比特币的 账户地址 概念。

比特币用户在注册账户时,系统会自动生成一个随机数。利用随机数,系统可以生成一对非对称密钥(公钥+私钥)。比特币账户地址则是由公钥进行一系列哈希以及编码运算后生成的 160 位(20 字节)字符串。

用户 A 在发起一个交易时,会先对交易内容进行哈希运算,从而得到 摘要(Digest);然后再用私钥对摘要进行加密,从而得到 数字签名(Signature)。最后,广播到比特币网络的内容则是:交易内容 + 公钥 + 数字签名。

当比特币网络的其他节点收到消息后,会对它进行验证:

  1. 对交易内容进行哈希运算,得到摘要 1
  2. 对数字签名使用公钥进行解密,得到摘要 2
  3. 判断摘要 1 和摘要 2 是否一致

如果摘要 1 和摘要 2 一致,则证明交易内容是真实的,在广播过程中并未被篡改。那么如何证明消息的发起者也是 A 呢?毕竟,我们不能认可 B 发消息说 C 向 B 付款 10 BTC 这种内容。消息发起者必须是付款方。

为了解释这个问题,我们需要了解交易的生成。事实上,每个交易需要包括若干个 输入输出。未经引用的交易输出(Unspent Transaction Outputs,UTXO)可以被新的交易引用作为其合法的输入。已被引用的交易输出(Spent Transaction Outputs,STXO)无法被新的交易引用作为其合法输入。

因此,比特币网络中的一笔合法的交易,必须是引用某些已存在交易的 UTXO(必须是属于付款方才能合法引用)作为新的交易的输入,并生成新的 UTXO(将属于收款方)。

如下所示为一些简单的交易示例。

交易 目的 输入 输出 签名 差额
T0 A 转给 B 他人向 A 交易的输出 B 可以引用该交易 A 签名确认 输入减输出,为交易服务费
T1 B 转给 C T0 的输出 C 可以引用该交易 B 签名确认 输入减输出,为交易服务费
T2 X 转给 Y 他人向 X 交易的输出 Y 可以引用该交易 X 签名确认 输入减输出,为交易服务费

至此,第一个问题得以解决。注:这里的解释相对简单,更深入的细节请参阅后文。

针对第二个问题,A 是否真的有 10 BTC 以上的资产。

这个问题的验证非常简单,可以通过在全局区块链进行追溯,即可得以验证。

其他问题

经济博弈

假设,全局区块链有一个区块,其内部记载了 A 向 B 转账 100 BTC 的交易内容。然而,比特币网络中有一个恶意节点,该恶意节点希望对该区块的交易记录进行篡改,因此在该区块前开辟了一个分叉。那么它最终能得逞吗?

为了解释这个问题,我们需要先介绍比特币系统的 最长链原则

1
最长链原则:所有节点默认信任全局区块链中最长的分支。

根据最长链原则,除恶意节点以外的其他节点,都会信任区块链的最长分支。如果恶意节点希望其所在分支成为最长分支,那么它占据全局 51% 以上的算力,才可能战胜其他所有节点。这从经济学角度而言,它需要付出巨大的成本,却只能获得不大的收益,投入与产出严重不匹配。

总结

比特币采用区块链这种分布式数据库作为底层支撑,从 2009 年开始运行,经历了大规模长时间检验。证明它是可行的。

区块链虽然有去中心化、解决信任问题等优点,但是它也有很明显的缺点:

  • 效率低。数据写入区块,需要等待十分钟,所有节点的数据需要进行同步,效率低下。
  • 高能耗。所有节点中只有一个节点的工作是真正有效的,其他节点都是无意的,就这一点来说是非常耗费资源的。

因此,我们不能偏执地认为新的技术或科技产物就一定是先进的,而需要理性看待它的优点和缺点。

最后,比特币所包含的区块链技术在很多场景下得以扩展和应用,值得我们去学习。另外,比特币所蕴含的分布式系统设计思想和密码学原理也同样值得我们去深入学习。

参考

  1. bitcoin