Tag Archives: 区块链

我是如何学习区块链的

原创文章,转载请注明:转载自Keegan小钢
并标明原文链接:http://keeganlee.me/post/full-stack/20170915
微信订阅号:keeganlee_me
写于2017-09-15


专栏地址:https://xiaozhuanlan.com/fullstack


前几天我们已经学了如何学习的“道”和“术”,学完之后就应该落地到实践上,通过不断地实践练习,才能将这些 知识资源 转化为我们的 知识资本。如果你看完前面的文章后,觉得讲得真好,然后缺乏思考缺乏行动,然后就没有然后了。为了更好地指导你们如何实践,本篇文章我将与你分享我是如何将知识资源转化为我的知识资本的。

为什么选择区块链

选择区块链作为实践学习的案例,原因有三:

  • 第一,区块链是我最近两三个月刚学习的领域,对我来说也是一门从零开始学习的领域,这样的学习案例最具有指导作用。因为时间没有隔太久,很多学习过程中的细节我也还记得,这样我可以还原出更真实的学习过程。
  • 第二,区块链——确切说是虚拟货币最近非常火,连中国大妈都知道了,我的微信群里也有部分人在玩或准备玩,但大部分人普遍对比特币和区块链缺乏正确的认知,只是跟随潮流,这其实是存在很大风险的。因此,我觉得也有必要普及一下区块链和比特币正确的认知。
  • 第三,区块链是价值互联网的基石,是未来必然的趋势,会成为像HTTP一样基础的技术,所以也应该是每个技术人员都要掌握的技术。

关于第二点,很多人是因为听到了太多虚拟货币的致富神话,所以才开始关注这个行业。但却因为对虚拟货币和区块链缺乏真正的了解,所以其实看不懂这个行业的现状,更看不懂这个行业的未来。因为看不懂,所以要么一直观望,要么畏畏缩缩。最典型的就是我的一个同事,看着别人赚钱,一直想进。但从比特币1万块观望到2万块,一直不敢入场,总觉得价格太高,但却一直看着它升高。后来,有一次,被他抓到了一次抄底的机会,就是7月中旬比特币跌到1万3后反弹到差不多两万的那次,他终于下了决心入场了,貌似是丢了2000块钱进去,结果呢,赚了200块钱他就抛了。后来,BCC从2000块左右开始起飞之前,也被他抓住了,这次他胆子大了,丢了10000块钱进去,但和上次一样,只赚了10%就怕了跑出来了。那次BCC起飞足足翻了一倍还多。不过他也算是幸运的,起码赚到了钱,虽然赚得少。但有很多人是亏钱了的,而且还亏得不少。说了这么多,其实就是想表明,你想在这个行业里赚钱,甚至长期赚钱,你看不懂是不行的。

第三点才是最重要的,区块链将会成为基础性技术。基于HTTP的互联网可以称为信息互联网,主要传递的就是各种信息。而基于区块链的互联网则称为价值互联网,传递的是价值。在信息互联网时代你需要熟悉HTTP,那么,在价值互联网时代你就需要熟悉区块链。而且,未来已来,我们应该提前做好准备。

开始学习之前

每个人开始学习某项领域的知识之前,或多或少都会先听到或读到各种概念和观点,没有人会在真正一无所知的情况下突然决定要去学习某个东西。就比如说,如果你连“区块链”这个概念都没听说过,那你就不可能会有想去学“区块链”的想法。

我在决定开始学习区块链之前,就已经听到和读到了很多相关的概念,包括:区块链1.0、区块链2.0、区块链3.0、公有链、联盟链、私有链、硬分叉、软分叉、隔离见证、闪电网络、雷电网络、以太坊、以太坊经典、币圈、链圈、智能合约、比特币钱包等等,一大堆陌生概念。不过,那时候,给我印象最深刻的还是比特币,一个星期就从1万涨到了1万5。

那时候了解到的信息大部分都是从巴比特读到的,很多文章其实都看不懂,主要还是不懂的概念太多。但有一些还是看懂了,比如,比特币可称为数字黄金,那它未来的价值应该可以接近黄金,从这个角度来看的话,那比特币还有很大的上涨空间。比如,区块链开启了价值互联网时代,是趋势所在。主要也是这两点激发起了我学习区块链的兴趣。

确定目标

《001 | 如何高效学习》一文中就已经说过,想要提高学习效率,第一个条件就是:目标导向。功利学习法的核心也是目标导向。因此,我们学习一个东西,第一步必须是确定目标,而且必须是清晰明确的目标。另外,目标有分大目标和小目标。一开始,你是先确定了大目标,然后根据大目标分解成一个个小目标,每个小目标都应该是非常清晰明确可操作的。下面我就讲解我是如何将大目标拆解成小目标的。

我学习区块链的目标是很明确的,从大的方面来说,目标就两个:

  1. 为了以后进入区块链开发做技术储备;
  2. 为了能指导我如何投资虚拟货币。

那么,为了达到这两个目标,需要学习哪些东西呢?第一个目标需要学习区块链相关技术,就要知道区块链涉及到哪些技术、区块链的技术原理等;第二个目标则需要学习虚拟货币相关知识,包括需要解决有哪些虚拟货币、去哪里买虚拟货币、怎么买等问题,以及要了解虚拟货币未来的前景会如何。梳理之后,就变成了一个个待解决的问题:

  • 什么是区块链?
  • 区块链1.0、区块链2.0、区块链3.0有什么区别?
  • 什么是公有链?联盟链?私有链?
  • 什么是分叉?硬分叉和软分叉有什么区别?
  • 什么是隔离见证?闪电网络?雷电网络?
  • 比特币的本质是什么?
  • 比特币是如何交易的?
  • 什么是比特币钱包?
  • 什么是智能合约?
  • 什么是以太坊?以太坊和以太坊经典有什么区别?
  • 什么是币圈?什么是链圈?
  • 哪里买虚拟货币?怎么买?
  • 区块链和各种虚拟货币的前景如何?

很多时候,第一次梳理出来的问题并不全面,甚至很少,但没关系,在学习的过程中,就会不断涌现出新的问题。比如,有哪些共识算法?什么是超级账本?什么是ICO?怎么玩?等等这些就是我在学习的过程中新发现的问题。

这一步,最重要的是确定好大目标,然后拆解成一个个待解决的小问题。

搜集知识资源

当你的目标已经明确细分到一个个小问题之后,就可以根据这些问题搜集各种知识资源了。知识资源主要有三类:书籍、官方文档网络上的零散文章。搜集知识资源时,首选应该是书籍,因为书籍相对比较系统化,可以解答我们大部分的疑问。官方文档主要是为了加深理解,毕竟,书籍一般不会细化到一些技术细节之类的。而有部分问题,从书籍和官方文档是找不到答案的,这时就只能到网络上搜索相关文章了。另外,有些英语比较差的人看官方文档太累太费时间,也可以搜索网络上的中文文章。但我还是推荐尽量看原文,不会失真。

那么,回到我的区块链学习上来,选书上,我主要还是在那些比较畅销的书里挑,而且会尽量多覆盖上面所提到的问题。在亚马逊看每本书的简介和目录,最后选了以下几本:

  • 《区块链:新经济蓝图及导读》:同事推荐的一本书,讲到了区块链1.0、2.0、3.0,可以帮助我从宏观上了解区块链。
  • 《区块链:技术驱动金融》:从技术层面逐步解释了比特币是如何运作的。
  • 《区块链技术指南》:更加深入技术底层的书,还讲到了智能合约和超级账本,可以作为上一本书的补充。
  • 《区块链革命:比特币底层技术如何改变货币、商业和世界》:全景式描述了区块链理论及应用,这是为了扩大视野的书。

官方文档主要就是各种白皮书了,我搜集的白皮书主要包括:

最后,有些问题无法直接在书籍或白皮书中得到解答,比如说,什么是币圈?什么是链圈?这问题在百度或Google搜索一下就能得到答案了。有些文章会比较长,比如这篇:《详解最近大热的闪电网络、雷电网络和CORDA》,一时难以看懂,没关系,先收集起来,可以等后面进行大量泛读时再看。推荐可以去巴比特找资源,大部分都能找到。

这一步,主要还是搜集各种知识资源。先挑选书籍,尽量覆盖面广一点。再搜集各种官方文档,这是第一手信息,详细而不失真,可以加深理解。最后才是搜集网络上零散的文章,有些比较简单的问题可能直接就得到答案了,有些难以理解的要留到后面进行大量泛读时再看。

大量泛读

知识资源都搜集好了,接下来就可以开始进行大量泛读了。不知道大家是否还记得,大量泛读的主要目的就是:梳理出核心概念、主要观点框架逻辑。虽然在学习之前,我们或多或少都已经了解到了部分概念和观点,但在学习的过程中,我们就会发现还有更多我们不了解的概念和观点,这些都需要一一去理解的。

我们之前讲功利学习法时,提到知识资源可以分为三类:娱乐性、知识性、心智性。学习不同类型的知识应该分配不同的时间资源,知识性的比较适合碎片化学习,心智性的则需要集中几个小时进行系统性学习。因此,对我们搜集的这些知识资源,首先要区分好哪些是知识性的,哪些是心智性的,然后使用不同的时间管理策略进行阅读学习。对于我学习的区块链来说,大部分知识资源是属于知识性的,包括几本书籍的大部分内容和网络上搜集来的零散文章,这些我一般会放在上下班路上,或中午休息时学习;而那些专业的白皮书和书籍中深入技术架构的部分则属于心智性的知识,我一般就会放在晚上或周末集中两三个小时进行高强度学习。

阅读的方式也是有讲究的,我不会将几本书按顺序看完一本又一本,这样的话学习效率太低了。我会从一个个的问题出发,为了解决问题而从各种知识资源中找答案。解决完一个问题后再解决下一个。另外,在解决问题的过程中,普遍会遇到新的问题,那就把新问题先记下来,然后继续解决当前的问题。如果一个问题花了很长时间都解决不了,那可能这个问题对现阶段的你还没能力理解,这时可以先放一放,等学完其他再回过头来继续研究。

比如,我在解决“什么是比特币?”这个问题时,我会将每本书对比特币的介绍先看一遍,了解其框架逻辑后,再研读比特币白皮书,理解其技术架构和一些技术细节,直到终于明白,比特币从技术角度来说,本质上就是一堆复杂算法所生成的特解。另外,学习的过程中,就遇到了很多新的问题,比如“什么是共识算法?什么是Merkle Tree?什么是挖矿?等等,于是我就先把这些问题记下来,继续解决“什么是区块链?”的问题。

以下是我在大量泛读之后对一些核心概念的总结性理解:

  1. 区块链:从狭义上来说,区块链就是一种分布式的数据库,数据结构上就是按时间顺序将数据区块相连的一条链表,链上的每个节点就是一个区块,区块一般通过二叉树(如Merkle Tree)将每笔交易数据打包在一起,形成一个汇总的哈希值,再加上时间戳,就是一个区块的唯一标识。从广义上来说,区块链是结合了分布式数据存储、点对点传输、共识机制、加密算法等多种技术的一种分布式基础架构模式。
  2. 比特币:有很多人对比特币的理解就是账上的那串数字,但严格意义上来说,比特币是一种点对点的电子现金系统,是一整套系统,这点从比特币白皮书的标题上就已经说明了。可以将比特币简单理解为就是区块链技术的第一个应用。不过,“比特币”的概念要比“区块链”早,“区块链”这个概念是比特币发展了一段时间之后,将比特币的底层技术抽象出来形成的。另外,从投资的角度来看,比特币总量恒定为2100万个,其价值可以和黄金相比,但目前的市值和黄金的市值差距,还有很大的上涨空间,所以从长期来看,我还是非常看好。
  3. 以太坊:区块链2.0的典型代表,主要实现了智能合约的功能,开发人员可以在以太坊平台建立和发布各种分布式应用,这些应用,其实就是合约,智能合约说白了其实就是当达到某条件时会自动执行的代码。很多ICO的代币就是在以太坊平台上创建的应用。
  4. 公有链/联盟链/私有链:公有链就是完全公开的区块链,像比特币、以太坊;联盟链则不是完成公开的,是指有若干个机构共同参与管理的区块链,每个机构都运行着一个或多个节点,其中的数据只允许系统内不同的机构进行读写和发送交易,并且共同来记录交易数据,该联盟链的每个参与方不用担心自己数据存在哪里,自己产生的数据都只有自己看到,只有通过对方授权的密钥才能看到其他参与者的数据,这样就解决数据隐私和安全性问题,同时能够实现去中心化;私有链则是完全私有的,一般适合跨国公司,目前这一块还没了解到有什么代表性应用。

这一步,最高效率的阅读应该是带着问题去找答案。而且,要分配好时间资源,阅读知识性的信息时可以多用碎片化时间,心智性的内容则需要集中时间研读,要尽量理解每个核心概念。

建立模型

上一步我们已经大致理解了每个核心概念,但这些还只是一个个点,这一步就要将点与点之间连成线,逐渐连成网。即是说要理清不同核心概念之间的关联关系,逐渐形成系统模型。如果有条件的话,大白板当然是最好的思考工具,没有的话,用Visio、OmniGraffle之类的画图工具也可以,或者用XMind之类的思维导图也可以,甚至只用纸和笔都行,最重要的是要画出来。

以下是我用OmniGraffle梳理的区块链的系统模型图,因为时间和篇幅所限,所以只是部分内容:

求教专家

如果还存在无法解决的问题,那就要求教专家了。不过,这里也有一些需要注意的地方。

首先,你的朋友圈里要尽量多加一些专注不同领域的专家。不过,现在大部分人应该都加了不少牛人了,所以这一点没什么需要特别讲的。但有一点我想特别讲一下:不要随便什么问题都去求教专家

一来,专家基本都是很忙的,没太多时间总去帮你解决问题,尤其是当你问一些对他没有价值的问题时更不想搭理你。比如,你去请教一个Android架构师,问的却是“Android怎么打开蓝牙?”这种随便百度一下就能得到答案的问题,就算是我,我可能就会丢回一句“请自己去百度”。既然你请教的是Android架构师,就应该问架构方面的问题,而且最好是有深度、值得讨论、能给他带来价值的问题,比如,你去问他“什么是MVP?”这种问题也不合适,合适的请教方式应该是:你先讲出自己对MVP的理解,自己是如何用来架构项目的,再逐步与对方讨论MVP的架构思想、实现方案等。

二来,专家是你很重要的资源,你需要经营好。有一句话说得好:那些能帮到你的人,不是你的人脉,只有那些你能帮到的人,才是你的人脉。对于专家,虽然平时在专业领域上你很难帮得到他,但在其他方面你可以尽量多去给他提供帮助。

回到学习上来,为什么我们要先完成上一步的建立起系统模型后才来求教专家?之前的文章也有说过,因为如果你没有基本的全局观,问不出好问题。另外,也可以利用好知乎平台,很多问题,知乎上都有很多牛人有很好的回答。你也可以上去发问,当然,前提是你要提出好问题,这样,才有牛人愿意回答。

理解复述

复述最主要就是能起到强化理解的作用,费曼技巧是很好的一种复述方法,写作也是一种不错的方式,而且最好是公开性的。公开的写作,一来,你要写给不了解的人看,会促使你进行更完善的思考;二来,你可以从外部得到反馈,来完善和升级你的认知。所以我是推荐每个人都写博客的。

对于我来说,我更多就是写成文章分享出来,另外,有时候也会在公司内部做技术分享。

这一步也许是最费脑力的事情,但也是最能提高你的学习力的关键一步。

总结

我学习的方式可以总结为以下几个步骤:

  1. 确定目标:先确定大目标,再拆解成一个个待解决的小问题;
  2. 搜集知识资源:知识资源主要有三类:书籍、官方文档和网络上的零散文章,尽量搜集全一点;
  3. 大量泛读:最高效率的阅读应该是带着问题去找答案,而且要分配好时间资源;
  4. 建立模型:将一个个核心概念的点连成线,逐渐形成网,建立起系统模型;
  5. 求教专家:需要注意,不要随便什么问题都去求教专家,而且要经营好专家人脉;
  6. 理解复述:提高学习力的最关键一步,除了费曼技巧,写作也是一种推荐的方式。

思考和实践

如果让你学一门新的编程语言,你又会怎么学习?

白话区块链技术栈与应用

内容概要
现如今说起比特币,相信不少朋友已是耳熟能详了,尤其是这两年随着其价格飙升,甚至超过了黄金 ,超过了房地产,各大财经媒体乃至央视都有所关注报道;

在很多朋友心目中,比特币似乎就是一个类似于游戏币、邮币卡这样的炒作标的物,除了惊叹于它的价格上升速度外,对其了解还是寥寥。

然而,这一切的背后,到底是什么在支撑,现如今除了比特币,还有很多其他的类似系统, 比如莱特币、以太坊、 比特股等等,不胜其多,但凡介绍这些内容的软文, 大体都会提到一个名词:区块链 

一切似乎都是由区块链引起的,那么,就让我们剖开迷雾,揭开神秘的面纱,来看看这里头到底是个什么,它有什么特点,能有什么用处。
白话区块链技术栈与应用

导读:本章内容主要介绍区块链本身的含义以及代表性的技术组成,并由此介绍比特币是怎么通过这样的技术产生的。

1. 什么是区块链

1.1  一个有趣的数据记录格式

区块链,拆开来就是“区块+链”,实际上是一种数据的记录格式,软件在处理数据的时候,总是需要按照某种格式来读写,比如我们通常使用的关系型数据库,数据是按照一条一条的记录保存,或者再通俗的说,就像会计记账,将每一笔发生的业务都记在账本中,每一笔记录的账务称之为是凭证,一个月下来,将记录的一堆凭证数据汇总成 一个账簿,每过一个月就月结一下。区块链的格式,跟会计的这种记账方法很类似,所谓区块也就是一大坨数据的意思,我们可以将会计每个月所有记录的记账凭证看成是一个个的区块,区块之间通过年 月串联起来,这样看起来就像是一条数据链一样,区块链其实就是这么简单的一个格式,我们看个示意图:

如图所示,就是区块链格式的样子了 ,在比特币中,不是每个月存储一个区块, 而是大约每10分钟一个区块(注意只是大约,不是精确的10分钟),区块中存储的数据是最近的10分钟内发 生的交易 事务(最近的10分钟这个说法其实并不严谨,现在可以就这么理 解,在下面另有解释),可以理解为就是流水账。

大家看到这样的格式后,不知道是否有些似曾相识的联想,其实这样的数据格式,在生活中是有很多相似的;

比如工厂仓库的出入库记录,这个跟会计账本是类似的,还有家谱或者族谱,每一代人之间的关系是一个区块,到了下一代 又是一个区块,区块之间是父辈与子 女的关系连接,等等;而如果是计算机专业的朋友,一眼看上去,这不就是个线性表吗?是的,这就是比特币软件的主要数据存储格式,也是其他所有基于区块链技术的系统存取数据的格式。

这是一个很有趣的数据格式,它将连续不断的发生的数据分成了一个 一个的数据块,这样每个区块就都有自己的数字编号,也可以有自己的身份证号(通过哈希算法计算得到),在下载同步这些数据的时候,可以并行的从各个节点来获得,无论数据先后,到达本地后再根据区块号或者身份证号来组装起来就行 。

另外,这种格式是一种链条的格式,链条最大的特点就是一环扣一环,很难从中间去破坏, 比如有人篡改了中间的5号区块,那么如果要让数据看起来是完整的,就得同步把5号区块后续的所有区块都要更改掉,这个难度就大了,这也是区块链数据格式不可篡改的其中一个原因(当然了,如果仅仅只是本机的数据,也没什么不可篡改的,区块链系统真正的防篡改能力是通过无数个区块链系统运行的节点网络以及共识算法来实现的,这个在下面再介绍)。

这种格式还要个妙处,如果这个数据总是由一个人来记录的,那自然也没什么,但是如果放到网络中, 大家共同来记录这个数据,那就有点意思了,每个区块数据由谁来记录或者说打包,是可以设置一个游戏规则的,比如说掷骰 子,大家约定谁能连续3次掷出6,那就让他来记这个数据,为了补偿 一下他的劳动投入,奖励给他一些收益, 比特币正是使用了这样的原理来不断的发行新的比特币出来,奖励给打包的那个人的比特币就是新发行的比特币。

说到这里,大家觉得有点意思了吧?

1.2  一组技术的代表称呼

刚刚我们说了,区块链是一种数据的记录格式,可如果仅仅如此的话,实在不算是什么大不了的创新,事实上,在技术上区块链是一组技术的代名词,我们通常都说使用了区块链技术就是这个意思,那么既然是一组技术,那是由哪些技术组合起来的呢?我们来看一组关键词:

  • 公开密钥算法
  • 网络共识算法(挖矿)
  • 梅克尔数据证明
  • 可编程脚本合约
  • 区块链账本

1.公开密钥算法

属于计算机密码学⾥面传统的技术,公开密钥算法是⼀种不对称的加密算法,拥有两个密钥,可以互相加解密,通常其中的一个密钥是公开的称之为公钥,另外一个密钥是保密的称之为私钥;

2.哈希算法

也是属于计算机密码学中传统的技术,应⽤就更广泛了,主要⽤来对⼀段数据进行计算,得出⼀个摘要信息,通俗点说就是给一段数据⽣成⼀个身份证号;不同的消息生成的摘要数据是不⼀样的(某些抗碰撞能力弱的哈希算法可能在这⽅面会有些问题,但是使⽤广泛的⼀些知名的哈希算法,发⽣碰撞的概率很低),相当于给⼀段数据⽣成了一个身份证号这么个意思,在区块链系统中,哈希算法的使⽤很多,⽐如区块与区块之间,就是通过区块头的哈希关联起来的,⽽区块中的每⼀笔交易事务也都会⽣成⼀个哈希值作为交易易数据的ID,通过这些身份证号可以⽅便的检索或者关联区块,也能⽅便的指定某⼀笔交易事务。

哈希算法还可以用来生成梅克尔树,在下面我们再详细介绍,我们说了,哈希算法的特点是,只要目标数据有哪怕⼀点点的改动,生成的哈希值就会完全不不一样,因此可以⽤用来验证数据是否被改动过。

3.⽹络共识算法

在很久前就有计算机科学家研究过,并且提出过一些模型,⽐如拜占庭容错算法之类,比特币、以太坊这些使用的是⼀种工作量证明算法,其它的一些区块链系统有使用其他各种衍⽣的算法,⽽算法的原理都很简单,就是约定⼀个规则,通过共同执行这个规则,让每个分布式的节点数据都保持最终一致;

4.梅克尔数据证明

这是利用哈希算法将⼀组数据创建为⼀棵哈希树结构,⽤于验证数据完整性的一种结构,同时也应⽤在了轻量级钱包中。不同的区块链系统对梅克尔树的应⽤不尽相同,比特币中是⼆叉梅克尔树,比较简单,通过交易事务的哈希值两两配合生成一棵树,以太坊这种就复杂的多了,称之为梅克尔.帕特⾥夏树,这里暂时不赘述。

5.可编程脚本合约

什么叫合约?就是⼀组约定的规则,⽐如银行的结算系统,⼩明转账100给小王,在这么⼀个过程中,银⾏系统就会根据⼀组规则自动执行,规则包含⽐如检测⼩明的密码是否正确,余额是否⾜够,⼩王的账号是否正确,检测通过则分别更改两者的账户⾦额并写⼊事务⽇志。是的,这就是合约的意思了,当然,如果范围再⼴泛些,各种商业合约也都是这么个意思,因此可编程脚本合约也没什么好稀奇的,然⽽,如果将这种编程合约放到区块链的环境中,就⽐较有趣了,看两个特点:

第⼀个,区块链系统是⽆中⼼的分布式⽹络,没有边界

第⼆个,区块链系统通过⼀系列的技术实现了可信任⽹络

加起来,就是⽆边界的可信任⽹络,在这样的⼀个⽹络中执⾏既定的合约,成本低⽽而且安全,⽐特币在本质上也是属于这么⼀种脚本合约,只不过在⽐特币软件中,合约中处理的事情是⽐特币的转账,如果扩展这个概念,众筹、担保、分润等各种合约种类都能应⽤在这上⾯,⽤户也可以⾃行编写合约规则,以太坊便是这⽅面的⼀个典型代表,并由此带出了智能合约的应⽤。

这些技术的具体解释,我们在下⾯⼀一详述。

其中的【区块链账本】我们已经介绍过了,不再赘述,那么其他的技术都具体是什么意思呢,它们是怎么与区块链账本结合起来的?我们来一一说明一下:

1.3 创世应用“比特币”

说了这么多,我们知道,区块链技术反正就是一套软件开发技术,跟我们平时的网站开发技术、游戏开发技术、手机APP开发技术类似,只不过,与其他的开发技术不同的是,它能开发出一款软件,这种软件能制造“货币”出来,这就让人觉得有些不可思议了,比特币正是区块链技术的第一个应用软件,因此我们称它为“创世应用”。

正是比特币把区块链的技术理念带到了我们的视野中,虽然⽐特币的创始人中本聪⼀直都是⼀个谜,没有搞得清楚他到底是⼀个⼈人还是⼀个组织,但这些都不重要,重要的是⽐特币系统以⼀种极其天才的创新设计,解决了人们⼀直以来都难以解决的问题,那就是异步⽹络环境中实现数据的可信任共识的⽅案。我们抛开⽐特币这个货币的概念,纯粹站在软件或者⽹络的⻆度来看⼀下,假设我们是当初的中本聪,模拟⼀下当时的想法,⾸先,希望实现⼀套系统,可以联⽹,并且通过网络传递数据,如果是使⽤中心服务器这个结构的话,那显然是不够安全的,只要服务器上的数据损坏或者被攻击,系统等于就被瘫痪了,因此,决定采⽤分布式的结构,可是分布式结构有几个问题;

第一个,这些分布式的系统节点运⾏在哪呢,谁愿意提供计算机设施来运⾏行,靠⾃己来部署,那个成本就没底了;

第⼆个,分布式的节点,那么数据的⼀致性就是个问题,没有了服务器,数据来源也就没有权威的保证了;

第三个,怎么来验证⽹络中的数据呢?

对于第⼀个问题,站在经济⻆度,如果系统提供⼀种激励措施,让运⾏节点的⼈有利可图应该就能解决了,因此设计这个系统,得要有⼀个奖励或者激励的规则,在⽐特币中,打包区块的矿⼯工能够获得⼀定数量量的⽐特币奖励,这就是激励措施了。

对于第⼆个,这个问题是个难点,比特币要运⾏在公⽹上,各种情况都有,数据可能被篡改,⽹络可能不稳定,就连节点什么时候运⾏也不在控制之中,如何来解决这些问题呢?得要有⼀个机制,这个机制必须要有公正性,既然网络是可能不可靠不稳定的,那这个机制中就不能有太多对其他节点的依赖,得是⼀个主要依靠本机就能实⾏的⼀个做法。

换成是我,还真的很难想到⼀个好方法,传统的⼀些技术都有些问题,如果是在⼀个节点明确,网络也较为良好的场合,还好处理理⼀些,可是⽐特币的情况要⽐这个复杂的多。著名的CAP原理,阐述了这么⼀个结论:分布式计算系统不可能同时确保⼀致性、可⽤性和分区容忍性。看下这三个术语分别是是什么意思吧:

【⼀致性】:这⾥是指强⼀致性,发⽣在后⾯的事件能看到前⾯事件发⽣导致的结果

【可⽤性】:在有限时间内,任何⾮失败节点都能应答请求

【分区容忍性】:也就是说⽹络有可能发⽣分区,也就是说节点之间的通信不可保障不能同时确保,那就只能靠弱化某⼀个或者某两个特性,⽽而增强其中⼀个特性了。

中本聪在实现的时候,设计了⼀个工作量证明,很有意思,设置⼀个难度值,大家都通过⼀个类似于掷骰⼦的算法来命中⼀个结果,若结果符合预期的要求,就成功,成功者可以获得数据的记账权也就是区块数据打包,打包完毕后⼴广播给其他⼈,其他⼈验证后写⼊⾃己的数据中。

在这个过程中,由于使⽤的算法是⼀个类似于暴力破解的算法,除了靠提⾼计算机算力没有更高的办法去讨巧(这就⼀定程度上实现了⼀定程度的公正,当然了,⼟豪有能⼒购买更高性能的计算机设施,从⽽比普通⽤户更加具有抢得打包权的能力,这也是⼀个问题,不过⼀种技术总是只能解决⼀定范围的技术问题),但是大家需要注意的是,能够算出⼀个命中的值的,可并不⼀定只有⼀个⼈,如果出现了多个呢?那大家就只能进⾏区块的⼴播竞争了,谁被其他的节点接收的多,谁就被最终认可,⽽其他同样挖矿成功的就会被丢弃,从⽽得不到奖励。

因此,比特币中的这种数据⼀致性的算法是最终⼀致性而不是实时的⼀致性,这个大家⼀定要注意了。

对于第三个问题,怎么验证⽹络中的数据,在⽐特币⽹络中,每个节点都是独⽴的验证数据的,在验证过程不需要⽹络中其他节点提供依赖的服务。

2. 区块链技术栈

 

2.1 记录格式—区块.链

见【1.1  一个有趣的数据记录格式

2.2  网络结构-P2P

现如今,⼤概很少软件是单机版的了,就连输⼊法⽐如搜狗输⼊法、讯飞输⼊法也都是要通过联⽹来更新词库以及提供其他⼀些智能功能的,那么,既然是联⽹的软件,就避不开⼀个问题,那就是⽹络结构,就好⽐我们要造房⼦,总得设计下房屋的结构吧,砖瓦结构呢还是框架结构,单独的平⽅呢还是连⽚的⼩区。

迄今为⽌,⽆论什么样的⽹络结构,总体来区分⼀下的话,就是两种:客户端-服务器结构、P2P结构。

P2P也就是peer to peer的意思,中⽂点对点,也就是对等的意思。

区块链中的特点之⼀就是分布式,每个节点都维持完整的账本数据,可以独⽴的进⾏数据验证,独立的发送数据接收数据,彼此之间通过共识来实现数据的不可篡改和⼀致性,⽽每个节点都独⽴的按照规则做着⾃己的事情。任何⼀个节点的损坏或者图退出都不⾜以影响整个⽹络的正常使⽤,尤其当节点数量很多的事情,这也就避免了单点故障。

由于不存在⼀个服务器,也因此对等⽹络结构中的节点,是需要有⼀个认识彼此的机制的,这就是⽹络路由功能,简单来说,就是每个节点都会负责为其他节点提供地址信息,同时也会去索取和更新有效的节点地址。

就个⼈理解来说,对等⽹络结构最核⼼的就是⽹络共识机制,每个节点既当客户端也当服务器器,通过共识机制来协同。

2.3 同步机制-共识算法

区块链系统是对等⽹络结构,每个运⾏的节点都各⾃保存⾃⼰的数据副本,那么问题就来了,怎么来保证彼此之间的数据统⼀呢,既然没有⼀个中⼼服务器,⾃然也就没有⼀个传统意义上的权威数据来源了,⽽且对等⽹络中的每个节点都是平等的,那要是彼此的数据不⼀致,以谁的为准呢?这就要使⽤到⼀个同步机制,也就是共识算法。

共识算法的主要⽬的就是通过⼀种机制,使得⽹络中产⽣的数据让⼤家都能认可也就是所谓的共识,⽽对于那些⾮法的⽆效的数据会被丢弃掉,可以说,共识算法是确保区块链⽹络数据同步以及数据安全的重要环节。每⼀种不同的区块链系统都会有⾃⼰的⼀套共识算法,⽐如PoW(proof of work,⼯作量量证明)、PoS(proof of stake,权益证明)、DPoS(Delegated proof of stake,股份授权证明)、PBFT(Practical Byzantine Fault Tolerance,拜占庭容错算法)等等,很多,每种不同的算法也各有特点和优劣。

再具体说明之前,有朋友可能会有疑问,就算是对等⽹络,没有⼀个服务器来权威的提供数据来源,但只要节点之间彼此都连接,随时保持⼀致不就⾏了,如果是在⼀个⽹络良好的局域⽹中,并且运⾏的节点是受到严格的管理的,那⼤概也就没什么问题了,可事实上是,类似⽐特币这样的区块链系统是运⾏在互联⽹上的,⽽且谁也不能保证⽹络是个什么状况,甚⾄就连运⾏的节点什么时候启动什么时候会关闭掉都不知道,⽐如我们使⽤微信聊天,假设没有⼀个微信服务器存在,当⼩明发消息给⼩王时,⼩王正好没开微信,或者⼩王正好在地下停⻋场,没⽹络,那怎么办?种种情况,都不能保证节点之间能够随时连接在⼀起,因此区块链中的共识算法,要解决的是这样⼀个情况异常复杂的⽹络环境中的数据同步问题。

为了让⼤家⽐较能够形象的理解,我们还是以⽐特币为例,⽐特币中使⽤的是⼀种⼯作量量证明算法,其原理很简单,如下:

我们还是以⽐特币为例来说明,⽐特币中的⽹络共识算法的过程原理相对简单,理解了这部分,再去理解其他的共识算法就会⽐较有基础。

在⽐特币中,使⽤的共识算法是⼀种⼯作量量证明算法,说通俗点,⼤家通过⼀种竞争算法来抢夺区块数据的打包权,谁抢到了谁就能将发⽣的交易易数据打包成区块,并且⼴播出去,其他节点验证后没有问题就保存到⾃⼰的区块链账本中,这种竞争算法的原理很简单,系统会计算出⼀个难度⽬标值,然后⼤家通过对区块头进⾏⼀个加入了随机数的哈希计算,直到算出的值⼩于难度⽬标值,那就算是成功拿到记账权了,就跟掷骰子差不多意思,谁掷出了⼀组符合条件的数字谁就赢了。

有朋友可能问,那要是不⽌⼀个⼈算出了那么⼀个数字呢,以谁的为准呢?呵呵,这个时候,就要靠运⽓了,假如A和B都得到了符合条件的⽬标数据,都打包,都⼴播了,这个时候就看谁⼴播的范围最⼤,影响最⻓远了,最后⽐特币⽹络会保留⼴播范围最⼤的那个。

⼤家看到在这个⼩节的标题上放了个“挖矿”的字样,是不是共识算法都称之为是挖矿算法呢?答案是否定的。在这⾥之所以放⼀个“挖矿”的字样,是因为在不少的公链系统中,⽐如⽐特币、莱特币、以太坊等,都是通过这样的⼀个共识算法来发行新币的,怎么发⾏呢,就是奖励⼀定数量量的币给成功挖到区块的矿⼯。

2.4 完整证明-梅克尔树

梅克尔树是一种数据结构,跟区块链账本数据格式一样,是用于维护 一类数据的,区块链的账本格式是一条链,梅克尔树,顾名思义是 一种树结构,梅克尔树的目的是为了实现完整性证明,在不同的区块链系统中,对梅克尔树的使 用不尽相同,比特币中使用的称之为二叉梅克尔树,而比如以太坊系统中使用的则是梅克尔-帕特里夏树,相对来说, 二叉梅克尔树要简单许多,咱们就从简单的开始介绍吧,还是以比特币中的为例 。

既然是树结构,那就有一个个的树节点,那么比特币中的树节点中都是哪些数据呢?实际上,在比特币中,每个区块中都包含有一颗梅 克尔树,我们来看看,这棵树是怎么种出来的。

在每个区块中都包含有很多交易事务,每条事务都有一个身份证号,这是通过哈希算法计算而来的,可以唯一的表示某条事务记录,假如说某个区块中有6条事务记录,那我们就拿出6条事务记录的身份证号也就是哈希值,进行两两配对,然后分别再计算出两两配对的事务哈希值,依次往上,直到最后计算出一个根哈希,我们来看个图示:

 

 

在⽐特币中,每个区块都能⽣成⼀颗梅克尔树,是通过什么来⽣成的呢?是通过交易事务,在⼀个区块中,每条交易事务都会被计算⼀个哈希值,假设某个区块有4条事务,则如图所示,Hash1到Hash4就是这4条事务的哈希值,接下来再次对事务的哈希值两两哈希,直到最后⽣成⼀个根哈希,如此,⼀棵梅克尔树就⽣成了。那么,这样的⼀棵树⽣成后有什么⽤呢?

⾸先,⽐特币的节点在进⾏数据同步的时候,会向多个节点下载数据,这个时候,就会有个问题,怎么来验证获得的数据是完整的还是不完整的呢,是有问题还是没问题的呢?在点对点⽹络中进⾏数据传输的时候,显然并不只是从⼀台服务器上下载数据,⽽且其中的⼀些机器还可能是不稳定的,甚⾄是不可信的,这个时候,通过上述的⼀个⼤文件⼀个哈希值的⽅式就不太能起作⽤了。

然后通过梅克尔树,假设图中的2号事务数据下载有问题,则计算出的Hash12必然是与其他节点不⼀致的,很快就能定位到问题块,除了能够快速定位到数据块外,还有⼀个作⽤,就是对SPV(Simplified Payment Verification, 简单⽀付验证)的支持,我们知道,⽐特币核⼼钱包是要搭配完整的区块链数据使⽤的,包含了所有发⽣的交易事务,也因此,可以对接收或者发起的交易事务进⾏完整的验证,⽐如是否包含⾜够的余额,是否双花等,但是这种却也有个很⼤的问题,它必须要带上⼀个数据量很⼤的账本副本,这就限制了⽐特币钱包的使⽤,有时候我们只是想验证⼀下⽀付是否发⽣过就⾏了,完整的交易可以交给核心节点,那怎么办呢?可以通过如下的过程来实现:

1.  ⾸先下载完整的区块头数据,注意是区块头不是所有的区块链数据,区块头中包含有区块的梅克尔根

2.  如果是想要验证某笔⽀付交易,则计算出这笔交易事务的哈希值txHash

3.  找到txHash所在的区块,验证⼀下所在区块的区块头是否包含在区块链账本中

4.  获得所在区块中计算梅克尔根所需要的哈希值,注意我们并不需要所有的事务哈希值,如图所示,如果是要校验Hash1的话,我们只需要再搜集Hash2、Hash34即可

5.  计算出梅克尔根

6.  若计算结果与所在区块的梅克尔根相等,则⽀付交易是存在的。

7.  根据该block header所处的位置,还可以确定该交易得到了多少个确认

从中我们可以看到,梅克尔树是相当重要的。⼤家可以设想⼀下,这种结构还能应⽤在哪些场景下。

2.5 账户管理 -公开密钥算法

我们在使用通常的网络服务时,都会注册一个用户名,无论是使用淘宝、京东、微信等,还是玩网络游戏之类,都会去注册一个用户名,那么区块链系统中是怎么来注册用户名的呢?实际上在区块链系统中 一般是没有用户名这个概念的,而只有一个账户地址的概念, 无论是使用比特币还是以太坊还是其他的,基本都是通过一个地址来表示的,对于支持数字货币的区块链系统这个地址也称之为是钱包地址,那么这个地址是从何而来的呢?我们先来了解一下公开密钥算法:

这是⼀种加密算法,通常的加密算法,密钥只有⼀个,举个例子,我们希望对⼀串串数字进⾏行加密,约定将每⼀个数字都加上2,⽐如1,2,3,4,5就变成了3,4,5,6,7,如果有谁知道了这种加密⽅法,那同时也就知道了解密算法,这种⼀般称之为叫对称密码算法;

如果希望加密的⽅法与解密的⽅法是可以独⽴的且⽆无法互相直接推倒出来,那么,这种算法就是不对称加密算法,也就是所说的公开密钥算法,为什么叫公开密钥呢,因为这种拥有两种密钥,⼀个是保密的称之为私钥,⼀个是可以公开的,称之为公钥,使⽤用私钥加密的数据可以通过公钥解密,反过来使⽤公钥加密的数据可以通过私钥解密,⽬目前这种算法应⽤比较多的有RSA算法ECC椭圆曲线算法,前者是利用了⼤素数分解难度的原理理,后者是利用了椭圆曲线离散对数的计算难度,具体细节基于篇幅这⾥不再展开,区块链系统中,通常椭圆曲线算法应⽤的最多。

以⽐特币为例,⽤户可以在⾃己的钱包中创建地址,这个地址类似于银⾏账号,我们可以将⽐特币从⼀个地址发往另外⼀个地址,那么,这个地址从何⽽来的呢,实际上,从本质上来讲,并没有⽐特币地址这么⼀个东⻄存在,为什么这么说?⽤户在创建钱包地址时,实际上是创建了⼀对公钥和私钥,⽽所谓的地址只是公钥的⼀种格式化表示。 ⽤户通过私钥签名证明⾃己拥有某笔⽐特币,⽽通过公开的公钥可以验证⾃己的身份,只要⾃己通过私钥签名⼀笔交易或者签名⼀笔消息,任何⼈人都可以通过公开的公钥来确认是否是合法的用户。也就是说,公开密钥算法不但⽤来识别某个地址用户,也是⽤来完成交易事务的,不但是⽐特币,其他的区块链系统也是同样的原理。

2.6 智能合约-可编程状态逻辑

这是区块链系统⾮常重要的特点,我们知道,区块链系统可以创建⼀个可信任的⽹络,在这样⼀个可信任的网络中可以放心的通过⼀组代码编写的既定规则,转移数据的所有权,变更数据的状态。⽐特币⽹络中可以转移⽐特币,以太坊⽹络中可以转移以太坊还可以通过其他的智能合约实现按规则的状态变更。

这些到底是什么意思呢?

通常,在⼀个传统系统中,⽐如银⾏行的账户系统,是怎么来表明⼀笔钱是谁的呢?是通过账户和密码,⽐如⼩明转了了100元给⼩王,这100的⾦金金额数值就会写⼊到⼩王的账户,然后扣除掉⼩明账户⾥100,⼩王的账户只有通过⼩王⾃己的密码才能验证通过使⽤,这个逻辑看起来很正常,⼀直以来我们都是来的。然⽽而,区块链系统中却不是这么来实现的。

让我们来站在⼀个⽐较⾼的⻆角度来看待⼀下,以银⾏账户为例,⽆论是转账,存钱还是扣除费⽤等,不管是什么样的业务,对于账户来说,站在数据的层⾯,无⾮就是数据状态的不断变更,⽽每⼀次的变更都是通过⼀系列的规则验证的,这么⼀来,我们可以将这个账户看成是⼀个状态机,如下:

 

这个图很好理解,那么我们可以看到,最主要的不是状态本身,⽽是状态变更的触发条件,在这个图中,每个状态之间的变更都是有条件的,区块链系统中通常会怎么来实现这么⼀个条件的触发呢?我们以转账来说明:

1. 发送⽅发起⼀个转账交易,类似于开了⼀张⽀票,然后签上⾃⼰的名字(私钥签名)

2. 在⽀票上写上对⽅的账户地址(对⽅的钱包地址,我们知道钱包地址就是通过公钥转换⽽来的)

3. 向⽹络中发送这笔交易,每个节点都可以来验证这条交易是否有效(⽐如发送⽅的余额是否⾜足够,私钥签名是否合法等)

4. 节点如果验证没问题就能通过,这条交易事务最终会被矿⼯打包到区块(相当于正式的记了个账)

5. 接收⽅可以通过⾃⼰的私钥来验证⾃⼰对这条转账交易的拥有权(这句话⼀定要理解⼀下),通过⾃⼰的私钥和⽀票上的公钥转成的地址匹配,若能成功,就表明⾃⼰拥有这条交易事务转账的所有权,那么⾃⼰就能花这笔钱了。

这样的⼀个过程是通过什么来实现的呢,是通过⼀组脚本程序,在⽐特币中是⼀对锁定与解锁脚本,在以太坊中是更为复杂的编程脚本,总之,就是通过这样的程序逻辑实现了状态变更的触发条件,只要脚本程序写好,达到触发条件,程序就会严格的执⾏,刚正不阿,不留留半点情⾯面^_^。

那么,我们可以发现,这个程序,实际上相当于就是⼀份合约,大家约定了⼀个规则,符合规则了就照章办事,⽽具体是什么样的规则,这个是可以事先编写的(⽐特币中功能⽐较受限,⼀般也就能实现转账交易,以太坊则可以⾃定义编写各种合约规则),将这样的⼀份合约放在这样的⼀个去中⼼,分布式的环境中,由⽹络共识来保证不可篡改,这是多么创新的⼀个思路啊,这种可编程合约的思想可以⼴泛的应⽤于各种商业环境之下包括金融领域。

3. 应用特点

 

3.1 分布式网络

P2P⽹络本身就是⼀个分布式⽹络,区块链⽹络中并没有⼀个真正意义上的服务器,内部的运⾏逻辑也并不假设有服务器的存在。在区块链之前,也有过不少的分布式⽹络系统,⽐如⼤家很熟悉的电驴下载、BT下载,互联⽹初期的时候,⼤家都是到⽹站服务器去下载,下载的⼈多了,速度就会慢,因为占流量了或者说服务器更繁忙了,然而BT下载这种,确实下载的⼈越多,速度越快,我们不来详细的解析BT下载的具体技术细节,就光从⽹络结构上来讲,分布式的⽹络结构,使每个节点都既是使⽤者也是服务的提供者,也就形成了⼈多力量⼤的效果。

分布式⽹络中,首要的⼀个问题就是,如何保证数据的⼀致性,有些对数据的⼀致性要求不⾼⽐如⽹⻚资源,⽂件服务,早点晚点影响也不⼤;有些则希望在⼀个能承受的时间范围内达成⼀致,⽐特币就是这种,通常会建议发送⼀笔交易事务后,等待⾄少6个区块,原因就是6个区块后,数据基本上被⼤部分节点收纳的概率就很⼤了,还有⼀些对⼀致性的要求很即时,⽐如银⾏结算,不可能说要等段时间,账本才能⼀致,那对银⾏来说不能接受。

针对不同的使⽤场景,分布式⽹络也会不同的扩展,⼤家要注意的是,分布式⽹络并不是说完全没有中心,而是说在整个⽹络结构上是分散的,分布式的,但是每个单元还是有可能会存在中⼼的,毕竟在某些效率要求⾼的场合,中⼼结构的效率是最⾼的,这两者之间并不是互相对立的,⽽是互补的。

3.2 数据不可篡改性

我们可以反过来看⼀下,什么情况下数据是可篡改的。

⽐如数据都管理在⼀个服务器上,那⾃然是可篡改的,再怎么设置身份认证之类,只要突破进去就是⼀马平川了;

再⽐如数据虽然不在⼀个服务器上,但是对数据的验证是⼀个人说了了算的,⽐如现在很多的⽹站服务,⽐如各种电商⽹站啊,甚⾄包括银行(当然,不是说这些系统就会被随意的修改,这⾥只是参照⼀个例子),数据的管理权在⼀个管理员⼿中,数据怎么改并不需要得到其他不受⾃⼰控制的系统验证; 数据的记录权限在⼀个管理员⼿中,跟第二点类似,⾃⼰说了算;

区块链系统怎么保证数据不可篡改性的,对于第⼀点,区块链系统是分布式的,因此不存在⼀个明显的服务器目标;第二点,区块数据需要被⽹络中其他节点验证,⼤家都认可才会被记录在账本中由此达成共识,除非控制了大部分的节点,否则是不现实的;

对于第三点,区块链系统中使⽤各种共识算法,记账权不会掌握在⼀家⼿中,⽐如⽐特币的挖矿算法。

这种特性对于⼀些公众数据的记录是很有意义的,⽐如公证类数据,⽐如众筹账务,慈善款项等。

3.3 规则强制执行性

  • 代码即法律
  • 智能合约的条件执行

3.4  无边界价值转移

区块链网络可以创造一个可信任网络,可信任就表示有信用,而信 用是一切金融传递的基础

区块链系统可以自带金融属性,通过比特币的例子我们也能看到,它可以通过网络在全球各地进行转账交易,通过这种原理,不但可以传递货币,也可以传递其他任何的数字资产。

传统的比如游戏币,游戏道具,某平台的积分等,一定程度上也可以转移价值,但都是很难做到无边界传递的,而且其本身的信用程度也并不高,区块链⽹络⽆无边界,并且可以维持⼀个可信任的网络,这就为资产或者说价值的传递构造了一个成本相当低廉且传播很广泛的⽹络基础设施。

3.5  自治网络系统

这个其实是一个未来的愿景展望,可编程社会的一个基础模型

4. 应用场景

 

4.1 数字代币

比特币、莱特币、以太坊以及基于以太坊的各种合约代币

4.2 众筹合约

属于智能合约的 一种

4.3 跨境 支付

无边界的价值转移能力以及智能合约的特点,很适合应用在金融的跨境支付领域,目前的跨境支付手续繁杂,等待时间也很长,效率不  高,可以考虑在各国银行之间建立一个基于区块链的支付系统。

R3联盟

swift应用超级正本的fabric建立支付网络

4.4身份证明

使用区块链来构建身份管理系统

4.5去中心交易

目前的案例,Bitshares以及Openledger

基于区块链的交易系统,通过预言机创建链上资产,通过代码规则运行公开透明的交易逻辑

5.主流技术平台

5.1比特币

历史上第一个区块链系统,第一个加密数字货币系统,其他的系统基本都是在比特币的基础上开发的

5.2以太坊

数字货币+智能合约,既是一个数字货币系统,也是一个智能合约的开发平台

5.3超级账本

包含一系列的项目

比较著名的就是fabric,是一个面向商业的区块链系统开发框架,其本身其实并不是一个运行的区块链系统而是一套开发框架,一套开发用的半成品基础设施,是由Linux基金会主导的项目。
from:https://mp.weixin.qq.com/s/kuNtNekdsBYxoTtP6xxQqw