细读阮老师区块链入门教程
阮一峰老师的文章总是那么的通熟易懂,昨天看到阮老师的新作 —— 区块链入门教程,尔等赶紧静下心来细细研读一番。有兴趣的朋友,建议也阅读一下原文。
这里稍微介绍一下阮老师写这篇文章的初衷:
区块链(blockchain)是眼下的大热门,新闻媒体大量报道,宣称它将创造未来。
可是,简单易懂的入门文章却很少。区块链到底是什么,有何特别之处,很少有解释。
下面,我就来尝试,写一篇最好懂的区块链教程。毕竟它也不是很难的东西,核心概念非常简单,几句话就能说清楚。我希望读完本文,你不仅可以理解区块链,还会明白什么是挖矿、为什么挖矿越来越难等问题。
一、区块链的本质
区块链是什么?一句话,它是一种特殊的分布式数据库。
顾名思义,数据库是用来存储数据,而分布式表示该数据库不是单台服务器(单节点),而是由多台服务器构成(多节点)。对于数据库,我们可以对数据进行读写操作,即把数据写入区块链,也可以从区块链中读取数据。
任何人都可以架设服务器,加入区块链网络,成为一个节点。区块链网络中,没有中心节点,每个节点都是平等的,都保存着整个数据库。每个节点最终都会同步,从而保证数据的最终一致性。
如果想有更直观的感受,可以先浏览一下 Distributed Blockchain 这个网页。(网页中 Peer A、Peer B 和 Peer C 表示不同的网络节点)。
二、区块链的最大特点
区块链最大特点的 “去中心化”。为了能够能够更好的理解 “去中心化”,我们首先需要明白什么是 “中心化”。在现实生活中,有很多中心化的例子。比如平时我们浏览各大网站,阅读资讯或购物。每个网站必须有一台或多台服务器,把资讯或商品信息准备好,以供我们浏览。但是如果服务器坏了的话,我们也就无法访问了。
中心化的东西,一切都由某个组织或公司掌控。因此 “去中心化” 的意义是为了避免大公司、大集团控制了管理权,掌控了整个平台。
而区块链由于使用分布式核算和存储,不存在中心化的硬件或管理机构,任意节点的权利和义务都是均等的,系统中的数据块由整个系统中具有维护功能的节点来共同维护。因此能够很好的解决 “中心化” 问题。
三、区块
区块链由一个个区块(block)组成(第一个区块称为创世区块)。区块很像数据库的记录,每次写入数据,就是创建一个区块。
以比特币为例,矿工通过挖矿来创建新的区块。此外比特币采用的 PoW(工作量证明机制)共识机制,理解起来很简单,你能够获得多少货币,取决于你挖矿贡献的有效工作,根据你的工作量证明来分配货币。比如比特币、莱特币,都是基于 PoW 的虚拟货币,你的算力越高,挖矿时间越长,你获得的币就越多。
当然该机制内部实现很复杂,有很多细节,比如:挖矿难度自动调整、区块奖励逐步减半等,这些因素都是基于经济学原理,能吸引和鼓励更多人参与。
每个区块包含两个部分:
- 区块头:记录当前区块的元信息,元信息一般会包含以下内容:
- 生成时间
- 实际数据(即区块体)的 Hash
- 上一个区块的 Hash
- ...
- 区块体:实际的数据
Hash 的概念对大多数朋友来说,羞涩难懂。我们先来看一下阮老师的解释:
所谓 Hash 就是计算机可以对任意内容,计算出一个长度相同的特征值。区块链的 Hash 长度是256位,这就是说,不管原始内容是什么,最后都会计算出一个256位的二进制数字。而且可以保证,只要原始内容不同,对应的 Hash 一定是不同的。
以 SHA256 为例,当输入 Bitcoin
时,产生的 Hash 值为:
b4056df6691f8dc72e56302ddad345d65fead3ead9299609a826e2344eb63aa4
然而当输入 ETH
时,产生的 Hash 值为:
f4a3760644d064b3f7d82bb8e43ccb090a2dac8b55cc2894bf618c551b0bc2a8
可以明显的发现,不同内容产生的 Hash 值是不同的。当我们重新输入 Bitcoin
时,产生的 Hash 值为:
b4056df6691f8dc72e56302ddad345d65fead3ead9299609a826e2344eb63aa4
我们发现当输入的内容一致,都为 Bitcoin
时,会产生一致的 Hash 值。针对以上 Hash 的特点,阮老师也为我们做了两个重要的推论:
推论1:每个区块的 Hash 都是不一样的,可以通过 Hash 标识区块。
推论2:如果区块的内容变了,它的 Hash 一定会改变。
感兴趣的朋友,可以亲自体验一下 —— SHA256 Hash。
四、Hash 的不可修改性
区块与 Hash 是一一对应的,每个区块的 Hash 都是针对 ”区块头(Head)“ 计算的。 区块头包含很多内容,其中有当前区块体的 Hash,还有上一个区块的 Hash。因此如果当前区块的内容改变了,或者上一个区块的 Hash 也改变了,就会引起当前区块的 Hash 改变。这是由于这个特性,大大提高了区块链数据的安全性。
假设有人修改了一个区块,该区块的 Hash 就变了。为了让后面的区块还能连到它,该人就必须同时修改后面所有的区块,否则被改掉的区块就脱离区块链了。由于 Hash 的计算很耗时,同时修改多个区块几乎不可能发生,除非有人掌握了全网 51% 以上的计算能力。
为了能更好的理解上面的内容,我们来实际操作一下,假设当前区块链的状态(绿色是正常状态)为:
当我修改第一个区块的数据时,你会发现当前所有区块的颜色发生了变化都变成红色,具体如下图:
那么如何让当前的区块链恢复正常的状态呢?因为我修改的是第一个区块的数据,因此我需要从第一个区块开始,依次点击 ”Mine“ 按钮,重新计算 Hash。上图中,我用红色箭头做了标识,标识每个区块都连着上一个区块(创世区块除外),这也是 ”区块链“ 这个名字的由来。
感兴趣的朋友,可以亲自体验一下 —— Blockchain。
五、挖矿
中本聪最初设计比特币时规定每产生 210000 个区块,比特币奖励减半一次,直至比特币不能再被细分。因为比特币和黄金一样总量有限。所以比特币被称为数字黄金,比特币生产也俗称挖矿。
挖矿是将一段时间内比特币系统中发生的交易进行确认,并记录在区块链上形成新区块的过程,挖矿的人叫做矿工。简单说来,挖矿就是记账的过程,矿工是记账员,区块链就是账本。
怎样激励矿工来挖矿呢?比特币系统的记账权力是去中心化的,即每个矿工都有记账的权利。成功抢到记账权的矿工,会获得系统新生的比特币奖励。因此,挖矿就是生产比特币的过程。
此外由于必须保证节点之间的同步,所以新区块的添加速度不能太快。区块链的发明者中本聪故意让添加新区块,变得很困难。他的设计是,平均每 10 分钟,全网才能生成一个新区块,一小时也就 6 个。这种产出速度不是通过命令达成的,而是故意设置了海量的计算。也就是说,只有通过极其大量的计算,才能得到当前区块的有效 Hash,从而把新区块添加到区块链。由于计算量太大,所以快不起来。
六、难度系数
在介绍难度系数前,我们先来了解一下算力的概念。在通过 “挖矿” 得到比特币的过程中,我们需要找到其相应的解,而要找到其解,并没有固定算法,只能靠计算机随机的哈希碰撞。一台矿机每秒钟能做多少次哈希碰撞,就是其 “算力” 的代表,单位写成 hash/s。算力可以简单的理解为计算能力。
目前主流的矿机为 14T 左右的计算量级,即一台矿机就能每秒做至少 1.4*10 的 13 次方次哈希碰撞,我们可以说,这一台矿机有 14T 的算力。矿机每秒钟能做执行那么多次哈希碰撞,为什么人们都说采矿很难呢?
原来并不是任意一个 Hash 都可以,只有满足条件的 Hash 才会被区块链接受。这个条件特别苛刻,使得绝大部分 Hash 都不满足要求,必须重算。区块头包含一个 难度系数 (difficulty),这个值决定了计算 Hash 的难度。
我们可以通过 blockexplorer 来查看最新的区块,或浏览已有区块链中历史区块的信息。比如浏览当前(写作时)最新的区块信息 —— Block #501202。在 Summary 栏位中,你可以看到该块的难度系数(Difficulty)为:1873105475221.611
。那么第一个区块(创世区块)的难度系数是多少呢?通过 blockexplorer 进行查看,果然是第一个区块,难度系数那么低为 1,还有 50 个比特币(BTC)的回报。
区块链协议规定,使用一个常量除以难度系数,可以得到目标值(target)。显然,难度系数越大,目标值就越小。Hash 的有效性跟目标值密切相关,只有小于目标值的 Hash 才是有效的,否则 Hash 无效,必须重算。由于目标值非常小,Hash 小于该值的机会极其渺茫,可能计算 10 亿次,才算中一次。这就是采矿如此之慢的根本原因。区块头里面还有一个 Nonce 值,记录了 Hash 重算的次数。比如 Block #501202 区块,它的 Nonce 值为:1495680815
。
七、难度系数的动态调节
难度系数的动态调节机制是为了保证任何时候,无论多少矿工参与竞争,矿工必须执行的处理任务难度是动态的,从而保证每 10 分钟就可以挖矿成功。难度系数每两周会调整一次。这两周内,如果区块的平均生成速度小于 10 分钟,则意味着需要增加难度系数。如果区块的平均生成速度大于 10 分钟,则意味着需要降低难度系数。
比特币协议通过内置的算法,来实现动态调整整个网络的采矿难度。该协议还将每 4 年发行新比特币的比例降低一半,并将发行的比特币的总数限制在低于 2100 万币的固定总量。结果是,流通中的比特币数量紧随其后的一个容易预测的曲线,到 2140 年将达到 2100 万。由于比特币的发行率下降,长期来看,比特币货币是通货紧缩。
总的来说,难度系数越调越高(目标值越来越小),导致了采矿越来越难。
八、区块链的分叉
区块链是一种特殊的分布式数据库,网络中每个节点都可以进行数据库的写入操作。如果两个人同时向区块链写入数据,同时有两个区块加入,因为它们都指向前一个区块,就形成了分叉。如下图所示:
(图片来源 —— 阮一峰 - 区块链入门教程)。
在以工作量证明机制为共识算法的区块链系统中,这个问题是这样被解决的:从分叉的区块起,由于不同的矿工跟从了不同的区块,在分叉出来的两条不同链上,算力是有差别的。形象地说,就是两个链矿工的数量是不同的。
由于解题能力和矿工的数量成正比,因此两条链的增长速度也是不一样的,在一段时间之后(产生 6 个新区块所需的时间,大约 1 个小时),总有一条链的长度要超过另一条。当矿工发现全网有一条更长的链时,他就会抛弃他当前的链,把新的更长的链全部复制回来,在这条链的基础上继续挖矿。所有矿工都这样操作,这条链就成为了主链,分叉出来被抛弃掉的链就消失了。
最终,只有一条链会被保留下来,成为真正有效的账本,其他都是无效的,所以整个区块链仍然是唯一的。需要注意的是,让区块链保证数据最终一致性的前提是:所有矿工都遵从同样的机制。因此还有一种情况,就是矿工不遵守同样的机制,那么也会出现分叉。这类分叉又可以分为硬分叉和软分叉:
- 硬分叉:由于矿工之间出现分歧,一部分矿工决定采用不同的机制,产生出来的分叉是不会消失的,我们一般把这种分叉称为硬分叉。
- 软分叉:由于整个区块链系统软件的升级,一部分矿工还没来得及升级,出现了遵从不同机制而产生的分叉。针对这种分叉,当该部分矿工升级系统后,该分叉就会消失。
硬分叉和软分叉的详细说明,可以阅读 区块链分叉是怎么回事儿? 这篇文章。
Hi! I am a robot. I just upvoted you! I found similar content that readers might be interested in:
https://news.cnblogs.com/n/585882
补充分享一个以太坊DApp开发入门教程:http://xc.hubwiz.com/course/5a952991adb3847553d205d1