《图说区块链》读书笔记 2

02 原理篇
信用共识带来的智能信任
讲一个故事,什么是区块链
区块链与骑自行车的人
于是专家们想,自治式、分布式的系统会不会好一点呢?答案是肯定的。区块链就是一个分布式的账本,每个节点都可以显示总账,然后维护总账,而且不能篡改账本,除非你控制了超过51%的节点,但这是不可能的。
再简单一点,假如你们家里有个账本,让你来记账。在以前,就是爸爸妈妈把工资交给你,让你记到账本上——想想还是有点小激动的。中间万一你贪吃,想买点好吃的,可能账本上的记录会少十几块,然后你想买个手机,账本上就少记录几千块。这只是举一个例子,我相信小时候大家都想从爸爸妈妈的口袋里拿点钱来花。
但有了分布式账本后,这些问题就不会有了,因为你在记账,你爸爸也在记账,你妈妈也在记账,他们都能看到总账,你不能改,爸爸妈妈也不能改,这样想买烟抽的爸爸和想贪吃的你都没办法啦。
区块链本质上是一个去中心化的分布式账本,其本身是一系列使用密码学而产生的互相关联的数据块,每一个数据块中包含了多条经比特币的网络交易有效确认的信息。
中心化与去中心化
所谓的中心化又是什么呢?我们首先思考这样一个问题,你要在网上买一本书,交易流程是什么?
第一步:你下单之后把钱打给了支付宝。
第二步:支付宝收款后通知卖家可以发货了。
第三步:卖家收到通知后给你发货。
第四步:你收到货之后很满意,于是确认收货。
第五步:支付宝收到了你的通知并打钱给卖家。
我们可以看出,在这个过程中,虽然你是在和卖家交易,但是整个交易都是围绕支付宝展开。
模拟一个区块链小城市
我们假设有一个去中心化的小城市,在这个城市里有5个可爱活泼的小伙伴,他们互相借钱的时候,是这么干的:
假设B向A借了1块钱,这个时候,城市里的人怎么办呢?A在人群中大喊:“我是A,我借给了B1块钱!”B也在人群中大喊:“我是B,A借给了我1块钱!”
此时城市里的其他人C、D、E都听到了这些消息,他们拿出了手中的小账本并默默记下:“某年某月某日,A借给了B1块钱。”
当我们把一个去中心化的模型极度简化之后,我们就会发现,在这个只有5个人的城市中,已经建立了一个去中心化的系统,这个系统不需要银行,也不需要支付宝。这个模型不需要信任关系,也不需要一个拥有公信力的组织。
当分布式结构中的每个人都记账的时候,篡改账本是不可行的。比如B突然不认账了:“我不欠A的1块钱!”这个时候,人民群众C或D或E就会站出来说:“不对,我的账本上明明记录了你在某年某月某日向了A借了1块钱,并且没有查到你还款的记录。”
小城市里的几个问题
问题一:凭什么帮你记账?
为了让大家都帮我记账,我增加了一条新的规则,我决定给第一个听到我喊话并且将其记录在小本子上的人奖励。奖励机制也很简单,第一个听到我喊话并记录下来的人,可以得到一个巴拉拉能量的奖励。
这个巴拉拉能量不是白给的,是对你劳动的报酬,就像打工可以挣钱一样,你帮我记账,整个系统都会给你报酬。你要做的事情,有这样几点:首先,你要抢在所有人之前听到了我的喊话并记在了自己的小本子上;记录之后,你还要马上告诉整个城市里的人——这句话我记录完了,你们再记录也没有用了,别人就会放弃这笔赚钱的生意;与此同时,你还要做一件事,就是给自己的记录加一个独一无二的编号,然后把记录和编号一起喊出来,于是,下一个人再记录的时候,就会带着这个记录和独一无二的编号继续下去。
在这条新的规则开始实行之后,一定会有这样一些人,他们为了得到巴拉拉能量,开始屏气监听周围发出的各种声音,只为了能在第一时间记下一条新的记录。
这个时候,对区块链有所了解的读者是不是想到了这样的名词——“比特币挖矿”。没错,这就是比特币挖矿的简单说明。
关于比特币挖矿的话题,知乎用户“玲珑邪僧”的一篇文章举过一个更生动的例子,大致是这样的:单身男士们要找女朋友,“国民岳母”说,我有好多肤白貌美、乖巧可爱的女儿,这样吧,我给你们出一个旷世难题,解出一个就给你们其中一个姑娘的微信号。
于是,单身男士们疯狂竞争,想破脑袋去解这道旷世难题。只要其中一位单身男士解出一道题,就立马得意扬扬地昭告天下,示威全部单身男士,这个姑娘的微信号是我的啦,先到先得,你们放弃吧。其他单身男士虽然已经算到一半了,但是没有办法,速度不够快啊,只好立马去解下一道题。
同时,首个成功破解旷世难题的幸运的单身男士不仅不用付一二十万元的彩礼,被其才华征服的“国民岳母”还会给这位单身男士一笔巨额财产做嫁妆,也就是比特币挖矿中的比特币奖励。
问题二:分叉问题听谁的?
B和C几乎同时记录完了,于是同时向天空大喊了一声,“这个编号89757的巴拉拉能量归我了”。但是,由于这个城市太广阔了,有的人会认为这个编号89757的巴拉拉能量归B,也有的人认为这个编号89757的巴拉拉能量归C,但是编号89757的巴拉拉能量只有一个啊,只有一个人能得到,怎么办呢?一人一半?当然是不可能的,这个时候我们会采用更原始简单的规则来解决,谁长听谁的。
在不加任何限制条件的情况下,这件事件会发展成这样:一部分人认为这句话是B说的,在听到这句话之后开始记账,之后他们所做的所有事情都是基于B有了编号89757的巴拉拉能量这个事实,并且随着这个信息一次次地传下去,这条信息链会越来越长;而另外一群认为C先说这句话的人,也会按照这样的趋势发展。
这下事情严重了,原本是一条唯一的、编号顺序严谨的总信息链,在B和C喊出“这个编号89757的巴拉拉能量归我了”这句话之后,硬生生地分叉了!这还得了,要是这种情况延续下去,每个人手里的账本都变得不一样了,而且根本没法确定哪个是真的!
为了解决这个问题,小城市又追加了新的区块链规则,记录的时候必须顶格写,而且要保证,中心在离田字格上边缘0.897 57毫米的位置上,于是,每个人写字的时候都要拿刻度尺量好之后再写,这非常困难,每个人的记录需要5分钟才能完成,因此,写这句话所用的时间变得不同了。于是,只要有人高喊“我写完了!那句话是某某某写的”,其他正在写这句话的人便会停笔,然后在小本子上重新开始写“那句话是某某某写的,上一句的编号是×××”。
问题三:双花问题
双花问题是指一笔数字现金在交易中被重复使用的现象。
中本聪在《比特币白皮书》第五小节中是这样说的,运行比特币网络的步骤如下:
1. 新的交易向全网进行广播;
2. 每一个节点都将收到的交易信息纳入一个区块中;
3. 每个节点都尝试在自己的区块中找到一个具有足够难度的工作量证明;
4. 当一个节点找到了一个工作量证明,它就向全网进行广播;
5. 当且仅当包含在该区块中的所有交易都是有效的且之前未存在过的,其他节点才认同该区块的有效性;
6. 其他节点表示他们接受该区块,而接受的方法则是跟随在该区块的末尾,制造新的区块以延长该链条,并将该区块的随机散列值视为新区块的随机散列值。
也就是说,交易发生的一刻起,比特币的交易数据就被盖上了时间戳;而当这笔交易数据被打包到一个区块中后,就算完成了一次确认;在连续进行6次确认之后,这笔交易就不可逆转了;在比特币中,每一次确认都需要“解决一个复杂的难题”,也就是说每一次确认都需要一定的时间。
在这种情况下,当我试图于把一笔资金进行两次支付交易的时候,因为确认时间较长,后一笔交易想要与前一笔交易同时得到确认几乎是不可能的,而这笔资金在第一次交易确认有效后,第二次交易时就无法得到确认。区块链的全网记账需要在整个网络中达成共识,双花问题是无法产生的。
讲一下原理,区块链如何运作
区块链的核心概念
在讲解区块链的工作原理之前,我们先将区块链中涉及的几个核心概念做一个简单的阐述。
一、区块
区块作为区块链的基本结构单元,由包含元数据的区块头和包含交易数据的区块主体构成。
区块头包含三组元数据:
1. 用于连接前面的区块、索引自父区块哈希值的数据;
2. 挖矿难度、Nonce(随机数,用于工作量证明算法的计数器)、时间戳;
3. 能够总结并快速归纳校验区块中所有交易数据的Merkle(默克尔)树根数据。
区块链系统大约每10分钟会创建一个区块,其中包含了这段时间里全网范围内发生的所有交易。每个区块中也包含了前一个区块的ID(识别码),这使得每个区块都能找到其前一个节点,这样一直倒推就形成了一条完整的交易链条。从诞生之初到运行至今,全网随之形成了一条唯一的主区块链。
二、哈希算法
哈希算法是区块链中保证交易信息不被篡改的单向密码机制。哈希算法接收一段明文后,以一种不可逆的方式将其转化为一段长度较短、位数固定的散列数据。
它有两个特点:
1. 加密过程不可逆,意味着我们无法通过输出的散列数据倒推原本的明文是什么;
2. 输入的明文与输出的散列数据一一对应,任何一个输入信息的变化,都必将导致最终输出的散列数据的变化。
在区块链中,通常使用SHA–256(安全散列算法)进行区块加密,这种算法的输入长度为256位,输出的是一串长度为32字节的随机散列数据。区块链通过哈希算法对一个交易区块中的交易信息进行加密,并把信息压缩成由一串数字和字母组成的散列字符串。区块链的哈希值能够唯一而准确地标识一个区块,区块链中任意节点通过简单的哈希计算都可以获得这个区块的哈希值,计算出的哈希值没有变化也就意味着区块中的信息没有被篡改。
三、公钥和私钥
这就是俗称的不对称加密方式,是对以前的对称加密方式(使用用户名与密码)的提高。
我们用电子邮件加密的模型来简单介绍一下:公钥就是给大家用的,你可以通过电子邮件发布,可以通过网站让别人下载,公钥其实是用来加密/验章的。私钥就是自己的,必须非常小心保存,最好加上密码,私钥用来解密/签章,私钥由个人拥有。
在比特币的系统中,私钥本质上是32个字节组成的数组,公钥和地址的生成都依赖私钥,有了私钥就能生成公钥和地址,就能够花费对应地址上面的比特币。私钥花费比特币的方式就是对这个私钥所对应的未花费的交易进行签名。
在区块链系统中,公钥和私钥还可以保证分布式网络点对点信息传递的安全。在区块链信息传递中,信息传递双方的公钥和私钥的加密与解密往往是不成对出现的。
信息发送者:用私钥对信息进行签名,使用信息接收方的公钥对信息加密。
信息接收方:用信息发送者的公钥验证信息发送者的身份,使用私钥对加密信息解密。
四、时间戳
区块链中的时间戳从区块生成的一刻起就存在于区块之中,它对应的是每一次交易记录的认证,证明交易记录的真实性。
时间戳是直接写在区块链中的,而区块链中已经生成的区块不可篡改,因为一旦篡改,生成的哈希值就会变化,从而变成一个无效的数据。每一个时间戳会将前一个时间戳也纳入其随机哈希值中,这一过程不断重复,依次相连,最后会生成一个完整的链条。
五、Merkle树结构
区块链利用Merkle树的数据结构存放所有叶子节点的值,并以此为基础生成一个统一的哈希值。Merkle树的叶子节点存储的是数据信息的哈希值,非叶子的节点存储的是对其下面所有叶子节点的组合进行哈希计算后得出的哈希值。
从比特币病毒谈起
说起比特币,许多人的第一反应就是比特币病毒。
叙述一下全世界都知道的事
2017年5月12日,网上发生了一件微小的事情,众多学校、医院的文档都陆续被一个叫“永恒之蓝”(WannaCry)的勒索蠕虫病毒锁住了:想看资料,可以;交钱,也不需要太多,300个比特币就行。
比特币病毒从何而来
这次的黑客不仅改进了勒索蠕虫病毒,还搭配了一个“好伙伴”——“永恒之蓝”黑客工具,不需要你点击任何链接,它就可以直接占领你的计算机。
永恒之蓝”究竟从何而来众说纷纭,并没有实际考据。
这个病毒什么时候能破解
最可能的解决方法就是,把黑客抓住之后,让黑客把他手里的密钥交出来,我们输入密钥之后就可以解封了。
为什么只要比特币
因为比特币的匿名性,换句话说,你不容易抓住他。比特币是一种网络虚拟货币,可以在全世界流通,具有匿名性,这便于黑客隐藏身份。
同时,比特币的世界性和流动性也是黑客选择比特币的理由。
但是,黑客想要逃脱法网也不是那么容易的,因为比特币的特点之一就是不可篡改,所有的记录都是无法篡改的,并且公开可查。
实际上,在大多数情况下比特币本身并不是百分之百匿名的。发送和接收比特币,就像作者用笔名发表作品一样。
怎么预防“永恒之蓝”病毒
第一招:搜索
第二招:以毒攻毒
第三招:占坑抢位
但我始终认为,技术本身是无罪的,比特币抑或区块链都不应该背黑锅。
比特币的工作流程
在区块链中,所有的节点向上回溯,都会到达源头,即区块链中的第一个区块,也就是“创世区块”。
在“创世区块”诞生之后,比特币的用户通过不断地“做题”,即通过计算寻找满足特定SHA–256哈希值对应的数值解。这个过程就是比特币中的“挖矿”。
区块链的本质是一个互相验证的公开记账系统。这个系统所做的事情,就是记录所有账户发生的所有交易。每个账号的每笔数额变化都会被记录在全网总账本中。而且每个人手上都有一份完整的账本,每个人都可以独立统计出有史以来比特币系统每个账号的所有账目,也能算出任意账号当前余额是多少。
比特币会硬分叉吗
2009年比特币诞生
一、中本聪拍了下脑袋
中本聪在设计比特币的时候,是2009年,那个时候数据能有多少?更何况也没有多少人使用比特币。于是他一拍脑袋决定了,比特币中一个区块的容量就是1M(兆字节)吧。而一笔交易是250字节甚至更多,现在一些交易基本达到了500字节。容量不够用啊!
我们来算笔账:
比特币一个区块的容量是1M
1M=1 024KB(千字节)=1 048 576字节
那么一个区块包含的交易总数为:1 048 576÷250≈4 194.3(笔)
比特币中一个区块确认的时间是10分钟
10分钟=600秒
那么一个区块每秒能处理的交易数为:4 194.3÷600≈7(个)
如果一个区块每秒只能处理7笔交易,要是交易数据再大点,可能连7笔都达不到。这样会造成一个结果,比特币上的交易拥堵而缓慢。
二、扩容方案意见不一
很多人代表各方的利益群体提出了自己的扩容方案!
要是做出来一个升级版本,所有人都直接升级成了新版,就没有分叉问题了,全世界大升级大和谐啊。但是,有人的地方就有纷争,有的人升级,有的人不升级。这可好了,乱套了,用的系统都不一样,那要如何统一呢?
不同的理念催生出了多种扩容方案,各个方案间无法统一,于是比特币分叉了。
三、硬分叉和软分叉
分叉怎么还分软硬呢?简单来说就是兼容性的不同,软分叉是暂时的,硬分叉是永久的。
区块链发生永久性分歧,在新共识规则发布后,部分没有升级的节点无法验证已经升级的节点生产的区块,通常硬分叉就会发生。
硬分叉的定义是这样的:硬分叉是指比特币的区块格式或交易格式(这就是广泛流传的“共识”)发生改变时,未升级的节点拒绝验证已经升级的节点生产出的区块,不过已经升级的节点可以验证未升级节点生产出的区块,然后大家各自延续自己认为正确的链,所以分成两条链。
硬分叉的特点如下:
1. 没有向前兼容性,之前的版本将不可再用,需要强制升级;
2. 在区块链层面会有分叉的两条链,一条旧链,一条分叉新链;
3.需要在某个时间点全部同意分叉升级,不同意的将会进入旧链。
当新共识规则发布后,没有升级的节点由于不了解新共识规则,就会生产不合法的区块,从而产生临时性分叉。
软分叉的定义是这样的:
软分叉是指比特币交易的数据结构发生改变时,未升级的节点可以验证已经升级的节点生产出的区块,而且已经升级的节点也可以验证未升级的节点生产出的区块。
软分叉的特点如下:
1. 有较好的兼容性,之前版本的部分功能可用,可不升级;
2. 在区块链层面没有分叉的链,只是组成链的区块有新区块和旧区块之分;
3. 相当长的时间里,可允许不进行升级,继续使用原版本生成旧区块,与新区块并存。
四、举几个有趣的例子
五、分叉有什么影响吗
2016年7月,以太坊开发团队通过修改以太坊软件的代码,在第192 000区块,强行把The DAO(分布式自治组织)及其子DAO的所有资金全部转到一个特定的退款合约地址从而“夺回”黑客所控制的DAO合约的以太币。
之后,便形成两条链,一条为ETC(原链),一条为新的ETH(分叉链),以太坊成功地硬分叉了!
硬分叉对比特币矿工的影响:
一旦分叉,矿工挖矿便简单了,可以挖到更多币了,多开心啊,但是,他挖出来的币值不值钱还得看有没有人买,毕竟市场决定价格。
硬分叉对比特币产业链的影响:
从技术角度来看,硬分叉的主要问题是它需要所有用户转移到具有不同规则的新区块链。为了保持比特币的品牌价值和对比特币的信仰,比特币的支持者是反对硬分叉的。如果真的硬分叉,将会掀起一场彻底的网络战和舆论战。
硬分叉对币价的影响:
按常理来看,估计分叉后比特币会先暴跌一场,然后分叉后的两个币种经过时间的洗礼后会渐渐回归理性,毕竟分叉后的“1+1”肯定不等于2。
区块链的工作原理

区块链的四大特点
1. 去中心化:在一个去中心化的金融系统中,没有中介机构,所有节点的权利和义务都相等,任意节点停止工作都不会影响系统整体的运作。
2. 去信任:系统中所有节点之间无须信任也可以进行交易,因为数据库和整个系统的运作是公开透明的,在系统的规则和时间范围内,节点之间无法欺骗彼此。
3. 集体维护:系统是由其中具有维护功能的所有节点共同维护的,系统中所有人共同参与维护工作。
4. 可靠的数据库:系统中每一个节点都拥有最新的完整数据库拷贝,修改单个节点的数据库是无效的,因为系统会自动比较,认为最多次出现的相同数据记录为真。
讲几个问题,区块链底层架构
区块链的模型架构
区块链基础架构分为6层,包括数据层、网络层、共识层、激励层、合约层、应用层。

一、数据层
数据层主要描述区块链技术的物理形式。
二、网络层
网络层的主要目的是实现区块链网络中节点之间的信息交流。
三、共识层
共识层能让高度分散的节点在去中心化的系统中高效地针对区块数据的有效性达成共识。区块链中比较常用的共识机制主要有工作量证明、权益证明和股份授权证明三种。
四、激励层
激励层的主要功能是提供一定的激励措施,鼓励节点参与区块链的安全验证工作。
五、合约层
合约层主要是指各种脚本代码、算法机制以及智能合约等。
六、应用层
应用层封装了区块链的各种应用场景和案例。
区块链的基本类型
一、公有链
公有链有如下几个特点:
1. 保护用户免受开发者的影响
2. 访问门槛低
3. 所有数据默认公开
二、私有链
私有链有如下几个特点:
1. 交易速度非常快
2.为隐私提供更好的保障
3.交易成本大幅降低甚至为零
4.有助于保护其基本的产品不被破坏
三、联盟链
四、其他的说法
许可链、混合链和复杂链。
私有链和联盟链都属于许可链。
区块链的发展脉络
区块链1.0、区块链2.0和区块链3.0
区块链的共识机制
问题一:类两军问题
问题二:拜占庭将军问题
区块链上的共识机制有多种,没有一种共识机制是完美无缺的,同时也意味着没有一种共识机制是适合所有应用场景的。
常见的共识机制主要有工作量证明、权益证明和股份授权证明三种。
一、工作量证明
工作量证明(Proof of Work,简称PoW)通常只能从结果证明。
PoW的优点:完全去中心化,节点自由进出。
PoW的缺点:目前比特币已经吸引全球大部分的算力,其他再使用PoW共识机制的区块链应用很难获得相同的算力来保障自身的安全;挖矿造成大量的资源浪费;共识达成的周期较长。
使用PoW的项目有:比特币、以太坊前三个阶段——Frontier(前沿)、Homestead(家园)、Metropolis(大都会)。以太坊的第4个阶段,即Serenity(宁静),将采用权益证明机制。
二、权益证明
权益证明(Proof of Stake,简称PoS)
PoS的优点:在一定程度上缩短了共识达成的时间;不再需要大量消耗能源去挖矿。
PoS缺点:还是需要挖矿,本质上没有解决商业应用的痛点;所有的确认都只是一个概率上的表达,而不是一个确定性的事情,理论上有可能存在其他攻击影响,例如,以太坊的DAO攻击事件造成以太坊硬分叉,而ETC随之出现,事实上证明了此次硬分叉的失败。
三、股份授权证明
DPoS机制
DPoS的优点:大幅缩小参与验证和记账节点的数量,可以达到秒级的共识验证。
DPoS的缺点:整个共识机制还是依赖于代币,而很多商业应用是不需要代币的。