首页 > 其他分享 >初识区块链 如何在去中心化网络中形成共识

初识区块链 如何在去中心化网络中形成共识

时间:2022-10-20 15:46:19浏览次数:66  
标签:比特 初识 哈希 共识 中心化 区块 节点

本文将从日常生活如何形成共识,类比到在每个人都可以伪装自己的身份的网络上如何构建共识。再以此谈谈区块链网络中是如何做的,以及这种共识是怎么构成区块链的基石的。最后聊聊区块链衍生出来的联盟链、私有链。本文写于看完肖臻教授的区块链公开课后的一周,折服于区块链巧妙的设计思想,希望能用简单而容易理解的语言聊聊对区块链思想的个人认知。

问题的引入

从业主们的小区投票说起

某天,一个小区的业主形成了业主委员会,每户均参加进来进行小区自治。为了公平,每个事项都由投票决定。规则设定面临着这些问题:

  1. 业主与业主之间互不认识,如何确保投票的人不是冒名顶替的?——带身份证投票
  2. 投票如何确保没有猫腻,是否会有人偷偷修改票数结果?——公信力第三方监督,或者所有人共同监督
  3. 投票形成某个决议后,如何确保决议的强制力,让本来投了反对票的业主也要执行?——预执行,如先预收款,再根据投票决议决定款项使用方式。或者由第三方机构如物业执行,款项通过物业费分担

去中心化的超大型虚拟社区

以上方案在普通社区中都能有简单直接的解决思路,但这些做法依赖于一个中心化的机构,政府或者物业。中心化是指,每个人涉及的操作都需要通过该机构才能执行,比如发身份证、监督投票结果、预收款到一个账户中。业主之间是互不认识的,可以互不信任,但出于对这些中心化机构的信任,业主才会觉得整套机制是可行的,才愿意参与进来,一同投票形成共识。

但如果,这些中心化机构并不存在呢?比如说,将“小区”这个界限抹除,就是一群人,想要针对某个事情,得到一个能形成共识的方案,并且一起执行,但这一群人天南地北,甚至位于不同国家,没有一个所有人都信任的机构帮忙协调,该怎么办?

这个场景并不是一个无意义的假设,网络将不同国家的人关联到一起,地域的区别被抹除了,互相之间没有一个足够信任的权威政府机构,而出于隐私和数据霸权等方面的考虑,又不愿意让一个跨国服务的大型互联网企业充当这个权威机构。这种去中心化场景下如何构建信任并形成共识就成了一个问题。

共识如何达成

密码学基础

密码学的几个工具,构建了区块链网络达成信任的基础。这里只介绍特性,具体的数学证明不涉猎。

  • 区块链用到的哈希函数:一个函数,将输入x(一段信息)转换为输出y(哈希值),且具有以下特性

    • 抗碰撞性:两个不同的输入,几乎不可能产生相同的输出。换而言之,两个输出y相同,就可以认为两个输入x也是相同的
    • 隐秘性:正向计算(给出x,算y)很简单,但反向计算(已知y,想倒推x)几乎不可能
    • 输出无法预测:x的稍微一丁点改变,y就会有很大变动。再加上隐秘性,如果只有y没有x,想算出x,只能对所有可能的x,一个一个可能去试,没有捷径

    常见应用:

    1. 校验:A时间节点拿到某个信息的哈希值,B时间节点拿到这个信息,可以代入哈希函数重新计算一下这个信息的哈希值,如果和A节点拿到的哈希值一致,可以认为这段时间内信息没被篡改过。
  • 非对称加密体系:加密即通过某一个算法和自己的密钥,将一段明文转换为密文,这个密文别人拿到后无法读取或理解,只有通过密钥和解密算法解密后才能重新变成可以被理解的明文。密钥相当于一段密码。非对称加密,即密钥有一对,私钥与公钥。用私钥加密则用公钥解密,用公钥加密则用私钥解密。私钥是自己藏着不公开的,公钥是可以完全公开的。

    常见应用:

    1. 两人之间的加密通信:用对方的公钥加密信息,因为只有对方的私钥才可以解密,而私钥不公开,确保信息只有对方可以读取
    2. 数字签名:将某个信息,用自己的私钥加密,发给别人后,别人可以用公钥解密查看信息。如果正确解密,则说明这个信息一定是由持有“我的私钥”的人确认过的,从而起到类似于签了个名的作用。实际操作中,不是直接将信息加密,而是将信息的哈希值加密,别人将这段哈希值解密出来,再将实际信息算一下哈希做比对,可以确认被签名的数据没经过篡改。(当然,前提是私钥未泄露,有私钥的人即可认为是本人)

将小区搬到去中心化网络上

假设在网络上,没有了这些中心化机构,小区业主需要投票得出决议,前文中遇到的问题该如何解决。这里抹掉“小区业主”这个身份(“业主身份”是与线下强关联的,没法仅仅在互不信任的网络上解决),将“发起投票”改为“发布信息”,将“形成决议”改为“达成共识”(这里的共识不一定是像投票那样n个方案选一个,可以是对所有收到的信息都确认共同认可是真实有效的),问题抽象为:一群人在去中心化的网络上,每个人都可以发布信息,但每个人互不信任,每个人都可能有恶意,如何得出共识并确保执行。这么抽象后,前文的问题可以论述为:

  1. 网络是虚拟的,如何确保信息是本人发布的且未经篡改?——数字签名,投票人对投票的信息做数字签名,即可被验证该信息是否来自本人
  2. 如何确保共识结果的不被篡改?——共同监督+哈希函数。每人都会对收到的共识结果进行验证,验证符合预定的规则才会接受。接受后的共识会计算出哈希值,下一个共识诞生时会将上一个共识的哈希值附上。因为每个共识的哈希值会出现在下一个共识中,没法回头偷偷篡改以前的共识,篡改后哈希对应不上会被发现
  3. 如何确保共识的强制执行?——执行结果哈希+惩罚机制。共识的执行结果的哈希值也会附在下一个共识中,如果有人偷偷不执行,下一轮共识校验时会发现他的哈希值不对,所有人都不再会接受他,他以后无法再参与进区块链中

区块链的共识

前文已经出现了区块链设计的雏形。最开始比特币(BTC)的设计就是作为电子现金系统,区块链用于记账,即对于比特币来说,发布的信息是每一笔转账信息,形成的共识是对这一段时间内的所有转账信息的确认,认可这些转账真实有效,并在每个人的账户上进行实际的余额增减。后来出现了以太币(ETH),ETH带来了智能合约,发布的信息不局限于简单的转账,可以是一段代码,比如满足了某种特定条件后自动转账。此时形成的共识是对这段代码的确认,检查代码是否有效,并且确保代码被执行。

前文还有一个关键问题没解决:如何形成共识?因为区块链设计之初是为了作为货币进行交易,所以目标与“投票”不同,不是为了选一个合适方案,而是为了确认每个转账交易的合法性。因此,难点不在“怎么选”上,所有交易只要能通过数字签名校验,确保发布交易的人是拥有这些币的人就行。在这么一个分布式的网络,因为网络延迟,交易发布之后,每人收到交易的时间是不同的。所以每人某个时间点,收到的总交易是不一致的,如果每个人都可以记账就乱套了。因此实际难点在于谁有权记账上,他记账后,发布出去,其他人验证,验证没问题就接受,共识就达成了。

如果按照传统分布式系统的做法,这里可能会随机指定一个人记账,反正记账这件事本身只是很小的工作,而且大家都会验证确保记账结果没问题。但在去中心化系统中,随机指定会面临这些问题:

  • 整个去中心化系统有多少人参与进来是不确定的,因为没有一个中心化机构登记账户,所以随时有人参与或者离开,如何确保随机选取一个是困难的
  • 同样因为没有一个中心化机构确保一人一个账号,去中心化系统账号多开是很容易的,恶意用户可以生成大量账号,增大拿到记账权的几率,并发布错误的账本校验结果,直接干扰校验过程。(注意,前文说的数字签名不同,数字签名能确保A无法假冒B发布信息,但无法阻止A生成多个身份A1 A2 A3发布信息。实际上一对公私钥代表一个身份,一个人可以有多对公私钥)

比特币的做法是,将记账权的分配与一个难以多开的属性关联起来——算力。算力强的用户拿到记账权的几率大,要多开只是实打实地买机器增加算力,成本高昂。如何做到关联呢?每个用户消耗算力不断计算一个很难的puzzle,先解出来的用户拥有记账权。

这样记账权的选择是有方案并且能避免恶意攻击了,但带来了另一个问题,记账权的选择是极度消耗算力的,也意味着是很耗钱的,如何让人们愿意花这笔钱?通过激励来做到,比特币既然是货币,可以给获得记账权的人奖励比特币。只要奖励的比特币价值超过争夺记账权花的钱,人们就愿意参与进来。

比特币介绍

比特币全流程

这里梳理一下前文逐步完善的整个流程:

在比特币网络中,每个人都可以自由发布转账,通过数字签名确保无法假冒别人发布信息。每个人都会收到别人发布的转账交易,每人都验证收到的交易是否合法(校验数字签名等),合法则打包进区块(可以理解成一个小账本)中。并且,给这个区块多增加一个交易(出块奖励):凭空给自己账户转钱(即出块奖励,矿工挖矿的主要收益来源)。同时,每个人都在计算puzzle(即挖矿),先算出来的可以发布区块。其他人收到区块后对整个区块做校验,没有问题就接受,从而形成了共识:区块内包含的所有交易信息和矿工给自己账户的奖励,都是认可为有效的。

一个区块的发布,就确认了一批交易。发布后又开始计算新一轮puzzle,发布下一个区块,确认新一批交易。每一个区块的发布都带来了凭空新产生的比特币,实现了比特币的货币增发,增发的货币给到矿工作为激励。并且,每一个区块里,都是附上上一个区块的哈希值,以确保已经发布的区块无法被篡改。

其他细节问题,这里做简单介绍,详细了解看肖臻教授的区块链公开课:

  • 如何加入比特币网络?——没有一个中心化的注册机构,自己生成一对公私钥就可以参与。转账是从一个钱包地址转到另一个钱包地址,钱包地址是由公钥生成的
  • 每个人都可以自由发布转账,如何检查转出方真的有钱?——转账时要求说明转出的钱是来源于以前哪个交易得到的。因为所有比特币构成了一条链条且以往发布的区块无法篡改,这里可以校验转出的钱是否真的存在
  • 这个puzzle是什么?——指定一个y',需要求一个x,使得“x+区块信息”的哈希值小于或等于y'。求解这个puzzle只能对所有x逐个尝试,直到突然遇到一个x符合要求
  • 比特币如何控制总量避免通胀?——每隔21万个区块后出块奖励会减半,比特币的发行依靠区块的奖励,比特币总量也就是奖励总量,可以算出总量是2100万个。因为货币总量限死了,最后不会有超发,抑制了通胀(但不一定是好事)

比特币的魅力

与传统分布式系统的共识区别

传统分布式系统是这么做的:

  1. 加入这个分布式网络是有门槛和身份验证的,需要通过某种方式确认加进来的节点是合法的,并且因为验证过身份,通常认为没有恶意节点
  2. 随机或者通过某种策略选取主节点,后续以该主节点给其他节点分配任务
  3. 如果主节点失效,再重复2的步骤重新选

节点是可以信任的,一切就变得很简单。但如果节点不可被信任,那第二步就有问题,主节点如果有恶意,整个系统就崩溃了。区块链的厉害之处在于,在一个互不信任且存在恶意节点的网络中,强行构建出了共识。比特币有个假设,有恶意的节点是少数(算力不超过总算力50%)。根据算力争夺记账权,绝大部分时间好节点能拿到记账权,即使有时恶意节点拿到了,还有各种密码学相关的校验,不通过则好节点不接受。好节点不接受不意味着系统无法运作,因为还有别的节点在计算puzzle,还在努力获取记账权。比特币将“随时竞争上岗,一旦出错就下岗”搬到线上了。

共识——构建了比特币的根基

密码学基础提供了各种校验,提供了不信任网络中产生信任的根基。挖矿是必要环节,保证了在网络节点可能存在恶意的前提下,比特币的正常运行。而挖矿的动力来源于比特币的价值,来源于比特币值多少钱。比特币的价值来源于市场的认可。比特币本身只是人为设计出的货币和记账系统,没有任何抵押物,也没有政府信用背书,全靠密码学基础和设计的运作系统确保良好运行。人们对比特币的认可(也就是共识)才能使得比特币能成为货币,没有了认可比特币只是一文不值的数据。

比特币的精巧设计使得他有成为货币的潜质,初期的一些炒作抬起了比特币的价格,资本进场后推动了正循环。值钱的比特币使得大量矿工涌入,涌入的矿工导致总算力大幅上涨,也极大程度提升了比特币系统的安全性,因为此时恶意节点想要占据大量算力几乎不可能。比特币系统安全性得到保障后,其他的不可篡改、去中心化等的特征也使得越来越受欢迎,应用也越来越广,甚至进化到不局限于货币与记账功能。区块链的广泛应用又进一步提升了比特币的价值,构成了正循环。

但这个正循环的根基还是在共识上,这是隐隐的危险。假如说将世界上99%的比特币都送给一个人,那他要不要?不要,因为这是没有意义的。一旦失去了活跃的交易市场和使用市场,比特币的价格将大幅下滑。挖矿收获的比特币的价值还比不上耗费的钱,那么矿工将不再愿意挖矿,算力大幅下滑将使得恶意攻击变得很容易,一旦恶意攻击成功,人们会发现比特币不再安全,比特币价值进一步下跌,这是一个更狠的正循环,万劫不复那种。许多做着一夜暴富的梦来炒币的人,一定程度上保证了比特币的安全。如果没有他们,纯靠笃信比特币技术的人来支持,那比特币绝对走不到今天的程度。

这也是除了主流的加密货币,不要碰山寨币的原因。没人能清楚山寨币的信任危机会在什么时候出现,也许一次价格操控急剧下跌,就触发了大幅抛售和信任崩塌。

从BTC到ETH

比特币局限于货币和账本,后来出现的新一代加密货币以太币(ETH),发布的信息不限转账交易,可以是一段代码,即智能合约。此时每个矿工从“验证交易打包进区块”变成“执行代码将执行结果打包进区块”。因为代码被打包进了区块链,这种代码具有强制执行、不可篡改的特性。强制执行,满足条件就会被矿工执行,没法抵赖,这解决了无信任场景下签订合同的一大难题,对于去中心化的拓宽信任至关重要。不可篡改,同样可以强化信任,不过也有另一个问题,一旦代码发布了就无法修改,如果代码有漏洞,可能被黑客利用造成资金损失,同样也无法修复。实际案例可以查一下ETH的DAO例子。

智能合约的出现使得区块链的应用场景极大拓宽,如:DeFi去中心化金融(Decentralized Finance),DApp去中心化应用(Decentralized Application)等,本质上都是将具体逻辑部署到区块链上,利用强制执行和不可篡改的特性。

公链、联盟链、私有链

公链是最早期区块链的形态,也是应用范围最广的。公链中各个节点可以自由加入和退出,完全去中心化,像比特币、以太坊等等加密货币都是公链。

联盟链,不是完全去中心化,节点的加入需要得到许可,共识过程也可能受某些节点的控制。通常是一些机构联合组成的链,因为节点加入有验证,所以一般认为恶意节点很少出现。记账权也不需要激励机制,一般不用工作量证明和代币,可以用PBFT、RAFT这些共识算法。

私有链,整个区块链的权限掌握在一个机构中,内部自行搭建的区块链。

个人看来,公链才是区块链真正该有的形态,私有链就是蹭热度的噱头没任何意义,联盟链可以看应用场景,但大部分情况下也是可有可无。区块链最大的优势是在不受信任有恶意节点也不方便建立中心化节点的网络中建立信任和共识,劣势是建立共识的过程得耗费大量资源做无关工作导致效率不高。像私有链,都私有了还做区块链干嘛,直接搭一个数据库不好吗?虽说私有链、联盟链可以不用工作量证明,效率可以比较高,但再高也高不过传统分布式方案。抛弃成熟的传统方案,强行搭区块链,除了能用个高大上的名词忽悠行外人,没带来任何优势。

联盟链也许还有一个场景可以用到,如果多个机构互相平行,没法有人牵头搞一个传统方案,但拿出区块链也许可以打动各个领导共同来做。但本质上这不是技术问题,技术上此时区块链并不是最优解,只不过区块链看似高大上的名气吸引了人。另外,公链去中心化的特征也使得在国内发展受限,许多从业人员被迫转为做联盟链等。但从技术上来说,我依然坚决认为公链才是区块链的未来,私有链几乎在所有场景下都是炒作。

数字藏品NFT、Web3.0

个人认为,这又是炒作远大于实际意义的两个概念。数字藏品是将某个数字文件的所有权记录到区块链上,本来只是区块链爱好者的一个小动作,被炒作拉高价格成为投机界的狂欢。而国内数字藏品不允许交易,抛却了投机属性竟然还能有虚高的价格,属实不能理解。Web3.0更是如此,以去中心化为目标,只有一个模糊不清的概念,但还是有那么多公司蹭热度割韭菜。

标签:比特,初识,哈希,共识,中心化,区块,节点
From: https://www.cnblogs.com/victorsu/p/16810088.html

相关文章

  • Linux初识及常用命令
     持续更新中!!环境:contos7一、目录结构在linux系统中,一切皆文件目录说明/根目录,所有文件都在bin存放常用的程序文件(命令文件)boot存放引导系统启动的文件(boot配置文件,内核和其......
  • 初识内存池
    在程序开发过程中,我们总会涉及到一个概念,那就是内存管理(一般值堆内存)。一旦由内存使用和管理不当导致程序运行宕机,会发生无法预测的灾难。内存问题分析比较困难,因为大......
  • 模块的初识
    今日内容概要索引取值与迭代取值的差异模块简介导入模块的两种句式导入模块的句式补充循环导入问题及解决策略判断文件类型模块的查找顺序模块的绝对导入与相对导......
  • 0 基础晋级 Serverless 高手课 — 初识 Serverless(上)
            应用-无服务器  2017-2006函数即服务类似云计算(Serverless)  faas函数服务+后端数据库账号服务   弹性,按量       服务器,客户端的终......
  • 初识反射
    反射:Reflection对象------>类信息Class类是一切反射的根源。Class类表示什么?很多的人---可以定义一个Person类(有年龄、性别、姓名等)很多的车---可以定义......
  • 初识Kafka
    Kafka是一个多分区、多副本且基于ZooKeeper协调的分布式消息系统Kafka之所以受到越来越多的青睐,与它所“扮演”的三大角色是分不开的:消息系统:Kafka和传统的消息中......
  • linux初识
    目录运维的本质计算机的种类服务器品牌服务器内部组成磁盘列阵操作系统运维的本质运维:运行维护应用程序岗位需求:自动化运维,DBA,docker+k8s……运维职责:尽可能......
  • 浅谈区块链应用中的密码学原理
    你印象中的区块链是什么?比特币、以太坊等加密货币?这样的理解是片面的,可以这么说比特币是区块链最成功的应用。当然基于区块链的去中心化共识的应用层出不穷,下面将举几个应......
  • 1110 区块反转(JAVA)
    给定一个单链表L,我们将每K个结点看成一个区块(链表最后若不足K个结点,也看成一个区块),请编写程序将L中所有区块的链接反转。例如:给定L为1→2→3→4→5→6→7→8,K为......
  • 一、初识Vue
    1.想让Vue工作,就必须创建一个Vue实例,且要传入一个配置对象(el,data)(newVue({这里是配置对象}))2、root容器的代码依然符合html规范,只不过混入了一些特殊的Vue语法3、root容......