会员体验
专利管家(专利管理)
工作空间(专利管理)
风险监控(情报监控)
数据分析(专利分析)
侵权分析(诉讼无效)
联系我们
交流群
官方交流:
QQ群: 891211   
微信请扫码    >>>
现在联系顾问~
首页 / 专利库 / 智能合约 / 声明式智能合约

声明式智能合约

申请号 CN201880078255.6 申请日 2018-10-04 公开(公告)号 CN111567009B 公开(公告)日 2022-07-12
申请人 阿尔戈兰德公司; 发明人 西尔维奥·米卡利;
摘要 使区块链中的某一区块添加到该区块链中包括:使实体接收与前一区块相对应的信息;使该实体接收在给定输入上的智能合约执行的声明式调用,其中,该声明式调用声明该执行的相关结果和其他相关数据;使该实体验证该调用的句法有效性;以及使该实体响应于验证该调用的句法有效性而将该声明式调用合并到该区块中。这些相关结果可以指定该智能合约执行的净效应、该智能合约执行后的所产生状态、以及用于执行的步骤数。其他相关数据可以指定该声明式调用的调用程序、时间信息、区块信息和/或应付费用。
权利要求

0 1 r‑1

1.在交易被组织成区块的交易系统中,一种相对于先前区块B ,B ,…,B 的序列提供r r+1新区块B和B 的方法,该方法包括:r r‑1 r

在确认区块B指示与区块B 的交易状态一致的初始交易状态之后,使区块B被构建;

r+1 r r+1

在确认区块B 指示与区块B的交易状态一致的初始交易状态之后,使区块B 被构建;

以及

r+1 r

在构建了区块B 之后,使多个实体验证区块B的先前未验证的交易。

2.根据权利要求1所述的方法,其中,这些交易是智能合约。

r

3.根据权利要求2所述的方法,其中,用户结合将交易发布到区块B中的这些智能合约r中的至少一个智能合约来构建区块B。

r

4.根据权利要求3所述的方法,其中,该用户还发布区块B中的这些智能合约的交易结果。

r

5.根据权利要求4所述的方法,其中,该用户还发布用于执行区块B中的这些智能合约的交易结果的步骤数。

r

6.根据权利要求5所述的方法,其中,该用户还发布该多个实体接收的用于验证区块B的交易的费用。

r

7.根据权利要求1所述的方法,其中,该多个实体是区块B的所有用户的子集。

8.根据权利要求7所述的方法,其中,该多个实体是随机选择的。

9.根据权利要求8所述的方法,其中,随机选择该多个实体包括对包括以下至少一项的数据应用密码散列函数:时间信息、关于一个或多个区块的信息、包括在一个或多个区块中的数据、或从一个或多个区块推断出的数据。

10.一种非暂态计算机可读介质,其上存储有处理器可执行代码,所述可执行代码被所述处理器执行时实现以上权利要求1至9之一所述的方法。

说明书全文

声明式智能合约

技术领域

[0001] 本申请涉及电子交易领域,并且更具体地涉及保护用于电子交易的交易区块序列的内容的领域。

背景技术

[0002] 人们可以将智能合约视为与用户一样可以拥有其自己的货币的一种计算机程序。这种合约C可以具有其自己的保留(计算)状态(可能在每次调用后被修改),并且具有其自己的标识符:例如,字符串H(C),其中,H是散列函数。为简单起见,我们用C本身表示此标识符。读者可以轻松确定C何时是程序本身或其标识符。优选地,智能合约C容易与普通用户区分开。玩家是指智能合约或普通用户。
[0003] 智能合约C的执行可由一个或多个适当的用户调用。为了简单起见,但不失任何的1 1
预期一般性,本文中我们假设C由单个用户i调用。  虽然如此,当C可以被多个用户调用时,通常其中一个用户首先执行C,从而在其他适当的用户调用C之前修改其保留状态。如果C是无状态的,则适当用户的顺序可能无关紧要。否则,即使当(比如)两个适当的用户同时独立调用C时,也可以为这两个执行选择一个顺序,并等待第一个‘执行完毕(ned)’后再执行第二个。本领域技术人员可以认识到,可以将C编写为使得只有在被多个用户调用的情况下,C才真正‘由系统’执行,并且这些合约也可以由我们的技术来处理。
[0004] 令i为能够调用对C的系统执行的用户。用户i借助于数字签名来调用C。除了C之外,i的这种签名调用还可以指定输入(input)和费用(fee)。让我们详细阐述。
[0005] ·input详述了要在其上执行C的特定输入。当然,可能还有附加输入,比如默认输入:例如,C的当前状态γC(其确实可以被视为输入)和系统的全局状态(例如,每个玩家在给定区块上所拥有的金额)。
[0006] ·fee包括i为‘补偿系统执行C所产生的计算成本’而应支付的金额。
[0007] 在调用C时,用户i还可以指定一些附加信息。例如,他可以指定给定的区块——并且因此指定区块链中的给定‘简要说明(snapshot)’——或指定合约C的执行可以在给定的区块或区块间隔中起作用。另外,可能认为C可能考虑到目前为止的整个区块链历史。总之,可能还会有附加(并且可能是隐式)的输入。
[0008] 费用还可以包括i将其调用作为其他任何交易包括在区块链中所必须支付的金额。但是让我们忽略后一种传统费用,以便集中精力解决新发明所缓解的问题。
[0009] C的执行中的计算步骤数取决于在其上运行执行的机器。因此,考虑在固定(虚拟)机器M上计算C(input)。
[0010] C的执行通常会生成新的保留状态γ′C并增加或减少几个玩家x,y,…所拥有的金额,分别表示为:
[0011] amount′x,amount′y,...
[0012] 只有在用户i此时拥有的货币金额大于或等于在i的调用中指定的费用fee时,i对C的签名调用才可以在给定区块中进入区块链。
[0013] 传统方法(例如,随机数)用于防止调用实际上对应于单个执行。这种方法对于当前的问题和发明不是至关重要的,因此在本文中被忽略,而不失任何的预期一般性。类似地,各种其他与发明无关的细节也被忽略。
[0014] 一旦i的调用进入了区块链中的某一区块,一类用户U中的每个用户u都将C执行(在虚拟机M上,使用C所达到的最后保留状态)由fee覆盖的步骤量;通过从i所拥有的金额中减去费用来更新他自己的区块链数据版本;并且如果执行正常终止,则修改(再次,在他自己的区块链版本中)受C的执行影响的玩家所拥有的金额(可能包括C本身所拥有的金额)。我们可以把所有这种用户对C的执行称为C的系统执行。通常,类U由所有用户或非常多的用户(例如,想要为在区块链中生成新的有效区块做出贡献的所有用户)组成。
[0015] 如果用户数量很大,则即使步骤数量稍小,系统的总成本也可能很高。这意味着调用者应支付的费用也必须很高,尽管步骤数一点都不高。在这种情况下,在区块链系统中,仅运行需要几个步骤的智能合约是有意义的。这是可惜的。系统中的用户可能会受益于调用许多需要大量计算步骤的智能合约的执行,但是由于可能必须支付的高昂费用而无法调用这些智能合约。

发明内容

[0016] 根据本文所描述的系统,在交易被组织成区块的交易系统中,相对于先前区块B0,1 r‑1 r r+1 r r‑1
B,…,B 的序列提供新区块B和B 包括:在确认区块B指示与区块B 的交易状态一致的r r+1 r
初始交易状态之后,使区块B被构建;在确认区块B 指示与区块B的交易状态一致的初始r+1 r+1 r
交易状态之后,使区块B 被构建;以及在构建了区块B 之后,使多个实体验证区块B的先r
前未验证的交易。这些交易可以是智能合约。用户可以结合将交易发布到区块B 中的这些r r
智能合约中的至少一个智能合约来构建区块B。该用户还可以发布区块B中的这些智能合r
约的交易结果。该用户还可以发布用于执行区块B 中的这些智能合约的交易结果的步骤r
数。该用户还可以发布该多个实体接收的用于验证区块B 的交易的费用。该多个实体可以r
是区块B中的所有用户的子集。可以随机选择该多个实体。随机选择该多个实体可以包括对包括以下至少一项的数据应用密码散列函数:时间信息、关于一个或多个区块的信息、包括在一个或多个区块中的数据、或从一个或多个区块推断出的数据。
[0017] 进一步根据本文所描述的系统,使区块链中的区块B添加到该区块链中包括:使实体接收与前一区块相对应的信息;使该实体接收在给定输入上的智能合约执行的声明式调用,其中,该声明式调用声明该执行的相关结果和其他相关数据;使该实体验证该调用的句法有效性;以及使该实体响应于验证该调用的句法有效性而将该声明式调用合并到该区块B中。这些相关结果可以指定该智能合约执行的净效应、该智能合约执行后的所产生状态、以及用于执行的步骤数。其他相关数据可以指定该声明式调用的调用程序、时间信息、区块信息和/或应付费用。如果对于该用于执行的步骤数而言该费用是足够的并且该费用的支付者具有足够的资产来支付该费用,则该声明式调用可以在句法上是有效的,并且该费用可以在该声明式调用出现在该区块链中时被支付。
[0018] 进一步根据本文所描述的系统,使区块链中的一组验证者被指派用于验证给定输入上的智能合约执行的一个或多个声明式调用的集合S——其中,这些声明式调用声明了这些智能合约执行的相关结果——包括:这些验证者接收该集合S;这些验证者确定S中的哪些声明式调用在语义上有效;以及这些验证者提供对在语义上有效的一个或多个声明式调用的经认证响应。可以基于S、经由给定的密码函数以伪随机的方式来选择该组验证者。至少一个验证者可以经由涉及该至少一个验证者的秘密密钥的计算来确定该至少一个验证者已经被选择,并且该至少一个验证者可以向其他验证者证明该至少一个验证者已经被选择。如果指派给S的至少给定数量个验证者的响应指示S中的调用I在语义上是正确的,则该调用I可以被认为是正确的。
[0019] 进一步根据本文所描述的系统,在已经注册了声明式智能合约调用的集合S、为S指派了一组验证者、并且这些验证者已经提供了关于S中的哪些调用在语义上有效的经认证响应的区块链中,使对S中的调用的判决合并到该区块链中包括:使实体接收这些验证者的经认证响应;使该实体推断出S中的这些调用的正确性;以及使该实体将关于S中的这些调用的正确性的最终判决合并到该区块链中。如果指派给S的至少给定数量个验证者的响应指示S中的调用I在语义上有效,则该调用I的最终判决可以指示I是正确的。如果S中的调用I的最终判决指示I是正确的,则可以使其他用户更新该智能合约的状态并认为该智能合约的执行的已声明净效应已经发生了。
[0020] 进一步根据本文所描述的系统,使区块链中的区块B添加到该区块链中包括:使实体接收与前一区块相对应的信息;使得接收在给定输入上的智能合约执行的承诺声明式调用,其中,该承诺声明式调用声明该执行的至少一些相关结果、对该执行的其他相关结果的承诺、以及其他相关数据;使得验证该承诺声明式调用的句法有效性;以及响应于验证该承诺声明式调用的句法有效性,使得将该承诺声明式调用合并到该区块B中。这些相关结果可以指定执行的净效应、该合约执行后的所产生状态、和/或步骤数,并且其他相关数据可以指定该调用的调用程序、时间信息、区块信息和/或应付费用。如果对于该步骤数而言该费用是足够的并且该费用的支付者在该系统中具有足够的资产来支付该费用,则该声明式调用可以在句法上是有效的,并且该费用可以在该调用出现在该区块链中时被支付。
[0021] 进一步根据本文所描述的系统,使区块链中的一组验证者被指派用于验证声明式调用的集合S——该集合S包括指定智能合约在给定输入上的执行e的至少一个承诺声明式调用I,其中,I包括对e的至少一些相关结果rr的承诺——包括:这些验证者接收该集合S;这些验证者重建执行e以计算这些相关结果rr;以及这些验证者提供包括这些验证者对rr的个性化承诺的经认证响应。可以基于S、经由给定的密码函数以伪随机的方式来选择所指派的验证者。至少一个验证者可以经由涉及该至少一个验证者的秘密密钥的计算来确定该至少一个验证者已经被选择,并且该至少一个验证者可以向其他验证者证明该至少一个验证者已经被选择。仅当指派给S的至少给定数量个验证者的响应包括对在S中的承诺声明式调用I中承诺的相关结果rr的个性化承诺时,该调用I才可以被认为是正确的。
[0022] 进一步根据本文所描述的系统,在已经注册了声明式智能合约调用的集合S、为S指派了一组验证者、并且这些验证者已经提供了关于S中的调用的经认证响应的区块链中,其中,该集合S包括指定智能合约在给定输入上的执行e的至少一个承诺声明式调用I,并且其中,I包括对e的至少一些相关结果rr的承诺,使对S中的调用的判决合并到该区块链中包括:使实体接收这些验证者的经认证响应;使该实体推断出S中的这些调用的正确性;以及使该实体将关于S中的这些调用的正确性的最终判决合并到该区块链中。指派给S的至少给定数量个验证者的响应可以包括对在S中的承诺声明式调用I中承诺的相同相关结果rr的个性化承诺,并且该调用I的最终判决可以指示I是正确的。I的正确性的最终判决可以使其他用户更新该智能合约的状态并认为该智能合约的执行e的净效应已经发生了。
[0023] 进一步根据本文所描述的系统,一种在非暂态计算机可读介质中提供的计算机软件包括实施本文所描述的任何或所有步骤的可执行代码。
[0024] 智能合约的替代技术 我们提出了一种在区块链上实施智能合约的新技术。我们的新技术可以与传统技术一起实施,并且可以高效地处理经由传统技术处理起来太昂贵的一类合约。
[0025] 种类繁多的合约 新技术对其以下内容可能被紧凑描述的智能合约特别有用:
[0026] ·内部/计算状态(简称状态)——其可能会随着执行而改变——以及
[0027] ·净效应——例如,新状态、从一方转移到另一方的货币等。让我们强调一下,我们的技术使我们还可以处理需要以下内容的智能合约:
[0028] ·非常多的计算步骤,以及
[0029] ·大量的存储器。
[0030] 实际上,在执行中使用的存储器可能非常大,而为下一次执行保留的状态信息可能非常紧凑——例如,由几个有界值变量组成。重要的是,无状态智能合约(stateless smart contract)可轻松满足此属性并且非常强大。
[0031] 当然,为了实现给定的需求,一些智能合约可能需要具有状态。然而,鉴于我们的新技术,构造这种合约以缩小其保留状态的大小将符合应用程序设计师的利益。
[0032] 区块链不可知的技术 该技术新颖地利用了(秘密)密码抽签((secret)cryptographicortition),这是作为Algorand技术的关键组成部分的密码安全自选技术,该Algorand技术在2017年5月4日提交的PCT专利申请PCT/US2017/031037中进行了描述,该专利申请通过引用并入本文。在本申请的另一部分中通过引用并入本文的大多数(即便不是全部)专利申请中也描述了Algorand技术。
[0033] 然而,尽管它具有其他优势,但无需使用Algorand作为底层区块链平台即可使用我们的新技术来处理一类新的智能合约。这项新技术可以与任何其他平台一起使用,诸如比特币(Bitcoin)、以太坊(Ethereum)等。
[0034] 这就是说,正如我们稍后将指出的那样,使用Algorand作为底层区块链引擎将带来一些附加优点。

附图说明

[0035] 根据附图的图更详细地解释本文所描述的系统的实施例,这些附图如下简要描述。
[0036] 图1是根据本文所描述的系统的实施例的网络和计算站的示意性表示。
[0037] 图2是结合了本文所描述的系统的区块链的示意性和概念性总结。

具体实施方式

[0038] 本文所描述的系统提供了一种机制,该机制提高了效率并减少了工作站(验证者)对区块链中包含智能合约的区块进行验证所需的计算。
[0039] 参考图1,该图示出了连接到诸如因特网等数据网络24的多个计算工作站22a‑22c。工作站22a‑22c经由网络24彼此通信以提供分布式交易传播和验证,如本文其他地方更详细地描述的。该系统可以容纳能够提供本文描述的功能的任何数量的工作站,只要工作站22a‑22c能够彼此通信即可。工作站22a‑22c中的每一个可以独立地执行处理以将交易传播到系统中的所有其他工作站,并且验证交易/区块并充当验证者,如本文其他地方更详细地描述的。
[0040] 参考图2,区块链200包括多个区块202‑205。每个区块包含一个或多个智能合约和附加信息,如本文其他地方更详细地描述的。区块202是区块链200的最旧区块,区块203是下一个最旧区块等。区块205是区块链200的最新区块。区块链200中可以存在任意数量的区块。区块202‑205中的每一个包含验证前一区块的信息,使得例如区块203包含验证区块202的信息,并且区块204包含验证区块203的信息。因此,区块链200中的区块202‑205中最新验证的区块直接验证前一个区块,并间接验证所有其他先前的区块。在本文的实施例中,每个区块202‑205包含区块202‑205中的前一区块的签名散列,但是可以使用其他机制来验证/确认先前的区块,包括本领域已知的多种常规区块链机制。另外,区块202‑205中的一个或多个可以被验证,并且可以包括关于区块的真实性的判决,如本文其他地方更详细地描述的。区块202‑205中的一个或多个最新区块可能最初未被验证,并且随后可以变得被验证和认证,如本文其他地方更详细地描述的。
[0041] 理想地,用于调用智能合约C的执行的费用应当与该执行使系统产生的总计算成本相对应。但是:
[0042] 执行C的系统总成本是多少?
[0043] 如果存在n个用户,并且C(在给定机器M上)的执行由#steps组成,则总系统成本可以估计为
[0044] n×#steps。2 2这里,我们假设每个用户都确定新区块的正确性,并运行其所包含的每个智能合约。在一些区块链平台中,只有完整节点(full node)才有此责任,而轻节点(light node)没有。无论哪种方式,n都可能很大。
[0045] 因此,如果n很大,则即使#steps稍小,系统的总成本也可能很高。这意味着C的调用者i应付的费用也必须很高,尽管#steps一点都不高。在这种情况下,在区块链系统中,仅运行需要几个步骤的智能合约是有意义的。这是可惜的。系统中的用户可能会受益于调用许多需要大量计算步骤的智能合约的执行,但是由于可能必须支付的高昂费用而无法调用这些智能合约。
[0046] 我们发现以特定的部分选择来描述本发明的技术是方便的。然而,应当理解,每个部分本身都是新颖的并且可以单独使用,并且在本发明的范围内,部分的其他划分也是可能的。
[0047] 1.调用.
[0048] 智能合约C的声明式调用I指定C(在给定的输入/多个输入和初始状态上)的执行e的相关结果和其他相关数据。
[0049] 相关结果可以包括e达到的新状态以及与e相对应的玩家金额调整。
[0050] 相关数据可以包括:所讨论的合约、状态和输入的指示;e的步骤数(相对于参考机器M),或这种步骤数的上限;以及表示调用对系统造成的成本或成本上限的费用。(我们将看到,该成本可能比所有用户都执行e时所产生的成本要小得多。)
[0051] 相关数据还可以包括负责调用的至少一个适当用户i的指示以及表明i实际上接受对调用负责的i的数字签名(或其他形式的认证),包括对系统造成的成本。这种用户i实际上可以具有他自己生成的执行,以便计算其相关数据。
[0052] 相关数据还可以包括预期出现的调用在区块链中正式注册的区块或一组区块的指示。(实际上,如果用户i没有在r中进入区块链,则其可能不对调用负责。)
[0053] 为简单起见,我们可以更简单地将声明式调用I称为调用。
[0054] 讨论和附加细节 与以前一样,适当的用户i通过传播其数字签名来调用C在输入input上的系统执行。然而,这次,除了C、input和正确的费用之外,i的签名还对C的执行的3 3
效应和该执行所采取的步骤数进行认证。  注意,以上信息可能有点多余。这是为了清楚起见,并不旨在施加任何限制。例如,可以经由系统的当前‘价格表’,从其他数量(比如其总长度(或者,仅仅是效应的长度)和/或步骤数)来确定费用。类似地,费用可以设置步骤数的上限,等等。贯穿整个过程,可以从其他数量推论/估计的上述数量可能不会明确显示,而上可以被推论/估计而得。
[0055] 在样本设置中,i首先计算C(input)的执行e,或者使其他人为他计算e,以便弄清楚执行e将具有哪些结果,并且然后请求系统确认这些结果。在执行e中,C从保留状态γC开始:即,在区块链中记录了C的执行序列之后C所达到的最新保留状态。
[0056] 例如,但不失一般性地,i计算并开始传播
[0057]
[0058] 其中
[0059] ·i是调用用户的标识符,主要出于方便而被包括,如果可从i的签名中推断出的话。
[0060] ·C是所讨论的合约。
[0061] ·r,在该示例中,是特定的单个区块,i预期在该区块中注册调用并且在该调用未在区块r中注册时i不对调用负责。
[0062] ·r′,可能是未来区块的指示。(例如,要传达的是,如果关于所调用的执行的最终判决确实通过区块r′出现在区块链中,则应当放弃该调用。)
[0063] ·input是在其上i选择调用C的执行的(多个)输入。
[0064] ·#steps是e(在给定的参考机器M上)的数量。
[0065] ·γC是初始状态,并且γ′C是C的通过e生成的新保留状态。
[0066] ·(x,amount′x),(y,amount′y),…是通过e生成的玩家金额调整对。
[0067] ·fee是i(在该特定示例中)应付的货币金额。
[0068] ·n是针对调用的一组验证者的(预期)大小(这将在稍后讨论)。
[0069] ·t,是一个整数,可能被包括以指示考虑调用的正确所需的关于调用的一致性响应的数量(我们也将在稍后讨论这一概念)。
[0070] 我们可以将invokei称为i对C(input)的调用,并且将
[0071] (i,r,C,input,#steps,γC,γ′C,(x,amount′x),(y,amount′y),...,fee,n,t)[0072] 称为已声明执行摘要(declared execution summary)。
[0073] 应付费用可能取决于某些选定的数量,比如(无任何预期限制地)#steps、已声明执行摘要的大小、以及所产生状态γ′C的大小。因此,将C设计成使得其状态是紧凑的并且专注于其净效应可以被紧凑描述的合约是重要的。如果调用包括这种数量,则费用还可能取决于数量n和t。然而,费用还可能取决于其他数量,比如最终判决的大小,这将在稍后讨论。我们说,如果费用确实等于或超过与选定数量相对应的金额,则该费用是足够的。
[0074] 总而言之,invokei本质上是i对系统的请求,以验证已声明执行摘要的正确性,并且然后(a)更新C的新保留状态,以及(b)调整受C的执行影响的玩家所拥有的金额。
[0075] 现在让我们来看看如何注册这种调用I。
[0076] 2.注册.
[0077] 调用I可能会像普通支付一样进入区块链。调用I可能会在用户之间传播,直到负责生成新区块的某个用户u将其放入他的区块中为止。优选地,u应检查I是否在句法上有效。
[0078] 检查句法有效性需要检查一些简单条件。例如,其可以包括检查在I中指示的C的初始状态是否与在区块链中注册的C的最后一次调用中所指示的最终状态一致。或者,调用用户(如果有的话)是否确实有权进行调用。因此,在区块链中注册调用不需要必须执行C。
[0079] 句法有效性还可以包括检查调用I的用户i是否的确拥有足够的货币来支付I中指定的费用。实际上,这种费用可以由i自动支付。(还可以考虑负责支付费用的合约——例如,因为这是已经调用了调用的合约。如果费用是从这种合约所拥有的货币中支付的,则句法有效性可以包括检查该合约是否有足够的货币来支付费用。在这种情况下,当I进入区块链时,这种费用可以由合约自动支付。)
[0080] 句法有效性还可以包括检查对于由I指示的步骤数而言I的费用是否是足够的。
[0081] 包括非句法上有效的智能合约调用的区块被认为无效。因此,诚实的u不应当在新区块中包括句法无效的调用。
[0082] 在I的传播过程中,也可以检查句法有效性。实际上,接收到非句法上有效的I的用户x可能不会把它转发给其他用户。
[0083] 讨论和附加细节 注意,调用I的句法验证通常比其相应的语义验证(semantic verification)要轻得多。语义验证是指验证执行由I调用的执行e实际上产生了已声明执行摘要。这种语义验证可能会很长,因为执行智能合约可能会花费很多步骤。
[0084] 因此,优选实施例中的一个主要优点是区块构建者u仅验证I的句法有效性,而不验证其语义有效性。典型区块包含成千上万个交易,并且例如假设其中有1,000个是智能合约调用,并且执行其中的每个调用平均需要1秒的计算时间。然后,如果他必须验证所产生的新区块的调用的语义有效性,则即使忽略所有其他计算,要构建一个新的区块u也至少需要1,000秒(即,约16分钟)。实际上,这正是在传统的智能合约模型中区块构建器将需要进行的工作。然而,每16分钟产生一个区块可能太慢了。理应选择在几秒钟内产生一个新区块!
[0085] 如果在消息传播期间,要求用户检查他们转发给其他用户的调用的语义有效性,则这种缓慢性甚至会更糟。
[0086] 在优选实施例中,调用在进入区块链时才被认为是正式的,并且只有到那时系统才开始投入必要的努力来检查语义有效性。然而,正如我们将看到的那样,整个系统的努力将被很好的控制且实用。
[0087] 3.指派.
[0088] 在一个或多个区块中注册的一个或多个智能合约调用的集合S被指派给一组智能合约验证者。
[0089] 例如,S可能由包括在给定区块中的所有智能合约调用组成。可替代地,S可以由单个调用组成。还可替代地,也可以将给定区块的调用划分为几个集合。例如,对于某些给定的整数k,第一集合可以由前k个智能调用组成;第二集合可以由接下来的k个组成;以此类推。(除了最后一个集合可能包含少于k个调用之外。)‑作为另一个示例,可以将一个区块的智能合约调用划分(例如,以某种规范的方式)为多个集合,以控制在每个集合的执行摘要中声明的总步骤数。例如,如果前k个调用的已声明执行摘要中的步骤数之和X不超过给定数N,同时X与下一个调用的已声明执行摘要的步骤数之和大于N,则第一集合可以由该区块中的前k个调用组成。集合S可以取决于验证者集合的(预期)大小。例如,S可以将调用分组为指定相似(预期)大小的验证者集合。
[0090] 指派给S的智能合约验证者集合VS足够随机且足够多,以确保在假设给定的大多数用户诚实的情况下,有很大的可能性确保大多数的所选验证者是诚实的。还可以根据区块链与验证者当前在系统中拥有的货币金额或在给定时间点拥有的货币金额成比例地选择VS中的验证者。在这种情况下,可以选择具有更大权重的验证者属于VS,这意味着他有两票或更多票,并且可能希望确保大多数票都由诚实者掌握。
[0091] 同样,集合VS优选地是可检查的。即,(a)能够从S计算VS,或者(b)VS中的验证者能够确定他确实是VS的成员,并且如果是这样,他就能够向其他人证明确实如此。
[0092] 讨论和附加细节 本发明向智能合约的每个集合S指派了相对较小的一组验证者VS,这些验证者将花费必要的时间来验证S中的调用的已声明执行摘要的语义正确性,从而避免系统中的其他用户执行相同的工作。如果VS很小且固定,则系统将不会非常安全,因为敌对者可能会随着时间破坏所有验证者或大多数验证者。
[0093] 为了防止这种可能性,基于S和一些附加信息P以随机或伪随机方式选择每个VS。例如,可以使用散列函数或另一种合适的密码函数H:例如,VS=H(S,P)。P的可能选择可以包括时间信息、关于其中出现S的一个或多个区块的信息、包括在这些区块中或可从这些区块或更一般地从区块链推断出的数据等,包括无信息。(注意,VS可以基于S被选择,基于其中出现S的一个或多个区块被选择。例如,如果S是区块B或区块编号n的所有调用的集合,则可以基于B或n选择VS。对于另一示例,如果S是区块编号为n的第二调用集合(按某种给定顺序),则可以基于包括对(n,2)的信息来选择VS。基于S的选择包括基于S和其他信息的选择。)
[0094] VS的这种随机选择使敌对者更加难以破坏VS中的一些验证者。实际上,该组验证者可能每次都发生巨大变化。
[0095] 理想地,经由秘密抽签方法来选择VS中的验证者。在这种方法中,用户v秘密地了解他是否是VS的验证者,但是如果确实如此,则可以向其他人证明这一点。例如,v可以使用他的秘密密钥来计算他是否属于VS。例如,v可以计算SIGv(S,P)并检查如此计算出的数据串是否满足给定的属性。在没有任何预期限制的情况下,一个这种属性可以是具有值SIGv(S,P),或者其散列小于给定数t。实际上,像任何其他数据字符串一样,SIGv(S,P)可以唯一地解释为一个数字,并且可以轻松地将该数字与“目标”数t进行比较。例如,如果将密码函数H视为随机函数,则如果t=0.001,则H(SIGv(S,P))≤t的概率为千分之一。因此,在该示例中,可能用户的千分之一是VS中的验证者。注意,该示例的验证者集合VS是可检查的。实际上,如果v属于VS,则v可以通过释放其签名SIGv(S,P)来证明是这种情况。实际上,给定该数据串,任何人都可以说出其是否拥有确定属于VS的所需属性。但是,在v揭示SIGv(S,P)之前,敌对者很难破坏v,因为一个简单的事实就是敌对者不知道v是谁!实际上,v是秘密选择的,因为只有他知道确定v是否属于VS的秘密密钥(在上面的示例中为他的秘密签名密钥)。实际上,经由秘密抽签来选择VS是非常安全的。
[0096] 4.验证.
[0097] 当智能合约的集合S是在区块链中注册(出现)时,VS中的每个验证者v都验证S中的每个调用I的语义正确性,并且然后认证并传播他的响应。
[0098] 如果集合VS是经由秘密抽签选择的,则v还会传播他确实属于VS的证明。
[0099] 验证者v可以单独地认证他关于S中的每个I的响应。例如,通过计算和传播SIGv(I,valid)。
[0100] 验证者v还可以一起认证其所有响应,从而指示哪些调用有效以及哪些无效。例如,如果S中的调用是I1,I2,I3,I4,…,并且调用I1,I3,…是有效的,而调用I2,I4,…是无效的,则v可以计算并传播:
[0101] SIGi((I1,valid),(I2,invalid),(I3,valid),(I4,invalid),...)[0102] 更紧凑地,v可以使用1来指示有效性,并且使用0来指示无效性。因此,对于上面的示例,他可以通过传播SIGi((I1,1),(I2,0),(I3,1),(I4,0),...)来一起认证他的所有响应。然而更紧凑地,如果S中的调用I1,I2,I3,I4,…实际上以某种预定且明确的方式进行排序,则在上述情况下v可以传播SIGv(1,0,1,0,...)。即,处于第一位置的第一个1指示第一笔交易(即,I1)有效;处于位置2的第一个0指示第二笔交易(即,I2)无效;以此类推。
[0103] 验证者v也可以一起认证其响应,但允许提取v的关于S中的单个调用的经认证响应。例如,v可以构建默克尔(Merkle)树,其每个叶都存储v的关于S中的单独调用的响应,并且然后对存储在默克尔树的根上的值进行认证。
[0104] VS中的诚实验证者仅提供关于S中的每个调用I的正确响应(以及因此单个响应)。
[0105] 不管VS中的验证者可以使用什么方法来认证他们认为S中的哪些调用有效以及哪些调用无效,只要VS中的至少给定数量X个验证者认证I在语义上有效,S中的调用I就可以被认为是正确的,并且否则就被认为是不正确的。可替代地,如果VS中的至少给定数量Y个验证者认证I在语义上是不正确的,则I可以被认为是不正确的。为了最大化意义,将X和Y选择为足够大,使得当VS中的大多数验证者是诚实的时,(a)S中的在语义上有效的每个调用I都将被认为是正确的,而不会被认为是不正确的;并且类似地,(b)S中的在语义上无效的每个调用I都将被认为是不正确的,而不会被认为是正确的。
[0106] 讨论和附加细节 使VS中的验证者传播他们关于S中调用的语义有效性的经认证响应是不够的。例如,最近加入系统并了解目前为止的整个区块链的用户可能不知道在其加入之前传播了什么。因此,尽管他看到调用I已在区块链上注册,但他不知道I是否正确。因此,重要的是在区块链本身上注册关于I的最终“判决”。
[0107] 回想起默克尔树在文献中是众所周知的。默克尔树允许相对于存储在树的根中的值r认证存储在树的节点中的许多信息。为了认证存储在树的节点中的任何值v,必须提供从根到存储v的节点的认证路径。这种路径可以比在树内认证的值序列短得多(例如,以对数形式变短)。如果值r未知,则为了对存储在树的节点中的值v进行认证,可以单独地(例如,经由数字签名)对r进行认证,并且然后提供v相对于r的认证路径。
[0108] 5.判决.
[0109] 构建新区块的用户u不仅可以在这种区块中包括尚未出现在区块链中的有效普通交易(例如,有效支付),还可以包括最终判决,即,关于有关先前注册在链中的调用的正确性或不正确性(无论是哪种情况)的信息。优选地,为链中尚未出现最终判决的交易提供这种信息。
[0110] 令S为先前在区块链上注册的调用集合,并且u为构建新区块B的用户。然后,在接收到VS中的足够多个验证者的响应之后——以便了解对于S中的每个I,I是否正确——u可以在B中包括关于S中的调用(例如,S中的所有调用)的最终判决。这种最终判决还可以包括标识集合S本身的信息,并且优选地被认证。如果u对B进行认证,则u会自动对这种判决进行认证。可替代地,u可以单独地认证关于S中的调用的最终判决。例如,为了指定关于S中的调用的最终判决,u可以使用由VS中的验证者转达他关于S中调用的语义有效性的响应所使用的方法之一。
[0111] 可替代地,u可以在区块中包括VS中的足够多个验证者的经认证响应,以便使得能够根据这种包括的响应来确定S中的有效调用和S中的无效调用。可能连同这些响应一起,u还可以包括证明所讨论的验证者确实属于VS的一个或多个数据串。
[0112] 可替代地,u可以在他的区块中包括SV中的一些验证者(优选地是其响应尚未记录在区块链中的验证者)关于S的响应,但不能仅从这种包括的信息中推断出S中的调用的正确性。然而,用户可以在多个区块上推断出S中的调用的正确性。实际上,当记录在链上的足够多的响应证明I的正确性或不正确性(无论是哪种情况)时,就可以得出关于S中的调用I的最终判决。
[0113] 用户u可以在B中包括关于S中的所有调用或仅其中一个或多个调用的正确性的信息。例如,他可以在B中包括VS中的验证者关于S中的一个或多个调用I的一个或多个响应。或者,他可以包括从中可以推断出S中至少某个(一些)交易的正确性的信息。如果VS中的验证者以使得能够提取他们关于S中的仅一些交易I的经认证响应的方式来认证他们关于S中的调用有效性的响应,则u可以包括这种关于I的所提取认证。例如,如果VS中的验证者v通过认证默克尔树的根r来认证他关于S中的调用的响应,则为了在B中包括v对S中的调用I的认证,u可以包括v对r的认证以及从r到包括i关于I的有效性的响应的值的认证路径。
[0114] 讨论和附加细节.区块B不仅可以在其普通交易有效的情况下被认为有效,而且在其关于先前注册的调用的最终判决有效的情况下也可以被认为有效。
[0115] 在依靠工作量证明来产生新区块的区块链中,诚实的矿工不会将新区块链接到无效区块。
[0116] 在提出新区块B并且然后由适当的多组用户(例如,适当的一组验证者)投票或一致同意才能添加到链中的区块链(如Algorand)中,无效区块可能不会被投票或一致同意。
[0117] 该协议可以允许并发执行给定的合约,或在C的执行中强加特定的执行顺序,包括忽略这种执行中的一些。例如,如果给定合约C的调用I在区块链上注册,则该协议可以防止C的另一次调用在区块链上注册,直到关于I的最终判决出现在区块链上为止。具体地,建立新区块B的用户u可能不会在B中包括C的两个或更多个执行。可替代地,可以出现C的两个或更多个调用,但是选择(例如,以某种预定的方式)其中一个首先执行。(多个)其他调用可能永远不会执行,或者只有在得出关于第一个调用的最终判决之后才执行。还可替代地,根据合约的类型和合约的规定,选择首先要执行的合约,并且然后选择第二个合约,依此类推。
[0118] 合约C的调用I还可以包括区块编号r,因此任何关于I的最终判决都无法在区块r之后进入区块链。可替代地,可以基于注册了I的区块和I中声明的步骤数来自动确定这种r。如果原始调用被保留而没有最终判决,则可以启用C的新调用。在这种情况下,可以考虑自动向负责调用I的用户补偿I在区块链中注册时所支付的费用。
[0119] 一旦合约C的调用I的最终判决(的指示)进入了区块链,那么如果判决是肯定的,则意识到这一点的用户x正确地更新C的当前状态,并考虑了已发生的所有相关净效应。(例如,如果调用I通过从一个用户向另一个用户声明了给定的支付,则将自动更新这种用户所拥有的货币。)如果最终判决是否定的,则不会进行C的状态更新,也不会发生任何净效应。然而,可能会自动向负责调用I的用户强加附加费用。
[0120] 1一般分析
[0121] 安全性,效率和成本 如果确定v是诚实的,则单个验证者v对给定集合S中的调用的响应就足够了。但是,当然,区块构建者/提议者或其他任何人可能都不知道哪些验证者是诚实的。然而,很容易对大多数验证者的诚实性充满信心。因此,如果有足够多的(优选地随机选择的)验证者告诉所有其他用户S中的哪些调用是有效的以及哪些是无效的,则人们就可以了解S中的调用的正确性,而不必亲自验证其有效性!这就是为什么本发明的方案同时是安全且高效的。
[0122] 例如,如果80%的用户是诚实的,S中I的验证者数量约为500,则300个验证者的响应确实可以保证极高的安全性。同时,如果S包含例如100个调用,则平均只有5个用户验证每个调用的有效性,从而使系统非常高效,而且非常安全。
[0123] 由于相对很少的验证者(尤其是平均!)直接检查已声明执行的有效性,因此注册给定执行所需的费用可能非常低。实际上,它需要补偿很少用户的计算成本:在上面的示例中,平均只有5个用户,而不是(比如)系统中的所有用户。调用智能合约所需的费用通常称为“瓦斯(gas)”。因此,在本发明的系统中,
[0124] 对于非常多且理想类型的合约来说,瓦斯要便宜得多!
[0125] 高安全性与高效率以及低成本相结合可以使本发明的系统对于一大类智能合约非常有吸引力,并且确实可以允许大规模使用这种合约。
[0126] 实际上,利用本发明的系统,智能合约的执行时间可能比其他系统中的执行时间长得多,但导致的总计算量却少得多。
[0127] 货币加权 注意,在整个申请中,像在Algorand或其他区块链中那样,可以至少部分基于某种形式的权益证明、基于在给定时刻(例如,当S在区块链中注册时)验证者在系统中拥有的货币金额来选择给定调用集合S的一组验证者VS。实际上,给定的用户所输入的VS可能具有大于一的多重性。实际上,VS可以由一组验证者的多个投票组成,其中每个验证者可能具有更多票,具体取决于他所拥有的货币金额。即,当假设大部分货币是由诚实的人掌握时,本发明的系统也适用。
[0128] 计算效率 注意,尽管系统中的用户数量n可能很大(例如,n=100M),但只有T(例如T=500)个验证者需要执行C(input)。因此,通过本发明的技术执行C的总计算成本为≤500#steps,而不是100M#steps。因此,Algorand中的智能合约的执行时间可能比其他系统中的执行时间更长,但导致的总计算量却要少得多。换言之,新技术具有更大的灵活性,并可以使用更大类的智能合约。
[0129] 成本效率 新型智能合约技术的计算效率自动蕴含了成本效率。考虑在具有100M用户的系统中调用需要1小时计算的智能合约C的执行。在这种系统中,C的传统调用的费用必然很高,因为它必须基本上覆盖100M小时计算的总成本。相比之下,使用新技术,相同的C调用的相应费用仅需要覆盖500个小时的计算。实际上,后者的成本不仅适中,而且即使系统中的用户总数为1B或更高,其成本也保持不变!换言之,在新发明的系统中,
[0130] 对于非常多且理想类型的合约来说,‘瓦斯’要便宜得多!
[0131] 吞吐量效率 通过本发明的技术,在区块B中注册的合约C的调用I通过一组适当的验证者‘链下’触发C的执行。因此,即使这种执行花费很长时间,也不需要很长时间来检查区块B的有效性。因此,可以立即开始下一个区块的生成。换言之,本发明的系统可以具有非常高的吞吐量。一旦I的适当验证者完成了其执行(即使这种执行花费了很长时间),关于I的最终判决就会进入区块链,而丝毫不会拖慢链。相比之下,在传统方法中,如果将I在区块B中发布,则必须在产生下一个区块之前完成e的调用。因此,即使区块中包含的智能合约的执行单个或总共需要一小时的计算,这种新技术仍可以在几秒钟内产生新的区块。
[0132] 2变型和附加项
[0133] 上面介绍了我们的优选实施例。本领域技术人员认识到,若干其他变型和替代方案是可能的,所有这些都在本发明的范围内。下面我们只考虑其中的一些。
[0134] 不进行调用注册的最终判决 在优选实施例中,调用I必须在区块链上注册才能触发其‘系统执行’。然而,可替代地,I可能不会被放在区块链上,而是其最终判决(的指示)可能被放在区块链上。例如,I可能只是被传播,直到被它的足够多个验证者注意到并处理,然后这些验证者传播其关于I的各个响应,并且只有当他看到足够多的一致性响应时,新区块B的构建者才会将关于I的最终判决的信息包括在B中。(例如,I的一些或足够多个验证者的已签名个体响应。)
[0135] 其他度量和结论 在智能合约的调用中,所采取的步骤数是衡量调用复杂性的重要度量,而最终的支付/效应是其重要结论的一部分。然而,还存在其他度量和结论,所有这些都可以在我们的发明中处理。下面我们仅详述几个示例。
[0136] 智能合约可以是任意程序,并且合约C的执行可以自动触发C本身或其他智能合约的其他执行。(实际上,智能合约通常用图灵完备的语言来编写。)这一事实既可能是优点,也可能是缺点,并且可能希望包含合约C的调用I可能引起的调用数。
[0137] 例如,可以在invokei内指定调用数#calls(作为单独的分量和/或作为其他分量的一部分),并且可以将I的费用fee调整为取决于#calls。这种依赖关系可以简单地成比例,或者可以随着#calls而剧烈地增加。因此,相对于包括#calls在内的所有复杂性度量,可以要求I的验证者验证#calls是否正确,并且因此验证fee。
[0138] 可替代地或另外地,可以限制调用数。例如,如果声明的#calls大于给定界限,或者C实际进行的调用数大于#calls,则无论#steps和fee的值如何,调用均被认为无效。上面针对个体和最终判决讨论的所有机制都直接适用于这种新的复杂性度量。
[0139] 同样,可以区分普通调用和‘嵌套调用’。例如,如果C的执行e引起合约C′的执行e′,而后者进而引起合约C″的执行e″,则e″可以被认为是2‘级’嵌套调用。类似地,可以具有3级、4级等的嵌套调用。注意,也可以在调用I中声明嵌套调用和/或其级别,并且可以直接扩展I的费用、有效性和处理,以便包括此附加声明的信息。
[0140] 除了调用I的直接净效应外,还可以考虑其调用的效应。例如,可以在I中明确指示其直接引起或经由其调用引起的要转移的总货币金额。同样,可以禁止给定级别的调用,或者使其比常规调用更昂贵。
[0141] 激励措施.一个调用或调用集合的验证者可以经由适当的奖励来激励。具体地,如果调用I的验证者关于I的响应与关于I的最终判决一致,则他可以有资格获得奖励。
[0142] 这种验证者中的所有或一些(例如,样本)可以得到奖励。可以以密码方式(例如,通过密码抽签(cryptographic sortion)和/或经由随机信标的帮助)选择要奖励的验证4 4
者。  这种样本也可以由专业的一方来选择,其本身可以经常被得重新选择。具体地,这种一方本身可以通过密码抽签来选择,对一个或多个验证者进行数字签名以接收奖励,并且其签名可以出现在区块中。可替代地,可以由区块构建者选择这种验证者。可以在同一区块中指示调用I(或调用集合S)的受奖励验证者和I(或S)的最终判决。
[0143] 例如,区块构建者u可以在他的区块中插入针对I(或S)的最终判决V,以及标识要奖励的一个或多个验证者v的信息。(可替代地,可以将标识受奖励验证者的信息插入到后续区块中,并可能由另一个区块构建者/提议者选择。)例如,除了最终判决V之外,u还可以在区块链中包括确实指派了验证者v以验证I(或S)的证明,以便使得能够检查v的响应是否与V一致。可替代地,构建者可以不在其区块中包括V。例如,对于I的单个验证者v或多个这种响应一致的验证者,仅包括v和v的数字签名的个体判决就足够了。实际上,可以从这种个体响应推断出最终判决V的含义。例如,如果该区块只包含单个验证者v关于I的个体响应,则可以使用此信息来指示关于I的最终判决与I的个体判决一致(并且可能还指示v已作为奖励的目标)。一旦在区块中识别出所有(多个)受奖励验证者,即可自动进行支付。
[0144] 诚实的区块构建者可能会随机或以某种其他方式选择要奖励的I的(多个)验证者。即使恶意构建者可能以不同的方式(例如,通过优选恶意验证者)选择它们,仍会激励I的验证者上报其真实响应。实际上,期望大多数验证者都是诚实的,并且期望区块构建者也是如此。
[0145] 进一步地,为了奖励一个或多个调用I的验证者,或者考虑到他们的个体判决,可能需要验证者确实正确执行了C的证据。这种证据可能包括某种类型的CS证明,snark或stark。这种验证者提供的证据也可以作为关于I的最终判决的一部分(或关于该判决的全部证据)在区块中使用和发布。
[0146] 除了积极的奖励外,区块链还可以使用惩罚措施。例如,可以对上报关于调用(或调用集合)的响应与关于调用正确性的最终判决不同的验证者v进行罚款。这种罚款可能会自动从v所拥有的货币中扣除。
[0147] 区块链还可以设想在区块链中有意地注册至少一个在语义上无效的调用I。这可能有助于发现(并可能惩罚)被指派用于验证语义有效性I的验证者中恶意地上报I在语义上是有效的(直接上报或当上报关于包括I的调用集合的有效性时)的验证者。
[0148] 例如,导致注册有意在语义上无效的调用的用户可能不会因为它们是恶意的而这么做,而是因为它们已被选择来帮助发现恶意验证者。因此,优选地,这些帮助用户的选择是秘密的(使得有意在语义上无效的调用的验证者不知道该调用是确实无效)并且是随机的(以确保至少选择了一些诚实的帮助用户)。例如,用于选择这种帮助用户的过程可能类似于为调用I或调用集合S选择验证者v的过程:可以通过对可从区块链中推断出的给定数量Q与其他数据(例如,字符串“HELPING USER”)一起进行数字签名、对签名进行散列处理并检查其是否小于给定的目标数来选择帮助用户。该过程保证了其他用户不会意识到给定用户u已被选择为帮助用户,直到u揭示了他的选择证明(在上述示例中为他的数字签名)。在关于由u注册的有意在语义上无效的调用I的最终判决进入区块链之后,可以揭示这一证明。这种证明可以像有效交易一样被插入到区块链中。以这种方式,已对u强加的费用或罚款可以自动退还给u(可能还有奖励),因为任何人都意识到u根据协议采取行动,以帮助确保区块链中的智能合约的诚实运行。
[0149] 3承诺声明式智能合约
[0150] 现在,我们描述一种特殊类型的声明式智能合约:承诺声明式智能合约(committed declarative smart contracts,简称CDSC)。这种合约的调用会暂时隐藏相应执行的至少一些净效应。可以如前注册这些调用。可以如前检查它们的句法有效性。可以如前将验证者指派给这种调用的集合。并且可以如前在区块链上发布最终判决。
[0151] 然而,这些新调用的验证者不会如前检查其语义有效性。这是因为这些新调用会暂时隐藏它们指定的执行的至少一些净效应。实际上,这些调用包括对这种净效应的承诺。(这种承诺隐藏了这种净效应,但是,在稍后的某个时间点,却敞开了大门以便在稍后的某个时间点以可证明的方式揭示最初承诺的净效应是什么。)
[0152] 因此,被指派用于验证一个这种调用I的验证者可以重现由I指定的执行e,从而了解e的所有净效应是什么,但不能确定I中承诺的净效应是否是他自己计算的净效应。因此,这种验证者在响应中上报了他自己计算并在I中承诺的他自己对e的净效应的个性化承诺,但不知道它们的值是否一致。这种个性化承诺不能仅仅通过复制I中的相应承诺来获得,也不能从后者的承诺或任何其他个性化承诺中可行地计算出来。实际上,CDSC中的理念是使I的验证者了解I所隐藏的净效应,并且然后计算他自己对这种效应的承诺并将其包括在他的响应中。从某种意义上说,因此,I的每个验证者必须独立行事,并真正运行由I调用的执行e。
[0153] 只有在稍后时刻,本发明的系统才揭示使得能够通过以下方式来验证I的正确性的信息:使得能够检查在I中承诺的净效应是否与在I的足够多个验证者的响应中承诺(以个性化的方式)的净效应一致。因此,可以将关于CDSC的单个调用或调用集合的最终判决发布在区块链上,并且可以像以前一样以及以新方式将激励和/或惩罚分配给用户。
[0154] 在没有任何预期限制的情况下,我们将描述CDSC的附加细节。
[0155] 1.承诺调用.
[0156] 智能合约C的承诺声明式调用I指定C(在给定的输入/多个输入和初始状态上)的执行e和其他相关数据,其很像声明调用,但隐藏了e的净效应的集合s,而替代地包括对s的承诺。
[0157] 对给定值x的承诺允许在给定的时间点秘密地固定(pin‑down)x,但在稍后的时间点证明固定值x是什么。例如,为了承诺一组净效应s,对于给定的(抗冲突)散列函数H,I可以包括h=H(s)。实际上,如果不了解s,很难从h计算s。同时,最终揭示s会说服任何知道h的人相信所揭示的s确实是原始承诺的值。这是因为很难计算出任何值z≠s使得H(z)=H(s)。可替代地,I可以通过单独包括这些效应中的每一个的散列值来承诺一组净效应。例如,如果s由通过e生成的C的新状态γ′以及通过e生成的玩家金额调整a1,a2,…组成,则I可以通过包括H(γ′),H(a1),H(a2),…来承诺s。还可替代地,I可以通过包括默克尔树的根值来承诺一组净效应s,该默克尔树的节点存储所讨论的净效应。更一般地,本发明的系统可以使用其他承诺方法来暂时隐藏I的一些净效应。
[0158] 智能合约的(至少部分地)承诺声明式调用的相关数据可以与普通声明式调用相同。
[0159] 为简单起见,我们可以更简单地将承诺声明式调用I称为声明式调用,或者如果上下文足够清晰,更简单地将其称为调用。如果要强调智能合约的调用不是承诺声明式调用,则可以使用术语普通调用。
[0160] 讨论和附加细节 关于普通调用的可适用于承诺声明式调用的讨论和附加细节将自动扩展到承诺声明式调用。
[0161] 注意,通过适当的调用用户进行数字签名的已提交调用继续认证C的相关执行的所有净效应,但它们的集合s可以以间接的方式认证,即,通过认证对s的承诺。
[0162] 如我们将看到的,本发明的系统使得观察区块链的所有用户能够判定合约C的承诺调用I是否正确,而不会给所有用户或太多用户带来计算由I指定的执行e的负担。
[0163] 现在让我们来看看如何注册这种承诺调用I。
[0164] 2.承诺调用的注册.
[0165] 承诺调用I可能会像普通调用一样进入区块链。例如,I的句法有效性可能足以让I进入区块链。
[0166] 检查这种句法有效性可以包括检查对于在I中声明的用于指定执行的步骤数而言I的费用是否足够。实际上,费用和所声明的步骤数可能不被认为在I中指定的执行e在区块链中必须发生的净效应。因此,费用和所声明的步骤数可以开放地出现在I中。
[0167] 再次,包括句法无效的承诺调用的区块被认为是无效的,并且在承诺调用I的传播期间,可能需要I的句法有效性才能将I转发给其他用户。
[0168] 当承诺调用I在区块链中注册后,系统开始检查其正确性的过程。现在让我们继续说明此过程。
[0169] 3.承诺调用的指派.
[0170] 按照所描述的用于指派一组普通调用的任何方法,将在一个或多个区块中注册的一个或多个承诺智能合约调用的集合S指派给验证者的集合Vs。
[0171] 4.承诺调用的验证.
[0172] 当承诺调用的集合S在区块链中注册时,在Vs中的每个验证者v都在适当的(多个)输入和状态上执行S中的每个调用I的合约C,并且然后进行认证并传播其响应。如已经提到的,这种响应可以仅包括对I中指定的执行e的一些净效应的个性化承诺。现在让我们讨论这种响应的一些可能的示例。
[0173] 如果I是公然无效的(例如,如果其调用e的步骤数超过I中声明的步骤数),则v在他关于S的响应中指示就是这种情况。例如,通过在他的响应中包括一对(I,invalid)。
[0174] 在第二示例中,令e是通过I调用(在其中指定)的执行,令I声明用于e的正确步骤数,令ne由e的所有净效应(以预定的顺序和方式呈现)组成,并且令I通过包括承诺H(ne)来隐藏ne。然后,在重建e(并因此重建ne)之后,v可以认证标识I以及对ne的(优选地个性化)承诺的信息。v到ne的个性化承诺是指对ne的承诺hv,使得(a)v难以在不知道ne的情况下计算hv——即使v知道包括在I中的承诺H(ne)并且可能还知道对ne的其他承诺——并且(b)在给定了ne和v的知识的情况下,任何人都能容易地计算v对ne的个性化承诺。
[0175] 例如,v对ne的个性化承诺可以由Hv(ne)组成,其中,Hv是这样定义的散列函数:Hv(x)=H(v,x)。因此,h=Hv(ne)=H(v,ne)实际上就是v对ne的承诺。实际上,没有人可以找到另一个值ne′以使得H(v,ne′)=h,并且一旦揭示了值ne,任何人都可以验证确实是h=H(v,ne)。此外,v的这种承诺是个性化的,因为v不能轻易地从I中提供的承诺H(ne)来计算它,如果z≠v,则也不能从H(z,ne)计算它。
[0176] 注意,将v与ne一起进行散列处理仅仅是v对ne的个性化承诺的一个示例,并不旨在进行限制。例如,优选地利用唯一地取决于v的任何数据来替代H(v,ne)中的v也将起作用。对ne的任何形式的个性化承诺均在本发明的范围内。
[0177] (对于普通调用,如果集合VS是经由秘密抽签选择的,则v除了传播其响应之外,还会传播他确实属于VS的证明。同样,v可以单独地认证他关于S中的每个承诺调用I的响应,5 5
或者可以像在普通调用的情况中那样一起对它们进行认证。) 例如,如果在S中的调用是I1,I2,I3,I4,…并且调用I1,I3,…是有效的(并且分别具有净效应ne1,ne3,…)并且调用I2,I4,…是公然无效的,则v可以计算并传播SIGv((I1,Hv(ne1)),(I2,invalid),(I3,Hv(ne3),(I4,invalid),…)。再次,更紧凑地,如果I1,I2,I3,I4,…是S中的给定顺序的调用,则v可以认证并传播序列(Hv(ne1)),0,Hv(ne3),0,…),其中0指示相应的调用是公然无效的。验证者v也可以一起认证其响应,但允许提取v的关于S中的单个调用的经认证响应。例如,v可以构建默克尔(Merkle)树,其每个叶都存储v的关于S中的单独调用的响应,并且然后对存储在默克尔树的根上的值进行认证。
[0178] 使用对承诺调用I的执行e的净效应ne的个性化承诺使得VS中的验证者v难以在没有了解值ne是什么(例如,通过真正地运行通过I调用的执行e)的情况下认证I是否有效——即使v确定调用I被正确的准备的情况下也是如此!同时,通过学习ne,任何人都可以验证其承诺包括在I中的值ne和其由v个性化的承诺包括在v关于I的响应中的值是否相同。
[0179] 承诺调用的正确性.VS中的诚实验证者仅提供关于S中的每个承诺调用I的正确响应,以及因此单个响应。如果在I中承诺的所隐藏净效应与在VS中至少给定数量X个验证者的响应中承诺的净效应相同,则认为(证明)这种调用I是正确的。如果VS中的验证者的至少Y个响应指示I无效,则调用I可能被认为不正确。可替代地,如果在区块链的给定点上I尚未被证明是正确的,则其可能被认为是不正确的。
[0180] 然而,注意,在不知道ne的情况下,很难确定H(ne)=Hv(ne)是否成立。因此,系统需要某种方式来确定哪些承诺调用是正确的。在下文中描述了多种这种方式。
[0181] 4.5所隐藏净效应的揭示.
[0182] 令i为已经调用I的适当一方,并且令ne为由I指定的执行e的净效应(其承诺出现在I中)。在不丧失预期一般性的情况下,令对在I中承诺ne的方式由ne的散列组成。假设i是诚实的,则i可能(1)知道值ne;(2)已经正确计算了承诺H(ne)并将其包括在I中;并且(3)希望净效应ne实际发生在区块链中。
[0183] 因此,当i看到VS中的X个以上的验证者v在其响应中包括对ne的个性化承诺——例如Hv(ne)——时,i优选地以经认证的方式传播ne,并带有标识调用I的信息。
[0184] 一旦ne被揭示,任何观察区块链消息的人都会意识到,值ne与I中以及在VS中至少X个验证者的响应的个性化承诺中所承诺的值相同。换言之,每个观察者都看到承诺调用I是正确的。
[0185] 注意,不一定由调用者i来揭示ne。例如,其可以是已经执行e、计算出ne并意识到确实ne与I中以及在VS中至少X个验证者的响应的个性化承诺中所承诺的值相同的任何实体(例如,指派给I所属的承诺调用集合S的特殊验证者)。
[0186] 现在是时候在区块链中正式进行这一实现了。
[0187] 5.关于承诺调用的判决.
[0188] 令I是已经在区块链中注册的承诺调用,但没有最终判决。然后,新区块B的构建者u意识到I是正确的,他在B中包括了指示I是正确的信息,从而提供了关于I的最终判决。
[0189] 该系统还可以提供关于已经在区块链中注册的一组承诺调用S中尚不存在最终判决的所有承诺调用的同时最终判决。
[0190] 例如,构建新区块B的用户u(他已经了解了S中的哪些调用是正确的)可以在B中包括关于S中的这种调用的最终判决。这种最终判决还可以包括标识集合S本身的信息,并且优选地被认证。如果u对B进行认证,则u会自动对这种判决进行认证。可替代地,u可以单独地认证关于S中的调用的最终判决。
[0191] 可替代地,u可以在区块中包括VS中的足够多个验证者的经认证响应,以便使得能够根据这种包括的响应来确定S中的有效调用和S中的无效调用。这样做使得可以使用在普通调用情况下讨论的任何方法。
[0192] 讨论和附加细节.区块B不仅可以在其普通交易有效时被认为有效,而且还可以在其关于先前注册的(普通或承诺)调用的最终判决正确地反映了这种调用的正确性时被认为有效。
[0193] 针对普通调用描述的其他讨论和附加细节也适用于承诺调用。对于为普通调用提供的各种变型和附加项,也是如此。
[0194] 具体地,但无任何预期限制地,货币加权技术也适用于承诺调用的验证者。因此,我们可以将权重为n的验证者视为n个单独的验证者。
[0195] 关于承诺调用I的响应与I的已确立正确性和/或与I中承诺的净效应的已确立揭示值一致的验证者可以得到奖励——例如,通过已经针对普通调用或新调用的验证者描述的任何激励方法。
[0196] 类似地,关于承诺调用I的响应与I的已确立正确性和/或与I中承诺的净效应的已确立揭示值不一致的验证者可能会被罚款或受到惩罚——例如,通过已经针对普通调用的验证者描述的任何惩罚方法。具体地,它们可能不再有资格被指派用于验证至少一些其他调用。
[0197] 不正确的承诺调用I的调用者可能还会受到特殊的罚款或以某种方式受到惩罚。
[0198] 4变型和附加项.
[0199] 令s为智能合约C的承诺调用I所指定的执行e的一组净效应,并且令h=H(s)为I中包括的对s的承诺。然后,如果s本身是充分不可预测的,则某一方——例如,指派给I的验证者,比如被指派给包括I的调用集合的验证者——将很难根据H(s)来计算s。然而,如果s(比如)仅由几位组成,则某一方可能会尝试s的所有可能性,直到他找到被散列产生h的值为止。为了防止这种可能性,可以将s选择为很大——例如,由e的所有净效应组成,以使一方更加难以猜测它们的全部。但这有时可能还不够。
[0200] 为了保证很难正确猜测e的承诺净效应,可以人为地在这些净效应中包括一个很难预测的特殊选择的数量。例如,尽管人们关心的e的净效应是新状态γ′以及几个玩家金额的调整a1,…,ak,但I的适当调用者可以在执行e的末尾人为地将C的特殊辅助变量的内容x添加到这种净效应中,并且令s=(γ′,a1,…,ak,x)。实际上,即使e的净效应可能总是很容易预测,e的计算也可能具有或可能被设计成具有相当不可预测的变量内容,以便生成其简单的效应。因此,如果x难以预测,则即使很容易预测γ′,a1,…,ak,也很难从H(s)来预测s=(γ′,a1,…,ak,x)。(自然地,x将纯粹起到辅助作用,并且如果调用I是正确的,则不应将其视为在区块链中发生的净效应。)
[0201] 可替代地,值x可能取决于e以及可能完全分开的指定程序P的执行,取决于I中包含的或可从中推断出的完全分开的指定输入y。可以选择这种程序P和输入y,以使得难以根据P和y来预测x。例如,P的计算可以不时包括从执行e获得的数量。可替代地,P(y)的计算可能与e完全不相关。
[0202] 再次,I可以包含对x的承诺,并且还可以要求(直接或间接)被指派用于验证I的执行e的验证者v计算x并在他的响应中包括对x的个性化承诺。只有当指派给I的足够多个验证者的这些个性化承诺的基础值彼此一致并与I中承诺的基础值x一致时,I才可以被认为是正确的。因此,如果指派给I的验证者希望他关于I的响应被正确计数,则鼓励他正确地计算x。
[0203] 注意,在本领域技术人员可以使用的任何上述和其他可能的变型中,I中声明的总步骤数还必须包括计算x所需的步骤数,并且因此可能导致I的应付费用增加。但是,I的适当调用者可能会乐于支付更高的费用,以更加确信I的验证者正确地计算了x。
[0204] 而且,无论以哪种方式使用这种值x,I甚至都可能以开放的方式包括e的真实净效应——例如,如果I是正确的,则实际上应当在区块链中发生的净效应——并且使得对x的个性化承诺是I的唯一承诺。在这种情况下,要求被指派给包含I的集合S的验证者v产生这样的响应,该响应:(1)指示e的公开声明的净效应是否正确,并且(2)包括对x的个性化承诺。在这种情况下,如果I中承诺的x的值与指派给S的足够多个验证者v的响应中承诺的值一致,并且这种响应指示I的公开声明的净效应是正确的,则将I认为是正确的。
[0205] 注意,本文描述的机制可适用于其他区块链系统,在这些区块链系统中,期望以通常可验证的方式出于特定目的(诸如验证)随机地选择用户的子集。因此,本文描述的系统可以适于其他区块链方案,诸如以太坊或莱特币,甚至不与货币直接相关的区块链方案。
[0206] 本文描述的系统可以适于被应用于以下美国专利申请和PCT专利申请中的任何一项或全部中阐述的机制,并且可以与之结合:2015年2月17日提交的62/117,138、2015年2月26日提交的62/120,916、2015年4月2日提交的62/142,318、2015年9月15日提交的62/218,
817、2016年3月29日提交的62/314,601、2016年2月17日提交的PCT/US2016/018300、2016年
4月25日提交的62/326,865、2016年5月4日提交的62/331,654、2016年5月9日提交的62/
333,340、2016年5月31日提交的62/343,369、2016年6月2日提交的62/344,667、2016年6月7日提交的62/346,775、2016年6月16日提交的62/351,011、2016年6月22日提交的62/353,
482、2016年6月24日提交的62/354,195、2016年7月19日提交的62/363,970、2016年8月1日提交的62/369,447、2016年8月24日提交的62/378,753、2016年9月2日提交的62/383,299、
2016年9月13日提交的62/394,091、2016年9月27日提交的62/400,361、2016年10月3日提交的62/403,403、2016年10月20日提交的62/410,721、2016年11月3日提交的62/416,959、
2016年11月16日提交的62/422,883、2017年2月6日提交的62/455,444、2017年2月14日提交的62/458,746、2017年2月16日提交的62/459,652、2017年3月15日提交的62/471,562、2017年5月16日提交的62/507,074、2017年5月25日提交的62/510,905、2017年6月21日提交的
62/522,927、2017年7月24日提交的62/536,061、2017年8月4日提交的62/541,568、2017年8月21日提交的62/548,201、2017年5月4日提交的PCT/US2017/031037、2017年8月17日提交的15/551,678、2017年9月28日提交的62/564,670、2017年10月4日提交的62/567,864、2017年10月10日提交的62/570,256、2017年11月2日提交的62/580,757、2017年12月19日提交的
62/607,558、2018年2月20日提交的62/632,944和2018年3月15日提交62/643,331,所有这些专利申请都通过引用并入本文。
[0207] 本文描述的系统的软件实施方式可以包括存储在计算机可读介质中并由一个或多个处理器执行的可执行代码。所述计算机可读介质可以是非暂态的并且包括计算机硬盘驱动器、ROM、RAM、闪速存储器、便携式计算机存储介质,诸如CD‑ROM、DVD‑ROM、闪存驱动器、SD卡和/或例如具有通用串行总线(USB)接口的其他驱动器、和/或可执行代码可以在其上存储并由处理器执行的任何其他适当的有形或非暂态计算机可读介质或计算机存储器。本文描述的系统可以与任何适当的操作系统结合使用。
[0208] 通过考虑本文披露的本发明的说明书或实践,本发明的其他实施例对于本领域技术人员将是显而易见的。说明书和示例仅被认为是示例性的,本发明的真实范围和精神由所附权利要求指示。