Skip to content

关于比特币

很久之前看过 北京大学肖臻老师《区块链技术与应用》公开课 的比特币部分,国内少有的高质量科班技术课程。最近又重看了一遍,准备用自己的话写一下,加深下理解。

密码学原理

比特币通过哈希和非对称加密的签名,来保障安全。

生成的钱包和签名的信息需要足够随机的 source. 否则可能泄漏私钥。

协议

转账方需要公布自己的公钥,让节点使用公钥验证自己的签名。

FLP

一个异步系统,即使只有一个成员是 faulty 的,也不可能取得共识。

CAP Theorem 的不可能三角

Paxos 著名的共识协议

比特币的共识协议

通过比拼算计,找到正确范围内的 nonce, 获得记账权(会获得区块奖励),达成共识。

只有最长合法链会得到认可。

分叉可能会维持一段时间,知道最后有一条链成为最长合法链。

实现

UTXO

unspent transaction output 维护账本中未被消费的账户余额,用于快速验证交易合法性。


每一笔交易都会有交易费,交易费会奖励给区块打包者,也就是矿工。

验证交易合法性

提供币来源的输出脚本和本次交易的输入脚本拼接后能顺利执行,不出现错误。即代表交易合法。

等待越多的区块,交易的确认会越有保障,因为越难篡改。

网络

P2P 网络,在网络里面所有节点都是平等的。通过 TCP 通信,有利于穿透防火墙。

消息传递性质是 Flooding (Best effort), 收到消息之后,转发给其他节点,同时记录这个消息自己已经收到过了。

为了保证区块传播,区块大小限制是 1M.

挖矿 & 挖矿难度

全节点

轻节点


比特币的挖矿本质上是通过计算找到在合理范围内的 nonce, 这个过程是 memoryless (progress free)的。

要成为最长合法链不止是找到在合理范围内的 nonce, 还要被最先其他节点采纳,也就是要尽快提交到网络中。

挖矿难度会在每 2016 个区块之后进行调整,理想的时间是 2016 区块 × 10 分钟 = 1209600 秒(14天)(三年来的出块时间)。超过理想时间会降低难度,低于理想时间提高难度。通过调整,使得实际出块时间逼近理想时间。也就是一般 14 天左右会调整一次难度。

block time

到时间不调整难度的矿工出的区块会无法通过验证,是不会被其他节点接受的。

一个我觉得很有趣的结论,💡比特币的挖矿难度和价格基本成正比。一个币难度越来愈低,说明市场热情在降低,这对于币的价值是不利的,反之亦然。

bitcoin Network Difficulty


现在的挖矿已经从最开始的 CPU 挖矿,到 GPU 挖矿,到现在的 ASIC 芯片挖矿了。

而且竞争非常激烈,普通人基本没有机会拿到记账权。可以通过加入矿池Mining Pool),贡献算力,计算出 share,最后按劳分配。

计算得到的 share 不一定是最后要找的 nonce,最后只会得到 Almost valid block.

矿池记录每个矿工提交的 share 份额,并最终按比例发放奖励。

这里不存在矿工计算得到正确的 nonce 不提交给矿池私自到比特币网络提交 block 的可能。

试图损人利己,是不可能的:

试图损人不利己,是可能的:


危机矿池集中过多算力,可能会导致 51% 攻击:

分叉

硬分叉,软分叉都是因为协议不同导致出现分叉。

硬分叉是永久性的,旧节点不认新协议挖出的节点; 软分叉是临时性的,旧节点也会认可新协议挖出的节点。

比特币著名的软分叉 P2SH: Pay to Script Hash.

匿名性

一笔交易的多个输入地址和输出地址可以关联起地址。

任何比特币和现实世界发生的联系都可能被追踪到真实身份。

保持匿名性最好的比特币用户,中本聪,拥有大量比特币却没有花;也没有为出名而现身。不为名不为利,就是保持匿名性最好的方法。

可以用闪电网络完成交易。

coin mixing 有提供这种服务的供应商;某些在线钱包或者交易所的交易(交易所不泄漏交易信息)也带有这个属性。

零知识证明

零知识证明是指一方(证明者)向另一方(验证者)证明一个陈述是正确的,而无需透露除该陈述是正确的外的任何信息。

钱包(私钥)拥有者对信息进行签名,验证者使用公钥验证签名。即可证明谁是钱包(私钥)拥有者。

是否属于零知识证明?有争议,因为多给出了签名信息。

思考

比特币很多有意思的使用例子,区块恋… 😆

肖臻老师的一段话,我很受用:

很多理论上的不可能,在现实中是可能的。同学们不要被学术思维限制了头脑。不要被程序员的思维限制了想象力。

量子计算的威胁

量子计算不能击溃比特币,公开的是取哈希后的公钥,这个过程是不可逆的。再去推导私钥更是不可能。

公钥只有在转出比特币的时候才会暴露,因为最为安全的做法应该是比特币地址每一笔交易之后就换一个新钱包,尽管需要花费一些交易费。


一些我的感悟

比特币设计的网络等等,都很简单其实,理解起来也很容易。网络以 Robust 为先,它不高效,要十分钟才出一个块,但是系统设计的美感很在线。又回到软件工程学里面的那句话:

Keep it simple! Stupid!


最后,下面这句是肖臻老师课程资料里面的一句话,送给看到这里的你。

炒币有风险,投资需谨慎。

BTW2018 年要是看完课程买的话,现在回报率应该还是不错的吧。lol


Share this post on:

Comments


Previous Post
未来个人创业的 PoI 方法论
Next Post
How to add LaTeX Equations in Astro blog posts