细读阮老师区块链入门教程

in blockchain •  7 years ago 

阮一峰老师的文章总是那么的通熟易懂,昨天看到阮老师的新作 —— 区块链入门教程,尔等赶紧静下心来细细研读一番。有兴趣的朋友,建议也阅读一下原文

这里稍微介绍一下阮老师写这篇文章的初衷:

区块链(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% 以上的计算能力。

为了能更好的理解上面的内容,我们来实际操作一下,假设当前区块链的状态(绿色是正常状态)为:

blockchain-hash-change.png

当我修改第一个区块的数据时,你会发现当前所有区块的颜色发生了变化都变成红色,具体如下图:

blockchain-hash-change-1.png

那么如何让当前的区块链恢复正常的状态呢?因为我修改的是第一个区块的数据,因此我需要从第一个区块开始,依次点击 ”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 个小时),总有一条链的长度要超过另一条。当矿工发现全网有一条更长的链时,他就会抛弃他当前的链,把新的更长的链全部复制回来,在这条链的基础上继续挖矿。所有矿工都这样操作,这条链就成为了主链,分叉出来被抛弃掉的链就消失了。

最终,只有一条链会被保留下来,成为真正有效的账本,其他都是无效的,所以整个区块链仍然是唯一的。需要注意的是,让区块链保证数据最终一致性的前提是:所有矿工都遵从同样的机制。因此还有一种情况,就是矿工不遵守同样的机制,那么也会出现分叉。这类分叉又可以分为硬分叉和软分叉:

  • 硬分叉:由于矿工之间出现分歧,一部分矿工决定采用不同的机制,产生出来的分叉是不会消失的,我们一般把这种分叉称为硬分叉。
  • 软分叉:由于整个区块链系统软件的升级,一部分矿工还没来得及升级,出现了遵从不同机制而产生的分叉。针对这种分叉,当该部分矿工升级系统后,该分叉就会消失。

硬分叉和软分叉的详细说明,可以阅读 区块链分叉是怎么回事儿? 这篇文章。

参考资源

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

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