技术领域
[0001] 本
发明主要涉及
分布式账本技术,包括
区块链交易,特别涉及使得将来自区块链、
区块头、区块和区块链交易的字段注入至交易脚本中。本发明特别适合但不限于在基于区块链状态的交易中使用。
背景技术
[0002] 在本文中,我们使用“区块链”一词来涵盖所有形式的基于计算机的
电子分布式账本,包括基于共识的区块链和交易链技术、允许和不允许的账本、共享账本及其变体。区块链技术最广为人知的应用是
比特币账本,虽然已经提出并开发了区块链的其他应用。尽管术语“比特币”可以被称为本发明中描述的技术的有用应用,但是为了方便说明,比特币仅仅是本发明中描述的技术可以应用的许多应用之一。然而,应注意的是,本发明不限于与比特币区块链一起使用,包括非商业应用在内的其它区块链应用和协议也落入本发明的范围内。例如,本发明中描述的技术在以下方面具有优势:本发明中描述的技术将为使用区块链应用和具有类似于比特币的限制的其他
加密货币提供优势,这些限制是关于
加密货币交易中可以编码哪些约束的,而不论是否发生加密货币的交换。
[0003] 如本文所使用的,“数字资产”是由区块链管理的资源的单位。数字资产是由区块链管理的资源的单位。尽管在一些
实施例中,数字资产可以用作加密货币,但是可以考虑到,在实施例中,数字资产可以在其他情况下附加地或替代地使用。注意,本发明虽然适用于数字资产的控制,但是本质上是技术性的,并且可以在其他利用区块链数据结构的情况下使用,而不必涉及数字资产的转移。本发明中使用的“数字资产”可以指一种或多种数字资产。例如,一个交易可能有多个输入,并且这些输入中的每一个都可以代表不同的数字资产。在该示例中,控制权被转移的数字资产可以是多个数字资产的集合,该集合本身是数字资产。类似地,交易可以细分和/或组合那些多个输入以产生一个或多个输出,使得例如输入的数量和输出的数量不同。在一个实施例中,加密货币是基于代币的加密货币,其中每个代币代表资产的份额(例如,公司的份额),并且单个交易涉及多种类型的代币(例如,涉及一个或多个不同公司的份额)。
发明内容
[0004] 本发明描述了一个或多个基于区块链的
计算机程序的技术方面。基于区块链的计算机程序是记录在区块链交易中的机器可读和可执行程序。基于区块链的计算机程序可以包括可以处理输入以产生结果的规则,然后可以根据这些结果来执行动作。如果
锁定脚本可以
访问解锁和先前的交易,则可以利用区块链来启用高度灵活和复杂的基于区块链的计算机程序。当前研究的一个领域是使用基于区块链的计算机程序来实现“
智能合约”。与以自然语言编写的传统合同不同,智能合约是旨在自动执行机器可读合约或协议条款的计算机程序。
[0005] 在实施例中,尽管可以在智能合约中的特定步骤编码与特定实体的交互,但是智能合约也可以自动执行和自我执行。在一些示例中,自动执行是指智能合约的执行,该合约成功执行以启用UTXO的传输。注意,在这样的示例中,能够使得UTXO转移的“实体”是指能够创建解锁脚本而无需证明知晓某些秘密的实体。也就是说,可以在不验证数据源(例如,创建解锁交易的实体)有权访问加密秘密(例如,私密非对称密钥,对称密钥等)的情况下,验证解锁交易。同样,在这样的示例中,自我执行是指使区块链网络的验证
节点根据约束来执行解锁交易。在一些示例中,从技术意义上使用“解锁”UTXO,是指创建引用该UTXO并作为有效执行的解锁交易。解锁UTXO在本领域中也可以称为花费UTXO。
[0006] 区块链交易输出包括锁定脚本和有关数字资产(例如比特币)所有权的信息。锁定脚本(也可以称为“负载”)通过
指定转移UTXO所需满足的条件来“锁定”数字资产。例如,锁定脚本可能要求在解锁脚本中提供某些数据以解锁关联的数字资产。锁定脚本在比特币中也称为“脚本公钥”(scriptPubKey)。要求锁定方提供数据以解锁数字资产的技术涉及将数据的散列嵌入锁定脚本中。但是,如果在创建锁定脚本时未确定(例如,未知和未固定)数据,则会出现问题。
[0007] 另外,如果基于区块链本身的各个方面(例如,区块中的其他交易或区块头的内容)预测锁定脚本,则在创建锁定脚本时该数据不存在,并且在区块链中不存在用来查询区块链的状态以获得该数据的操作码。因此,锁定脚本不能要求特定的区块头,不能要求区块链的特定状态,也不能要求交易位于区块链的特定区块内。
[0008] 因此,期望提供在一个或多个这些方面中改进区块链技术的方法和系统。因此,根据本发明,提供了所附
权利要求中所限定的方法。
[0009] 下文更详细地描述了计算机实现的方法和电子设备,用于对解锁脚本中的数据实施约束,以要求解锁脚本包括区块头,区块链或区块头链。通过对解锁脚本中的数据实施此类约束,并在运行时将此类数据注入至解锁脚本中,交易可以基于区块链的各个方面。
[0010] 因此,根据本发明,可以提供一种所附权利要求书中所限定的计算机实现的方法(和相应的系统)。该方法可以描述为区块链数据约束方法。该计算机实现的方法包括:i)在区块链网络中的节点处接收包括第一脚本的第一交易,该第一脚本指定了对第二交易的约束集合,约束集合包括这样的约束:节点获得的数据集合包括从与区块链网络相关联的区块链获得的信息;ii)获得第二交易,所述第二交易包括第二脚本,由于执行该第二脚本而导致节点获得上述数据集合;iii)通过执行第一脚本和第二脚本来验证第二交易。
[0011] 下文更详细地描述了计算机实现的方法和电子设备,用于对解锁脚本中的数据实施约束,以要求在可以使用解锁脚本来解锁锁定脚本和访问交易的数字资产之前区块链处于特定状态。通过在锁定脚本上实施约束以要求解锁脚本包括区块头、区块链或区块头链,并在运行时将此类数据注入至解锁脚本中,交易可以基于区块链的状态。
[0012] 约束集合可包括这样的约束:上述数据集合包括区块链的区块的区块头。
[0013] 通过至少验证区块头具有预定大小,节点可以确定是否满足这样的约束:数据集合包括区块链的区块的区块头。附加地或替代地,节点可以通过至少验证区块头包含大于或等于某难度值的难度值来确定是否满足数据集合包括区块链的区块的区块头的约束。附加地或替代地,节点可以通过至少验证区块头的散列小于或等于在区块头中包含的难度值计算出的目标值来确定这样的约束是否得以满足:数据集合包括区块链的区块的区块头。
[0014] 约束集合可以包括这样的约束:数据集合包括来自区块链的区块的第三交易。
[0015] 该数据集合可包括区块链的区块的区块头。附加地或可替代地,约束集合可包括这样的约束:第三交易包括在区块中。附加地或替代地,节点可以至少部分地基于区块链的区块的区块头来确定是否满足所述第三交易包括在区块中的约束。
[0016] 节点可至少部分地基于由区块头识别的区块中的交易的编码,通过至少计算第三交易的散列值来确定是否满足第三交易包括在区块中的约束。附加地或替代地,节点可以通过至少验证第三交易的散列值等于存储在区块头中的散列值来确定是否满足第三交易包括在区块中的约束。
[0017] 约束集合可包括这样的约束:数据集合包括区块头链,该区块头链包括区块头的有序集合,区块头的有序集合包括多个区块头,区块头的有序集合指定了与所述多个区块头相关联的顺序。
[0018] 节点可通过至少部分地基于与多个区块头相关联的顺序至少选择一对区块头来确定这样的约束是否得到满足:第二脚本包括区块头链。该对区块头包括:一对区块头中的第一区块头和一对区块头中的第二区块头。附加地或替代地,节点可以通过至少针对该对区块头来验证该对区块头中的第一区块头的散列是否等于存储在该对区块头中第二区块头中的散列值,来确定第二脚本包括区块头链的约束是否得到满足。
[0019] 约束集合可包括这样的约束:数据集合从区块链网络的公共区块链获得。
[0020] 可以在执行第一脚本和第二脚本之前,将区块链网络的一个或多个属性提供给节点。
[0021] 可以在不验证创建了第二交易的实体有权访问秘密信息的情况下成功地执行验证第二交易。
[0022] 第一脚本可以是第一交易的锁定脚本,第二脚本是第一脚本的解锁脚本。
[0023] 该计算机实现的方法可进一步包括:至少部分地基于验证的结果来转移数字资产。因此,根据本发明,可以提供一种在所附权利要求中所定义的计算机实现的方法(和(一个或多个)相应的系统)。该方法可以描述为区块链状态确认方法。该计算机实现的方法包括:i)在区块链网络中的节点接收至少指定以下内容的第一交易:a)对第二交易的第一约束集合,该第一约束集合包括一个或多个约束使第二交易包含来自区块链的数据集合;b)对第二交易的第二约束集合,第二约束集合包括与该数据集合中的数据项相关的一个或多个约束;ii)在验证满足了第一约束合和第二约束集合的情况下,将第二交易存储到区块链中。
[0024] 下文更详细地描述了计算机实现的方法和电子设备,用于对解锁脚本中的数据实施约束,以要求在可以使用解锁脚本来解锁锁定脚本之前区块链处于特定状态,并在这些状态下保持对交易的数字资产的访问。通过对锁定脚本实施约束以要求解锁脚本包括区块头、区块链或区块头链,并通过在运行时将此类数据注入至解锁脚本中,交易结果可以基于区块链的状态。
[0025] 该数据集合可在第二交易中的节点处接收。
[0026] 该计算机实现的方法可进一步包括:验证第二交易以作为验证的结果。
[0027] 可以在不验证创建第二交易的实体有权访问秘密信息的情况下成功地执行验证第二交易。
[0028] 第一约束集合可包括这样的约束:数据集合包括区块链的区块头。
[0029] 第一约束集合可包括这样的约束:数据集合包括来自区块链的区块的第三交易。
[0030] 第一约束集合可包括这样的约束:数据集合包括区块头链,该区块头链包括区块头的有序集合,区块头的有序集合包括多个区块头,区块头的有序集合指定与多个区块头相关联的顺序。
[0031] 第二约束集合可包括对数据集合的数据项的值的约束。
[0032] 第二约束集合可包括从与数据集合的数据项相关联的一个或多个值得出的约束。
[0033] 第一约束集合可包括在第一交易的锁定脚本中。
[0034] 第二约束集合可包括在第一交易的锁定脚本中。
[0035] 第一约束集合可包括这样的约束:数据集合从公共区块链接收。
[0036] 节点可通过至少在第二交易中接收第一区块集合和第二区块集合来确定从公共区块链接收数据集合的约束是否得以满足,所述第一区块集合包括了从区块链网络接收的区块之前的区块,所述第二区块集合包括了从区块链网络接收的区块之后的区块。附加地或可替代地,节点可通过至少验证第一区块集合链接至从区块链网络接收的区块来确定从公共区块链接收数据集合的约束是否得以满足。附加地或可替代地,节点可通过至少验证第二区块集合链接至从区块链网络接收的区块来确定从公共区块链接收数据集合的约束是否得以满足。附加地或替代地,节点可通过至少验证第一区块集合和第二区块集合是否有效来确定从公共区块链接收数据集合的约束是否得以满足。附加地或可替代地,节点可通过至少验证第一区块集合和第二区块集合中的每个区块具有比预定值更大的难度值来确定从公共区块链接收数据集合的约束是否得以满足。
[0037] 因此,根据本发明,可以提供一种在所附权利要求中所定义的计算机实现的方法(和(一个或多个)相应的系统)。该方法可以描述为区块链状态
感知方法。该计算机实现的方法包括:i)在区块链网络中的节点处接收至少指定以下内容的第一交易:a)对第二交易的第一约束集合,该第一约束集合包括一个或多个约束使第二交易包含来自区块链网络的数据集合;b)对第二交易的第二约束集合,第二约束集合包括该数据集合包括包括第一交易的区块的约束,所述区块包括在与区块链网络相关联的区块链中;ii)成功验证满足第一约束集合和第二约束集合,使得将第二
交易记录到区块链网络中。
[0038] 该数据集合可以在第二交易中的节点处接收。
[0039] 第一约束集合可以包括这样的约束:数据集合包括区块链的区块头。
[0040] 第一约束集合可包括这样的约束:数据集合包括区块链的区块的第三交易。
[0041] 第一约束集合可包括这样的约束:数据集合包括区块头链,该区块头链包括区块头的有序集合,区块头的有序集合包括多个区块头,区块头的有序集合指定与多个区块头相关联的顺序。
[0042] 验证满足第一约束集合和第二约束集合,从而可以将区块链网络的一组属性提供给节点。
[0043] 所述区块链网络的该组属性可包括与区块链网络的区块链的每个区块相关联的对应时间戳。
[0044] 第一约束集合包括这样的约束:第二交易包括与区块相关的时间戳。附加地或可替代地,对第二交易包括与区块相关的时间戳的约束进行验证可至少部分基于区块链网络的该组属性。
[0045] 第一约束集合包括这样的约束:数据集合包括区块头。附加地或可替代地,第二约束集合可包括这样的约束:第二交易包括第一交易的标识符。附加地或可替代地,第二约束集合可包括这样的约束:第一交易的标识符与区块头的值相关联。
[0046] 第一约束集合和第二约束集合可包括在交易的锁定脚本中。
[0047] 第一交易可以在第二交易上指定第三约束集合,第三约束集合包括对数据集合的数据项的值的约束。
[0048] 第一交易可以在第二交易上指定第三约束集合,第三约束集合包括从与该数据集合的数据项相关联的一个或多个值得出的约束。
[0049] 该计算机实现的方法可进一步包括:由于验证了满足第一约束集合和第二约束集合而验证第二交易,因此成功验证了第二交易,而未验证创建了第二交易的实体有权访问秘密信息。因此,根据本发明,可以提供一种在所附权利要求中所定义的计算机实现的方法(和(一个或多个)相应的系统)。该方法可以描述为区块链数据约束方法。该计算机实现的方法包括:i)在区块链网络中的节点处接收与数字资产相关联的第一交易,第一交易包括第一脚本,第一脚本对第二交易规定了约束集合,所述第二交易用来转移对数字资产的控制,约束集合包括的约束为节点获取的数据集合包括从与区块链网络相关联的区块链获得的信息;ii)获得第二交易,所述第二交易包括第二脚本,由于执行该第二脚本而使得节点获得数据集合;iii)通过执行第一脚本和第二脚本来验证第二交易。
[0050] 约束集合可包括这样的约束:数据集合包括区块链的区块的区块头。
[0051] 通过至少验证区块头具有预定大小,节点可以确定是否满足这样的约束:数据集合包括区块链的区块的区块头。附加地或替代地,节点可以通过至少验证区块头包含大于或等于某难度值的难度值来确定是否满足这样的约束:数据集合包括区块链的区块的区块头。附加地或替代地,节点可以通过至少验证区块头的散列小于或等于从区块头中包含的难度值计算出的目标值来确定是否满足数据集合包括区块链的区块的区块头的约束。
[0052] 约束集合可以包括这样的约束:数据集合包括来自区块链的区块的第三交易。
[0053] 该数据集可包括区块链的区块的区块头。附加地或可替代地,约束集合可包括这样的约束:第三交易包括在区块中。附加地或替代地,节点可以至少部分地基于区块链的区块的区块头来确定是否满足第三交易包括在区块中的约束。
[0054] 节点可至少部分地基于由区块头识别的区块中的交易的编码,通过至少计算第三交易的散列值来确定是否满足第三交易包括在区块中的约束。附加地或替代地,节点可以通过至少验证第三交易的散列值等于存储在区块头中的散列值来确定是否满足第三交易包括在块中的约束。
[0055] 约束集合可包括这样的约束:数据集合包括区块头链,该区块头链包括区块头的有序集合,区块头的有序集合包括多个区块头,区块头的有序集合指定了与所述多个区块头相关联的顺序。
[0056] 节点可通过至少部分地基于与多个区块头相关联的顺序至少选择一对区块头来确定第二脚本包括区块头链的约束是否得到满足,即区块头对,该区块头对包括:该区块头对中的第一区块头和该区块头对中的第二区块头。附加地或替代地,节点可以至少通过针对该区块头对来验证该区块头对中的第一区块头的散列是否等于存储在该区块头对中第二区块头中的散列值,来确定第二脚本包括区块头链的约束是否得到满足。
[0057] 约束集合可包括这样的约束:数据集合从区块链网络的公共区块链获得。
[0058] 可以在执行第一脚本和第二脚本之前,将区块链网络的一个或多个属性提供给节点。
[0059] 可以在不验证创建了第二交易的实体有权访问秘密信息的情况下成功地执行验证第二交易。
[0060] 第一脚本可以是第一交易的锁定脚本,第二脚本是第一脚本的解锁脚本。
[0061] 该计算机实现的方法可进一步包括:至少部分地基于验证的结果来转移数字资产。
[0062] 因此,根据本发明,可以提供一种在所附权利要求中所定义的计算机实现的方法(和(一个或多个)相应的系统)。该方法可以描述为区块链状态确认方法。该计算机实现的方法包括:i)在区块链网络中的节点处接收与数字资产相关联的第一交易,第一交易至少指定:a)对第二交易的第一约束集合,所述第一约束集合用来转移对数字资产的控制,该第一约束集合包括一个或多个约束使第二交易包含来自区块链的数据集合;b)对第二交易的第二约束集合,第二约束集合包括与该数据集合中的数据项相关的一个或多个约束;ii)验证满足第一约束集合和第二约束集合;iii)至少部分基于验证来重新关联数字资产。
[0063] 该数据集合可以在第二交易中的节点处接收。
[0064] 该计算机实现的方法可以进一步包括:验证第二交易以作为验证的结果。
[0065] 成功地执行验证第二交易而未验证创建第二交易的实体有权访问秘密信息。
[0066] 第一约束集合可包括这样的约束:数据集合包括区块链的区块头。
[0067] 第一约束集合可包括这样的约束:数据集合包括来自区块链的区块的第三交易。
[0068] 第一约束集合可包括这样的约束:数据集合包括区块头链,该区块头链包括区块头的有序集合,区块头的有序集合包括多个区块头,区块头的有序集合指定与多个区块头相关联的顺序。
[0069] 第二约束集合可包括对数据集合的数据项的值的约束。
[0070] 第二约束集合可包括从与数据集合的数据项相关联的一个或多个值得出的约束。
[0071] 第一约束集合可包括在第一交易的锁定脚本中。
[0072] 第二约束集合可包括在第一交易的锁定脚本中。
[0073] 第一约束集合可包括这样的约束:数据集合从公共区块链接收。
[0074] 节点可通过至少在第二交易中接收第一区块集合和第二区块集合来确定从公共区块链接收数据集合的约束是否得以满足,所述第一区块集合包括了从区块链网络接收的区块之前的区块,所述第二区块集合包括了从区块链网络接收的区块之后的区块。附加地或可替代地,节点可通过至少验证第一区块集合链接至从区块链网络接收的区块来确定从公共区块链接收数据集合的约束是否得以满足。附加地或可替代地,节点可通过至少验证第二区块集合链接至从区块链网络接收的区块来确定从公共区块链接收数据集合的约束是否得以满足。附加地或替代地,节点可通过至少验证第一区块集合和第二区块集合是否有效来确定从公共区块链接收数据集合的约束是否得以满足。附加地或可替代地,节点可通过至少验证第一区块集合和第二区块集合中的每个区块具有比预定值更大的难度值来确定从公共区块链接收数据集合的约束是否得以满足。
[0075] 因此,根据本发明,可以提供一种在所附权利要求中所定义的计算机实现的方法(和(一个或多个)相应的系统)。该方法可以描述为区块链状态感知方法。该计算机实现的方法包括:i)在区块链网络中的节点处接收与数字资产相关联的第一交易,所述第一交易至少指定以下内容:a)对用于转移对数字资产的控制的第二交易的第一约束集合,该第一约束集合包括一个或多个约束使第二交易包含来自区块链网络的数据集合;b)对第二交易的第二约束集合,第二约束集合包括该数据集合包括包括第一交易的区块的约束,所述区块包括在与区块链网络相关联的区块链中;ii)验证满足第一约束集合和第二约束集合;以及iii)至少部分基于验证来转移对数字资产的控制。
[0076] 该数据集合可以在第二交易中的节点处接收。
[0077] 第一约束集合可以包括这样的约束:数据集合包括区块链的区块头。
[0078] 第一约束集合可以包括这样的约束:数据集合包括来自区块链的区块的第三交易。
[0079] 第一约束集合可包括这样的约束:数据集合包括区块头链,该区块头链包括区块头的有序集合,区块头的有序集合包括多个区块头,区块头的有序集合指定与多个区块头相关联的顺序。
[0080] 验证满足第一约束集合和第二约束集合,从而可以将区块链网络的一组属性提供给节点。
[0081] 所述区块链网络的该组属性可包括与区块链网络的区块链的每个区块相关联的对应时间戳。
[0082] 第一约束集合包括这样的约束:第二交易包括与区块相关的时间戳。附加地或可替代地,对第二交易包括与区块相关的时间戳的约束进行验证可至少部分基于区块链网络的一组属性。
[0083] 第一约束集合包括这样的约束:数据集合包括区块头。附加地或可替代地,第二约束集合可包括这样的约束:第二交易包括第一交易的标识符。附加地或可替代地,第二约束集合可包括这样的约束:第一交易的标识符与区块头的值相关联。
[0084] 第一约束集合和第二约束集合可包括在交易的锁定脚本中。
[0085] 第一交易可以在第二交易上指定第三约束集合,第三约束集合包括对数据集合的数据项的值的约束。
[0086] 第一交易可以在第二交易上指定第三约束集合,第三约束集合包括从与该数据集合的数据项相关联的一个或多个值得出的约束。
[0087] 该计算机实现的方法可进一步包括:由于验证了满足第一约束集合和第二约束集合而验证第二交易,其中成功验证了第二交易,而未验证创建了第二交易的实体有权访问秘密信息。
[0088] 还期望提供一种系统,包括:处理器;和包含可执行指令的
存储器,所述处理器执行所述指令使得所述系统执行权利要求的方法中的任意一项。
[0089] 还期望提供一种存储了可执行指令的非暂时性计算机可读存储介质,
计算机系统的处理器执行所述可执行指令,使得所述计算机系统至少执行权利要求的方法中的任意一项。
[0090] 还期望提供一种系统,包括:处理器;和包含可执行指令的存储器,所述处理器执行所述指令使得所述系统执行权利要求的方法中的任意一项。
[0091] 根据本发明,可提供一种电子设备。该电子设备包括
接口设备,耦合到该接口设备的处理器以及耦合到该处理器的存储器。存储器上存储了计算机可执行指令,该计算机可执行指令在被执行时使处理器用于执行本文所述的方法。
[0092] 根据本发明,可提供一种计算机可读存储介质。该计算机可读存储介质包括计算机可执行指令,该计算机可执行指令在被执行时使处理器用于执行本文所述的方法。
附图说明
[0093] 参考本文描述的实施例,本发明的这些和其他方面将变得显而易见或得以阐释。现在将仅通过举例的方式并参考附图来描述本发明的实施例。
[0094] 图1示出了可以实现各种实施例的示例区块链网络的示意图;
[0095] 图2示出了根据实施例的示例电子设备的示意图,其中所述示例电子设备可以用作区块链网络中的节点;
[0096] 图3示出了与基于脚本的区块链交互相关联的交易的示例实施例的示意图;
[0097] 图4示出了由实施例解决的示例问题的示意图,其中所述示例问题与访问与基于脚本的区块链交互相关联的区块链有关;
[0098] 图5示出了由实施例解决的示例问题的示意图,其中所述示例问题与访问与基于脚本的区块链交互相关联的区块链中的区块有关;
[0099] 图6示出了根据实施例的示例环境的示意图,其中数据被验证为区块头,所述区块头用于基于脚本的区块链交互;
[0100] 图7示出了根据实施例的示例过程的
流程图,所述示例过程用于验证数据是基于脚本的区块链交互中的区块头;
[0101] 图8示出了根据实施例的示例环境的示意图,其中数据验证为用于基于脚本的区块链交互的先前区块的区块头;
[0102] 图9示出了根据实施例的示例过程的流程图,所述示例过程用于验证数据是基于脚本的区块链交互中的先前区块的区块头;
[0103] 图10示出了根据实施例的示例环境的示意图,其中数据验证为用于基于脚本的区块链交互的区块头链;
[0104] 图11示出了根据实施例的示例过程的流程图,所述示例过程用于验证数据是基于脚本的区块链交互中的区块头链;
[0105] 图12示出了根据实施例的示例环境的示意图,该示例环境示出了可在基于脚本的区块链交互中使用的区块头的默克尔(Merkle)树;
[0106] 图13示出了根据实施例的示例环境的示意图,其中交易验证为包括在用于基于脚本的区块链交互的区块头中;
[0107] 图14示出了根据实施例的示例过程的流程图,所述示例过程用于验证交易包括在基于脚本的区块链交互的区块头中;
[0108] 图15示出了根据实施例的示例环境的示意图,该示例环境示出了如何使用本文所述的方法来解决访问与基于脚本的区块链交互相关联的区块链的问题。
[0109] 图16示出了根据实施例的示例环境的示意图,该示例环境示出了与基于脚本的区块链交互相关联的区块链的状态;
[0110] 图17示出了根据实施例的示例环境的示意图,在所述环境中,在基于脚本的区块链交互中确认了区块链的状态;
[0111] 图18示出了根据实施例的示例过程的流程图,所述示例过程用于在基于脚本的区块链交互中确认区块链的状态;
[0112] 图19示出了由实施例解决的在基于脚本的区块链交互中锁定脚本的示例问题的示意图;
[0113] 图20示出了根据实施例的在基于脚本的区块链交互中锁定脚本对数据访问的示例的示意图;
[0114] 图21示出了根据实施例的示例环境的示意图,在所述环境中,在基于脚本的区块链交互中,从串行化交易字段集合中生成签名;
[0115] 图22示出了根据实施例的示例过程的流程图,所述示例过程用于在基于脚本的区块链交互中引起串行化解锁交易字段集合的注入;
[0116] 图23示出了由实施例解决的在基于脚本的区块链交互中锁定脚本的示例问题的示意图;
[0117] 图24示出了根据实施例的示例环境的示意图,在所述环境中,在基于脚本的区块链交互中引起先前的串行化交易的注入;
[0118] 图25示出了根据实施例的字段集合的示例的示意图,在基于脚本的区块链交互中,所述字段集合基于签名散列类型而可用;
[0119] 图26示出了根据实施例的在基于脚本的区块链交互中从串行化交易中提取交易标识符的示例的示意图;
[0120] 图27示出了根据实施例的示例过程的流程图,在基于脚本的区块链交互中,所述示例过程用于引起先前串行化交易的注入;
[0121] 图28示出了根据实施例的示例环境的示意图,在所述环境中,区块链的状态用于基于脚本的区块链交互;
[0122] 图29示出了根据实施例的示例过程的流程图,所述示例过程为在基于脚本的区块链交互中使用区块链的状态的示例过程;
[0123] 图30示出了根据实施例的在基于脚本的区块链交互中使用区块链的状态的示例实施方式的示意图。
具体实施方式
[0124] 首先参考图1,图1以示意图的形式示出了与区块链相关联的示例区块链网络100,可以实现各种实施例。运行区块链协议(在该协议下可操作区块链网络100)的实例的分布式电子设备可以参与区块链网络100。这样的分布式电子设备可称为节点102。区块链协议可以是例如比特币协议。
[0125] 运行区块链协议并且形成区块链网络100的节点102的电子设备可以是各种类型,包括例如计算机(如台式计算机、膝上型计算机、平板计算机、
服务器)、移动设备(如智能手机)、可穿戴设备(如智能
手表),或其他电子设备。
[0126] 区块链网络100的节点102使用适当的通信技术彼此耦合,所述通信技术可包括有线和无线通信技术。这种通信遵循与区块链相关的协议。例如,在区块链是比特币区块链的情况下,可以使用比特币协议。节点102维护区块链上所有交易的全局账本。因此,全局账本是分布式账本。每个节点102可以存储全局账本的完整副本或部分副本。节点102影响全局账本的交易由其他节点102验证,从而全局账本的有效性得以维护。当区块链是基于
工作量证明的区块链时,还可以通过检查与区块一起提交的工作量证明来验证区块。
[0127] 至少一些节点102用作区块链网络100的矿工104。图1的区块链网络100是工作量证明区块链,其中矿工104执行昂贵的计算以便于在区块链上进行交易。例如,工作量证明区块链可要求矿工解决加密问题。在比特币中,矿工104找到一个随机数,使得具有双SHA256的区块头散列到小于当前定义的难度的值的数字。工作量证明
算法所需的散列能
力意味着,在交易的顶部已经挖掘一定数量的区块之后,实际上认为该交易是不可逆的。解决加密问题的矿工104为区块链创建一个新区块,并将新区块广播到其他节点102。其他节点102验证矿工104实际上已经解决了加密问题,并因此在接受应将区块添加到区块链之前展现足够的工作量证明。在接受应该将区块添加到区块链之前,其他节点102还验证区块本身是有效的(例如,区块的交易和区块头是有效的)。通过节点102的共识,将区块添加到区块链(即添加到分布式全局帐本)。
[0128] 矿工104创建的区块包括已经由节点102广播到区块链的交易。例如,该区块可包括从与节点102中的一个相关联的地址到与节点102中的另一个相关联的地址的交易。这样,该区块充当从一个地址到另一个地址的交易记录。要求将交易包含在区块中的一方通过使用与他们的公钥相对应的私钥对
请求进行签名,来证明他们被授权而发起转移(例如,在比特币的情况下转移比特币)。如果请求已有效签名,则仅将转移添加到区块中。
[0129] 就比特币而言,公钥和地址之间存在一一对应的关系。也就是说,每个公钥都与唯一一个地址相关联。因此,本文中对向公钥或自公钥转移数字资产(例如,转移至与公钥相关联的地址)以及向或自与公钥相关联的地址转移数字资产的任何引用均指通用操作。
[0130] 某些节点102可能不会充当矿工,而可能会充当验证节点。交易的验证可以涉及检查签名或在锁定脚本中指定的其他条件,确认对有效UTXO的引用等。图1的示例包括六个节点102,其中两个作为矿工104参与。实际上,节点102或矿工104的数量可以不同。在许多区块链网络中,节点102和矿工104的数量可以比图1中所示的数量大得多。
[0131] 图2以示意图的形式示出了示例电子设备200,该电子设备200可用作根据实施例的区块链网络(例如,例如结合图1所示的区块链网络100)中的节点(例如,结合图1示出的节点102中的一个节点)。示例电子设备200可用作节点,例如在例如结合图1示出的区块链网络100中结合图1示出的节点102中的一个节点。在一个实施例中,区块链网络是点对点区块链网络。
[0132] 电子设备可以为各种形式,包括例如台式计算机、膝上型计算机、平板计算机、服务器、移动设备(如智能手机)、可穿戴设备(如智能手表)或其它形式。
[0133] 电子设备200包括处理器210、存储器220和接口设备230。这些组件可以直接或间接耦合到彼此,并且可以彼此通信。例如,处理器210、存储器220和接口设备230可以通过总线240彼此通信。存储器220存储计算机
软件程序,该计算机软件程序包括机器可读指令和用于执行本文描述的功能的数据。例如,存储器可包括处理器可执行指令,该处理器可执行指令在由处理器210执行时使电子设备执行本文所述的方法。处理器可执行指令可包括在由处理器210执行时使电子设备实现与区块链网络(例如,结合图1描述的区块链网络100)相关联的协议的指令。例如,指令可包括用于实现比特币协议的指令。
[0134] 存储器220可存储区块链网络(例如,结合图1描述的区块链网络100)的全局账本或其一部分。即,存储器220可存储区块链的所有块或块的一部分,例如最新的块,或一些块中的信息的一部分。
[0135] 虽然存储器220在图2中以单个框示出,实际上,电子设备200可包括多个存储器组件。所述存储器组件可以为各种类型,包括例如
随机存取存储器(RAM)、
硬盘驱动器(HDD)、固态驱动器(SSD)、闪存驱动器(Flash Drives)等。不同类型的存储器可适用于不同的目的。此外,尽管将存储器220与处理器210分开示出,但是处理器210可包括嵌入式存储器。
[0136] 如图2所示,处理器210可包括安全区域,例如可信
执行环境(TEE)。TEE 250是隔离的执行环境,其向电子设备200提供附加的安全性,例如隔离的执行,可信应用的完整性和资产机密性。TEE 250提供了执行空间,该执行空间保证了在TEE 250内部加载的计算机指令和数据在机密性和完整性方面得到保护。TEE 250可用于保护重要资源(例如加密密钥)的完整性和机密性。TEE 250至少部分地在
硬件级别上实现,从而保护TEE 250内执行的指令和数据免受来自电子设备200的其余部分以及电子设备所有者等外部各方的访问和操纵。TEE 250内的数据和计算受到保护,不被操作包括TEE 250的节点(例如,结合图1描述的节点102)的一方访问和操纵。
[0137] TEE 250可操作以实例化安全执行环境(在本文中也称为“隔离区(enclave)”),然后一次添加一个存储器的页面,同时累积地散列所添加的存储器的页面。在一个实施例中,在远程机器(例如,开发者机器或另一台机器)上执行存储器页面的散列,使得远程机器确定并存储所期望的散列。因此,隔离区的内容可以由任何远程机器进行验证,以确保隔离区正在运行批准的算法。可以通过比较散列来执行该验证。隔离区完全建成后将被锁定。可以在TEE 250中运行代码并将秘密发送给代码,但是一旦隔离区被锁定,就无法更改代码。最终的散列可以由认证密钥签名,并且可以在数据所有者将任何秘密发送到隔离区之前供数据所有者使用以进行验证。
[0138] TEE 250可用于保护存储在TEE 250内的加密密钥的机密性和完整性。例如,TEE 250可用于生成和存储私钥份额。TEE 250的目的是确保没有成员能够直接获得TEE 250隔离区内的私钥份额,也不能够从成员间通信或隔离区域间通信中获得有关其他私钥份额的信息。该协议在折中隔离区
阈值方面也很强大。此外,TEE 250可使得能够由节点(例如,如结合图1示出的节点102中的一个节点)使用的远程认证向其他节点证明TEE 250是真实的并且正在运行已批准的由区块链网络100实现的协议的计算机可执行指令。远程认证可以由TEE250通过运行特定代码段并发送隔离区内部的由隔离区的内部认证密钥签名的节点的散列来提供。
[0139] TEE 250可以配备有安全的随机数发生器,该发生器位于TEE的隔离区内部,可以用来生成私钥、随机质询或其他随机数据。TEE 250还可用于从外部存储器读取数据,并且可用于将数据写入外部存储器。可以使用仅在隔离区内保存的秘密密钥来加密此类数据。
[0140] 可以使用各种平台来实现TEE 250,例如可信平台模块(TPM)或英特尔软件保护扩展(SGX)。例如,SGX支持远程认证,使隔离区能够从执行特定隔离区的处理器中获取签名语句,该特定隔离区具有被称为引用(quote)的给定成员。第三方认证服务,例如英特尔认证服务(IAS),可以证明这些签名语句源自符合SGX规范的真实CPU。
[0141] 本发明可提供这样的方法(和相应的系统):该方法用于使用在另一交易的解锁脚本中提供的未确定的数据,来
修改嵌入在区块链交易(Tx)的锁定脚本中的加密公钥。当与例如使用串行化的交易作为消息的比特币协议(例如OP_CHECKSIG)中的签名检查操作码结合使用时,交易和数据都需要获得公钥所有者的批准或授权。这样可以保护交易和数据免受更改。
[0142] 本文所述的方法使用一个或多个数字签名方案来验证各种交易。该数字签名方案可以是椭圆曲线数字签名算法(ECDSA)方案。数字签名方案也可以是两方ECDSA方案。数字签名方案也可以是阈值ECDSA方案。该方案可用于构造有效签名,而不必重构私钥并且任何一方都不必向另一方透露其密钥份额。在两方ECDSA方案的示例中有两方,并且双方都需要重建私钥。
[0143] 该ECDSA方案包括可以由节点例如结合图1描述的节点102使用的各种机制来识别恶意或不合作的一方。例如,可验证的秘密共享(VSS)可用于共享沙米尔的秘密共享(SSS)所需的多项式。SSS是秘密共享的一种形式,其中将秘密分为多个部分,提供给每个参与者,每个参与者获得其自己独有的一部分。这些部分可用于重建秘密。如果向不同的节点提供了不一致的份额,或者如果将份额秘密发送到与广播给所有节点的盲份额不同的节点,则节点可以使用VSS来识别恶意节点或成员。任一节点可以识别出不一致的份额。可以通过包括辅助信息来使秘密的共享可验证,该辅助信息允许节点将其份额验证为一致。
[0144] 可以通过份额的预期接收者节点来识别向单个节点发送不正确的份额(即,与广播的盲份额不同的份额)。可以使用可公开验证的秘密共享(PVSS)技术公开验证对秘密发送到节点的不正确份额的识别。这样的技术可以避免在不使用PVSS,并且不正确的份额的接收者离线,或在发送不正确的份额时接收者从网络的大部分断开时,对欺骗发送者进行识别中可能发生的延迟。
[0145] 不当行为,例如向不同节点提供不一致的份额,可以由网络解决,以阻止恶意行为。例如,当一个节点被其他节点标识为恶意方时,许多节点可以合作以惩罚该恶意方。例如,节点可以对涉及由恶意方存放到区块链网络的数字资产(例如
数字货币、代币或其他股份或价值)采取行动。例如,区块链网络可以通过将数字货币、代币、股份或价值转移到不可赎回的地址来毁掉数字货币、代币、股份或价值,或者区块链网络可以通过与其他拒绝节点达成共识以没收这种数字资产。不是异常行为节点的节点还可通过协作排除异常行为节点来阻止异常行为(例如,通过有效地使密钥份额无效;例如,通过将节点排除在参与大会协议之外,或者通过重新共享私钥,而不为行为异常的节点分配份额)。
[0146] 可以通过使用TEE来增强上述ECDSA技术。例如,基于Ibrahim等人的阈值ECDSA签名技术构想了一种强大的对手形式,在此称为拜占庭式对手。这种类型的对手可能会表现随意,例如,他们不仅拒绝参与签名过程或中途停止聚会,而且还可能假装诚实参与并发送不正确的信息。但是,通过使用TEE,并在存储密钥份额的TEE的隔离区内生成用于签名的数据,可以提供额外的安全性,因为隔离区极不可能被大量破坏。例如,如果为每个TEE分配的密钥份额不超过一个,假设n足够大,则可以合理预期可能受损的TEE的数量不会接近针对拜占庭式对手的强大阈值。如果相对于密钥份额总数而言,它只容忍一小部分恶意对手,则可以使该协议安全。
[0147] 例如,如果所有节点都具有TEE,则只有在不损害TEE的制造商的情况下,只有通过对节点的物理访问,并且只有付出很大的努力和
费用,才能达到对存储在隔离区域中的秘密的获取。这种制造商级别的损害预计是可控的。例如,如果制造商错误地声称许多公钥对应于真正的TEE,则他们可以获得直接访问私钥份额的权利并可能发动攻击。但是,这样的攻击将需要足够数量的密钥份额,以使得制造商能够在没有其他节点帮助的情况下产生有效的签名。这将意味着累积总股份的很大一部分,这将是非常昂贵的。而且,通过进行攻击,很大一部分所持股份的价值将被破坏。
[0148] 使用TEE时,考虑协议对“损坏的节点”的强大性很有用。损坏的节点是这样的节点,即TEE外部的硬件已损坏,但TEE的完整性没有受到损害。损坏的节点可以控制了隔离区接收和不接收的信息。特别是,损坏的节点可以暂停,即避免参与协议。如果提供给协议的信息要求由秘密存放在隔离区(在认证过程中对相应的公钥进行了证实)中的私钥签署,则私钥与隔离区本身一样值得信赖。因此,损坏的节点无法向协议发送任意(证实的)信息,只能通过中止或尝试使隔离区误动作(例如通过向其提供过时的信息)来尝试进行干扰。因此,对于损坏的节点,成功的攻击将需要收集足够数量的部分签名以产生完整的签名。
[0149] 在一些实施例中,可以使用其他阈值方案,包括非ECDSA签名方案。
[0150] 图3以示意图形式示出了与基于脚本的区块链交互相关联的交易的示例实施例300。图3所示的示例实施例300描述了:对区块链的第一状态306进行编码的先前区块链交易302和对区块链的第二状态308进行编码的解锁区块链交易304。在示例实施例300中,处于第一时间的当前状态306表示为嵌入在先前交易302中的参数。在一个实施例中,解锁交易304包括表示下一状态308的参数。
[0151] 在示例实施例300中,交易302和304是字段值集合,其包含一个或多个输入和一个或多个输出。在一些实施例中,输入和输出反映了将数字资产的控制从至少一个实体转移到至少另一实体的意图。在示例实施例300中,先前交易302是包括在区块链中的最新的,确认过的交易。在示例实施例300中,解锁交易304是近期将要发生的交易,其尚未被确认并且尚未被包括在区块链中。解锁交易304的每个输入接收先前交易302的输出。
[0152] 一些区块链技术,例如比特币,使用椭圆曲线数字签名算法(ECDSA)作为数字签名的数学方案。在实施例中,ECDSA是用于确保UTXO仅被转移给其合法所有者的加密数字签名。比特币中的椭圆曲线数字签名(ECDS)通常会在其末尾附加签名散列标记(SIGHASH类型)。然而,可以想到,本发明的技术可与不实现SIGHASH类型的区块链技术一起使用。在这样的区块链技术中,ECDS被构想为符合特定区块链技术的签名生成原理。
[0153] 在实施例中,SIGHASH类型是指在被串行化(例如规范化)和散列化之前从交易中提取的字段集合。例如,SIGHASH类型可以影响交易的哪些字段包含在签名中。在某些示例中,SIGHASH类型可以是SIGHASH_ALL,SIGHASH_NONE,SIGHASH_SINGLE或SIGHASH_ANYONECANPAY中的一种或多种。在一个实施例中,类型SIGHASH_ALL表征除了输入脚本之外,交易中的所有字段都将被散列和签名。在一个实施例中,类型SIGHASH_NONE表征不需要对输出进行签名,这可以允许其他人更新交易。在一个实施例中,类型SIGHASH_SINGLE表征输入被签名但是序列号被空白,因此其他人可以创建交易的新版本,但是唯一被签名的输出是与输入在相同
位置的输出。在一个实施例中,类型SIGHASH_ANYONECANPAY与其他类型组合,并表征包括SIGHASH_ANYONECANPAY的输入是已经签名的,而其他输入则不需要签署。SIGHASH类型可以由表征SIGHASH类型的值表示。例如,在一些实施中,SIGHASH_ALL由值为1的字节表示,SIGHASH_NONE由值为2的字节表示(例如,“00000010”),SIGHASH_SINGLE由值为3的字节表示(例如,“00000011”),SIGHASH_ANYONECANPAY由值为80的字节表示(例如“01010000”)。在一些实施中,通过将字节值相加在一起来组合SIGHASH类型。
[0154] 在一些示例中,由SIGHASH类型确定的交易字段集合指的是由SIGHASH类型确定的以字节编码的相应交易的子集。例如,在SIGHASH类型为SIGHASH_ANYONECANPAY的情况下,签名中仅包含一个交易输入。
[0155] 在实施例中,ECDS由以区别编码规则(DER)格式编码的一对256位数字(r,s)表示。然而,请注意,本发明的技术可与其他编码格式一起使用,例如基本编码规则(BER)或规范编码规则(CER)。ECDSA中使用的参数包括K(坐标为(x,y)的椭圆曲线点),k(256位数字;通常是随机的以保护私钥),G(顺序为n的椭圆曲线上的基点:n×G=0,其中0表示同一性椭圆曲线点),n是用作椭圆曲线有限域中的参数的大质数,r(ECDS中的256位的数字之一),s(签-1 -1
名中的256位数字中的另一个,k (k的模乘逆数,即k k≡1mod n),m(正在签名的消息/数据;在实施例中,其由散列函数调整为256位),a(私钥;例如256位的数字)。在该实施例中,以如下方式生成ECDS:
[0156] 首先,通过将k与生成器K=k×G相乘来确定椭圆曲线点K。然后,根据K确定点x,然-1后根据公式r=x mod n确定ECDS中的256位的数字中的第一个:r。然后,根据公式s=k (m+r×a)mod n确定ECDS中256位的数字中的第二个:s。最后,(r,s)以DER格式编码。在给定签名(r,s),消息/数据m和对应于私钥a的公钥A的情况下,该签名是可验证的。为了验证签名,计算v=s-1×(m×G+r×y)。如果v=r,则签名有效。
[0157] 比特币使用称为“脚本(Script)”的脚本系统。在本发明中,引用了各种脚本操作码和关键字来执行各种操作。然而,可以想到,其他区块链技术可以实现不同的指令集,因此,本发明中描述的操作码被认为是由操作码而非脚本中的特定操作码执行的操作的说明。在一些实施例中,脚本系统是图灵不完整指令集(例如,不支持循环、递归、“goto”语句等)。在其他实施例中,脚本系统是图灵完整指令集。
[0158] 本发明的某些实施例在以下假设下操作:用于实现所描述的指令集的脚本系统或其他系统在单个脚本中允许超过200条指令(例如,操作码),而这个限制在比特币的某些实施中是被禁止的。同样,本发明的某些实施例还假定由本发明所引用的操作码提供的功能在执行操作码脚本/指令集的系统中存在并启用。在比特币的某些实施中,默认情况下可以禁用或限制这些操作码中的一个或多个。
[0159] 本发明中引用的操作码的示例包括:
[0160] ·OP_ECPX:返回椭圆曲线点的x坐标
[0161] ·OP_ADD:将堆栈中的前两个项目相加
[0162] ·OP_BIGMOD:将堆栈中的前两个项目相除后返回余数
[0163] ·OP_BIGMODADD:对堆栈的前两项进行模数相加之后再将模数相加的结果对第三项取模
[0164] ·OP_BIGMODINVERSE:执行模数负指数运算
[0165] ·OP_BIGMODMUL:对堆栈的前两项进行模数相乘之后再将模数相乘的结果对第三项取模
[0166] ·OP_CAT:将堆栈中的前两个项目连接在一起
[0167] ·OP_CHECKSIG:根据SIGHASH类型,从堆栈中弹出公钥和签名,并对交易字段的签名进行验证。如果签名有效,则返回1,否则返回0。
[0168] ·OP_CHECKSIGVERIFY:其功能与OP_CHECKSIG相同,但之后执行OP_VERIFY·OP_DERENCODE:以DER格式编码堆栈中的前两个项目
[0169] ·OP_DUP:复制最上面的堆栈项
[0170] ·OP_ECPMULT:对堆栈上的前两个项目执行椭圆曲线相乘
[0171] ·OP_ELSE:如果未执行前面的OP_IF或OP_NOTIF或OP_ELSE,则将执行这些语句;否则,如果执行了前面的OP_IF或OP_NOTIF或OP_ELSE,则不执行这些语句
[0172] ·OP_ENDIF:结束if/else块
[0173] ·OP_EQUAL:如果输入完全相等,则返回1,否则返回0
[0174] ·OP_EQUALVERIFY:与OP_EQUAL相同,但之后运行OP_VERIFY
[0175] ·OP_FROMALTSTACK:将输入放置在主堆栈的顶部,并将其从备用堆栈中删除[0176] ·OP_HASH256:输入被散列两次:首先使用SHA-256,然后使用RIPEMD-160[0177] ·OP_IF:如果顶层堆栈的值不为False,则执行该语句并删除顶层堆栈的值[0178] ·OP_NOTIF:如果最高堆栈值为错误(False),则执行该语句并删除最高堆栈值[0179] ·OP_ROLL:将堆栈中n个项目深的项目移至顶部
[0180] ·OP_SUBSTR:返回字符串的一部分
[0181] ·OP_SWAP:交换堆栈中的前两个项目
[0182] ·OP_TOALTSTACK:将输入放置在备用堆栈的顶部,并将其从主堆栈中删除[0183] ·OP_VERIFY:如果顶部堆栈值不为真,则将交易标记为无效
[0184] 在实施例中,可以使用操作码来创建ECDS生成脚本,该操作码可以通过将SIGHASH字节附加到末尾来扩展以创建签名生成脚本OP_GENSIG。
[0185] 表1
[0186]
[0188] 脚本操作“OP_DUP OP_TOALTSTACK
OP_ECPMULT”的执行会使得将数字复制到备用堆栈,其中与椭圆曲线生成器相乘,以在主堆栈的顶部生成椭圆曲线点K。[0189] 脚本操作“OP_ECPXOP_BIGMOD OP_DUP OP_TOALTSTACK”的执行使r根据K mod n的x坐标进行计算。r的副本压入备用堆栈。
[0190] 脚本操作“OP_BIGMODMULOP_BIGMODADD”,“OP_FROMALTSTACK OP_SWAP OP_FROMALTSTACK”和“OP_BIGMODINVERSEOP_BIGMODMUL”的执行通过k-1(m+r×a)mod n计算出s。最后,脚本操作“OP_DERENCODE OP_SWAP OP_CAT”的执行使得r和s以DER格式编码,并与连接。
[0191] 在本发明中,该脚本称为OP_GENSIG。因此,在本发明的实施例中对OP_GENSIG的引用应视为上述脚本中执行的操作的简写。
[0192] 图4以示意图形式示出了由实施例解决的示例问题400,其中所述示例问题400与访问与基于脚本的区块链交互相关联的区块链有关。在图4中所示的示例问题400中,即交易402中的锁定脚本406(例如,结合图3描述的先前交易(例如先前交易302)或解锁交易304)不能访问区块链404。
[0193] 如所指出的,在一些实施例中,交易402是包括在区块链中的最新的,确认的交易。类似地,在一些实施例中,交易402是未来交易,其尚未被确认并且尚未包括在区块链中,并且表示对转移由先前交易控制的数字资产的至少一部分的控制的尝试。
[0194] 在一些实施例中,锁定脚本406是这样的脚本:通过指定为了传输输出而需要满足的条件来阻碍交易。更具体地,执行锁定脚本406用于:作为由区块链系统的验证节点执行的结果,从执行的解锁脚本接受数据,并基于该数据执行某些操作,并返回结果,该结果表征解锁脚本的执行是否成功“解锁”(即,满足其中设置的条件集合)锁定脚本。在一些实施例中,锁定脚本406定义了一个或多个数据约束,所述约束必须被满足(例如,通过经由解锁脚本提供的数据),以便成功进行交易的验证。例如,锁定脚本406可要求在解锁脚本中提供某些数据以解锁交易402的关联数字资产。
[0195] 如示例问题400中所示,交易402的锁定脚本406无法查询区块链404以例如确定块的数量。交易402的锁定脚本406也无法查询包括区块链404的第一区块408(也称为“初始区块”)的区块链404的区块、区块链404的内部区块(例如,区块410)中的任意一个、或区块链404的最新区块412。本文描述的方法使交易402的锁定脚本406能够查询包括第一区块408的区块链404的区块,任何内部区块(例如,区块410)、或区块链404的最新区块412。
[0196] 图5以示意图形式示出了由实施例解决的示例问题500,其中所述示例问题500与访问与基于脚本的区块链交互相关联的区块链中的区块有关。在图5中所示的示例性问题500中,即交易502(例如,先前的交易,例如结合图3描述的先前交易302;或解锁交易,例如结合图3描述的解锁交易304)中的锁定脚本506不能访问区块链中的区块,例如区块504(即,第一块、内部块、或最新块)。
[0197] 如所指出的,在一些实施例中,交易502是包括在区块链中的最新的、确认的交易。类似地,在一些实施例中,交易502是未来交易,其尚未被确认并且尚未被包括在区块链中,并且表示对转移对由先前交易控制的数字资产的至少一部分的控制的尝试。
[0198] 在一些实施例中,锁定脚本506是这样的脚本:通过指定如本文所述为了传输输出而需要满足的条件来阻碍交易。如示例问题500中所示,交易502的锁定脚本506无法查询区块链的区块504,从而例如确定交易的数量或访问特定交易。如示例问题500中所示,交易502的锁定脚本506无法查询区块链的区块504,无法查询区块504的区块头508,并且无法查询区块504的交易510。在区块504包括交易502(表示为区块504的交易510中的交易Txi
512)的实施例中,交易502的锁定脚本506也不能查询交易Txi 512(例如,无法查询包含锁定脚本506的交易)。本文所述的方法使交易502的锁定脚本506能够查询区块链的区块504,查询区块504的区块头508,查询区块504的交易510,以及查询区块504的交易510中的交易Txi 512(例如,使锁定脚本能够查询包含锁定脚本506的交易)。
[0199] 图6以示意图形式示出了根据实施例的示例环境600,其中数据被验证为区块头,所述区块头用于基于脚本的区块链交互。区块头是区块链的区块的一部分,所述区块链包含有关区块的数据。例如,区块头602是80字节的数据,前4个字节存储区块链实施的版本(“nVersion”),接下来的32个字节(或256位)存储区块链先前区块的散列(“HashPrevBlock”),接下来的32个字节存储该区块的交易的默克尔(Merkle)树的散列(“HashMerkleRoot”,本文对此进行了详细说明),接下来的4个字节存储该区块的创建时间(“nTime”),接下来的4个字节存储该区块的32位难度值(“nBits”),最后4个字节存储该区块的随机
种子(“nNonce”)。
[0200] 可以观察到,如果区块头602是用作锁定脚本的输入的数据(例如,作为解锁脚本而提供),则通过将区块头602上的约束编码为锁定脚本,解锁脚本数据必须包含有效的区块头,否则其将不是有效的解锁脚本。对区块头例如区块头602的三个约束是:i)80字节长;ii)区块头的nBits字段必须大于或等于某个难度值;iii)区块头的双SHA256必须小于或等于难度值。这些约束中的每一个在本文中被示为单独的脚本,为了便于图示,省略了链接脚本的细节(例如,分支约束和维护堆栈)。
[0201] 当这三个脚本与省略的链接脚本详细信息结合在一起时,会形成一个单独的脚本,这是一个OP_CHECKBLOCKVERIFY脚本的示例,用于验证解锁脚本中的是有效的区块头。在所示的示例中,三个脚本返回真(true)或假(false),但是作为单个脚本链接在一起以生成OP_CHECKBLOCKVERIFY脚本时,通常会将OP_VERIFY添加到每个脚本的末尾。可以想到,OP_CHECKBLOCKVERIFY脚本的其他实施可以实现,并且可以视为在本发明的范围内。
[0202] 在步骤604中,提供所谓的区块头作为解锁脚本,表示为。
[0203] 在步骤606,执行第一脚本,该脚本验证的大小是80字节(例如,第一约束)。表2示出了验证的大小为80字节的第一个脚本。
[0204] 表2
[0205]
[0206] 在步骤608中,执行第二脚本,其验证区块头的“nBits”字段大于或等于区块链难度值。表3示出了验证区块头的“nBits”字段大于或等于区块链难度值的第二个脚本。应注意,表3中所示脚本的难度值“<0x1D00FFFF>”是基于比特币规范的最低难度。在实施例中,难度值用作解锁脚本的数据项。在实施例中,较高的难度值(例如,大于0x1D00FFF的值)被用作目标难度。在实施例中,较低的难度值(例如,小于0x1D00FFF的值)被用作目标难度。
[0207] 表3
[0208]
[0209] 在步骤610中,执行第三脚本,该脚本验证区块头的双SHA256(如上所述,由操作码OP_HASH256实现)小于或等于表征的难度值。表4示出了第三个脚本,该脚本验证了区块头的双SHA256小于或等于表征的难度值。表4中示出的第三个脚本引入了两个附加操作码:
[0210] ·OP_LBYTESHIFT:对任意大小的数据执行左字节移位
[0211] ·OP_BIGLESSTHANOREQUAL:将任意大小的数据解释为数字,并比较两个数字以确定第一个数字是否小于或等于第二个数字
[0212] 表4
[0213]
[0214] 图7以流程图形式示出了根据实施例的示例过程700,所述示例过程用于验证数据是基于脚本的区块链交互中的区块头。过程700中的部分或全部可以在配置有可执行指令和/或其他数据的一个或多个计算机系统的控制下执行,并且可以实现为在一个或多个处理器上共同执行的可执行指令。可执行指令和/或其他数据可以存储在非暂时性计算机可读存储介质上(例如,计算机程序永久存储在磁、光、或闪存介质上)。示例过程700可以由区块链网络的结合图1描述的节点102之一之类的节点执行,区块链网络例如结合图1描述的区块链网络100。也就是说,节点如结合图1所描述的节点102之一可执行示例过程700,用于验证数据是结合图7描述的基于脚本的区块链交互中的区块头。这样的节点可以由任何合适的计算设备组成(例如,由
数据中心中的服务器组成,由客户端计算设备组成,由计算资源服务提供商的分布式系统中的多个计算设备组成,或由任何合适的电子客户端设备例如结合图2描述的计算设备200组成)。
[0215] 在示例过程700的步骤702中,系统接收。在示例过程700的步骤704中,系统如上所述结合图6开始OP_CHECKBLOCKVERIFY脚本。在示例过程700的步骤706中,系统通过执行例如上文表2中所示的脚本来验证的大小为80字节。在示例过程700的步骤708中,确定先前的脚本(例如,以上表2中所示的脚本)是否通过。
[0216] 如果在示例过程700的步骤708中确定先前的脚本没有通过,则在示例过程700的步骤718中,不是有效的区块头,并且锁定脚本解锁失败。
[0217] 如果在示例过程700的步骤708中确定先前的脚本确实通过了,则在示例过程700的步骤710中,系统通过执行例如上文表3中所示的脚本来验证的“nBits”字段大于或等于区块链难度。在示例过程700的步骤712中,确定先前的脚本(例如,上文表3中所示的脚本)是否通过。
[0218] 如果在示例过程700的步骤712中确定先前的脚本没有通过,则在示例过程700的步骤718中,不是有效的区块头,并且锁定脚本解锁失败。
[0219] 如果在示例过程700的步骤712中确定先前的脚本确实通过了,则在示例过程700的步骤714中,系统通过执行例如上文表4中所示的脚本来验证的SHA256小于或等于所需目标。在示例过程700的步骤716中,确定先前脚本(例如,上文表4中所示的脚本)是否通过。
[0220] 如果在示例过程700的步骤716中确定先前的脚本未通过,则在示例过程700的步骤718中,不是有效的区块头,并且锁定脚本解锁失败。
[0221] 如果在示例过程700的步骤716中确定先前的脚本确实通过了,则在示例过程700的步骤720中,是有效区块头,并且锁定脚本解锁成功。
[0222] 注意,在图7中示出的示例过程700中执行的一个或多个操作可以以各种顺序(包括并行)和组合来执行。
[0223] 图8以示意图形式示出了根据实施例的示例环境800,其中数据验证为用于基于脚本的区块链交互的先前区块的区块头。如本文所述,区块头是区块链的区块的一部分,该区块链包含有关该区块的数据。区块头的一部分是先前区块头(“HashPrevBlock”)的散列。如果将第一区块头作为输入提供给锁定脚本(例如,作为解锁脚本的一部分提供),并且所谓针对区块链中下一区块的第二区块头也作为输入提供给锁定脚本(例如,作为解锁脚本的一部分而提供),那么通过对第一区块头的散列是解锁脚本中的第二区块的HashPrevBlock的约束进行编码,如果第一区块头的散列不是第二区块的HashPrevBlock,那么两个区块头将不是有效的解锁脚本。
[0224] 在步骤804中,提供第一区块头802作为解锁脚本的数据(表示为),并且在步骤810中,提供第二区块头808作为如下所示用于解锁脚本的数据(表示为)。在步骤806中,脚本(例如以上结合图6和图7所描述的OP_CHECKBLOCKVERIFY脚本)用于验证是区块头。在步骤812中,脚本(例如以上结合图6和图7所描述的OP_
CHECKBLOCKVERIFY脚本)用于验证是区块头。
[0225] 在步骤814中,执行脚本以验证第一区块头的双SHA256等于第二块头的HashPrevBlock字段。表5中示出了一个脚本的示例,该脚本验证了第一区块头的双SHA256等于第二区块头的HashPrevBlock字段。表5中所示的脚本是OP_CHECKCHAINVERIFY脚本的示例,用以验证是紧接在之前的有效区块。可以想到,OP_CHECKCHAINVERIFY脚本的其他实施方式可以实现,并且可以将其视为在本发明的范围内。应注意,表5中示出的OP_CHECKCHAINVERIFY脚本的最终操作码是OP_EQUAL,因为执行后“true”值应该在堆栈上保留。在将OP_CHECKCHAINVERIFY脚本与其他脚本结合使用的实施例中,该脚本的最终OP_EQUAL操作码更改为OP_EQUALVERIFY操作码。
[0226] 表5
[0227]
[0228]
[0229] 图9以流程图形式示出了根据实施例的示例过程900,所述示例过程用于验证数据是基于脚本的区块链交互中的先前区块的区块头。过程900的部分或全部可以在配置有可执行指令和/或其他数据的一个或多个计算机系统的控制下执行,并且可以实现为在一个或多个处理器上共同执行的可执行指令。可执行指令和/或其他数据可以存储在非暂时性计算机可读存储介质上(例如,计算机程序永久存储在磁、光或闪存介质上)。示例过程900可以由节点例如结合图1描述的区块链网络的节点102之一执行,区块链网络例如为结合图1描述的区块链网络100。也就是说,节点例如结合图1所描述的节点102之一可执行示例过程900,所述示例过程用于验证数据是结合图9所述的基于脚本的区块链交互中的先前块的区块头。这样的节点可以由任何合适的计算设备组成(例如,由数据中心中的服务器组成,由客户端计算设备组成,由计算资源服务提供商的分布式系统中的多个计算设备组成,或由任何合适的电子客户端设备(例如结合图2描述的计算设备200)组成)。
[0230] 在示例过程900的步骤902中,系统接收和,这是两个所谓的区块头。在示例过程900的步骤904中,系统如上述结合图8开始对和进行OP_CHECKCHAINVERIFY过程。在示例过程900的步骤906中,系统如上文结合图6和图7通过对执行OP_CHECKCHAINVERIFY脚本来验证是区块头。
[0231] 在示例过程900的步骤908中,确定先前的脚本(例如,上的OP_CHECKBLOCKVERIFY脚本)是否通过(即,OP_CHECKBLOCKVERIFY脚本返回了真(true))。如果在示例过程900的步骤908中确定先前的脚本没有通过,则在示例过程900的步骤910中,不是有效的区块头,并且在示例过程900的步骤922中,不是的先前区块,因此锁定脚本的解锁失败。
[0232] 如果在示例过程900的步骤908中确定先前脚本确实通过了,则在示例过程900的步骤912中,系统如上所述结合图6和图7通过执行OP_CHECKBLOCKVERIFY脚本来验证是区块头。
[0233] 在示例过程900的步骤914中,确定先前的脚本(例如,上的OP_CHECKBLOCKVERIFY脚本)是否通过(即,OP_CHECKBLOCKVERIFY脚本返回了真(true))。如果在示例过程900的步骤914中确定先前的脚本未通过,则在示例过程900的步骤916中,2>不是有效的区块头,并且在示例过程900的步骤922中,不是的先前区块,因此锁定脚本的解锁失败。
[0234] 如果在示例过程900的步骤914中确定先前的脚本确实通过了,则在示例过程900的步骤918中,系统验证的双SHA256等于的“HashPrevBlock”字段。
[0235] 在示例过程900的步骤920中,确定的双SHA256是否等于的“HashPrevBlock”字段。如果在示例过程900的步骤920中确定的双SHA256不等于的“HashPrevBlock”字段,则在示例过程900的步骤922中,不是的先前区块,因此锁定脚本解锁失败。
[0236] 如果在示例过程900的步骤920中确定的双SHA256等于的“HashPrevBlock”字段,则在示例过程900的步骤924中,是的先前区块,因此锁定脚本的解锁成功。
[0237] 注意,在图9中示出的示例过程900中执行的一个或多个操作可以以各种顺序(包括并行)和组合执行。
[0238] 图10以示意图的形式示出了根据实施例的示例环境1000,其中数据验证为用于基于脚本的区块链交互的区块头链。图10示出的示例环境1000是结合图8和图9描述的操作的扩展。在图10中示出的示例环境1000中,将区块头链1010(即,区块头的链)的第一区块头1002的双SHA256与区块头链1010的第二区块头1004的HashPrevBlock进行比较,将区块头链1010的第二区块头1004的双SHA256与区块头链1010的第三区块头1006的HashPrevBlock进行比较,依此类推,直到将区块头链1010的倒数第二个区块(未示出)的双SHA256与区块头链1010的最后一个区块头1008的HashPrevBlock进行比较。
[0239] 示例环境1000示出了通过对每对区块重复表5中所示的脚本,可以将表5中所示的OP_CHECKCHAINVERIFY脚本概括为附加的块。这样的脚本在本文中称为OP_CHECKBLOCKCHAINVERIFY。
[0240] 例如,OP_CHECKBLOCKCHAINVERIFY脚本可以将区块头链中的多个区块头和区块头链的区块头作为输入参数,并重复执行OP_CHECKCHAINVERIFY。表6示出了一个示例,说明如何使用此脚本来验证六个区块头的链。
[0241] 表6
[0242]
[0243] 表7示出了OP_CHECKBLOCKCHAINVERIFY的实施示例,该实施对大量区块重复OP_CHECKCHAINVERIFY的操作。在表7中所示的OP_CHECKBLOCKCHAINVERIFY的示例实施中,重复该部分以
覆盖范围的值,该部分在区块头中循环(例如,区块头循环次)且对每对区块头执行OP_CHECKCHAINVERIFY操作,通过使用alt堆栈来保存和维护顺序。[0244] 表7
[0245]
[0246]
[0247] 图11以流程图形式示出了根据实施例的示例过程1100,所述示例过程用于验证数据是基于脚本的区块链交互中的区块头链。过程1100的部分或全部可以在配置有可执行指令和/或其他数据的一个或多个计算机系统的控制下执行,并且可以实现为在一个或多个处理器上共同执行的可执行指令。可执行指令和/或其他数据可以存储在非暂时性计算机可读存储介质上(例如,计算机程序永久存储在磁、光、或闪存介质上)。示例过程1100可以由节点例如区块链网络的结合图1描述的节点102之一执行,区块链网络例如为结合图1描述的区块链网络100。也就是说,节点如结合图1所描述的节点102之一可执行示例过程1100,用于验证数据是结合图11描述的基于脚本的区块链交互中的区块头链。这样的节点可以由任何合适的计算设备组成(例如,由数据中心中的服务器组成,由客户端计算设备组成,由计算资源服务提供商的分布式系统中的多个计算设备组成,或由任何合适的电子客户端设备例如结合图2描述的计算设备200组成)。
[0248] 在示例过程1100的步骤1102中,系统接收有序数据集合,即至。在示例过程1100的步骤1104中,系统如上文结合图10所描述的,对所述有序数据集合开始OP_CHECKBLOCKCHAINVERIFY脚本。
[0249] 在示例过程1100的步骤1106中,系统至少部分地基于有序数据集合的顺序,从有序数据集合中选择第一数据项(例如,
)。在示例过程1100的步骤1108中,系统至少部分地基于有序数据集合的顺序,从有序数据集合中选择第二数据项(例如,)。在实施例中,系统使用例如上文结合图6和图7描述的OP_CHECKBLOCKVERIFY脚本来验证第一数据项和第二数据项是有效区块头。[0250] 在示例过程1100的步骤1110中,系统通过对第一数据项和第二数据项执行OP_CHECKCHAINVERIFY来验证第一数据项是第二数据项的先前区块,如表5中结合图8至图9所示。
[0251] 在示例过程1100的步骤1112中,确定第一数据项和第二数据项上的OP_CHECKCHAINVERIFY脚本是否通过(即,第一数据项是否是第二数据项中的区块头的先前区块头)。
[0252] 如果在示例过程1100的步骤1112中确定第一数据项和第二数据项上的OP_CHECKCHAINVERIFY脚本没有通过,则在示例过程1100的步骤1114中,第一数据项不是第二数据项中的区块头的先前区块头,并且在示例过程1100的步骤1116中,数据的有序集合不是有效的区块头链。
[0253] 如果在示例过程1100的步骤1112中确定第一数据项和第二数据项上的OP_CHECKCHAINVERIFY脚本确实通过了,则在示例过程1100的步骤1118中,确定在有序数据集合中是否存在更多数据。
[0254] 如果在示例过程1100的步骤1118中确定有序数据集合中存在更多数据,则在示例过程1100的步骤1120中,第二数据项成为示例过程1100中的第一数据项,在示例过程1100的步骤1122中,至少部分地基于数据顺序从有序数据集合中选择新的第二数据项,并且在示例过程1100的步骤1110中,如表5中所示和结合图8和图9所描述的,系统通过对新的第一数据项和新的第二数据项执行OP_CHECKCHAINVERIFY来验证新的第一数据项是新的第二数据项的先前区块。
[0255] 如果在示例过程1100的步骤1118中确定在有序数据集合中没有更多数据,则在示例过程1100的步骤1124中,有序数据集合是有效的区块头链。
[0256] 注意,在图11中示出的示例过程1100中执行的一个或多个操作可以以各种顺序(包括并行地)和组合来执行。
[0257] 图12以示意图形式示出了根据实施例的示例环境1200,该示例环境1200示出了可在基于脚本的区块链交互中使用的区块头的默克尔树(Merkle tree)。默克尔树(也称为“二进制散列树”)是一种数据结构,用于验证区块中的交易集合。默克尔树是包含交易的加密散列的二叉树。但是,通过对数据进行重复散列和连接,可以将默克尔树存储为单个散列值(例如,单个32字节或256位值)。
[0258] 在示例环境1200中,通过以下方式生成默克尔树1204:i)计算区块的每个交易的散列;ii)选择一对散列并将它们连接在一起;iii)计算连接值的散列;iv)在树的连续更高级别上重复该过程,直到产生最终的散列值(“默克尔根”)为止。然后,将该默克尔根作为“HashMerkleRoot”值插入到区块头中。
[0259] 例如,从交易1206开始,计算该交易的散列1208。如本文所使用的,交易1206将称为TA,交易1206的散列1208将称为H(TA)。类似地,交易1210(TB)具有散列1212H(TB)。为了产生散列1216,在散列1214之前,将左值与右值连接起来,因此散列1216是H(H(TA)+H(TB)),其中“+”运算符在这种情况下是超载的,表示连接(例如,如果H(TA)为“1234”,H(TB)为“5678”,则H(TA)+H(TB)为“12345678”,H(H(TA)+H(TB))是“12345678”的散列。
[0260] 示例环境1200还示出了默克尔分支,该默克尔分支是默克尔树中的节点集合,其与默克尔根组合,可用于验证用于特定叶节点(即,特定交易)的数据在默克尔树中。在给定默克尔根和默克尔分支的情况下,可以以下方式验证默克尔树中给定交易(例如,交易1218)的存在。首先,计算交易的散列1220。然后,计算默克尔树中下一级的散列1224。然而,如上所述,在默克尔树的下一级的散列1224需要另一交易(例如,作为默克尔树中的交易
1218的伙伴交易)的散列1222。该散列1222是默克尔分支中的第一节点。
[0261] 在给定散列1224的情况下,计算在默克尔树的下一级的散列1226。该计算需要默克尔树的其他交易(例如,另一分支)的散列1216。该散列1216是默克尔分支中的第二节点。可以想到,在默克尔树的每个级别上,默克尔分支需要在树的“其它”分支中的交易组合的散列。因此,假设散列1230的左分支是包含交易1218(可以计算为上述所述的)的分支,则要计算散列1230,需要右分支的散列1228(默克尔分支中的另一个节点)。最后,为了计算默克尔根,需要默克尔树的整个右侧的散列1232。可以用来验证交易1218在默克尔树1204中的默克尔分支是散列1230,散列1228,散列1216和散列1222。由于树的深度为4,因此四个节点位于默克树中。应注意,默克尔树的深度取决于区块中的交易数,并且是交易数的log2(即,对于512个交易,树的深度为9,用于验证默克尔分支的节点有9个节点,对于1024个交易,树的深度为10,验证节点的默克尔分支具有10个节点,对于2048个交易,树的深度为11,验证节点的默克尔分支具有为11节点,等等)。例如,如果一个比特币区块中每个区块的平均交易数约为2000,则典型的区块的默克尔树的深度为11。
[0262] 图13以示意图形式示出了根据实施例的示例环境1300,其中交易验证为包括在用于基于脚本的区块链交互的区块头中。如本文所述,区块头是区块链的区块的一部分,该区块链包含有关该区块的数据。区块头的一部分是默克尔树的默克尔根(“HashMerkleRoot”),所述默克尔树可用于验证区块中的交易。如果提供区块头作为锁定脚本的输入(例如,提供作为解锁脚本),以及用于交易和该交易的默克尔分支,则可以编码约束(所述约束为:区块头的HashMerkleRoot与从默克尔分支和交易计算出的默克尔根相同),如果区块头的HashMerkleRoot与计算出的默克尔根不同,则区块头、默克尔分支和交易将不是有效的解锁脚本。
[0263] 在步骤1304中,提供第一区块头1302作为用于解锁脚本的数据(表示为)。在步骤1306中,脚本例如上文结合图6和图7所述的OP_CHECKBLOCKVERIFY脚本用于验证是区块头。在步骤1308,从有效区块头中提取HashMerkleRoot。
[0264] 在步骤1312中,提供默克尔分支1310作为用于解锁脚本的数据(表示为)。默克尔分支1310可以是大约10、11或12个节点,以编码格式提供,该编码格式表征特定节点是如本文所述的连接操作的左输入还是连接操作的右输入,尽管本文未示出。
[0265] 表8示出了OP_CALCMERKLEROOT的示例实施,其中以编码格式提供默克尔分支1310,该编码格式包括对,,,,...,,和值,其中表示对集合中有多少对,每个是默克尔树中某个值的散列,每个是一个值(例如
0或1),该值表征是左连接还是右连接。在表8所示的OP_CALCMERKLEROOT的示例实施中,中的值1表征左侧连接,而中的值0表征右侧连接。
[0266] 表8
[0267]
[0268]
[0269] 在步骤1316中,提供交易1314作为用于解锁脚本的数据(表示为)。在步骤1318中,使用OP_CALCMERKLEROOT脚本(在此未示出)从默克尔根和交易计算默克尔根。
[0270] 在步骤1320中,执行脚本以验证从提取的HashMerkleRoot与对和执行的由OP_CALCMERKLEROOT脚本计算出的默克尔根相等。表9显示了一个脚本示例,该脚本验证了从提取的HashMerkleRoot与由和计算出的默克尔根相同。表9中显示的脚本是OP_CHECKBLOCKTXVERIFY脚本的一个示例,使用的默克尔分支验证区块头的区块包含的交易。可以想到,OP_CHECKBLOCKTXVERIFY脚本的其他实施可以实现,并且可以视为在本发明的范围内。在表9所示的OP_CHECKBLOCKTXVERIFY脚本中,为了便于说明,省略了OP_CHECKBLOCKVERIFY操作。
[0271] 表9
[0272]
[0273] 图14以流程图形式示出了根据实施例的示例过程,所述示例过程用于验证交易包括在基于脚本的区块链交互的区块头中。处理1400的部分或全部可以在配置有可执行指令和/或其他数据的一个或多个计算机系统的控制下执行,并且可以实现为在一个或多个处理器上共同执行的可执行指令。可执行指令和/或其他数据可以存储在非暂时性计算机可读存储介质上(例如,计算机程序永久存储在磁、光、或闪存介质上)。示例过程1400可以由节点例如区块链网络的结合图1描述的节点102之一执行,区块链网络例如为结合图1描述的区块链网络100。也就是说,节点如结合图1所描述的节点102之一可执行示例过程1400,用于验证结合图14描述的基于脚本的区块链交互中的区块头中包括交易。这样的节点可以由任何合适的计算设备组成(例如,由数据中心中的服务器组成,由客户端计算设备组成,由计算资源服务提供商的分布式系统中的多个计算设备组成,或由任何合适的电子客户端设备例如结合图2描述的计算设备200组成)。
[0274] 在示例过程1400的步骤1402中,如上文结合图13所描述,系统接收,和。在示例过程1400的步骤1402中,也如上文结合图13所述,系统对,和执行OP_CHECKBLOCKTXVERIFY脚本。
[0275] 在示例过程1400的步骤1406中,如上文结合图6和图7所述,系统使用例如OP_CHECKBLOCKVERIFY脚本来验证是有效区块头。
[0276] 在示例过程1400的步骤1408中,确定上的OP_CHECKBLOCKVERIFY脚本是否通过。如果在示例过程1400的步骤1408中确定上的OP_CHECKBLOCKVERIFY脚本未通过,则在示例过程1400的步骤1410中,不是有效的区块头,并且在示例过程1400的步骤1412中,的交易被验证不在具有区块头的区块中。
[0277] 如果在示例过程1400的步骤1408中确定上的OP_CHECKBLOCKVERIFY脚本确实通过了,则在示例过程1400的步骤1414中,如上文结合图13所述,系统从中提取HashMerkleRoot字段。在示例过程1400的步骤1416中,也如上文结合同13所述,系统从和计算默克尔根。
[0278] 在示例过程1400的步骤1418中,也如上文结合图13所述,系统验证从提取的HashMerkleRoot等于从和计算出的默克尔根。
[0279] 在示例过程1400的步骤1420中,确定从提取的HashMerkleRoot是否等于从和计算出的默克尔根。在示例过程1400的步骤1420中,如果确定从提取的HashMerkleRoot不等于从和计算的默克尔根,则在示例过程1400的步骤1412,的交易被验证不在带有区块头的区块中。
[0280] 在示例过程1400的步骤1420中,如果确定从提取的HashMerkleRoot确实等于从和计算出的默克尔根,则在示例过程1400的步骤1422中,的交易被验证在带有区块头的区块中。
[0281] 注意,在图14中示出的示例过程1400中执行的一个或多个操作可以以各种顺序(包括并行地)和组合来执行。
[0282] 图15以示意图形式示出了根据实施例的示例环境1500,示出了如何使用本文所述的方法来解决访问与基于脚本的区块链交互相关联的区块链的问题。在示例环境1500中,交易1502(例如结合图3所述的先前交易,如先前交易302或解锁交易304)中的锁定脚本1506能够使用一个或多个结合图6-14所述的方法来查询区块链1504。这与结合图4所述的示例问题400相反。类似地,在示例环境1500中,交易1502中的锁定脚本1506能够使用结合图6至图14所述的一种或多种方法来查询区块链1504的区块1508。这与结合图5所述的示例问题500相反。在实施例中,区块1508的交易1510与交易1502相同(例如,为交易Txi)。
[0283] 图16以示意图形式示出了根据实施例的示例环境1600,示出了与基于脚本的区块链交互相关联的区块链的状态。区块链包含自区块链产生以来的所有区块。在示例环境1600中,区块链1602的第一区块1604的区块头是最小nTime(例如,最早或时间最前)的区块链1602的状态1606的记录。使用本文中描述的方法,交易的锁定脚本可以查询区块链1602,可以查询第一区块1604,并且因此可以在最低nTime查询区块链1602的状态1606。使用本文中描述的方法,交易的锁定脚本可以查询区块链1602,可以查询区块链1602的区块1608(可以是包含交易的区块),因此可以查询在区块的nTime的区块链1602的状态1610。使用本文描述的方法,交易的锁定脚本可以查询区块链1602,可以查询区块链1602的最新区块1612,并且因此可以在最新区块的nTime查询区块链1602的状态1614(例如,可以查询区块链的当前状态)。这种状态查询的使用在图17和图18中进行了详细描述。
[0284] 图17以示意图形式示出了根据实施例的示例环境1700,在所述环境中,在基于脚本的区块链交互中确认了区块链的状态。如本文所述,区块头是区块链的区块的一部分,该区块链包含有关该区块的数据。区块头的一部分是默克尔树的默克尔根(“HashMerkleRoot”),所述默克尔树可用于验证区块中的交易。如果提供区块头作为锁定脚本的输入(例如,提供作为解锁脚本),以及用于交易和该交易的默克尔分支,则可以编码约束(所述约束为:区块头的HashMerkleRoot与从默克尔分支和交易计算出的默克尔根相同),如果区块头的HashMerkleRoot与计算出的默克尔根不同,则区块头、默克尔分支和交易将不是有效的解锁脚本。
[0285] 在实施例中,检查区块链的状态和/或确认区块链的状态包括检查区块链的其他方面,包括但不限于,检查区块链的一个或多个区块的区块头,检查区块链的一个或多个区块之间的关系,检查区块链的区块数量,检查区块链的单个区块中的一个或多个交易,或检查区块链的多个区块中的多个交易。
[0286] 在步骤1708中,提供区块头1706作为用于解锁脚本的数据(表示为<数据1>)。在一个实施例中,脚本例如以上结合图6和图7描述的OP_CHECKBLOCKVERIFY脚本用于验证是一个区块头。在步骤1712中,如以上结合图13至图14所述,提供默克尔分支1710作为用于解锁脚本的数据(表示为)。在步骤1716中,提供交易1714作为用于解锁脚本的数据(表示为<数据3>)。在一个实施例中,如上文结合图13和14所述,使用OP_
CALCMERKLEROOT脚本从默克尔根和交易计算默克尔根。
[0287] 在步骤1718中,执行OP_CHECKBLOCKTXVERIFY脚本以验证从提取的HashMerkleRoot与从上文表9所示对和执行的OP_CALCMERKLEROOT脚本计算的默克尔根相同。
[0288] 应注意,根据实施例,步骤1718示出了可以在例如示例环境1700之类的环境中执行的脚本类型的示例,其中在基于脚本的区块链交互中确认了区块链的状态。步骤1718示出了第一约束集合,其使得使用操作码将来自区块链的数据集合注入到交易中。在实施例中,如本文所述,OP_CHECKBLOCKVERIFY用于验证数据集合包括区块头。在实施例中,OP_CHECKBLOCKTXVERIFY(即,如步骤1718所示)用于验证该数据集合包括交易,并且该交易包括在区块头中。可以想到,在本文描述的第一约束集合中的约束的示例是说明性示例,第一约束集合中的其他类型的约束可以视为在本发明的范围内。下文关于步骤1722对第二约束集合进行描述。
[0289] 在示例环境1700中,在步骤1704中,脚本用于验证区块头
是作为公共区块链的一部分的区块的区块头,而不是如上所述通过使用验证脚本(例如OP_CHECKBLOCKCHAINVERIFY)专门为模拟该公共区块链的区块而建立的区块。在实施例中,脚本用于验证区块头是作为公共区块链的一部分的区块的区块头,可以将区块链
1702或如上文所述完整或部分区块头链提供给所述公共区块链。
[0290] 在示例环境1700中,在步骤1722中,使用脚本来验证交易的其他方面。在步骤1720中,在步骤1722中将交易1714提供为用于解锁脚本的数据(表示为)。应注意,在一些实施例中,步骤1720中的交易<数据3>是步骤1716中的交易的副本,此时,例如,步骤1718中的OP_CHECKBLOCKTXVERIFY脚本执行步骤1716中的交易。
[0291] 与上述步骤1718所示,应该注意的是,步骤1722示出了可以在例如示例环境1700之类的环境中执行的脚本类型的示例,在该环境中,根据实施例,在基于脚本的区块链交互中确认了区块链的状态。如上文结合步骤1718所述,步骤1722示出了第二约束集合,其与来自区块链的数据集合相关联,所述区块链被使用操作码注入到交易中。在实施例中,第二约束集合包括关于该数据集合的数据项的值的约束(即,包括该数据集合的数据项例如小于、等于或大于该值的约束)。在一个实施例中,第二约束集合包括根据数据确定的约束(例如,如果与区块头相关联的区块中的交易数大于100,则执行“A”,否则,执行“B”)。可以想到,本文描述的第二约束集合中的约束的示例是说明性示例,可以认为第二约束集合中的其他类型的约束在本发明的范围内。
[0292] 如果在步骤1704中用于验证区块头是区块(所述区块是公共区块链的一部分,而不是专门用来模拟公共区块链的区块的区块)的区块头的脚本通过了,则在步骤1718中,OP_CHECKBLOCKTXVERIFY脚本验证从提取的HashMerkleRoot与从对2>和执行的OP_CALCMERKLEROOT脚本计算的默克尔根相同,并且在步骤1722中,用于验证交易的其他方面的脚本通过了,然后在步骤1724中锁定脚本成功。在实施例中,步骤
1704说明第三约束集合,这些约束与来自使用操作码注入到交易中的区块链的数据集合相关联(例如,约束是:该区块是公共区块链的区块)。
[0293] 应注意,如上所述,在步骤1722中,用于验证交易的其他方面的脚本包括第二约束集合的约束,该第二约束集合与使用操作码来自注入到交易中的区块链的数据集合相关联。这样,在实施例中,第二约束集合包括交易的多个方面的验证,包括但不限于受让方、转让方、交易的金额或交易的其他方面。另外,应注意,在步骤1722中,用于验证交易的其他方面的脚本可包括区块链的各方面,区块头链的各方面,区块的各方面或区块
链环境的其他方面。例如,在步骤1722中,用于验证交易的其他方面并且包括第二约束集合的约束的脚本可包括以下用途的约束:验证区块的nTime,验证区块中的多个交易,确定两个区块之间经过的时间量,确定最小区块高度,或确定区块链环境的其他此类方面。还应注意,通过在脚本的末尾不包括“验证”操作码(该脚本用于验证步骤1722的交易的其他方面),可以引入分支条件(例如,如果区块中的交易有1000多个,爱丽丝(Alice)可以解锁;如果区块中的交易不超过1000个,则鲍勃(Bob)可以解锁)。分支条件的示例在下文结合图30更详细地描述。
[0294] 与步骤1704(所述脚本用于验证区块头是作为公共区块链的一部分的区块的区块头而不是专门为模拟该公共区块链的区块而建立的区块)相关的一个问题是,在一些实施例中,从计算上来说,创建一个专门模拟公共区块链的区块的区块可以相当容易。考虑例如表10的锁定脚本,该锁定脚本要求解锁脚本中的数据包括区块头(例如,解锁脚本可以不仅仅包括区块头)。
[0295] 表10
[0296]
[0297] 在比特币的实施中,如果将难度(nBits)设置为最小值,则数据可以是公共区块链中一个区块的区块头,但是也可以是完全不相关的区块,因为该数据不需要大量计算能力以最小的难度生成区块。为了防止这种做法,锁定脚本创建者应使对锁定脚本的约束足够困难,以使创建模仿公共区块链的替代区块链所需的计算能力的成本远大于可以解锁的价值。在比特币中,这可以通过增加难度(例如,在表3中所示并结合图6和7所描述的脚本的难度)或通过要求较长的区块头链(例如,在表6中所示的和结合图10和11所描述的脚本中的区块头链)来实现。
[0298] 表11示出了脚本的示例,该脚本用于验证步骤1724中的交易的其他方面,(即,确定是否满足第二约束集合和/或第一约束集合的方面)。在用于验证表11中所示交易的其他方面的示例脚本中,数据
被约束为包含交易的区块头,并且该交易已支付给鲍勃的公钥。应当注意,出于说明目的,这里省略了“
该功能需要专业版企业版VIP权限,您可以:
您也可以联系官方QQ: 2157717237 电话: 13264338900