很久之前看过 北京大学肖臻老师《区块链技术与应用》公开课 的比特币部分,国内少有的高质量科班技术课程。最近又重看了一遍,准备用自己的话写一下,加深下理解。
密码学原理
比特币通过哈希和非对称加密的签名,来保障安全。
生成的钱包和签名的信息需要足够随机的 source
. 否则可能泄漏私钥。
协议
- 如何防止
double spent
转账方需要公布自己的公钥,让节点使用公钥验证自己的签名。
FLP
一个异步系统,即使只有一个成员是 faulty
的,也不可能取得共识。
CAP Theorem
的不可能三角
Consistency
一致性Availability
可用性Partition tolerance
分区容错性:指分布式系统在遇到网络分区(即某些节点之间的网络连接中断)时,仍能够继续正常工作的能力。
Paxos
著名的共识协议
比特币的共识协议
通过比拼算计,找到正确范围内的 nonce
, 获得记账权(会获得区块奖励),达成共识。
只有最长合法链会得到认可。
分叉可能会维持一段时间,知道最后有一条链成为最长合法链。
实现
UTXO
unspent transaction output
维护账本中未被消费的账户余额,用于快速验证交易合法性。
每一笔交易都会有交易费,交易费会奖励给区块打包者,也就是矿工。
验证交易合法性
提供币来源的输出脚本和本次交易的输入脚本拼接后能顺利执行,不出现错误。即代表交易合法。
等待越多的区块,交易的确认会越有保障,因为越难篡改。
网络
P2P
网络,在网络里面所有节点都是平等的。通过 TCP
通信,有利于穿透防火墙。
消息传递性质是 Flooding
(Best effort
), 收到消息之后,转发给其他节点,同时记录这个消息自己已经收到过了。
为了保证区块传播,区块大小限制是 1M
.
挖矿 & 挖矿难度
全节点
- 一直在线;
- 在本地硬盘上维护完整的区块链信息;
- 在内存里维护
UTXO
集合,以便快速检验交易的正确性; - 监听比特币网络上的交易信息,验证每个交易的合法性;
- 决定哪些交易会被打包到区块里;
- 监听别的矿工挖出来的区块,验证其合法性;
- 挖矿:
- 决定沿着哪条链挖下去?
- 当出现等长的分叉的时候,选择哪一个分又?
轻节点
- 不是一直在线;
- 不用保存整个区块链,只要保存每个区块的块头;
- 不用保存全部交易,只保存与自己相关的交易;
- 无法检验大多数交易的合法性,只能检验与自己相关的那些交易的合法性;
- 无法检测网上发布的区块的正确性;
- 可以验证挖矿的难度;
- 只能检测哪个是最长链,不知道哪个是最长合法链。
比特币的挖矿本质上是通过计算找到在合理范围内的 nonce
, 这个过程是 memoryless
(progress free
)的。
要成为最长合法链不止是找到在合理范围内的 nonce
, 还要被最先其他节点采纳,也就是要尽快提交到网络中。
挖矿难度会在每 2016
个区块之后进行调整,理想的时间是 2016
区块 × 10
分钟 = 1209600
秒(14
天)(三年来的出块时间)。超过理想时间会降低难度,低于理想时间提高难度。通过调整,使得实际出块时间逼近理想时间。也就是一般 14
天左右会调整一次难度。
到时间不调整难度的矿工出的区块会无法通过验证,是不会被其他节点接受的。
一个我觉得很有趣的结论,💡比特币的挖矿难度和价格基本成正比。一个币难度越来愈低,说明市场热情在降低,这对于币的价值是不利的,反之亦然。
现在的挖矿已经从最开始的 CPU
挖矿,到 GPU
挖矿,到现在的 ASIC
芯片挖矿了。
而且竞争非常激烈,普通人基本没有机会拿到记账权。可以通过加入矿池(Mining Pool
),贡献算力,计算出 share
,最后按劳分配。
计算得到的 share
不一定是最后要找的 nonce
,最后只会得到 Almost valid block
.
矿池记录每个矿工提交的 share
份额,并最终按比例发放奖励。
这里不存在矿工计算得到正确的 nonce
不提交给矿池私自到比特币网络提交 block
的可能。
试图损人利己,是不可能的:
- 区块奖励的地址是矿池的;
- 如果矿工私自修改奖励地址,矿主验证会失败,
nonce
和奖励地址是绑定的,提交的share
份额也会作废。
试图损人不利己,是可能的:
- 挖到
share
不提交,因为矿池之间存在竞争。
危机:矿池集中过多算力,可能会导致 51%
攻击:
Forking attack
, 可回滚交易;Boycott
, 拒绝特定的交易;
分叉
硬分叉,软分叉都是因为协议不同导致出现分叉。
硬分叉是永久性的,旧节点不认新协议挖出的节点; 软分叉是临时性的,旧节点也会认可新协议挖出的节点。
比特币著名的软分叉 P2SH
: Pay to Script Hash
.
匿名性
一笔交易的多个输入地址和输出地址可以关联起地址。
任何比特币和现实世界发生的联系都可能被追踪到真实身份。
保持匿名性最好的比特币用户,中本聪,拥有大量比特币却没有花;也没有为出名而现身。不为名不为利,就是保持匿名性最好的方法。
可以用闪电网络完成交易。
coin mixing
有提供这种服务的供应商;某些在线钱包或者交易所的交易(交易所不泄漏交易信息)也带有这个属性。
零知识证明
零知识证明是指一方(证明者)向另一方(验证者)证明一个陈述是正确的,而无需透露除该陈述是正确的外的任何信息。
钱包(私钥)拥有者对信息进行签名,验证者使用公钥验证签名。即可证明谁是钱包(私钥)拥有者。
是否属于零知识证明?有争议,因为多给出了签名信息。
思考
比特币很多有意思的使用例子,区块恋… 😆
肖臻老师的一段话,我很受用:
很多理论上的不可能,在现实中是可能的。同学们不要被学术思维限制了头脑。不要被程序员的思维限制了想象力。
量子计算的威胁
量子计算不能击溃比特币,公开的是取哈希后的公钥,这个过程是不可逆的。再去推导私钥更是不可能。
公钥只有在转出比特币的时候才会暴露,因为最为安全的做法应该是比特币地址每一笔交易之后就换一个新钱包,尽管需要花费一些交易费。
一些我的感悟
比特币设计的网络等等,都很简单其实,理解起来也很容易。网络以 Robust
为先,它不高效,要十分钟才出一个块,但是系统设计的美感很在线。又回到软件工程学里面的那句话:
Keep it simple! Stupid!
最后,下面这句是肖臻老师课程资料里面的一句话,送给看到这里的你。
炒币有风险,投资需谨慎。
BTW
,2018
年要是看完课程买的话,现在回报率应该还是不错的吧。lol