

从比特币入门区块链
source link: https://www.tuicool.com/articles/IB3yMrq
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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 分钟生成一个新的区块。
由此,我们可以通过计算得出系统总共包含的比特币数量。
比特币总数 = ((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
算法的十六进制哈希值:
SHA256("123") = 0xa8fdc205a9f19cc1c7507a60c4f01b13d11d7fd0
哈希函数具有一个重要特征:
- 正向计算容易,反向逆推困难
什么意思?以如下一道数学题为例,我们通过已知的 x
计算 y
的值是非常简单的。但是通过已知的 y
计算 x
的值则是非常困难的。所以,想要通过哈希值求解原始值只能通过暴力求解,挨个试。
x³ * ln(ln(x)) + x² * sin(x) = y
工作量证明
工作量证明要做的事情其实就是 逆推哈希值 。由于只能使用暴力求解,所以这是一个非常耗时的过程。不过,一旦某个节点在整个比特币网络中第一个计算出正确值,那么它将会获得丰富的奖励,所以工作量证明也被称为 挖矿 (Mining)。
那么工作量证明究竟要解决一道什么样的难题呢?我们需要先从区块的结构说起。
如下图所示,为区块链的基本结构——区块。区块主要包含两部分:
- 区块头 (Block Header)
- 生成时间
- 当前区块体的哈希值
- 上一区块体的哈希值
- . . .
- 区块体 (Block Body)
- 交易内容
在了解了区块结构之后,我们再来看工作量证明到底要解决一道什么难题。题目如下所示:
SHA256(字符串) -> 符合某个条件的哈希值(小于某个目标值)
其中,字符串由 当前区块头 + 当前区块体 + 生成时间 + 某个随机数 组成。求解字符串中的 某个随机数 ,使得最终的哈希值小于某个目标值(Target)。这里的 某个随机数 也被称为 Nonce
。
Nonce
是一个 32 位的二进制值,非常难猜的,目前只能通过穷举法一个个试错。
难度系数
比特币系统中,难度系数(Difficulty)可以控制区块的生成速度。难度系数可以决定上述目标值的大小。
目标值和难度系数的计算关系如下,可见难度系数越大,目标值越小,因此符合条件哈希值范围越小,难度则越大。
目标值 = 理论最大哈希值 / 难度系数
速度恒定
比特币系统将区块的生成速度定为 每 10 分钟生成 1 个区块 。那么,这是怎么做到的呢?
其实本质上就是难度系数的动态调整。由于目标值决定了符合条件的值范围,所以我们能够计算出任意一个随机数符合条件的概率为:
任意一个随机数符合条件的概率 = 目标值 / 理论最大哈希值 = 1 / 难度系数
那么,这又是如何做到对时间的控制呢?
假设,世界上有 10000 台矿机,每台矿机的计算速度是 20T/s,即每秒能够 20T 次哈希运算。因此可以计算出整个世界的算力是 2 × 10^17 次/s。那么 10 分钟的算力则是:
十分钟的算力 = 10 × 60 × 2 × 10^17 = 1.2 × 10^20 次哈希运算
因为 10 分钟内只能成功一次,所以我们可以得出以下等式,从而得出最终的难度系数。
10 分钟的算力 × 符合条件的概率 = 1 次 即: 1.2 × 10^20 × (1 / 难度系数) = 1 求解 -> 难度系数?
由于全世界的算力一直都在变化,为了能够将产出速度控制在 10 分钟,比特币系统规定:难度系数每两周调整一次。如果这两周内,区块的平均生成速度是 9 分钟(意味着比法定速度快 10 %),则将难度系数调高 10 %。反之亦然。
如何验证交易内容的真实性?
以示例为例,交易内容的真实性主要包含两个问题:
- A 向 B 转账 10 BTC 是否真的是 A 发出的消息?
- A 是否真的有 10 BTC 以上资产?
针对第一个问题,我们需要简单了解一下比特币的 账户地址 概念。
比特币用户在注册账户时,系统会自动生成一个随机数。利用随机数,系统可以生成一对非对称密钥(公钥+私钥)。比特币账户地址则是由公钥进行一系列哈希以及编码运算后生成的 160 位(20 字节)字符串。
用户 A 在发起一个交易时,会先对交易内容进行哈希运算,从而得到摘要(Digest);然后再用私钥对摘要进行加密,从而得到密文。最后,广播到比特币网络的内容则是:交易内容 + 公钥 + 密文。
当比特币网络的其他节点收到消息后,会对它进行验证:
- 对交易内容进行哈希运算,得到摘要 1
- 对密文使用公钥进行解密,得到摘要 2
- 判断摘要 1 和摘要 2 是否一致
如果摘要 1 和摘要 2 一致,则证明交易内容是真实的,在广播过程中并未被篡改。那么如何证明消息的发起者也是 A 呢?毕竟,我们不能认可 B 发消息说 C 向 B 付款 10 BTC 这种内容。消息发起者必须是付款方。
事实上,比特币系统中是通过 签名脚本 和 输出脚本 在消息发出前就限制了 消息发起者必须是付款方 。因此,其他节点收到广播消息时无需再次验证。
关于 签名脚本 和 输出脚本 ,我们后续再在其他文中在详细进行介绍。
至此,第一个问题得以解决。
针对第二个问题,A 是否真的有 10 BTC 以上的资产。
这个问题的验证非常简单,可以通过在全局区块链进行追溯,即可得以验证。
其他问题
经济博弈
假设,全局区块链有一个区块,其内部记载了 A 向 B 转账 100 BTC 的交易内容。然而,比特币网络中有一个恶意节点,该恶意节点希望对该区块的交易记录进行篡改,因此在该区块前开辟了一个分叉。那么它最终能得逞吗?
为了解释这个问题,我们需要先介绍比特币系统的 最长链原则 。
最长链原则:所有节点默认信任全局区块链中最长的分支。
根据最长链原则,除恶意节点以外的其他节点,都会信任区块链的最长分支。如果恶意节点希望其所在分支成为最长分支,那么它占据全局 51% 以上的算力,才可能战胜其他所有节点。这从经济学角度而言,它需要付出巨大的成本,却只能获得不大的收益,投入与产出严重不匹配。
总结
比特币是基于 区块链 技术的一种具体应用,也是一种典型的分布式系统。后面,我们有机会再学习一下分布式系统的一些基本概念和相关原理。
比特币也运用了大量密码学原理,后续有机会我们也来学习一下相关内容。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK