不装逼的比特币,区块链入门
文章转载:https://danqi7.github.io/jekyll/original/2018/01/12/make-blockchain-uncool-again.html#overview
目录:
几个月前,一个教分布式系统的教授开玩笑地跟我说,现在风口都是AI了,啥时候轮得上计算机系统?现在看来,这个风口真的来了,还来得很猛烈,可惜的是大家关注的并不是分布式系统。比特币疯涨,区块链大热,各种加密货币ICO(Initial Coin Offering)层出不穷,新闻媒体争相报道,各界人士跳出来说区块链将塑造未来,潜力无限。事实上不少人都在雾里看花,所以我想尝试一下用简单易懂的方法帮大家扒开这一层雾。我并不是专家,如有出错和不准确的地方,欢迎指出和讨论。
Let’s make bitcoins and blockchain uncool again!
比特币,区块链概论
简单来说,比特币是一种去中心化(decentralized)的加密货币(cryptocurrency),区块链是一个分布式(理论上完全的P2P)数据库。 比特币通过区块链这一技术来实现“去中心化”和解决“双重支付问题 (double-spending problem)”。比特币是2008年由一个署名为中本聪(Satoshi Nakamoto)的人提出(Bitcoin: A Peer-to-Peer Electronic Cash System),其构想是一个完全去中心化,不需要权威/第三方参与,用户对用户的电子货币。
比特币的实现主要由两个部分组成:
- 数字签名(Digital Signature): 加密支付
- 区块链(Blockchain): 记载交易顺序,建立整个P2P网络的连贯性(consistency)和一致性(consensus)
数字签名,加密支付
想象一下,如果小明现在想支付小芳2个币,于是他写了“小明 支付 小芳 2币”,同理, 如果A想向B支付N个币,A可以写“A 支付 B N币”。那问题就来了,如果小明非常不老实,他可以随意冒名写“小芳 支付 小明 20币”。如何来保证支付的可靠性呢?
比特币或者其他加密货币通过数字签名来加密支付。 当用户加入比特币生态系统的时候,每个用户会得到一个比特币地址(Bitcoin Address)和比特币钱包(Bitcoin Wallet),钱包里其实是一对**(a pair of keys), 包括公钥和私钥(public & private key),私钥用来生成数字签名,和公钥一起使用进行不对称加密。 简单来说, 不对称加密能够保证小明的比特币只有小明本人(本质上是拥有小明私钥的人)能拿来进行支付。所以,与其说小明的比特币,不如说小明私钥的比特币,这也是为什么比特币是匿名的原因之一。
另外一个原因是比特币网络的用户是由比特币地址组成的,也就是说当你要支付的时候,比特币网络记录的是“[某个比特币地址] 支付 [某个比特币地址]”,而不是直接记录“某某 支付 某某”。地址的拥有者是由其私钥证明的。
所以,保护好自己的私钥非常重要。事实上,私钥是可能因为各种原因(电脑废了,内存丢了等等)而消失的,当私钥消失的时候,所对应的比特币再也不可能被找到了。
区块链,记载交易顺序
好了,现在我们通过不对称加密保证了支付的可靠性,也就是说现在不论小明有多少坏水,他都不能冒名小芳写“小芳 支付 小明 20币”。小明转念一想,虽然他不能伪造支付,但他可以双重支付他所拥有的币。比如,小明写了“小明 支付 小芳 1币”, 小明又写了“小明 支付 小李 1币”,但事实上小明身上总共也就只有1个币。如何防止像这样的“双重支付问题”的发生?
在中心化货币(比如实体货币,又或者是Q币)的世界里,权威第三方(比如银行,腾讯的数据库)能够确认支付者有足够的支付数量,因为第三方记录了整个交易系统的交易,也包括了交易顺序。
难道我们也要引入权威第三方吗?那“去中心化”的构想就毫无意义了。我们需要一个系统,这个系统里的每一个参与者要同意一个唯一正确的交易历史,包括交易顺序。 简单来说,每个参与者(其实不是每个节点,而是网络里的矿工,下文会解释)都会记录整个网络的交易历史,交易顺序,而这个交易记录是一致唯一的(consistency & consensus)。
这个系统/网络是什么呢?它就是现在被吹得神乎其神,“将要改变每个行业”的区块链(block chains)。
从技术上讲,其实区块链就是一个“高容忍拜占庭失败”(high tolerance of Byzantine failures)的P2P网络(Peer-to-Peer network),这个网络里的Peer(其实就是矿工,下文会详细解释挖矿和矿工)储存着整个网络唯一的交易历史。
P2P网络是分布式系统的一种。分布式系统又是啥?举个例子,Snapchat的用户那么多,一个电脑/服务器能储存的数据是有限的,而且肯定不够啊,那咋办呢?一个电脑不够,千千万万个电脑总够了吧(其实可能也不够,这里只是举个例子)?这千千万万个电脑,通过网络交流彼此的数据,就形成了分布式系统(distributed system)。P2P网络,通俗一点来说就是网络里的每一个用户是对等的,享有同样的权利和义务(现实中完全的去中心化的P2P网络几乎不可能存在)。“拜占庭失败”,简单来说就是网络里的用户偏离了自己规定的表现,比如宕机,叛变,不诚实。“高容忍拜占庭失败”对比特币很重要,因为容忍性直接决定了整个区块链网络的稳定和可靠性。
像这样的P2P网络并不是什么新科技,高容忍的P2P网络不少(比如像Raft), 比特币最大的发明在于新的确定的比特币交易是由挖矿(bitcoin mining)记录的。
如果你已经被上面大堆的术语绕晕了,没关系,不影响理解。下面让我们来详细看一下区块链,看完之后你就会发现这玩意儿理解起来并不复杂:
Hash
要理解区块链,首先要弄懂一个概念叫Hash。Hash这里指的是Cryptographic Hash。简单来说,Hash将输入变成长度定量的二进制数字。 比如,输入“小明 支付 小芳 2币”,输出hash是“01000010….00”。只要两个输入不一样,输出Hash就不会一样。 Hash还有一个特性是计算输出Hash容易,由输出Hash反推输入字符串几乎不可能。 挖矿也和Cryptographic Hash息息相关,下文会解释。比特币挖矿使用的是double SHA-256。
区块
区块链(block chains)的最基本单元是区块(block)。 每一个区块由区块头(block header)和区块体(block body)组成。
(实际上在中本聪的论文中,下图左,并没有提到区块体,这里加以区分只是为了便于理解。)
区块体记录交易(transactions),区块头记录了关于这个区块的一些信息,比如区块的Hash,上一个区块的Hash,Nonce和Root Hash(又叫 Merkle Root)。每个区块Hash是不同的,相当于区块的身份证号码。通过保存上一个区块的Hash,这个区块就可以跟上个区块连起来,网络里的区块连在一起就形成了区块链。 所以一个朴素不浮夸不装逼的区块链示意图如下:
区块Hash是如何计算的呢?请看下面的拟代码:
Root Hash = Cryptographic Hash(区块交易数据)
区块Hash = Cryptographic Hash(区块高度,生成时间,上个区块Hash,Root Hash, Nonce)
严格意义上讲,root hash的计算不像上面代码那样写得那么简单,但这样写是为了证明Root Hash是依赖于区块的交易数据的,而区块Hash又是依靠于Root Hash的,所以结论就是区块Hash取决于其记录的交易数据。交易数据一旦被写入区块,就不能被更。 因为一旦被更改,区块Hash就会随之改变,为了保持这个被更改的区块在整个区块链中,就要改变这个区块之后的所有区块。 这就是“牵一发而动全身”。
- 区块链的基本单元是区块
- 每个区块有自己的区块头和区块体,区块体记录交易数据,区块头记录自己的区块Hash和上一个区块的Hash
- 区块连着区块形成了区块链
- 区块链中的区块不可更改
挖矿:新区块的诞生
上面说到用数字签名可以保证交易的真实性,但在比特币网络里,确定交易真实性还不够。一笔交易要成功,这笔交易必须是要被记录在区块里才算确认。 新区块的诞生就叫做挖矿(bitcoin mining)。
挖矿的过程是这样的。矿工们记录网络里的交易,同时也在计算下一个区块Hash,下一个区块Hash是怎么计算的呢?就是上文提到的拟代码里那两个公式。在同一时间,有可能有很多个矿工都在挖矿, 如何决定哪个矿工挖到下一个区块呢?比特币的开发者决定,当矿工计算的区块Hash恰巧达到某个正确数值的时候,这个区块就被成功挖到了,这个区块所记录的交易也就正式被确认。
挖矿的难点: 工作量证明
正确的区块Hash需要以“足够的零”开头。 比如,下一块Hash需要3个零开头,那么矿工计算的区块Hash就必须像“000….”这样的形式。需要开头的零越多,计算困难就越大,计算量就越大。上面提到的Nonce记录了这个区块尝试了计算Hash多少次才成功。比如现在的区块一般要9亿次计算才能有可能挖到矿,当然,尝试几万次也是有可能成功的。挖矿需要很大的计算量,也相当耗时,耗电。计算这个正确的Hash的过程叫“工作量证明 (proof-of-work)”。 因为Hash的特性,“工作量证明”的特点是很难计算出正确结果,但很容易验证正确结果。很多人将这一过程称为“解难题”,但计算正确的Hash并不需要脑力投入,只是需要电脑不停地计算新的Hash直到猜中。
一旦有矿工挖到了下一个区块,这个矿工会告知整个网络(broadcast), 整个网络都会承认和同步这个新生成的区块, 正在计算这个区块的其他矿工也不得不放弃进行到一半的计算,投身到计算下一区块中。
如果恰巧几个矿工同时挖到了下一个区块,其他矿工会把新的区块都保存下来,直到某一个区块分支比其他区块分支都长,这个时候就承认最长的分支为正式的区块链。
新区块生成时间。 如果网络中有越来越多的矿工,或者新区块生成速度变快,那么计算到正确Hash的难度就会自动上升。比特币的开发者规定,新的区块生成平均需要10分钟。这个10分钟规定有两个目的:
- 确保网络中的其他矿工有足够时间同步交易记录,也就是同步区块链。更新速度太快的话,可能会导致矿工之间的区块链不同步。
- 确保恶意矿工不能伪造区块/区块链。如果区块生成时间太快,恶意矿工可以快速地生成假的区块链,比其他诚实矿工生成的真实区块链都长。
防止恶意攻击。 如何防止恶意攻击区块链?举个例子,现在区块链网络里有4个矿工(小明,小芳,小李,小张),小明正好挖到下一个区块,这个区块里记录着一条交易“小明 支付 小芳 20币”,然后他并没有告知全网络,而是只告诉了小芳,这时小芳就会立刻更新自己的区块链,并接着挖下一个区块。所以这个时候,小芳会误以为“小明 支付 小芳 20币“这个交易已经确认,但其他矿工并不会这么认为。但由于小芳还是会听到其他矿工的新区块通知,小明为了让小芳继续相信自己的假区块,就必须比其他矿工更快地挖掘出新的区块来维持自己的假区块链,而这基本不可能,除非小明掌控了整个网络中51%以上的计算能力。(这样的造假实际上是有可能的,请看下文)
潜在的恶意攻击。 上面提到,除非恶意的矿工掌控了区块链网络中51%以上的计算能力,否则就不可能攻击整个网络。实际操作上,一般来说,只要攻击者的区块分支长度达到6,也就是说恶意攻击者能赶在其他矿工之前抢先连续生产6个区块,那么他假造的区块就成功了。连续抢先生产6个区块是非常非常困难的,但一个叫“BTC Guid”的采矿池(mining pool)就曾成功抢在他人之前连续生产6个区块。 采矿池(mining pool)顾名思义,就是把一堆矿工集合在一起采矿,因为矿工自己一个采矿的计算能力有限。试想一下,如果矿池的计算能力集中了整个网络的51%,那这个矿池就完全掌握了比特币网络。
除了上面提到的潜在攻击,区块链潜在的安全漏洞,发现的,没发现的,肯定都是存在的。比特币恶意攻击事件也是存在的,比如2017年12月7日卫报报道的4700多比特币被盗。
比特币交易速度。 上面提到,只有被正式写入区块的交易才能被确认成功。一个区块的大小为1M,也就是说最多也只能记载2000多笔交易。每10分钟才记载2000多笔交易,也就是说比特币的交易处理速度是3~7笔每秒,跟VISA每秒2万4千笔交易速度比起来,简直是弱爆。 不少炒作加密电子货币的人说,要是货币真的开始跌了,就赶紧抛啊。但买卖电子货币的延时可能还挺长的。等你的交易真的被区块确认的时候,比特币的价格可能也不是你当初点击抛售的那个价格了。
挖矿的奖励。 为了鼓励矿工(如果没有矿工,交易就无法被确认),比特币的开发者规定,新区块的生成会奖励挖矿者一定量的比特币。2008年开始的时候是50个比特币,每四年减半,到现在2018年是12.5个比特币。这样推算下来,到2140年的时候,全球的比特币就会停止增长。全球最多会有两百多万比特币。目前20%的比特币都已经被挖出来了。到2140年,新的区块还是会生成,但新生成的区块不会奖励矿工新的比特币了。那矿工还有什么方式可以进行收益吗?有!矿工可以收取手续费。因为每一笔交易不会被正式确认直到矿工把这笔交易写进自己的区块里,如果你给矿工的手续费给少了,那有可能矿工就不会把你的交易写进去,这样你的交易被确认就要等很久,直到有矿工把你的交易写进去。
矿挖的疯狂。 挖矿的收益算起来还是很可观的,也正是因为这样,吸引了非常多的人变身矿工。挖矿其实很简单,买相应的硬件,和下载现成的挖矿软件就可以进行挖矿。挖矿最大的支出是电费,所以很多矿工甚至跑到了加拿大,瑞士挖矿,因为他们电便宜。偷电(比如特斯拉充电站,建筑工地电源)也屡见不鲜。根据摩根士丹利预测,2018年挖矿的用电量将等于2025年全球电动车的总耗电量。有人不禁问,消耗这么多人类资源就是为了拿到电子货币,有意思吗?(作者抱怨一下:挖矿使得GPU价格疯涨,正儿八经玩游戏的人都要买不起GPU了)
对于比特币/加密货币的思考
作者的主观思考,仅供参考
- 比特币和其他加密货币到底有没有可能成为未来的一种世界货币? 我们可以说一句永远正确的废话:万事皆有可能。如果不说废话,首先我们得讨论是什么令美元成为了世界货币?简单来说,美元能成为世界货币是因为美元的背后有美国在撑腰,大家相信美国,美元自然有可信度,有流通性。我们可以拿美元去其他国家直接消费,但如果我们拿柬埔寨的货币去其他国家消费呢?所以,成为世界货币的条件是可信度,大家信任这个货币。那比特币和其他加密货币的可信度怎么样?从其构想来说,比特币是一个完全去中心化,不需要权威/第三方参与,用户对用户的电子加密货币。我们可以从技术层面的加密和可靠性考虑比特币和其他加密货币的可信度。
- 货币的”去中心化“,”匿名性“就一定是一种优势吗? 我个人认为,比起去中心化的加密匿名货币,我更相信有第三方权威担保的中心化货币。加密货币的去心中化和匿名性,从另一方面也意味着,如果货币被偷盗,无法负责。举个例子,如果你的信用卡被盗刷了,你可以向银行申请refund,但如果加密货币被盗刷了,那你就只能认栽了。(或许买个加密货币保险?新行业?) 有人会说,相信国家发行的货币,要是国家倒了怎么办?比特币和加密货币可以作为一种规避这种风险的手段。但我个人认为,除非是战乱时期,这种风险发生的几率还是比较小。要真是在战乱,比特币的中心服务器可能早被炸了。简单来说,比起本来就脆弱的网络,我还是更相信权威第三方。
- 技术上的“去中心化”并不等同于现实中的“去中心化”。 全球的大量比特币可能被控制在非常少的几百个人手里,这几百个人可以联合起来控制市场走势,而因为比特币的匿名性,他们可能不会收受到任何惩罚。技术上的“去中心化”,可能反而保证了现实中的绝对“中心化”。
- 区块链本质是P2P的分布式网络,而分布式网络做到完全地去中心化是几乎不可能的。也要考虑到区块链的潜在安全风险。
- 投机炒作多。 把比特币和其他加密货币推到风口的不是参与者对其成为未来货币的期望,而是跟风把其当成一种纯粹的投机,炒作手段。从这一点来看,加密货币现在的可信度就得打个问号。
- 区块链有没有其他应用场景? 除了加密货币系统,区块链还有没有其他应用场景?你们说呢?