区块链mod 区块链模板

波场币 176 0

本篇文章给大家谈谈区块链mod,以及区块链模板对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

区块链密码算法是怎样的?

区块链作为新兴技术受到越来越广泛的关注,是一种传统技术在互联网时代下的新的应用,这其中包括分布式数据存储技术、共识机制和密码学等。随着各种区块链研究联盟的创建,相关研究得到了越来越多的资金和人员支持。区块链使用的Hash算法、零知识证明、环签名等密码算法:

Hash算法

哈希算法作为区块链基础技术,Hash函数的本质是将任意长度(有限)的一组数据映射到一组已定义长度的数据流中。若此函数同时满足:

(1)对任意输入的一组数据Hash值的计算都特别简单;

(2)想要找到2个不同的拥有相同Hash值的数据是计算困难的。

满足上述两条性质的Hash函数也被称为加密Hash函数,不引起矛盾的情况下,Hash函数通常指的是加密Hash函数。对于Hash函数,找到使得被称为一次碰撞。当前流行的Hash函数有MD5,SHA1,SHA2,SHA3。

比特币使用的是SHA256,大多区块链系统使用的都是SHA256算法。所以这里先介绍一下SHA256。

1、 SHA256算法步骤

STEP1:附加填充比特。对报文进行填充使报文长度与448模512同余(长度=448mod512),填充的比特数范围是1到512,填充比特串的最高位为1,其余位为0。

STEP2:附加长度值。将用64-bit表示的初始报文(填充前)的位长度附加在步骤1的结果后(低位字节优先)。

STEP3:初始化缓存。使用一个256-bit的缓存来存放该散列函数的中间及最终结果。

STEP4:处理512-bit(16个字)报文分组序列。该算法使用了六种基本逻辑函数,由64 步迭代运算组成。每步都以256-bit缓存值为输入,然后更新缓存内容。每步使用一个32-bit 常数值Kt和一个32-bit Wt。其中Wt是分组之后的报文,t=1,2,...,16 。

STEP5:所有的512-bit分组处理完毕后,对于SHA256算法最后一个分组产生的输出便是256-bit的报文。

作为加密及签名体系的核心算法,哈希函数的安全性事关整个区块链体系的底层安全性。所以关注哈希函数的研究现状是很有必要的。

2、 Hash函的研究现状

2004年我国密码学家王小云在国际密码讨论年会(CRYPTO)上展示了MD5算法的碰撞并给出了第一个实例(Collisions for hash functions MD4, MD5, HAVAL-128 and RIPEMD,rump session of CRYPTO 2004,How to Break MD5 and Other Hash Functions,EuroCrypt 2005)。该攻击复杂度很低,在普通计算机上只需要几秒钟的时间。2005年王小云教授与其同事又提出了对SHA-1算法的碰撞算法,不过计算复杂度为2的63次方,在实际情况下难以实现。

2017年2月23日谷歌安全博客上发布了世界上第一例公开的SHA-1哈希碰撞实例,在经过两年的联合研究和花费了巨大的计算机时间之后,研究人员在他们的研究网站SHAttered上给出了两个内容不同,但是具有相同SHA-1消息摘要的PDF文件,这就意味着在理论研究长期以来警示SHA-1算法存在风险之后,SHA-1算法的实际攻击案例也浮出水面,同时也标志着SHA-1算法终于走向了生命的末期。

NIST于2007年正式宣布在全球范围内征集新的下一代密码Hash算法,举行SHA-3竞赛。新的Hash算法将被称为SHA-3,并且作为新的安全Hash标准,增强现有的FIPS 180-2标准。算法提交已于2008年10月结束,NIST 分别于2009年和2010年举行2轮会议,通过2轮的筛选选出进入最终轮的算法,最后将在2012年公布获胜算法。公开竞赛的整个进程仿照高级加密标准AES 的征集过程。2012年10月2日,Keccak被选为NIST竞赛的胜利者,成为SHA-3。

Keccak算法是SHA-3的候选人在2008年10月提交。Keccak采用了创新的的“海绵引擎”散列消息文本。它设计简单,方便硬件实现。Keccak已可以抵御最小的复杂度为2n的攻击,其中N为散列的大小。它具有广泛的安全边际。目前为止,第三方密码分析已经显示出Keccak没有严重的弱点。

KangarooTwelve算法是最近提出的Keccak变种,其计算轮次已经减少到了12,但与原算法比起来,其功能没有调整。

零知识证明

在密码学中零知识证明(zero-knowledge proof, ZKP)是一种一方用于向另一方证明自己知晓某个消息x,而不透露其他任何和x有关的内容的策略,其中前者称为证明者(Prover),后者称为验证者(Verifier)。设想一种场景, 在一个系统中, 所有用户都拥有各自全部文件的备份, 并利用各自的私钥进行加密后在系统内公开。 假设在某个时刻,用户Alice希望提供给用户Bob她的一部分文件,这时候出现的问题是Alice如何让Bob相信她确实发送了正确的文件。一个简单地处理办法是Alice将自己的私钥发给Bob,而这正是 Alice不希望选择的策略,因为这样 Bob可以轻易地获取到Alice的全部文件内容。零知识证明便是可以用于解决上述问题的一种方案。零知识证明主要基于复杂度理论,并且在密码学中有广泛的理论延伸。在复杂度理论中,我们主要讨论哪些语言可以进行零知识证明应用,而在密码学中,我们主要讨论如何构造各种类型的零知识证明方案,并使得其足够优秀和高效。

环签名群签名

1、群签名

在一个群签名方案中,一个群体中的任意一个成员可以以匿名的方式代表整个群体对消息进行签名。与其他数字签名一样,群签名是可以公开验证的,且可以只用单个群公钥来验证。群签名一般流程:

(1)初始化,群管理者建立群资源,生成对应的群公钥(Group Public Key)和群私钥(Group Private Key)群公钥对整个系统中的所有用户公开,比如群成员、验证者等。

(2)成员加入,在用户加入群的时候,群管理者颁发群证书(Group Certificate)给群成员。

(3)签名,群成员利用获得的群证书签署文件,生成群签名。

(4)验证,同时验证者利用群公钥仅可以验证所得群签名的正确性,但不能确定群中的正式签署者。

(5)公开,群管理者利用群私钥可以对群用户生成的群签名进行追踪,并暴露签署者身份。

2、环签名

2001年,Rivest, shamir和Tauman三位密码学家首次提出了环签名。是一种简化的群签名,只有环成员没有管理者,不需要环成员间的合作。环签名方案中签名者首先选定一个临时的签名者集合,集合中包括签名者。然后签名者利用自己的私钥和签名集合中其他人的公钥就可以独立的产生签名,而无需他人的帮助。签名者集合中的成员可能并不知道自己被包含在其中。

环签名方案由以下几部分构成:

(1)密钥生成。为环中每个成员产生一个密钥对(公钥PKi,私钥SKi)。

(2)签名。签名者用自己的私钥和任意n个环成员(包括自己)的公钥为消息m生成签名a。

(3)签名验证。验证者根据环签名和消息m,验证签名是否为环中成员所签,如果有效就接收,否则丢弃。

环签名满足的性质:

(1)无条件匿名性:攻击者无法确定签名是由环中哪个成员生成,即使在获得环成员私钥的情况下,概率也不超过1/n。

(2)正确性:签名必需能被所有其他人验证。

(3)不可伪造性:环中其他成员不能伪造真实签名者签名,外部攻击者即使在获得某个有效环签名的基础上,也不能为消息m伪造一个签名。

3、环签名和群签名的比较

(1)匿名性。都是一种个体代表群体签名的体制,验证者能验证签名为群体中某个成员所签,但并不能知道为哪个成员,以达到签名者匿名的作用。

(2)可追踪性。群签名中,群管理员的存在保证了签名的可追踪性。群管理员可以撤销签名,揭露真正的签名者。环签名本身无法揭示签名者,除非签名者本身想暴露或者在签名中添加额外的信息。提出了一个可验证的环签名方案,方案中真实签名者希望验证者知道自己的身份,此时真实签名者可以通过透露自己掌握的秘密信息来证实自己的身份。

(3)管理系统。群签名由群管理员管理,环签名不需要管理,签名者只有选择一个可能的签名者集合,获得其公钥,然后公布这个集合即可,所有成员平等。

链乔教育在线旗下学硕创新区块链技术工作站是中国教育部学校规划建设发展中心开展的“智慧学习工场2020-学硕创新工作站 ”唯一获准的“区块链技术专业”试点工作站。专业站立足为学生提供多样化成长路径,推进专业学位研究生产学研结合培养模式改革,构建应用型、复合型人才培养体系。

高中生如何理解比特币加密算法

加密算法是数字货币的基石,比特币的公钥体系采用椭圆曲线算法来保证交易的安全性。这是因为要攻破椭圆曲线加密就要面对离散对数难题,目前为止还没有找到在多项式时间内解决的办法,在算法所用的空间足够大的情况下,被认为是安全的。本文不涉及高深的数学理论,希望高中生都能看懂。

密码学具有久远的历史,几乎人人都可以构造出加解密的方法,比如说简单地循环移位。古老或简单的方法需要保密加密算法和秘钥。但是从历史上长期的攻防斗争来看,基于加密方式的保密并不可靠,同时,长期以来,秘钥的传递也是一个很大的问题,往往面临秘钥泄漏或遭遇中间人攻击的风险。

上世纪70年代,密码学迎来了突破。Ralph C. Merkle在1974年首先提出非对称加密的思想,两年以后,Whitfield Diffie和Whitfield Diffie两位学者以单向函数和单向暗门函数为基础提出了具体的思路。随后,大量的研究和算法涌现,其中最为著名的就是RSA算法和一系列的椭圆曲线算法。

无论哪一种算法,都是站在前人的肩膀之上,主要以素数为研究对象的数论的发展,群论和有限域理论为基础。内容加密的秘钥不再需要传递,而是通过运算产生,这样,即使在不安全的网络中进行通信也是安全的。密文的破解依赖于秘钥的破解,但秘钥的破解面临难题,对于RSA算法,这个难题是大数因式分解,对于椭圆曲线算法,这个难题是类离散对数求解。两者在目前都没有多项式时间内的解决办法,也就是说,当位数增多时,难度差不多时指数级上升的。

那么加解密如何在公私钥体系中进行的呢?一句话,通过在一个有限域内的运算进行,这是因为加解密都必须是精确的。一个有限域就是一个具有有限个元素的集合。加密就是在把其中一个元素映射到另一个元素,而解密就是再做一次映射。而有限域的构成与素数的性质有关。

前段时间,黎曼猜想(与素数定理关系密切)被热炒的时候,有一位区块链项目的技术总监说椭圆曲线算法与素数无关,不受黎曼猜想证明的影响,就完全是瞎说了。可见区块链项目内鱼龙混杂,确实需要好好洗洗。

比特币及多数区块链项目采用的公钥体系都是椭圆曲线算法,而非RSA。而介绍椭圆曲线算法之前,了解一下离散对数问题对其安全性的理解很有帮助。

先来看一下 费马小定理 :

原根 定义:

设(a, p)=1 (a与p互素),满足

的最下正整数 l,叫作a模p的阶,模p阶为(最大值)p-1的整数a叫作模p的原根。

两个定理:

基于此,我们可以看到,{1, 2, 3, … p-1} 就是一个有限域,而且定义运算 gi (mod p), 落在这个有限域内,同时,当i取0~p-2的不同数时,运算结果不同。这和我们在高中学到的求幂基本上是一样的,只不过加了一层求模运算而已。

另一点需要说明的是,g的指数可以不限于0~p-2, 其实可以是所有自然数,但是由于

所以,所有的函数值都是在有限域内,而且是连续循环的。

离散对数定义:

设g为模p的原根,(a,p) = 1,

我们称 i 为a(对于模p的原根g)的指数,表示成:

这里ind 就是 index的前3个字母。

这个定义是不是和log的定义很像?其实这也就是我们高中学到的对数定义的扩展,只不过现在应用到一个有限域上。

但是,这与实数域上的对数计算不同,实数域是一个连续空间,其上的对数计算有公式和规律可循,但往往很难做到精确。我们的加密体系里需要精确,但是在一个有限域上的运算极为困难,当你知道幂值a和对数底g,求其离散对数值i非常困难。

当选择的素数P足够大时,求i在时间上和运算量上变得不可能。因此我们可以说i是不能被计算出来的,也就是说是安全的,不能被破解的。

比特币的椭圆曲线算法具体而言采用的是 secp256k1算法。网上关于椭圆曲线算法的介绍很多,这里不做详细阐述,大家只要知道其实它是一个三次曲线(不是一个椭圆函数),定义如下:

那么这里有参数a, b;取值不同,椭圆曲线也就不同,当然x, y 这里定义在实数域上,在密码体系里是行不通的,真正采用的时候,x, y要定义在一个有限域上,都是自然数,而且小于一个素数P。那么当这个椭圆曲线定义好后,它反应在坐标系中就是一些离散的点,一点也不像曲线。但是,在设定的有限域上,其各种运算是完备的。也就是说,能够通过加密运算找到对应的点,通过解密运算得到加密前的点。

同时,与前面讲到的离散对数问题一样,我们希望在这个椭圆曲线的离散点阵中找到一个有限的子群,其具有我们前面提到的遍历和循环性质。而我们的所有计算将使用这个子群。这样就建立好了我们需要的一个有限域。那么这里就需要子群的阶(一个素数n)和在子群中的基点G(一个坐标,它通过加法运算可以遍历n阶子群)。

根据上面的描述,我们知道椭圆曲线的定义包含一个五元祖(P, a, b, G, n, h);具体的定义和概念如下:

P: 一个大素数,用来定义椭圆曲线的有限域(群)

a, b: 椭圆曲线的参数,定义椭圆曲线函数

G: 循环子群中的基点,运算的基础

n: 循环子群的阶(另一个大素数, P )

h:子群的相关因子,也即群的阶除以子群的阶的整数部分。

好了,是时候来看一下比特币的椭圆曲线算法是一个怎样的椭圆曲线了。简单地说,就是上述参数取以下值的椭圆曲线:

椭圆曲线定义了加法,其定义是两个点相连,交与图像的第三点的关于x轴的对称点为两个点的和。网上这部分内容已经有很多,这里不就其细节进行阐述。

但细心的同学可能有个疑问,离散对数问题的难题表现在求幂容易,但求其指数非常难,然而,椭圆曲线算法中,没有求幂,只有求乘积。这怎么体现的是离散对数问题呢?

其实,这是一个定义问题,最初椭圆曲线算法定义的时候把这种运算定义为求和,但是,你只要把这种运算定义为求积,整个体系也是没有问题的。而且如果定义为求积,你会发现所有的操作形式上和离散对数问题一致,在有限域的选择的原则上也是一致的。所以,本质上这还是一个离散对数问题。但又不完全是简单的离散对数问题,实际上比一般的离散对数问题要难,因为这里不是简单地求数的离散对数,而是在一个自定义的计算上求类似于离散对数的值。这也是为什么椭圆曲线算法采用比RSA所需要的(一般2048位)少得多的私钥位数(256位)就非常安全了。

简评三个基于VRF的共识算法

上交所技术公司  朱立

Algorand、Dfinity和Ouroboros Praos三个共识算法(Dfinity虽然是项目名,这里用来称呼其共识算法也应无不妥)近期较受关注,而且都是基于VRF(Verifiable Random Function) 设计,可以对照学习。Algorand的版本很多,以下单指  1607.01341v9 ,暂称其为Algorand'(笔者手中另有Algorand的 最新版本 ,其中已对下文提及的几处问题完成了修正,可与本文参看)。

一、VRF的共性

VRF的意义很好理解——用以完成出块人(群)的随机选择。为此,VRF的返回值应尽力难以预测。先看Algorand'和Dfinity的套路是怎么做的区块链mod:大体上是先将前一个随机数(最初的随机数却是协议给定的)和某种代表高度、轮次的变量进行组合,用某种私钥对之进行签名(或者是先签名再组合),最后哈希一下得出最新的随机数。这样产生的随机数旁人很容易验证其合乎算法,"V"就这样得到了;而哈希返回值又是随机分布的,“R”也因此得到保证。在此过程中,为降低操纵结果的可能性,有两个注意事项区块链mod: A) 签名算法应当具有唯一性,也就是用同一把私钥对同样的信息进行签名,只有一个合法签名可以通过验证——普通的非对称加解密算法一般不具备这个属性,如SM2。如果用的签名算法没有这种uniqueness属性,那在生成新随机数的时候就存在通过反复多次尝试签名以挑出最有利者的余地,会降低安全性。 B) 避免在生成新随机数时将当前块的数据作为随机性来源之一,比如引用本块交易列表的merkle root值等等,因为这样做会给出块人尝试变更打包交易顺序、尝试打包不同交易以产生最有利的新随机数的余地。在设计和检视新的共识算法时,以上两个注意事项是要特别留意的。

考察一下VRF的返回结果应该如何运用。目前所见用法中,VRF的返回结果可以用来公开完成节点或节点群体的选择,也可以私密地完成选择。以Dfinity为例,它是利用mod操作来唯一、公开地确定一个Group。Algorand'、Ouroboros Praos是私密选择的范例,大致套路是对VRF的最新返回值,配上轮次等变量后用私钥进行签名并哈希,如果哈希值小于某个阈值,节点就可以私密地知道自己被选中。这种方法很可能在网络节点数较多时的表现会更稳定,否则幸运儿个数上下波动会较大,进而影响协议表现,包括空块和分叉。

二、简评强同步假设版本的Algorand'

私密选择提供了较强的抗击定点攻击的能力,但由于幸运儿的总数对于任何一个幸运儿都是不能预知的,也因此给后续共识算法的设计和区块链的优化带来了困难。Algorand‘采用了很强的同步网络假设(同步网络假设下的共识算法当然容易做一些),要求预先知道网络消息传播时间的上限:在固定时间内完成对固定比例的用户的网络传播。比如要知道,1KB消息,在1秒钟内完成全网95%的传播,而1MB消息需要1.5分钟完成全网95%的传播。但这个传输上限应该如何选择? 通过一段时间的统计结果再乘以一个系数这种经验统计?只能说“感觉上可以”,但如果要严谨和安全,Algorand‘算法应该补充证明即使在遭遇DDOS或互联网拥堵的情况下消息传播严重超限后算法仍然能够保证安全——然而这个证明是缺失的。作为对照,Ouroboros Praos公开承认之前在同步网络假设下设计的Ouroboros协议在异步网络条件下会出错,所以才又做了Ouroboros Praos;新版本的Algorand承认在弱同步网络时会在不同的块上达成共识(后续网络恢复强同步时分叉可以得到解决)云云,这些都可资参考。

即使我们暂且认可Algorand'算法可以通过设定一个很大的传播时间上限来回应上述问题,但随之而来的是此时可以看出此算法缺乏一个非常好的特性:Responsiveness。这个特性指的是:若一个协议被设计为在一个较大的传播时间上限DELTA下工作,但若实际传播时间是较小的delta,则协议的实际推进步调将只和delta有关,这种协议被称为Responsive的。具有Responsive特性的共识算法再配以同步网络假设会非常理想——出于安全,上限可以设置很大,然而协议执行速度只和当时网络条件有关。Algorand'并不具有这种特性。平均而言,Algorand'完成共识所需的消息传送次数是11轮,每轮如果要确保安全,完成共识的时间就会很长,单个分区的吞吐量就不会太高。当然,架构设计涉及很多取舍,最终评价一个算法好还是不好还是要回到初心——准备拿来实现的目标是什么。上述分析只是尝试客观地指出Algorand'算法的几个少为人知的固有特征,供读者自行评估。

三、简评Dfinity的可扩展性问题

私密选择并且立即上任的做法,也给系统分片带来了极大挑战。Dfinity是明确要做分片(Sharding)的,所以必须直面挑战。可扩展性问题非常复杂,完整解决这个问题需要通盘考虑网络、存储、计算三方面的可扩展性——时下大多数区块链3.0项目只注意到计算的分片和可扩展性,忽略了其余二者,从而不可能真正实现理想的扩展。由于公链节点网络带宽的制约,计算合约所需的数据通常很难迅速地从一个节点拷贝到另一节点,所以就算用VRF实现了飘忽来去的出块节点选择,存储节点是没法同样飘逸如风的。明显的选择有那么几个:全部节点存储全部数据,不同节点静态地分配用来存储不同分区。前者的可扩展性很差,对于后者而言,如果出块节点漂浮不定且出块节点还需要完成合约运算,就意味着基于P2P网络来回远程访问存储,性能多半急剧下降;动态决定的出块节点只完成排序共识,计算能力和存储捆绑,通过静态分区提供可扩展性,可能是合理的应对。然而,最可恨的就是“然而”二字——即使如此,系统还存在一处对存储和网络构成压力的所在:最终用户提交的待打包交易。普通公链(先不考虑EOS那种)的带宽有限,如果用户提交的待打包交易必须粗放型地全网泛滥传播,那现有网络带宽可以提供多少TPS?如果出块节点是静态分区或者至少提前一段时间公开知晓,事情尚有回旋余地;如果出块节点是如此飘忽不定,而且直到最后一刻也只有这些节点自己知道,那无论是用户还是出块节点候选人看起来最直接的应对之道就是全网泛滥传播全部待打包交易、保存全部待打包交易,这样带宽和存储仍然成为系统瓶颈。

所以这里碰到的,本质上还是安全、可扩展性、去中心化的不可能三角。

四、简评Ouroboros Praos

BM怼 Ouroboros的文字已经流传广泛。BM的话当然有些明显是不对的,比如Ouroboros的DPOS是指"Dynamic [stake distribution] POS"而不是BM的Delegate POS,但其关于Pareto分布的评论则值得玩味。如果我们仔细浏览后出的Ouroboros Praos,可以发现协议的安全假设和安全证明完全没有考虑经济博弈因素,因此洋洋洒洒的证明很可能会不得要领而错过真正需要防护的方向——毕竟一直以来POS/DPOS这些协议的血管里面流淌的就是基于经济博弈和人性进行设计的血液。最明显的例子是在forward secure signature的实现方法上,协议目前的设计是要求每个好的节点自觉主动地安全删除用过的私钥,而完全没有考虑近乎零的私钥保存成本如何面对bribe attack的诱惑,然而这却是值得考虑的。除了形式化证明之外,Ouroboros Praos本身并没有太多值得关注的协议特征,总体上就是用VRF抽签结合POS算法并针对某些安全假设进行了形式化证明,其做事的态度是非常值得赞赏的。

五、总结

这几个算法本身颇有创意,也很值得学习。与此同时,在看过以太坊CASPER目前披露的分区技术后,笔者的体会是:区块链3.0的竞争才刚刚开始,从以太坊团队的技术路线看,他们的技术考量和选择要比很多宣称要超越以太坊的团队来得深刻和全面。如果当真要超越以太坊,还是应该先从理解以太坊开始。

顺便感谢趣链邱炜伟博士对本文的贡献!

区块链 --- 共识算法

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使用了一种称为两阶段的方法来更改集群成员身份。 因此,在这种方法中,集群在实现新的成员身份配置之前首先更改为中间状态(称为联合共识)。 联合共识使系统即使在配置之间进行转换时也可用于响应客户端请求,它的主要目的是提升分布式系统的可用性。

零知识证明

零知识简洁区块链mod的非交互知识论证(zk SNARK)是一种真正巧妙区块链mod的方法区块链mod,可以在不透露任何其他信息区块链mod的情况下证明某件事是真的,然而,为什么它首先是有用的呢?

零知识证明在无数应用中是有利的,包括:

关于私人数据的证明声明:

匿名授权:

匿名付款:

外包计算:

尽管表面上听起来很棒,但底层方法是数学和密码学的“奇迹”,自 1985 年在主要著作“交互式证明系统的知识复杂性中引入以来,已经进行了第四个十年的研究 随后引入了非交互式证明,这在区块链的背景下尤为重要。

在任何零知识证明系统中,都有一个验证人想要说服验证人某些陈述是真实的,而不披露任何其他信息,例如,验证人了解到验证人的银行账户中有X多个,但没有其他信息(即,未披露实际金额)。协议应满足三个属性:

区块链mod我们从简单开始,并尝试证明某些东西,而不必担心零知识,非交互性,其形式和适用性。

想象一下,我们有一个长度为 10 数组,我们想向验证者(例如程序)证明所有这些位都设置为 1,即我们知道一个数组,使得每个元素都等于 1。

验证者一次只能检查 (即读取) 一个元素。为了验证语句,可以通过以某种任意顺序读取元素,并检查它是否真正等于1,如果是,则在第一次检查后该语句的置信度为10%,或者如果该位不等于1,则语句完全无效。验证者必须进入下一轮,直到他获得足够的信心。在一些情况下,可以信任证明者并且只需要50% 置信度,在需要95% 置信度的其他情况下,必须检查所有单元。很明显,这种证明协议的缺点是,必须进行与元素数量成比例的检查数量,如果我们考虑数百万个元素的数组,这是不切实际的。

让我们考虑多项式,有一个曲线对应于多项式: 。多项式有一个有利的性质,即如果我们有两个不相等的次数最多为 d 的多项式,它们相交的点不超过 d。 例如,让我们稍微修改原始多项式 。如果我们想找到两个多项式的交点,我们需要将它们等同起来。例如,要找到多项式与x轴相交的位置 (即 ),我们将 等同,并且此类方程的解将是那些共享点: , 和 。

同样,我们可以将多项式的原始版本和修改版本等同起来,以找到它们的交点。所得的多项式为1,且有明显的解 。因此只有一个交点。

对于任意次数为 d 的多项式,任何此类方程的结果始终是另一个次数最多为 d 的多项式,因为没有乘法可以产生更高的次数。 示例: ,简化为 。代数基本定理告诉我们,d 次多项式最多可以有 d 个解。因此,我们可以得出结论,任意点处的任何多项式的求值类似于其唯一身份的表示。让我们在x = 10处评估我们的示例多项式。

事实上,在所有要计算的x选项中,最多只有3个选项在这些多项式中具有相同的计算,而所有其他选项都会不同。这就是为什么如果证明者声称知道一些多项式 (无论其次数有多大),他们可以遵循一个简单的协议来验证语句:

例如,如果我们考虑 x 从 1 到 的整数范围,则评估不同的点数为 。 此后,x 意外“击中”任何 个共享点的概率等于 ,这被认为可以忽略不计。

注意:与无效位检查协议相比,新协议只需要一轮,并且在声明中给出了压倒性的信心(假设 d 充分小于范围的上限,几乎 100%)。

这就是为什么多项式是zk-SNARK的核心,尽管也可能存在其他证明介质。

我们从证明多项式知识的问题开始,然后采用通用方法。 在此过程中,我们将发现多项式的许多其他性质。 到目前为止的讨论集中,关注一个弱的证明概念上,即各方必须相互信任,因为还没有措施来执行协议的规则。 例如,证明者不需要知道多项式,他可以使用任何其他可用的方法来得出正确的结果。 此外,如果验证者的多项式评估的幅度不大,比如说 10,验证者可以猜测一个数字,并且它被接受的概率是不可忽略的。 我们必须解决协议的这种弱点,但首先知道多项式意味着什么? 多项式可以表示为以下形式(其中 n 是多项式的次数):

如果有人说他知道一个 1 次多项式(即 ),那意味着他真正知道的是系数 。 此外,系数可以有任何值,包括 0。让我们说,证明者声称知道3次多项式,使得x = 1和x = 2是所有可能解中的两个。这样的有效多项式之一是 。

代数的基本定理指出,只要多项式是可解的,任何多项式都可以分解为线性多项式 (即代表直线的1次多项式)。因此,我们可以将任何有效多项式表示为其因子的乘积:

同样,如果这些因子中的任何一个为零,则整个方程为零,因此,所有 都是唯一的解。我们的示例可以分解为以下多项式:

x的值是:0,1,2,你可以很容易地在多项式的任一形式上检查这一点。

回到证明者声称他知道根为 1 和 2 的 3 次多项式,这意味着他的多项式具有以下形式:

换句话说,(x − 1) 和 (x − 2) 是所讨论的多项式的余因子。因此,如果证明者想要证明他的多项式确实具有这些根而不公开多项式本身,则他需要证明他的多项式p(x) 是那些协因子 的乘法,称为目标多项式,和一些任意多项式h(x) ,即:

换句话说,p(x) 具有t(x) 的所有根。找到h(x) 的自然方法是通过除法 。如果证明者找不到这样的h(x),这意味着p(x) 没有必要的协因子t(x),在这种情况下,多项式除法将具有余数。在我们的示例中,如果我们将 除以 。我们得到了无余数的结果 。

使用我们的多项式身份检查协议,我们可以比较多项式 和 :

为了将其付诸实践,让我们在示例中执行此协议:

相反,如果证明者使用不同的 ,它没有正确的辅因子,例如 ,那么:

我们将得到 ,余数为 ,即: 。这意味着证明者必须将余数除以 才能评估 。因此,由于验证者对x的随机选择,因此对于余数 被t(x) 整除的概率很低,因此,如果验证者将检查p和h补是整数,这样的证明将被拒绝。但是,该检查要求多项式系数也必须是整数。

现在,我们可以在不学习多项式本身的情况下检查多项式的特定属性,因此这已经为我们提供了某种形式的零知识和简洁。尽管如此,此构造仍存在多个问题:

我们将在以下部分解决所有问题。

在上文中,如果将 和 不是明文给出,而是作为黑匣子给出,那将是理想的选择,因此人们无法篡改协议,但仍然能够计算对这些模糊值。类似于哈希函数,因此在计算时很难返回到原始输入。

这正是同态加密的目的。也就是说,它允许对一个值进行加密,并能够对这种加密应用算术运算。有多种方法可以实现加密的同态特性,我们将简要介绍一种简单的方法。

一般的想法是,我们选择一个基数的自然数g(比如5),然后对一个值进行加密,我们将g乘以该值的幂。例如,如果我们想要加密数字3:

其中125是3的加密。如果要将这个加密的数字乘以2,则将其提高为2的指数:

我们能够将未知值乘以2,并对其进行加密。我们还可以通过乘法添加两个加密值,例如3+2:

同样,我们可以通过除法减去加密的数字,例如5 − 3:

但是,由于基数5是公共的,因此很容易回到秘密数字,将加密的数字除以5,直到结果为1。除法的次数即为明文。

这就是模算法发挥作用的地方。模运算的思想如下:我们声明只选择前n个自然数,即0,1,…,n-1而不是拥有一个无限的数字集。如果任何给定的整数不在这个范围内,我们将其“环绕”。例如,让我们先选择六个数字。为了说明这一点,请考虑一个具有六个相等单位刻度的圆;这是我们的射程。

现在让我们看看数字8将落在哪里。 打个比方,我们可以把它想象成一根绳子,它的长度是八个单位。如果我们把绳子连接到圆圈的开头并开始将绳子缠绕在它周围,旋转一圈后,我们还剩下一部分绳子.因此,如果我们继续这个过程,绳子将在2处结束。

它是模运算的结果。 不管绳子有多长,它总是会停在圆圈的刻度之一处。 因此,模运算将使其保持在一定范围内。 15 个单位的绳索将在 3 处停止,即 6 + 6 + 3(两个完整的圆圈,剩余 3 个单位)。 负数的工作方式相同,唯一的区别是我们将其包装在相反的方向,对于 -8,结果将是 4。

而且,我们可以进行算术运算,结果总是在n个数的范围内。 我们现在将使用符号“mod ”来表示数字的范围。 例如:3 × 5 = 3 (mod 6); 5 + 2 = 1 (mod 6).

此外,最重要的特性是运算顺序无关紧要,例如,我们可以先执行所有运算,然后在每次运算后应用模或应用模。例如: 相当于:2 × 4 = 2 (mod 6); 2 − 1 = 1 (mod 6); 1 × 3 = 3 (mod 6).

那到底为什么有帮助呢?事实证明,如果我们使用模算术,则具有运算结果,回到原始数字是不平凡的,因为许多不同的组合将具有相同的结果: 5 × 4 = 2 (mod 6); 4 × 2 = 2 (mod 6); 2 × 1 = 2 (mod 6).

如果没有模算术,结果的大小为它的解决方案提供了线索。 否则,这条信息会被隐藏,而常见的算术属性会被保留。

如果我们回到同态加密并使用模运算,例如模 7,我们将得到:

和不同的指数会有相同的结果:

这是很难找到指数的地方。 事实上,如果模数足够大,这样做就变得不可行,而现代密码学的很大一部分是基于这个问题的“难度”。该方案的所有同态属性都保留在模领域中:

encryption:

multiplication:

addition:

让我们明确说明加密函数: ,其中 v 是我们要加密的值。

这种同态加密方案存在局限性,尽管我们可以将加密值乘以未加密值,但我们不能将两个加密值乘以 (和除以),也不能对加密值求幂。虽然从第一印象来看是不幸的,但这些属性将成为zk-SNARK的基石。

有了这样的工具,我们现在可以评估一个加密随机值为x的多项式,并相应地修改零知识协议。

让我们看看如何评估多项式 。正如我们以前建立的那样,多项式就是知道它的系数,在这种情况下,它们是: 1,-3,2。因为同态加密不允许对加密值求幂,所以我们必须得到从1到3的x幂的加密值: , , ,这样我们可以对加密多项式求值如下:

作为这些操作的结果,我们在我们未知的某个 x 处对我们的多项式进行了加密。 这是一个非常强大的机制,并且由于同态特性,相同多项式的加密计算在加密空间中总是相同的。我们现在可以更新协议的先前版本,对于d次多项式:

Verifier:

Prover:

Verifier:

由于证明者对s一无所知,因此很难提出不合法但仍匹配的评估。

虽然在这样的协议中,证明者的敏捷性是有限的,但他仍然可以使用任何其他方法来伪造证明,而无需实际使用所提供的 s 幂的加密,例如,如果证明者声称仅使用 2 次幂 和 有一个令人满意的多项式 ,这在当前协议中无法验证。

多项式的知识是其系数 。 我们在协议中“分配”这些系数的方式是通过对秘密值 s 的相应加密幂求幂(即 )。 我们已经在选择 s 的加密幂时限制了证明者,但这种限制并未强制执行,例如,可以使用任何可能的方法来找到满足方程 的任意值 和 并将它们提供给验证者而不是 和 。 例如,对于一些随机 , 和 ,其中 可以从提供的 s 的加密幂计算。 这就是为什么验证者需要证明仅使用 s 的幂的加密来计算 和 而没有别的。

让我们考虑一个1次多项式的基本例子,该多项式具有一个变量和一个系数 ,相应地,s的加密 。我们正在寻找的是确保只有s的加密,即 ,被一些任意系数c同态“乘以”,而不是其他任何东西。所以对于任意的c,结果必须是 形式。

一种方法是要求对另一个移位的加密值与原始值一起执行相同的操作,充当“校验和”的算术模拟,确保结果是原始值的取幂。这是通过引入的指数知识假设Knowledge-of-Exponent Assumption (或KEA) 来实现的,更确切地说:

Alice有一个值a,她希望Bob指数到任何幂,唯一的要求是只有这个a可以指数,没有别的,以确保她:

因为 Bob 无法从元组 中提取 ,因此推测 Bob 可以产生有效响应的唯一方法是通过以下过程:

最终,这样的协议向Alice提供了一个证据,证明Bob确实将a乘以他已知的某个值,并且他不能进行任何其他操作,例如乘法、加法,因为这将消除 移位关系。

在同态加密上下文中,幂运算是加密值的乘法。我们可以在简单的单系数多项式 的情况下应用相同的构造:

这种结构限制证明者仅使用提供的加密 s,因此证明者可以仅将系数 c 分配给验证者提供的多项式。 我们现在可以将这种单项多项式方法缩放为多项多项式,因为每个项的系数分配是单独计算的,然后同态地“相加”在一起。 因此,如果向证明者提供 s 的加密幂以及它们的移位值,他可以评估原始多项式和移位多项式,其中必须进行相同的检查。 特别是对于 d 次多项式:

对于我们之前的示例多项式 ,这将是:

现在我们可以确定,验证程序除了使用验证程序提供的多项式外,没有使用任何其他方法,因为没有其他方法来保持 移位。此外,如果验证者希望确保在验证者的多项式中排除一些s的幂,例如j,他将不提供加密 及其移位 。

与我们一开始的相比,我们现在有了一个健壮的协议。 然而,无论加密如何,零知识属性仍然存在一个明显的缺点:虽然理论上多项式系数 可以有很大范围的值,但实际上它可能非常有限(上例中为 6),这意味着 验证者可以暴力破解有限范围的系数组合,直到结果等于证明者的答案。 例如,如果我们考虑每个系数的 100 个值的范围,则 2 次多项式将总共有 100 万个不同的组合,考虑到蛮力将需要不到 100 万次迭代。 此外,即使在只有一个系数且其值为 1 的情况下,安全协议也应该是安全的。

因为验证器只能从验证器发送的数据中提取关于未知多项式p(x)的知识,所以让我们考虑那些提供的值(证明): 。他们参与以下检查:

gp=gh(多项式p(x)有t(x)的根)

(gp)α=gp′t(s)(使用正确形式的多项式)

问题是我们如何改变证据,使支票仍然有效,但无法提取任何知识?从上一节可以得出一个答案:我们可以用一些随机数δ(δ)来“移位”这些值,例如(gp)δ。现在,为了提取知识,首先需要找到被认为不可行的δ。此外,这种随机化在统计学上与随机性是无法区分的。

为了保持关系,让我们检查验证者的检查。证明者的值之一位于方程式的每一侧。因此,如果我们用相同的 δ “移动” 它们中的每一个,方程必须保持平衡。

具体地,证明者对随机 δ 进行采样,并用g α p(s) δ gh(s) δ 对其证明值求幂,并提供给验证者进行验证:

(gp)δ = gh δ t(s) (gp)δ α = gp′ δ

合并后,我们可以观察到支票仍然有效:

注意: 零知识是多么容易被编织到建筑中,这通常被称为 “免费” 零知识。

到目前为止,我们有一个交互式零知识方案。为什么会这样?由于该证明仅对原始验证者有效,其他任何人(其他验证者)都不能信任同一证明,因为:

因此,为了证明语句(在这种情况下是多项式的知识),需要与每个验证者进行单独的交互。

虽然交互式证明系统有其使用案例,例如,当证明人只想说服一个专用的验证人(称为指定验证人),这样证明就不能再用于向其他人证明同一陈述时,当一个人需要同时(例如,在区块链等分布式系统中)或永久地说服多方时,这是非常有效的。验证方需要始终保持在线,并对每个验证方执行相同的计算。

因此,我们需要的秘密参数是可重用的,公开的,可信的和不可滥用的。

让我们首先考虑在秘密 (t(s),α) 产生后如何保护它们。我们可以像验证者在发送给证明者之前对s的指数进行加密一样对它们进行加密。然而,我们使用的同态加密不支持两个加密值的乘法,这对于验证检查以使t(s) 和h以及p和 α 的加密相乘都是必需的。这就是密码配对的地方。

密码配对(双线性映射)是一种数学构造,用函数 , 给定来自一组数字的两个加密输入(例如, ,允许将它们确定地映射到不同数字输出集中的乘法表示,即, 。

由于源和输出编号集合不同,因此配对的结果不能用作另一个配对操作的输入。我们可以将输出集 (也称为 “目标集”) 视为来自 “不同的宇宙”。因此,我们不能将结果乘以另一个加密值,并通过名称本身建议我们一次只能乘以两个加密值。在某种意义上,它类似于一个散列函数,它将所有可能的输入值映射到一组可能的输出值中的一个元素,并且它不是平凡可逆的。

注意: 乍一看,这种限制只能阻碍依赖的功能,具有讽刺意味的是,在zk-SNARK情况下,它是该方案的安全性所拥有的最重要的属性。

配对函数 的一个基本(技术上不正确)的数学类比是说明有一种方法可以“交换”每个输入的基数和指数,这样基数 在转换过程中会被修改成指数,例如 。 然后将两个“交换的”输入相乘,使得原始 a 和 b 值在相同的指数下相乘,例如:

因此,由于在“交换”期间使用结果 在另一个配对(例如, )中改变了碱基,因此不会产生所需的加密乘法 。配对的核心属性可以用等式表示:

e(ga, gb) = e(gb, ga) = e(gab, g1) = e(g1, gab) = e(g1, ga)b= e(g1, g1) ab= . . .

从技术上讲,配对的结果是目标集不同生成器g下原始值的加密产物,即 。因此,它具有同态加密的特性,例如,我们可以将多对的加密产物添加到一起:

注意:加密配对利用椭圆曲线来实现这些属性,因此从现在起,符号 将表示曲线上的生成器点,该点将被添加到自身 次,而不是我们在前面部分中使用的乘法群生成器。

有了加密配对,我们现在可以设置安全的公共和可重用参数。让我们假设我们信任一个诚实的一方来生成秘密 s 和 α。一旦 α 和具有相应 α 位移的 s 的所有必要幂被加密(gα, gsi , gαsi for i in 0, 1, ..., d),必须删除原始值。

这些参数通常被称为公共参考字符串common reference string或CRS。CRS生成后,任何prover和verifier都可以使用它来执行非交互式零知识证明协议。虽然不重要,但CRS的优化版本将包括对目标多项式target polynomial 的加密评估。

此外,CRS分为两组(对于 中的 ):

由于能够乘以加密值,verifier可以在协议的最后一步检查多项式,让verification key verifier进程从证明者那里接收到加密多项式评估 gp、gh、gp':

虽然可信设置是有效的,但它并不有效,因为 CRS 的多个用户将不得不相信一个删除的 和 ,因为目前没有办法证明这一点。 因此,有必要最小化或消除这种信任。 否则,不诚实的一方将能够在不被发现的情况下制作假证据。

实现这一点的一种方法是由多方使用前面部分中介绍的数学工具生成复合 CRS,这样这些方都不知道秘密。这是一种方法,让我们考虑三个参与者 Alice、Bob 和 Carol,对应的索引为 A、B 和 C,对于 i 在 1、2、...中。 . . , d:

作为这种协议的结果,我们有复合 和 并且没有参与者知道其他参与者的秘密参数,除非他们串通。事实上,为了学习 和 ,必须与其他所有参与者串通一气。因此,即使一个人是诚实的,也无法提供假证明。

注意:此过程可以根据需要对尽可能多的参与者重复。

可能存在的问题是如何验证参与者是否与 CRS 的每个值一致,因为对手可以采样多个不同的 s1、s2、...。 . . 和α1, α2, . . .,并将它们随机用于 s 的不同幂(或提供随机数作为增强的公共参考字符串),从而使 CRS 无效且不可用。

幸运的是,因为我们可以使用配对来乘以加密值,所以我们能够执行一致性检查,从第一个参数开始,并确保每个下一个参数都是从它派生的。参与者发布的每个 CRS 都可以检查如下:

请注意,虽然我们验证每个参与者都与他们的秘密参数一致,但使用先前发布的 CRS 的要求并未对每个下一个参与者强制执行(在我们的示例中为 Bob 和 Carol)。因此,如果对手是链中的最后一个,他可以忽略先前的 CRS 并从头开始构造有效参数,就好像他是链中的第一个,因此是唯一知道秘密 s 和 α 的人。

我们可以通过额外要求除第一个参与者之外的每个参与者加密和发布他的秘密参数来解决这个问题,例如,Bob 还发布:

这允许验证 Bob 的 CRS 是 Alice 参数的适当倍数,因为 i in 1, 2, . . . , d:

同样,Carol必须证明她的CRS是Alice-Bob的CRS的适当倍数。

这是一个强大的CRS设置方案,不完全依赖任何一方。实际上,即使只有一方是诚实的,并且删除并且从不共享其秘密参数,即使所有其他各方都合谋,它也是非常明智的。因此,CRS 设置中不相关的参与者越多,伪造证据的可能性就越小,如果竞争方参与,其可能性就可以忽略不计。该方案允许涉及对设置的易读性有疑问的其他不受信任的各方,因为验证步骤确保他们不会破坏最终的公共参考字符串 (也包括使用弱 α 和s)。

我们现在准备巩固进化的zk-SNARKOP协议。形式上,为简洁起见,我们将使用大括号来表示由其旁边的下标填充的一组元素,例如si i ∈[d] 表示集合s1,s2,...,sd。

已商定目标多项式t(x)和校准仪多项式的d次:

Setup:

最全覆盖!Web3.0创业投资和人才需求方向梳理

一、Web3.0重点创业/投资方向

Web3将是巨大的范式变化,其孕育着众多的创业和投资机会,比如:

1. 区块链

Web3需要区块链技术来支撑实现用户完全拥有信息数字资产的愿景,作为底层技术的区块链将是Web3领域最大的创业机会,毫不夸张的说,区块链公链的市场规模将超过现在所有的互联网公司,因为Google、Facebook从逻辑上来讲只是运行在这些公共协议上的一个应用app,正如所有的互联网公司都需要运行在TCP/IP协议上一样,未来所有的社交网络和信息搜索都会运行在底部的区块链协议上。

代表公司:以太坊,Solana,Avalanche,NEAR,Polkadot,Cosmos。

2. 去中心化的身份系统

如今的互联网公司拥有用户的一切,用户被迫在每一个企业注册自己的帐号,企业的估值建立在拥有多少用户和利用用户的数据创造多少广告收入。在Web3时代,用户将完全拥有自己的信息,拥有自己的信息从拥有自己的身份开始。

Web3的技术架构中,用户将为网站的访问和使用支付运行费用,因此应该拥有自己数据的权利。未来,每个人都会有一个域名,一个网页,位于去中心化的IPFS。

理论上讲,在Web3.0中并不需要多套并存的DID系统。但是,出于各种原因,不同的区块链生态有不同的DID系统,短期内不会出现统一的DID系统。

在这种情况下,一个可以兼容和集成绝大多数DID标准的身份聚合项目会对用户带来极大的便利。身份聚合项目支持跨多个生态连接用户DID身份信息,帮助用户查看、管理和聚合在不同区块链网络上的身份信息。同时,身份聚合项目还可以与数据索引项目、应用项目等进行结合,进一步发挥作用。

代表公司:ENS。

3. 分布式数据的存储和访问

Web3时代用户拥有自己的数据,需要为存储数据付费。例如,用户购买的NFT需要存储在可以永久访问的地方。另外,便捷的访问需要提供数据传输和索引服务。

代表公司:Filecoin,Arweave,The Graph,Livepeer,ByteTorrent。

4. 通信协议

由于技术的限制,不同的应用场景将会需要不同的区块链技术,不同的区块链之间需要互相通信,位于一个区块链上面的智能合约可能需要调用另外一个区块链上的合约,位于一个区块链上的数字资产,可能需要被借贷到另外一个区块链上。

代表公司:XCMP,EPNS,XMTP。

5. 资源配置优化协议

随着云计算时代来临和数字信息化技术深入改变工业和农业,更多资产被数字化体现,各种代币代表的不仅仅包括计算资源,存储资源,还可能代表数字资产以及物理世界的资产。金融作为跨时空的价值交换科学理论,将会被应用于分布式网络协作。

Web3世界里面的去中心化和个人拥有数字资产,更需要网络资源的协作。

代表公司:Uniswap,Compound,AAVE

6. 社交网络协议

Web3时代,由于没有了中介,去中心化的用户更需要一个开放的社交网络协议来联系用户,用户的身份价值没有了Facebook这个中介,更需要用户自身建设的社交网络来体现自己的价值。

代表公司:Context,CyberConnect,DESO,RSS3

7. NFT

NFT除了数字艺术品以为,它的更大作用应该是一个编程单元。

如果说智能合约是面向对象编程中的类,那么NFT就是面向对象编程中的Singleton。

8. 钱包

正如Web1.0和Web2.0的用户界面是浏览器,钱包将是Web3.0的浏览器,承载了管理用户信息和访问DApp的功能。

代表公司:Argent,MetaMask

9. 共享网络

关于互联网是否是中心化的争论从未停止,关于网络是否应该中性也没有结论。但是随着移动设备和传感器的发展,我们有机会建立一个共享的无线网络。正如P2P网络,网络的使用者又是网络的服务提供者,不同于P2P的是,代币的出现可以为使用者和提供者之间提供结算。

代表公司:Helium,DIPNET

10. 内容创造经济

Web3时代用户拥有自己的创作内容,拥有自己的读者,将摆脱依靠平台分发流量和广告费分成的收费模式。

代表公司:Mirror

11. 链上数据分析

精准的数据分析可以对区块链项目的商业模式进行重构,在这个过程中,DID和隐私计算等技术会在隐私保护等方面发挥重要作用。

随着区块链用户的增多,链上数据的体量发生指数级增长。这些数据对分析用户画像有重要作用,精准的数据可以为其他项目提供可靠的数据输入,进而完成其他项目的产业重构和升级。

通过精准的数据分析可以得到链上信用等有效数据,进而拓展出不同的应用场景。以DeFi项目为例。目前很多DeFi项目采用抵押借贷方式而非信用借贷,资金利用率不高一直是困扰很多DeFi项目的问题。

如果有精准的链上数据作为输入,根据过往数据将信用引入到链上,提供Web3.0系统中的身份、信用、用户画像等与用户相关的数据的索引和聚合,精准筛选用户,那么可以对信用较高的用户实行信用借贷或无抵押借贷,大大提高用户资金的利用率。

12、隐私加强技术

目前,用户对区块链上的身份和账户等信息的重视程度不够。他们在链上留下的公开信息越来越多,所有人都可以无需许可进行查阅,存在安全隐患。

在Web3.0中,人们对数据和隐私的保护意识会更强,用户不再希望以牺牲隐私的方式来获取便利,当前的模式不能满足Web3.0对隐私保护的需求。特别是DeFi兴起之后,很多用户并不希望自己在链上的交易行为被其他人监控。

隐私加强技术可以解决交易信息的机密性和隐私保护问题,限制未经授权的用户获取交易信息。隐私加强技术能够在不影响安全性和隐私的前提下安全地共享、汇集和分析数据。

13、Web2与Web3.0的中间件

目前,大量用户仍然集中在中心化的平台,他们已经对这些平台有了使用粘性并形成用户习惯。中间件项目可以充当桥梁,帮助用户从Web2向Web3.0迁移。通过在Web2平台上开发了一系列工具,用户可以通过熟悉的平台上发送加密信息和数字货币,降低用户对Web3.0项目的使用门槛。

二、Web3.0重点就业方向

一、网络维护者

无论是POW还是POS时代,网络的运维都将通过更分布式的设备/节点进行。关于网络维护者,以比特币矿工、以太坊矿工、Filecoin矿工最为人熟知。网络维护者们肩负着维护基础设施安全、公平的重任,将在下一代互联网、物联网、边缘计算、5G中发挥作用。

二、社区管理员(Moderator)

社区管理员Moderator, 简称MOD是Web3.0中必不可少的职业,NFT、Gamefi、Defi、DAO项目都需要相关人员管理社群。MOD通常由最为积极的社区成员担任,但也不排除项目方通过外包招募的情况。MOD因有机会参与早期团队的分润,成为了行业竞争最激烈的职业。

三、艺术家

自NFT发展以来,诸如Beeples、Yuga Labs、方力钧等数以百计的艺术家以及工作室发布了NFT作品。其中,顶级艺术家以及名人发售的NFT备受青睐。NFT跳过了传统的画廊以及拍卖行等中间商向艺术家们提供了新的变现方式。

四、元宇宙建筑师

自Sandbox、Decentraland以及Crypto Voxel这类虚拟世界项目发展以来,现实世界中的公司建设虚拟总部的需求日益旺盛。元宇宙建筑师也成为了前沿的职业。

五. 游戏 设计师

Sandbox、Decentraland以及Crypto Voxel这类虚拟世界项目本质上是UGC平台。 游戏 设计师在平台上不仅可以创作自己的NFT,也可以参与到平台内 游戏 中的地图、关卡以及战斗模式的设计中,拥有属于自己的体素 游戏 。

六. 游戏 玩家

在一些链游行业中,打金者以及打金公会成为了生态非常重要的一部分。由于链游分类不同,有些偏氪金,有些偏 游戏 性,因此它们的 游戏 玩家群体也大有不同。Axie Infinity玩家需要购买较为昂贵的 游戏 资产才能进行打金,因此公会出钱玩家出力成为了早期P2E模式。在Sandbox以及Skyweaver中,只有操作流畅、经验丰富的玩家才能获得打金奖励。

七.Defi/Cefi矿工

Defi/Cefi矿工指的是灵活地将资金分配至Defi协议/中心化交易所中以赚取收益的群体。他们往往洞悉Defi产品模型以及安全性,且能第一时间发现盈利率最高的新协议,俗称挖头矿。Defi/Cefi矿工的行为已经远超于个人投资性质,需要具备系统的研究以及敏锐的行业嗅觉。

八、区块链相关开发、产品、研究岗位。

区块链是Web3.0的核心基础设施,目前市场上关于Web3.0的大部分招募,基本都跟区块链相关。根据工业和信息化部人才交流中心2019年发布的 《区块链产业人才岗位能力要求》 文件,可以将区块链人才岗位划分为三类岗位人才:

1)核心研发人才岗位包括:

——区块链底层架构师;

——密码算法工程师;

——隐私保护研发工程师;

——共识机制开发工程师;

——SDK 研发工程师;

——区块链分布式网络研发工程师;

——区块链虚拟机研发工程师;

——区块链算法工程师;

2)实用技术岗位人才包括:

——智能合约开发工程师;

——安全研发工程师

——软件安全研发工程师;

——区块链测试工程师;

——区块链运维工程师;

——区块链应用架构师;

——应用开发工程师;

3)行业应用岗位人才包括:

——区块链行业产品经理;

——区块链金融行业工程师;

——区块链供应链金融行业工程师;

——区块链司法行业工程师;

——区块链政务行业工程师;

——区块链版权行业工程师;

——区块链物联网行业工程师

对岗位能力的要求也十分明确,划分了 综合能力 、 专业知识 、 技术技能 、 工程实践能力 四大类,且充分概括了目前市场上主流的招聘岗位职责需求,我们以区块链底层架构师为例,其岗位能力包括:

除此之外,热门的智能合约开发工程师,则需要具备:

——扎实的编程能力,熟练使用Java、Node.js、JavaScript、Python等编程语言;

——熟悉常见区块链技术架构及运行机制,如FISCO BCOS等;

——熟练掌握智能合约编程语言,如Solidity、Go、Node.js等;

——掌握常用区块链平台,并能基于相关平台编写和优化智能合约;

中心化的平台为人们带来便利的同时也存在诸多问题。如今,Web3.0的发展势头已经吸引很多巨头公司的注意,包括Twitter和Reddit在内一些公司正在 探索 在将Web3.0的理念整合到他们的平台上。他们从创作者激励经济、中心化身份的改进、数据和内容的所有权等方面进行 探索 和研究,以塑造去中心化平台的未来。

未来,Web3.0会给用户带来不一样的体验,将从根本上改变用户与互联网之间的关系和交互模式。

资料来源于网络

编辑整理 | 领路元

关于区块链mod和区块链模板的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签: #区块链mod

  • 评论列表

留言评论