This commit is contained in:
louzefeng
2024-07-11 05:50:32 +00:00
parent bf99793fd0
commit d3828a7aee
6071 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,180 @@
<audio id="audio" title="63 | 区块链技术的本质" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/4f/c2/4f3012f7dc54c6359dbe750e6bd4b6c2.mp3"></audio>
去年专栏一开始更新的时候,就有读者留言让我发表一下对区块链技术的看法。当时我觉得区块链相关的技术相对比较简单,没什么好说的。并且,“左耳听风”专栏的主要目标是帮助大家学习更为主流的关键技术,所以那会我就把区块链相关的技术文章降级处理了。
那为什么现在我又要写这个主题呢?
2010年我在浏览国外技术网站时看到好多人在讨论一个叫bitcoin的东西还看到有人说用几万个这个东西换了个披萨。随后我看了一下它的[白皮书](https://bitcoin.org/bitcoin.pdf)这篇不到10页的文档读起来还是很容易的所以建议你读一读。
然后我在一台电脑上尝试安装了一下就像用BT或电驴下载一样连入了这个没有服务器的P2P网络下载了账本还尝试了一下“挖矿”。
花了不少的时间我收到了来自系统奖励的50个比特币。当时我默默地看着这个又耗硬盘空间又非常吃CPU的家伙心里想这什么破软件太难用了就删除了。是的这50个比特币也就不知道去哪了。
记得比特币开始有价值的时候像维基解密这样的机构为了避开被政府控制的银行会接受比特币的捐款。2012年的时候比特币已经看涨了到了2013年比特币的市值已经比较高了突破了1000美金。
那个时候,中国有好多人在挖矿。记得最厉害的是李笑来,他持有的比特币数量很可观,如果没有卖的话,现在就更为“恐怖”了。
在2016年的时候我听说了个叫以太坊的东西。嗯是区块链 + 代码的组合又被叫作智能合约这的确给予了区块链有更多的想像空间。还听说了这个项目是被ICO出来的然后我就了解了下ICO。同年我有一个高中同学搞了个创业项目据说是中国第一个ICO项目。当时筹到了1000万人民币然后发币上了二级市场。
再然后2017年的一天有人带我去见薛蛮子。听他说他在很短的一段时间内出手投了好多个和区块链相关的创业项目。见薛蛮子一周后中国政府出台政策定性ICO非法开始治理市场清除所有一切和ICO相关的东西。
似乎市场应该就此冷静下来了。
2018年1 月 9 日,真格基金创始人徐小平在一个微信群里对他投资公司的 CEO 们说,区块链是一场伟大的技术革命。他要求大家“对区块链不要有怀疑,不要有迟疑,立即动员全体员工,学习如何拥抱这场革命”。
随着徐小平这个微信截图的流出又把区块链推到了风口浪尖。我几个关系不错的做技术的朋友也跟着入坑了……各种人,认识我的,不认识我的,全都来找我,问我区块链的事,我不想关注都不成了……
所以,我想我还是在这里写上几篇文章吧。一方面,我会很客观地把区块链的技术解释出来(不是那种天马行空完全不知所云的比喻,是实实在在的技术,我保证非技术人员都一定能看得懂),包括区块链、非对称加密、挖矿、共识机制等。
另一方面,我会结合现有的一些金融上的交易撮合的中心化标准玩法来让你来比较一下中心化和去中心化的不同。最后,我会谈一些我的观点,可能会上升到哲学层面。当然,最后还是由你自己来做判断。
下面是这几篇文章要回答的关键问题。
<li>
**为什么区块链技术会成为热点技术?它解决了什么问题?**
</li>
<li>
**区块链blockchain究竟是个什么技术这里我会带你抽丝剥茧看看区块链技术看看区块链是如何做到不可篡改的。同时我还会解释什么是“挖矿”以及为什么要&quot;挖矿&quot;,全是技术干货。**
</li>
<li>
**去中心意味着没有一个公司,没有公司就意味着没有服务器,没有服务器的软件是怎样提供服务的?这里主要会讲一下无中心化的系统是怎么运作的,是怎么达成一致的?**
</li>
<li>
**智能合约是个什么鬼?它有什么意思?**
</li>
<li>
**简单地谈一谈金融,你可以自行思考一下,区块链虚拟货币是否有可能取代现有的金融服务?并重组整个社会架构?**
</li>
<li>
**最后,我会提出几个逻辑问题来让你独立思考一下“去中心化”的优劣,以及相关的逻辑和哲学问题。**
</li>
闲言少叙,我们开始。
# 区块链技术的革命性
你一定看过太多的文章用各式各样的比喻来讲区块链技术是什么,以及为什么它是未来。在这里,我尝试用我的话来说明一下区块链技术的革命性。
说区块链必然要谈比特币,比特币是一种数字货币。但最令人叫绝的是,比特币号称有下面几个特性。
<li>
**去中心化**。这意味着没有中心的服务器不受某个人的控制整个系统直接由用户端的电脑构成。这样的技术难度是非常大的并不像手机App或是小网站一样你想发布就发布这需要有人来跟你一起玩。
</li>
<li>
**数据防篡改**。所有交易记录全量保存,并公开给所有的人,而且还被加密和校验。并不是数据不能被篡改,而是数据被篡改的成本非常大。(有人借此说区块链的不可篡改可以解决人类的信任问题,这个并不一定。)
</li>
<li>
**固定的发行量**。不会像国家中央银行那样乱印钞票,造成通货膨胀。
</li>
这几个东西加在一起,就可以让那些想作弊的人,尤其是那些有权有势有钱的大公司大组织很难作恶。因为“去中心化”这个事,从本质上来说,造就了整个系统不再需要这些个大的公司和组织,人民可以达到真正意义上的自治,这些大公司都会倒闭。
简单说来相信区块链的人都相信可以通过区块链这个技术来改变整个社会的组织形成——不再需要银行、中介机构、电商平台、支付宝等中间机构人们可以通过一个不受任何人控制和操作的P2P金融系统进行完全自由和可信的交易。
当然反区块链的人的观点也很明确。他们认为所谓的去中心化看似很美好但实则不可能。而且从目前的区块链的应用来看也没有颠覆什么连迹象都没有。反而大家都在疯狂地炒作概念没有实质的价值。像ICO和交易所这样的东西里面充满了大量的投机主义泡沫非常大。
于是,这种巨大无比的争议性,把人们分割成了两种阵营,把区块链推向了火热。对此,我这几篇文章会把区块链这个技术一点一点讲解清楚,让你自己判断。
其实,对于投资机构来说,在逻辑上,我觉得他们应该感到恐慌才对,因为他们也是被革命的对象啊。如果某个事不再需要公司,人们自治,那么投资人怎么投资啊?投资的实体都没了啊,怎样有回报?
如果说,投资机构想扶植一个小公司用区块链技术把大公司干掉,那在逻辑上也说不通啊,因为如果你投资的公司也可能被别人很容易地颠覆掉,那么你怎么可能会投资呢?
相关的逻辑问题,我们会放在最后来讨论,还是先看一下区块链的技术。下面会有非常详细的技术细节,如果你不关心技术细节,那么可以只看“”技术概要”一节。
# 技术概要
首先,我们先看一下中心化和去中心化的业务流是什么样的。
下面的图给出了“传统中心化”和“去中心化”的对比。
<img src="https://static001.geekbang.org/resource/image/cf/1c/cf7c446b8781434c33a536228c335b1c.png" alt="" />
<img src="https://static001.geekbang.org/resource/image/93/48/93db9b74de0c73d52e4ed35f559a6348.png" alt="" />
去中心化的比特币交易处理流程如下。
<li>
首先,需要交易的用户把交易传到网络中。
</li>
<li>
然后,网络上有些机器叫记账结点,它们通过比拼计算力的方式竞争记账权。这也叫“挖矿”。
</li>
<li>
获得记账权的结点,会把待记账的交易进行计算打包,并向全网广播。收到新的记账包的结点会对其进行验证,验证通过后加入自己的区块。
</li>
注意整个比特币的世界是没有服务器的其完全是靠大家用自己的电脑拼出来的一个分布式系统。既然这些电脑都是大家自己的所以这种P2P的去中心化网络有一个前提假设——**“网络中的任何结点都是不能信任的,它们中的任何一个都可能会作恶”**。
基于这个前提假设,这个分布式的账本系统就需要有如下的设计:**任何人都可以拿到所有的数据。所以,数据要能很容易被验证是合法的没有被修改过的,而且也要是很难被人修改的。**
基于这个设计,比特币使用了两个比较大的技术:**“区块链技术”<strong>和**“工作量证明共识机制”</strong>
## 区块链
第一个技术就是区块链区块链又叫blockchain其中有一个一个的区块每个区块中包括着一组交易信息然后每一个区块都会有一个ID或是一个地址这些区块通过记录前一个区块的ID来形成一条链。下面的图有助于你形象地理解这一概念感兴趣可以看看。
<img src="https://static001.geekbang.org/resource/image/77/00/7794cf8d3e41046d3d3bf215c5edae00.png" alt="" />
但需要注意下面这几个方面。
<li>
**每个块的ID都是通过其内容生成的**所以只要是内容有一丁点儿的变化这个ID都会完全不一样。
</li>
<li>
而生成ID的内容中还包括上一个块的ID。于是只要上一个块的内容变了其ID也要跟着变不然就不合法了那么后面指向这个块的ID也要变。于是后面指向这个块的ID也要重新计算而变成另一个这样就会形成一个连锁效应——一个块被修改后续的所有块都要跟着一起改。于是导致了修改成本的提升。
</li>
<li>
这种一处改,处处改的方式,并不代表不能篡改,而只是让修改面比较大,让你的改动麻烦一点。
</li>
<li>
越旧的区块的篡改会造成越大面积的修改,于是越旧的区块就不容易篡改,就越安全。反之,越新的区块就越不安全。
</li>
而真正让区块链做到非常难篡改的是工作量证明的共识机制。
## 工作量证明共识机制
我们知道,分布式网络的数据一致性是最难的问题了,在这种去中心化的网络集群下就更难了。其中最大的本质差别是,**一个公司内的分布式系统中的结点是被假设成可信任的,而在去中心化的网络下,结点要被假设成不可信任的。** 想象一下,在一堆不可信的结点上做一致性是不是一件很难的事?
这里,需要解决几个与“数据一致性”相关的问题。
<li>
**以谁的数据为准?** 任何结点都可以修改自己所下载的账本,也就是任何一个人都可以伪造账本。那么,谁的数据才是对的?**在去中心化的网络下,我们只能认为,大多数人认识的数据是对的。**只要我控制了一半以上的结点,我让这“大多数人”伪造同一份账本,那么相当于整个账本都被我修改过来了。**因为在没有服务器的去中心化的网络下,所谓的真理只不过是大多数人同意的东西。**
</li>
<li>
**“大多数人”的问题。** 是人数吗?在网络世界里,我可以用程序模拟出无穷多的“人”出来投票,所以,用人数来解决去中心化的问题,在分不清是人还是狗,是生物还是程序的计算机世界里,是一件很愚蠢的事。
</li>
<li>
**意见分歧问题。** 如果在同一个时刻有多个人都在告诉其他人这账应该这么记。比如说有人说左耳朵转了10块钱给了耗子叔有人说左耳朵转了20元给了耗子叔还有人说左耳朵没有花钱是陈皓花的钱。而且他们的数据都合法那么整个网络应该听谁的
</li>
是的,这种没有人组织的玩法真是乱啊。
为了解决这几个问题比特币使用了Proof-of-Work工作量证明机制也就是“挖矿”。所谓的“挖矿”其实就是用大规模的计算来找到一个符合系统要求的区块ID。要找到符合条件的区块ID只能通过暴力穷举的方式所以要付出大量的系统计算资源和电力。
这样一来,我们用这种“极度消耗计算力”的方式来提高成本,从而有效地遏制或解决下面几个问题。
<li>
**修改几乎变得不可能**。试想如果生成一个区块需要大量的长时间的计算力。也就是在世界上最好的电脑集群下计算10分钟才能打好一个包。那么当我们要去修改数据内容的时候这个过程也是一样的。前面说过如果你要伪造一个块那么你就要修改后面所有的块修改一个块的成本如此之高那么修改整个链的成本也就非常之高了。
</li>
<li>
**能掌握51%的算力的人变得几乎不可能**。除了伪造一条链的成本很高,还要控制大多数人的算力,这意味着需要巨额的资金投入。这两个难度加起来,几乎不太可能。
</li>
<li>
**解决分歧**。一方面这么大的工作量找出来的区块ID已经有效地降低了大家有意见冲突的概率。另一方面就算是出现了合法冲突的区块同时出现了多个合理的区块即区块链出现分支/分叉),**也就是多个合法的账本**。而因为挖矿的成本太高,导致要同时跟进多个账本是不可能的,所以矿工们只能赌跟其中一个。大多数人所选择的那一个分支的链就会越来越多,于是另外一边也就无人问津,从而作废了。
</li>
你别看Proof-of-Work成本这么高还这么耗电不环保但是这是目前去中心化系统中最安全的玩法。其中的相关细节可以查看后面的挖矿和去中心化的共识机制
好了,上面就是区块链的相关技术概要。如果想了解相关的技术细节,你可以继续阅读后面的内容,我会一一给你解析。
文末给出了《区块链技术》系列文章的目录,希望你能在这个列表里找到自己感兴趣的内容。
- [区块链的革命性及技术概要](https://time.geekbang.org/column/article/5197)
- [区块链技术细节:哈希算法](https://time.geekbang.org/column/article/5363)
- [区块链技术细节:加密和挖矿](https://time.geekbang.org/column/article/5438)
- [去中心化的共识机制](https://time.geekbang.org/column/article/5612)
- [智能合约](https://time.geekbang.org/column/article/5623)
- [传统金融和虚拟货币](https://time.geekbang.org/column/article/5636)

View File

@@ -0,0 +1,166 @@
<audio id="audio" title="64 | 区块链技术细节:哈希算法" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/db/0e/dbc4040c7424890b9e9e0940bef4a70e.mp3"></audio>
对于计算机来说,区块链就像一个单向链表,一个数据块中保存着三个信息。
- 真正的数据。
- 自己的地址或是ID
- 前一个数据块的地址。
这样通过追溯前一个块的地址把所有的数据块存成了一条链。所以我们叫其BlockChain。如下图所示。
<img src="https://static001.geekbang.org/resource/image/1c/62/1c75fed53ee023c353a31616d2b29e62.png" alt="" />
每个数据块的“地址”的编码使用了计算机上的一个算法计算机圈内人士把这个算法叫Secure Hash。有人音译为“安全哈希”也有人意译为“安全散列”。在计算机应用中hash算法主要有几个功能。
<li>
用来生成唯一标识一个数据块的ID身份证这个ID几乎不能重复。
</li>
<li>
用来做数据的特征码。只要数据中一个bit的数据出现更改那么整个hash值就完全不一样了。而且数学上保证了我们无法通过hash值反推回原数据。
</li>
于是很多公司在互联网上发布信息或软件的时候都会带上一个Checksum校验码。你只要把整个文件的数据传入到那个特定的hash算法中就会得到一串很长的字符串。如果和官方发布的Checksum字符串不一样那么就说明信息或文件内容被人更改或是信息残缺了。因此也被应用在“数字签名”中。
在计算机世界里有两个很著名的hash算法一个叫MD5[Wikipedia链接](https://en.wikipedia.org/wiki/MD5)一个叫SHA-2[Wikipedia链接](https://en.wikipedia.org/wiki/SHA-2) 区块链用的是SHA-256这个算法。
下面是一个示例。
<li>
&quot;chen hao&quot;这个信息计算MD5值得到 9824df83b2d35172ef5eb63a47a878eb一个16进制数
</li>
<li>
如果对 “chen hao&quot;做一个字符的修改,将字母&quot;o&quot;改成数字&quot;0”即 “chen ha0”计算出来的MD5值就成了 d521ce0616359df7e16b20486b78d2a8。可以看到这和之前的MD5值完全不一样了。
</li>
于是我们就可以利用hash算法的这个特性来对数据做&quot;数字签名&quot;。也就是说,我将&quot;数据&quot;和其&quot;签名&quot;hash计算值一起发布这样可以让收到方来验证数据有没有被修改。
我们再来看上面那个区块链的图。
<img src="https://static001.geekbang.org/resource/image/1c/62/1c75fed53ee023c353a31616d2b29e62.png" alt="" />
对于第一块数据我们把其“数据集”和“前数据块的hash值 00000a6cba”一起做hash值得到本区块的地址000007cabfa。然后下一个区块会把自己的数据和000007cabfa一起做hash得到000008acbed这个哈希值……如此往复下去。
根据“被hash的数据中有一个bit被修改了整个hash就完全不一样了”这个特性我们知道
<li>
如果前置数据块中的数据改了那么其hash就会完全不一样了也就是说你的ID或地址就变了于是别人就找不到这个数据块了
</li>
<li>
所以你还要去修改别人数据块中指向你的地址但是别人数据块中指向你的地址ID/hash变了也会导致他自己的地址ID/hash随之变化。因为他用你的地址生成了自己的地址这样一来你就需要把其他人的地址全部改掉。
</li>
在这样的连锁反应下你想要偷偷修改一个bit的难度一下就提高很多。所以在区块链的世界里越老的区块越安全也越不容易被人篡改越新的区块越不安全也越容易被人篡改。
# 比特币的hash算法
下面我来简单介绍一下,比特币中区块链的一些细节。下图是区块链的协议格式。
<img src="https://static001.geekbang.org/resource/image/a9/98/a99ad9de4d156cea9e8ee716c48e0298.png" alt="" />
其中VersionPrevious Block HashMerkle RootTimestampDifficulty Target 和Nonce这六个数据字段是区块链的区块数据协议头。后面的数据是交易数据分别是本块中的交易笔数H和交易列表最多不能超过1MB为什么是1MB后面会说
下面我来说一下区块头中的那六个字段的含义。
<li>
Version当前区块链协议的版本号4个字节。如果升级了这个版本号会变。
</li>
<li>
Previous Block Hash前面那个区块的hash地址。32个字节。
</li>
<li>
Merkle Root这个字段可以简单理解为是后面交易信息的hash值后面具体说明一下 。32个字节。
</li>
<li>
Timestamp区块生成的时间。这个时间不能早于前面11个区块的中位时间不能晚于&quot;网络协调时间&quot;——你所连接的所有结点时间的中位数。4个字节。
</li>
<li>
Bits也就是上图中的Difficulty Tagrget表明了当前的hash生成的难度后面会说。4个字节。
</li>
<li>
Nonce一个随机值用于找到满足某个条件的hash值。4字节。
</li>
对这六字段进行hash计算就可以得到本区块的hash值也就是其ID或是地址。其hash方式如下对区块头做两次SHA-256的hash求值
```
SHA-256(SHA-256 (Block Header))
```
当然事情并没有这么简单。比特币对这个hash值是有要求的其要求是那个Bits字段控制的然后你可以调整Nonce这个32位整型的值来找到符合条件的hash值。我们把这个事情叫做“挖矿”在下一篇中我们会详细讲一下这个事
# 关于 Merkle Root
前面说到过可以简单地将Merkle Root理解为交易的hash值。这里我们具体说一下比特币的Merkle Root是怎么计算出来的。
首先我们知道比特币的每一笔交易会有三个字段一个是转出方一个是转入方还有一个是金额。那么我们会对每个交易的这三个字段求hash然后把交易的hash做两两合并再求其hash直到算出最后一个hash值这就是我们的Merkle Root。
我画了一个图展示一下这个过程。
<img src="https://static001.geekbang.org/resource/image/d1/33/d196bfab2e786d055fa321055b7fef33.png" alt="" />
上面的示意图中有四笔交易A和B的hash成了Hash-AB C和D的hash成了Hash-CD然后再做Hash-AB + Hash-CD 的hash得到了Hash-ABCD这就是Merkle Root。整个过程就像一个二叉树一样。
下图是一个区块链的示意图,来自[比特币的白皮书](https://bitcoin.org/bitcoin.pdf)。
<img src="https://static001.geekbang.org/resource/image/62/5b/627b2acd3eef17785c9c7efcaf594a5b.png" alt="" />
为什么要这样做呢为什么不是把所有的交易都放在一起做一次hash呢这不也可以让人无法篡改吗这样做的好处是——我们把交易数据分成了若干个组。就像上面那个二叉树所表示的一样我们可以不断地把这个树分成左边的分支和右边的分支因为它们都被计算过hash值所以可以很快地校验其中的内容有没有被修改过。
这至少带来三个好处。
<li>
大量的交易数据可以被分成各种尺寸的小组,这样有利于我们整合数据和校验数据。
</li>
<li>
这样的开销在存储和内存上并不大,然而我们可以提高校验一组数据的难易程度。
</li>
<li>
在P2P的无中心化网络上我们可以把大量数据拆成一个一个小数据片传输可以提高网络的传输速度。
</li>
最后需要说一下的是以太坊有三个不同的Merkle Root树。因为以太坊要玩智能合约所以需要更多的Merkle Root。
<li>
一个是用来做交易hash的Merkle Root。
</li>
<li>
一个是用来表示状态State的。因为一个智能合同从初始状态走到最终状态需要有若干步也就是若干笔交易每一步都会让合同的状态发生变化所以需要保存合同的状态。
</li>
<li>
还有一个是用来做交易收据的。主要是用来记录一个智能合约中最终发生的交易信息。在StackExchange上的问题&quot;[Relationship between Transaction Trie and Receipts Trie](https://ethereum.stackexchange.com/questions/5888/relationship-between-transaction-trie-and-receipts-trie)&quot;中有相应的说明,你可以前往一看。
</li>
以太坊称其为Merkle Patricia Tree具体细节可参看其[官方的Wiki](https://github.com/ethereum/wiki/wiki/Patricia-Tree))。
# 比特币的交易模型
比特币区块中的交易数据其实也是一个链。为了讲清楚这个链我们需要了解一下比特币交易中的两个术语一个是input一个是output也就是交易的支出方input和收入方output
在比特币中一个交易可以有多个output也就是说我可以把一笔钱汇给多个人但一个output只能对应一个源的input还有一个条件就是output跟input的总数要吻合。
这里举个例子。假设Fred给了Alice 2个比特币Ted给了Alice 3个比特币这个时候Alice有5个比特币。然而大比特币的世界里是没有余额的所以对于Alice来说她只有两个没有花出去的交易一个是2个比特币一个是3个比特币。这在比特币中叫UTXOUnspent Transaction Output
此时如果Alice想要转给Bob 4个比特币她发现自己的两个交易中都不够也不能拆开之前的那两个比特币交易那么她只能把交易2和交易3当成input然后把自己和Bob当成outputBob分得4个她自己分1个。这样的交易才平衡。
<img src="https://static001.geekbang.org/resource/image/6c/41/6c82bd5c0bf3535b49f3dbe271480341.png" alt="" />
于是一笔交易可能会包含大量的Input和Output。因为比特币没有“余额”的概念所以需要通过多个input来凑然后output这边还需要给自己找零给矿工小费。
这样一来在比特币交易中你把钱给了我我又给了张三张三给了李四……就这样传递下去形成了一个交易链。因为还没有花出去所以就成了UTXO而系统计算你有没有钱可以汇出去时只需要查看一下你的UTXO就可以了。
<img src="https://static001.geekbang.org/resource/image/df/4d/dfd5d623ff27a5e6cfb0e5371822354d.png" alt="" /><br />
(图片来源:[https://bitcoin.org/en/developer-guide](https://bitcoin.org/en/developer-guide) )
UTXO因为没有账户和余额的概念所以可以并行进行多笔交易。假如你有多个UTXO你可以进行多笔交易而不需要并行锁。然后其还有匿名性的特征你可以隐藏自己的交易目的地通过设置的多个output而且没有余额意味着是没有状态的。要知道你有多少个比特币只需要把UTXO的交易记录统计一下就可以知道了。但这也让人比较费解而且也不利于应用上的开发。以太坊则使用了余额的方式。
在这篇文章中我先讲述了什么是区块链以及它的核心原理是什么。随后分享了比特币的hash算法以及Merkle Root是如何计算出来的。最后介绍了比特币的交易模型。希望对你有帮助。**这篇文章中图片很多,很难用音频体现出来,所以没有录制音频,还望谅解。**
文末给出了《区块链技术》系列文章的目录,希望你能在这个列表里找到自己感兴趣的内容。
- [区块链的革命性及技术概要](https://time.geekbang.org/column/article/5197)
- [区块链技术细节:哈希算法](https://time.geekbang.org/column/article/5363)
- [区块链技术细节:加密和挖矿](https://time.geekbang.org/column/article/5438)
- [去中心化的共识机制](https://time.geekbang.org/column/article/5612)
- [智能合约](https://time.geekbang.org/column/article/5623)
- [传统金融和虚拟货币](https://time.geekbang.org/column/article/5636)

View File

@@ -0,0 +1,176 @@
<audio id="audio" title="65 | 区块链技术细节:加密和挖矿" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/4e/23/4ead5d0450cec7fd2fee063f08915023.mp3"></audio>
前面一篇文章中提到的技术解决了交易信息不能被篡改的问题。但还有一个比较重要的问题,那就是,我们每个人只能发起和自己有关的交易,也就是能发起自己对别人付钱的交易,我们不能发起别人对我付钱,或是别人向别人付钱的交易。
那么,在比特币中是怎么解决这个问题的?让我们先看一些基础的加密技术。
# 比特币的加密方法
## 密钥对/签名/证书
所谓密钥对,也就是一种非对称加密技术。这种技术,在对信息进行加密和解密时,使用两个不同的密钥。这样一来,我们就可以把其中一个密钥公布出去,称之为公钥,另一个密钥私密地保管好,称之为私钥。
现实社会中,有人使用公钥加密,私钥解密,也有反过来用私钥加密,公钥解密,这得看具体的场景。(比特币使用了非对称加密的技术,其使用了[ECDSA](https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm) 密钥对比技术。)
比如,我把我加密的密钥发布给所有人,然后大家都用这个公钥加密信息,但其他人没有私钥,所以他们解不了密文,只有我能解密文,也只有我能看得懂别人用我的公钥加密后发给我的密文。如下图所示。
<img src="https://static001.geekbang.org/resource/image/ee/71/ee63472f10b0c179a5c3c58d47d9f271.png" alt="" />
但是这会有个问题那就是每个人都有我的公钥别人可以截获Mike发给我的信息然后自己用我的公钥加密一个别的信息伪装成Mike发给我 这样我就被黑了。于是我们需要对Mike的身份进行验证此时就需要用到“数字签名”的概念了。
Mike也有一对密钥对一个公钥给了我私钥自己保留。
<li>
Mike发自己想要的信息做个SHA或MD5的hash得到一个hash串又叫Digest。
</li>
<li>
Mike用自己的私钥把Digest加密得到一段Digest的密文。我们把这个事叫数字签名Signature。
</li>
<li>
然后Mike把他想发给我的信息用我的公钥加密后连同他的数字签名一同发给我。
</li>
<li>
我用我的私钥解密Mike发给我的密文然后用Mike的公钥解密其数字签名得到Digest。然后我用SHA或MD5对解开的密文做Hash。如果结果和Digest一致就说明这个信息是Mike发给我的没有人更改过。
</li>
这个过程如下图所示。
<img src="https://static001.geekbang.org/resource/image/5a/28/5a44ceb1af5a27cc0873cbe4e2571028.png" alt="" />
但是问题还没完。假设有个黑客偷偷地把Jack电脑上的Mike的公钥给换了换成自己的然后截获Mike发出来的信息用自己的密钥加密一段自己的信息以及自己的数字签名。
于是对于Jack来看因为他用了黑客的公钥而不是Mike的那么对他来说他就以为信息来自Mike于是黑客可以用自己的私钥伪装成Mike给Jack通信。反之亦然于是黑客就可以在中间伪装成Jack或Mike来通信这就是中间人攻击。如下图所示。
<img src="https://static001.geekbang.org/resource/image/87/00/876f36ed6a0a617f6356603798f7d700.png" alt="" />
这个时候就比较麻烦了。Mike看到有人在伪造他的公钥想了想他只能和Jack找了个大家都相信的永不作恶的权威的可信机构来认证他的公钥。这个权威机构用自己的私钥把Mike的公钥和其相关信息一起加密生成一个证书。
此时Jack就可以放心地使用这个权威机构的证书了。Mike只需要在发布其信息的时候放上这个权威机构发的数字证书然后Jack用这个权威机构的公钥解密这个证书得到Mike的公钥再用Mike的公钥来验证Mike的数字签名。
<img src="https://static001.geekbang.org/resource/image/bb/57/bb3a47bf0b8c84a6c85d864c88739357.png" alt="" />
上面就是整个密钥对、签名和证书的全部基础细节。比特币也用了这样的基础技术来认证用户的身份的。下面,我们来看看比特币的一些细节。
## 比特币的加密
在比特币的世界里每一笔交易的From和To都是每个用户的公钥Public Key。也就是说使用用户的公钥来做交易的账户。于是这个过程很简单。
<li>
交易的发起方只能是支付方,支付方需要用自己的私钥来加密交易信息并制作相关的交易签名。
</li>
<li>
网络上其他人会用你的公钥(也就是交易的支出方)来做解密来验证。
</li>
为什么不需要那个证书机构呢?不怕中间人攻击吗?这是因为,如果黑客想要伪造一笔别人的交易,那么他需要换掉半数以上结点上的被攻击者的公钥,这不太现实。与其这样做,还不如去偷被攻击者的私钥,可能还简单一些。
下面是一个交易链的图示。这个交易链的钱从A -&gt; B -&gt; C -&gt; D一共3笔交易。
<img src="https://static001.geekbang.org/resource/image/fe/a8/feaaa557eab454dd1678415da7f554a8.png" alt="" />
图片来源:[Ken Shirriff Blog](http://www.righto.com/2014/02/bitcoins-hard-way-using-raw-bitcoin.html)
<li>
**发起交易**。我们从第一笔交易可以看到A用自己的私钥为交易信息和自己的地址生成了交易的签名然后把交易信息、自己的地址、交易签名和自己的公钥放出去这样方便别人来验证的确是A发起的。
</li>
<li>
**验证交易**。在验证时使用A的公钥解密交易签名得到交易的hash值。把交易信息和自己的地址做hash看看是不是和签名解密后的hash值一致。
</li>
这里需要注意一个细节比特币的地址是由我们的公钥生成的生成规则比较复杂可以参看Bitcoin的Wiki页 - [Technical background of version 1 Bitcoin addresses](https://en.bitcoin.it/wiki/Technical_background_of_version_1_Bitcoin_addresses)。
# 比特币的挖矿
前面说到在比特币的区块hash算法中要确保下面这个公式成立
```
SHA-256(SHA-256 (Block Header)) &lt; Target
```
而在区块头中可以完全自由修改的只有一个字段就是Nonce其他的Timestamp可以在特定范围内修改Merkle Root和你需要记录的交易信息有关系所有的矿工可以自由地从待确认交易列表中挑选自己想要的交易打包
所以基本上来说你要找到某个数字让整个hash值小于Target。这个Target是一个数**其决定了我们计算出来的hash值的字符串最前面有几个零**。我们知道hash值本身就是一串相对比较随机的字符串。但是要让这个随机的字符串有规律是一件很困难的事除了使用暴力破解没有其他办法。在计算机世界里我们把这个事叫&quot;哈希碰撞&quot;(hash collision)碰撞前几个位都是0的哈希值。
下面是一个示例。我想找到一个数,其和&quot;ChenHao&quot;加起来被hash后的值前面有5个零。
测试程序如下:
```
import hashlib
data=&quot;ChenHao&quot;
n=1
while n &lt; 2**32:
str = data + `n`
hash = hashlib.sha256(str).hexdigest()
hash = hashlib.sha256(hash).hexdigest()
if hash.startswith('00000'):
print str, hash
break
n = n + 1
```
这是一个暴力破解的算法。这个程序在我的MacBook Pro上基本要10秒钟才跑得出来结果。
找到1192481时找到了第一个解如下所示
```
ChenHao1192481
00000669e0eeb33ee5dbb672d3bd2deb0c32ef9879ef260f0debbdcb80121160
```
那么控制前面有多个0的那个Target又是怎么来的呢是由Bits这个字段控制的也就是难度系数前面需要的0越多难度也就越大。其中的算法你可以看一下Bitcoin的Wiki上的[Difficulty词条](https://en.bitcoin.it/wiki/Difficulty),这里我就不多说了。
**这个难度系数会在每出2016个区块后就调整一次。现在这个难度是要在前面找到有18个零。如下所示(一个真实的区块链的Hash值)**
[000000000000000000424118cc80622cb26c07b69fbe2bdafe57fea7d5f59d68](https://blockchain.info/block/000000000000000000424118cc80622cb26c07b69fbe2bdafe57fea7d5f59d68)
**一个SHA-256算法算出来的哈希值有 $2^{256}$ 种可能性而前面有18个零意味着前面有72个bits是零。于是满足条件的哈希值是有$2^{184}$种可能性,概率是$\frac{1}{2^{72}}$ **
是的很有可能你穷举完Nonce后还找不到那就只能调整Timestamp和Merkle Root调整不同的记账交易了。
所以,一般的挖矿流程如下。
<li>
从网络上取得之前的区块信息。
</li>
<li>
&quot;待记账区&quot;中获取一组交易数据(有优先级,比如成长时间、矿工小费等)。
</li>
<li>
形成区块头计算Merkle Root并设计记账时间Timestamp等
</li>
<li>
开始穷举Nonce来计算区块头的hash值。如果前面有18个零小于Target那么记账成功。如果没有则从第一步重新开始。
</li>
<li>
一旦某矿工成功打包一个区块,他就会告诉其他矿工。收到消息的矿工会停下手上的工作,开始验证,验证通过后,广播给其他矿工。
</li>
所以满足条件的这个难度系数成为了挖矿的关键。设置这个难度系数就是为了让全网产生的区域名平均在10分钟一块。而根据比特币无中心服务器的架构也就是其挖矿的机器数量是想来就来想走就走的计算力可能会不一样。因此为了保证每10分钟产生一个区块当算力不足的时候难度下降当算力充足的时候难度提高。
今天的这18个零基本上来说一般的电脑和服务器就不用想了必须要算力非常非常高的机器才能搞定。所以在今天挖矿这个事已经不是一般老百姓能玩的了。
下图展示了整个比特币的难度历史。
<img src="https://static001.geekbang.org/resource/image/4d/14/4d7e09ee0c03a807c1c5326d0d5c2e14.png" alt="" /><br />
(图片来源:[http://bitcoin.sipa.be](http://bitcoin.sipa.be)
上面这个图只是算力的表现,可能并不直观。我们还是用其耗电量来说可能会更好一些。根据&quot;Bitcoin Energy Consumption Index&quot;统计,截至 2017年11 月 20 日,比特币过去一年挖矿的电力总消耗已累计达 29.51 TWh1TWh = $10^{12}$ Wh约占全球总电力消耗的 0.13%。该数字甚至已经超过近 160 个国家或地区一年的电力消耗,包含冰岛和尼日利亚。若全球的比特币矿工自成一国,该国的电力消耗排名可排到全球第 61 名。
看到这里,你一定要问,为什么要挖矿呢,不就是记个账呗。为了系统地说明这个问题,我们下面来看看去中心化的共识机制。
文末给出了《区块链技术》系列文章的目录,希望这一系列内容对你有启发,有帮助。
- [区块链的革命性及技术概要](https://time.geekbang.org/column/article/5197)
- [区块链技术细节:哈希算法](https://time.geekbang.org/column/article/5363)
- [区块链技术细节:加密和挖矿](https://time.geekbang.org/column/article/5438)
- [去中心化的共识机制](https://time.geekbang.org/column/article/5612)
- [智能合约](https://time.geekbang.org/column/article/5623)
- [传统金融和虚拟货币](https://time.geekbang.org/column/article/5636)

View File

@@ -0,0 +1,243 @@
<audio id="audio" title="66 | 区块链技术细节:去中心化的共识机制" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/87/a2/870fce7a3f16358a8c31dcbb0eadb8a2.mp3"></audio>
其实,去中心化的共识机制也是要解决拜占庭将军问题([The Byzantine Generals Problem](https://web.archive.org/web/20170205142845/http://lamport.azurewebsites.net/pubs/byz.pdf)它是莱斯利·兰伯特Leslie Lamport于1982年提出来的用来解释一致性问题的一个虚构模型。同时它也是分布式领域中最复杂、最严格的容错模型。
# 分布式一致性算法
拜占庭的将军们没有一个中心化的领导机构,所以,如果他们需要攻击某个城市,所有将军需要对任何将军可能提出的攻击时间达成共识。也就是说,只有所有的将军都达成了共识,在同一个攻击时间攻击,就有非常大的胜率。但是,问题来了。这时,可能会有多个将军同时发出不同的攻击计划,而且这些将军中还有叛徒。那么,将军们怎样达成共识呢?
莱斯利·兰伯特证明,当叛变者不超过 1/3时存在有效的算法。不论叛变者如何折腾忠诚的将军们总能达成一致的结果。如果叛变者过多则无法保证一定能达到一致性。
拜占庭问题之所以难解,在于任何时候系统中都可能存在多个提案(因为提案成本很低),并且要完成最终的一致性确认过程十分困难,容易受干扰。但一旦确认,即为最终确认。
比特币的区块链网络在设计时使用的 PoWProof of Work 算法思路。一个是限制一段时间内整个网络中出现提案的个数(增加提案成本),另外一个是放宽对最终一致性确认的需求,约定好大家都确认并沿着已知最长的链进行拓宽。
也就是说,如果比特币系统在某一个时刻同时出现了两个都合法的区块,那么两个都承认。于是,区块链上会出现两个合法的分支(术语叫&quot;分叉&quot;)。此时矿工可以选择任何一个分支继续,在某个分支的长度超过了另一个分支时,短的那个分支马上作废。
如果你看过我之前写的《分布式系统架构的本质》系列文章那么一定知道Paxos协议这也是一种分布式一致性的共识算法。但为什么不用Paxos和Raft来做区块链的一致性算法的协议呢这两个算法对资源的消耗比PoW要小得多呢。
如果你熟悉这几个算法那么你就知道PoW和Paxos/Raft的算法在本质上有下面这些不同。
<li>
对于Paxos/Raft其需要Leader选举而对于比特币或者以太坊这样的无中心化的方式是没有leader的。
</li>
<li>
对于Paxos/Raft加入其网络集群的结点前提假设都是受信的。然而对于比特币/以太坊来说,其前提假设都是不受信的,它们只相信,超过一半的结点所同意的东西。
</li>
<li>
对于Paxos/Raft需要事先对整个集群中的结点数有定义而无中心化的比特币和以太坊中的结点是想来就来想走就走来去自由。如果Paxos/Raft在这样的环境下其会处于一个非常尴尬的境地——要能随时进行伸缩。而且Paxos/Raft并不适合在一个非常大的网络中玩比如上百万的结点
</li>
但是它们有一些是相同的。
<li>
它们都是一致性的算法。
</li>
<li>
对系统的修改总是需要一个人来干区块链用PoW消耗资源让提案变得困难Paxos/Raft用领导选举
</li>
<li>
系统中暂时的不一致是可以被修正的区块链会考虑最长链牺牲了强一致性保证了可用性Paxos/Raft如果没有超过半数的结点在线会停止工作牺牲了可用性保证了强一性
</li>
总之区块链所面对的无中心化的P2P网络要比Paxos/Raft所面对的相对中心式分布式网络要复杂多得多。所以不太可能使用Paxos/Raft协议来替代PoW协议。除非你想干一个相对中心化的区块链然而这就成了区块链的一个悖论了。
无论你是搞区块链还是搞分布式你都需要知道拜占庭容错系统研究中的三个重要理论CAP、FLP 和 DLS。
<li>
CAP理论 - “在网络发生阻断partition你只能选择数据的一致性consistency或可用性availability无法两者兼得”。论点比较直观如果网络因阻断而分隔为二在其中一边我送出一笔交易“将我的十元给A”在另一半我送出另一笔交易“将我的十元给B ”。此时系统要么是a无可用性即这两笔交易至少会有一笔交易不会被接受要么就是b无一致性一半看到的是A多了十元而另一半则看到B多了十元。要注意的是CAP理论和扩展性scalability是无关的在分片sharded或非分片的系统皆适用。
</li>
<li>
[FLP impossibility](http://the-paper-trail.org/blog/a-brief-tour-of-flp-impossibility/)-在异步环境中,如果节点间的网络延迟没有上限,只要有一个恶意节点存在,就没有算法能在有限的时间内达成共识。但值得注意的是, [“Las Vegas” algorithms](https://en.wikipedia.org/wiki/Las_Vegas_algorithm)这个算法又叫撞大运算法其保证结果正确只是在运算时所用资源上进行赌博。一个简单的例子是随机快速排序它的pivot是随机选的但排序结果永远一致在每一轮皆有一定机率达成共识随着时间增加机率会越趋近于1。而这也是许多成功的共识演算法会采用的解决办法。
</li>
<li>
容错的上限-由[DLS论文](http://groups.csail.mit.edu/tds/papers/Lynch/jacm88.pdf)我们可以得到以下结论。
</li>
<li>
在部分同步partially synchronous的网络环境中即网络延迟有一定的上限但我们无法事先知道上限是多少协议可以容忍最多1/3的拜占庭故障Byzantine fault
</li>
<li>
在异步asynchronous网络环境中具确定性质的协议无法容忍任何错误但这篇论文并没有提及 [randomized algorithms](http://link.springer.com/chapter/10.1007%2F978-3-540-77444-0_7) 在这种情况可以容忍最多1/3的拜占庭故障。
</li>
<li>
在同步synchronous网络环境中网络延迟有上限且上限是已知的协议可以容忍100%的拜占庭故障。但当超过1/2的节点为恶意节点时会有一些限制条件。要注意的是我们考虑的是“具认证特性的拜占庭模型authenticated Byzantine而不是“一般的拜占庭模型”。具认证特性指的是将如今已经过大量研究且成本低廉的公私钥加密机制应用在我们的算法中。
</li>
# 工作量证明
比特币的挖矿算法并不是比特币开创的,其原型叫 [Hashcash](https://en.wikipedia.org/wiki/Hashcash)。这个想法最初是由哈佛大学的女计算机科学家辛西娅·德沃克(Cynthia Dwork)、加州伯克立大学的Moni Naor和Eli Ponyatovski于1992年的&quot;[Pricing via Processing or Combatting Junk Mail](http://www.wisdom.weizmann.ac.il/~naor/PAPERS/pvp_abs.html)&quot;论文中提出来的。是的,一开始这个算法是用来限制垃圾邮件的。
简单说来Hashcash一开始要求邮件发送方对邮件头其中包括时间和收件人地址计算一个160bit的SHA-1哈希值。其前面需要有5个零也就是20bit的0。接收端会检查这个事。
为什么要设计成这个样子因为如果我们发垃圾邮件这点算力对于发送方来说没有什么。但对于需要大量发送垃圾邮件的人来说这就是一个很大的成本了。就算是那些控制着用户的僵尸网络的黑客来说发送垃圾邮件时导致CPU使用率过高会马上引起电脑所有者的警觉而且还很容易定位相应的恶意程序。
对于一些受信的邮件服务器我们可以把其放进白名单中这样就不需要它们接受Hashcash挑战它们也不用为之付出成本。
于是这种玩法叫做Proof-of-Work简称为PoW工作量证明。我们用这种消耗对手能源的手段来阻止一些恶意的攻击或是像垃圾邮件这样的对服务的滥用。
PoW有两种协议。
- 一种叫Challenge-Response协议用于Client-Server。如图所示如果Client需要使用服务那么需要被Challenge去花费一些资源。如果证明自己的资源已被花费了则通过认证授权使用。
<img src="https://static001.geekbang.org/resource/image/51/94/51b22e1076f3db3d4e8063f382f09894.png" alt="" /><br />
(图片来源:[Wikipedia](https://en.wikipedia.org/wiki/Proof-of-work_system)
- 另一种叫Solution-Verification协议用于验证使用。Hashcash就是这种协议。下图可以帮助你更形象地理解。
<img src="https://static001.geekbang.org/resource/image/32/e8/32dbf07ce5ef0333333a1cc563b2b2e8.png" alt="" /><br />
(图片来源:[Wikipedia](https://en.wikipedia.org/wiki/Proof-of-work_system)
通过前面的描述可以得知我们需要为用户记录的交易是不能被修改的所以使用hash方法为每个账本做了“签名”还把其不断地打包再hash形成merkle root然后再形成一个串链。于是修改一个地方就会导致所有地方的“签名hash值”都需要跟着一起修改于是形成了复杂度。
然而这样的复杂度对于计算机来说并不高找上一台或是几台主流点的电脑分分钟就破解掉了。因为hash运维这个事对于计算机来说是一件非常高效根本不费事的事。
于是乎我们通过挖矿——PoW这样的协议来大幅度地提高修改成本使得有恶意的人要改一个地方需要花很大很大的成本来修改。这几乎是一件不可能的事情。
因为比特币是去中心化的P2P系统任何人都可以方便地获得所有的数据所以为了防止有恶意的人修改数据使用PoW的&quot;挖矿&quot;机制,可以大幅度提高想要通过修改和攻击这个系统的人的成本。
当然PoW的初衷是通过消耗资源的方式来阻止一些恶意攻击。然而在区块链的去中心化的世界里PoW还有另一个功能那就是让这些不受控制的分布式P2P网络里的结点统一思想。也就是说我们常说的分布式一致性。这对分布式系统中的交易系统来说是一件非常重要的事。
总结一下,工作量证明就是为了下面几件事。
<li>
**提高对数据篡改的成本**。让你修改数据需要付出大量的算力,而区块链的数据相互依赖,导致&quot;一处改处处改&quot;,因此你要完全修改就需要付出大量的算力。
</li>
<li>
**提高网络中有不同声音的成本**。试想,如果一个网络有不同的人给出来了不同的账本,而且都合法,你会信谁的?所以,挖矿可以解决这个事。让你要做一个伪造账本的成本极其地大,而校验账本的成本很小。
</li>
<li>
**解决分歧**。当有不同声音的时候,即区块链出现分叉时,所有的矿工只能选择其中一个分支(因为没人有算力可以同时发出两个不同的声音)。于是,大多数人选择的那个分支就会成为事实,少数人选的那头就被遗忘了。**这让整个去中心化系统的一致性,不再以人数多认可的数据为准,而是以算力多的人认可的数据为准**。
</li>
只要网络越来越大,能掌握半数以上算力的人基本上是不可能的。是这样的吗?我表示怀疑。
PoW解决这种无中心化网络的作弊、分歧这样的问题是目前最有效的其他不用PoW这样的玩法的都存在很大的安全问题。但是现在的PoW也有几个非常严重的问题。
<li>
**越来越中心化地记账**。本来是要大众一起参与去中心化的事现在因为算力的问题因为GPU的出现导致一般人几乎无法参与其中了。
</li>
<li>
**越来越跑不动**。比特币今天的链越来越长,导致要验证数据是否正确的成本越来越高,一般人的电脑基本都快要跑不起来了。
</li>
所以,比特币社区也开始分裂成好几个衍生品,用不同的手段在解决这个问题。但是,目前为止,我没有看到什么比较好的方式。因为这世界上不存在完美的解决方案,你要一头,另一头就没了。
# 股权证明协议
PoW这个机制要找到符合条件的Hash值在目前来看其耗费的电力和时间成本是越来越大了。所以为了每个Block更快的生成出现了PoS Proof of Stake协议中文翻译为股权证明协议。
在PoS机制下矿工不再叫矿工而是叫Validator校验者。假设现在有一个区域需要被生成而现在有4个Validator每一个Validator需要以&quot;交押金&quot;的方式来取得记账权。假如A交的押金占了38%B占25%C点21%D占16%。那么他们按照股权的比权来获得记账权。比如A有38%的概率可以获得记账权不是由系统随机分配还是要算hash值只不过是财富越多的人挖矿的难度越小。而如果你发起恶意攻击的话你的钱就会被系统没收充公。而Validator记账后没有奖金只有手续费。
也就是说在PoS机制下记账权不再像PoW那样由谁的算力大谁就越有机会来记账而是由谁的财富多谁就越有可能来记账。于是记账权按大家财富的比例来分配。
**PoW好像是&quot;多劳多得&quot;的社会而PoS更像是&quot;资本主义&quot;社会,钱越多的人越有话语权。这其实也没有什么不对的。从博弈论的角度上来说,钱越多的人越有动力维护社会的稳定,因为如果社会不稳定了,他是损失最为惨重的人。**
**这里有一个逻辑问题:如果钱越多的人越有动力维护社会稳定,那么,是不是中心化的机构也越有动力维护整个系统的健康度?如果是这样的话,我们为什么要去中心化呢?**更多的逻辑问题会在本文最后提出。)
在以太坊下是根据拥有以太币的总量来决定成为Validator的机率。
PoS宣称至少有如下的几个好处。
<li>
第一个好处很明显。不需要那么费劲的挖矿了。那样浪费电力不环保地挖矿的确有点太糟糕了。PoS很明显地解决了这个问题。
</li>
<li>
在P2P这种无中心化的网络下如果你要控制整个网络就需要超过半数以上的能力。在PoW下你需要51%的算力。在今天这会是一个非常大的成本。但是我们看一下下面的全球比特币的算力图我们发现只要前四家公司联合起来作弊就可以完成对比特币的攻击据说中国有60%左右的算力看来只要中国政府愿意要拿下比特币也不是什么难事呵呵。而在PoS下你需要有51%的财富你才可以发起攻击这相对于算力而言需要更多的成本。设想一下你得拥有51%的比特币你才能黑了比特币然而如果你有51%的财富,你为什么要黑了这个系统,自己把自己干死呢?这就是博弈论。
</li>
<img src="https://static001.geekbang.org/resource/image/8a/c2/8afccadcf03aa96e2371726b4dc5f3c2.png" alt="" /><br />
(图片来自:[http://qukuai.com/pools](http://qukuai.com/pools)
# PoS机制潜在的问题
世界上没有免费的午餐也没有绝对完美的事所以PoS也有其潜在的问题。最明显的一个问题就是当不需要太多算力的时候如果账本出现分叉的情况也就是系统出现两个冲突且合法的区块的时候在比特币这种算力密集的PoW机制下所有的矿工必需赌其中一个分支往下走。
因为算力的问题所以基本上来说不太可能同时在两个分支上发展。而其中一个分支如果长于另一个分支较短的那个分支就会被孤立出去其上的账本就都不作数了而矿工的奖励也没有了。这是PoW机制的好处。
而在PoS这种不需要算力的机制下就可以让记账人们在两个分支上同时进行以争取实现利益的最大化无论哪个分支最终胜出我都可以有利。这样一来攻击者就可以利用这种情况来发起Nothin-At-Stake攻击。
也就是说如果绝大多数人都在发展两个分支假设有99%的人发展A分支99%的人也同时发展B分支而有1%股份的人在分支A中写一笔交易然后在B分支没有这笔交易当其在A分支上达成合约后比如收到商品加入B分支然后B分支胜出导致其没有交易。
另外两个分支发展还可以发起双重支付。就是说Bob把他的10元钱借给了Alice也给了Marry在不同的分支上。这就是所谓的&quot;双重支付&quot;问题Double Spend Problem
在CAP理论中如果出现网络分区的情况Partition你要么选择数据的一致性Consistency,那么你就得让整个系统不可用Availability要么选择系统的可用性Availability那么你就得牺牲数据的一致性Consistency。所以在无中心化下我们通过分叉来牺牲数据的一致性于是在一个分叉上Bob把10元给了Alice另一个分叉上Bob把10元给了Marry。
甚至可以发起&quot;贿赂攻击Bribe Attack&quot;,攻击者可以在一个分支上声称购买了某个商品。然后,收到货后,以提高手续费的方式只养另一个没有购买这个商品交易的分支,然后把没有这个交易的链养得足够长,长到系统最终选择了没有交易的这条链。
在PoW机制下这种&quot;分叉攻击&quot;的玩法基本上来说不可能但在PoS的玩法下这种攻击就很有可能。在以太坊下如果发现有人玩同时养分叉的玩法就会予以惩罚。然而如果这个攻击者有多个账户呢我用多个马甲来玩不同的分叉……
另外PoS这种通过财富的占比来决定记账概率的玩法可以让结点进行预计算也就是可以计算下一个的hash值这样一来相当于我可以偷偷养分叉。
看来PoS的问题也很多所以有人又提出来了一个进化版叫DPoSDelegated Proof of Stake委托股权证明。它是 PoS 的进化方案。
以太坊的官方Wiki上有一份[Proof-of-Stake的FAQ](https://github.com/ethereum/wiki/blob/master/%5B%E4%B8%AD%E6%96%87%5D-%E6%AC%8A%E7%9B%8A%E8%AD%89%E6%98%8E%E6%A9%9F%E5%88%B6FAQ.md) 你可以前往一读。
# DPoS机制
在常规PoW和PoS中一大影响效率之处在于任何一个新加入的区块都需要被整个网络所有节点做确认。DPoS优化方案在于通过不同的策略不定时地选中一小群节点这一小群节点做新区块的创建、验证、签名和相互监督。这样就大幅度减少了区块创建和确认所需要消耗的时间和算力成本。
这就像选举人团代议制度和美国选总统一样。DPoS下每个token都是选票大家票选20个选举人团+1个随机选举人=21个选举人代表网络。然后每隔一段时间在这21个人中挑选一个出来维护账本并获得收益。
近日推崇DPoS的EOS开始了其21个超级节点的选举。作为超级节点他们将获得 EOS 每年增发 5% 的收益中的大部分,大约每一个节点每年可以获得 238 万个 EOS的收益按照当前价格EOS/RMB ¥34一个节点每年可以分到 1 亿元人民币的奖励。
注明一下EOS是以准备颠覆以及坊以及整个区块链生态的姿态打着提高交易吞吐量到百万级TPS的技术口号的进入这个世界的本文成稿时EOS还没有正式发布相关细节你可以看看 [EOS白皮书的中文版翻译](https://www.jianshu.com/p/f65bf7691482) 。)
比较有趣的是在这次超级节点的竞选上主要竞选节点来自中国、美国和韩国。这三方的优势是韩国人拥有最大的EOS交易量而中国人拥有更多的EOS之外的资本而美国人则有规则制定权。看起来就是美国有政治权力韩国有经济权力中国这边有外围经济权。看上去是比较完美的制衡就像三国演义一样。
为了赢得选举中国竞选人开始进行了我们熟悉的套路——贿选。所谓贿选就是指将上文提到的当选超级节点后每年应分得的「巨额工资」返还给每一位投自己票的人。通过这样的贿选就可以破坏上述看起来比较制衡的政治局面。这样搞下去很有可能那21超级个节点就会成为一家公司所控制。
所以很快创始人BMDan Larimer就现身表示不支持节点对投票人实行分红的做法。然后Thomas Cox 也在社区内发帖《为什么付费投票是坏的》来谴责贿选,并在开始陆续发布 EOS.IO 的 0.1 版本「宪法」的第一条款《不说谎》…… (相关的报道可参看《[EOS超级节点投票「千亿」利润下的币圈国家战争](https://mp.weixin.qq.com/s/qtbyvpcEmN06V_p-QtCJ7A)》。)
顺便八卦一下EOS创建人BM在2014年的时候创建比特股时打出超级比特币的概念然后因为Bug大多体验非常地差后面他和公司不合离开了比特股。2016年他创建了社交平台Steemit想颠覆传统媒体结果也失败了并于2017年创建EOS瞄准以太坊想做区块链接基础设施包括并行运算、数据库、账户系统等等。老实说我觉得这个对他来说更难。
在我看来,有两点让这区块链这个技术开始有些变味了。
<li>
DPoS已经开始把区块链的去中心化的初衷开始向中心化的地方演进了。
</li>
<li>
政治在未来区块链的世界里是一个必不可少的技能这意味着不可控的复杂性。我感觉这些技术宅是一定Hold不住的。
</li>
# 小结
对我来说目前为止PoW还是一个比较稳健的共识方式PoS/DPoS还需要更多的实践和改进当然也许混合PoW和PoS/DPoS也不错呢。&quot;去中心化&quot;&quot;高吞吐&quot;这两个事,我觉得是很难协调的。
总结一下。
<li>
PoW就是蛮荒社会。谁的拳头大谁说话。是真正意义上的无政府的去中心化的社会。
</li>
<li>
PoS就是资本主义社会。谁的钱多谁说话还是无政府的社会但是资本家控制的。
</li>
<li>
DPoS就是政治主义社会。谁的选票多谁说话我也不知道怎么个选举竞选活动吗有电视辩论吗还是投票玩玩但是感觉又回到了中心化架构中的Leader选举。
</li>
无论怎么样,人类社会进化的影子在去中心化的社会中又开始出现了。那么,另一个逻辑问题来了,如果这种&quot;去中心化的社会&quot;本质上是在重复一遍&quot;中心化&quot;的演进过程,那么,还有什么意义?
上面的这个逻辑问题我们留到最后,这里还是看一下技术方面的事儿。
我们都知道分布式系统的CAP原则在一致性、可用性和分区容忍性上只能三选两。在区块链的P2P网络下也是很类似的在去中心化、安全和高性能中我们也只能选两个。
<img src="https://static001.geekbang.org/resource/image/62/58/62b1abfbc89d368f72a80d4eda935b58.png" alt="" />
<li>
如果我们想要一个既安全性能也很高的系统那么得放弃去中心化的架构如DPoS这样的中心化系统直接放弃区块链走传统的中心化架构。
</li>
<li>
如果我们想要一个去中心化和安全的系统,主要去挖矿,那么放弃高性能。这就是目前的比特币架构。
</li>
<li>
如果我们想要一个去中心化和高性能的系统,那么就得放弃安全。没有安全的系统,基本上来说是不会有人用的。
</li>
文末给出了《区块链技术》系列文章的目录,希望你能在这个列表里找到自己感兴趣的内容。
- [区块链的革命性及技术概要](https://time.geekbang.org/column/article/5197)
- [区块链技术细节:哈希算法](https://time.geekbang.org/column/article/5363)
- [区块链技术细节:加密和挖矿](https://time.geekbang.org/column/article/5438)
- [去中心化的共识机制](https://time.geekbang.org/column/article/5612)
- [智能合约](https://time.geekbang.org/column/article/5623)
- [传统金融和虚拟货币](https://time.geekbang.org/column/article/5636)

View File

@@ -0,0 +1,188 @@
<audio id="audio" title="67 | 区块链技术细节:智能合约" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/eb/9c/ebb5748624658d23bb4a419f26c4a09c.mp3"></audio>
要讲清楚智能合约我先给你看几个案例。第一个案例是打赌。比如张三和李四打赌周末拜仁和皇马的足球比赛谁会赢。如果拜仁赢了张三给李四100元如果反过来李四给张三100元如果打成平局则不赢不输。
张三和李四都怕对方不认账所以他们需要找一个他们都信得过的人来做公证两人都把100元钱给这个公证人。然后如果拜仁赢了公证人把全部200元给李四如果皇马赢了则全部给张三如果是平局则分别退还100元。
<img src="https://static001.geekbang.org/resource/image/b0/bb/b0370516ca22b23fc6c1fe47e90c80bb.png" alt="" />
上面这个模型什么都好就是有一个问题这个“公证人”跑路了怎么办因为他们只赌100元公证人犯不着为了200元跑路。但是如果有一万人把赌金交给公证人呢如果张三李四赌金是100万呢公证人的人性会受到极大的挑战他还有那么可信吗
# 银行的资金托管业务
也就是说,当业务大到一定程度的时候,个人的信用是不足以来当中间公证人这个角色了。这时,你要找更为靠谱的机构,这个机构叫银行,银行的信用等级至少在这几方面上要比个人高。
<li>
银行是机构,所以受政府监管,受法律约束;
</li>
<li>
银行的钱很多,就算是里面有员工作案,银行也赔得起;
</li>
<li>
银行里有比较安全的资金管理流程和措施;
</li>
因此,银行的受信程度很高,可以来做担保。
下面,我们来看一个示例,银行在二手房交易中的“资金托管”业务。因为房屋交易时涉及到的资金数目太大,买家怕交了钱后,卖家不过户,卖家也怕过了户后,买家不给钱。而一般像“链家”或是“我爱我家”这样的房屋中介是没有能力来做大额交易的担保的(政府也不会让它们来做)。
于是银行就出来了。买家先到银行开个户把购房款全额存进去。这个账户和一般的账户不一样这叫资金托管账户钱一旦进入后你就取不出来了除非满足了某个条件。在开户时房屋的买卖方和银行三方约定一旦房产证从卖家过户到买家30天后没有纠纷钱就划给卖家了。
<img src="https://static001.geekbang.org/resource/image/cf/95/cf2c80beb5379a37fe5d15bb99caa095.png" alt="" />
这其实跟在淘宝上买东西差不多,买家把钱转给支付宝,然后买家确认收到货后,在支付宝上点确认,钱就划给商家了。唯一不一样的是,支付宝没有资格担保像房屋交易这么大的交易金额。这是国家为了防范相关的金融风险所采取的措施。
# 以太坊的智能合约
对于以太坊来说智能合约其实就是一段可执行的程序片段由发布人使用一种类似于JavaScript或是Python的编程语言来编写。就像最开始那个民间担保的案例一样合同的发布可以写成如下形式
```
Contract MyContract{
    function transferFrom(  address _from, address _to, uint256 _value) {
        if ( isBayernWin ) {
            blanceOf[_from] +=  _value
            blanceOf[_to] -= value
        }else if ( isRealMadridWin ) {
            blanceOf[_from] -= _value
            blanceOf[_to] += value
        }
    }
}
```
嗯,合同都要用代码来写了。看来,我们程序员离统治世界又近了一步。
我们把合约代码在本地编译成功后发布到区块链上,可以理解为一个特殊的交易(包括可执行代码),然后会被矿工打包记录在某一个区块中。当需要调用这个智能合约的方法时,只需要向这个智能合约的地址发送一笔交易即可。
每个节点的电脑都需要安装以太坊客户端客户端自带了一个和JVM类似的一个EVM。通过交易触发智能合约后智能合约的代码就会在EVM中执行了。这种方式相当于把程序部署到了非常非常多的电脑上随时都可以通过交易来触发这些智能合约的执行也从而完成了分布式程序的部署和调用。
<img src="https://static001.geekbang.org/resource/image/f0/cb/f000316a917d59fffd8a067b4201b0cb.png" alt="" />
这感觉就是Funciton-as-a-Service的一种实现啊。
如果人与人之间的交易条件(合约)就像代码一样被严格地执行,你觉得这个世界会变成什么样呢?是不是会少一些无赖,少一些扯皮,多了很多效率,多了很多确定性呢?
# 有银行担保的国际业务
我们再来看一个国际贸易的流程。
假如中国某出口商和美国一个进口方做生意,会遇到货币不一样的问题。如果没有货币兑换,那就只有通过大家都认可的黄金交易了。你给我发一船货,我给你发一船黄金,风险也高,交易的效率非常低下。
如果有银行在中间协调,比如中国的某个银行和美国的某个银行签了互信协议,那么国际贸易的银行担保流程如下。下面是描述这一过程的图片。
<img src="https://static001.geekbang.org/resource/image/9d/59/9d19c5e890bafa85f8704b002bd79759.png" alt="" />
<li>
首先,出口商和进口商签订买卖合同。
</li>
<li>
然后美国的进口方到美国银行那边申请信用证信用证需要用钱来开的也是有价格属性的比如200万美金的信用证就需要用200万美金来申请
</li>
<li>
美国的银行向中国银行开具信用证中国银行根本不关心进口方有没有把钱给了美国银行反正你开了200万美金面额的信用证我以后要问你要钱的。
</li>
<li>
中国银行收到信用证后,给出口商发出通知信用证,告之可以发货。
</li>
<li>
出口商发货,由相关承运人从中国把货运到美国。
</li>
<li>
然后,中国出口商把提货单交给中国的银行。
</li>
<li>
中国的银行向美国银行发出“寄单索汇”业务。
</li>
<li>
美国银行收到提货单后,通知进口方到单。
</li>
<li>
进口方把货款的钱补完比如补300万美金“赎回”提货单。
</li>
<li>
然后美国银行向中国银行付款。
</li>
<li>
美国进口方到承运人提货。
</li>
看看,这个过程如此复杂,而且很机械,感觉完全可以用程序来实现。如果用以太坊的智能合约来写一下,这段代码会写成什么样呢?
好像可以写得很简单。
<li>
进口方把钱垫到区块链上。
</li>
<li>
出口方发货方发货。
</li>
<li>
进口方验货后,钱就到了出口方。
</li>
当然,这也需要写在程序中。
<li>
一个是进口方的钱垫到区块链上,就需要被冻结掉。
</li>
<li>
另外还需要物流信息,不然,进口方说没有收到,不好验证。但物流信息要是造假怎么办?
</li>
<li>
另一个是需要把进口方验货的标准给写进来。代码不知道条件怎么满足,也许需要进口方那边点个确认。如果不点确认,则有个过期时间,时间一到就自动确认。
</li>
<li>
另外,如果进口方觉得有问题,需要退货,或是需要重新议价,那么需要相关的关联合同。
</li>
其中比较难办的是第2步需要其他方也进入区块链。如果不进来这事就不好玩了。但是物流信息怎么才能做到真实可靠的呢这需要双方选择一个都相信的中心化的物流公司还是我们搞一个去中心化的物流公司去中心化的物流公司是个什么形态你能想象得出来吗我想象不出来。
# 合同的Bug
另外我们要小心智能合同。有程序的地方就会有Bug现实生活中会有Bug合同也会有Bug。出现了Bug后大家可以相互协商给合同打补丁附加条款或是重新签合同。然而代码合同则不一样Bug也会被残酷无情地执行一旦执行就很难补救了。
最著名的例子就是以太坊一个叫The DAO的应用它是一个去中心化的风险投资基金以智能合约的形式运行在以太坊区块链上。它也是一个盈利性的去中心化自治组织它将利用自己掌控的以太币资金通过投资以太坊上的应用为其成员创造价值。在The DAO创建期任何人都可以向它的众筹合约发送以太币获得DAO代币。
因为 The DAO这个程序写得不好黑客在其智能合约里找到Bug把所有的钱给调走了大约7000多万美刀。这成为有史以来最大宗的数字劫案而且FBI也找不到人。这个项目因为钱被偷走而倒闭以后引起了以太坊的强行分叉变成ETH和ETC。关于技术细节可参见其 [漏洞分析文章](http://www.8btc.com/thedao-expolit-analysis),整个事件的始末可以参见《[彭博社深度还原The DAO 大劫案始末](https://www.leiphone.com/news/201706/JnNEqj90inEWLTJD.html)》。
还有一个案例是2017年发生的智能钱包多签名钱包Parity被盗事件。它号称自己的智能合约被很多很厉害的安全人员都审查过都认为没问题。但最后还是被黑客利用了一个叫做initwallet的函数反复调用它转走了3000万美金。
老实说我觉得任何合同都是会有Bug的无论是在现实生活中还是在代码中。唯一的不同是现实生活中的合同出现Bug可以自行协商解决也可以通过法律或仲裁的方式解决。然而在数字社会中代码无论好坏都会被计算机残酷无情地严格执行。
有时候当你是利益方时你会觉得是好事。但有时候你是受害方时你还是会想有挽回的余地。现实生活中可以做到但我不知道代码世界中的合同如何解决这些Bug所以还是不要叫“智能合约”至少现在还不是。
文末给出了《区块链技术》系列文章的目录,希望你能在这个列表里找到自己感兴趣的内容。
<li>
[区块链的革命性及技术概要](https://time.geekbang.org/column/article/5197)
</li>
<li>
[区块链技术细节:哈希算法](https://time.geekbang.org/column/article/5363)
</li>
<li>
[区块链技术细节:加密和挖矿](https://time.geekbang.org/column/article/5438)
</li>
<li>
[去中心化的共识机制](https://time.geekbang.org/column/article/5612)
</li>
<li>
[智能合约](https://time.geekbang.org/column/article/5623)
</li>
<li>
[传统金融和虚拟货币](https://time.geekbang.org/column/article/5636)
</li>

View File

@@ -0,0 +1,200 @@
<audio id="audio" title="68 | 区块链技术 - 传统金融和虚拟货币" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/c8/ca/c8ce7e1e74280849874a38a0347df0ca.mp3"></audio>
前面我们讲了银行的资金托管业务以及国际贸易业务。我讲这些东西,主要想讲什么呢?
# 金融的本质
我想讲金融的本质。我个人认为金融行业最大的本质就是——**促进交易完成,实现价值提升!** 也就是说,如果整个社会的交易能够更快更高效更安全地完成,那么我们这个社会就会有更好的运作效率,更低的成本,更多的价值。这对于促进整个社会的经济发展是相当关键的。
所以,为了保证交易完成,金融行业需要解决下面几个问题。
<li>
** 交易中的信用问题**。所以,银行会来做中间人来担保。
</li>
<li>
**交易中资金不足的问题**。通过借贷来让交易完成。
</li>
<li>
**交易中大额的问题**。把一个大额的金融事件以股份的方式拆碎进行大众投资。
</li>
总之,金融行业就是要促进社会的交易,使得这个社会的交易越来越活跃,从而可以产生更多的价值。那么,这个社会的经济就会越来越健康。
下图给出了金融行业的四个重要属性。
<img src="https://static001.geekbang.org/resource/image/45/5b/45e8771c87d5c759147415cf2b03a65b.png" alt="" />
<li>
**效率提升**:加快货币、股票、债券的流通性,快速地促成交易。
</li>
<li>
**价值提升**:通过金融产品的流通性,让实际价值得到充分的体现,并升值。
</li>
<li>
**激励机制**:为实体经济添砖加瓦,并激励社会持续付出和成长。
</li>
<li>
**信用评级**:建立信用社会、评估信用等级,从而改善社会。
</li>
是不是有银行做担保,有这些金融机构我们就可以高枕无忧了?不是的,我在前面说过,主要是钱不够多,只要钱多到一定数量的时候,什么事都可能发生。因为逐利是人性中非常疯狂的一个特征。只要有利益,人们就会想要更多的利益。这有时候并不是一件好事。
# 经济运作的原理
说到这里,我想先说一下经济是什么。对于经济来说,说白了就是整个社会的交易。每个交易中,对于买方,其需要付出的是货币和信用,对于卖方,其需要支付的是商品、服务或金融资产。而支出方是整个经济的驱动力。也就是说,一个社会的最基本的经济活动是交易,而经济状况的好坏是受支出方影响的。
所以,一个市场的好坏,和支出方有很大关系。在整个社会运作的过程中,需要有一个“贷款机构”。这些机构把钱贷给想要花钱且有偿还能力的人,然后这会增加整个社会的支出。于是,你的支出成为了别人的收入,别人的收入多了,也会增加他的支出,而如果支出越来越多,某些人的收入就越来越多。
于是这些人的钱花不完,他们就会开始想用钱来生钱。于是就有更多的人借钱给别人。也就是我们所说的投资,而这又增加了更多的支出 。于是,整人社会就运作起来了。所以说,支出是经济的原动力。
我们知道,经济的价值是可能通过提高“生产率”来提高的。然而,生产率并不是很容易能提高的,这是一个长期的过程。而通过“借贷”我们可以短期地提高经济价值,在借贷发生时,消费超过产出,在还贷时,消费低于产出。
所以,整个人类世界的影响经济波动的东西就是“借贷”,也就是为了购买现在买不起的东西,向未来的自己去借钱,或是由未来的自己去还债。这种未来消费的方式并不一定是坏事。如果能还了,就是良性,如果还不了,那就成了恶性的。
另外,还有一个问题,**如果整个社会的支出变多,那就会出现一片繁荣的情况。大多数人都是目光短浅的,他们可能会觉得经济形势很好,于是就出现更多的借贷。人们觉得挣钱好容易,于是就借钱来买其他金融产品,导致金融产品上涨,紧接着进一步导致大家觉得应该花更多的钱来投资,那样就会借更多的钱……这样一来,就会出现巨大的泡沫……**
关于这个,你可以看一下网易公开课的《[经济机器是怎样运行的](https://open.163.com/movie/2016/6/I/Q/MBPO9ED98_MBPO9S8IQ.html)》。
# 2008年的次贷危机
2008年爆发的全球金融次贷危机算是银行玩出来的事儿。自2003年来美国人的房价就在不停地上涨而买房贷款的那些人基本上来说都有比较稳定的工作来支撑他们偿还房贷。于是这些人的信用记录导致房贷成为了比较好的金融产品。
美国房地产贷款系统里面分为三类:优质贷款市场、次优级贷款市场、次级贷款市场。美国把消费者的信用等级分为优级、次优级和次级。
那些能够按时付款的消费者的信用级别被定为优级那些不能按时付款的消费者的信用级别被定为次级。次级贷款市场就是面向那些收入信誉程度不高的客户其贷款利率通常比一般抵押贷款高出2%3%。尽管美国次级贷款市场所占美国整体房贷市场比重并不大大约占7%8%,但其利润最高,风险最大。
想一想,如果供房人能还款,那是优质贷款,如果不能还了,把房子收回来,也可以卖个高价。毕竟房价一直在涨呢。
贪婪的资本家们觉得既然房贷的回报如此优秀为什么不把这些当成债权出售。嗯债权转让虽然可以让资金快速回来但是挣得不够多。于是贪婪的银行家们决定把这些房贷打包形成一个优质的金融产品然后在二级市场上发行IPO让更多的人来投资和炒作这样就可以挣到一大笔钱。
的确,只要供房人按时供房,这个金融产品就没有问题,所以,房贷打包的二级市场也非常不错。于是,再继续衍生更多的金融产品,各种“杠杆”,然后再加上保险公司为其保险。全世界都疯了。
银行开始乱放贷款,把贷款放给好多根本没有能力还款的人,并且相信房价将继续升值的前提下,鼓励了许多次级贷款借款人去取得浮动利率抵押贷款。这些抵押贷款以在预先确定的期限间低于市场利率引诱借款人,期限过后剩下的则是以市场利率计算。
而美国最权威的评级机构也还错误地把风险比较高的金融产品评成最优质的级别。这样在二级甚至三级市场上套更多的人进入。
最终,最底层的越来越多的人不还贷款了,越来越多的房子被拍卖。一方面导致房价下跌,另一方面,导致银行坏账,最终,像多米诺骨牌一样倒了一片……
然而因为这事玩得太大了于是美国政府拿出了7000亿美金来救那些贪婪的银行而一些投资机构就此破产还对国内的经济造成了巨大的打击……
# 金融的监管
上面我们可以看到金融行业非常积极的本质和作用也能看到其带来的副作用。金融行业发展成百上千年了今天我们仍然存在着很多问题。就像上面说的2008年金融危机一样银行业过于快速地促成交易加快货币、股票、债券的流通性导致了各种“杠杆”以及“多杠杆”的出现。
当整个社会为之疯狂的时候,信用评级、风险控制都被抛到脑后了,最终出现投资大大超过和实际价值完全不等价的局面。实际价值无法支撑投资时,风险发生时,整个世界就会出现连锁反应,一发不可收拾。
对于经济活动,这两件事需要平衡,一个是“资”,一个是“债”。如果不平衡了,风险就出现了。无论是对于我们个人,还是对于企业,或是银行,都是一样的。但总是会有人冲昏头脑的,尤其是有财务窟窿或者巨大利诱的时候,所以,才会有监管机构来审查这些金融机构的资和债的风险,并制定相关的政策和条例。
而有时候,监管机构又管得过死,导致经济不能充分发展。于是造成了我们经常听到的“不管就乱,一管就死”的局面。所以,很多时候,政府或央行会通过调节货币利率,以及发行更多货币等手段来引导或调整市场,控制风险 。
于是,出现了各种经济学,比如,主张政府强干预的凯恩斯经济学,以及马克思主义的政治经济学均表示出了对市场经济没有信心,需要用政治干预手段。还有亚当·斯密的以市场为主导的经济学等。
可能这个问题怎么讨论也讨论不清楚。我个人比较认可的是,经济还是需要自由的,而政府应该控制的是风险和保证经济实体的产权。只有自由的市场经济才会回归金融的本质,促进交易提升,激励大众提升价值。而政府的风控措施可以对整体金融风险进行调节,这是市场经济不能完成的。政府还要保护私人产权,这对于经济活动是非常重要的,产权保护是经济活动的根本基础。
# 虚拟货币
首先,如果虚拟货币想要有货币的特征,那么就需要保持稳定。这个稳定不仅仅只是不增发(在你看过上述的经济活动的原理,你知道增发货币并不一定是个坏事),其价值最好是稳定的,因为它要代表某种经济体的稳定性。这就好像美金、欧元、英镑,要比非洲某些国家的货币更硬一些。然而,目前的虚拟货币没有一个经济体为其背书,所以远远达不到货币的功能。
于是,虚拟货币开始变成和股票一样。股票是需要后面实体公司经营情况来背书的,所以流通性比较好的股票,一般来说需要透明公开公司的经营情况,并会受到行情和政策的影响。然而虚拟货币的交易所市场完全在售卖概念,到目前为止还没有一个真正成功的,能够有颠覆性的项目。然而,其靠发布白皮书就可以变成一个几十亿规模的公司。
当然,现在区块链里的经济,是靠二级市场撑着。所以,就像前面说的那个经济规律一样,只要有不停地支出,就会造就一种繁荣的景象。这种繁荣的景象,对于绝大多数不明真相的人来说是很容易让他们心动的,因为人性是想不劳而获且趋利避害的。于是就会引发更多的人进入,于是形成更大的繁荣。
但是,这种后台没有价值体现的玩法,总有一天会达到瓶颈的——就是支出不再能够维持下去的时候。也就是没有新人入场的时候,老人因为钱投进去了,也不会再有更多的钱投入的时候。那个时候就是泡沫破灭的时候。
我在这里讲了这些东西,我想说,就算是虚拟货币,数字货币,其本质也是一样的。如果不能提高效率,降低成本,没有风控和评级,这样完全自由地发展,我认为风险是非常大的。说白了,这就是一个高级赌场罢了,人类历史上已经有过无数这样的案例了……
# 虚拟货币的其它问题
## 比特币的几个问题
我们先来看几个比特币的问题,了解了这些问题后,我们才能独立思考后面的几个逻辑问题。
<li>
**交易成本上升**。由于工作量证明需要消耗大量的算力,同时比特币大约 10分钟才会产生一个区块区块的大小只有 1MB仅仅能够包含三四千笔交易平均下来每秒只能够处理 5~7个位数笔交易所以比特币网络的拥堵状况非常严重。有时候一笔交易确认的小费已经很高了并不见得比银行便宜另一方面确认时间很长在拥塞的时候需要好几天。
</li>
<li>
**个人无法参与**。一条链已经非常长了,所以个人电脑已经跑不动了。也就是说,如果你想玩比特币,你电脑的算力都很难校验账本了。另外,记账的人也越来越趋于巨大的大公司。本来是一个全民参与的去中心化的事儿,而现在成了大众无法参与的事了。那么,这还是去中心化吗?
</li>
<li>
**社区的利益纷争**。上述两个比特币的技术问题必须急待解决比特币才能玩下去不然也就是这一两年比特币也就快玩完了。所以社区内也很迫切地想解决这两个技术问题。然而自从中本聪把所有的工作交给比特币的核心团队core team并消失之后比特币社区中就这些技术问题如何解决核心团队和矿工的谈判就没有谈好过。你可以看到其中的利益纷争和中心化的组织结构没什么两样。具体你可以参看这篇文章《[金融史上的神奇怪胎:比特币扩容大战的前世今生](https://mp.weixin.qq.com/s/WfOL1IfEFfa-7zBwNuy76Q) 》)。
</li>
作为标杆数字货币,比特币姑且这样,何况其他数据货币呢?但是你要解决这个问题,就会像前面那样所说的那样,你就需要适当去中心化了。
## 几个功能的问题
我认为,下面这几个问题如果不解决好,同样虚拟货币也是有很大风险的。
<li>
**交易时的身份验证**。银行对于网上交易的验权是相当复杂的,不同的金额会有不同的验证。而虚拟代币只关心私钥,而不关心是不是这个人。
</li>
<li>
**资金归属权保护**。对于银行如果我的卡丢了密码丢了U盾丢了我可以申请冻结账户并能通过到银行柜面把我的财产声明回来。虚拟代币如果你的密码和私钥丢了那就真的丢了。
</li>
<li>
**损失赔偿问题**。我有个表妹在英国生活有次在ATM机上取款时突然接了一个公司打来的电话说有急事需要处理于是忘了取卡就走了。被后面的人取了2000英镑。后面发现了报了警银行方面向警方确认后把失窃的钱全部赔给了我的表妹。
</li>
也许,第一个问题还好解决,第二个问题,我觉得在区块链上是没有解的,而想解决第三个问题,我认为需要一整套的社会运行机制,区块链这个技术更显得无能为力。
## 几个逻辑问题
最后,我们再来思考几个逻辑问题。
<li>
**技术驾驭能力**。这种去中心化的技术难题并不是什么人都能Hold一方面是结点是不可信任的假设另一方面其中有太多的政治上的博弈问题不是技术能解的。所以那些说用区块链来解决各种业务问题并颠覆现有大公司的人或公司我觉得他们无论是在业务上还是技术上的水分都很大更别说颠覆了。思考问题这是不是一个概念炒作远远大于实际能力的乌托邦
</li>
<li>
**比特币颠覆了什么?** 有人说:“比特币本来应该要证明一个真正的自由市场力量,结果却充满了诈骗者、投机者和小偷,而且对真实世界的交易没有帮助,还消耗了这么多的社会资源”。本来,中本聪想通过比特币来建立一个可以避开政府、银行家和企业的支付系统,从而避免通货膨胀或金融腐败。但相反的是,比特币现在是一堆快速膨胀的投机泡沫,其创造了另一个和传统世界一样的金融体系。思考问题:数字货币是在颠覆现有的传统金融体系,还是建立另外一个一模一样,但充满更多泡沫和投机的体系?
</li>
<li>
**是否消除了中间商?** 如今比特币已有各种不同类型的中间商,像是能帮用户把零碎比特币存储成账户的钱包服务等。这些中间商的存在却也破坏了比特币的隐私特性,像 Coinbase 这种中间商就会搜集跟用户有关的大量信息。这并不能怪罪中间商的贪婪,而是因为比特币本身的设计让交易变得非常复杂。对非技术背景的使用者来说,如果没有中间商或应用程序简化,使用比特币还是不太便利。思考问题:比特币的原意是建立一种无需银行和中间商,不会有交易费用的交易系统,但现在比特币的进展却反过来复制了原本想破坏的体系。
</li>
<li>
**大公司参与的区块链?** 看到像投资银行高盛或是中介机构蚂蚁金融这样的公司参与到区块链这个事来?你有没有觉得,有点奇怪?我还看到有些人评论道:“区块链就是需要大公司来参与”。看到这,我不知道中本聪会怎么想?反正我感觉有很强烈的喜感。思考问题:区块链本质上是要颠覆这些银行和中间商的,代表了先进的生产关系,而这些传统的落后的生产力来玩这个事,是不是有点像,我造了一列火车,而要用这些马车来拉……
</li>
<li>
**投资人投资去中心化的公司?** 我有点不明白,为什么投资人或是投资公司会关注这个事?如果投资人看到了去中心化这个事可以颠覆现有的大公司,所以看好这个事。于是把钱投给了去颠覆中心化的大公司的这些公司,而这些公司又会成为中心化的大公司。这看起来好奇怪啊。因为真正的去中心化是完全找不到主体的。思考问题:**去中心化需要有公司吗?有公司的话,还能叫是去中心化吗?投资人并不傻,那么,他们想来这里面干点什么呢?是投机吗?**
</li>
<li>
有挣大钱的机会,你会共享出来?传销组织的三个阶段:第一,让你觉得你很穷困,告诉你致富的捷径。第二,模糊掉具体细节,用各种高大上的类比和比喻来取得你的信任。第三,通过发展下线来制造虚假繁荣,让你信以为真。所以,虚拟货币中绝大多数都是这样的特征。他们和骗子们所有的技巧如出一辙——“我有一个挣大钱的机会,但是我想和你共享出来,只需要你对我投资一点钱,未来你可以得到百倍的分红”。我靠,可能挣大钱的事,你愿意分享给这么多人?思考问题:在区块链中你有没有发现这样的身影?为什么他们要把这样超级革命性的可以挣大钱的项目在这么早的时候就分享给这么多人?
</li>
# 最后一个哲学问题
当一个社会出现问题的时候,在民众开始抱怨和发泄不满的时候,需要一个目标。这是一件很自然的事。于是有人就满足大众,告诉大家,你们今天之所以穷,之所以苦,之所以不公,是因为那些中间商玩弄了你们,是因为政府不可信,是因为有坏人……因为这是最好被民众所理解的,因为有明确的目标,简单粗暴。这也是人们容易被煽动的原因。
然而,整个社会的运作其实是一种协同,由多方带着不同的利益或诉求而形成的。也就是说,问题的出现是多方造成的,或是社会协同出了问题造成的,是机制造成的。并不是其中的某个实体造成的。
而且,无论你制定出什么样的机制或是规则,都会有好的一面和不好的一面,这一面有多好另一面就有多不好。所以,如果一件事完全只有好的,而没有不好的,那么,你有绝大可能是在被人在忽悠中。
去中心化就是好吗?我们不需要权威机构了吗?技术可以解决信任问题吗?
我是要继续改善我们现在这个社会还是直接毁了再建一个是“破坏性的建设Disruptive Construction还是“建设性的破坏Constructive Disruption
我不知道你喜欢哪个,而我喜欢后者。
文末给出了《区块链技术》系列文章的目录,希望你能在这个列表里找到自己感兴趣的内容。
<li>
[区块链的革命性及技术概要](https://time.geekbang.org/column/article/5197)
</li>
<li>
[区块链技术细节:哈希算法](https://time.geekbang.org/column/article/5363)
</li>
<li>
[区块链技术细节:加密和挖矿](https://time.geekbang.org/column/article/5438)
</li>
<li>
[去中心化的共识机制](https://time.geekbang.org/column/article/5612)
</li>
<li>
[智能合约](https://time.geekbang.org/column/article/5623)
</li>
<li>
[传统金融和虚拟货币](https://time.geekbang.org/column/article/5636)
</li>