使用区块链实现逻辑门功能的制作方法

文档序号:17728619发布日期:2019-05-22 02:41阅读:189来源:国知局
本发明主要涉及分布式账本(distributedledger)(区块链)技术,可以是任何与区块链相关的技术,包括(但不限于)比特币区块链。本发明的各方面还涉及逻辑门和组合逻辑领域。本发明可以适用于控制系统或过程。
背景技术
::在本文中,我们使用术语“区块链”来包括所有形式的电子的,基于计算机的分布式账本,包括基于共识的区块链和交易链技术、取得许可和未取得许可的账本、侧链和替代链(altchains)技术、共享账本及其变型。虽然已经提出并开发了其他区块链实施方案,但是区块链技术最广为人知的应用是比特币账本(bitcoinledger)。虽然出于方便和说明的目的,本申请文件可能提到了比特币,但应该指出的是,本发明不限于比特币区块链(bitcoinblockchain)的用途,其他区块链实施方式和协议也落入到本发明的范围内。术语“用户”在本文中可以指人或基于处理器的资源。区块链是一种点对点电子账本,实施为基于计算机的去中心化的分布式系统,由区块组成,而这些区块又由交易组成。每笔交易是一个数据结构,其对区块链系统中参与者之间的数字资产的控制转移进行编码,每笔交易包括至少一个输入和至少一个输出。每个区块包含前一个区块的散列,使得区块链接在一起,从而创建自区块链诞生之始就已写入区块链的所有交易的永久的不可更改的记录。交易包含嵌入其输入和输出中的被称为脚本(script)的小程序,这些小程序指定如何以及由谁来访问交易的输出。在比特币平台上,这些脚本是使用基于堆栈的脚本语言编写的。为了将交易写入区块链,必须对其进行“验证”。网络节点(矿工)执行工作以确保每笔交易都有效,无效交易被网络所拒绝。安装在节点上的软件客户端通过执行锁定和解锁脚本,对未花费的交易(utxo)执行此验证工作。如果锁定和解锁脚本的执行评估为真(true),则交易有效,且将交易写入区块链。因此,解锁脚本可以提供用于评估锁定脚本的输入。虽然这通常采用基于签名的输入的形式,但已知其他形式的输入也是可能的。此外,脚本语言中的许多命令是布尔值(例如op-equal),提供真或假(false)的结果。这使得限制性可以构建到交易中。区块链技术最有名的是其在加密货币(cryptocurrency)上的应用。然而,近年来,数字企业家们已经开始探索使用比特币所基于的加密安全系统和能够存储在区块链上的数据来实现新系统。本发明涉及区块链技术的这样一种新的、创造性的变型。特别地,本发明涉及使用区块链来实现或模拟逻辑门的功能,逻辑门又可以用作简单但有效且强大的机制,用于创建各种各样的计算机实现的系统。这样的系统可以包括用于控制过程和/或引导设备和系统的行为的控制单元。控制单元的基本元件是逻辑门。通过将门逻辑构建为区块链交易(blockchaintransaction,简称txs),可以实现利用区块链技术带来的好处的强大过程。这些好处包括但不限于实现网络安全增强,设备/系统/过程的去中心化控制,与遗留系统的潜在集成,以及记录的不变性/永久性。因此,希望提供一种在区块链上或通过区块链提供或模拟逻辑门功能的解决方案。在这种解决方案中,逻辑门可以通过区块链交易的锁定脚本来实现。可以提供对逻辑门的基本结构的扩展以允许任何数量的输入和任何数量的输出。现在已经设计出这种改进的解决方案。因此,根据本发明,提供了如所附权利要求中所限定的解决方案。技术实现要素:本发明的实施例可以提供计算机实现的方法和相应的系统,可以描述为控制方法/系统。本发明可以提供一种方法,该方法包括提供或使用包括锁定脚本的区块链交易(tx1)的步骤,该锁定脚本在执行时执行代码部分,选择和布置所述代码以实现和/或模拟逻辑门的功能。产生对所述代码部分的输入需要条件,可以在评估所述至少一个条件之后,进行代码部分的执行。对至少一个条件的评估可以生成布尔输入。所述代码部分可以包括一个或多个指令。这些可能是操作码。操作码可以将数据推送到堆栈或从堆栈弹出数据。代码部分可以用于使用一个或多个条件的结果来执行。代码的一部分可以由用户(即,交易的程序员或创建者)专门为了模拟逻辑门的目的来选择。另外(或替代地),该方法可以包括在第一区块链交易中提供锁定脚本的步骤。第一(和/或进一步)交易可以由自动化过程生成,即通过计算机生成而无需人为干预。锁定脚本可以包括至少一个用于处理至少一个布尔输入的指令(即代码部分)。在一个或多个实施例中,可以在锁定脚本中提供至少一个指令作为所述至少一个指令的散列。因此,指令可以是散列形式。至少一个指令可以通过在计算中使用布尔输入或者对其执行一些操作来处理布尔输入。可以通过在执行代码部分之前评估条件来生成布尔输入。该条件可以包括对散列值和预先存储的散列值之间的相等性的测试。可以在锁定脚本内提供预先存储的散列值。或者,可以通过在锁定脚本内提供的一个或多个指令/操作码来实现该条件。该方法可以包括提供具有解锁脚本的进一步区块链交易的步骤。解锁脚本可以包括赎回脚本。可以在锁定脚本内提供至少一个指令作为散列,使得通过解锁(赎回)脚本提供实际指令,其中所提供的指令的散列必须与锁定脚本中的散列匹配,以便花费交易的输出。该方法可以包括处理至少一个输入信号以提供至少一个布尔输入的步骤。可以从任何源接收或导出输入信号。该方法可以包括使用至少一个布尔输入分别执行第一和/或进一步区块链交易的锁定和解锁脚本的步骤。处理至少一个输入信号以提供至少一个布尔输入的步骤可以由进一步区块链交易的解锁脚本执行。另外(或替代地),所述步骤在其被用作解锁脚本的输入之前可以由至少一个计算资源或代理执行。计算资源可以是“在区块之外的(offblock)”资源,即它不是区块链网络的一部分。该方法可以包括将进一步交易和/或第一交易发送到区块链网络以进行验证的步骤。网络可以是比特币网络。该方法可以包括监视或搜索网络区块链以确定进一步交易存在或不存在的步骤。该方法可以包括提供计算资源的步骤,该计算资源用于基于对区块链内的进一步交易的检测来影响设备或过程的行为。该方法可以包括将进一步交易的有效性解释为逻辑门提供的true输出的步骤。有效性可以由控制代理确定,或者通过监视区块链和/或区块链网络来确定。确定进一步交易的有效性可以用作由计算资源/代理执行的动作的触发器。区块链网络内的进一步交易的验证可以取决于解锁脚本的执行。该方法可以包括基于对于区块链内是否存在进一步交易的确定,来控制设备、系统或过程的活动或行为的步骤。这可以是任何类型的设备、系统或技术过程。被控制的设备、系统或过程可以在区块之外(off-block)实现,即可以与区块链网络分开或不同。可以将锁定脚本中的至少一个指令设置为实现逻辑门的真值表。所述门可以是或门、异或门、与非门、或非门、以及非门或同或门。所述门可以是一个与门。所述门可以是蕴涵门(也称为逻辑条件,材料条件或材料含义)。所述门可以是一个逆蕴涵门。该至少一个输入信号可以包括数值、常数值、散列函数的结果、加密密钥、区块链谜题(puzzle)和/或比特币其他区块链相关地址。可以通过在基于计算的资源上执行的自动化过程,来生成第一和/或进一步交易,和/或发送第一和/或进一步交易到区块链网络。该至少一个指令可以包括布尔条件或运算符。它可以使用基于堆栈的编程语言来编写和/或执行。本发明还可以提供一种计算机实现的系统,用于实现上述方法的任何变型。本发明可以提供一种控制系统,该控制系统包含在区块链上或使用区块链实现的布尔计算或条件,该布尔计算包括:包括锁定脚本的区块链交易,该锁定脚本包括至少一个被选择的指令,以便通过处理至少一个布尔输入来提供至少一个布尔输出,从而实现布尔真值表(truthtable)的功能。真值表可以是或门、异或门、与非门、或非门、以及非门或同或门的真值表。所述真值表可以是蕴含门(也称为逻辑条件,材料条件或材料含义)的真值表或逆蕴涵门的真值表。真值表可以是与门的真值表。根据本发明的另一个方面,可以提供一种基本上按照如下所述的“技术3”的计算机实现的控制方法,可以包括以下步骤:在多个第一区块链交易(的每一个)中提供(相应的)锁定脚本,(每个)锁定脚本包括至少一个用于处理至少一个输入信号的指令;提供具有解锁脚本的进一步区块链交易;处理至少一个输入信号以生成至少一个交易输出;使用至少一个交易输出来执行第一和进一步区块链交易的锁定和解锁脚本。可以执行处理至少一个输入信号以生成至少一个交易输出的步骤:i)通过进一步区块链交易的解锁脚本;或ii)通过至少一个计算资源或代理。该方法可以包括以下步骤:将进一步交易和/或第一交易发送到区块链网络以进行验证;和/或监控或搜索区块链或区块链网络以确定是否存在进一步的交易;和/或提供计算资源,用于基于以下内容影响设备或过程的行为:在区块链或区块链网络内对进一步交易的检测;和/或进一步交易的有效性。该方法可以包括以下步骤:将区块链或区块链网络中的进一步交易的检测解释为逻辑门的true输出。在区块链网络内对进一步交易的验证取决于所述解锁脚本的执行。该方法可以包括以下步骤:基于所述进一步交易的有效性来控制设备或过程,其中所述有效性由基于计算机的控制代理确定或建立,或者通过监视所述区块链网络以确定其是否已经由网络节点验证,和/或通过监视所述区块链的状态来确定所述交易是否已写入所述区块链。可以将锁定脚本中的至少一个指令设置为实现与门的真值表。该至少一个输入可以包括数值、常数值、散列函数的结果、加密密钥、区块链谜题(puzzle)和/或比特币其他区块链相关地址。可以通过在基于计算的资源上执行的自动化过程,来生成第一和/或进一步交易,和/或发送第一和/或进一步交易到区块链网络。该至少一个指令可以包括条件或条件运算符;和/或可以使用基于堆栈的编程语言来编写和/或执行。本发明可以提供一种计算机实现的系统,该系统用于实现根据本发明的该方面的任何方法。所描述的与一个方面或实施例相关的任何特征,也可以用于另一方面或实施例。例如,所描述的关于该方法的任何特征可以适用于系统,反之亦然。附图说明参考本文所述的实施例,本发明的这些和其他方面将变得清晰,并得以阐明。现在将仅通过示例并参考附图来描述本发明的实施例,其中:图1示出了根据本发明的实施例的系统及其说明性使用实例;图2示出了图1的控制系统的真值表;图3示出了处理图1的示例的解锁交易的步骤;以及图4到8示出了可用于共享秘密并生成公钥或私钥的技术;图9示出了本发明的说明性实施例的功能,其中在第一交易的锁定脚本内评估两个布尔输入a和b以产生布尔输出x;图10示出了本发明的实施例的概况,包括第一和第二交易;图11示出了根据本发明的实施例的过程;图12示出了根据如下所述的本发明的“技术1”的实施例的概况;图13示出了根据如下所述的本发明的“技术2”的实施例的概况;图14示出了根据如下所述的本发明的“技术3”的实施例的概况;图15提供了根据现有技术如何评估锁定和解锁脚本的图示。具体实施方式本发明提供了一种使用区块链交易的锁定脚本来实现特定真值表的逻辑的机制。如现有技术中已知的,这样的真值表用于实现逻辑门,其中通常基本门具有两个输入a和b以及单个输出x。图9示出了由本发明示例性实施例创建的结构的概况。在本发明中,在交易中评估两个输入a和b以产生输出x。输入值a和b通过区块链交易的解锁脚本提供,该区块链交易试图花费与锁定脚本相关的先前交易的输出,锁定脚本包含逻辑门代码。在一个或多个实施例中,解锁脚本可以包括赎回脚本。因此,需要至少两个交易来实现本发明的任何实施例。第一个交易使用嵌入门逻辑的锁定脚本锁定一定数量的比特币或其他加密货币。第二个交易通过呈现a和b值(可能还有签名)来花费第一个交易的输出。在经典门中,a,b和x是二进制的,取值等于真(1)或假(0)。但是,根据本发明的实施例,将经典门复制和扩展以包括更复杂的变型。特别地,区块链门的输入本身可能不是“真”或“假”输入,而是可以是若干不同的值、格式或值类型中的任何一种。例如,a和b可以是整数、散列值、加密密钥、btc地址(等),并且可以在交易内评估a和b的真值以产生输出。在交易可能有效(“真”)或无效(“假”)的意义上,输出必须是二进制的。但是,输出可以用于几个更复杂的功能中的任何一个。例如,它可能代表满足一系列条件的重要支付的临时支付,或者它可能是一项微不足道的支付,但仍然可以作为事件的安全永久记录。以下提供区块链门的可变使用的进一步示例。存在许多不同类型的逻辑门,所有这些都属于本发明的范围。一般而言,有几个基本的2输入门足以构成任何电路,排序不分先后:另一个常用的门是非门(notgate),它只有一个输入;它的输出是输入的相反值。门通常以“真值表”的形式呈现,提供输入值的每种可能的组合以及相关的输出值。例如,表1显示了与门(andgate)和非门。表1:与门和非门的真值表所有八个基本双输入门如表2所示。表2:8个双输入门abandorxornandnorxnorimpn-imp00000111tf10011100ft01011100tf11110001tf实际上,在给定两个二进制输入的情况下,有16种可能的不同方式来绘制输出列,根据所需应用,其中多种方式被证明是有用的。这些中的每一个都可以创建为单个门。因此,在通过单个区块链脚本(例如如下“技术1”)实现真值表的情况下,16种可能性中的任何一种都可以在交易锁定脚本内编码。当然,一些可能性可能很少或不具有现实生活应用。为了完整性的目的,前6个门的16种可能性如表3所示。表3:每个可能的双输入,单输出‘门’abandxorornorxnornand000000000011111111100000111100001111010011001100110011110101010101010101如前文所述,本发明提出了一种解决方案,其中创建区块链交易以实现逻辑门的至少部分功能。此门功能在交易的锁定脚本中进行模拟。为方便起见,这种锁定脚本在本文中可称为“区块链门”或“比特币门”。虽然可以使用替代的区块链协议和平台,同样为了方便起见,可以在示例中引用比特币。应注意,根据已知技术,可以设置区块链交易利用n/m个多重签名(multisig)选项。实际上,就交易所需的签名数量而言,这表现为逻辑门。在n=m的情况下,多重签名操作表现为逻辑与门。但是,这是逻辑门的有限实现,因为它仅涉及或仅受输入内提供的签名数量的影响,并且不允许将区块链实现的逻辑门评估为任何其他类型的输入。另一方面,本发明允许门功能在更宽的一组参数化输入上操作。根据本发明的各个实施例,第一区块链交易(tx1)的锁定脚本用于提供所选逻辑门的功能。也就是说,在第一交易中提供的锁定脚本包含一些代码,这些代码在被执行时将使用所呈现的输入值来根据特定逻辑门的真值表提供输出。因此,选择和安排锁定脚本内的指令,以便实现所需门的真值表。锁定脚本与第一个交易的输出(txo)相关联。然后生成第二交易(tx2)。第二交易包括输入,该输入包括解锁脚本或与解锁脚本相关。解锁脚本可用于解锁第一交易的锁定脚本以便花费输出(txo)。验证导致执行第一个和第二个交易的锁定和解锁脚本。因此,将使用a和b的具体值。如现有技术中已知的,参见图15,说明了如何在交易验证期间评估锁定和解锁脚本。如果执行锁定和解锁脚本得出有效交易,则交易的有效性可以解释为逻辑门的true输出。相反,如果交易验证失败,则可以将其解释为逻辑门的false输出。这是对现有技术的增强,因为根据已知的区块链技术,失败的脚本即是这样。然而,根据本发明,失败的脚本(即不成功的验证)使得能够检测到“错误”输入并随后响应“错误”输入。因此,本发明能够推导和启动有意义的后续行为,而不管输入是真还是假,因为一些动作过程取决于区块链门的输出,无论输出具体是什么。交易的有效性可以通过以下方式确定:·通过计算代理·通过区块链网络上的一个或多个节点·通过检测区块链上的区块内的交易。如上所述,当第二交易被呈现给(比特币)网络以便尝试花费来自第一交易的输出时,挖掘节点将执行其验证任务。如果交易有效,可以将其写入区块链,否则交易将被拒绝。因此,计算代理可以监视区块链的状态以确定该交易是否已经成功发送到分类账。如果在区块链中检测到该交易,则一定表示交易有效,这可以由计算代理解释为逻辑门的true输出。有效性或无效性的确定可以作为执行某些动作的触发因素。该动作可以由代理执行,可以控制或影响设备、系统或过程的行为。如图12、13和14所示,可以将第一交易(tx1)称为“启动逻辑门”,因为它定义了要被模拟的门的功能。可以将第二交易(tx2)称为“评估逻辑门”,因为它通过解锁脚本提供将用于评估门输出的值。存在用于实现上述内容的各种技术,如下所述并参考图10至14。技术1图12中提供了技术1的概况。关键定义属性:·将输入信号a和b提供给单个交易(tx2)的交易输入的解锁脚本;·a和b是“(比特币)谜题”,可能附有一个或多个签名;·tx2的解锁脚本用于尝试使用先前交易tx1的输出;这导致分别执行tx2和tx1的解锁和锁定脚本;·在tx2的解锁脚本中处理a和b以评估为真/假;·然后使用那些处理的值执行相关逻辑,即所选门的代码(在tx1的锁定脚本中提供);·脚本评估然后执行其他逻辑和指令,例如多重签名;注意,如本领域中已知的,多重签名操作与所选逻辑门的代码的执行不同,并且多重签名操作在执行所选逻辑门的代码之后执行。每个谜题代表一个真或假的条件,并在执行锁定脚本期间通过以下方式进行评估:·首先通过解锁脚本向锁定脚本提供解决方案,即谜题的值;·锁定脚本对提供的值进行散列,然后将其与内部存储的散列值进行比较(“内部存储”意味着散列已作为锁定脚本的一部分写入)。所提供的值的散列与存储的散列相等意味着“真”,而不相等意味着“假”;因此,对于每个谜题,散列的比较提供了中间结果;·然后将两个评估条件的中间结果应用于锁定脚本内提供的相关门逻辑代码,以提供表示逻辑门的输出x的最终结果。如果最终结果为真,则使用多重签名操作验证所附签名。tx1的锁定脚本可以是比特币协议中已知的p2sh锁定脚本,或者来自备选协议的功能等效项。根据已知技术,p2sh锁定脚本包括赎回脚本的散列,并且tx1输出只能在呈现正确脚本时花费,该正确脚本在散列时与存储在锁定脚本中的散列匹配。因此,关于支付脚本散列交易,尽管锁定脚本“知道”随后将提供的逻辑,实际逻辑在解锁脚本内提供。如本领域技术人员将理解的,虽然必须知道锁定脚本在这种交易中的行为,但是使用加密安全技术,可以提供实际指令集作为解锁脚本的一部分。这种方法的一个优点是无法辨别赎回脚本的内容或存储的散列,因为在实践中,解决方案通过赎回脚本提供为初始散列,然后在执行锁定脚本期间再次进行散列处理,以便进行比较。因此,可以增强或维护隐私和安全性。在另一个变型中,a和b值可能不会被散列,并且不是测试散列之间的相等性,而是应用另一个测试来导出真和假。例如,a可能是当前道琼斯指数,脚本可能会测试a>(某个预定阈值)。这种方法不会使用p2sh交易类型来比较散列值来得到a和b的中间结果,而是使用锁定脚本中的“条件评估代码”来评估某些其他类型的预定条件。通过这种方式,可以测试许多不同类型的条件的真/假。然后,可以将来自条件评估代码的中间结果传递到锁定脚本的门逻辑部分,最后传递给签名验证。签名验证过程根据本领域的已知技术执行。应当注意,在这种特定情况下,由于a和b的值没有被散列,如果要求保持被测试的条件保密,则该方法不合适。技术2图13中提供了技术2的概况。关键定义属性:·输入a和b包含在解锁脚本中,并(例如,由控制代理)提供给单个交易输入的锁定脚本;·a和b为“真”或“假”,可能附有签名;·a和b代表的条件在交易之外由专用的、基于计算机的代理预先评估,以导出真/假值,然后安全地传输到控制代理;·控制代理创建进一步交易,其中包括解锁脚本,向锁定脚本提供a和b值(以及签名)。因此,技术2与技术1相同,不同的只是其在将条件提供给解锁脚本之前通过计算代理来评估条件。与技术1一样,在第一交易的锁定脚本中提供模拟逻辑门功能的代码,并且在验证期间通过进一步交易的解锁脚本提供输入的实际值。技术3图14中提供了技术3的概况。关键定义属性:·将a和b(为同一个交易)提供给两个独立的交易输入的锁定脚本;·a和b是“(比特币)谜题”,可能附有签名;·使用sighash标志的相关组合(例如anyonecanpay),两个独立的代理分别将a和b提供给交易模板(最终由控制代理完成);·在每个锁定脚本中,a和b被评估为真/假,然后锁定脚本执行相关的门逻辑;·然后,每个脚本执行其他逻辑,例如根据现有技术的签名检查。要使整个交易有效,每个输入必须有效,这就实现了and真值表。相同的技术可用于任何数量的输入,即,不是评估两个条件a和b,而是可以将任何数量的条件a,bc......设置为创建交易的要求。模板交易在一个或多个实施例中,可以提供交易模板,将其复制然后用a和b输入填充,以创建可以广播到区块链网络的交易。如果广播交易被网络接受为有效,则可以将其解释为如上所述的“真”输出,但也用于在区块链上提供永久的、不可改变的记录。a和b通常表示可以评估为真或假的条件。可以评估任何类型的条件,并且可以使用任何类型的数据来评估条件。例如,条件可能涉及现实世界中的事件、信号的接收或缺失、计算的成功完成、两个或多个数据项之间的匹配或电子实体等。尽管这个清单是无限的,但以下代表了可以对其进行测试的不同类型条件的非常小的指示性样本。在区块链门中使用的可以测试真/假的示例条件:1.现在的日期是2025年6月30日;2.已达到第1,000,000比特币区块;3.一个实体发送了一个编码信号(例如鲍勃(bob)刚刚说“go!”来花费交易);4.位置x的温度低于y℃;5.道琼斯指数目前在20,000以上;6.可识别为juanitashalalamorgensen-smythe的人刚刚结婚;7.(等)区块链门可以由任何实体创建。但是,优选实施例是设置一个或多个自动软件代理以执行与区块链门的创建、维护和传输相关的功能。术语“自动化”可以理解为完全通过程序的执行来执行,而无需人工干预来完成任务。在一个优选的实施方案中,这些代理能够执行多种功能,其中下文仅列出了一个例子。可以由代理执行的与区块链门相关的示例函数1.一旦检测到“触发”,则监控现实世界中的事件并根据设定的规则执行某些操作;2.一旦检测到“触发”,则监视区块链中的触发器并根据设定的规则执行某些操作;3.获取交易模板的副本,并根据设定的规则使用输入和/或输出对其进行填充,并将交易广播到区块链网络。4.触发时执行其他类型的操作,例如向感兴趣的各方发送警报,或与其他代理通信以发送或接收数据等。在区块链交易中实现逻辑门有许多潜在的应用或终端用途。如何创建和部署门或门的组合以实现应用的细节超出了本文的范围。然而,本发明可以用于例如电子设备的控制。其可能包括iot(物联网)设备,例如:报警系统、车辆解锁系统、家电开关、无线传感器网络、scada系统(安全地)、工厂控制、逆变器、交易锁定系统、基于时间的保险箱、灌溉系统,(等等)。其还可以用于开发自动支付系统和计算。例如:a.如果按时收到付款,则发送到输出1,否则发送到输出2并分别计算金额和利息;b.anyonecanpay区块链交易随着时间的推移而增加或减少.区块链交易中使用的“门”的一些可能的变型1.a和b可以是二进制的(如在经典的门中)。在交易是“真”(有效)或“假”(无效)的意义上,x可以是二进制的;2.a和b可以是加密签名;3.a和b可以是任何数字,代表有意义的值,例如可以是日期;4.a和b可以是有意义值的散列;5.a和b可以是比特币意义上的“谜题”(特定散列的解决方案);6.a和b可以是上述两项或多项的组合(例如,签名+谜题);7.a和b可以是不同的类型的(例如,a=签名+有意义的值;b=谜题)8.可能有多个输入,a,b,c,......9.x=真(有效)可能意味着给第三方支付了一些比特币。例如,当满足由a和b代表的某些条件时,然后门逻辑将比特币支付给受益人;10.x=真(有效)可能意味着输出的比特币只是返回给付款人,而交易的目的与付款无关(示例如下);11.x=真(有效)可能意味着触发事件(例如,可能会触发监视代理以执行设定的操作,例如控制iot设备);12.x=真(有效)可能意味着注册事件,也就是说,交易的目的是充当事件的安全的、不可更改的、永久的记录;13.可以有多个输出,x,y,....这可能意味着给几个受益人支付了比特币,或者设置了几个触发器,或者是其组合。14.可以存在单个交易,其本身实现了一个门;其在锁定脚本中完成。本发明的实施例在该说明性示例中,我们使用上述技术1来实现在设备控制应用中使用的异或门的功能。区块链iot设备(blockchainiotdevice,简称bid)是被设置为执行预定指令的计算代理,该预定指令安全地存储在bid之外(off-bid),并且通过加密密钥被访问。“off-bid”是指指令不在bid本身提供,而是存储在别处,并在需要时被访问。选择和设置这些指令以执行一个所选的任务或多个任务。执行时,指令可以控制和影响iot设备的行为。bid驻留在iot本身上,这意味着bid安装在iot设备之中或之上的存储器中。然而,在其他实施例中,bid可以驻留在设备之外并且具有连接到设备的互联网连接。iot设备有自己的加密密钥(以及ip地址),因此它可以安全地与其他设备或dht等进行通信和交互。其“操作系统”是一个简单的通用系统,具有一些嵌入式功能,(至少,但不限于)用于:·加密计算;·从外部源(例如dht)获取指令;·执行简单的操作,例如切换开关(即在实体的iot设备上)。因此,iot设备及其相关的bid都不包含它们自己的内置指令,也不“知道”其自身的用途或使用方式。bid仅包含用于从其他地方安全地获取指令的机制。bid只能执行一些简单的操作(以下仅是说明性的而非限制性的):·访问自身的主私钥和公钥对;其也有自身的(可导出的)btc地址;·将数据发送到ip地址或从ip地址接收数据的能力;·秘密共享协议计算(如下所述)——在优选实施例中,这些可以嵌入到机器代码中;·查找并解释区块链事件·操作并控制其所连接的实体设备(通过标准api,基本上只是一组开关)bid的传入和传出通信使用如下所述的安全机制加密,其使得能够使用共享的秘密创建密钥。这就允许:(i)更高的安全性,从而避免“黑客攻击”;(ii)简单的通用软件升级协议(iii)设备不可知论因此,本发明的此实施例提供了一种可用于任何iot设备的通用操作系统。设备本身未被编程——所有程序单独存储并在设置时(或者,在一些实施例中,在执行时)加载到设备中。现在参看图1,系统100包括第一和第二客户端设备(分别被枚举标记为102a和102b),以及bid控制系统104。bid控制系统104用于接收来自第一客户端设备102a和第二客户端设备102b的输入,并将信息发送到第一客户端设备102a和第二客户端设备102b。在该示例用例中,第一和第二客户端设备102a,102b是可由bid控制系统104检测的射频识别设备(rfids-radiofrequencyidentificationdevices)。控制系统104可运行以使用区块链并且可运行以将输出发送到区块链。我们将使用卡罗尔(carol)的两只名为阿基米德(archimedes)(a)和伯特兰(bertrand)(b)的狗作为例子来描述控制系统104如何工作。阿基米德和伯特兰一整天都待在后院,后院只有它们两个。只要不一起吃饭,它们就彼此友好。只要一起吃饭,它们就会由于某种原因而变得好斗甚至打起架来。a和b都佩戴有识别rfid项圈,即第一rfid项圈102a和第二rfid项圈102b,可由物联网(iot)设备101检测。该iot设备是自动喂食器,其分配定量食物供其中一只狗食用,即bid控制系统104控制iot供给装置的操作。在该示例中,bid104是提供于iot自动喂食器上的软件资源或元件,并且与喂食器交互以控制其功能。bid从dht下载并安装其指令,从而开始工作。在这些指令修改之前,不需要再次执行此操作。例如,可能是当需要升级bid或者要完全修改bid的行为时,可以修改其指令集以检测三个或更多个rfid信号。控制代理使用由bid传输的值来创建区块链交易,并且还在每次迭代之后与bid共享新的秘密,如下所述。使用区块链交易来实现bid控制系统104的功能,该区块链交易使用锁定脚本锁定:op_hash160<unlockingscripthash>op_equal创建交易以(通过链接到分布式散列表(dht)的元数据)提供指令集来控制iot自动喂食器设备,可以包括根据下面描述的内容建立的至计算资源的指令。元数据可以包括指向可访问指令的位置的指针或引用,而不是存储指令在交易本身。因此,指令可以保持在“区块外(off-block)”。区块链不仅提供用于控制活动的机制,还记录已发生的事件的信息。例如,区块链提供了以下功能:计算喂食次数,记录喂食时间、哪只狗吃的,以及判断是否已分配最大食物配给等。区块链还提供加密安全性。交易的一个重要功能是确保只有当一只狗出现在喂食器前的同时才分配食物。因此,需要在交易的脚本中构建一些条件,这是通过xor功能实现的,如图2所示的真值表:·如果a和b都没有在喂食器前,则不分配食物;·如果a在喂食器前而b不在,则分配食物;·如果b在喂食器前而a不在,则分配食物;·如果a和b都在喂食器前,则不分配食物。当a或b在喂食器前时,rfid信号从各自的客户端设备——即第一rfid项圈102a或第二rfid项圈102b,发送到自动喂食器的控制系统104,以解锁狗的安全当前谜题(puzzle)解决方案(在每次迭代后,其被新的谜题解决方案安全替换)。如果a或b不在喂食器前,则从各自的rfid项圈传输随机数到喂食器。也就是说,一只狗“在喂食器前”意味着它的rfid项圈位于喂食器的可检测范围内。如果是这种情况,则解锁相关谜题以进行传输。如果不是这样,则默认为随机数。本领域已知,因此,谜题解决方案是这样一种数据:当对该数据进行散列时,会产生一个值,当该值与(比特币)脚本中的存储值进行比较时提供匹配。也就是说,该过程是:将秘密值(“解决方案”)进行散列并存储在锁定脚本中以供稍后比较。为了解锁脚本,将秘密呈现给锁定脚本,锁定脚本首先对所呈现的值进行散列,然后将该值与其所存储的散列进行比较。如果比较确定二者相等,则比较结果为“true”。在实践中,存储的值是秘密的双散列(double-hash),而呈现的值是秘密的单散列(single-hash)。对于脚本的输入,这使得任何长度的秘密都会减少到标准的可管理大小(即总是160位长)。自动喂食器bid执行其指令,使用与bid的密钥/对相关的查找关键字从dht获取指令。控制代理管理流向/来自bid的数据(即,与rfid信号有关、与bid的指令集无关的数据)。因此,自动喂食器bid监视其自身状态。它存储从单独的控制代理103接收的两个秘密值(s1和s2)。控制代理103可以是适当编程的计算资源,用于监视喂食过程。当在范围内检测到狗的rfid项圈时,有条件地使用秘密值s1和s2。基于从合适的dht获取到的指令,当检测到在范围内(以及其它条件,涉及一天中时间、之前喂过的次数、其它限制条件等等)的rfid时,控制代理103向通用代理(genericagent)发送信号作为其控制代理(见下文)。所述信号包括:·如果检测到阿基米德的rfid,则s1(=puzzle-a-solution),否则为随机数;·如果检测到伯特兰的rfid,则s2(=puzzle-b-solution),否则为随机数;然后自动喂食器bid:·自动喂食器检查交易的有效性,或者在一些实施例中可能会检查网络上的有效交易(交易可能已经或可能还没有公布在区块上,但在任何条件下都必须是有效的交易)。此交易由控制代理创建和广播。如果嵌入的xor测试已通过,则交易有效。如果未通过,则交易是无效的,并且不会传播到区块链网络上的第一“中继段(hop)”之外。因此,bid不会检测到它。或者,如果bid在第一中继段中并因此检测到交易,则bid的部分功能(与任何其他节点一样)是验证交易。因此,bid在进行后续动作之前能够检测出交易是否有效。因此,有效交易也保证了已将所需信息——即关于喂食事件的信息,存储并记录在区块链上。·如果上面的回答为真(true),则bid执行其条件指令——在这种情况下,它会分配一些食物;·bid从控制代理103接收传输,使其能够共享两个秘密(根据下文,为s1和s2),并在内部更新这些秘密值,为下一步的迭代做准备。比特币交易的锁定脚本以下式表示:op_hash160<puzzle-a>op_equalop_swapop_hash160<puzzle-b>op_equalop_numequalop_notop_verifyop_1metadata1pubk-carolop_2op_checkmultsig其中:puzzle-a是op_hash160(puzzle-a-solution)的等效结果;puzzle-b是op_hash160(puzzle-b-solution)的等效结果;metadata1(元数据1)包含对存储在dht中的编码指令的引用;pubk-carol是卡罗尔的公钥。注意,代理的程式编写可以是硬编码的,或者也可以从dht获取其自己的指令。按照下文列出的过程来存储和访问编码指令,用于使用元数据引用来自区块链交易的合约。可以使用下文列出的过程安全保存或重新创建卡罗尔的公钥。为了解锁上文示出的说明性区块链交易,将需要以下脚本:sig-carolpuzzle-b-solutionpuzzle-a-solution<unlockingscript>我们参考图3来说明以下步骤。控制系统104可运行以对所呈现的谜题-a解决方案进行散列,并将其与在步骤s300中从存储器获取的谜题-a的存储版本(存储版本是解决方案的散列)进行比较。谜题-a的存储版本可以存储在控制系统104的本地存储中或任何其他合适的存储介质中。如果二者相同,则堆栈顶部=1,而如果二者不同,则堆栈顶部=0。然后,在步骤s302中,将堆栈顶部与堆栈上的第二项进行调换,该第二项是puzzle-b解决方案。对puzzle-b解决方案进行散列,并将其与从存储器获取的谜题-b的存储版本进行比较,并再次以与s300相似的方法将1或0推送到堆栈的顶部。谜题-b的存储版本可以存储在控制系统104的本地存储中或任何其他合适的存储介质上。此时,顶部两个堆栈项为0或1。在步骤s304中,如果数字相等则op_numequal返回1,否则返回0,这与xor真值表完全相反。在步骤s306中,op_not翻转堆栈的顶部项以产生所需的xor结果。在步骤s308中,op_verify检查堆栈的顶部项是否为1,如果不是——即如果xor操作失败,则立即将交易标记为无效,因为来自第一和第二客户端设备的不止一个输入返回了匹配的puzzle解决方案。其结果是由于iot分配器前的狗多于一只,没有食物被iot分配器分配。也就是说,控制系统104的输出由底层比特币交易的执行来控制。如果op_verify返回1,则控制系统104中的处理返回到脚本的多签名(multi-sig)部分。其中在步骤s310对卡罗尔的签名的存在进行检验。在解锁脚本分析中由控制系统104执行的堆栈操作如下所示。首先,控制系统104对解锁脚本进行散列,以使用op_equal将散列与解锁脚本的散列进行比较。接下来,执行解锁脚本。使用共享秘密创建密钥可以安全地保存或重新创建密钥。具体地,在私钥可以用于导出公钥的情况下,私钥可以分成部分存储。用户——也就是爱丽丝(alice)或鲍勃(bob)可以保存他们的私钥的一部分,服务提供商可以保存第二部分,而第三部分可以保存在远程安全站点中。可以使用三个部分中的任何两个来重构私钥,或者更概括地,可以使用n个部分中的任意m个部分来重构私钥。如果私钥可以重构,那么私钥可以用于在使用时重新创建公钥,然后私钥和公钥可以在使用后再次丢弃。可以使用夏米尔秘密共享方案(shamir’ssecretsharingscheme)来达到拆分私钥的目的。可以使用以下方法从主密钥确定性地导出私钥-公钥对。该方法使得参与者可以共享秘密值而无需传输它们。系统可以使用子密钥生成方法为参与者生成公钥。如下所述:图4示出了系统1,其包括通过通信网络5与第二节点7通信的第一节点3。第一节点3具有相关的第一处理设备23,第二节点5具有相关的第二处理设备27。第一和第二节点3,7可以包括电子设备,例如计算机,电话,平板计算机,移动通信设备,计算机服务器等。在一个示例中,第一节点3可以是客户端(用户)设备,第二节点7可以是服务器。服务器可以是数字钱包提供商的服务器。第一节点3与具有第一节点主私钥(v1c)和第一节点主公钥(p1c)的第一非对称密码对相关。第二节点(7)与具有第二节点主私钥(v1s)和第二节点主公钥(p1s)的第二非对称密码对相关。换句话说,第一和第二节点各自拥有相应的公钥-私钥对。可以在注册过程期间,生成第一和第二非对称密码对,分别用于第一和第二节点3、7,例如钱包的注册。每个节点的公钥可以公开共享,例如通过通信网络5共享。为了在第一节点3和第二节点7处确定共同秘密(cs),节点3、7各自执行相应方法300、400的步骤,而不通过通信网络5沟通私钥。由第一节点3执行的方法300包括步骤330,至少基于第一节点主私钥(v1c)和生成器值(gv)确定第一节点第二私钥(v2c)。生成器值可以基于在第一和第二节点之间共享的消息(m),其可以包括通过通信网络5共享该消息,对此,下文将进一步详述。方法300还包括步骤370,至少基于第二节点主公钥(p1s)和生成器值(gv)确定第二节点第二公钥(p2s)。方法300包括步骤380,基于第一节点第二私钥(v2c)和第二节点第二公钥(p2s)确定共同秘密(cs)。重要的是,同样的共同秘密(cs)也可以通过方法400在第二节点7上确定。方法400包括步骤430,基于第一节点主公钥(p1c)和生成器值(gv)确定第一节点第二公钥(p2c)。方法400还包括步骤470,基于第二节点主私钥(v1s)和生成器值(gv)确定第二节点第二私钥(v2s)。方法400包括步骤480,基于第二节点第二私钥(v2s)和第一节点第二公钥(p2c)确定共同秘密(cs)。通信网络5可能包括局域网、广域网、蜂窝网络、无线通信网络、互联网等等。在这些网络中,数据可以通过通信媒介传送,如电线、光纤、无线传输,数据容易被窃听,比如被窃听者11窃听。方法300、400允许第一节点3和第二节点7均独立地确定共同秘密,而无需通过通信网络5传输共同秘密。因此,一个优点是可以由每个节点安全且独立地确定共同秘密(cs),而不必通过可能不安全的通信网络5发送私钥。继而,共同秘密可以用作秘密密钥(或者作为秘密密钥的基础)。方法300、400可以包括附加步骤。参见图8。方法300可以包括:在第一节点3处,基于消息(m)和第一节点第二私钥(v2c)生成签名消息(sm1)。方法300还包括步骤360,通过通信网络,将第一签名消息(sm1)发送到第二节点7。接着,在步骤440中,第二节点7可以接收第一签名消息(sm1)。方法400还包括以下步骤:步骤450,用第一节点第二公钥(p2c)验证第一签名消息(sm1),以及步骤460,基于验证第一签名消息(sm1)的结果认证第一节点3。有利地,这允许第二节点7认证所声称的第一节点(其中生成第一签名消息)是第一节点3。这基于以下假设:仅第一节点3可以访问第一节点主私钥(v1c),因此只有第一节点3可以确定用于生成第一签名消息(sm1)的第一节点第二私钥(v2c)。应当理解的是,类似地,可以在第二节点7处生成第二签名消息(sm2)并将其发送到第一节点3,使得第一节点3可以认证第二节点7,例如在点对点(peer-to-peer)情境中。可以以各种方式实现在第一和第二节点之间共享消息(m)。在一个示例中,可以在第一节点3处生成消息,然后将其通过通信网络5发送给第二节点7。或者,可以在第二节点7处生成消息,然后将其通过通信网络5发送给第二节点7。在一些示例中,消息(m)可以是公开的,因此可以通过不安全的网络5发送。一个或多个消息(m)可以存储在数据存储器13、17、19中。本领域技术人员将认识到,可以以各种方式实现消息的共享。有利地,可以保持允许重新创建共同秘密(cs)的记录,而记录本身不必私下存储或安全传输。注册方法100、200参考图6描述注册方法100、200的示例,其中方法100由第一节点3执行,方法200由第二节点7执行。这包括为相应的第一和第二节点3、7建立第一和第二非对称密码对。非对称密码对包括相关的私钥和公钥,例如在公钥加密中使用的密钥。在该示例中,使用椭圆曲线密码系统(ecc)和椭圆曲线运算的属性生成非对称密码对。在方法100、200中,这包括步骤110、210,第一和第二节点就共同ecc系统达成一致并使用基点(g)。(注意:基点可以称为共同生成器,但术语“基点”用于避免与生成器值gv混淆)。在一个示例中,共同ecc系统可以基于secp256k1,secp256k1是比特币使用的ecc系统。可以选择、随机生成、或分配基点(g)。至于第一节点3,方法100包括步骤110,选定共同ecc系统和基点(g)。这可以包括从第二节点7或第三节点9接收共同ecc系统和基点。或者,用户接口15可以与第一节点3相关联,由此用户可以选择性地提供共同ecc系统和/或基点(g)。在另一可选方案中,共同ecc系统和/或基点(g)中的一个或他们一起可以由第一节点3随机选择。通过通信网络5,第一节点3可以发送通知给第二节点7,指示所使用的共同ecc系统和基点(g)。而在步骤210中,第二节点7可以通过发送确认,该通知指示认可使用共同ecc系统和基点(g)。方法100还包括步骤120,第一节点3生成第一非对称密码对,其包括第一节点主私钥(v1c)和第一节点主公钥(p1c)。这包括,至少部分地基于允许范围内的随机整数来生成第一节点主私钥(v1c),在共同ecc系统中规定了该允许范围。还包括基于第一节点主私钥(p1c)和基点(g)进行椭圆曲线点乘(ellipticcurvepointmultiplication),来确定第一节点主公钥(p1c),根据如下公式:p1c=v1cxg(公式1)因此,第一非对称密码对包括:v1c:由第一节点保密的第一节点主私钥。p1c:被公知的第一节点主公钥。第一节点3可以将第一节点主私钥(v1c)和第一节点主公钥(p1c)存储在与第一节点3相关的第一数据存储器13中。为了安全起见,第一节点主私钥(v1c)可以存储在第一数据存储器13的安全部分中,以确保密钥保持私密。方法100还包括步骤130,通过通信网络5,将第一节点主公钥(p1c)发送到第二节点7,如图6所示。在步骤220中,第二节点7接收第一节点主公钥(p1c)。在步骤230中,第二节点7将第一节点主公钥(p1c)存储在与第二节点7相关的第二数据存储器17中。类似于第一节点3,第二节点7的方法200包括步骤240,生成第二非对称密码对,第二非对称密码对包括第二节点主私钥(v1s)和第二节点主公钥(p1s)。第二节点主私钥(v1s)也是允许范围内的随机整数。而第二个节点主公钥(p1s)由以下公式确定:p1s=v1sxg(公式2)因此,第二非对称密码对包括:v1s:由第二节点保密的第二节点主私钥。p1s:被公知的第二节点主公钥。第二节点7可以将第二非对称密码对存储在第二数据存储器17中。方法200还包括步骤250,将第二节点主公钥(p1s)发送到第一节点3。而在步骤140和150中,第一节点3可以接收并存储第二节点主公钥(p1s)。应当理解的是,在一些替代方案中,可以在诸如可信的第三方等与第三节点9相关的第三数据存储19处,接收和存储相应的公共主密钥。这可能包括充当公共目录的第三方,例如证书颁发机构。因此,在一些示例中,只有在确定需要共同秘密(cs)时,才可由第二节点7请求和接收第一节点主公钥(p1c)(反之亦然)。注册步骤可能只需要作为初始设置进行一次。会话发起并由第一节点3确定共同秘密现在将参考图7说明确定共同秘密(cs)的示例。共同秘密(cs)可以用于第一节点3和第二节点7之间的特定会话、时间、交易或其他目的。人们可能不希望使用相同的共同秘密(cs),或者说这样做不安全。因此,可以在不同的会话、时间、交易等之间更换共同秘密(cs)。提供以下内容用以说明上述安全传输技术。生成消息(m)310在该示例中,由第一节点3执行的方法300包括步骤310,生成消息(m)。消息(m)可以是随机的、伪随机的或用户定义的。在一个示例中,消息(m)基于unix系统时间(unixtime)和随机数(nonce)(和任意值)。例如,消息(m)可以为:消息(m)=unixtime+nonce(公式3)在一些示例中,消息(m)是任意的。然而,应当理解,消息(m)可以具有在某些应用中可能有用的选择性值(例如unix系统时间等)。方法300包括步骤315,通过通信网络5将消息(m)发送到第二节点7。消息(m)可以在不安全的网络上发送,因为消息(m)不包含关于私钥的信息。确定生成器值(gv)320方法300还包括步骤320,基于消息(m)确定生成器值(gv)。在这个例子中,这包括确定消息的加密散列。加密散列算法的一个示例包括sha-256,以创建一个256位生成器值(gv)。即:gv=sha-256(m)(公式4)应当理解,其他散列算法也可以使用。其可以包括安全散列算法(securehashalgorithm,简称“sha”)系列中的其他散列算法。一些具体示例包括sha-3子集中的实例,包括sha3-224,sha3-256,sha3-384,sha3-512,shake128,shake256。其他散列算法可以包括race原始完整性基元评估消息摘要(raceintegrityprimitivesevaluationmessagedigest,简称“ripemd”)系列中的散列算法。具体示例可以包括ripemd-160。其他散列函数可以包括基于zémor-tillich的散列函数和基于背包(knapsack)的散列函数的系列。确定第一节点第二私钥330然后方法300包括步骤330,基于第二节点主私钥(v1c)和生成器值(gv)确定第一节点第二私钥(v2c)。根据以下公式,v2c可以基于第一节点主私钥(v1c)和生成器值(gv)的标量相加之和:v2c=v1c+gv(公式5)因此,第一节点第二私钥(v2c)不是随机值,而是确定性地从第一节点主私钥导出。加密对中的相应公钥,即第一节点第二公钥(p2c),具有以下关系:p2c=v2cxg(公式6)将公式5中的v2c代入公式6中,则:p2c=(v1c+gv)xg(公式7)其中,“+”运算符指椭圆曲线点加法。注意椭圆曲线密码学代数具有分配律,公式7可以表示为:p2c=v1cxg+gvxg(公式8)最后,公式1可以代入公式7,则:p2c=p1c+gvxg(公式9.1)p2c=p1c+sha-256(m)xg(公式9.2)因此,在已知第一节点主公钥(p1c)和消息(m)的情况下,可以导出对应的第一节点第二公钥(p2c)。第二节点7可以具有这样的知识以独立地确定第一节点第二公钥(p2c),这将在下文关于方法400进一步进行详细讨论。基于消息和第一节点第二私钥生成第一签名消息(sm1)350方法300还包括步骤350,基于消息(m)和确定的第一节点第二私钥(v2c)生成第一签名消息(sm1)。生成签名消息包括应用数字签名算法对消息(m)进行数字签名。在一个示例中,这包括将第一节点第二私钥(v2c)应用于椭圆曲线数字签名算法(ellipticcurvedigitalsignaturealgorithm,简称“ecdsa”)中的消息以获得第一签名消息(sm1)。ecdsa的实例包括基于具有secp256k1、secp256r1、secp384r1、se3cp521r1的ecc系统的椭圆曲线数字签名算法。在第二节点7处,采用对应的第一节点第二公钥(p2c)来验证第一签名消息(sm1)。第二节点7可以使用对第一签名消息(sm1)的验证来认证第一节点3,这将在下面的方法400中进行讨论。确定第二节点第二公钥370’然后,在步骤370中,第一节点3可以确定第二节点第二公钥(p2s)。如上所述,第二节点第二公钥(p2s)可以至少基于第二节点主公钥(p1s)和生成器值(gv)。在该示例中,由于将公钥确定为具有与基点(g)进行椭圆曲线点乘的私钥(步骤370’),所以可以以类似于公式6的方式表达第二节点第二公钥(p2s),如:p2s=v2sxg(公式10.1)p2s=p1s+gvxg(公式10.2)公式10.2的数学证明与上述用于导出第一节点第二公钥(p2c)的公式9.1的数学证明相同。应当理解,在步骤370中,第一节点3可以独立于第二节点7确定第二节点第二公钥。在第一节点3处,确定共同秘密380然后,在步骤380中,第一节点3可以基于所确定的第一节点第二私钥(v2c)和所确定的第二节点第二公钥(p2s)来确定共同秘密(cs)。共同秘密(cs)可以由第一节点3通过以下公式确定:s=v2cxp2s(公式11)在第二节点7处执行的方法400现在将描述在第二节点7处执行的对应方法400。应当理解,这些步骤中的一些步骤类似于上述由第一节点3执行的步骤。方法400包括步骤410,通过通信网络5接收来自第一节点3的消息(m)。这可以包括在步骤315由第一节点3发送的消息(m)。然后在步骤420中,基于消息(m),第二节点7确定生成器值(gv)。由第二节点7确定生成器值(gv)的步骤420类似于由上述第一节点执行的步骤320。在该示例中,第二节点7独立于第一节点3执行该确定步骤420。下一步骤包括步骤430,基于第一节点主公钥(p1c)和生成器值(gv)确定第一节点第二公钥(p2c)。在该示例中,由于将公钥确定(步骤430’)为具有与基点(g)进行椭圆曲线点乘的私钥,所以可以以类似于公式9的方式表达第一节点第二公钥(p2c),如:p2c=v2cxg(公式12.1)p2c=p1c+gvxg(公式12.2)公式12.1和12.2的数学证明与上述针对公式10.1和10.2所讨论的内容相同。第二节点7认证第一节点3方法400可以包括由第二节点7认证所声称的第一节点3是第一节点3的步骤。如前所述,这包括接收来自第一节点3的第一签名消息(sm1)的步骤440。然后,在步骤450,第二节点7可以使用在步骤430确定的第一节点第二公钥(p2c)验证第一签名消息(sm1)上的签名。验证数字签名可以根据如上所述的椭圆曲线数字签名算法(ecdsa)来完成。重要的是,用第一节点第二私钥(v2c)签名的第一个签名消息(sm1)只能用相应的第一节点第二公钥(p2c)正确地验证,因为v2c和p2c来自一个密码对。由于这些密钥是由第一节点3注册时生成的第一节点主私钥(v1c)和第一节点主公钥(p1c)确定的,因此验证第一签名消息(sm1)可以用作认证的基础,即认证发送第一签名消息(sm1)的所谓第一节点是与在注册期间相同的第一节点3。因此,第二节点7还可以基于验证(450)第一签名消息的结果来执行认证(460)第一节点3的步骤。第二节点7确定共同秘密方法400还可以包括步骤470,第二节点7基于第二节点主私钥(v1s)和生成器值(gv)确定第二节点第二私钥(v2s)。类似于第一节点3执行的步骤330,第二节点第二私钥(v2s)可以基于第二节点主私钥(v1s)和生成器值(gv)的标量相加,根据以下公式:v2s=v1s+gv(公式13.1)v2s=v1s+sha-256(m)(公式13.2)然后,在步骤480,第二节点7可以独立于第一节点3,基于第二节点第二私钥(v2s)和第一节点第二公钥(p2c)基于以下公式确定共同秘密(cs):s=v2sxp2c(公式14)由第一节点3和第二节点7确定的共同秘密(cs)的证明由第一节点3确定的共同秘密(cs)与在第二节点7处确定的共同秘密(cs)相同。现在对公式11和公式14提供相同的共同秘密(cs)的数学证明进行说明。至于由第一节点3确定的共同秘密(cs),公式10.1可以代入公式11,如下所示:s=v2cxp2s(公式11)s=v2cx(v2sxg)s=(v2cxv2s)xg(公式15)至于由第二节点7确定的共同秘密(cs),公式12.1可以代入公式14,如下所示:s=v2sxp2c(公式14)s=v2sx(v2cxg)s=(v2sxv2c)xg(公式16)由于ecc代数是可交换的,因此公式15和公式16是等价的,因为:s=(v2cxv2s)xg=(v2sxv2c)xg(公式17)共同秘密(cs)和秘密密钥共同秘密(cs)现在可以被用作秘密密钥,或者作为在第一节点3和第二节点7之间进行安全通信的对称密钥算法中的秘密密钥的基础。共同秘密(cs)可以是椭圆曲线点(xs,ys)的形式。这可以使用由节点3、7所达成一致的标准公开已知操作转换成标准密钥格式。例如,xs值可以是256位的整数,可以用作aes256加密的密钥。它也可以使用riremd160转换成160位的整数,用于任何需要这个长度密钥的应用程序。可以根据需要确定共同秘密(cs)。重要的是,第一节点3不需要存储共同秘密(cs),因为这可以基于消息(m)重新确定。在一些示例中,所使用的消息(m)可以存储在数据存储13、17、19(或其他数据存储)中,而不需要主私钥所要求的相同级别的安全性。在一些示例中,消息(m)可以是公开可用的。然而,根据某些应用,共同秘密(cs)可以存储在与第一节点相关联的第一数据存储(x)中,前提是共同秘密(cs)与第一节点主私钥(v1c)一样安全。有利地,基于单个主密钥加密对,该技术可用于确定对应多个安全密钥的多个共同秘密。生成器值(密钥)的层级结构例如,可以确定一系列连续的生成器值(gv),其中可以基于先前的生成器值(gv)确定每个连续的gv。例如,无需重复步骤310至370和410至470以生成连续的单用途密钥,而是通过节点之间的先前协议,双方可以重复地先前使用的生成器值(gv)进行重新散列,以建立生成器值的层级结构。实际上,基于消息(m)的散列,生成器值可以是下一代生成器值(gv’)的下一代消息(m’)。这样做允许计算连续几代共享秘密而无需进一步的协议建立传输,特别是为每一代共同秘密传输多个消息。下一代共同秘密(cs’)可以如下方式计算。首先,第一节点3和第二节点7独立地确定下一代生成器值(gv’)。这类似于步骤320和步骤420,但适用于以下公式:m’=sha-256(m)(公式18)gv’=sha-256(m’)(公式19.1)gv’=sha-256(sha-256(m))(公式19.2)然后,第一节点3可以确定下一代第二节点第二公钥(p2s’)和第一节点第二私钥(v2c’),类似于上述步骤370和330,但是适用以下公式:p2s’=p1s+gv’xg(公式20.1)v2c’=v1c+gv’(公式20.2)然后,第二节点7可以确定下一代第一节点第二公钥(p2c’)和第二节点第二私钥(v2s’),类似于上述步骤430和470,但是适用以下公式:p2c’=p1c+gv’xg(公式21.1)v2s’=v1s+gv’(公式21.2)然后,第一节点3和第二节点7可以各自确定下一代共同秘密(cs’)。特别地,第一节点3使用以下公式确定下一代共同秘密(cs’):cs’=v2c’xp2s’(公式22)第二节点7使用以下公式确定下一代共同秘密(cs’):cs’=v2s’xp2c’(公式23)可以以相同的方式计算更多代(cs”,cs”’等)以创建链层级结构。该技术要求第一节点3和第二节点7都跟踪原始消息(m)或原始计算的生成器值(gv)以及它所涉及的节点。由于这是公开信息,因此没有关于保留此信息的安全问题。因此,该信息可以保存在“散列表”(将散列值链接到共同密钥)上,并且通过网络5自由分发(例如使用流技术(torrent))。此外,如果层级结构中的任何单个共同秘密(cs)遭到破坏,不会影响层级结构中任何其他共同秘密的安全性,前提是私钥v1c、v1s仍然安全。密钥的树结构除了如上所述的链(线性)层级结构之外,还可以创建树结构形式的层级。利用树结构,可以确定用于不同目的的各种密钥,例如认证密钥,加密密钥,签名密钥,支付密钥等,这些密钥都链接到单个安全地维护的主密钥。这在图12中得到最充分的说明,其示出了具有各种不同密钥的树结构901,其中每一个都可用于与另一方创建共享密钥。树枝可以以几种方式完成,其中三种如下所述。(i)主密钥繁衍在链层级结构中,通过向原始主密钥添加大量繁衍的重新散列的消息来创建每一个新的“链接”(公钥/私钥对)。例如,(为清楚起见,仅示出第一节点3的私钥):v2c=v1c+sha-256(m)(公式24)v2c’=v1c+sha-256(sha-256(m))(公式25)v2c”=v1c+sha-256(sha-256(sha-256(m)))(公式26)…要创建分支,任何密钥都可以用作子-主密钥。例如,可以采用与常规主密钥相同的操作,通过向子-主密钥添加散列,v2c’用作子主密钥(v3c):v3c=v2c’+sha-256(m)(公式27)子主密钥(v3c)本身可以具有下一代密钥(v3c’),例如:v3c’=v2c’+sha-256(sha-256(m))(公式28)这提供了树结构903,使用如图13所示的主密钥繁衍方法。(ii)逻辑关联在此方法中,树(公钥/私钥对)上的所有节点生成为链(或其它形式),树中节点之间的逻辑关系由表维护,使用指针,表中树中的每个节点仅与树中的父节点相关联。因此,可以使用指针来确定相关的公钥/私钥对,以确定会话的共同密钥(cs)。(iii)消息多重性可以通过链或树中的任何点引入新消息来生成新的私钥/公钥对。消息本身可以是任意的,或者可以带有一些含义或功能(例如,它可能与“真实的”银行帐号等有关)。可能希望安全地保留用于形成新的私钥/公钥对的这种新消息。编码方案交易的元数据可用于访问存储在块外文档中的指令。本文档可能被称为“合约”。用于引用合约的元数据可以以各种方式格式化。但是,这里描述的是合适的编码方案。如果合约所规定的权利赋予了合约持有人或所有者,则合约可以转移。不可转移的合约的一个例子是合约方被命名的合约,也就是说,权利被赋予给有特定名字的实体而不是合约的持有者。本编码方案仅讨论可转移的合约。代币表示特定合约,该合约详述或定义了由合约转移的权利。根据本发明,代币是比特币交易形式的合约的表示。该编码方法使用包括三个参数或数据项的元数据。此数据可以表明:i)合约规定的可用份额的数量(在本文中可以表示为“numshares”);ii)从发送方转移到至少一个接收方的一定数量的转移单位(在本文中可以表示为“shareval”);和iii)用于计算该数量的转移单元的值的因子(这在本文中可称为“挂钩率(peggingrate)”)。该编码方案的一个优点是它可以仅使用上述三个参数来封装合约,或将合约表示为区块链上的代币。实际上,可以至少使用这三个数据项来规定合约。由于该编码方案可用于任何类型的可转移的合约,因此可以设计和应用通用算法。这些元数据项的进一步细节具体如下。可分割的代币是交易输出中的价值可被细分为更小量的代币(即,在多个交易中分配)。原型是代币化的法定货币。可分割的合约定义为指定非零挂钩率的合约。对于可分割的合约,在交易输出中转移的代币化价值通过挂钩率,与基础比特币(btc)价值相关联。也就是说,合约规定了持有人在挂钩率方面的权利。对于不可分割的代币,没有挂钩率,合约以固定价值规定了持有人的权利(例如不记名债券:‘此合约可以兑换1000美元’或礼券:“此合约可用来理发一次”)。对于不可分割的合约,基础交易btc值与合约价值无关。“基础btc价值”是指附加到交易输出的比特币金额(btc)。在比特币协议中,每笔交易输出必须具有非零btc金额才被认为是有效的。实际上,btc金额必须大于设定的最小值(称为“尘埃(dust)”),在撰写本申请文件时,目前设定为546聪(satoshis)。1比特币定义为等于1亿聪。由于比特币交易仅用作帮助所有权交换的手段,因此实际的基础btc金额是任意的:真正的价值由合约文件规定。从理论上讲,每一个代币都可以被尘埃携带。根据当前的编码方案,特别是对于可分割的代币,基础btc价值确实具有含义:它通过挂钩率与合约价值相关。挂钩率本身是任意的,并且选择挂钩率以便使基础btc价值保持较小。使用挂钩率而不是简单地使尘埃基础化每个代币交易的原因是,因为本发明的协议帮助了可分割性:当代币被分成几个较小金额的交易输出时,不必调整原始合约。不如说,每个细分代币的合约价值仅根据挂钩率和基础btc价值的细分金额计算。有限代币是总发行价值由固定的非零数量的份额固定(或“限制”)的代币,其由称为numshares的量定义。因此,根据有限合约不可再发行进一步的份额。例如,赛马的部分所有权合约限于赛马的100%(例如每份额1%的100份额或每份额10%的10份额,等等)。无限合约意味着发行人能够包销进一步的份额发行,例如,将所需金额的法定货币加入其储备账户。必须在所有合约中明确说明numshares。有限合约必须满足numshares>0;通过设置numshares=0来表示无限合约。典型的例子是货币储备(类似于黄金储备),使得储备银行账户中持有的总价值与现有期票(即未赎回的代币)中的总价值相匹配。这一概念不仅限于货币储备,还包括库存。例如,持有印花t恤代币的发行者开始时可库存10,000件t恤,并可发行一个可分的代币来代表这10,000件t恤(其中,例如,每份额=1件t恤)。可以细分原始代币,并且根据挂钩率定义的交易输出的基础btc价值,每个细分的代币可以兑换多件t恤。然而,如果需求增加,发行人可能决定发行更多份额(即增加流通股数量(比如)再加10,000份额)。在这种情况下,发行人有责任在其储备账户(即库存仓库)中再存放10,000件t恤,以便包销进一步的发行。因此,任何时候库存中的t恤总数(其中库存充当“储备账户”)=未赎回的份额的总数。挂钩率仅适用于可分割的合约,其中份额的价值(由名为shareval的量表示)与基础btc金额挂钩。例如,合约可以指定发行人承诺以每个基础1btc10,000美元的费率赎回代币。这意味着(例如)具有代币化基础输出值15,400聪的交易将可兑换为1.54美元。挂钩率的值为0表示合约是不可分割的(即只能整体转移,如不记名债券)。当挂钩率设置为0(表示不可分割的代币)时,基础btc值与合约价值无关,可以设置为任何金额。通常在这种情况下,希望保持基础btc金额尽可能小(即设置为尘埃)以使操作成本最小化。numshares是(有限)合约下可用的总(固定)份额数。对于有限合约,numshares必须是大于零的整数。对于无限合约,numshares不是固定的,因为可以随时发行更多的份额(只要它们被包销),通过将值设置为0来表示。定义份额为转移单位,shareval是该单位的价值。例如,对于法定货币,转移单位可以设置为1美分。或者,例如,它可以设置为50美分,在这种情况下,转移只能以多个50美分的“批次”执行。shareval也可以表示为百分比:例如,如果饲养员希望以10个相等的份额出售赛马,那么shareval=10%。shareval必须>0且必须在合约上定义。发行总额(totallssuance)代表已发行份额的总价值。该价值仅涉及有限合约,无限合约的发行是不固定的,可发行更多份额。如果份额以百分比表示,那么根据定义,totallssuance=100%。对于有限合约,numshares,shareval和totallssuance以下列方式相关联:numsharesxshareval=totallssuancetotallssuance的值为0表示它是无限合约。无限合约的一个例子是法定货币(因此totallssuance设为0);有限合约的例子有:(i)限量版纪念币(铸造1000枚,其中1股=1枚硬币):totallssuance=1000x1=1000个硬币;(ii)在售票场地的座位,其中totallssuance=可用座位总数。将流通量定义为未花费的代币的总价值(即,由utxo中的交易确定-未花费的交易输出)。所有未花费的交易的完整集均保存在可用于所有比特币节点的列表中。例如,如果发行人最初发行10,000美元作为法定货币类型代币,并且随着时间的推移,价值5500美元的代币被赎回,那么流通量=4500美元(即未赎回代币的价值)。此价值应与关联的储备帐户中的余额保持一致。适用于本发明实施例的计算资源(“代理”)的说明性示例本发明可以利用适当设置的计算资源(在本文中为“代理”)来执行所期望的过程的自动化方面。以下提供优选代理的示例(其他实施方式也可被使用)。代理可以与区块链一起操作,在图灵机(turingmachine)的实施方式中将其用作不可擦除的纸带(tape)。该代理与区块链网络并行运行,监督和处理(循环)过程的执行。循环过程旨在执行给定任务,例如,过程的自动化,或设备或系统的控制。此并行资源监测区块链的状态,并可以将交易写入区块链。从某种意义上说,它利用区块链作为图灵机的不可擦除的纸带,其定义和特征如下:1.区块链充当图灵机的纸带。区块链中的每个交易代表纸带上的一个单元格(cell)。该单元格可以包含来自有限字母表的符号。2.带头(tapehead)可以读取来自区块的信息,该信息已被写入区块链。3.带头可以将包含许多交易的新块写入区块链的末尾。但是,它们无法写入已存在的块。因此,区块链带是不可擦除的。4.每个交易的元数据可以存储为多重签名支付脚本散列(p2sh)交易的一部分。代理的一个重要功能是充当监测区块链当前状态的自动化实体。它还可以从任何块外(off-block)源接收信号或输入。根据区块链状态和/或接收的输入,代理可以执行某些动作。代理决定要执行哪个(或哪些)动作。这些可能涉及或不涉及“现实世界”(即块外(off-block))中的动作和/或区块链上的动作(例如创建和广播新交易)。代理所采取的动作可能由区块链状态触发。代理还可以决定要向比特币网络广播的下一组交易,并随后写入区块链。代理的动作并行且同时运行在区块链(例如比特币)网络。从某种意义上说,这扩展了区块链(例如比特币)脚本的功能。这种连续监测实施了“循环”控制流构造,使代理和区块链系统的结合具有图灵完备性。图灵机包括两个堆栈:·数据堆栈:这是由上述区块链表示的。·控制堆栈:这是由代理函数表示的。它存储了与重复控制流功能相关的信息。控制堆栈与数据堆栈的分离提供了防止比特币核心内发生无限循环、减轻拒绝服务攻击(denial-of-serviceattack)的优点。代理管理和运行子例程,这些子例程能够通过任何类型的循环构造(例如,for-next,repeatuntil等)进行循环。本文中描述的说明性实施例包括使用“重复”构造的一个示例的过程。用户可以指定索引(i)和限值(j)。这些分别表示当前迭代次数(通常从0开始计数)和重复循环的总迭代次数。对于每一次迭代:1.索引增量为1。对于退出条件,当索引达到限值时,迭代将停止;2.执行包含“如果条件就动作(ifconditionthenaction,简称“(icta)”)语句的代码块;该动作可以是区块链上或链外的任何动作;3.计算该子例程的加密散列。这可以作为交易的一部分存储在区块链中。由于散列对每个代码都是唯一的,因此可以验证哪个代码已被使用。循环体包括代码块。每个代码块都包含“ifconditionthenaction”(icta)语句。这就为与以下内容匹配的交易监测了区块链的当前状态:·启动或触发条件(例如,达到特定日期时)。·重复条件(即与前一迭代相关的元数据或散列)。·停止条件(即循环的最后一次迭代)。icta语句使代理能够根据区块链的当前状态决定下一个要进行的交易。进行下一个交易涉及将交易广播到比特币网络,并将新交易写入区块链。这充当了此迭代已被执行的记录。一旦将交易写入区块链,管理器(manager)随后将发现上一次迭代已被执行并被写入区块链,并将执行下一次迭代。后者继续,直到当索引(i)达到代码块中指定的限值(j)时重复循环退出。每个交易都以可重复使用的方式保存在区块链中。在比特币实施方式中,交易中的每个签名都附加一个签名散列(sighash)标志。该标志可以采用不同的值,每个值指示在没有该签名的所有者参与的情况下是否可以修改交易的其他部分。可重复使用的交易在交易输入中的一个具有sighash标志“签名散列_任何人可付(sighash_anyonecanpay)”。这允许任何人为交易的输入做出贡献。此参数使代理的icta功能能够被执行并重复多次,并使用不同的输入。该功能的使用可以限制在已授权的各方——例如,通过可重复使用的交易的版权。icta代码块的“if条件(ifcondition)”部分可以监测任何类型的条件。这与其他编程语言(例如c,c++,java)类似,并且不限于存储在区块链上的信息。例如,它可以监测日期和时间(即达到某个日期和时间)或监测天气(即当温度低于10℃且正在下雨时),监测合约或信托的条件(即当公司a购买公司b时)。icta代码块的“就动作(thenaction)”部分可以执行多个动作。本发明不限制可采取的动作的数量或类型。该动作不限于区块链上的交易,尽管包含与动作相关的元数据的交易可以写入区块链。元数据可以是任何形式的。然而,在一个实施例中,元数据可存储指向文件的超链接,该文件包含与动作相关的更多数据或指令。元数据还可存储指向散列表的超链接,该散列表包含与动作有关的更多数据或指令以及该动作的散列,该动作的散列用作散列表的查找关键字。代理的控制堆栈可以通过多种方式实施,这些方式属于每个用户的特定需求。例如,控制堆栈的重复循环可以基于任何图灵完备语言。一种可能的语言选择是forth风格的基于堆栈的语言。使用这种语言的一个优点是它在编程风格上使控制堆栈与比特币脚本保持一致,而比特币脚本已经广为人知、广泛使用。使用比特币脚本的备用堆栈作为数据存储空间比特币脚本包含命令,也称为操作码(opcodes),使用户能够将数据移动到称为“alt堆栈”的备用堆栈(alternativestack)。操作码为:·op_toaltstack表示将数据从主堆栈的顶部移动到alt堆栈的顶部。·op_fromaltstack表示将数据从alt堆栈的顶部移动到主堆栈的顶部。这使得来自计算的中间步骤的数据能够存储在alt堆栈中,类似于允许将数据存储在计算器上的“存储器”功能。在一个实施例中,alt堆栈用于配置比特币脚本以解决小的计算任务并将计算结果返回。使用代码注册表管理代理代理还管理其拥有并运行的所有代码的注册表。此注册表的结构类似于将特定关键字映射到特定值的查找表或词典。关键字和值对分别由代码块的散列(h1)和存储代码的互联网协议第6版(ipv6)地址表示。要使用关键字h1获取代码块,查找表用于获取相关的值(这是存储代码的位置)并相应地获取源代码。代码注册表的实现可以多样化。代理的代码的交易元数据,以及循环的重新生成在特定迭代中重新生成代理循环所需的信息,作为元数据存储在区块链上记录的交易中。通过这种方式,区块链上的交易存储或提供对给定迭代循环信息的访问,该迭代循环在代理上被执行。该信息可以包括与循环相关的任何变量的值,例如索引i,以及任何其他必要信息,例如代码块中使用的参数值或指定可以访问其他所需信息的位置相关数据。元数据本身作为交易中多重签名支付脚本散列脚本(p2sh)的一部分存储。记录了交易的元数据还能够记录过去如何执行代码的审计跟踪。代理可以通过多种方式,在每次迭代时重新生成重复循环代码块。代码块可以硬编码到代理本身中,也可以存储在非公用或公用文件中,或者存储为非公用或公用散列表文件中的条目,或者上述的组合。代码块可以是带有硬编码变量的静态代码,也可以是静态代码块但包含可以填充的参数。参数可以是任何数据格式的单个值,或者可以是小块代码,或者是上述的组合。可以通过直接从交易中的元数据(例如比特币交易)或从诸如内部数据库或非公用/公共文件或散列表或上述的任何组合的外部源获取它们来填充参数。指向参数值的外部源的指针可能存储在交易中的元数据中。以下步骤提供了代理如何在第i次迭代中重新生成重复循环代码块的一个示例。在本示例中,代码注册表是散列表,散列值充当表的查找关键字,并存储在有关交易的元数据中。1.代理监测用于交易的区块链,该交易包含代码块的散列值,该代码块的散列值与代码注册表中的条目匹配。2.代理找到包含相应散列(h1)的交易。3.代理读取“元数据-代码散列(metadata-codehash)”,获取代码散列(codehash)字段,以获得h1并使用它来获取代码(c1)。如果ripemd-160(sha256(c1))等于h1,则代码还未更改,可以安全地继续进行下一步。4.代理读取存储索引的“元数据-代码散列”,并在第i次迭代中重新生成代码。换句话说,在适当的迭代中“重新加载”循环。5.用户的签名包含在p2sh命令中,以验证元数据的来源。6.如果循环的此迭代需要这些数据,则代理读取“元数据-输出散列(metadata-outputhash)”和“元数据-输出指针(metadata-outputpointer)”,以获取前一步骤的输出。应当理解,基于上述变化的不同组合,存在许多不同的用于实现比特币门的模式。以下选择的是仅用于说明的模式,并非旨在进行限制。根据模式的特定属性和门逻辑的预期用途,每个模式可适用于实现一种类型的门,或几种类型的门,或适用于所有类型的门:应当说明的是,上述实施例对本发明进行说明而不是限制本发明,并且本领域技术人员将能够设计许多替代实施例而不脱离由所附权利要求限定的本发明的范围。在权利要求中,括号中的任何附图标记不应解释为对权利要求的限制。词语“包括(comprising)”和“包含(comprises)”等不排除除了在任何权利要求或说明书中作为整体列出的元件或步骤之外的元件或步骤的存在。在本说明书中,“包括(comprises)”意指“包括(includes)或由......组成(consistsof)”,“包括(comprises)”意指“包括(including)或由......组成(consistingof)”。元素的单数引用不意味着排除这些元素的复数引用,反之亦然。本发明可以借助于包括若干不同元件的硬件以及借助于适当编程的计算机来实施。在列举了若干装置的设备权利要求中,这些装置中的若干个可以由该硬件的同一个部件来体现。在相互不同的从属权利要求中仅仅列举某些措施并不代表这些措施的组合不能用来获益。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1