0x01 byte

Recent content on 0x01 byte

马上订阅 0x01 byte RSS 更新: https://1byte.io/rss.xml

加密货币和区块链(二):分布式共识与去中心化

blog.incoming@1byte.io (江宏)
2018年2月8日 08:00
我先回答一些上一篇文章发布后看到的一些问题。我在第一篇文章里避免了对具体技术的讨论,因为加密货币和区块链是复杂和多面的问题,各种媒体经常把概念混淆,要解释清楚不容易,所以就先写一写对普通投资者有用的一些事实。 我收到的很多反馈其实也证明了这种混淆。有的人告诉我相信比特币的长期价格会越来越高,有的人告诉我区块链就像互联网早期、有很高的应用价值,等等。我上一篇文章里其实并没有涉及这些话题。反对意见中有一点和我的原文略有关系,就是不管泡沫如何,股票最终没有被放弃,电子技术没有被放弃,互联网也没有被放弃。不错,南海泡沫危机后一百多年其他公司又可以重新发新股了,但是危机发生时的那些公司大都消失了,那些投资它们的人也没有翻盘的机会。互联网是发展起来了,但是和 2000 年时那些倾家荡产的人没什么关系,对大部分人来说失去了的东西没有回来。相反很多在 .com bubble 里受损失的投资者后来很长时间都不敢再碰互联网公司股票,错过了这个行业高速发展的阶段。每一次这样的事件都会摧垮很多公司(还记得朗讯和北电吗),毁灭很多财富和投资者。活下来的公司在之后的很长时间里也很艰难,有很多走向衰败。 上一篇文章要警告的是抱着快速致富或者所谓跨越阶层的心态把自己输不起的财产投入进去的人。说到底各种加密币和 token 只不过是有着特定预期回报率和风险的 asset class。如果你做了充分的了解后认为它们应该是你投资组合的一部分,当然没问题。毕竟每个人对同样资产的回报率和风险评估不一样,偏好也不一样,否则金融市场就活跃不起来了。但是从我看到的反馈看,大部分人的了解很有限,并不属于这种情况。 我本想在这篇文章里把技术和应用方面都写完,结果写着写着发现内容太多,只能先说一部分技术话题了。加密货币和区块链是不同概念,我尽可能把两者分开讨论,但因为是加密货币让区块链概念产生和得到关注,目前也是区块链上最主要的应用。所以举例难免还是以主流加密货币所使用的区块链为主。 三分钟理解区块链 我用一点篇幅介绍一下基本概念。区块链英文是 blockchain,顾名思义就是由 block 组成的 chain。我不知道区块链的「区」是怎么来的,直译的话应该叫「块链」才对。每个 block 就是一些数据,对于比特币来说就是一些交易记录,然后有一个机制把这些 block 连成一个列表。普遍采用的办法是用一个哈希函数 H,把每个 block Bi的哈希值 H(Bi) 包含在下一个 block Bi+1 里。H 具有单向性,也就是知道 B 就很容易算出 H(B),但是反过来如果只知道 H(B) 的值很难构造出一个满足条件的 B。下面这个图表示了一个基本的区块链结构。 最简单的区块链 学过程序设计的人很容易看出它其实就是一个链表,只不过程序中用内存地址来标识一个节点,而区块链里用哈希值来标识一个块。这么做的结果是如果其中任何一块被修改了,很容易被检测出来,因为原来的哈希值在下一个块里。比如在上图中如果 B0 变了,H(B0) 就会变。而因为 H(B0) 是 B1 的一部分,所以导致 H(B1) 也要跟着变。如果有人要修改记录在这个链上的数据,就需要修改后面所有的块。 这个结构和它的原理对很多人来说并不陌生,它早在 1980 年就被发表了,以发明人的名字命名为 Merkle List。如果你是一位软件工程师,你多半用过 Git,它存储数据的方式就是基于 Merkle List(其实是更为通用的 DAG,不过原理一样). 现在说区块链大多是指在互联网上可以由很多人读取和写入的分布式的区块链,链上新的数据块会被广播到全网让所有人能看到。这就需要解决两个问题,第一是一致性,因为会有很多人同时往这个链上增加新的块,这样就会产生很多不同的分支,为了让所有的节点能看到一致的历史(达成共识),大部分区块链系统采用一个简单的策略,就是每个节点看到两个不同的分支时,就认为比较长的那一个是正确的分支,另一个分支上的数据需要重新打包成正确分支上的块。这样就带来了第二个问题,就是恶意的节点可以通过生成新块来在整个系统中保持多个长时间存活的分支。如果这是一个货币系统的话,恶意节点就可以把自己的钱多次消费(double spending)或者在很长时间后再把交易取消把自己的钱拿回来。解决的办法是给增加新块设定一个门槛。比特币(以及大部分区块链系统)的方案是在每个块里增加一个叫 nonce 的部分: 增加了 nonce 的区块链 当一个节点想把一个新块 B2 加到链上的时候,它需要为这个块的 nonce2 找到一个值使得这个块的哈希值 H(B2) 满足一定的条件(比如以特定数量的 0 开头)。前面说过 H 有单向性,所以找到一个满足条件的 nonce 值需要进行很多计算。这样一来假设整个区块链系统里的计算能力分布比较均匀,恶意的节点就不能随心所欲地增加新的块了。这个方式被叫做 Proof of Work(PoW)。按照区块链的设计,链上的数据不能被修改,新的数据只能增加到后面,所以也叫分布式账本。