发布网友 发布时间:2024-09-26 18:41
共1个回答
热心网友 时间:2024-10-26 08:45
区块链的核心技术:共识机制&智能合约不论你是否接受,未来终将改变。
区块链技术给数字经济时代带来了巨变的曙光。
这种巨变在互联网近50年的历史上曾发生过两次。第一次巨变是全球性的联
网……第二次巨变是全球性的应用……第三次巨变正在蕴酿。
————摘自《腾讯区块链方案白皮书》?
当第一次读到这段时,完全不敢想象这是一家世界级企业对一项新技术的评价,
瞬间引起了我的兴趣。“巨变”是什么含义?就是说完全有可能颠覆我们现有的
经济结构和认知,彻底改变我们的生活方式。
一种从2009年才诞生的比特币技术中抽象而来的blockchain(区块链)技术,
居然获得了这么高的评价,这难道不是很神奇的一件事么?不管这件事会不会发
生,已经令人非常激动了,我们正在迎接一项变革并且可能参与其中,不是任何
时代的人都有这种机会,何其幸运!
不论你是否接受,未来终将改变。全球众多经济学家、企业家、国家政要都在推
崇区块链,声称区块链技术将重塑商业、货币和世界,将颠覆互联网、银行、证
券、保险、物流、电力、制造、会计税收、法律服务、文化创业、医药卫生等众
多行业。
虽然说到“区块链”,大家都会提到“去中心化”,也举了很多形象的例子。但
是我是一个较真的人,希望能够找到大家做出这种判断,背后的逻辑到底是什
么?就需要搞懂一切推断背后的本质,就需要了解区块链的核心技术逻辑。
阅读了一些书籍和资料之后,抛开“比特币”不说,要了解区块链,有两个核心
名词:共识机制、智能合约。
共识机制是区块链技术的核心,要搞清楚”共识机制“,就不得不提著名的“拜
占庭将军问题”,拜占庭将军问题由莱斯利·兰伯特提出的点对点通信中的基本
问题,主要是用于分析在分布式节点传输信息时如何保持数据的一致,即共识这
个问题。
拜占庭将军问题
一组拜占庭将军分别各率领一支军队共同围困一座城市。为了简化问题,将各支
军队的行动策略限定为进攻或撤离两种。
因为部分军队进攻部分军队撤离可能会造成灾难性后果,因此各位将军必须通过
投票来达成一致策略,即所有军队一起进攻或所有军队一起撤离。因为各位将军
分处城市不同方向,他们只能通过信使互相联系。
在投票过程中每位将军都将自己投票给进攻还是撤退的信息通过信使分别通知其
他所有将军,这样一来每位将军根据自己的投票和其他所有将军送来的信息就可
以知道共同的投票结果而决定行动策略。
系统的问题在于,将军中可能出现叛徒,他们不仅可能向较为糟糕的策略投票,
还可能选择性地发送投票信息。这样各支军队的一致协同就遭到了破坏。由于将
军之间需要通过信使通讯,叛变将军可能通过伪造信件来以其他将军的身份发送
假投票。而即使在保证所有将军忠诚的情况下,也不能排除信使被敌人截杀,甚
至被敌人间谍替换等情况。因此很难通过保证人员可靠性及通讯可靠性来解决问
题。
假始那些忠诚的将军仍然能通过多数决来决定他们的战略,便称达到了拜占庭容
错。
拜占庭将军问题被认为是容错性问题中最难的问题类型之一。在一个有n个节点的
系统中,每一个节点都有一个输入的值,其中一些节点具有故障,甚至是恶意
的。
在分布式计算中,不同的计算机通过通讯交换信息达成共识而按照同一套协作策
略行动。但有时候,系统中的成员计算机可能出错而发送错误的信息,用于传递
信息的通讯网络也可能导致信息损坏,使得网络中不同的成员关于全体协作的策
略得出不同结论,从而破坏系统一致性。
但是中本聪在设计比特币系统时应用的“工作量证明链”(PoW)模型很好的解决
了共识问题,至于什么是“PoW”,感兴趣的可以研究下。
智能合约是一套以数字形式定义的承诺(promises),包括合约参与方可以在
上面执行这些承诺的协议。一个合约就是存在区块链里的程序。合约的参与双方
将达成的协议提前安装到区块链系统中。在双方的约定完成后,开始执行合约,
不能修改。至于合约执行所需要的“燃料”,也就是手续费,也需要提前支付。
智能合约可以解决日常生活中常见的违约问题,如果应用到各行业中,可以避免
违约的信用问题。
在区块链出现之前,商业领域的信任关系通常要依赖于正直、诚信的个人、中介
机构或其他组织才能建立起来。在区块链这个新兴的领域中,信任关系的建立是
基于网络,甚至是网络上的某个对象。由区块链驱动的智能合约将会要求双方遵
守他们的承诺。
在区块链体系中,共识机制和智能合约,保证了数据的真实性和合约执行力,实
现“去中心化”。当然还有很多技术层面的东西没有说到,感兴趣的可以深入了
解下。
虽然大部分人对于区块链的认知还停留在比特币、各种代币上,也就是对金融行
业的变革。但是了解区块链核心逻辑后,结合自己所在的行业“区块链+”,区
块链的各行业的应用刚进前半场,相信都会想到很多好的创新方向。
区块链核心技术-P2P网络点对点网络是区块链中核心的技术之一,主要关注的方面是为区块链提供一个稳定的网络结构,用于广播未被打包的交易(交易池中的交易)以及共识过的区块,部分共识算法也需要点对点的网络支撑(如PBFT),另外一个辅助功能,如以太坊的消息网络,也需要点对点网络的支持。
P2P网络分为结构化和非结构化网络两类。结构化网络采用类似DHT算法来构建网络结构;非结构化网络是一种扁平的网络,每个节点都有一些邻居节点的地址。
点对点网络的主要职责有维护网络结构和发送信息这两个方面。网络结构要关注的是新节点的加入和网络更新这两个方面,而发送信息包括广播和单播两个方面
如何建立并维护点对点的整个网络?节点如何加入、退出?
网络结构的建立有两个核心的参数,一个是每个节点向外连接的节点数,第二个是最大转发数。
新节点对于整个网络一无所知,要么通过一个中心的服务获取网络中的一些节点去连接,要么去连接网络中的“种子”节点。
网络更新处理当有新节点加入或者节点退出,甚至原来一些节点网络不好,无法连接,过一段时间又活了,等等这些情况。一般通过节点已有的连接来广播这些路由表的变化。需要注意的是,因为点对点网络的特殊性,每个节点的路由表是不一样的(也叫partialview)
广播一般采用泛洪协议,即收到转发方式,使的消息在网络中扩散,一般要采用一些限制条件,比如一条消息要设置最大的转发数,避免网络的过渡负载。
单播需要结构化网络结构支持,一般是DHT,类似于DNS解析的方式,逐跳寻找目标节点地址,之后进行传输,并且更新本地路由表。
要想快速检索信息,有两种数据结构可以使用,一种是树类型,如AVL树、红黑树、B树等;另外一类是hash表。
哈希表的效率比树更高,但是需要占用更多的内存。
信息的表示采用键值对的方式,即一个键对应一个值,我们要查找的是key,值是附着的信息。
哈希表要解决的问题是如何均匀地为每一个key分配一个存储位置。
这里面有两个重点:1.是为key分配一个存储地点,这个分配算法是固定的,保证存储的时候和查找的时候使用同一个算法,不然存进去之后会找不到;2.是均匀地分配,不能有点地方存放数据多,有点放存放数据少。
一般语言里面的hashtable、map等结构使用这个技术来实现,哈希函数可以直接使用取模函数,key%n,这种方式,n代表有多少个地方,key是整数,如果key是其他类型,需要先进行一次哈希,将key转为整数。这种方式可以解决上面的两个需求,但是当n不够大的时候(小于要存储的数据),会产生冲突,一个地方一定会有两个key要存储,这时候,需要在这个地方放一个链表,将分配到同一地点、不同key,顺序摆放。当一个地点放的key太多后,链表的查找速度太慢,要转化为树类型结构(红黑树或者AVL树)。
上面说过,哈希表效率很高,但是占用内容,使用多台机器就可以解决这个限制。在分布式环境中,可以将上述的地点理解为计算机(后面成为节点),即如何将一个key映射到一个节点上,每个节点有一个节点ID,即key-nodeid的映射,这个映射算法也要固定。
这个算法还有一个非常重要的要求,即scalebility,当新节点加入和退出时候,需要迁移的key要尽量少。
这个映射算法有两种典型结构,一个是环形,一个是树形;环形的叫一致性哈希算法,树形的典型叫kademlia算法。
选点算法就是解决key-nodeid的映射算法,形象的来说就是为一个key选择它生命中的她(节点)。
假设我们使用32哈希,那么总共能容纳的key的数据量是2**32,称之为hash空间,把节点的ID映射成整数,key也映射成整数。把key哈希和节点哈希值接的差值的叫做距离(负数的话要取模,不用绝对值),比如一个key的哈希是100(整数表示),一个节点的哈希是105,则这两个的距离是105-100=5。当然使用其他距离表示也可以,比如反过来减,但是算法要固定。我们把key映射(放到)距离他最近的节点上。距离取模的话,看起来就是把节点和key放到一个环上,key归属到从顺时针角度离它最近的节点上。
kademlia算法的距离采用的是key哈希与节点哈希异或计算之后的数值来表示(整数),从左往右,拥有越多的“相同前缀”,则距离越近,越在左边位置不一样,距离越远。
树结构的体现是,将节点和key看成树的节点,这个算法支持的位数是160bit,即20个8字节,树的高度为160,每个边表示一位。
选点的算法和一致性哈希相同,从所有节点中,选择一个距离key距离最小的节点作为这个key的归宿。
由于是在分布式环境中,为了保证高可用,我们假设没有一个中心的路由表,没有这个可以看到全貌的路由表,带来了一些挑战,比如如何发现节点、查找节点?
在P2P网络中,常用的方法是每个节点维护一个部分路由表,即只包含部分节点的路由信息。在泛洪算法中,这些节点上随机的;在DHT算法中,这个路由表是有结构的,维护的节点也是有选择性的。那么如何合理的选择需要维护路由信息的节点呢?
一个朴素的做法是,每一个节点保存比他大的节点的信息,这样可以组成一个环,但是这样做的话,有一个大问题和一个小问题。大问题是,每个节点知道的信息太少(只有下一个节点的哈希和地址),当给出一个key时,它不知道网络中还有没有比它距离这个key距离还短的节点,所以它首先判断key是否属于自己和下一个节点,如果是,那么这个key就属于下一个节点,如果不是就调用下一个节点同样的方法,这个复杂度是N(节点数)。一个优化的方法是,每个节点i维护的其他节点有:i+21,i+22,....i+2**31,通过观察这个数据,发现由近到远,节点越来越稀疏。这样可以把复杂度降低到lgN
每个节点保存的其他节点的信息,包括,从左到右,每一位上与本节点不同的节点,最多选择k个(算法的超参数)。比如在节点00110上(为演示起见,选择5位),在要保存的节点路由信息是:
1****:xxx,....,xxx(k个)
01:xxx,....,xxx(k个)
000:xxx,....,xxx(k个)
0010:xxx,....,xxx(k个)
00111:xxx,....,xxx(k个)
以上为一行称为k-bucket。形象的来看,也是距离自己越近,节点越密集,越远,节点越稀疏。这个路由查找、节点查找的算法也是lgN复杂度。
区块链的核心技术是什么?区块链运作的7个核心技术介绍
2018-01-15
1.区块链的链接
顾名思义,区块链即由一个个区块组成的链。每个区块分为区块头和区块体(含交易数据)两个部分。区块头包括用来实现区块链接的前一区块的哈希(PrevHash)值(又称散列值)和用于计算挖矿难度的随机数(nonce)。前一区块的哈希值实际是上一个区块头部的哈希值,而计算随机数规则决定了哪个矿工可以获得记录区块的权力。
2.共识机制
区块链是伴随比特币诞生的,是比特币的基础技术架构。可以将区块链理解为一个基于互联网的去中心化记账系统。类似比特币这样的去中心化数字货币系统,要求在没有中心节点的情况下保证各个诚实节点记账的一致性,就需要区块链来完成。所以区块链技术的核心是在没有中心控制的情况下,在互相没有信任基础的个体之间就交易的合法性等达成共识的共识机制。
区块链的共识机制目前主要有4类:PoW、PoS、DPoS、分布式一致性算法。
3.解锁脚本
脚本是区块链上实现自动验证、自动执行合约的重要技术。每一笔交易的每一项输出严格意义上并不是指向一个地址,而是指向一个脚本。脚本类似一套规则,它约束着接收方怎样才能花掉这个输出上锁定的资产。
交易的合法性验证也依赖于脚本。目前它依赖于两类脚本:锁定脚本与解锁脚本。锁定脚本是在输出交易上加上的条件,通过一段脚本语言来实现,位于交易的输出。解锁脚本与锁定脚本相对应,只有满足锁定脚本要求的条件,才能花掉这个脚本上对应的资产,位于交易的输入。通过脚本语言可以表达很多灵活的条件。解释脚本是通过类似我们编程领域里的“虚拟机”,它分布式运行在区块链网络里的每一个节点。
4.交易规则
区块链交易就是构成区块的基本单位,也是区块链负责记录的实际有效内容。一个区块链交易可以是一次转账,也可以是智能合约的部署等其他事务。
就比特币而言,交易即指一次支付转账。其交易规则如下:
1)交易的输入和输出不能为空。
2)对交易的每个输入,如果其对应的UTXO输出能在当前交易池中找到,则拒绝该交易。因为当前交易池是未被记录在区块链中的交易,而交易的每个输入,应该来自确认的UTXO。如果在当前交易池中找到,那就是双花交易。
3)交易中的每个输入,其对应的输出必须是UTXO。
4)每个输入的解锁脚本(unlocking
)必须和相应输出的锁定脚本(locking
)共同验证交易的合规性。
5.交易优先级
区块链交易的优先级由区块链协议规则决定。对于比特币而言,交易被区块包含的优先次序由交易广播到网络上的时间和交易额的大小决定。随着交易广播到网络上的时间的增长,交易的链龄增加,交易的优先级就被提高,最终会被区块包含。对于以太坊而言,交易的优先级还与交易的发布者愿意支付的交易费用有关,发布者愿意支付的交易费用越高,交易被包含进区块的优先级就越高。
6.Merkle证明
Merkle证明的原始应用是比特币系统(Bitcoin),它是由中本聪(Satoshi
Nakamoto)在2009年描述并且创造的。比特币区块链使用了Merkle证明,为的是将交易存储在每一个区块中。使得交易不能被篡改,同时也容易验证交易是否包含在一个特定区块中。
7.RLP
RLP(Recursive
Length
Prefix,递归长度前缀编码)是Ethereum中对象序列化的一个主要编码方式,其目的是对任意嵌套的二进制数据的序列进行编码。
什么是区块链最核心的内容
区块链最核心的内容是合约层
1、去中心化
这是区块链颠覆性特点,不存在任何中心机构和中心服务器,所有交易都发生在每个人电脑或手机上安装的客户端应用程序中。
实现点对点直接交互,既节约资源,使交易自主化、简易化,又排除被中心化代理控制的风险。
2、开放性
区块链可以理解为一种公共记账的技术方案,系统是完全开放透明的,
账簿对所有人公开,实现数据共享,任何人都可以查账。
区块链是透明共享的总帐本,这帐本在全网公开,你拿到它的公钥,你就知道它帐里面到底是有多少钱,所以任何一次的价值转换,全世界有兴趣的人都能在旁边看着你,转换是由矿工来帮你确认的,所以它是一个互联网共识机制。
3、不可撤销、不可篡改和加密安全性
区块链采取单向哈希算法,每个新产生的区块严格按照时间线形顺序推进,时间的不可逆性、不可撤销导致任何试图入侵篡改区块链内数据信息的行为易被追溯,导致被其他节点的排斥,造假成本极高,从而可以限制相关不法行为。
扩展资料:
一,概念定义
什么是区块链?从科技层面来看,区块链涉及数学、密码学、互联网和计算机编程等很多科学技术问题。从应用视角来看,简单来说,区块链是一个分布式的共享账本和数据库,具有去中心化、不可篡改、全程留痕、可以追溯、集体维护、公开透明等特点。这些特点保证了区块链的“诚实”与“透明”,为区块链创造信任奠定基础。而区块链丰富的应用场景,基本上都基于区块链能够解决信息不对称问题,实现多个主体之间的协作信任与一致行动[7]。
区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。区块链(Blockchain),是比特币的一个重要概念,它本质上是一个去中心化的数据库。
二,特征
去中心化。区块链技术不依赖额外的第三方管理机构或硬件设施,没有中心管制,除了自成一体的区块链本身,通过分布式核算和存储,各个节点实现了信息自我验证、传递和管理。去中心化是区块链最突出最本质的特征。
开放性。区块链技术基础是开源的,除了交易各方的私有信息被加密外,区块链的数据对所有人开放,任何人都可以通过公开的接口查询区块链数据和开发相关应用,因此整个系统信息高度透明。
独立性。基于协商一致的规范和协议(类似比特币采用的哈希算法等各种数学算法),整个区块链系统不依赖其他第三方,所有节点能够在系统内自动安全地验证、交换数据,不需要任何人为的干预。
安全性。只要不能掌控全部数据节点的51%,就无法肆意操控修改网络数据,这使区块链本身变得相对安全,避免了主观人为的数据变更。
匿名性。除非有法律规范要求,单从技术上来讲,各区块节点的身份信息不需要公开或验证,信息传递可以匿名进行
什么是区块链技术?区块链技术的核心构成是什么?从技术的角度,架构的角度,用通俗的语言来跟大家讲讲,我对区块链的一些理解。
究竟啥是区块链?Blockchain,一句话来说,区块链是一个存储系统,存储系统更细一点,区块链是一个没有管理员,每个节点都拥有全部数据的分布式存储系统。
那常见的存储系统,是什么样子的呢?
如上图所示,底部是数据,上面可以写入数据。一个空间存储数据,一个软件管理数据,提供接口写入数据,这就是存储系统。比如MySQL就是最常见的存储系统。
普通的存储系统,容易存在什么问题呢?至少有两个常见的问题
第一个是非高可用的问题,数据存在一个地方很危险。用技术的话说,就是数据不高可用。
第二个问题是,它存在写入的单点,写入点只有一个。用技术的话说,就是它是一个单点控制。
那普通的存储系统通常是如何解决这两个问题的呢?
首先看一下如何保证高可用?
普通的存储系统通常是用“冗余”的方式来解决高可用问题的。图上图所示如果能够把数据复制成几份,冗余到多个地方,就能够保证高可用。一个地方的数据挂了,另外的地方还存有数据,例如MySQL的主从集群就是这个原理,磁盘的RAID也是这个原理。
这个地方需要强调的两点是:数据冗余,往往会引发一致性的问题
1、例如MySQL的主从集群中中其实读写会有延时的,它其实就是有一个短的时间内读写不一致。这个是数据冗余,带来的一个副作用。
2、第二个点是数据冗余往往会降低写入的效率,因为数据同步也是需要消耗资源的。你看单点写入,如果加了两个从库之后,其实写入的效率会受影响。普通的存储系统,就是采用冗余的方式,保证数据的高可用的。
那么第二个问题,普通的存储系统,能否多点写入呢?
答案是可以的,比如说以这个图为例:
其实MySQL的话可以做一个双主的主从同步,双主的主从同步,两个节点,同时可以写入。如果要做多机房多活的数据中心,其实多机房多活也是进行数据同步的。这里要强调的是多点写入,往往会引发写写冲突的一致性问题,以MySQl为例,假设有一个表的属性是自增ID,那么现在数据库中的数据是1234,那么其中一个节点写入,插入了一条数据,那它可能变成5了,然后这5条数据,向另外一个主节点进行数据同步,同步完成之前,如果另外一个写入节点,也插入了一条数据,也生成了一条这个自增id为5的数据。那么,生成之后,往另外一个节点同步,然后同步数据到达之后会与本地的这两条5冲突,就会同步失败,会引发写写的一致性冲突问题。这个多点写入的话都会出现这个问题。
多点写入,如何保证一致?
维新“天鹅大咖课”给你更多的技术干活