Ouroboros协议

~~~~~以下大部分为翻译稿~~~~~

2.模型

时间、时槽和同步。时间分割为离散的时间单元,称为时槽。每个时槽至多与账本的一个区块相关【一个时槽对应1或者0个区块】。所有参与者有一个大致同步的时钟,可以识别当前时槽【这是一个同步方面的要求,可以称为时槽共识】。这样参与者们可以执行一个分布的协议共同的把一个区块分配给当前时槽。我们用sl_r表示一个时槽,r in 表示时槽的指针,“假设”与每个时槽对应的真实时间窗口具有以下属性:

1)一个公知单增函数把当前时间作为输入可以确定当前时槽;

2)每一个参与者都可以访问当前时间。不同参与者的本地时间之间的差值与时槽所表示的时间长度相比是可忽略的;

3)一个时槽所表示的时间窗长度应该足够长以确保诚实参与者在时间窗开始的时候发出的任意消息可以被任意其它的诚实参与者在时间窗结束之前接收到,即使不同参与者本地时钟之间存在差异,这一条件也应当满足。特别的,尽管存在各种各样的网络延迟,总的传输时间也不应该超过时槽窗口。【事实上,这个假设直接把eclipse攻击排除在模型之外了】

交易账本属性。如果协议pi维护的账本可以分割为分配到不同时槽的区块,并进而决定交易写入账本的顺序,我们就称协议pi实现了一个可靠的交易账本。【核心就是时间和顺序呀!】账本应该具有以下两个属性:

1)持久性。一旦系统中的一个节点宣告一个交易tx是稳定的,其它节点在被询问时,要么报告tx在账本中的相同位置,要么不会报告任何与tx冲突的交易是稳定的。这里,稳定性是一个用安全参数k作为输入参数的谓词,再具体些,一个交易是稳定的当且仅当该交易在一个区块中,该区块比账本中的k个区块深度大。

2)活性。如果系统中所有的诚实节点都尝试包含一个特定的交易,那么经过u个时槽的时间后,所有节点,在被询问并且诚实回答的条件下,会报告该交易是稳定的。其中,u个时槽被称为交易确认时间。

【活性直白的讲就是能够在有攻击者存在的条件下向账本写入新的交易;持久性直白的讲就是写入的交易是不会变的。不会变是说记录交易的时间不变,交易之间的顺序不变】

在文献[26,35]表明上述的持久性和活性属性可以用以下的三个基本属性保证,条件是协议pi维护的账本使用了区块链的数据结构。

1)共同前缀(CP);使用了参数k in N。假设两个诚实的参与者在时槽sl_1和sl_2的开始时刻拥有的链分别是C_1和C_2,那么CP属性要求C_1^lceil preceq C_2,其中C_1^lceil表示从C_1中移除最后k的区块所得的链,preceq代表前缀关系。【即C_1去掉k个块后是C_2的前缀】

2)链质量(CQ);使用了参数mu in (0,1]和l in N。考虑在一轮的起始时刻一个诚实的参与者拥有的链中的任意l长的一部分,CQ属性要求这一部分中攻击者形成的区块最多占比是1-mu。【也就是诚实的参与者生成的区块至少有l*mu块】。mu被称为链质量系数。

3)链增长(CG);使用了参数tao in (0,1]和s in N。考虑两个诚实的参与者在时槽sl_1和sl_2的开始时刻拥有的两个链C_1和C_2,其中sl_2时槽比sl_1时槽超前至少s个时槽。那么CG属性要求len(C_2)-len(C_1)>tao * s。tao被称为速度系数。

安全模型。我们使用符号VIEW_^(lambda)表示参与者P在和攻击者A执行协议pi之后的视图,所在环境为Z,安全参数为lambda,使用的理想函数是F。类似的,我们使用符号EXEC_^(lambda)表示环境Z的输出。

这里定义的理想函数F有多个功能。下面首先定义协议中使用的“扩散”和“密钥和交易”功能,表示为F_

扩散功能。扩散功能维护一个输入字符串,用于每个参数者U_i。一个参与者激活以后,允许在任意时刻提取它的输入字符串。人们可以把这个功能想象成一个邮箱。另外,参与者可以要求该功能扩散一个消息。这时,这个消息会被附加到每个参与者的输入字符串那里。这个功能维护轮数(时槽),所有的参与者在一轮中允许扩散一次。轮数不会增长,除非所有的参与者都扩散了一个消息。攻击者激活后,也可以与该函数交互,允许读取所有的收件箱和所有的扩散请求,可以向收件箱按照任意顺序递交消息。在一轮结束的时候,该函数确保所有的收件箱包含所有被扩散的消息(但是收件箱中消息的次序和请求扩散的次序不一定相同)。当前的时槽指针也是任意参与者任何时间都可以获取的。如果一个权益持有人在一个特定的时槽不提取写给它的输入字符串的消息,消息会被冲掉。

密钥和交易功能。密钥注册函数用n个用户,U_1,ldots,U_n和它们各自的权益s_1,ldots,s_n初始化。给定一次初始化,该函数会咨询攻击者,接收可以为空的一组消息(Corrupt, U),然后把攻击者腐化的用户标记出来。对于没有注册公钥的腐化用户,该函数允许攻击者设定这些用户的公钥;对于诚实的用户,该函数会为每个用户生成并记录一对公私钥。攻击者的公钥和该函数生成的公私钥都用于同一套数字签名算法。腐化用户的公钥也会标记出来。之后,下列动作按照任意顺序出现:

(1)用户请求提取它的公私钥,于是这个函数返回该用户的公私钥给用户;(2)用户请求完整的公钥目录,于是这个函数返回完整的公钥目录给用户;(3)一个新用户要求被创建,来自环境Z的一个消息(Create,U,C)给该函数,该函数会按照初始化的过程创建该用户,也就是说,该函数首先询问攻击者是否腐化这个用户,然后设计这个用户的公钥以及在未腐化情况下的私钥。之后把C作为初始状态存储下来。该函数在执行成功后向环境返回公钥。

(4)一个老用户要求被腐化,攻击者向该函数发送消息(Corrupt, U)。用户必须要在腐化请求提出之后的D个时槽才可以被腐化。特别的,在一个腐化请求注册到函数中以后,该用户的私钥在D个时槽之后释放,D个时槽是根据扩散模块维护的轮计数器计算的。

我们假设协议执行时的理想函数是包含上述两个功能的,同时也包含下面解释的一些功能。注意到腐化的权益人U会把它的全部状态交给A,从那时起,攻击者在U被激活的时候就被激活。除了F对攻击者的限制外,攻击者对权益人的腐化是在Z的允许下进行的,是通过Z运行协议完成的。这种允许具体体现为消息

(Corrupt,U),该消息由环境提供给攻击者。总的来说,关于激活,我们有一下规则:

(1)在每一个时槽sl_j,环境Z允许激活任意权益人子集。这个子集中的任何一个都可能会产生消息,之后消息被转发给其它权益人。

(2)在每一个时槽sl_j,攻击者至少作为最后一个实体会被激活,在腐化实体被激活时也会被激活。

在上述模型之下,很难建立协议的任何安全属性(攻击者可以更改消息的顺序,可以任意腐化用户)。下面对环境进行约束,以有可能定义安全性。

对环境的约束。环境,负责在每一轮运行时激活诚实的实体,具有以下约束:

(1)在每一个时槽,至少有一个激活的诚实实体。

(2)设置有参数k in Z限制一个诚实的权益人最大的不在线时槽数。在一个诚实权益人重新在线时,它的初始化链C应该与在前一个时槽中激活的诚实实体的链相同,该初始化链由环境设置。

(3)在每一个时槽sl_r,对每一个激活的权益人U_j,存在一个公钥集合S_j(r)和权益对(vk_i,s_i) in ^* times N, for j=1,...,n_r,其中n_r是在那个时槽之前加入的用户数量,用于表示在U_j看来的那些激活的参与者。【意思是对每一个权益人而言,在一个时槽内,有一些激活的权益人和它们的公钥和权益值】如果某个权益人已经被腐化了,它的公钥就被标记为腐化的。我们希望攻击者只有少于50%的相对权益,如果在所有的S_j(r)中,腐化的公钥所持有的总权益除以Sum_i(s_i)小于50%.【大家都觉得攻击者权益小于50%,才认为小于50%】。如果这一希望破灭了,那么这次运行中事件Bad^就发生了。【注意这里谈的是对环境的约束,所以这一条是说环境不要太坏了,让攻击者腐化的权益人数量需要限制】

我们知道上述离线限制是有争议的。我们的协议也能够容忍更长时间的不在线行为。但是为了简单,我们依然使用上述限制。另外,在后续的证明中,当我们说一个属性Q在所有运行中以较高概率成立时,我们暗含的是在说Q OR Bad^在所有运行中以较高概率成立。这意味着我们排除了环境和攻击者以不可忽略概率触发Bad^事件。

4. 协议:静态权益

4.1基本概念和协议描述

在静态权益的情况,我们假设固定的n个权益人U_1,...U_n通过协议交互。在协议开始之前,权益人U_i拥有s_i的权益。对每一个U_i,有一对验证和签名密钥(vk_i,sk_i)用于一个定义良好的签名体制。不失一般性,我们假设验证密钥对所有权益人而言是公知的。下面先给出一些基本的定义。

定义4.1(创世块)。创世块B_0包含权益人列表,每个权益人用公钥和权益(vk_1,s_1),...,(vk_n,s_n)以及辅助信息ro表示。

定义4.2(状态)。状态是一个字符串st in ^lambda。

定义4.3(区块)。在时槽sl_i in 生成的区块B包含当前状态st in ^lambda,数据d in ^*,时槽编号sl_i和一个签名delta = Sign_(st, d, sl_i),sk_i是权益人U_i持有的私钥,该区块由权益人U_i生成。

定义4.4(区块链)创世块B_0为首的区块链(或链)表示一系列的区块B_1,...,B_n,每个区块有一个单独的时槽对应,时槽单增,B_i的状态st_i等于H(B_),其中H是一个预定义的抗碰撞函数。链的长度len(C) = n是区块的数目。区块B_n是链的头部,表示为head(C)。空字符串epsilon看作一个合法的链,方便起见,设置head(epsilon) = epsilon。

设C是一个长度为n的链,k是任意的非负证书。前面说过C^\lceil是把链C最右侧的k个区块去掉之后形成的链。如果k geq len(C),定义c^\lceil = epsilon。同样的,使用C_1 prefix C_2表示C_1是链C_2的前缀。

定义4.5 (世代)一个世代是一个集合,包含R个相邻的时槽S = 。其中R是这一节分析的协议的一个参数。

定义4.6(攻击者权益率)假设U_A是攻击者控制的权益人集合。攻击者的权益率定义为alpha = frac}^n},【就是攻击者的权益在总权益中的比重】其中n是权益人的总数,s_i是权益人U_i的权益。

时槽领导者选举。 对于本节描述的协议,对每一个0

定义4.7(领导者选择进程)领导者选择进程,输入为权益人分布S = {(vk_1,s_1)...(vk_n,s_n)},(D,F)对包含一个分布和一个确定性函数,使得当ro leftarrow D,下式成立,对所有sl_j in ,F(S,ro,sl_j)以概率p_i输出U_i in ,其中p_i = s_i /Sum_^n,s_i是权益人U_i的权益,称为权益权重;另外,随机变量族_^R是独立的。【特别需要注意的是,如果S,ro确定对每个时槽输出的领导者是确定的】

我们注意到按照权益的比例抽样可以比较直接的实现。例如,一个简单的进程可以这样执行。设tilde = s_i/Sum_^n。那么对于每一个i = 1, ..., n-1,假设还没有领导人选择出来,这个进程就抛一个有tilde偏的硬币,如果结果是1,实体U_i就选做这个时槽的领导,进程结束。当我们把这个进程作为一个函数F()实现的时候,必须要提供足够多的随机性,使得该进程能够模拟有偏的掷币行为。如果我们以lambda的精度实现每一次单独的抛币,那么实现一次领导选举需要nlceil}rceil随机比特。当然,使用一个伪随机数生成器(PRG)的话,我们可以提供一个短的中子字符串,然后用PRG再生成合适的长度。【这种方法简单粗暴的就是谁有钱谁说了算】

图1:函数F_^[mode]

F_^[mode]包含了扩散和密钥/交易功能F_,由初始权益人的公钥,权益S_0 = {(U_1,s_1),...,(U_n,s_n)},分布D,函数F完成初始化,其中(D,F)是一个领导选举进程。另外,F_^[mode]还包括参数mode,这个参数决定了签名验证的密钥是如何生成的。当F_^[mode]初始化的时候,如果mode=SIG(相对的,mode = F_),它表示为F_^[SIG](相对的,F_^[F_])。该函数与权益人交互如下:

1)签名密钥对生成:F_^[SIG]为权益人U_i,i=1,...,n,生成签名和验证密钥sk_i,vk_i的方法是运行KG(1^kappa)。F_^[F_])为权益人U_i,i=1,...,n,生成(sk_i,vk_i)的方法是询问另外一个理想函数F_DSIG(在后面图3),询问时用(KeyGen,sid_i)做参数,代表U_i询问(其中sid_i与U_i绑定),之后设置(sk_i=sid_i,vk_i=v_i)(从F_DSIG接收到响应之后)。无论如何,这个功能都是设置S_0^prime={(vk_1,s_1),...,(vk_n,s_n)}【所以就是生成密钥,跟权益绑定】

2)创世块生成。在从权益人U_i那里接收到(genblock_req,U_i)之后,该函数这样处理。如果ro还没有设置,该函数选取ro leftarrow D。有ro以后,该函数发送U_i一个向量(genblock,S_0^prime,ro,F)。【就是提供创世块各家的权益,然后用生成记账人】

3)签名和验证。该函数提供到F_的接口

一个简单的在F_^[mode]混合模式的协议。我们开始描述一个简单的PoS类型的区块链协议,考虑在F_^[SIG]混合模式下的静态权益模型,也就是,创世块B_0(和后续的时槽领导人)都是由理想函数F_^[SIG]决定的。理想函数F_^[SIG]给权益人提供了一个创世块,其中包含权益分布,权益的索引密钥是由一个EUF-CMA安全的签名体制生成的。当然,在F_^[F_]中是由理想函数F_生成的。这其中的细微差别在描述pi_的理想版本时会用到,这种描述出现在安全证明过程中的hybrid论证中,在4.2节描述。权益人U_1,...,U_n之间交互,并且与理想函数F_^交互,交互协议pi_如图2所示。

该协议依赖一个maxvalid_S(CC,BC)函数,该函数在给定当前链CC和一个网络中可用的有效链集合BC之后,可以选择一个链。在静态的这个协议中,我们使用最简单的最长链规则。定义如下:

maxvalid(CC,BC)函数:从BC AND 中返回最长链。如果出现了等长的链,有CC就选CC,否则任意选。

图2 协议pi_

pi_是一个由权益人U_1,...,U_n在F_^[SIG]的协助下在一系列时槽S=上交互完成的,运行如下:

1)初始化。权益人U_i in ,从密钥注册接口获得它的公钥和私钥。然后它从扩散接口获得当前的时槽,如果是sl_1时槽,它就发送(genblock_req,U_i)给理想函数F_^[SIG],获得响应(genblock,S_0,ro,F),之后U_i设置本地区块链C=B_0=(S_0,ro),并设置初始内部状态st=H(B_0)。不然,它从密钥注册接口获得初始链C,设置本地区块链为C,本地初始内部状态为st=H(head(C))。【初始化包含了链和选领导两件事情】

2)链扩展。对每一个时槽sl_j in ,每一个权益人U_i执行以下步骤:

(a)收集所有通过广播接收到的有效链,设置为集合C,验证每一个C^prime in C,及其中每一个区块B^prime = (st^prime, d^prime, sl^prime, delta^prime) in C^prime,满足Vrf_(delta^prime,(st^prime,d^prime,sl^prime))=1,其中vk^prime是权益人U^prime = F(S_0,ro,sl^prime)的验证密钥。U_i计算C^prime = maxvalid(CC,BC),设置C^prime为本地新的链,设置状态st = H(head(C^prime))。

(b)如果U_i是由F(S_0,ro,sl_j)决定的时槽领导者,它生成一个新的区块B=(st,d,sl_j,delta),其中st是当前状态,d in ^*是交易数据,delta = Sign_(st,d,sl_j)是对(st, d, sl_j)的签名。U_i计算C^prime = CC|B,广播C^prime,设置C^prime为本地新链,设置状态st=H(head(C^prime))。

3.交易生成。给定一个交易模板tx,U_i返回delta=Sign_(tx),如果tx从U_i的视角看与账本的状态是一致的。

[简单来看,对于静态权益的情况,就是在每一个时槽,先按照钱多少决定谁是领导人,然后生成新区块,广播,其它节点更新]

5 动态权益

5.1使用可信的信标

在上一节的静态版本协议中,我们假设权益在整个执行过程中是静态的(即一个世代),也就是说在一个给定的世代内,权益的转移不会影响领导的选举。现在我们给出一个修改版本的协议pi_,这个协议可以在多个世代执行,每一个世代的领导者选举进程由上一个世代的特定时间点的权益分布决定,这样就允许跨世代的权益分布的变化影响领导人选举进程。与之前相同,我们在混合模式下描述协议,增强理想函数F_^的功能,在所有世代期间,为领导者选举进程提供随机和辅助信息。增强的函数称为F_^。我们接下来讨论如何基于F_^实现F_^,并把假设规约到简单的在一开始选定的共同字符串。

在描述动态权益协议之前,我们先描述一下对F_^的修改,这些修改使得多世代的情况包含进了理想函数。修改后的函数F_^允许权益人在每一个世代询问领导选举的数据。这个函数在第一个世代e_1开始前,由每个权益人的初始权益进行初始化。在接下来的世代,前一个世代从第一个时槽开始的R-2k个时槽被考虑,这些时槽中的区块表明了新的权益分布,这种新的权益分布用于向该函数提供输入。有效的权益人分布表示为序列S_1,S_2,...,定义如下:S_1是一开始的权益人分布。当j feq 2时,对于时槽{(j-1)R+1,。。。,jR}【即第j个世代】,有效的权益分布S_j由时间戳至多是(j-1)R-2k【(j-2)R+1,...,(j-1)R-2k】的区块所决定的权益分配。【注意到静态权益的时候证明了三个基本属性,其中CP属性使得上述区块在所有参与人中是一致的】。该函数定义在图10中。

图10 函数F_^

函数F_^包含扩散和密钥交易函数,在世代e_1开始之前,由初始权益人的公钥和相应的权益进行初始化,参数为S_0 = {(vk_1,s_1^0),...,(vk_n,s_n^0)},当然分布D和领导选举函数F也是作为输入的。此外,该函数如下操作:

1)创世块生成:在接收到U_i的(genblock_req,U_i)之后,它像F_^[SIG]一样返回响应。

2)签名密钥对生成。它像F_^[SIG]一样操作。

3)世代随机数更新。在接收到权益人U_i发送的(epochrnd_req, U_i, e_j)消息后,如果当前世代j geq 2,F_^这样操作:如果ro^j还没有设置,该函数取样ro^j leftarrow D。然后,该函数返回U_i消息(epochrnd, ro^j)。【简单讲,这个理想函数做的工作就是在每个世代提供足够的随机数】

下面我们描述协议pi_,是在pi_的基础上修改的,相当于在每个世代更新了创世区块B_0,自然也更新了领导选举进程。该协议也使用了一个maxvalid函数,类似maxvalid_S静态版本。新的函数迫使一个实体选择那些具有共同前缀的链。特别的,该函数引入了下列规则,其中使用了一个前缀参数k:

函数 maxvalid(CC,BC)。该函数返回BC AND 集合中的最长链,这个链没有从CC开始增长超过k个区块。如果存在多个选择,并且CC也是一个选择,它就返回CC,如果CC不在里面,他就随便符合要求的第一个链。

【这里唯一的不同在于要求CC与最长链长度不能超过k个区块,也就是本地链不能有k个时槽落后于众人的链。后面作者解释k个区块就可以选领导了,如果允许k个区块都不在线,那么一个有很高权重的节点可能在k个区块之前已经被腐化了,那么这时攻击者就会获得优势。那么这也意味着在这个POS中,每个权益人都要在线参加共识,否则失败,所以后面才有代理。如果用户有权益,不代理,不参与u,对系统是极大威胁。】

协议pi_在图11中描述,采用了F_^混合模式。

图11 协议pi_

pi_是一个协议,由一个权益人集合运行,权益人集合 一开始是U_1,...,U_n,这些权益人集合与F_^交互,在L个顺序的时槽上运行,时槽表示为S=. pi_运行如下:

1.初始化。 权益人U_i in ,从理想函数F_^的密钥注册接口接收到它的公钥和私钥.之后,它从扩散接口接收到当前时槽的信息,如果当前时槽是sl_1,U_i就发送(genblock_req,U_i)给理想函数,接收到(genblock,S_0,ro,F)响应。U_i设置本地区块链CC = B_0 = (S_0, ro),设置初始内部状态st = H(B_0)。如果时槽不是sl_1,U_i从密钥注册接口获得初始链C,设置本地区块为接收到的初始链,设置初始的内部状态st = H(head(C)).

2.链扩展。 对每一个时槽sl in S,每一个在线的权益人U_i执行以下操作:

(a) 如果一个新的世代e_j,j geq 2,已经开始了,U_i定义S_j,S_j中权益人的分布符合本地链C中时间戳少于jR-2k的最新区块内权益人的分布情况,并发送(epochrnd_req,U_i,e_j)给F_^,接收到(epochrnd,ro^j)响应【S_j选中领导】

(b)收集所有通过广播接收到的有效的链,形成集合BC,验证每一个链C^prime in BC和每一个C^prime中的区块B^prime = (st^prime, d^prime, sl^prime, delta^prime) in C^prime,是否能使等式Vrf_(delta^prime,(st^prime,d^prime,sl^prime))=1是否成立,并且vk^prime是权益人U^prime的验证密钥,关键这个权益人是由理想函数确定的U^prime = F(S_,ro^,sl^prime),其中sl^prime决定了B^prime所在的时槽和所处的世代e_。【这里明确了共识验证就是验证个签名以及产生签名的人是否符合规则】U_i计算C^prime = maxvalid(CC,BC),设置C^prime为新的本地链并且设置状态st = H(head(C^prime))。

(c)如果U_i是由理想函数F(S_j,ro^j,sl)决定的当前世代的时槽sl的时槽领导者,它就生成一个新的区块B = (st, d, sl, delta),其中st 是当前状态,d in ^*是数据,delta = Sign_(st, d, sl)是关于(st, d, sl)的签名。U_i计算C^prime = C | B,广播C^prime,设置C^prime是本地新的链,设置状态st= H(head(C^prime))。

3. 交易生成。与协议pi_相同。【交易生成与静态权益情况相同】

5.2仿真一个可信的信标

尽管协议pi_处理了多个世代,并且考虑了权益的变化,它依旧依赖理想函数F_^来执行领导人选举。在本节,我们展示如何设计协议pi_实现这个理想函数,这样权益人就能够计算所需的随机数和额外的在领导人选举中需要的信息。【基本上前面的协议描述确定了每次选领导人的集合的方法】

我们回忆一下,理想函数F_^和F_^的唯一本质不同在于连续为世代e_2,e_3,...生成随机串ro^2,ro^3,...的方式。这里的思想很简单,协议pi_使用一个掷币协议产生一个无偏的随机串,用于定义ro^j,jgeq 2,在初始的随机字符串和初始的诚实权益人分布的基础上继续推动协议运行。然而,注意到攻击者能够通过异常终止使得一个简单的掷币协议不能成功运行【所以搞了一个(n,t)秘密分享】。因此,我们因此涉及了一个掷币协议,假设有保障的输出传输。【假设消息可以有效传输】

协议pi_在图13中描述,使用了一个可验证的秘密分享机制(PVSS)。

图13:协议pi_

pi_由权益人U_1,...,U_R(U_i,U_j可以是相同的,i,j in )中的一个子集运行,这些权益人是在一个世代e_j中选出来的,世代持续R = 10k个时槽,每一个时槽选择一个权益人。协议pi运行时具有以下的阶段:

1)。承诺阶段(4k时槽)当世代e_j开始的时候,对于1 leq i leq R(R表示这是所有的在这个时代被选出来的领导者),权益人U_i取样一个均匀随机的字符串u_i和随机数r_i,用于底层的承诺机制,生成份额sigma_1^i,...,sigma_m^i leftarrow Deal(n, u_i)(领导者承诺并给所有权益人),并使用每一个权益人U_k的公钥加密每一个份额signma_k^i。最后,U_i提交加密的份额和承诺Com(r_i,u_i)到区块链上。

2)。打开阶段(4k时槽)。在4k个时槽之后,对于1 leq i leq R,权益人U_i打开承诺,提交Open(r_i.u_i)到区块链,条件是区块链前4k个时槽所有领导者都执行了秘密分享。否则,U_i结束。

3).恢复阶段(2k时槽)在8k个时槽之后,对于领导者U^alpha,如果它没有参与到打开阶段,也就是,它没有提交打开消息Open(r_alpha,u_alpha)消息在CC^lceil区块中,那么,对于1 leq i leq n,U_i提交份额sigma_i^alpha到区块链用于插值。当份额sigma_1^alpha,...,sigma_n^alpha中的大多数都可用时,每一个权益人U_i可以计算Rec(sigma_1^alpha,...,sigma_n^alpha)以恢复u_alpha。

该协议模拟epochrnd_req的过程如下:

给定输入(genblock_req,U_i,e_j,S_j),权益人使用区块链中承诺的值计算ro^j = SUM_u_l,其中BL是在世代e_中选择的权益人子集。它返回(genblock,B_0,S_j)其中B_0=(S_j,ro^j)。

10.2性能

在部署40个节点时的性能,时槽5秒,权益均等,平均每秒257个交易。

~~~~~~以上大部分是翻译稿~~~~pi_修改较多

【至此,这个可证明的POS协议脉络基本清楚。我们整理如下:首先,在创世块设置了各个参与人的公钥,权益,领导人选择随机数,参数k等,设置R=10k为一个世代的时槽数。在第一个世代,每个时槽的领导者按照创世块的设定权益选举,使用创世块提供的随机数,每个选举出来的领导负责打包区块;同时在第一个世代的前4k个时槽,这个世代的所有领导者做承诺提供随机数,中间4k个时槽,所有领导者打开承诺,后面2k个时槽,所有权益人恢复前面8k个时槽中有些领导人承诺了但是没有打开的随机数。在第二个世代,使用前面8k个时槽产生的区块中的交易所决定的权益分布,作为第二个世代的权益分布,使用前面8k个时槽中领导人公布的随机数作为第二个世代的随机数,进行第二个世代的领导人选举;同时各个参与方在第二个世代继续进行承诺,分享,打开承诺的操作。依次类推。

那么为什么这套系统要搞这么复杂的承诺,分享的方法呢?仔细考虑一下,会发现除了创世块的随机数之外,在纯粹的账本这个环节,并没有引入新的随机数,因此也就不具备挖矿哈希所带来的随机数源,因此不得不依赖领导人提供提供随机数的方式,而领导人中也有攻击者存在,所以不得不采取承诺,秘密分享这些方法。代价就是这个账本的效率还是几百级别的。】

~~~~~End~~~~~~

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180413G1EXK700?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券