47

区块链笔记(1)基础概念扫盲

 5 years ago
source link: https://segmentfault.com/a/1190000018775898?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

正如民谣像一杯酒,有故事的人听不得。深夜失眠的我,无意翻起中本聪的白皮书,就注定了无眠。今夜的我只醉心于技术,别问是真是假。

这是一篇关于区块链基础的笔记,涉及了我认为对于初学者来说,想要进一步深入前需要了解的最重要的几个概念,概括如下图:

2iU7ruq.png!web

一、金融交易

在深入了解区块链的技术细节之前,明白它为什么存在对理解它是很有帮助的。

区块链技术,最早是在金融交易领域破土发芽的,但在这之前,金融交易系统已经大体正常运作了许多年。所谓变革的新技术,必定对既有领域中一些核心理念发起了冲击,并提出了自己的解决方案。只在一个行业领域的“兴风作浪”,充其量只能算作改进,若说成是变革,那么这项技术的思想及提供的解决方案,必定能跨越多个行业领域继续“兴风作浪”。

在我们探究金融交易系统的缘起流变之前,先埋下两个问题。

  • 金钱在整个金融系统中已无处不在,它到底有什么价值,让人们不得不去使用它?
  • 在当前的金融系统中,有什么我们可以进行改进的方面?

现有的金融系统

假设我们回到金融交易的历史源头,来为人们设计搭建一套金融系统。首先得明白人们的现状和需求:每个人都拥有属于自己并可以提供给他人的产品或服务,同时也存在自己所稀缺的。为了均衡这种稀缺和富余,每个人可以对自己所拥有东西的价值进行评估,以及所要换取的东西进行预期,这便是贸易的开始。

但以物易物的贸易存在一个不争的事实:交易双方需要通过沟通谈判,来确定交易时物品的价值。当从小范围内的交易,扩展到更大范围的贸易时,相对公允的价格参考就需要被呼唤出来了。而像黄金这样,存量稀缺有价值、属性稳定可长存、体积不大便携带的物品,作为价格参考便再合适不过。更进一步地,人们创造出货币代替了黄金。

由于货币属于人造物,自然就需要对于基于此的交易进行记录和管理,已保证人们拥有财富的安全,于是银行作为可信赖第三方便出现了。人们可在银行中安全的存放金钱,信赖基于货币进行的交易,这是非常有价值的。

同时不免想问,银行又是如何做到这一点的呢?

当一个有价值的创新,成为了日常生活中不可或缺的一部分时,它的实现原理与运行机制,对于大多数使用者来说就会变的透明了。

可想而知,在全球贸易如此普遍的今天,银行维持系统正常运作,所需要的子系统及工具绝对成百上千。这里介绍其中一个重要的工具: 分类账 ,它记录的交易信息包括:发送方、接收方、交易时间、交易额度。银行可以利用分类账记录的信息做一些很酷的事情。比如,由于知道谁有钱,谁负债,以及拥有钱的数额,那么便可以确保互不认识的交易双方达成信赖。同时这也帮助解决了所谓的“ 双花问题 ”,所谓双花问题就是,某人将同一份笔钱花了不止一次。为使一个金融系统正常运行,这种现象是不被允许的,因为你可以想象,这完全是在印钞呀。银行可以通过分类账上的记录,来避免双花问题,因为银行知道第一次交易发生的时间,那么同笔钱第二次交易时就可以认定为无效。

区块链的改进

银行作为可信赖第三方,对于金融交易信息的全知视角,便是我们长期以来解决这个问题的一种途径。但是区块链技术提供了一种不同的,或许是更好的方式。因为现有的金融系统,不可否认地依然存在着一些问题:

交易数据的访问权

银行在金融系统中的地位太过重要,它确定拥有我们所有的交易数据,但我们不确定银行是否将这些数据同样共享给我们,这样是否真的合理呢? 任何的不公,都是从信息不对称开始的 ,你说呢。类似于银行所用的分类账,我们可以创建一个共享的分类账来供所有人访问。

解决一个问题的同时,总会有新的问题伴随着产生。

所创建的共享分类账,是否能达到与目前银行同样的安全与信任程度?

类似银行的可信赖第三方并不唯一

现在我们有一个转账需求要完成,可采用的途径并非去银行借记一种方式,还可以信用卡、支付宝、微信、PayPal等等。无论你选择哪种,你都需要给他们提供相关必要的信息。而若当你尝试进行更加复杂的交易时,可能涉及中间环节的公司也会越来越多,这必然会产生额外的费用以及交易延迟。这也是区块链技术尝试解决的一点。

区块链技术发展迅速,想法和工具都会层出不穷,只有我们牢牢抓住目标,我们才能做出明智的取舍。

二、关于比特币

区块链现在已经是一个跨越许多平台和行业的热门话题,每天都有许多更新层出不穷,如果我们要去对区块链追根溯源,比特币是一个不容忽视的里程碑。它的相关概念和想法影响着所有后来的其他区块链应用,所以我们可以通过了解比特币,来明白它的核心思想,是如何帮助建立起今天所熟知的区块链的。

比特币使用 的概念,来分组和验证交易信息,将若干个交易打包到一个 中进行管理。这个想法对比特币乃至区块链来说都非常重要,但却不是比特币首先提出来的,早在1991年, HaberStornetta 发表了一篇名为 How to Time-stamp a Digital Document 的论文,提出了一种验证文档的新方式:采用文档更新的时间戳,将不同的版本按此顺序组成一个文档连。如此看这两位老铁也算是区块链的先驱了。

区块链元年2008年,一个叫做中本聪(Satoshi Nakamoto)的神秘作家发表了一封名为 Bitcoin: A Peer to Peer Electronic Cash System 的白皮书,奠定了比特币的基础,也完全改变了我们看待和理解货币的方式。接着在2009年1月3日,中本聪发布了比特币软件,同时将第一个比特币带到了这个世界。

中本聪的这篇白皮书真是读一读神清气爽,开篇第一句就开始描述,点对点电子现金系统如何绕过对中心化银行的需求。通篇谈及了交易、时间戳、工作量证明、网络以及许多关于比特币如何运作的概念,或许目前你对于这些概念的技术细节还不是很清楚,不过没关系,当我们初次面对一个新技术的时候都这样。

让我们怀着以下问题,继续往下探索:

  1. 比特币尝试在解决什么问题?
  2. 它提出了怎样的解决方案?
  3. 开发这个新系统都用到了什么组件?

三、Hashing

目前我们对区块链技术的起心动念,已经有了一个大体的了解。接下来我们逐一简介,上图区块链框架中的各部分组件,首先是哈希和一个特殊的哈希函数 SHA256

哈希值可以被当做是信息的数字指纹,它是由字母和数字组成的唯一字符串,用以代表或者说是对应一组数据,哈希函数的作用,就是完成给定数据到唯一哈希值得映射。 SHA256 是一个特殊的哈希函数, SHA 是Secure Hashing Algorithm的缩写,256表示其输出的哈希值是256位的。除此之外还有许多不同的 哈希函数 ,比特币从中选择了 SHA256 函数,来计算区块链上每个区块的哈希值,这样做的原因是方便对区块的引用,以及完整性的校验。更详细的使用方式可以参考JS类库 crypto-js

aIRZFvr.png!web

为了理解哈希值是如何将数据组成为链的,我们需要对区块和区块链的概念有更多一点的了解。

四、区块

如字面意思,区块就是保存区块链上一定量交易信息的容器。如前所述,区块链是一个在网络中存储所有交易记录的共享分类记账单,当我们让它无限地运行下去时,就意味着这个记录所有交易的账单会变得非常庞大。那么将所有的记录作为一个整体来使用或管理,都会非常困难,明智的方法便是化整为零,来存储这些交易信息于许多个小区块中。

那这样包含数量有限交易信息的小区块长什么样呢?一个区块大体分为主体和头部,交易信息存储在主体中,而头部包含了一些额外信息诸如:

  • 前一个区块的哈希值。各个区块也就是通过该值相连构成链状结构的。
  • 区块被创建的时间戳。每个区块创建的时间,能够帮助我们确定某项交易生效的时间,这将有效地解决前面讲到的双花问题。
  • Merkle root 。是一个代表区块中每个交易的哈希值。一个哈希值如何代表区块中所有的交易呢?这里的骚操作是这样的:所有的交易对象两两取哈希值,然后再对得到的哈希值再两两取哈希值,以此类推,所得到的最后一个哈希值即是 Merkle root ,说白了就是一个二叉树的根节点。这么做的原因是,可以快速查找出区块中不一致的交易,不一致的产生可能是因为传输损坏或篡改。
  • Nonce 随机数。在创建区块时,网络中可能会存在许多个体同时发起请求,想要创建该区块,这其实就是所谓的“ 挖矿 ”,那么区块链网络该如何决定由谁来创建一个区块呢?这就是所谓的创建区块的复杂度问题。解决方案的关键就是这个随机数,比特币系统要求每个想要创建下一个区块的请求方,都要提供一个特定的哈希值,这个哈希值由区块所包含的内容 blockData 和这个随机数 nonce ,即 SHA256({ blockData, nonce}) ,通过哈希函数计算得到。额外的要求是,所得到的哈希值需要以特定数量 0 开始,这就需要重复的取哈希值一遍又一遍的计算,直到满足要求。也可以看出,该特定哈希值开头要求得 0 数量越多,创建该区块的复杂度就越高,反之亦然。
  • 区块大小。顾名思义,就是一个区块能存储信息的大小,这是由开发者在区块链创建时定下来的,当一个区块写入的交易信息达到该区块大小的限制时,就是该创建新区块的时候了。

五、区块链

区块链是一个共享数字分类账,它包含了发生在网络上的所有交易的历史信息,存储在区块链上的信息永久保存且不可改变。构成区块链的两个重要因素是:区块和哈希值,每一个区块包含自己的哈希值,以及一个指向前一个区块的哈希值,通过哈希值将所有区块按照创建顺序连接成区块链。

zYf6fu7.png!web

区块链这种由哈希值链接而成的结构,带来了一个有趣的性质:不易更改。当想要更改一个区块的内容时,由于哈希值得完整性,该区块的哈希值也必将更改,又由于该区块的下一个区块的头部中,包含了指向该区块的哈希值,后继区块哈希值的计算包含了指向前序区块的哈希值,前序区块哈希值得更改,就必然连锁的更改所有后继的哈希值。

区块链不易更改的性质,造就了其安全性。

六、分布式点对点网络

运行区块链的网络比较特殊,叫做分布式点对点网络。为了能够清楚地理解,就字面可以拆成两块来看:点对点网络和分布式网络。

所谓点对点网络, 就是允许网络中的任意两个节点,可以相互直接通信,而不需要通过什么中心化的节点 。举些例子,微信,Google的环聊,Skype都属于点对点网络。 而分布式网络,允许在许多用户间进行信息传递。 这样的定义,我第一次看到也很费解,为了更好地理解,最好的方法论就是 比较与鉴别 。我可以把中心化网络,非中心化网络以及分布式网络拿到一起来看。但在细看之前,需要明白一点,每一种网络都有他们各自的优势和使用场景,我们在区块链中采用分布式网络,只是由于比较来看,分布式网络更适合于区块链应用。

MJZRvuu.png!web

在中心化网络中,所有的信息都集中于一个节点上,其他节点都与中心节点相连。可以拿图书馆的例子来类比,将所有图书都集中保存在唯一的一个图书馆中,人们需要查阅资料或借阅图书,都来这个图书馆就好。好处是书籍与资料集中后便于管理,但问题也是显而易见的:其一,容灾性较差,假如这个唯一的图书馆失火或遭到破坏,由于所有信息只有这里独一份,损失后便无法恢复。其二,对于用户来说,非常不方便,所有人都需要到图书馆才能获取信息,无论你在何处。

于是就有了非中心化网络的改进方案,备份出全部或部分图书馆中的资料,建立多个地区或区域性的图书馆,这样便有了一定的灾备性。而分布式网络,则是把这个思路做到了极致。不需要图书馆了,每个人家里书架摆上50来本树,如果没有的话再相互借。把上述例子中的图书换成交易数据,就是我们比特币网络的样子,每个节点虽然不一定存储了所有的数据,但是通过这个分布式点对点网络,他们可以获取到区块链的所有数据。

七、内存池

我们随时的起心动念都可以产生一个交易,但这并不意味着网络处理交易的速度,能够实时的跟上交易产生的速度。也就是说,一定时间内,产生交易的数量可能会超过网络处理交易的数量,那么对于那些暂时未确认写入区块链的交易,就需要一个地方来存储这些信息,这个地方就叫做:内存池。

交易信息被写入区块之前,需要经过网络的确认与验证,这个工作是由区块链网络中一些叫作“矿工”的节点来完成的。具体到如何挖矿稍后介绍,这里先大致有一个概念。

VBBJJff.png!web

blockchain.info 这个站点提供了一些比特币区块的专业服务以及加密货币钱包,除此之外,还有一些区块状态的神仙图标可以免费查看。比如我们可以来关注一下,当前 未确认的区块情况

umYbYnM.png!web

图中和日期一行的字符串,是一条交易的哈希值;和绿色箭头一行的字符串,是交易双方的钱包,可以类比电子邮箱,只不过这里是用来发送比特币的。

一条交易信息离开内存池的原因,除了由矿工校验过后加入区块,还有一些其他原因:

  • 一条交易信息在内存池中停留的过久,若超过14天还没有被矿工写入区块,则会被移除。
  • 在内存池的堆栈中,所有的交易都是按照小费的大小,由高到低排序的。当内存池的存储空间达到上限的时候,此时来了一个小费大于目前内存池中最少小费的交易,那么小费值最少的交易将会被移除内存池。这个小费的额度,是是由发起交易的人确定的,如果希望自己的交易信息被矿工更早的写入区块,可以适当提高小费值。当然并不是不给小费,你的交易信息就不会写入,这要看节点的具体情况。
  • 如果区块中已经有了该交易信息,在写入验证阶段,会将重复的交易信息移除内存池。
  • 如果将要写入的交易信息,和目前区块链中的交易存在冲突,也将会被移除。

八、共识机制

先来看一个著名的问题:“拜占庭将军问题”。假设有9个拜占庭的将军,各自领着一支军队围着一座城的不同方位,他们之间彼此物理隔离,只能通过传令兵进行通信。他们需要达成共识到底是攻打还是撤退,要么一同攻打要么一同撤退,如果有一支军队和其他军队行动不一致,都会造成失败。同时这其中还有更复杂的因素,或许有某个将军已经叛变了,但其他人还不知道,这就意味着叛变的将军会破坏这次决议的投票;同时负责消息传递的传令兵,在路上也可能发生不可测的状况,而导致送达的信息失真,也可能压根没送到。

f2EZnyM.png!web

我们将将军换成区块链网络中的节点,两个场景中面对的问题是类似的,我们需要一种策略来帮助建立,在通信没那么稳定顺畅的情况下用户之间的信任。这便是所谓的共识机制,达成这个目的有许多备选的算法,比如工作量证明,股份证明等等。

8.1 工作量证明

工作量证明最早是比特币提出的一种解决“拜占庭将军问题”的方案,基本思想就是利用,前面谈到的区块头部中那个随机数以及哈希值。计算出这个有着特定数量0开头的哈希值比较困难,但网络中的其他节点验证起来比较容易。

工作量证明存在的问题:

  1. 高昂的电费;
  2. 矿工对于网络计算资源的垄断,间接的造成整个系统的中心化趋势;

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK