虚拟货币背后的密码学原理(为什么需要挖矿)
1. some basic definition(一些基础概念, 不感兴趣可以直接转至第二节)
我们经常会听闻比特币(BTC), 比特币是加密货币(Crypto-currency)的一种, 但是加密货币其实是不完全加密的, 其中所有的转账内容都是公开的
加密货币用到的最核心的算法就是哈希算法(Cryptographic hash function)
其中哈希算法有三大特性
[!NOTE]
- Collision resistance 抗碰撞, 指没有什么高效的方法人为制造碰撞, 只能暴力求解
H(X) = H(Y) 即为哈希碰撞
哈希碰撞是不可避免的
H(M)可以用来检测内容是否被篡改, 比如常见的MD5
没有哪个哈希函数可以在数学上证明是抗碰撞的(Collision resistance), 至今没有任何的数学家和密码学家能找到人为制造哈希碰撞的方法
- Hiding -> 即哈希是单向的, X -> H(X), 但是反过来不行, 推导不出来原值, 想要知道原值只能是暴力破解
想要实现完全隐藏, 需要输入空间很大, 并且分布均匀
Hiding + Collision resistance可以用来实现digital commitment(也叫digital equivalent of a sealed envelope)
举个例子, 有个专家在电视上预测了股市走向, 但是存在的问题是提前预测可能会影响股市行为, 所以专家将预测结果写在信封中, 交给三方 可信机构, 第二天再打开
在计算机中, 可以先将预测结果算出哈希值, 公布哈希值, 等预测结果出来再公布原值
输入空间如果不够大, 一般加密的做法是加一个随机数再取hash
即H(X||NONCE)
puzzle friendly 我们没有办法控制hash均匀的落到我们想要的范围, 只能通过暴力穷解
挖矿其实就是找NONCE
即H(block header) <= target, 区块的头小于阈值
挖矿没有捷径, 只能不断试NONCE
Proof of work 这也是工作量的证明
一旦有人挖到了并发布, 其他人验证也特别容易, 只需要验证一次哈希(difficult to solve, but easy to verify)
比特币中用的哈希函数是SHA-256, 其中SHA = Secure Hash Algorithm
上述都是哈希相关的, 接下来是签名(比特币中的账户管理)
中心化系统就像是银行, 比特币怎么开账户呢?
用户能自己开户, 不需要任何人批准, 开户就是本地创建一个公私钥对(public key, private key)
这个源于非对称加密体系(asymmetric encryption algorithm)
比特币交易系统中, 我如果要发起转账给他人, 我会用我的私钥对数据进行签名, 然后别的人会用我的公钥去验证这笔交易的合法性
如果两个人公私钥对一样怎么办?
理论上可行, 但是在SHA256体系中几乎不可能产生一样的公私钥, 到目前为止还没有发现谁能通过这种方式攻击他人账户
当然产生公私钥我们要有一个好的随机源, a good source of randomness
不光生成公私钥要有好的随机源, 后续在每一次签名的时候也得有好的随机元
比特币系统中一般是对数据先进行一次hash后再签名
2. 为什么需要挖矿
主要就是因为哈希算法puzzle friendly的特性, 因为hash只记录了摘要结果, 就好比是告诉你一串数字的相加结果 = 10
X+Y + … = 10
这些数连在一起就相当于加密前的数据
这个只能通过暴力穷解的方式来破解
实际上比特币使用的SHA256算法要比这个复杂很多, 不像上面的等式一眼就能看出来
并且谁先算出来谁就拥有了继续往区块链写入下个区块的权利
与之对应
就会有发币的权利(最早的比特币一个区块的奖励是50个币, 后来每挖出21万个奖励会减半)
截至据 2024 年 4 月,已有超过 1880 万枚比特币被开采出来,占总量 2100 万枚的约 90%
还是举个栗子(极端简化, 方便大家理解):
A先算出来1+2+3+4 = 10
那么A会把1234广播给大家, 大家一验证符合要求, 那么10这个区块就属于A了, 同时A会获得50个币的奖励(最早期)
实际上比特币挖矿是基于 PoW (Proof - of - Work,PoW)机制。当矿工找到一个符合条件的 nonce(随机数),使得区块头的哈希值小于目标阈值(即完成了一定的 “工作量”),就相当于挖到了一个新的区块。这个过程是非常困难的,需要大量的计算资源和时间来穷举 nonce。
例如,要找到一个合适的 nonce,使得H(block header) <= target
。由于哈希函数(如比特币使用的 SHA - 256)的特性,想要找到这个合适的 nonce 几乎只能通过不断地尝试不同的值来进行暴力求解。而且这个过程是不可逆的,别人很难通过逆向计算来获取这个 nonce。
一旦矿工找到了这个合适的 nonce 并构建了新的区块,其他节点可以很容易地验证这个区块是否符合规则。因为验证过程只需要对区块头进行一次哈希计算,然后比较哈希值是否小于目标阈值,这是一个相对简单的计算过程。所以,在这个机制下,只有真正完成了大量计算工作的矿工才能构建合法的区块,很难盗取别人的挖矿成果。