“持有”比特币是什么意思(What does it mean to have a Bitcoin)? 什么是电子签名(Digital signatures)? 什么是密码哈希函数(Cryptographic hash functions)?什么是工作量证明(Proof of work)?
许多人听说过比特币,它是一种完全电子化的货币,并不由政府发行。账号和交易也不受银行的监管。也没有人知道它的发明者是谁。
假设你和朋友用一本公共账本来记账。
Alice | Bob | Charlie | You 你们四人。
Ledger 账本----
$20
Alice pays Bob $40
Bob pays Charlie $50 Alice pays You
公共账本(信任)+ 密码学 = 加密货币
Ledger-Trust + Cryptography = Cryptocurrency
比特币官网 https://bitcoin.org/en/download
当你下载Bitcoin Core后,安装时会发现它需要很大的空间截止到2025/7/12 为止大约为620GB。没错这些数据都是账本信息。
和电子支付不同的是,加密货币的支柱并不是验证交易的银行,而是一个巧妙的、去中心化的、无需信任的验证系统。其原理在于密码学里的数学。
假如你和你的一些朋友经常交易现金,很明显不是很方便。你们想起可以将所有人的交易记录记在一个账本上,比如
这个账本是公开的谁都可以查看。假设到了每个月底你们聚在一起,对着一系列的交易,然后把钱算清楚。
这样现在我们就有了协议
1. 任何人都可以在账本上新添行
2. 每月用真金白银结算
现在就有了问题,既然谁都能新加一行,那么 鲍勃 大可以未经 爱丽丝 同意,就写上“爱丽丝付给鲍勃100美元”。
我们怎样才能信任这些交易,真的是支付人的意愿呢?这就涉及到了密码学的第一点内容
电子签名
。
正如手写签名一样,爱丽丝应该在交易记录旁边加点什么。
其他人应该几乎不可能伪造 爱丽丝 的签名。
看起来,电子签名似乎是不可能的,不可以直接复制签名吗?不管这个签名的是什么数据,电脑都可以读取并复制。那怎么才能避免伪造呢?
是这么操作的:
Private Key 私钥 / Public Key 公钥
每个人都生成一个 “公钥-私钥对”。 私钥有时也成为 Secret Key(密钥)。私钥是你自己要私藏保密的。
现实中的手写签名看起来基本都一样,但电子签名比它还强点,会根据信息的改变而改变。它看起来就是一串0和1 一般长度为256比特。
就算只是稍微改变一下信息,对应的签名也会变得完全不同。
难道我不能 一个一个数的猜签名吗,因为信息和公钥是公开的,所以可以对签名进行枚举,这几乎是不可能的,签名 有235比特位。
一个有多少个签名可能性,是2的256次方。
2^256
= 115792089237316195423570985008687907853269984665640564039457584007913129639936
如果一种可能是一秒,2 的 256 次方 ≈ 约 3.67 × 10⁶⁹ 年。
🌍 宇宙年龄:约 138 亿年 ≈ 1.38 × 10¹⁰ 年。
📅 2^256秒 ≈ 宇宙年龄的 2.6 × 10⁵9 倍。
这就是为什么密码学里经常说 “暴力破解 256 位密钥是不可能完成的任务”。因为试完所有可能,宇宙早没了。
如果一个人能拿出正确的签名,就说明唯一的可能是,他知道验证的公钥所对应的私钥。
如果用目前最强的超级计算机来暴力枚举 256 位密钥,最坏情况需要多久才能猜中?
当前最强超级计算机(截至 2025)据 TOP500 排行,Frontier(美国橡树岭国家实验室) 是目前世界最强的超级计算机:
峰值性能:约 1.102 EFLOPS(百亿亿次浮点运算)
即:1.102 x 10^18 次浮点操作/秒
但要注意,浮点运算 ≠ 密钥尝试次数。实际进行加密尝试或哈希碰撞(如 SHA-256)时,其性能会大打折扣。
我们保守估算:假设它可以每秒尝试 10^{18} 个密钥(远超现实,但做上限估计)
即使使用 当前地球上最快的超级计算机,每秒尝试
一百万亿亿个密钥,暴力破解一个 256 位密钥:最坏情况仍需约
3.67 × 10⁵¹
年 才能完成!
虽然利用签名解决了不能伪造某行的数据,但是 鲍勃 仍然可以复制多行数据。因为签名是正确的。
我们可以规定,没条记录信息还必须包含这笔交易独有的某种ID号。
这样一来 要是 爱丽丝 给 鲍勃 多次支付100美金,每次都需要一个全新的签名。
目前的协议变成了
1. 任何人都可以在账本上新添行
2. 每月用真金白银结算
3. 只有签名的交易是有效的
电子签名免去了初始协议中绝大部分的信息,尽管如此,但如果你真的想这么实行的话,还是要依靠某种诚信系统的,具体一点,你需要任何所有人都会遵守规则而且月底做好清算。
但万一查理欠下了成千上万美元的债务然后跑路了怎么办。
也许你有一个聪明的想法,完全不用现金来结算。只要想办法让人在余额不足时不能再花钱就行了。
所以协议上应该有 不可超支的限制。
验证某条交易,就需要知道到目前为止所有交易的历史。就能知道实时余额。
这样一来就摆脱了传统货币的一来,比完全可以现实中给鲍勃10美元,让他给你一些虚拟货币(在账本上让他记一条给你一些虚拟货币的记录)。这样一来虚拟货币就和现实货币联系了起来。
比特币的实体是一个账本,而货币的实体是交易的历史。货币=交易记录。
账本上新增的前,并不是用现金买来的。下面就会讲新的前是怎么流入账本的。
我们上面假设的账本,是中心化的,例如是一个网站,谁都可以添加新的行。但这需要对一个中心位置的信任。
具体来说,网站的主机是谁的?是谁在制定新添行的规则?
想要除去这部分信任,我们可以让所有人保存一份账本。
例如爱丽丝想支付给Bob 100LD,就将消息广播出去。大家听到之后就在自己的账本上记下来。
但是怎样才能让所有人都同意这是正确的账本呢?
当鲍勃接收到一笔钱时 例如爱丽丝给他10LD。他怎么让所有人知道并相信这笔交易。好让以后他可以把这10LD支付给查理呢?
你接收到了广播,你怎么确定,所有人都记录了同样的交易,顺序也相同呢。
你能不能找到一个协议,来决定是否接受交易,并确定交易顺序。使得你可以放心相信世界上遵守同一个协议的所有人手上的账本都和你的一模一样呢?
比特币提出的方案整体是,那个账本上的计算量最大,就信任哪个账本。
HashFunc(内容) = 哈希值或摘要,下面为SHA256,其得到的哈希值是256个比特。
输入内容是一样的,输出就是一样的。只要稍微改变一下输入值,输出就会有很大不同,几乎没有相似之处,也就是“256个比特位”这一点相同。
SHA256 是 密码哈希函数,其逆向计算是不可行的。我给你一个哈希值问你找到一个输入值 使得SHA256的哈希值正好是原先的比特串,那么你只能用试错法硬猜然后检查了。
虽然没有严格的证明表示逆向计算很困难,但很大一部分的现代信息安全,都基于密码哈希函数及其性质,如https TLS/SSL,SHA256在互联网中随处可见。
想象一下,有人给你看一个交易列表,然后说 我找到了一串内容把它放到交易列表的后面,然后再给整个列表用SHA256来求值的话,得到的哈希值前30位全都是0。
你觉得找到这个数字的难度得多大。对于一个完全随机的哈希值前30位都是零的概率是 2的30次方 分之 一。大约是十亿分之一。
别忘了SHA256毕竟是密码哈希函数,所以找到这个特殊数字的唯一办法是瞎猜硬撞。
得到这个数字验证起来就非常快了,只要计算哈希值检查前30位都是零就行了。换言之你很容易就能证明他们做了海量的计算。而无需自己重做等量的计算。这个数字就叫“工作量证明”。
你修改了一个交易,哪怕只有一点点,都需要重新进行计算任务,重新让哈希值前面部分为0。重新找到一个新的工作量证明。
每个区块包含了一个交易列表,加上工作量证明。
现在我们先规定,开头必须是60个0,稍后会来讲怎么才能系统性地决定零的具体个数。
之前我们看到,只有在发款人签名后,交易才算有效。同样的,区块有了工作量证明才能被认为是有效的。
还有为了给这些区块一个标准的顺序,我们要求区块的标头,要包含前一个区块的哈希值。
这样子 要是你修改了之前的区块,或者互换了两个区块就会改变接下来的区块,然后连锁影响下去。这就需要重新做所有的计算工作了。重新找到后面所有区块的新的工作量证明。
所以账本(Ledger)变成了 区块链(Block Chain)
。
我们允许世界上所有人都参与建造区块。即是说,他们可以听到交易的广播把他们收集成区块,然后做许多的计算工作,找到特殊的数字,使得区块的哈希值开头有60个零。他们一找到这个数,就广播出新发现的区块。
为了奖励区块发现者的所有工作,当她整理出区块时,允许他在最上面加一笔很特殊的交易。让他凭空得到10LD。这个叫做区块奖励,这并不需要遵守认可交易与否的准则。
因为它不是从其他人那里来的,所以并不需要签名。“区块奖励” 无支付人无签名。
这就意味着,每一个新区块,都会给经济增添新的虚拟货币。
建造区块一般叫做“挖矿”。因为这个过程需要许多工作量,而且也给经济注入了一些新货币。矿工做的事就是接受交易信息 建造区块 把区块广播出去 然后得到新的钱作为奖励。
对矿工们来说,每一个区块就有点像一个小彩票。大家都在拼命地快速猜数字。直到有个幸运儿找到了一个特殊数字。使得整个区块的哈希值开头有许多个零,那他就能得到奖励。
对于只想用这个系统来首付款的用户来说,他们并不需要收听所有的交易,而只要收听矿工们广播出来的区块。然后更新到自己保存的区块链中就可以了。
当你接收到两条不同的区块链,其中交易信息相冲突时。 你只保留最长也就是包含的工作量最大的那一条。
如果长度相同,那么就坐等新的区块,使得其中一条更长。虽然没有中心权威,所有人也都各自记录区块链,
但假如所有人都同意说,认可工作量最大的区块链。那么我们就有办法达成去中心化的共识。
现在爱丽丝想用一个假区块来骗鲍勃,她想给鲍勃的区块里写着“爱丽丝付给鲍勃100LD”。
鲍勃接收到了爱丽丝的假区块。然后追加到自己的区块链后面。
但是爱丽丝并没有把这个区块广播给其他人。专门用来骗鲍勃的。
为了做到这点,爱丽丝必须要造假区块而且比其他矿工更早找到工作量证明发给鲍勃。
这当然是有可能的。说不定爱丽丝恰巧比所有人都抢先赢了这个小彩票。但鲍勃会继续收听其他矿工的广播
因此为了让鲍勃继续相信那个伪造的区块,爱丽丝必须要自己投入所有工作量。来不断给鲍勃的区块链分叉增添新的区块。
根据协议,鲍勃会一直信任他所知道的最长的链。也许爱丽丝可以坚持住几个区块,
假如处于机缘巧合,爱丽丝刚好找到了新的区块,而且速度击败了整个网络所有矿工的总和,但除非爱丽丝有接近所有矿工的总算力的50%。
否则从概率上看,基本能肯定其他所有矿工都能接受的那条区块链,都会比爱丽丝发给鲍勃的伪造区块链要增长得快。
足够久之后,鲍勃就会否认他从爱丽丝那里得到的信息。
这意味着你不一定要相信你刚听到的新区块。
还是不能相信。
接收到很多新区块,大概率是稳了。
那你就可以信任,这区块的确大概是属于其他人都在用的那条链。
目前所有主要思想都有了。
1. 电子签名 Digital signatures
2. 公共账本就是货币 The ledger is the currency
3. 去中心化 Decentralize
4. 工作量证明 Proof of work
5. 区块链 Block chain
这基本上就是比特币协议和其他许多加密货币的工作原理。
前面假设,新工作量证明使得整个区块的哈希值一开始是连续60个零。
实际的比特币协议,会定期更换零的个数。好让发现新区块的平均时间控制在10分钟左右。
随着越来越多的矿工加入到网络里,这个计算的挑战性也越来越高,要求开头的0个数变得越来越多。好让这个小彩票大约每10分钟才有一个中奖。
比特币里所有的钱,归根到底都来自区块奖励。最开始这个奖励是每区块50比特币。
2009.1 - 2012.11 50比特币
2012.11 - 2016.7 25比特币
2016.7 - 2020.2 12.5比特币
2020.2 - 2023.9 6.25比特币
https://bitaps.com/ Bitcoin Block Expoler可以查看区块链信息。
比特币创世区块,也就是第一个区块,里头除了奖励给矿工的50个比特币之外,再没有其他交易了。但没过21万个区块,大约是4年的时间奖励就会减半。
但因为奖励会随着时间做几何级数的递减,到最后不可能有超过 2100万个比特币。
然而这并不是说矿工就再也没有收入了,除了区块奖励,矿工也能获得交易手续费,具体操作是。
每当你收支一笔钱,你可以自愿加入一小笔交易手续费,哪个矿工挖到了包含这个交易的区块,钱就归谁。
这么做的原因是可以激励矿工,把你广播的交易加入到下一个区块里。
比特币的每个区块,只允许包含大约2400以及更多笔交易,但不是很多很多。很多人批评说这个制约很没有必要。
作为对比,VISA信用卡平均每秒处理约1700笔交易,而且有能力处理每秒超过240000笔交易。
比特币相对缓慢的处理能力,使得交易手续费偏高。因为手续费决定了矿工把哪些交易加入到新区块里。
原始的比特币论文:https://bitcoin.org/bitcoin.pdf
Block explorer网站:https://blockexplorer.com/
Michael Nielsen的博客帖子 它能帮你很好地了解交易具体是怎样的:https://goo.gl/BW1RV3
CuriousInventor的比特币视频:https://youtu.be/Lx9zgZCMqXE
Anders Brownworth的视频:https://youtu.be/_☆160oMzblY8
以太坊白皮书:https://ethereum.org/zh/whitepaper/
3Blue1Brown比特币视频:https://www.bilibili.com/video/BV11x411i72w