与用于串行化算术电路的算术编码有关的计算机实现的方法和系统与流程
admin
2021-01-05 13:08:22
0

与用于串行化算术电路的算术编码有关的计算机实现的方法和系统与流程
本发明大体上涉及用于减少算术电路所使用的数据足迹(datafootprint)(例如,当算术电路被存储在磁盘上或存储器中时)的技术,并且更具体地涉及通过利用压缩技术(即,这里描述的算术编码技术)来生成串行化电路的技术。可以以无损方式压缩算术电路以产生串行化电路,该串行化电路可以在以后的时间点被用来完美地再造原始电路。算术电路可以用于产生程序(program),该程序的执行可以被委托给分布式计算环境的一个或多个节点。可以使用协议来确保程序的正确执行,其中,第一计算机系统将程序的执行委托给第二计算机系统。本发明特别适合于但不限于在区块链网络中使用。
背景技术
:在本文档中,我们使用术语“区块链”来包括所有形式的电子的基于计算机的分布式账本(ledger)。这些包括基于共识的区块链和交易链技术、许可的和未被许可的账本、共享账本及其变型。尽管已经提出并开发了其他区块链实现方式,但是区块链技术最广为人知的应用是比特币账本。尽管为了方便和说明的目的在本文中可能提及比特币,但是应当注意,本发明不限于与比特币区块链一起使用,并且替代的区块链实现和协议落入本发明的范围内。术语“比特币”在本文中旨在包括衍生自比特币协议或其变型的任何协议。区块链是一种点对点的电子账本,其被实现为基于计算机的去中心化的分布式系统,该系统由区块组成,而区块又由交易组成。每个交易都是一种数据结构,该数据结构对区块链系统中参与者之间的数字资产控制权的转移进行编码,并包括至少一个输入和至少一个输出。每个区块都包含前一个区块的哈希值,此外区块被链接在一起来创建所有交易的永久、不可更改的记录,这些交易自其开始就已经被写入区块链。交易包含嵌入到其输入和输出中的被称为脚本的小程序,这些小程序指定如何以及由谁可以访问交易的输出。在比特币平台上,这些脚本是使用基于堆栈的脚本语言编写的。为了将交易写入区块链,必须对其进行“验证”。网络节点(矿工)执行工作以确保每笔交易有效,而无效交易则被网络拒绝。安装在节点上的软件客户端通过执行其锁定脚本和解锁脚本来对未花费的交易输出(unspenttransaction,utxo)执行该验证工作。如果锁定脚本和解锁脚本的执行评估为真(true),则该交易有效,并将该交易写入区块链。因此,为了将交易写入区块链,必须:i)由接收交易的第一节点验证该交易–如果交易经过验证,则该节点将其中继到网络中的其他节点;ii)将该交易添加到由矿工建造的新区块中;以及iii)该交易被挖掘,即,被添加到过去交易的公共账本中。尽管区块链技术因使用加密货币实现方式而被广泛了解,但数字企业家已经开始探索使用比特币所基于的加密安全系统以及可以存储在区块链上的数据这两者以实现新系统。如果区块链可以用于不限于加密货币领域的自动化任务和过程,那将是非常有利的。这样的方案将能够利用区块链的好处(例如,事件的永久性、防篡改记录、分布式处理等),同时在其应用中具有更多用途。当前研究的一个领域是使用区块链来实现“智能合约”。这些是设计为自动执行机器可读合约或协议条款的计算机程序。与以自然语言编写的传统合约不同,智能合约是一种机器可执行程序,其包括可以处理输入以便产生结果的规则,然后可根据这些结果来促使动作被执行。技术实现要素:因此,期望实现一种可验证的计算框架(例如,使用比特币网络),在该计算框架中,客户端计算机系统生成被表示为算术电路的智能合约,并使用编码技术(即算术编码)来压缩算术电路,从而生成压缩的算术电路,其可用于减少存储和/或执行智能合约的存储空间需求。进而,该压缩的算术电路可以被广播到区块链网络,并代替未压缩的算术电路而被存储(例如,存储在区块链网络的节点中)。工作者计算机系统可以获取压缩的算术电路并获得智能合约的可执行版本(例如,通过解压缩压缩的算术电路),并根据各种可验证的计算协议代表客户端计算机系统执行智能合约。现在已经设计出这种改进的方案。因此,根据本发明,提供了如所附权利要求书限定的系统和方法。根据本发明,可以提供一种用于区块链网络的节点的计算机实现的方法,该计算机实现的方法包括:基于表示智能合约的算术电路获得符号集;通过至少以下步骤来减少用于存储算术电路的数据量:将符号集的子集映射到编码值的范围,选择该编码值的范围内的编码值,以及在压缩的算术电路中用编码值来表示符号集的第一子集;以及使压缩的算术电路存储在区块链网络的节点上。优选地,压缩的算术电路包括报头,其中,报头对可用于将符号集的集合映射到编码值的不同范围的信息进行编码—例如,第一符号映射到范围[0-0.3),第二符号映射到范围[0.3,0.7),且第三符号映射到范围[0.7,1)。不同范围可以是非重叠范围,使得特定编码值恰好对应于一个符号或符号集。优选地,编码值是二进制小数(binaryfraction),例如大于或等于零且还小于一的二进制值。编码值可以基于由阈值比特数表示的编码值来选择。例如,在范围内的两个不同的二进制小数之间,可以将利用更少的比特表示的二进制小数选择作为编码值。选择编码值可以包括:将符号集的不同子集映射到编码值的范围的子范围;从编码值的范围的子范围内选择编码值;并且其中,符号的第一子集和第二子集两者都由压缩的算术电路中的编码值表示。该方法还可以包括:基于表示智能合约的算术电路来获得符号集;接收串行化输入文件的请求,该输入文件包括表示算术电路的多行码;扫描所述多行码中的至少一部分,并将符号集中的符号添加到数据结构;并且其中,该符号集是从数据结构获得的。该方法还可以包括:将符号集的符号编码为该符号与该符号集的另一符号之间的差。优选地,该算术电路包括运算符和线(wire)标识符,进一步地,其中,该符号集是运算符,并且该线标识符根据算术编码方案被分别编码。该方法还可以包括:通过解析对算术电路进行编码的文件来获得符号集,以获取对运算符集和针对该运算符集的至少一部分的参数集的标识。优选地,编码值的范围对应于子集以某一模式出现的概率。例如,在两个符号集之间,具有较大出现概率的符号集具有相对而言较大的对应的编码值的范围。优选地,该符号集的子集是一个符号。优选地,压缩的算术电路代替算术电路被广播到区块链网络。优选地,接收压缩的算术电路的区块链网络的节点能够从压缩的算术电路确定算术电路。还期望提供一种系统,该系统包括:处理器;以及包括可执行指令的存储器,该可执行指令由于被处理器执行而促使系统执行要求保护的方法中的任一个。还期望提供一种其上存储有可执行指令的非瞬时性计算机可读存储介质,该可执行指令由于被计算机系统的一个或多个处理器执行而促使计算机系统至少执行要求保护的方法中的任一个。附图说明本发明的这些和其他方面将从本文描述的实施例变得显而易见并参考这些实施例而阐明。现在将仅通过示例的方式并参考附图来描述本发明的实施例,附图中:图1示出了在本公开的实施例中的算术电路的串行化和解串行化;图2示出了示意图,该示意图示出了在本公开的实施例中涉及的可验证计算和行动者(actor)的游动图(swimdiagram)的示例;图3示出了根据本公开实施例的从领域专用语言(dsl)码到二次算术程序(qap)的工作流程的示例;图4示出了根据本公开的实施例的对符号序列的算术编码进行可视化的图;图5示出了根据本公开实施例的使用算术编码来压缩算术电路的过程的说明性示例;图6根据至少一个实施例示出了实施例中可以实现对基于算术编码的压缩性质的算术电路的串行化的各种方案的图;图7示出了根据实施例的用于使用缓冲器(buffer)来管理算术电路的串行化的过程的说明性示例;图8示出了根据实施例的可视化符号序列的多符号表示的图,该符号序列利用基于算术电路的字典(dictionary)的性质;图9示出了根据实施例的多符号编码的图;以及图10示出了通过聚合标识符来压缩算术电路从而导致生成了可以被进一步压缩的串行化电路的图。具体实施方式现在我们提供根据一个实施例的如何将本发明付诸实践的说明。本发明可以在分布式计算环境的背景下实现,其中,第一计算实体利用算术电路来生成程序,该程序的执行可以被委托给分布式计算环境的计算实体(例如,区块链网络的节点)。此外,程序的正确执行是计算上可验证的,使得客户端计算实体能够委托至少部分地基于算术电路而生成的程序的执行,该客户端计算实体能够验证该程序由工作者计算实体正确地执行。以此方式,可以实现分布式计算环境的各种效率,包括使得客户端计算实体能够将程序的执行委托给计算机系统并在另一实体的控制下验证程序的执行。如下面更详细描述的,我们描述了一种使用算术编码将算术电路压缩和串行化为数据的二进制流的可能实现。数据的二进制流可以以无损方式被解串行化和解压缩。可以实现串行化电路的各种优点,例如减少电路的数据存储足迹(例如,通过存储串行话电路来代替存储算术电路)。例如,在区块链网络的背景下,算术电路或从该算术电路派生的程序可以至少部分地编码到区块链网络的账本中。通过使用本文描述的技术来减少算术电路的数据存储足迹,可以减少存储到区块链账本的数据量。即使对存储在区块链中的数据的数据存储足迹的减少很小也是值得赞赏的,因为可以通过区块链网络的某些或者甚至所有节点来再造区块链账本。特定的结构或构造块(buildingblock)可以用来促进这种转换。在一个或多个实施例中,该表示可以被视为构建能够提供分布式可验证计算的综合管线的第一步。在该示例中呈现的构造块并不旨在是本发明的实施例处理的所有可能的高级语言构造的详尽列表。此外,可以提供呈现的示例的替代实现。这些落入本领域技术人员的范围中。现在我们提供本发明的说明性实施例。然而,重要的是要注意,这是可以使用本发明的应用的示例。技术人员将理解,可以在其他背景和应用中有利地使用本发明。对于我们的示例,请考虑允许用户使用领域专用语言(dsl)生成应用程序的协议。一旦已经生成了应用程序,就可以将其执行外包给不可信的各方(称为“工作者”或“证明者”),同时可以公开地验证其正确性。该协议利用确保以下各项的加密原语(primitive):·完整性,即如果正确地遵循协议,则诚实的验证者将确信输出的有效性;·稳固性(soundness),即作弊的证明者无法说服诚实的验证者相信输出的真实性;·零知识,即除输出的有效性外,作弊的验证者不会学到任何其他东西。该协议的一些好处可以包括:·防止中间人攻击,因为不需要参与者之间的通信。·由于使用了区块链技术,因此恶意节点很难篡改数据。·避免使用可信第三方,例如可信硬件装置。·合约生效并不意味着码被重新执行。计算不会通过网络中的每个节点来重做(replicate)。相反,诚实执行的证据被存储在公共区块链中,且仅用于验证目的。这样的系统将能够处理对应于各种任务和产品的各种类型的应用程序。由于其去中心化和分散式的性质,(比特币)区块链为解决两个(或更多个)各方之间的协定提供了合适的环境。这样的系统需要在去中心化的加密货币系统中提供并促进可编程性。然而,在本领域中已经认识到智能合约编程是容易出错的过程。参见delmolino,k.,等人(2015),stepbysteptowardscreatingasafesmartcontract:lessonsandinsightsfromacryptocurrencylab,(逐步创建安全智能合约:来自加密货币实验室的经验教训和见解),以及juels,a.,等人(2013),theringofgyges:usingsmartcontractsforcrime(盖吉氏戒指:使用智能合约进行犯罪)。因此,能够使用使应用程序更易于由程序员编写和读取的dsl,从而减少错误、减少编程过程期间的时间、精力、成本和资源将是有利的。理想情况下,非专业程序员在无需实现加密的情况下就可以编写各种类型的应用程序。相反,编译器/解释器将自动将源代码编译为用户和区块链之间的加密协议。这些在本发明解决的技术问题中。图1是可以根据本公开实现的实施例的说明图100。本文描述的技术可以被用于对在计算机程序的执行中使用的算术电路进行串行化和解串行化。根据实施例,算术电路可以被用来构建二次算术问题(qap),该二次算术问题被编译成用于客户端(例如,密钥生成和验证)和证明者(例如,计算和证据生成)的加密例程的集合。客户端和证明者可以以允许客户端有效地验证证明者正确地执行程序的方式利用协议将程序的执行委托给证明者。通过减少与算术电路有关的所需计算资源(例如,硬盘空间),可以利用串行化电路来改善计算机系统的操作。在实施例中,算术电路包括被表示为符号集(例如,算术门和值)的信息,该信息被压缩以产生包括码集的串行化电路,其中该符号集可以以无损的方式从码集导出。压缩电路的传输可以通过使得更多数量的电路能够被传输来改善计算机系统的有效数据传输带宽。例如,如果压缩的电路将算术电路的大小减少50%,则有效数据传输带宽可以被翻倍,因为使用相同的字节数可以传输多达两倍的压缩的算术电路(应该注意,实际数据传输带宽的改善可能不到两倍,因为考虑了诸如可能未被压缩的分组报头等数据开销)。减少算术电路的数据足迹可以减少与算术电路的使用相关联的计算机硬件要求(例如,减少短期存储器(例如,ram)数据存储量)和/或计算机系统利用的数据带宽,该计算机系统使用、存储本文所述的电路或以其他方式与本文所述的电路进行交互。压缩电路的传输可以通过使得更多数量的电路能够被传输来改善计算机系统的有效数据传输带宽。例如,如果压缩的电路将算术电路的大小减少50%,则有效数据传输带宽可以被翻倍,因为使用相同的字节数可以传输多达两倍的压缩的算术电路(应该注意,实际数据传输带宽的改善可能不到两倍,因为考虑了诸如可能未被压缩的分组报头等数据开销)。减少算术电路的数据足迹可以减少与算术电路的使用相关联的计算机硬件要求(例如,减少短期存储器(例如,ram)数据存储量)和/或计算机系统利用的数据带宽,该计算机系统使用、存储本文所述的电路或以其他方式与本文所述的电路进行交互。通常,算术电路包括携带来自字段(field)f的值并连接到逻辑和/或算术门的线。在实施例中,电路可以由数据字段的集合表示,该数据字段的集合包括算术门、输入线和输出线。该电路还可以包括报头,该报头包括诸如版本号、线的总数以及允许根据目标执行环境(例如,处理器架构)来执行优化的位宽(bit-width)nbit的信息。算术电路的压缩可以通过以下方式实现:去除根据其他字段可确定的数据字段、应用熵编码方案、以及其组合。各种类型的简化规则可以用作基于编码算术电路的格式的压缩例程的一部分。例如,可能不需要某些信息,例如针对输入的线标识符、输出门的线标识符、第一门的第一输入以及可以被压缩(例如,未明确编码为串行化电路的一部分)的最后的输出线标识符、或其任何组合。在各种实施例中,将熵编码或编码方案应用于算术电路或其一部分(例如,基于上述简化规则)。可以利用熵编码来产生可变长度码表,以用于源符号的串行化。霍夫曼编码可用于生成码表,在该码表中使用较短的码对出现频率较高的源符号进行编码,且使用较长的码对出现频率较低的源符号进行编码—码的长度可以与源符号或序列出现的频率成反比。使用这些技术,算术电路可以被压缩为就长期数据存储介质(例如,硬盘驱动器)和短期数据存储(例如,随机存取存储器)中的存储而言需要较少计算资源的串行化电路。如上所述,霍夫曼码可以被用来生成码表。霍夫曼码是指可用于实现无损数据压缩的特定类型的最优前缀码。霍夫曼算法的输出可以是可变长度码表(例如,码本),用于对文件中的源符号(例如,字符或命令)进行编码。在实施例中,该算法从估计或测得的来自源符号的每个可能值出现的概率或频率(权重)导出表:与不常见的符号相比,通常使用较少的比特来表示更常见的符号。在实施例中,霍夫曼编码可以被有效地实现为以与输入权重的数量成线性关系的时间来找到码,其中输入权重是按排序的顺序。在单独对符号进行编码的方法之中,此策略可能是最佳的。霍夫曼编码可以使用为每个符号选取表示的特定方法,从而产生前缀码,即,表示某个特定符号的位串绝不是表示任何其他符号的位串的前缀。给定来自字母表(alphabet)a的、尺寸为n并且其权重{p0,p1,…,pn-1}通常与概率成比例的符号集{a0,a1,…,an-1},需要从根部开始的具有最小加权路径长度的树。输出码c(p)={c0,c1,…,cn-1}是具有最小加权路径长度l(c)的二进制码字的元组。如香农的源编码定理所限定的,具有非空概率的每个符号ai的信息内容h(以比特为单位)为h(ai)=log2(1/pi)。熵h(以比特为单位)是跨具有非零概率pi的所有符号ai的每个符号的信息内容的加权总和:熵是最小码字长度的度量,对于具有相关联的权重的给定字母表,这在理论上是可能的。通常,霍夫曼码不必是唯一的:给定概率分布的霍夫曼码的集合是对该概率分布的l(c)进行最小化的码的非空子集。串行化电路可用于以无损方式使用扩展或解压缩例程导出原始算术电路。应注意,在此上下文中,“无损”是指一种类型的压缩算法,其中源数据从压缩的数据中完美地导出。在数字压缩的背景下,无损压缩可以指源比特流的每个比特可以从包括符号集的压缩的数据中导出。相反,有损压缩可以指以下这种压缩算法:在其中压缩的数据无法从压缩的数据中导出源比特流的每个比特—有损压缩的示例是mp3音频编码格式。图2是示出了本公开的实施例中涉及的可验证计算和行动者的游动图200的示例的图。如图2中所示,可验证计算的图200可以包括执行在本公开的实施例中的可验证计算协议中的步骤所涉及的客户端节点240、工作者(例如,证明者)节点250和验证者节点260。在实施例中,客户端节点240、工作者节点250或验证者节点260中的一个或多个是区块链网络中的节点。在实施例中,建立阶段涉及以领域专用语言(dsl)编写合约。可以是客户端节点240的解释器(interpreter)将源代码作为输入,并产生算术电路该算术电路由“线”组成,这些线承载来自字段的值并连接到加法门和乘法门。注意,算术电路本身可以是有向无环图(dag),而不是硬件电路,并且线可以是dag中的边缘。但是,可以想到,算术电路可以被实施在具有导线和逻辑门的物理电路中。在202中,客户端节点240将以通用语言(gpl)编写的计算编译到算术电路中。在该实施例中,客户端节点240将算术电路和输入提供给工作者节点250。本公开的实施例可以从电路生成二次程序q,该二次程序q包括多项式的集合,该多项式的集合提供对原始电路的完整描述。然后,可以生成公共参数以供工作者节点250和验证者节点260在执行和验证二次程序时使用。在204中,工作者节点250在输入上执行电路或二次程序,并声称(claim)输出为在一些实施例中,期望工作者节点250(即,证明者)获得的有效副本(transcript);因此,在206中,工作者节点250对副本进行编码。在某些示例中,的有效副本是对电路线的值的分配,以使分配给输入线的值是的值,中间值对应于中每个门的正确运算,并且分配给(一个或多个)输出线的值是如果声称的输出不正确(即,),则的有效副本不存在。在208中,工作者节点250将输出提供给客户端节点240。在实施例中,使用由客户端节点240或从客户端节点240选择的秘密值s来导出公共评估密钥ek和公共验证密钥vk。在实施例中,工作者节点250使用这些公共密钥来评估对特定输入的计算。在实施例中,输出内部电路线的值和ek用于产生正确性证明(proof-of-correctness)π。证明π可以存储在区块链上并由多方(例如,验证者节点260)验证,而无需工作者节点250分别与多方进行交互。以这种方式,验证者节点260可以使用公共验证密钥vk和证明π来验证210中的支付交易,从而验证合约。可验证的计算是一种允许生成计算证明的技术。在实施例中,客户端利用这种技术来将评估有关输入的函数f外包给另一计算实体(本文中称为工作者)。在某些情况下,客户端在计算上受到限制,因此客户端执行函数的评估是不可行的(例如,使用客户端可用的计算资源进行计算的预期运行时间超过了最大可接受阈值),尽管事实不一定如此,但是通常来讲,客户端可以基于任何适当的准则(例如,计算运行时间、计算成本(例如,分配计算资源以执行函数的评估的财务成本)等等)来委托有关输入的函数f的评估。在实施例中,工作者是任何合适的计算实体,例如本公开的其他地方更详细描述的区块链节点。在实施例中,工作者(例如,区块链节点)评估有关输入的函数f并生成输出y和输出y的正确性的证明π,该证明π可由其他计算实体(例如,如上所述的客户端和/或区块链网络的其他节点)验证。与进行实际计算相比,证明(其也可以称为论据)可以被更快地验证—因此,通过验证证明的正确性而不是重新计算输入上的函数f以确定上述工作者生成的输出的正确性,可以减少计算开销(例如,减少功率开销以及与向计算资源供电和运行计算资源相关联的成本)。在零知识可验证的计算中,工作者向客户端提供鉴证(attestation):该工作者知道具有特定性质的输入。知识的零知识证明的有效变型是zk-snark(简洁的非交互式知识论证)。在实施例中,所有基于配对的zksnark都包括以下过程:工作者使用通用的组运算来计算多个组元素(groupelement),并且验证者使用多个配对乘积等式来检查证明。在实施例中,线性交互式证明在有限字段上起作用,并且工作者的消息和验证者的消息包括、编码、参考或另外包括可用于确定字段元素的矢量的信息。在实施例中,本文描述的系统和方法允许区块链的矿工(例如,节点)执行一次计算(例如,评估有关输入的函数f),并生成可用于验证输出的正确性的证明,其中评估证明的正确性在计算上比评估函数便宜。在这种背景下,运算和任务的成本(即,多昂贵)可以指执行运算或任务的计算复杂性。在实施例中,计算复杂度是指执行排序算法的平均计算成本或最坏情况的计算成本—例如,堆排序算法和快速排序算法二者均具有o(nlogn)的平均计算成本,但是快速排序的最坏情况计算成本为o(n2),而堆排序的最坏情况计算成本为o(nlogn)。在实施例中,与评估证明的正确性相比,评估有关输入的函数f的平均计算成本和/或最坏情况的计算成本更差。因此,本文描述的系统和方法的使用是高度有利的,并且例如可以允许运行更多计算上昂贵的合约,因为这样的合约不会按比例增加验证区块链所需的时间。进一步的优点可以包括减少验证者系统的功率消耗,从而提高验证者计算机系统的效率,并减少在评估证明的正确性时与运行这种验证者计算机系统相关联的能源成本。在实施例中,验证密钥vk或其一部分可以从公共参数以及输入/输出数据中提取,该公共参数是在零知识协议的设置阶段中生成的并与证明π一起使用,该输入/输出数据用来验证工作者提供的所谓的正确性计算的证明。例如,如以上和以下更详细地描述的,允许锁定脚本的系统和方法防止验证密钥vk被更改并检查证明π的有效性,从而允许在交易验证期间在区块链上执行零知识协议。因此,本公开提出了使用区块链脚本(例如,在基于比特币的网络中)来执行验证阶段的系统和方法,该区块链脚本用于存储在计算的验证中使用的元素。图3示出了根据本公开实施例的从领域专用语言(dsl)码到二次算术程序(qap)的工作流程的示例300。具体而言,图3描绘了由转换器304转换为gpl码306的dsl码302。gpl预编译器308(也称为预处理器)合并由gpl码306引用的外部库310,以产生gpl预处理的码312。gpl预处理的码312被转换为算术电路314,该算术电路314被优化以产生简化的算术电路316,该简化的算术电路316被压缩以产生从其导出qap多项式318的串行化电路320。在实施例中,领域专用语言(dsl)码302是用具有精确语义的形式语言编写的应用程序。在实施例中,dsl码302包括条件集合,并且dsl码302的结果取决于该条件集合的履行。应用程序(例如,智能合约)的示例是保险合约,该保险合约以被保险人的保险费和保险人对被保险人的潜在补偿作为输入。如果被保险人在智能合约期内遭受损失(例如,履行第一条件),则智能合约的执行会将保险费分配给保险人,并将针对该损失的赔偿分配给被保险人。另一方面,如果被保险人在智能合约期内没有遭受损失,则智能合约的执行会将保险费分配给保险人,并将潜在的赔偿返还给保险人。在实施例中,转换器304是软件程序,该软件程序由于执行而接收条件的集合(例如,以dsl编写的dsl码302)并将dsl码转换为gpl源代码(例如gpl码306)。在实施例中,gpl码306是gpl程序(例如,c++程序),其包含dsl码302中限定的码。在一些示例中,与dsl相比,通用编程语言或“通用语言”(gpl)广泛适用。通用编程语言的示例包括ada、algol、汇编语言、basic、boo、c、c++、c#、clojure、cobol、crystal、d、dart、elixir、erlang、f#、fortran、go、harbour、haskell、idris、java、javascript、julia、lisp、lua、modula-2、npl、oberon、objective-c、pascal、perl、php、pike、pl/i、python、ring、rpg、ruby、rust、scala、simula、swift和tcl。在本公开的实施例中可能被引用的c++是具有命令式、面向对象的和通用编程特征的通用编程语言,同时还提供了用于低级存储器操纵的设施。应注意,在图3的背景下,“码”基于所描述的上下文可替代地指代可执行码(例如,目标码)、源代码、这二者、这二者任一个或其组合。在实施例中,gpl预编译器308是计算机可执行程序,其处理gpl码306和所需的外部库310以产生独立的gpl预处理的码312。在实施例中,gpl预编译器308评估常数表达式,并且登记在gpl码306中找到的符号。在实施例中,外部库310是由gpl码306通过调用使用的预编写子例程、函数、类、容器(container)、值和/或变量类型的集合。例如,通过调用外部库310,gpl码306获得该库的功能,而不必自己实现功能。在实施例中,gpl预处理的码312包括表达式和运算符的集合。运算符可以包括算术运算符(例如,加法(+)、乘法(*)等)、比较运算符(例如,小于(<)、等于(==)、大于或等于(>=)等)、条件语句(例如,如果-则(?,:))或逻辑运算符(例如,与(&&)、或(||)、非(!)、异或(⊕)等)。在一些实施例中,主函数被产生为具有预定名称和格式。在实施例中,算术电路314是变量集合上的dag。在实施例中,具有为零的入度(in-degree)的dag的每个节点是表示变量(例如,xi)的输入门,并且dag的每个其他节点是加法门(+)或乘法门(×)。在实施例中,每个门(节点)的出度(out-degree)为1,因此基本图(underlyinggraph)是有向树。在实施例中,算术电路314具有两个复杂度的量度:大小和深度。在一些示例中,算术电路的“大小”基于算术电路314内的门的数量。在一些示例中,算术电路的“深度”基于算术电路内的最长有向路径的长度。在实施例中,简化的算术电路316是简化或最小化的有向无环图(dag),其可以用于在给定的输入集合的情况下确定条件集合(例如,在dsl码302中指定的那些)的结果。在一些实施例中,简化的算术电路316是最小化(即,减小到最小程度)的算术电路。在一些实施例中,最优算术电路可能不一定是最小算术电路(例如,取决于电路中算术运算的数量和类型,某些较大的算术电路可以比较大的算术电路更快地被评估),并且在这样的实施例中,简化的算术电路316是优化的(例如,对于最大速度、更少的存储器使用、最有效的处理器利用等),但不一定是最小化的算术电路。可以使用英国专利申请号gb1718505.9中描述的技术来生成简化的算术电路316。诸如简化的算术电路316之类的算术电路可以根据本文所述的技术来压缩,以生成串行化电路320。串行化电路320可以在需要被存储和检索的码模板或标准应用程序的情况下使用。通过利用串行化电路320,各方可以避免在每次创建新应用程序时从gpl创建电路实例的需要,从而提高了协议的效率,在该协议中,客户端和证明者再使用某些码模板或其一部分。可以使用对数据结构中最频繁的元素(例如,算术运算符类型)进行熵编码来生成串行化电路320。用于解串行化和解压缩的指令(例如,用于将串行化的码映射到源符号的码本)可以被嵌入串行化的比特流中,该串行化的比特流使得串行化电路的接收者能够重构源电路。在实施例中,qap多项式318是以数学公式表示的包括变量和系数的一个或多个表达式,该数学公式提供了对原始算术电路(例如,图3的算术电路314)的完整描述。在实施例中,qap多项式的多项式是根据它们在算术电路的根部处的评估来限定的,例如在以下文献中描述的那些:gennaro,r.等人,quadraticspanprogramsandsuccinctnizkswithoutpcps(二次张成程序和没有pcp的简洁nizk)(2013)。在实施例中,qap多项式被编码到区块链交易的锁定脚本中,作为智能合约的表示。在实施例中,锁定脚本在执行时接收参数值的集合(例如,作为执行锁定脚本的结果),这些参数值作为变量被输入到qap多项式中以导致确定智能合约的结果。在实施例中,gpl预编译器308产生gpl预处理的码312,其可以是包括算术门的算术电路。但是,请注意,由于条件和流控制语句的原因,复杂的算术电路也嵌入了逻辑子模块。图4示出了根据本公开的实施例的可视化符号序列的算术编码的图400。在实施例中,可以结合图4所示的图来执行用于生成针对符号序列的算术编码的过程。算术编码是在无损数据压缩中使用的一种类型的熵编码。符号集通常使用每个符号的固定数目的比特表示,如在ascii码中那样,并且经常使用的符号可以用较少的比特存储。与霍夫曼编码不同,算术编码将整个消息编码为任意精度范围[x,y),例如,介于零和一之间的范围(0≤x

相关内容