在比特币刚发行的时候人们发现了,它去中心化,不受任何中心管制;它完全开放,除了交易信息加密之外整个系统信息高度透明,技术都是开源的;安全性,只要不能控制全部节点的%51,就无法肆意修改数据,这使得它相对安全;独立性,整个模式和比特币不依赖任何第三方,所有节点都在系统内验证、交换数据,不受任何干预
我们这里详细解释什么是区块链技术,说白了就是区块+链,那什么是 “区块” ?什么又是 “链” 呢?
区块就是一个账本交易记账由分布在不同地方的多个节点共同完成,而且每一个节点记录的是完整的账目,因此它们都可以参与监督交易合法性,同时也可以共同为其作证
每一个区块包含了前一个区块的加密散列、相应时间戳记以及交易资料(通常用默克尔树(Merkle tree)算法计算的散列值表示),这样的设计使得区块内容具有难以篡改的特性。用区块链技术所串接的分布式账本能让两方有效记录交易,且可永久查验此交易。
哈希函数h()的作用:将任意长度的字符串,转换成固定长度(例如256位)的输出。输出也被称为 哈希值 ,这个输出不可逆
很难找到两个不同的x和y,使得h(x) = h(y),也就是说两个不同的输入,会有不同的输出。理论上说两个不同的输入可能会有不同的输出,但这几乎不可能,比方说一个无限的空间映射到一个有限的空间,肯定存在多对一的情况,理论存在,但没有任何规律,保证你无法通过数学上的任何推断来找到这个结果,为什么这里是256位呢?不是更长的呢?因为256位已经足够安全。
将账本拆分成块,比如一个本子的一张纸就是一个区块,每个区块记录一段时间内的交易,列如10分钟
我们把每张纸比作一个一个 区块 ,在每个区块的上面增加一部分内容我们把它叫做 区块头 ,其中记录父区块的哈希值,通过每个区块储存父区块的哈希值,将所有区块按顺利连接起来,形成区块链
把 1区块 的哈希值记录到 2区块 的区块头上,如此操作每个区块的区块头都记录父区块的哈希值,每个区块都按照顺序链接起来了,这就叫做区块链。第一个区块没有区块头,又被称之为创世区块
区块链是一个账本,在账本上只有发生了交易你的账户上的钱才会变多和变少,需要进行交易那么首先需要一个账号和密码,就像你的银行卡有账号和密码别人就可以对你进行一个转账,在区块账本上这个账号密码就是公钥和私钥
老王(已有私钥,公钥),想转给张10个BTC,需要一些操作
证明是老王本人发出转账 签名函数Sign (老王的私钥 + 转账信息:老王转给张三10 BTC)=本次专账签名
验证是老王本人发出转账 验证函数Verify (老王的地址 + 转账详细:老王转给张三10 BTC + 本次转账签名)=true
一旦转账记录到区块从此谁也不能改变它,张三增加10 BTC,老王则相应减少10 BTC,整个操作都是自动的,比如你的钱包app它会帮你去做这样的事情,app知道你的私钥,你告诉钱包交易内容,钱包签名向全网公布,等待其他人来验证这笔交易
中心化记账效率会更高,银行、政府或者支付宝帮你记账,都很可靠,因为他们都无法动你的钱,除非它们有你的私钥
中心化记账存在一些缺点
去中心化人人都可以记账,每个人可以保留一个完整的账本。任何人都可以下载开源程序,参与比特币的p2p网络,监听来自全世界发送的交易,成为记账节点,参与记账,假设小逸发布了一笔交易向全网广播,A记账节点监听到了这笔交易,A验证了这笔交易位true之后放入交易池继续向其它节点传播,因为是网络传播,同一时间不同记账节点的交易池不一定相同,每10分钟,从所有记账节点当中,按照某个方式抽取一名,验证这个节点的交易为true之后,之后将这个选中的节点交易池中的交易记录与自己(A)节点的交易池中的交易记录对比一下,对比完之后会将自己交易池中已经被选中记账节点记录的交易删掉,别的不动继续记账等待下一次被选中,每隔10分钟就是一个循环,这个10分钟所有记账节点正常记账,10分钟之后再选出一个节点把它交易池当中的交易作为一个新的区块,这个区块来自所有记账节点中我任意选择的一个记账节点的交易池,如此不断循环往复
交易并不是被记录就完成,只有当这笔交易变成了某一个区块,这笔交易才算是真正的完成。这就是去中心化的一个记账的完整的流程,你的交易并不会第一时间被记录,因为p2p网络传播需要时间,如果被选中区块的节点还没有接受到你的交易,交易就没有完成。每10分钟产生一个区块,但不是所有在10分钟内的交易都能记录。10分钟只是一个平均值
去中心化记账的特点,有记账权的记账节点,每十分钟被选中的节点它会获得50BTC奖励,每21万个区块差不多4年,奖励减半,比特币自发行已经两次减半,那么每十分钟产生一个新的区块这个记账节点得到的奖励是10.5BTC,每隔4年减半那么可以算出BTC的总量大约为2100万枚,预计2040年开采完,记录一个区块的奖励也是比特币唯一的发行方式,当BTC开采完之后,记账节点可以获得的收益就只有交易的手续费了
记账节点通过题目来争夺记账权,
找到某位随机数使得等式不成立
SHA256哈希函数 (随机数 + 父区块哈希值 + 交易池中的交易) 某一指定值)
从0开始遍历随机数碰运气之外,没有其它解法,解题的过程,又叫做 挖矿 ,所以解这个题目的记账节点又被称之为 矿工 ,你遍历随机数越快你拿到这个记账权的可能性就越大,这个遍历速度就被矿老板们称之为 算力 ,为了得到这个算力,矿老板们就会购买更多且更高算力的矿机
谁先解对,谁就得到记账权。A记账节点率先找到解,即向全网公布,其他节点验证无误之后,A节点就获得了这个区块,获得12.5个BTC的收益,在新区块之后重新开始新一轮计算。这个方式被称之为(POW)分配记账权
一般大约10分钟解出这个随机数,10并不绝对,因为解开这个题目的过程本就是个碰运气的过程,未来应对算力的变化,比特币每隔2016个区块,大约两周,会加大或减小难度,使得平均产生区块的时间是十分钟
每一个区块包含了前一个区块的加密散列、相应时间戳记以及交易资料(通常用默克尔树(Merkle tree)算法计算的散列值表示),这样的设计使得区块内容具有难以篡改的特性。用区块链技术所串接的分布式账本能让两方有效记录交易,且可永久查验此交易。
和传统存储的数据不同的是,区块链每个节点都按照块链式结构存储完整的数据,区块链每个节点存储都是独立的、地位等同的,依靠共识机制保证存储的一致性,而传统分布式存储一般是通过中心节点往其他备份节点同步数据。
麻将作为中国传统的区块链项目,四个矿工一组,先碰撞出13个数字正确哈希值的矿工可以获得记账权并得到奖励。
很多人讲区块链是骗局比特币是骗局,这也许是个骗局,但是这个技术已经被广泛地承认和应用,区块链涉及的密码学知识一般人再借几个脑子给你你也搞不懂,在一个相对理性的角度看待问题最重要,千万别听风就是雨。
这门技术有着不可思议的地方 在一个没有中心没有监管的情况下保持着绝对的秩序 这个只需由大家的共识建立的信任,比特币创造了这个共识,在区块链的世界里每个人都是公平平等的。
⑵ 区块链和大数据分析有什么关系
大数据和区块链两者之间有个共同的关键词:分布式,代表了一种从技术权威垄断到去中心化的转变。
分布式存储:HDFS vs. 区块
大数据,需要应对海量化和快增长的存储,这要求底层硬件架构和文件系统在性价比上要大大高于传统技术,能够弹性扩张存储容量。谷歌的GFS和Hadoop的HDFS奠定了大数据存储技术的基础。另外,大数据对存储技术提出的另一个挑战是多种数据格式的适应能力,因此现在大数据底层的存储层不只是HDFS,还有HBase和Ku等存储架构。
区块链,是比特币的底层技术架构,它在本质上是一种去中心化的分布式账本。区块链技术作为一种持续增长的、按序整理成区块的链式数据结构,通过网络中多个节点共同参与数据的计算和记录,并且互相验证其信息的有效性。从这一点来说,区块链技术也是一种特定的数据库技术。由于去中心化数据库在安全、便捷方面的特性,很多业内人士看好其发展,认为它是对现有互联网技术的升级与补充。
分布式计算:MapRece vs. 共识机制
大数据的分析挖掘是数据密集型计算,需要巨大的分布式计算能力。节点管理、任务调度、容错和高可靠性是关键技术。Google和Hadoop的MapRece是这种分布式计算技术的代表,通过添加服务器节点可线性扩展系统的总处理能力(Scale Out),在成本和可扩展性上都有巨大的优势。现在,除了批计算,大数据还包括了流计算、图计算、实时计算、交互查询等计算框架。
区块链的共识机制,就是所有分布式节之间怎么达成共识,通过算法来生成和更新数据,去认定一个记录的有效性,这既是认定的手段,也是防止篡改的手段。区块链主要包括四种不同的共识机制,适用于不同的应用场景,在效率和安全性之间取得平衡。以比特币为例,采用的是“工作量证明”(Proof Of Work,简称POW),只有在控制了全网超过51%的记账节点的情况下,才有可能伪造出一条不存在的记录。
⑶ 【深度知识】区块链之加密原理图示(加密,签名)
先放一张以太坊的架构图:
在学习的过程中主要是采用单个模块了学习了解的,包括P2P,密码学,网络,协议等。直接开始总结:
秘钥分配问题也就是秘钥的传输问题,如果对称秘钥,那么只能在线下进行秘钥的交换。如果在线上传输秘钥,那就有可能被拦截。所以采用非对称加密,两把钥匙,一把私钥自留,一把公钥公开。公钥可以在网上传输。不用线下交易。保证数据的安全性。
如上图,A节点发送数据到B节点,此时采用公钥加密。A节点从自己的公钥中获取到B节点的公钥对明文数据加密,得到密文发送给B节点。而B节点采用自己的私钥解密。
2、无法解决消息篡改。
如上图,A节点采用B的公钥进行加密,然后将密文传输给B节点。B节点拿A节点的公钥将密文解密。
1、由于A的公钥是公开的,一旦网上黑客拦截消息,密文形同虚设。说白了,这种加密方式,只要拦截消息,就都能解开。
2、同样存在无法确定消息来源的问题,和消息篡改的问题。
如上图,A节点在发送数据前,先用B的公钥加密,得到密文1,再用A的私钥对密文1加密得到密文2。而B节点得到密文后,先用A的公钥解密,得到密文1,之后用B的私钥解密得到明文。
1、当网络上拦截到数据密文2时, 由于A的公钥是公开的,故可以用A的公钥对密文2解密,就得到了密文1。所以这样看起来是双重加密,其实最后一层的私钥签名是无效的。一般来讲,我们都希望签名是签在最原始的数据上。如果签名放在后面,由于公钥是公开的,签名就缺乏安全性。
2、存在性能问题,非对称加密本身效率就很低下,还进行了两次加密过程。
如上图,A节点先用A的私钥加密,之后用B的公钥加密。B节点收到消息后,先采用B的私钥解密,然后再利用A的公钥解密。
1、当密文数据2被黑客拦截后,由于密文2只能采用B的私钥解密,而B的私钥只有B节点有,其他人无法机密。故安全性最高。
2、当B节点解密得到密文1后, 只能采用A的公钥来解密。而只有经过A的私钥加密的数据才能用A的公钥解密成功,A的私钥只有A节点有,所以可以确定数据是由A节点传输过来的。
经两次非对称加密,性能问题比较严重。
基于以上篡改数据的问题,我们引入了消息认证。经过消息认证后的加密流程如下:
当A节点发送消息前,先对明文数据做一次散列计算。得到一个摘要, 之后将照耀与原始数据同时发送给B节点。当B节点接收到消息后,对消息解密。解析出其中的散列摘要和原始数据,然后再对原始数据进行一次同样的散列计算得到摘要1, 比较摘要与摘要1。如果相同则未被篡改,如果不同则表示已经被篡改。
在传输过程中,密文2只要被篡改,最后导致的hash与hash1就会产生不同。
无法解决签名问题,也就是双方相互攻击。A对于自己发送的消息始终不承认。比如A对B发送了一条错误消息,导致B有损失。但A抵赖不是自己发送的。
在(三)的过程中,没有办法解决交互双方相互攻击。什么意思呢? 有可能是因为A发送的消息,对A节点不利,后来A就抵赖这消息不是它发送的。
为了解决这个问题,故引入了签名。这里我们将(二)-4中的加密方式,与消息签名合并设计在一起。
在上图中,我们利用A节点的私钥对其发送的摘要信息进行签名,然后将签名+原文,再利用B的公钥进行加密。而B得到密文后,先用B的私钥解密,然后 对摘要再用A的公钥解密,只有比较两次摘要的内容是否相同。这既避免了防篡改问题,有规避了双方攻击问题。因为A对信息进行了签名,故是无法抵赖的。
为了解决非对称加密数据时的性能问题,故往往采用混合加密。这里就需要引入对称加密,如下图:
在对数据加密时,我们采用了双方共享的对称秘钥来加密。而对称秘钥尽量不要在网络上传输,以免丢失。这里的共享对称秘钥是根据自己的私钥和对方的公钥计算出的,然后适用对称秘钥对数据加密。而对方接收到数据时,也计算出对称秘钥然后对密文解密。
以上这种对称秘钥是不安全的,因为A的私钥和B的公钥一般短期内固定,所以共享对称秘钥也是固定不变的。为了增强安全性,最好的方式是每次交互都生成一个临时的共享对称秘钥。那么如何才能在每次交互过程中生成一个随机的对称秘钥,且不需要传输呢?
那么如何生成随机的共享秘钥进行加密呢?
对于发送方A节点,在每次发送时,都生成一个临时非对称秘钥对,然后根据B节点的公钥 和 临时的非对称私钥 可以计算出一个对称秘钥(KA算法-Key Agreement)。然后利用该对称秘钥对数据进行加密,针对共享秘钥这里的流程如下:
对于B节点,当接收到传输过来的数据时,解析出其中A节点的随机公钥,之后利用A节点的随机公钥 与 B节点自身的私钥 计算出对称秘钥(KA算法)。之后利用对称秘钥机密数据。
对于以上加密方式,其实仍然存在很多问题,比如如何避免重放攻击(在消息中加入 Nonce ),再比如彩虹表(参考 KDF机制解决 )之类的问题。由于时间及能力有限,故暂时忽略。
那么究竟应该采用何种加密呢?
主要还是基于要传输的数据的安全等级来考量。不重要的数据其实做好认证和签名就可以,但是很重要的数据就需要采用安全等级比较高的加密方案了。
密码套件 是一个网络协议的概念。其中主要包括身份认证、加密、消息认证(MAC)、秘钥交换的算法组成。
在整个网络的传输过程中,根据密码套件主要分如下几大类算法:
秘钥交换算法:比如ECDHE、RSA。主要用于客户端和服务端握手时如何进行身份验证。
消息认证算法:比如SHA1、SHA2、SHA3。主要用于消息摘要。
批量加密算法:比如AES, 主要用于加密信息流。
伪随机数算法:例如TLS 1.2的伪随机函数使用MAC算法的散列函数来创建一个 主密钥 ——连接双方共享的一个48字节的私钥。主密钥在创建会话密钥(例如创建MAC)时作为一个熵来源。
在网络中,一次消息的传输一般需要在如下4个阶段分别进行加密,才能保证消息安全、可靠的传输。
握手/网络协商阶段:
在双方进行握手阶段,需要进行链接的协商。主要的加密算法包括RSA、DH、ECDH等
身份认证阶段:
身份认证阶段,需要确定发送的消息的来源来源。主要采用的加密方式包括RSA、DSA、ECDSA(ECC加密,DSA签名)等。
消息加密阶段:
消息加密指对发送的信息流进行加密。主要采用的加密方式包括DES、RC4、AES等。
消息身份认证阶段/防篡改阶段:
主要是保证消息在传输过程中确保没有被篡改过。主要的加密方式包括MD5、SHA1、SHA2、SHA3等。
ECC :Elliptic Curves Cryptography,椭圆曲线密码编码学。是一种根据椭圆上点倍积生成 公钥、私钥的算法。用于生成公私秘钥。
ECDSA :用于数字签名,是一种数字签名算法。一种有效的数字签名使接收者有理由相信消息是由已知的发送者创建的,从而发送者不能否认已经发送了消息(身份验证和不可否认),并且消息在运输过程中没有改变。ECDSA签名算法是ECC与DSA的结合,整个签名过程与DSA类似,所不一样的是签名中采取的算法为ECC,最后签名出来的值也是分为r,s。 主要用于身份认证阶段 。
ECDH :也是基于ECC算法的霍夫曼树秘钥,通过ECDH,双方可以在不共享任何秘密的前提下协商出一个共享秘密,并且是这种共享秘钥是为当前的通信暂时性的随机生成的,通信一旦中断秘钥就消失。 主要用于握手磋商阶段。
ECIES: 是一种集成加密方案,也可称为一种混合加密方案,它提供了对所选择的明文和选择的密码文本攻击的语义安全性。ECIES可以使用不同类型的函数:秘钥协商函数(KA),秘钥推导函数(KDF),对称加密方案(ENC),哈希函数(HASH), H-MAC函数(MAC)。
ECC 是椭圆加密算法,主要讲述了按照公私钥怎么在椭圆上产生,并且不可逆。 ECDSA 则主要是采用ECC算法怎么来做签名, ECDH 则是采用ECC算法怎么生成对称秘钥。以上三者都是对ECC加密算法的应用。而现实场景中,我们往往会采用混合加密(对称加密,非对称加密结合使用,签名技术等一起使用)。 ECIES 就是底层利用ECC算法提供的一套集成(混合)加密方案。其中包括了非对称加密,对称加密和签名的功能。
<meta charset="utf-8">
这个先订条件是为了保证曲线不包含奇点。
所以,随着曲线参数a和b的不断变化,曲线也呈现出了不同的形状。比如:
所有的非对称加密的基本原理基本都是基于一个公式 K = k G。其中K代表公钥,k代表私钥,G代表某一个选取的基点。非对称加密的算法 就是要保证 该公式 不可进行逆运算( 也就是说G/K是无法计算的 )。 *
ECC是如何计算出公私钥呢?这里我按照我自己的理解来描述。
我理解,ECC的核心思想就是:选择曲线上的一个基点G,之后随机在ECC曲线上取一个点k(作为私钥),然后根据k G计算出我们的公钥K。并且保证公钥K也要在曲线上。*
那么k G怎么计算呢?如何计算k G才能保证最后的结果不可逆呢?这就是ECC算法要解决的。
首先,我们先随便选择一条ECC曲线,a = -3, b = 7 得到如下曲线:
在这个曲线上,我随机选取两个点,这两个点的乘法怎么算呢?我们可以简化下问题,乘法是都可以用加法表示的,比如2 2 = 2+2,3 5 = 5+5+5。 那么我们只要能在曲线上计算出加法,理论上就能算乘法。所以,只要能在这个曲线上进行加法计算,理论上就可以来计算乘法,理论上也就可以计算k*G这种表达式的值。
曲线上两点的加法又怎么算呢?这里ECC为了保证不可逆性,在曲线上自定义了加法体系。
现实中,1+1=2,2+2=4,但在ECC算法里,我们理解的这种加法体系是不可能。故需要自定义一套适用于该曲线的加法体系。
ECC定义,在图形中随机找一条直线,与ECC曲线相交于三个点(也有可能是两个点),这三点分别是P、Q、R。
那么P+Q+R = 0。其中0 不是坐标轴上的0点,而是ECC中的无穷远点。也就是说定义了无穷远点为0点。
同样,我们就能得出 P+Q = -R。 由于R 与-R是关于X轴对称的,所以我们就能在曲线上找到其坐标。
P+R+Q = 0, 故P+R = -Q , 如上图。
以上就描述了ECC曲线的世界里是如何进行加法运算的。
从上图可看出,直线与曲线只有两个交点,也就是说 直线是曲线的切线。此时P,R 重合了。
也就是P = R, 根据上述ECC的加法体系,P+R+Q = 0, 就可以得出 P+R+Q = 2P+Q = 2R+Q=0
于是乎得到 2 P = -Q (是不是与我们非对称算法的公式 K = k G 越来越近了)。
于是我们得出一个结论,可以算乘法,不过只有在切点的时候才能算乘法,而且只能算2的乘法。
假若 2 可以变成任意个数进行想乘,那么就能代表在ECC曲线里可以进行乘法运算,那么ECC算法就能满足非对称加密算法的要求了。
那么我们是不是可以随机任何一个数的乘法都可以算呢? 答案是肯定的。 也就是点倍积 计算方式。
选一个随机数 k, 那么k * P等于多少呢?
我们知道在计算机的世界里,所有的都是二进制的,ECC既然能算2的乘法,那么我们可以将随机数k描 述成二进制然后计算。假若k = 151 = 10010111
由于2 P = -Q 所以 这样就计算出了k P。 这就是点倍积算法 。所以在ECC的曲线体系下是可以来计算乘法,那么以为这非对称加密的方式是可行的。
至于为什么这样计算 是不可逆的。这需要大量的推演,我也不了解。但是我觉得可以这样理解:
我们的手表上,一般都有时间刻度。现在如果把1990年01月01日0点0分0秒作为起始点,如果告诉你至起始点为止时间流逝了 整1年,那么我们是可以计算出现在的时间的,也就是能在手表上将时分秒指针应该指向00:00:00。但是反过来,我说现在手表上的时分秒指针指向了00:00:00,你能告诉我至起始点算过了有几年了么?
ECDSA签名算法和其他DSA、RSA基本相似,都是采用私钥签名,公钥验证。只不过算法体系采用的是ECC的算法。交互的双方要采用同一套参数体系。签名原理如下:
在曲线上选取一个无穷远点为基点 G = (x,y)。随机在曲线上取一点k 作为私钥, K = k*G 计算出公钥。
签名过程:
生成随机数R, 计算出RG.
根据随机数R,消息M的HASH值H,以及私钥k, 计算出签名S = (H+kx)/R.
将消息M,RG,S发送给接收方。
签名验证过程:
接收到消息M, RG,S
根据消息计算出HASH值H
根据发送方的公钥K,计算 HG/S + xK/S, 将计算的结果与 RG比较。如果相等则验证成功。
公式推论:
HG/S + xK/S = HG/S + x(kG)/S = (H+xk)/GS = RG
在介绍原理前,说明一下ECC是满足结合律和交换律的,也就是说A+B+C = A+C+B = (A+C)+B。
这里举一个WIKI上的例子说明如何生成共享秘钥,也可以参考 Alice And Bob 的例子。
Alice 与Bob 要进行通信,双方前提都是基于 同一参数体系的ECC生成的 公钥和私钥。所以有ECC有共同的基点G。
生成秘钥阶段:
Alice 采用公钥算法 KA = ka * G ,生成了公钥KA和私钥ka, 并公开公钥KA。
Bob 采用公钥算法 KB = kb * G ,生成了公钥KB和私钥 kb, 并公开公钥KB。
计算ECDH阶段:
Alice 利用计算公式 Q = ka * KB 计算出一个秘钥Q。
Bob 利用计算公式 Q' = kb * KA 计算出一个秘钥Q'。
共享秘钥验证:
Q = ka KB = ka * kb * G = ka * G * kb = KA * kb = kb * KA = Q'
故 双方分别计算出的共享秘钥不需要进行公开就可采用Q进行加密。我们将Q称为共享秘钥。
在以太坊中,采用的ECIEC的加密套件中的其他内容:
1、其中HASH算法采用的是最安全的SHA3算法 Keccak 。
2、签名算法采用的是 ECDSA
3、认证方式采用的是 H-MAC
4、ECC的参数体系采用了secp256k1, 其他参数体系 参考这里
H-MAC 全程叫做 Hash-based Message Authentication Code. 其模型如下:
在 以太坊 的 UDP通信时(RPC通信加密方式不同),则采用了以上的实现方式,并扩展化了。
首先,以太坊的UDP通信的结构如下:
其中,sig是 经过 私钥加密的签名信息。mac是可以理解为整个消息的摘要, ptype是消息的事件类型,data则是经过RLP编码后的传输数据。
其UDP的整个的加密,认证,签名模型如下:
⑷ 区块链技术
背景:比特币诞生之后,发现该技术很先进,才发现了区块链技术。比特币和区块链技术同时被发现。
1.1 比特币诞生的目的:
①货币交易就有记录,即账本;
②中心化机构记账弊端——可篡改;易超发
比特币解决第一个问题:防篡改——hash函数
1.2 hash函数(加密方式)
①作用:将任意长度的字符串,转换成固定长度(sha256)的输出。输出也被称为hash值。
②特点:很难找到两个不同的x和y,使得h(x)=h(y)。
③应用:md5文件加密
1.3 区块链
①定义
区块:将总账本拆分成区块存储
区块链:在每个区块上,增加区块头。其中记录父区块的hash值。通过每个区块存储父区块的hash值,将所有的区块按照顺序连接起来,形成区块链。
②区块链如何防止交易记录被篡改
形成区块链后,篡改任一交易,会导致该交易区块hash值和其子区块中不同,发现篡改。
即使继续篡改子区块头中hash值,会导致子区块hash值和孙区块中不同,发现篡改。
1.4 区块链本质
①比特币和区块链本质:一个人人可见的大账本,只记录交易。
②核心技术:通过密码学hash函数+数据结构,保证账本记录不可篡改。
③核心功能:创造信任。法币依靠政府公信力,比特币依靠技术。
1.5如何交易
①进行交易,需要有账号和密码,对应公钥和私钥
私钥:一串256位的二进制数字,获取不需要申请,甚至不需要电脑,自己抛硬币256次就生成了私钥
地址由私钥转化而成。地址不能反推私钥。
地址即身份,代表了在比特币世界的ID。
一个地址产生之后,只有进入区块链账本,才能被大家知道。
②数字签名技术
签名函数sign(张三的私钥,转账信息:张三转10元给李四) = 本次转账签名
验证韩式verify(张三的地址,转账信息:张三转10元给李四,本次转账签名) = True
张三通过签名函数sign(),使用自己的私钥对本次交易进行签名。
任何人可以通过验证韩式vertify(),来验证此次签名是否有由持有张三私钥的张三本人发出。是返回true,反之为false。
sign()和verify()由密码学保证不被破解。·
③完成交易
张三将转账信息和签名在全网供内部。在账户有余额的前提下,验证签名是true后,即会记录到区块链账本中。一旦记录,张三的账户减少10元,李四增加10元。
支持一对一,一对多,多对已,多对多的交易方式。
比特币世界中,私钥就是一切!!!
1.6中心化记账
①中心化记账优点:
a.不管哪个中心记账,都不用太担心
b.中心化记账,效率高
②中心化记账缺点:
a 拒绝服务攻击
b 厌倦后停止服务
c 中心机构易被攻击。比如破坏服务器、网络,监守自盗、法律终止、政府干预等
历史 上所有有中心化机构的机密货币尝试都失败了。
比特币解决第二个问题:如何去中心化
1.7 去中心化记账
①去中心化:人人都可以记账。每个人都可以保留完整的账本。
任何人都可以下载开源程序,参与P2P网络,监听全世界发送的交易,成为记账节点,参与记账。
②去中心化记账流程
某人发起一笔交易后,向全网广播。
每个记账节点,持续监听、持续全网交易。收到一笔新交易,验证准确性后,将其放入交易池并继续向其它节点传播。
因为网络传播,同一时间不同记账节点的交一次不一定相同。
每隔10分钟,从所有记账节点当中,按照某种方式抽取1名,将其交易池作为下一个区块,并向全网广播。
其它节点根据最新的区块中的交易,删除自己交易池中已经被记录的交易,继续记账,等待下一次被选中。
③去中心化记账特点
每隔10分钟产生一个区块,但不是所有在这10分钟之内的交易都能记录。
获得记账权的记账节点,将得到50个比特币的奖励。每21万个区块(约4年)后,奖励减半。总量约2100万枚,预计2040年开采完。
记录一个区块的奖励,也是比特币唯一的发行方式。
④如何分配记账权:POW(proof of work) 方式
记账几点通过计算一下数学题,来争夺记账权。
找到某随即数,使得一下不等式成立:
除了从0开始遍历随机数碰运气之外,没有其它解法,解题的过程,又叫做挖矿。
谁先解对,谁就得到记账权。
某记账节点率先找到解,即向全网公布。其他节点验证无误之后,在新区块之后重新开始新一轮的计算。这个方式被称为POW。
⑤难度调整
每个区块产生的时间并不是正好10分钟
随着比特币发展,全网算力不算提升。
为了应对算力的变化,每隔2016个区块(大约2周),会加大或者减少难度,使得每个区块产生的平均时间是10分钟。
#欧易OKEx# #比特币[超话]# #数字货币#
⑸ hfil和fil的区别
一、hfil和fil的区别是什么?
HFIL是基于ERC20标准发行的数字资产,采用 1:1 的比例抵押铸造,在保证了与主流加密资产同等价值的同时,也拥有了在以太坊上的灵活性。
FIL是IPFS的激励层和保障层,是基于IPFS的区块链项目。File Davinci会发一种代币——Filecoin,FIL的矿工分为2种存储矿工和检索矿工,通过提供存储空间和检索数据来获得Filecoin。
通过HFIL来连通FIL跟ETH两大生态,是火币长期坚持为行业建设基础设施的重要一步。
二、数字货币
数字货币简称为DC,是英文“Digital Currency”(数字货币)的缩写,是电子货币形式的替代货币。数字金币和密码货币都属于数字货币。
数字货币是一种不受管制的、数字化的货币,通常由开发者发行和管理,被特定虚拟社区的成员所接受和使用。欧洲银行业管理局将虚拟货币定义为:价值的数字化表示,不由央行或当局发行,也不与法币挂钩,但由于被公众所接受,所以可作为支付手段,也可以电子形式转移、存储或交易。
三、区块链
区块链是一个信息技术领域的术语。从本质上讲,它是一个共享数据库,存储于其中的数据或信息,具有“不可伪造”“全程留痕”“可以追溯”“公开透明”“集体维护”等特征。基于这些特征,区块链技术奠定了坚实的“信任”基础,创造了可靠的“合作”机制,具有广阔的运用前景。
区块链起源于比特币,2008年11月1日,一位自称中本聪(Satoshi Nakamoto)的人发表了《比特币:一种点对点的电子现金系统》一文,阐述了基于P2P网络技术、加密技术、时间戳技术、区块链技术等的电子现金系统的构架理念,这标志着比特币的诞生。两个月后理论步入实践,2009年1月3日第一个序号为0的创世区块诞生。几天后,2009年1月9日出现序号为1的区块,并与序号为0的创世区块相连接形成了链,标志着区块链的诞生。
⑹ 区块链 --- 分布式金融(DeFi)
DeFi是decentralized finance(分布式金融) 一词的缩写,通常是指基于以太坊的数字资产和金融智能合约,协议以及分布式应用程序(DApps)。
简单来说,DeFi就是将传统金融搬到区块链网络里,但相比传统金融,它通过区块链实现了去中心化,也就是去掉了中间人的角色,从而降低了中间环节带来的巨额成本。
DeFi最终要实现的是资产通证化,以智能合约功能性替代传统中心化的金融机构,使用户以更低的成本享受到金融服务,并且提升整个金融体系的运行效率,降低运行成本。同时打造一个面向全球开放的无国界金融体系,以打造开放、透明、安全全新的去中心化系统,让所有人都可以自由地进行交易。
随着区块链的迅速发展,DeFi的应用场景也在不断地丰富,而金融业是其中最有前景的行业。
与银行相似,用户可以存钱并从其他借入其资产的用户那里获得利息。但是,在这种情况下, 资产是数字的 ,智能合约将贷方与借款人联系起来,执行贷款条款并分配利息。这一切都发生了,而无需彼此信任或中间人银行。而且,由于区块链提供的透明性,通过减少中间商,贷方可以赚取更高的回报,并更清楚地了解风险。
去中心化交易所,简称DEX,DEX是使用智能合约执行交易规则,执行交易并在必要时安全处理资金的加密货币交易所。当使用DEX进行交易时,没有中心化交易所运营商,也无需注册,没有身份验证或提款费用。
DEX可以使用订单薄进行交易,比如你要用10个A换15个B,那么我记下来。然后一会又来了一个人说我要用15个B换10个A,我说太好了,正好配对上了。于是,我就在链上生成一笔交易,把你们俩的币互换。这个时候汇率其实就是给交易的双方做参考用的——建议你用这个汇率容易找到配对。这样一来,去中心化交易所只是把交易双方的需求匹配了一下放上链,就不存在智能合约读取链外汇率信息的问题了。
这方法有很多缺陷。无论这个DEX做得多么用户友好,它对比中心化交易所效率一定是很差的,首先币价波动的时候很难找到匹配,其次小币种肯定也很难找到匹配,然后交易延迟应该也不小。 但相对于中心交易所,它还是有唯一的优势——靠谱。
DEX还可以使用AMM(自动做市商)交易,即按照自己的供求关系计算汇率,以保证自己手中的币不会被别人低价买空。最简单的办法就是永远保证自己的A币和B币的数量是个定值,这样就算卖空了,亏损也是有限的,而且,市场总会把价格调到合适的水平——因为反正如果汇率低了就会有人买,汇率高了就会有人卖。
通过这种简单的方法,可以获得一个不需要从链外获得汇率信息就可以自动根据供求关系调整的市场。当然,这东西的弱点也很明显——如果一开始的汇率不在市场汇率附近,就会承受大量的亏损。而且AMM中还存在“无偿损失”。
稳定币是旨在保持特定价值的代币,通常与美元等法定货币挂钩。
例如,DAI是与美元挂钩并抵押以太坊(ETH)链上数字资产的稳定币。它的发行是通过一个借贷的智能合约,来实现的:每个人都可以通过抵押一定数量的ETH(以太币)来换取和美元1:1锚定的DAI。这里,DAI采用的是 超额抵押 的形式,对于每个DAI,在MakerDAO智能合约中锁定有1.50美元的以太坊作为抵押。
如果你抵押价值150美元的以太币,那么只能换来价值100美元的DAI。然后,这个智能合约中写定了,如果你在某个时间内归还这100美元的DAI并且付一部分利息,那么你就可以拿回自己抵押的以太币。
但是这里面有个问题——以太坊的价格是会变动的。而且,虚拟货币的价格变动可是相当剧烈的,如果遇上以太坊暴跌了怎么办?那么原本值150美元的以太坊可能瞬间就不到100美元了,这个时候抵押的资产不如我贷出来的资产多,DAI的价格就不可能再锚定美元,因为大家都能看到:DAI不值那么多钱了。
怎么解决这个问题呢?超额抵押的作用就显出来了——即便以太坊价格波动幅度再大,但是从150美元跌到100美元总归还需要些时间。而这就给资产清算的空间:首先,我们规定抵押物不得少于150%的贷款,也就是如果以太坊涨了没关系,但是一旦跌了,你得立刻补仓到150%,否则你的抵押物会进入清算的智能合约。
用来装DeFi的虚拟资产,可以用于转账等。
资产管理工具(也叫看板)就是专门提供钱包扫描服务,可以查看钱包的明细,还有历史记录。
最主要的三大资产管理工具是Debank、Zerion以及 Zapper。
一般来说,市场上会有很多挖矿的机会,这也是大家理财赚钱的机会。这时候,就有做资产管理,或者是提供理财的金融服务的机器人站出来说,我是专门帮你做赚钱生意的,只要你把钱给我,我就会去市场上找赚钱的机会,帮你去赚钱。
YFI是其中最主要的一种理财工具。
区块链世界的机器人都是去中心化治理的,也就是说,没有明确是归属于谁的。这种情况下,如果机器人出故障了,我们应该找谁的责任?应该怎么做?损失谁来负责?这种情况下,就需要保险机器人了,它是专门就是为其他机器人投保了。
区块链世界的机器人都是去中心化的,且公开透明的,自动执行的。这些机器人的升级、维护应该怎么做?如何来确保机器人的去中心化呢?
一般,是由很多人围着同一个机器人一起磋商,投票决定如何让机器人去升级、提供服务。DAO机器人就是帮助这些人跟机器人之间形成一种去中心化的治理关系的机器人。
专门提供一种资产价格的机器人,比如,刚刚举例的小c机器人收到一个比特币的时候,它是需要知道一个比特币到底值多少钱。否则,是没办法计算应该给小明贷款多少钱的。这种时候,预言机机机器人就会跑到小c面前,输入一个价格,告诉小c机器人,比特币现在价值1万美金。
以太坊是一个维护数字价值共享账本的区块链网络,几乎所有DeFi应用程序(称为智能合约或Dapp)都建立在以太坊区块链上,组成网络的参与者代替了中心权力机构,以分散的方式控制网络本地加密货币以太(ETH)的发行。
defipulse公布的 DeFi排名 ,该排名跟踪锁定全球DeFi智能合约中的实时价值。
MakerDAO在DeFi领域是毫无疑问的龙头,MakerDAO之于DeFi就如比特大陆之于 矿圈。
MakerDAO 成立于2014年,是以太坊上 自动化抵押贷款平台 ,同时也是稳定币 Dai 的提供者。MakerDAO 是建立在以太坊上的去中心化的衍生金融体系,它采用了双币模式,一种为稳定币 Dai,另一种为权益代币和管理型代币 MKR。Dai 于2017年12月主网上线。通过双币机制,MakerDAO使得整个去中心化的质押贷款体系得以运转。
Dai和美元进行1:1锚定,和其他稳定币一样,Dai也存在价格波动。和其他稳定币不一样的是,Dai是通过 超额抵押 加密数字货币,从而获得价值。USDT、TrueUSD 和 GUSD 这一类的中心化稳定币每发行1美元的代币背后都存在1美元的法币作为储备,而1 Dai背后是以超出1美元的数字资产作为储备。
与USDT、TrueUSD等不同的是,Dai的运行机制是公开透明的,这也是 Dai的优势之一。不仅 Dai本身透明,换取 Dai的抵押物以太坊的价值波动和数量也一样透明,对外公开可见。
Compound协议打造的是一个无中介的贷款平台,借方获得利益,贷方支付利息。(头等仓注:通常我们把代币存入借贷池的一方称为借方,向借贷池中借代币的一方称为贷方。)
Compound的新ERC-20代币简称cToken,使用户能更简便的进行借贷操作。例如,支持cDAI与DAI交换,DAI持有者就可以将代币借给cDAI用户。不是所有的钱包都支持交换,但在Eidoo钱包中,用户可以轻松地用cDAI交换DAI,从而出借DAI换取利息。如今,Compound总共支持8种cToken,锁定资产合计高达约等值于2亿美元:cDAI、cETH、cUSDC、cBAT、cWBTC、cSAI、cREP、cZRX。
借方可以随时从Compound中提取代币,自动、瞬时计算利息。如果是通过像Eidoo这样的非托管钱包来提币,无需任何中介(因为以太坊的去中心化协议就能做到)。
贷方则必须锁定代币作为抵押品,根据基础资产的雄厚薄弱,获取50-75%的信贷。
Compound协议还设有10%的利息作为准备金,而剩余的90%利息归借方。无任何费用,无协议代币。基于以太坊的信贷市场,形成了一个真正的去中心化流动池,以一种无中介、自主、快速的方式发放和获得贷款。
Synthetix是基于以太坊的 合成资产发行协议 。Synthetix目前支持发行的合成资产包括法币、加密货币、大宗商品。其中法币主要有美元(sUSD)、欧元(sEUR)、日元(sJPY),不过目前基本上以sUSD为主。加密货币方面有比特币(sBTC)和以太坊(sETH)等,此外,还有反向的加密资产,例如iBTC,当BTC价格下跌,iBTC价格上涨,从而获利。大宗商品方面当前以金(sXAU)和银(sXAG)为主。
Synthetix上交易是去中心化的模式进行的,且无须交易对手存在,也不用担心流动性和滑点问题。在其交易所上的交易都是通过智能合约执行的,是对智能合约的交易,而不是订单簿交易。这些都有其独特的交易体验和部分优势。
Synthetix跟其他资产发行协议一样,也需要进行资产抵押才能发行,例如MakerDAO协议要生成dai,需要抵押ETH。Synthetix也类似,但它抵押的是其原生代币SNX。用户只要在其智能合约中锁定一定量的SNX,即可发行合成资产。其中其质押率非常高,是其发行资产的750%,只有达到750%的目标阀值才有机会获得交易手续费和SNX新代币的奖励。
TVL就是每个DeFi协议的锁仓总价值,越高越好。
Dex就是交易量,越高越好。
活跃地址数量代表以太坊上的DeFi用户数,越多越好。
手续费越低越好。
以太坊作为一个基础设施,它的市值可以很高,但是,说到它与DeFi市值的比例,那以太坊的市值应当是越低越好,越高就说明这个市场越成熟。
参考链接:
https://zhuanlan.hu.com/p/206910261
https://zhuanlan.hu.com/p/366412971
https://zhuanlan.hu.com/p/377856331
https://www.hu.com/question/324838085/answer/1526607416
如有不对,烦请指出,感谢~
⑺ 区块链记账原理
区块链是由一个个区块构成的有序列表,每一个区块都记录了一系列交易,并且每一个区块都指向前一个区块从而形成一个链条。
区块链有以下几个特征:
区块链具有不可篡改的特性,是由哈希算法保证的。
什么是哈希算法/Hash:
安全哈希算法的特点:
哈希算法的作用:
假设我们相信一个安全的哈希算法:如果H(x) = H(y),则x = y
常用的哈希算法:
比特币使用两种哈希算法:
假设这个区块有5笔交易,首先,对每一笔交易进行第一hash,也就是2次SHA-256的运算,得到5个哈希值,也就是a1、a2、a3、a4、a5,这五个哈希值也可以看做是数据,将a1和a2拼起来、a3和a4拼起来,再计算出2个哈希值b1和b2。那a5怎么办呢?答案是将a5复制一份在与a5拼起来进行哈希计算得到b3;继续将b1和b2拼起来进行哈希运算得到c1,同样的b3会被复制一份再与b3拼起来进行哈希运算得到c2;最后将c1和c2拼起来进行哈希运算得到最终的哈希值,这个哈希值就是Merkle Hash。
从Merkle Hash的计算方法可以得出结论:修改任意一笔交易,哪怕是一个字节,或者交换两个交易的顺序,都会导致Merkle Hash验证失败,也就会导致这个区块本身是无效的。所以Merkle Hash记录在头部,它的作用就是保证交易记录永远不能够被修改。
区块本身用Block Hash来标识:Block Hash是区块唯一标识。一个区块的hash并没有记录在区块头部,而是通过计算区块的hash得到的。
区块的Prev Hash记录了上一个区块的Hash,这样就可以通过Prev Hash追踪到上一个区块,由于下一个区块的Prev Hash又会指向当前区块,这样每一个区块的Prev Hash都指向上一个区块,这些区块串起来就形成了区块链。如果一个攻击者恶意攻击了某一个区块的交易记录,那么这个区块的Merkle Hash验证就不会通过,所以攻击者只能重新计算Merkle Hash,然后把区块头的Merkle Hash也修改了,但是这个区块本身的Hash已经改变,那么下一个区块指向该区块的链接也断掉了。由于比特币区块的hash必须满足一定的难度值,所以攻击者只能把后面所以区块全部重新计算,并且伪造出来,才能修改整个区块链。
修改一个区块的成本已经非常高了,如果要修改整个区块链,那么其成本非常非常的高昂。在比特币网络中,伪造区块链需要拥有超过51%的全网算力。所以比特币网络运行了6年,从来没有被攻破过。
⑻ 区块链 --- 共识算法
PoW算法是一种防止分布式服务资源被滥用、拒绝服务攻击的机制。它要求节点进行适量消耗时间和资源的复杂运算,并且其运算结果能被其他节点快速验算,以耗用时间、能源做担保,以确保服务与资源被真正的需求所使用。
PoW算法中最基本的技术原理是使用哈希算法。假设求哈希值Hash(r),若原始数据为r(raw),则运算结果为R(Result)。
R = Hash(r)
哈希函数Hash()的特性是,对于任意输入值r,得出结果R,并且无法从R反推回r。当输入的原始数据r变动1比特时,其结果R值完全改变。在比特币的PoW算法中,引入算法难度d和随机值n,得到以下公式:
Rd = Hash(r+n)
该公式要求在填入随机值n的情况下,计算结果Rd的前d字节必须为0。由于哈希函数结果的未知性,每个矿工都要做大量运算之后,才能得出正确结果,而算出结果广播给全网之后,其他节点只需要进行一次哈希运算即可校验。PoW算法就是采用这种方式让计算消耗资源,而校验仅需一次。
PoS算法要求节点验证者必须质押一定的资金才有挖矿打包资格,并且区域链系统在选定打包节点时使用随机的方式,当节点质押的资金越多时,其被选定打包区块的概率越大。
POS模式下,每个币每天产生1币龄,比如你持有100个币,总共持有了30天,那么,此时你的币龄就为3000。这个时候,如果你验证了一个POS区块,你的币龄就会被清空为0,同时从区块中获得相对应的数字货币利息。
节点通过PoS算法出块的过程如下:普通的节点要成为出块节点,首先要进行资产的质押,当轮到自己出块时,打包区块,然后向全网广播,其他验证节点将会校验区块的合法性。
DPoS算法和PoS算法相似,也采用股份和权益质押。
但不同的是,DPoS算法采用委托质押的方式,类似于用全民选举代表的方式选出N个超级节点记账出块。
选民把自己的选票投给某个节点,如果某个节点当选记账节点,那么该记账节点往往在获取出块奖励后,可以采用任意方式来回报自己的选民。
这N个记账节点将轮流出块,并且节点之间相互监督,如果其作恶,那么会被扣除质押金。
通过信任少量的诚信节点,可以去除区块签名过程中不必要的步骤,提高了交易的速度。
拜占庭问题:
拜占庭是古代东罗马帝国的首都,为了防御在每块封地都驻扎一支由单个将军带领的军队,将军之间只能靠信差传递消息。在战争时,所有将军必须达成共识,决定是否共同开战。
但是,在军队内可能有叛徒,这些人将影响将军们达成共识。拜占庭将军问题是指在已知有将军是叛徒的情况下,剩余的将军如何达成一致决策的问题。
BFT:
BFT即拜占庭容错,拜占庭容错技术是一类分布式计算领域的容错技术。拜占庭假设是对现实世界的模型化,由于硬件错误、网络拥塞或中断以及遭到恶意攻击等原因,计算机和网络可能出现不可预料的行为。拜占庭容错技术被设计用来处理这些异常行为,并满足所要解决的问题的规范要求。
拜占庭容错系统 :
发生故障的节点被称为 拜占庭节点 ,而正常的节点即为 非拜占庭节点 。
假设分布式系统拥有n台节点,并假设整个系统拜占庭节点不超过m台(n ≥ 3m + 1),拜占庭容错系统需要满足如下两个条件:
另外,拜占庭容错系统需要达成如下两个指标:
PBFT即实用拜占庭容错算法,解决了原始拜占庭容错算法效率不高的问题,算法的时间复杂度是O(n^2),使得在实际系统应用中可以解决拜占庭容错问题
PBFT是一种状态机副本复制算法,所有的副本在一个视图(view)轮换的过程中操作,主节点通过视图编号以及节点数集合来确定,即:主节点 p = v mod |R|。v:视图编号,|R|节点个数,p:主节点编号。
PBFT算法的共识过程如下:客户端(Client)发起消息请求(request),并广播转发至每一个副本节点(Replica),由其中一个主节点(Leader)发起提案消息pre-prepare,并广播。其他节点获取原始消息,在校验完成后发送prepare消息。每个节点收到2f+1个prepare消息,即认为已经准备完毕,并发送commit消息。当节点收到2f+1个commit消息,客户端收到f+1个相同的reply消息时,说明客户端发起的请求已经达成全网共识。
具体流程如下 :
客户端c向主节点p发送<REQUEST, o, t, c>请求。o: 请求的具体操作,t: 请求时客户端追加的时间戳,c:客户端标识。REQUEST: 包含消息内容m,以及消息摘要d(m)。客户端对请求进行签名。
主节点收到客户端的请求,需要进行以下交验:
a. 客户端请求消息签名是否正确。
非法请求丢弃。正确请求,分配一个编号n,编号n主要用于对客户端的请求进行排序。然后广播一条<<PRE-PREPARE, v, n, d>, m>消息给其他副本节点。v:视图编号,d客户端消息摘要,m消息内容。<PRE-PREPARE, v, n, d>进行主节点签名。n是要在某一个范围区间内的[h, H],具体原因参见 垃圾回收 章节。
副本节点i收到主节点的PRE-PREPARE消息,需要进行以下交验:
a. 主节点PRE-PREPARE消息签名是否正确。
b. 当前副本节点是否已经收到了一条在同一v下并且编号也是n,但是签名不同的PRE-PREPARE信息。
c. d与m的摘要是否一致。
d. n是否在区间[h, H]内。
非法请求丢弃。正确请求,副本节点i向其他节点包括主节点发送一条<PREPARE, v, n, d, i>消息, v, n, d, m与上述PRE-PREPARE消息内容相同,i是当前副本节点编号。<PREPARE, v, n, d, i>进行副本节点i的签名。记录PRE-PREPARE和PREPARE消息到log中,用于View Change过程中恢复未完成的请求操作。
主节点和副本节点收到PREPARE消息,需要进行以下交验:
a. 副本节点PREPARE消息签名是否正确。
b. 当前副本节点是否已经收到了同一视图v下的n。
c. n是否在区间[h, H]内。
d. d是否和当前已收到PRE-PPREPARE中的d相同
非法请求丢弃。如果副本节点i收到了2f+1个验证通过的PREPARE消息,则向其他节点包括主节点发送一条<COMMIT, v, n, d, i>消息,v, n, d, i与上述PREPARE消息内容相同。<COMMIT, v, n, d, i>进行副本节点i的签名。记录COMMIT消息到日志中,用于View Change过程中恢复未完成的请求操作。记录其他副本节点发送的PREPARE消息到log中。
主节点和副本节点收到COMMIT消息,需要进行以下交验:
a. 副本节点COMMIT消息签名是否正确。
b. 当前副本节点是否已经收到了同一视图v下的n。
c. d与m的摘要是否一致。
d. n是否在区间[h, H]内。
非法请求丢弃。如果副本节点i收到了2f+1个验证通过的COMMIT消息,说明当前网络中的大部分节点已经达成共识,运行客户端的请求操作o,并返回<REPLY, v, t, c, i, r>给客户端,r:是请求操作结果,客户端如果收到f+1个相同的REPLY消息,说明客户端发起的请求已经达成全网共识,否则客户端需要判断是否重新发送请求给主节点。记录其他副本节点发送的COMMIT消息到log中。
如果主节点作恶,它可能会给不同的请求编上相同的序号,或者不去分配序号,或者让相邻的序号不连续。备份节点应当有职责来主动检查这些序号的合法性。
如果主节点掉线或者作恶不广播客户端的请求,客户端设置超时机制,超时的话,向所有副本节点广播请求消息。副本节点检测出主节点作恶或者下线,发起View Change协议。
View Change协议 :
副本节点向其他节点广播<VIEW-CHANGE, v+1, n, C , P , i>消息。n是最新的stable checkpoint的编号, C 是 2f+1验证过的CheckPoint消息集合, P 是当前副本节点未完成的请求的PRE-PREPARE和PREPARE消息集合。
当主节点p = v + 1 mod |R|收到 2f 个有效的VIEW-CHANGE消息后,向其他节点广播<NEW-VIEW, v+1, V , O >消息。 V 是有效的VIEW-CHANGE消息集合。 O 是主节点重新发起的未经完成的PRE-PREPARE消息集合。PRE-PREPARE消息集合的选取规则:
副本节点收到主节点的NEW-VIEW消息,验证有效性,有效的话,进入v+1状态,并且开始 O 中的PRE-PREPARE消息处理流程。
在上述算法流程中,为了确保在View Change的过程中,能够恢复先前的请求,每一个副本节点都记录一些消息到本地的log中,当执行请求后副本节点需要把之前该请求的记录消息清除掉。
最简单的做法是在Reply消息后,再执行一次当前状态的共识同步,这样做的成本比较高,因此可以在执行完多条请求K(例如:100条)后执行一次状态同步。这个状态同步消息就是CheckPoint消息。
副本节点i发送<CheckPoint, n, d, i>给其他节点,n是当前节点所保留的最后一个视图请求编号,d是对当前状态的一个摘要,该CheckPoint消息记录到log中。如果副本节点i收到了2f+1个验证过的CheckPoint消息,则清除先前日志中的消息,并以n作为当前一个stable checkpoint。
这是理想情况,实际上当副本节点i向其他节点发出CheckPoint消息后,其他节点还没有完成K条请求,所以不会立即对i的请求作出响应,它还会按照自己的节奏,向前行进,但此时发出的CheckPoint并未形成stable。
为了防止i的处理请求过快,设置一个上文提到的 高低水位区间[h, H] 来解决这个问题。低水位h等于上一个stable checkpoint的编号,高水位H = h + L,其中L是我们指定的数值,等于checkpoint周期处理请求数K的整数倍,可以设置为L = 2K。当副本节点i处理请求超过高水位H时,此时就会停止脚步,等待stable checkpoint发生变化,再继续前进。
在区块链场景中,一般适合于对强一致性有要求的私有链和联盟链场景。例如,在IBM主导的区块链超级账本项目中,PBFT是一个可选的共识协议。在Hyperledger的Fabric项目中,共识模块被设计成可插拔的模块,支持像PBFT、Raft等共识算法。
Raft基于领导者驱动的共识模型,其中将选举一位杰出的领导者(Leader),而该Leader将完全负责管理集群,Leader负责管理Raft集群的所有节点之间的复制日志。
下图中,将在启动过程中选择集群的Leader(S1),并为来自客户端的所有命令/请求提供服务。 Raft集群中的所有节点都维护一个分布式日志(复制日志)以存储和提交由客户端发出的命令(日志条目)。 Leader接受来自客户端的日志条目,并在Raft集群中的所有关注者(S2,S3,S4,S5)之间复制它们。
在Raft集群中,需要满足最少数量的节点才能提供预期的级别共识保证, 这也称为法定人数。 在Raft集群中执行操作所需的最少投票数为 (N / 2 +1) ,其中N是组中成员总数,即 投票至少超过一半 ,这也就是为什么集群节点通常为奇数的原因。 因此,在上面的示例中,我们至少需要3个节点才能具有共识保证。
如果法定仲裁节点由于任何原因不可用,也就是投票没有超过半数,则此次协商没有达成一致,并且无法提交新日志。
数据存储:Tidb/TiKV
日志:阿里巴巴的 DLedger
服务发现:Consul& etcd
集群调度:HashiCorp Nomad
只能容纳故障节点(CFT),不容纳作恶节点
顺序投票,只能串行apply,因此高并发场景下性能差
Raft通过解决围绕Leader选举的三个主要子问题,管理分布式日志和算法的安全性功能来解决分布式共识问题。
当我们启动一个新的Raft集群或某个领导者不可用时,将通过集群中所有成员节点之间协商来选举一个新的领导者。 因此,在给定的实例中,Raft集群的节点可以处于以下任何状态: 追随者(Follower),候选人(Candidate)或领导者(Leader)。
系统刚开始启动的时候,所有节点都是follower,在一段时间内如果它们没有收到Leader的心跳信号,follower就会转化为Candidate;
如果某个Candidate节点收到大多数节点的票,则这个Candidate就可以转化为Leader,其余的Candidate节点都会回到Follower状态;
一旦一个Leader发现系统中存在一个Leader节点比自己拥有更高的任期(Term),它就会转换为Follower。
Raft使用基于心跳的RPC机制来检测何时开始新的选举。 在正常期间, Leader 会定期向所有可用的 Follower 发送心跳消息(实际中可能把日志和心跳一起发过去)。 因此,其他节点以 Follower 状态启动,只要它从当前 Leader 那里收到周期性的心跳,就一直保持在 Follower 状态。
当 Follower 达到其超时时间时,它将通过以下方式启动选举程序:
根据 Candidate 从集群中其他节点收到的响应,可以得出选举的三个结果。
共识算法的实现一般是基于复制状态机(Replicated state machines),何为 复制状态机 :
简单来说: 相同的初识状态 + 相同的输入 = 相同的结束状态 。不同节点要以相同且确定性的函数来处理输入,而不要引入一下不确定的值,比如本地时间等。使用replicated log是一个很不错的注意,log具有持久化、保序的特点,是大多数分布式系统的基石。
有了Leader之后,客户端所有并发的请求可以在Leader这边形成一个有序的日志(状态)序列,以此来表示这些请求的先后处理顺序。Leader然后将自己的日志序列发送Follower,保持整个系统的全局一致性。注意并不是强一致性,而是 最终一致性 。
日志由有序编号(log index)的日志条目组成。每个日志条目包含它被创建时的任期号(term),和日志中包含的数据组成,日志包含的数据可以为任何类型,从简单类型到区块链的区块。每个日志条目可以用[ term, index, data]序列对表示,其中term表示任期, index表示索引号,data表示日志数据。
Leader 尝试在集群中的大多数节点上执行复制命令。 如果复制成功,则将命令提交给集群,并将响应发送回客户端。类似两阶段提交(2PC),不过与2PC的区别在于,leader只需要超过一半节点同意(处于工作状态)即可。
leader 、 follower 都可能crash,那么 follower 维护的日志与 leader 相比可能出现以下情况
当出现了leader与follower不一致的情况,leader强制follower复制自己的log, Leader会从后往前试 ,每次AppendEntries失败后尝试前一个日志条目(递减nextIndex值), 直到成功找到每个Follower的日志一致位置点(基于上述的两条保证),然后向后逐条覆盖Followers在该位置之后的条目 。所以丢失的或者多出来的条目可能会持续多个任期。
要求候选人的日志至少与其他节点一样最新。如果不是,则跟随者节点将不投票给候选者。
意味着每个提交的条目都必须存在于这些服务器中的至少一个中。如果候选人的日志至少与该多数日志中的其他日志一样最新,则它将保存所有已提交的条目,避免了日志回滚事件的发生。
即任一任期内最多一个leader被选出。这一点非常重要,在一个复制集中任何时刻只能有一个leader。系统中同时有多余一个leader,被称之为脑裂(brain split),这是非常严重的问题,会导致数据的覆盖丢失。在raft中,两点保证了这个属性:
因此, 某一任期内一定只有一个leader 。
当集群中节点的状态发生变化(集群配置发生变化)时,系统容易受到系统故障。 因此,为防止这种情况,Raft使用了一种称为两阶段的方法来更改集群成员身份。 因此,在这种方法中,集群在实现新的成员身份配置之前首先更改为中间状态(称为联合共识)。 联合共识使系统即使在配置之间进行转换时也可用于响应客户端请求,它的主要目的是提升分布式系统的可用性。
⑼ 软件开发区块链各种系统是怎么做的
区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法。