区块链入门系列文章

区块链基本概念和名词解释
P2P
共识算法
梅克尔-帕特里夏树
从零开始搭建区块链

这里写自定义目录标题

  • 区块链入门系列文章
  • 前言
  • 一切要从Web3说起
    • Web1时代特点
    • Web2时代特点
    • Web3时代特点
  • 区块链的特点
    • 区块
    • Hash
    • P2P
    • 共识算法
    • POW
    • 非对称加密算法
    • 币基
  • 智能合约
  • 总结

前言

至今(2022)从业已经10年了,作为一个IT老鸟,见证了移动互联时代的崛起,甚至参与其中充当一颗光荣的螺丝钉。其间各种各样的所谓新技术、新框架、新工具层出不穷,有的昙花一现,有的成功篡位,好不快哉。然而绝大部分的还是普普通通的打工人,没办法左右风向的发展,没办法掌舵所在大船的动向,没办法把所有的这些“新”的东西都学一遍,所以如何在这个技术浪潮汹涌澎湃的时代立足,是一个大家很关心的实际问题。我自己的应对策略就是四个字——拥抱变化,也就是对新的技术动向要保持一定的敏感性,刚开始时可以不用深入了解,只需要简单判断这个方向是否有发展前景,以及结合自身情况是否有入局的可能性即可。本系列文章,就是我在探索“区块链”这个方向的过程中,记录一些个人观点用的,若恰好能帮助到大家自然是不胜欢喜。

一切要从Web3说起

我没能亲历那个时代的风云激荡,但也深知那对于互联网世界来说是个混沌初开的时代,计算机算力慢,基础网络建设也不完善,还有各种网络协议百家争鸣,各个巨头画地而治,彼此的软件产品不兼容,即便是要展现一个很简单的内容,只要是跨平台了,也需要专门对此进行开发或适配工作,效率低到令人发指(当下看来)。

Web1时代特点

互联网刚新起,各种网络协议百家争鸣,万维网一统江湖,一时间各种Web1站点出现。大部分的站点都是宣传性质的,因为该领域内容相对固化,且图片较多易于展示,但是用户并不能通过展示的内容留下联系方式,或者选购展销方的商品,很不方便。另外,站在当下互联网高度发达的背景下,你可能无法想象一个非常简单的需求场景是如何解决的,即那会要更新网页内容该怎么办呢?如果是现在那肯定是登录管理后台对内容进行一顿编辑即可,可要回到那个时代却只能对网页本身的内容进行硬编码,也就说需要程序员们996敲代码编译出可执行程序发布到服务器进行更新(现代甚至有了CI/CD连发布的步骤也自动化了),简直是不便到极点。但不可否认的是,Web1的贡献还是划时代的,因为其主要解决了触达的问题,是一个从0到1的过程,在这之前都是各种CS架构的网络协议,至此互联网便上了高速公路,开启了飞速发展的时代。

Web2时代特点

Web2是从何时开始的我没找到相关文献和资料,但是它的特点一定是内容不是静态化的,而是动态化的。它解决了Web1时代的两大痛点,正如上文所说,在内容需要更新时只需要在后台直接操作即可而不用编写代码,以及用户可以自己产生内容可以和中心服务器进行动态数据交换。这个时代诞生了很多现在依然耳熟能详的公司,诸如Yahoo、Google等,这些公司大多因为解决Web2时代的某些痛点而得以发展壮大,如文中提到的两家公司就是解决爆发式增长的数据中检索数据不变的痛点,进而催生了搜索引擎。
你可能会说按照上述标准来界定,那我们跨入Web2时代已经几十年了,现在已经处于Web3了吧?可事实却是我们现在(2022)仍然停留在Web2时代,虽然现在的技术发展和刚步入Web2时代相比已经有了长足的进步,但这些都是在解决我们实际应用过程中的诸多不便,仅仅是技能树在不断往上点而已,比如:

  • 数据的存储早期都是自定义格式的,于是出现了数据库技术,统一了存储标准;
  • 每次流量接入都需要对数据库进行IO,效率较低,于是出现了缓存技术;
  • 数据流量过大服务器无法支撑需要进行横向扩展,于是出现了集群以及负载均衡技术;
  • 所有业务都在一个服务中,灵活性及可靠性低,于是出现了微服务技术;
  • 各服务间需要进行实时调用,于是出现了RPC技术;
  • 各种架构的物理服务器需要兼容,于是出现了虚拟机语言,出现了云原生;
  • 各个终端的算力越来越强大,于是出现了边缘计算;

以上都是在某个需求点出现瓶颈时的一个优化修补方案,有一个本质问题却从来没有进行过优化,即信任问题。不论上述技术点如何更迭,所有用户数据均是有中心服务器(或中心集团)控制着的,所以现在经常看到以下一些现象:

  • 在某平台莫名其妙就被封号了,虽然有相应的条款,但是他们对于条款有着最终解释权和执行权;
  • 在某平台注册了账号,然后就发现每天接到的推销电话多了,因为用户数据在平台,他们有着处置权;
  • 在平台A填写了个人信息,到平台B仍然需要重复填写,平台C、D…同理,数据无法互通(即便现在的OAuth2方案也没有解决本质问题);

Web3时代特点

天下苦巨头久矣,大家都在期待一场彻底的revolution,实现网络世界的“人人平等”,各平台规则透明化且说一不二承诺了绝对能兑现,数据仅属于生产者本身且这些数据可以在任意平台上通用。多么美好的构想,而这正式Web3的特点,如果要给Web3打几个标签,那我认为是,去中心化、不可篡改、智能合约、数据私有化、数据通用化,然而现在还没有正式步入Web3时代,因为这个时代的基础设施——区块链仍然在高速发展当中,有很多问题还亟待解决。一个概念是DeX,比如DeFi,其中De代表Decentralized即去中心化,Fi代表Finance,合起来就是去中心化金融,那么DeX就很好理解,就是去中心化XXX,正如第一次全面数字化进程一样,在Web3时代,各行各业也必将经历全面的去中心数字化变革。当所有的行业都完成了去中心数字化变革,那我们很有可能就实现了一个站在当下来看的“终极目标”——元宇宙(当然,仅解决了数据问题还远远不够,还需要神经学等学科的理论进行支撑),其实通过资本的布局也能初步感知到未来的发展方向在哪里,现在只要涉及到元宇宙概念的都受到追捧。总而言之,Web3时代已经初显其貌,各种变革前的技术推进也在迅速且有条不紊的持续发展着,厚积只为薄发,相信不久的将来就会全面步入Web3时代。

区块链的特点

通过上面的一大堆铺垫,总算知道了区块链的意义是啥了吧。之所以花这么大篇幅就为了讲清楚所谓的意义,是因为现在很多人听到区块链就想到虚拟货币,进而武断的认为是骗局。已经被妖魔化到如此地步了,自然需要从它的背后对于全人类的社会意义出发才能体会到它的宏伟蓝图。

区块

正如上文所言,区块链不是一个技术上的突破,它只是一个创新的概念而已,通过现有的技术手段实现这个概念就能够达到去中心化、不可篡改等特性。也就说甚至不排除今后的Web3不是通过“区块链”这样的概念来实现我们的目的,所以时刻明白区块链的意义尤为重要。那么接下来就针对当下寄予厚望的区块链,站在技术的角度对它展开剖析吧。

顾名思义,区块链也就是一个一个区块所组成的链条。和数据结构中的单向链表类似,区块链中就是通过previousHash(类似前指针)实现的“指向”,这里涉及到了Hash的概念。

Hash

对于技术人而言,这个概念应该不陌生。也就是散列算法(或摘要算法),其作用就是无论输入是什么,都会固定输出一串固定长度且唯一的字符串(MD5已有碰撞,SHA256目前还没有),只要输入改变哪怕1bit,输出的字符串也会天差地别。所以输入整个区块的内容就可以得到一个唯一的Hash值,这样一个个区块就像链条一样链接了起来。且由于是通过Hash值进行链接的,只要区块的内容改变哪怕1bit内容,计算出来的Hash值也就不同,进而会引发链式反应即该区块后的所有区块的Hash值都将发生变化。所以这在一定程度上来讲就是防篡改的,但这还不是真正意义上的无法篡改,只是篡改难度很大,牵一发动全身。

在单台终端上实现区块链到这其实就能实现一个0.1版本的了,我们还没实现去中心化这一特性,要实现这一特性就必然需要有效协同多台节点,使其能在同样的机制下运转,这里就要涉及P2P的概念了。

P2P

现在思维要跳出来了,刚刚是单节点的数据结构,现在需要多节点间的网络拓扑。类似这样的效果,节点间是通联着的,要么直接相连要么能通过若干个其他节点而相连。这些通联的节点内部都维护着上述的区块链数据,相当于把数据进行了无数份拷贝(可以想象现在的中心化架构中的主主集群)。这样一搞有意思的现象就出现了,在单一节点(甚至是少数节点)内,要想修改区块链中的数据不难,甚至是很容易,但是修改后的数据其他大部分节点不认可,因为大家工作在同样的共识算法下,即满足什么样的条件节点间才能达成共识进而同步数据。

共识算法

只要涉及到分布式架构,都离不开共识算法,也就是大家如何才能步调一致的协同工作。比如现在的中心化架构中,我们要部署Zookeeper集群,在多台ZK节点间就会涉及到共识算法,它使用的是ZAB算法。还有其他的知名共识算法诸如,Paxos、Raft、PBFT等,但是这些算法都有一个同样的弊端,就是共识步骤繁琐,需要多次数据交换才能达成共识,所以在节点数很大时就无法正常工作了。而区块链中的节点数又是很大的,动辄几十万上百万的节点数就意味着必须要找到一个适用于该场景的共识算法。POW算法则很好的满足于该场景(虽然其存在浪费能源的弊端),这里又涉及到POW算法。

POW

POW的全称是Proof Of Work,即工作量证明,什么意思呢?共识算法的本质就是要找出一个能“发号施令”的节点,POW直接给你出一道解出来很难但验证却很容易得数学题,只要你能解出来就能“发号施令”,其他节点也能很容易验证这道题解的答案是否正确,如果正确也就接受你得指令,反之拒绝指令。这道数学题需要用到上文我们讲得知识点,即Hash,这个算法不论什么输入都会产生一串定长且唯一的字符串,输出的字符串长什么样谁都没办法预测,那我给你规定你必须解出前N位都是0的Hash值就算找到了答案。输入数据是 “自增数+该区块的Hash”,由于没办法预测输出结果,且区块的Hash是定值,所以只能不断的用自增数去试,直到试出这个答案来。是不是有点傻傻的赶脚,但可别小看了它,如果让这个位数大一点,让一个算力好点的计算机都要算很久,而又正因为要算很久,才能有效保证大家有充足的时间达成“共识”。
到这里我们可以实现区块链的0.2版本了,但前文那么宏大的蓝图,要将世间万物都去中心数字化,就无可避免的涉及到数据,光说了区块并没有提及区块中的数据,那么区块中的数据是什么呢?答案是账本,这不是传统意义上的账本仅记录金钱或有价资源的转移,而是指任意数据间的动向,即任意数据从状态A变到状态B就被永久记录下来了,之后再变到状态C乃至DE…都可以在区块链的数据中寻找到一条可追溯的逻辑链条。
接下来要说的就是这些数据是谁提供的,如何证明他有资格提供这些数据,这就要涉及非对称加密算法了。

非对称加密算法

既然存在非对称加密算法,盲猜肯定存在对称加密算法。何谓对称加密算法,即加密和解密用到的密钥是一样的,那非对称加密就好理解了,简单了说就是加密和解密的密钥是不一样的呗。但非对称加密还不止这个特性,还存在如下特性

  • 通过私钥加密后,可以通过公钥进行验证是否是私钥加密的;
  • 通过公钥很难推导出私钥,但通过私钥却很容易推导出公钥;

所以公钥就可以在互联网上进行公开,而私钥则需要严密保护,当区块链提供数据时通过自己的私钥进行加密,上述P2P节点通过在互联网上公开的公钥进行验证即可得知这段数据是否具有提交资格,而这就正好解决了上述的数据提供资格问题。
截止目前我们已经可以实现区块链的0.3版本了,有一个值得思考的问题摆在眼前,即如何让各节点们自发的加入区块链,然后去解数学题,再将产生的数据记录到区块中?这就需要一个激励机制,如代币激励,每产生一个区块就给予一定的代币奖励,这个奖励也叫币基,而代币是具有经济价值的,这就能激励人们自发的加入区块链并按照规则进行解题,打包。

币基

币基又称Coin Base,这是区块链激励大家自发打包的基础。这些币基产生的代币就能在对应的区块链中进行流通,其作用就类似于现实生活中的法币。可是和法币不同的是,法币是由集权的中央政府进行印发的,可以根据经济活动适时的少发或者超发。一般而言,由政府作为信用背书的法币其流通性自然没问题,但由于政府的职能所限,在治理社会的过程中会涉及到很多政策性调控,而这些调控手段大都和法币相关,通过发行法币来达到一些调控目的。这就导致法币的保值率无法得到保证,而区块链中的代币由于在上限之初便约定好要发行的数量,永远不会超发,稀缺属性与生俱来,随着经济水平的提升其保值率大概率是上升的。之所以没说必然上升,是因为这又涉及区块链以外的场景,比如这个链没人用了等。本文不讨论法币和虚拟代币之间孰优孰劣,这只是历史进程中的一些必然产物而已,静待发展即可。
截止目前我们已经可以实现区块链的0.4版本了,既然要去中心化万事万物,那必然得是动态的,正如Web1和Web2之间的区别,只有动态生成或执行一些扩展性代码,才能很好应对变化无穷的世间万物,区块链的解决方案就是引入了智能合约的概念。

智能合约

即Smart Contract,也叫智能合同。现实世界无处不在的合同,要放到区块链的世界自然也需要合同。但是现实世界的合同往往是不可靠的,所以各种合同纠纷屡见不鲜,而区块链世界的智能合同则不一样,因为合同本身就是数据,在基于上述无法篡改的特征,只要合同一旦发布就无法篡改。比如A欠B10块钱,B欠C10块钱,有一份智能合约约定B只要收到10块钱则自动转账给C,现实生活中B可能会赖账,但区块链的世界只要接收到10块钱,智能合约被触发就会自动的执行约定好的内容,即向C转10块钱,就问你牛13不牛13。当然要实现能执行动态程序,需要所在的区块链是图灵完备的。以下引用自百度百科

图灵完备是指在可计算性理论里,如果一系列操作数据的规则(如指令集、编程语言、细胞自动机)可以用来模拟单带图灵机。

站在技术层面看就需要涉及沙箱技术、虚拟化技术、编译技术等作为技术前提,才能实现图灵完备性。就目前来看,业界普遍认为支持智能合约的区块链就属于区块链2.0的产物。

总结

具备以上知识储备,在具备一定的编码能力基础上就可以实现区块链的0.5版本了。上面不都还说支持智能合约就算2.0吗,怎么现在又0.5了?因为那是指线上成熟的公链们支持智能合约,如果是你开发构建一套区块链,你认为是成熟的吗,我认为大概率不是。因为要实现成熟的区块链还需要解决诸如区块内部的数据篡改问题、大量区块数据的检索问题、分叉问题、双花问题等等等等,要解决这些问题又需要涉及其他大量的知识点。对于一般的区块链入门教程来说,由于受众都是新手,所以普遍以基本概念为主,如果对于细微的技术细节比较感兴趣,那建议可以直接阅读比特币、以太坊或EOS的源码。所以之后的章节,我们讲解从零开始构建区块链时,会讲理论和实现但不会涉及细微的技术细节,换句话说就是不具备工程特性。