一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

在区块链上存储程序的制作方法

2022-04-25 05:12:40 来源:中国专利 TAG:


1.本公开涉及一种文件格式,用于在区块链的交易中存储可运行程序以及从中发起此等程序。


背景技术:

2.区块链是指一种分布式数据结构形式,其中在点对点(p2p)网络中的多个节点中的每个节点处维护区块链副本。区块链包括一系列数据区块,其中每个区块包括一笔或多笔交易。每笔交易都可以回指序列中的先前交易,其可以扩展一个或更多区块。交易可以通过提交到网络包括在新区块中。新区块的创建过程称为“挖掘”,该过程涉及多个挖掘节点中的每个挖掘节点争相执行“工作量证明”,即基于等待包括在区块中的未决交易池解决加密难题。
3.网络中的每个节点可以具有以下三个角色中的任何一个、两个或全部:转发、挖掘和存储。转发节点在整个网络节点中传播交易。挖掘节点将交易挖掘到区块中。存储节点各自对区块链中的已挖掘区块存储自己的副本。为了将交易记录在区块链中,一方将该交易发送到网络中的节点中的一个节点进行传播。接收该交易的挖掘节点可以争相将该交易挖掘到新区块中。每个节点被配置为遵守相同的节点协议,该协议将包括用于确认交易有效的一个或更多个条件。无效交易将不会传播或挖掘到区块中。假定交易已经核实有效,从而在区块链上被接受,则该交易(包括任何用户数据)将因此作为不可改变的公共记录,继续存储在p2p网络中的各个节点处。
4.成功解决工作量证明难题以创建最新区块的矿工通常被奖励一笔称为“区块创始交易”的新交易,该交易会生成新的数字资产金额。工作量证明激励矿工不要欺骗系统,在他们的区块中包括双重花费交易,因为挖掘区块需要大量计算资源,而包括试图双重花费的区块很可能不会被其他节点接受。
5.在“基于输出的”模型(有时称为基于utxo的模型)中,给定交易的数据结构包括一个或更多个输入和一个或更多个输出。任何可花费输出包括指定数字资产金额的元素,有时称为utxo(“未花费的交易输出”)。该输出还可以包括指定用于赎回该输出的条件的锁定脚本。每个输入包括指向先前交易中的此类输出的指针,并且还可以包括解锁脚本以用于解锁指向输出的锁定脚本。因此,考虑一对交易,将其称为第一交易和第二交易(或“目标”交易)。第一交易包括指定数字资产金额的至少一个输出,并且包括定义解锁该输出的一个或更多个条件的锁定脚本。第二交易(目标交易)包括至少一个输入和解锁脚本,该至少一个输入包括指向第一交易的输出的指针;该解锁脚本用于解锁第一交易的输出。
6.在此类模型中,当第二交易(目标交易)被发送到p2p网络以在区块链中传播和记录时,在每个节点处应用的有效性准则之一将是:解锁脚本满足在第一交易的锁定脚本中定义的一个或更多个条件中的所有条件。另一条件将是:第一交易的输出尚未被另一早期有效交易赎回。根据这些条件中的任何一个条件发现目标交易无效的任何节点都不会传播该交易,也不会包括该交易以便挖掘到要记录在区块链中的区块中。
7.另一种交易模型是基于账户的模型。在这种情况下,每笔交易均不通过参考过去交易序列中先前交易的utxo来定义转移的金额,而是通过参考绝对账户余额进行定义。所有账户的当前状态由矿工单独存储到区块链中,并不断更新。
8.区块链中的交易通常用于传递数字资产,即作为价值储存手段的数据。但是也可利用区块链实现区块链上的分层附加功能。比如,区块链协议可允许在交易中存储附加有效载荷数据(即用户数据或应用程序内容,而非涉及交易作为区块链网络上的交易如何运作的基本相关数据)。比如,此等有效载荷数据可包括基于输出的模型中交易的不可花费的输出,例如通过锁定脚本中包含的op_return操作码,该操作码在区块链网络的节点运行时终止锁定脚本,并且因此使输出在与另一交易的输入进行交易时不起作用。现代区块链在单一交易中可储存的最大数据容量在不断增加,从而能够并入更复杂的数据。例如,这可用于在区块链上存储电子文档,甚至音频或视频数据。
9.众所周知的是,交易的有效载荷中包括一小块可执行代码。也就是说,在基于输出的模型中除锁定和解锁脚本之外的代码,或在基于账户的模型中除智能合约的生效部分之外的代码。相反,可执行代码具有其他一些辅助或“第2层”(即应用层)功能。换言之,从区块链网络上采用的交易协议的角度而言,可执行代码与任何其他有效载荷数据相同。客户端可下载代码,方法是检查存储在区块链网络的一个存储节点上的部分区块链,并从相关交易的有效载荷访问代码。然后,代码可在本地客户端计算机上运行。


技术实现要素:

10.然而,虽然已知在交易的有效载荷中包含一小块可执行代码,但据发明人所知,区块链上未曾包含过自含程序。
11.区块链为传统数据库服务器提供了分散且防篡改的替代方案,有可能彻底改变数据的存储、访问和分发。但是,由于不够成熟,其缺乏轻松构建应用程序和软件的标准化架构和网络协议,并且不了解底层技术。为了使区块链成为像互联网一样基本的基础设施,必须开发一种易于使用的协议,以供用户和软件访问区块链上存储的数据。
12.下面公开一种适用于使一系列支持区块链的应用程序标准化的文件格式。本公开建立了一种在区块链上存储可执行软件(即可运行代码)的方法,该软件可以在本地重构,以在具有许可访问权限的单个计算机上运行。这针对区块链上存储的文件引入了一种新的基于区块链的文件格式,该文件可以在本地或虚拟机上运行。
13.根据本文公开的一个方面,提供了一种运行程序的方法。该方法包括在消费方的计算机设备上执行的下列步骤。首先,该方法包括从在区块链网络的多个节点维护的区块链上记录的第一交易中检索头文件。头文件包括:程序头部信息和引用信息,该引用信息包括存储在区块链上的一个或多个相应第二交易的一个或多个相应交易id。每个第二交易均包括程序文件的主体的相应部分,至少一个部分包括可运行程序代码。然后,该方法包括通过区块链,基于引用信息从一个或多个第二交易的至少一个中检索程序文件的相应部分;并且运行包括程序头部信息和至少一个检索部分的程序。
14.在实施例中,权限可以在存储文件的交易或文件本身中编码,以允许控制谁可以执行文件。
15.实施例还可将对区块链的访问集成到高级编程语言,以促进本地软件和区块链之
间的交互。可提供一种请求-响应协议,用于访问区块链超文本文件中交易超链接引用的数据。比如,可以通过支持超文本的钱包实现请求-响应协议,以经由op_return标志进行请求。
16.本公开还讨论了示例性系统架构和计算机架构,以及计算机硬件和软件的组件在实现所公开的技术时可如何交互。
附图说明
17.为了帮助理解本公开的实施例并示出如何实施此类实施例,现将仅通过举例的方式参考附图进行说明,其中:
18.图1是一种用于实现区块链的系统的示意性框图;
19.图2示意性地示出了可记录在区块链中的交易的一些示例;
20.图3是用于存储程序的交易示例集的示意性框图,
21.图4是客户端应用程序的示意性框图,
22.图5示意性地示出了根据本文实施例的基于区块链的文件格式,
23.图6是用于实现本公开技术的示例性计算机架构的示意性框图,
24.图7a至图7b示出了根据本文公开的实施例,用于访问和重构可运行程序文件的示例性过程。
具体实施方式
25.示例性系统概述
26.图1示出了一种用于实现区块链150的示例性系统100。系统100包括分组交换网络101,通常是诸如互联网的广域互联网。分组交换网络101包括多个节点104,该多个节点被设置成在分组交换网络101内形成点对点(p2p)覆盖网络106。每个节点104包括对等体的计算机设备,不同的节点104属于不同的对等体。每个节点104包括含一个或更多个处理器的处理装置,例如一个或更多个中央处理单元(cpu)、加速器处理器、特定应用程序处理器和/或现场可编程门阵列(fpga)。每个节点还包括存储器,即采用非暂时性计算机可读介质形式的计算机可读存储器。存储器可包括一个或更多个存储器单元,其采用一个或更多个存储器介质,例如诸如硬盘等的磁介质、诸如固态硬盘(ssd)、闪存或电可擦可编程只读存储器(eeprom)等的电子媒介和/或诸如光盘驱动器等的光学介质。
27.区块链150包括一系列数据区块151,其中在p2p网络160中的多个节点中的每个节点处维护相应的区块链150副本。区块链中的每个区块151均包括一笔或多笔交易152,其中该上下文中的交易是指一种数据结构。数据结构的性质将取决于用作交易模型或计划的一部分的交易协议类型。给定的区块链通常全程使用一个特定的交易协议。在一种常见的交易协议中,每笔交易152的数据结构至少包括一个输入和至少一个输出。每个输出指定一个金额,该金额表示属于输出被加密锁定的用户103的数字资产值(需要该用户的签名进行解锁,从而进行赎回或花费)。每个输入指向先前交易152的输出,从而链接这些交易。
28.节点104中的至少一些节点扮演转发节点104f的角色,这些节点转发并因此传播交易152。节点104中的至少一些节点扮演挖掘区块151的矿工104m的角色。节点104中的至少一些节点扮演存储节点104s(有时也称为“完整副本”节点)的角色,每个存储节点均在相
应的存储器中存储相同区块链150的相应副本。每个矿工节点104m还维护等待挖掘到区块151中的交易152的池154。给定节点104可以是转发节点104、矿工104m、存储节点104s或其中两个节点或所有节点的任意组合。
29.在给定的当前交易152j中,输入(或每个输入)包括指针,该指针引用交易序列中先前交易152i的输出,指定该输出将在当前交易152j中被赎回或“花费”。通常,当前交易可以是池154或任何区块151中的任何交易。尽管为了确保当前交易有效,将需要存在先前交易152i并核实其有效,但是在创建当前交易152j甚至向网络106发送当前交易152j时,不必存在先前交易152i。因此,在本文中,“先前”是指由指针链接的逻辑序列中的前任,而不一定是时间序列中的创建时间或发送时间,因此,不一定排除无序创建或发送交易152i、152j的情况(参见下面关于孤立交易的讨论)。先前交易152i同样可以称为先行交易或前任交易。
30.当前交易152j的输入还包括先前交易152i的输出被锁定到的用户103a的签名。反过来,当前交易152j的输出可以加密锁定到新用户103b。因此,当前交易152j可将先前交易152i的输入中定义的金额转移到当前交易152j的输出中定义的新用户103b。在某些情况下,交易152可具有多个输出,以在多个用户间分割输入金额(其中一个可以是原始用户103a,以便进行变更)。在某些情况下,一交易还可以具有多个输入,以将一个或更多个先前交易的多个输出中的金额汇总在一起,并重新分配到当前交易的一个或更多个输出。
31.上述可称为“基于输出的”交易协议,有时也称为未花费的交易输出(utxo)的协议(其中输出称为utxo)。用户的总余额不是用区块链中存储的任何一个数字定义的;相反,用户需要特殊“钱包”应用程序105,以整理该用户的所有utxo值,这些utxo值分散在区块链151的许多不同交易152中。
32.作为基于账户的交易模型的一部分,另一种类型的交易协议可称为“基于账户的”协议。在基于账户的情况下,每笔交易均不通过参考过去交易序列中先前交易的utxo来定义转移的金额,而是通过参考绝对账户余额进行定义。所有账户的当前状态由矿工单独存储到区块链中,并不断更新。在此类系统中,交易使用账户的运行交易记录(也称为“头寸”)进行排序。该值由发送者签名作为其加密签名的一部分,并作为交易引用计算的一部分进行哈希处理。此外,可选的数据字段也可以在交易中签名。例如,如果数据字段中包含先前交易的id,则该数据字段可指向先前交易。
33.无论采用何种类型的交易协议,当用户103希望执行新交易152j时,其希望将新交易从其计算机终端102发送至p2p网络106的节点104中的一个(现在通常是服务器或数据中心,但原则上可以是其他用户终端)。此节点104根据在节点104中的每个节点处应用的节点协议检查交易是否有效。节点协议的详细信息将与相关区块链150中使用的交易协议类型相对应,一起形成整个交易模型。节点协议通常要求节点104检查新交易152j中的加密签名是否与预期签名相匹配,这取决于交易152的有序序列中的先前交易152i。在基于输出的情况下,这可包括检查新交易152j的输入中包含的用户加密签名是否与新交易花费的先前交易152i的输出中定义的条件相匹配,其中该条件通常包括至少检查新交易152j的输入中的加密签名是否解锁新交易的输入所指向的先前交易152i的输出。在一些交易协议中,条件可至少部分地由输入和/或输出中包含的自定义脚本定义。或者,这可仅由节点协议单独确定,或可通过其组合确定。无论采用哪种方式,如果新交易152j有效,当前节点会将其转发
到p2p网络106中的一个或更多个其他节点104。这些节点104中的至少一些节点还作为转发节点104f,根据相同的节点协议应用相同的测试,从而将新交易152j转发到一个或更多个进一步的节点104,依此类推。通过这种方式,新交易在节点104的整个网络中进行传播。
34.在基于输出的模型中,给定输出(例如,utxo)是否花费的定义是,根据节点协议,其是否通过另一个随后交易152j的输入有效赎回。交易有效的另一个条件是其试图花费或赎回的先前交易152i的输出尚未被另一笔有效交易花费/赎回。同样,如果无效,交易152j将不会在区块链中传播或记录。这可防止重复花费,即花费者对同一笔交易的输出花费超过一次。另一方面,基于账户的模型通过保持账户余额防止重复花费。因为同样存在定义的交易顺序,账户余额在任何时候均具有单一定义的状态。
35.除核实之外,节点104m中的至少一些节点在称为挖矿的过程中争先创建交易区块,该过程以“工作量证明”为基础。在挖矿节点104m处,将新交易添加到区块中尚未出现的有效交易的池中。然后,矿工争相通过尝试解决加密难题来组装交易池154中交易152的新的有效区块151。通常情况下,这包括搜索“随机数”值,从而当随机数与交易池154并置且进行哈希处理时,哈希值的输出满足预定条件。例如,预定条件可以是哈希值的输出具有某个预定义的前导零数。哈希函数的特性是,相对于其输入,其具有不可预测的输出。因此,该搜索只能通过强力执行,从而在试图解决难题的每个节点104m处消耗大量的处理资源。
36.解决难题的第一矿工节点104m在网络106上宣布难题解决,提供解决方案作为证明,然后网络中的其他节点104则可以轻松检查该解决方案(一旦给出哈希值的解决方案,就可以直接检查该解决方案是否使哈希值的输出满足条件)。基于已在每个此类节点处检查获胜者的已宣布解决方案,获胜者已为其解决该难题的交易池154之后由充当存储节点104s的节点104中的至少一些节点记录在区块链150中作为新区块151。区块指针155还分配给指向区块链中先前创建的区块151n-1的新区块151n。工作量证明有助于降低重复花费的风险,因为创建新区块151需要大量工作,并且由于包含重复花费的任何区块都可能被其他节点104拒绝,因此挖矿节点104m受到激励,不允许在其区块中包含双重花费。一旦创建,则不可修改区块151,因为其根据相同的协议在p2p网络106中的存储节点104s中的每个存储节点进行识别和维护。区块指针155还向区块151施加顺序。由于交易152记录在p2p网络106中每个存储节点104s处的有序区块中,因此提供了交易的不可变公共分类账。
37.应当注意的是,在任何给定时间争相解决难题的不同矿工104m可能会根据任何给定时间的未挖掘交易池154的不同快照执行该操作,具体取决于他们何时开始搜索解决方案。解决相应难题的人员首先定义新区块151n中包含的交易152,并更新当前未挖掘交易池154。然后,矿工104m继续争相从新定义的未完成池154中创建区块,依此类推。此外,还存在解决可能出现的任何“分叉”的协议,其中两名矿工104m彼此在很短的时间内解决难题,从而传播区块链的冲突视图。简言之,分叉方向最长的成为最终区块链150。
38.在大部分区块链中,获胜矿工104m会自动获得特殊类型的新交易作为奖励,该新交易创建新的数字资产值(与将数字资产金额从一个用户转移至另一个用户的正常交易截然相反)。因此,获胜节点被视为已“挖掘”一定数量的数字资产。这种特殊类型的交易有时称为“生成”交易,其自动形成新区块151n的一部分。该奖励可激励矿工104m争相参与工作量证明。通常情况下,常规(非生成)交易152还将在其输出中的一个输出中指定附加交易费用,以进一步奖励创建其中包含交易的区块151n的获胜矿工104m。
39.由于挖掘中涉及的计算资源,通常至少矿工节点104m中的每个矿工节点采用服务器的形式,该服务器包括一个或更多个物理服务器单元,甚至整个数据中心。每个转发节点104m和/或存储节点104s还可采取服务器或数据中心的形式。但是,原则上来说,任何给定节点104均可采用一个用户终端或联网在一起的一组用户终端的形式。
40.每个节点104的存储器均存储被配置为在节点104的处理装置上运行的软件,以根据节点协议执行其相应的角色并处理交易152。应当理解的是,在本文中归因于节点104的任何动作均可通过在相应计算机设备的处理装置上运行的软件执行。节点软件可以在应用层的一个或更多个应用中实现,或者在诸如操作系统层或协议层的较低层中实现,或者在这些层的任何组合中实现。此外,在本文中使用的“区块链”一词是指一般技术类型的通用术语,不限于任何特定专有区块链、协议或服务。
41.扮演消费用户角色的多方103中的每一方的计算机设备102也连接到网络101。他们充当交易中的付款人和收款人,但不一定代表其他方参与挖掘或传播交易。他们不一定运行挖矿协议。出于说明目的,示出了双方103及其相应的设备102:第一方103a及其相应的计算机设备102a,以及第二方103b及其相应的计算机设备102b。应当理解的是,更多此类当事方103及其相应的计算机设备102可能存在并参与系统,但为了方便起见,未进行说明。每一方103均可以是个人或组织。仅出于说明目的,在本文中,第一方103a称为爱丽丝(alice),第二方103b称为鲍勃(bob),但应当理解的是,这并不仅限于爱丽丝或鲍勃,且本文对爱丽丝或鲍勃的任何引用均可分别用“第一方”和“第二方”替换。
42.每一方103的计算机设备102包括相应的处理装置,其包括一个或更多个处理器,例如一个或更多个cpu、图形处理单元(gpu)、其他加速器处理器、特定应用程序处理器和/或fpga。每一方103的计算机设备102还包括存储器,即采用非暂时性计算机可读介质形式的计算机可读存储器。该存储器可包括一个或更多个存储器单元,其采用一个或更多个存储器介质,例如诸如硬盘等磁介质、诸如ssd、闪存或eeprom等电子媒介和/或诸如光盘驱动器等的光学介质。每一方103的计算机设备102上的存储器存储软件,其包括被设置为在处理装置上运行的至少一个客户端应用程序105的相应实例。应当理解的是,在本文中归因于给定方103的任何行动均可通过在相应计算机设备102的处理装置上运行的软件执行。每一方103的计算机设备102包括至少一个用户终端,例如台式或笔记本电脑、平板电脑、智能手机或诸如智能手表等的可穿戴设备。给定方103的计算机设备102还可包括一个或更多个其他网络资源,诸如通过用户终端访问的云计算资源。
43.客户端应用程序105最初可通过例如从服务器下载的适当计算机可读存储介质,或通过诸如可移动ssd、闪存密钥、可移动eeprom、可移动磁盘驱动器、软盘或磁带等的可移动存储设备、诸如cd或dvd rom等的光盘或可移动光驱等提供至任何给定方103的计算机设备102。
44.客户端应用程序105至少包括“钱包”功能。这有两个主要功能。其中一个功能是使相应的用户方103创建、签名和发送拟在节点104的整个网络中传播的交易152,并因此包含在区块链150中。另一个功能是向相应方汇报其目前拥有的数字资产金额。在基于输出的系统中,该第二功能包括整理分散在区块链150中属于相关方的各种交易152的输出中定义的金额。
45.注意:虽然各种客户端功能可以描述为集成到给定客户端应用105中,但这不一定
是限制性的,相反,在本文中所描述的任何客户端功能可以在由两个或更多个不同应用组成的套件中实现,例如经由api进行接口连接或一个应用作为另一个应用的插件。更通俗地说,客户端功能可以在应用层或诸如操作系统的较低层或这些层的任意组合实现。下面将根据客户端应用105进行描述,但应当理解的是,这不是限制性的。
46.每个计算机设备102上的客户端应用程序或软件105的实例可操作地耦合到p2p网络106的转发节点104f中的至少一个转发节点。这可以启用客户端105的钱包功能,以将交易152发送至网络106。客户端105还可联系一个、一些或所有存储节点104,以在区块链150中查询相应方103作为接收者的任何交易(或实际上在区块链150中检查其他方的交易,因为在实施例中,区块链150是在某种程度上通过其公开可见性提供交易信任的公共设施)。每个计算机设备102上的钱包功能被配置为根据交易协议制定和发送交易152。每个节点104运行软件,其被配置为根据节点协议核实交易152有效的软件,并且在转发节点104f的情况下转发交易152,以在整个网络106中传播此类交易。交易协议和节点协议相互对应,给定交易协议和给定节点协议一起实现给定的交易模型。区块链150中的所有交易152均采用相同的交易协议(尽管交易协议可允许其内存在不同的交易子类型)。网络106中的所有节点104采用相同的节点协议(尽管其可根据针对该子类型定义的规则区分处理不同的交易子类型,并且不同的节点还可扮演不同的角色,从而实现协议的不同对应方面)。
47.如上所述,区块链150包括一系列区块151,其中每个区块151包括通过如前所述的工作量证明过程创建的一个或更多个交易152的集合。每个区块151还包括区块指针155,其指向区块链中先前创建的区块151,以定义区块151的顺序。区块链150还包括有效交易池154,其等待通过工作量证明过程包含在新的区块中。每笔交易152(除了一生成交易)包括指向先前交易的指针,以定义交易序列的顺序(注:交易152的序列可进行分支)。区块151的区块链一直追溯到创始区块(gb)153,该创始区块是区块链中的第一区块。区块链150中早期的一笔或多笔原始交易152指向创始区块153,而非先前交易。
48.当给定方103(比方说爱丽丝)希望发送拟包含在区块链150中的新交易152j时,她将根据相关交易协议(使用其客户端应用程序105中的钱包功能)制定新交易。然后,她将交易152从客户端应用程序105发送至其连接的一个或更多个转发节点104f中的一个。例如,这可以是与爱丽丝的计算机102最近或最佳连接的转发节点104f。当任何给定节点104接收新交易152j时,其将根据节点协议及其相应的角色进行处理。这包括首先检查新接收的交易152j是否满足变为“有效”的特定条件,具体示例稍后将详细讨论。在一些交易协议中,有效条件可通过交易152中包含的脚本在每个交易的基础上进行配置。或者,条件可仅仅是节点协议的内置功能,或通过组合脚本和节点协议进行定义。
49.如果新接收的交易152j通过有效性测试(即:“有效”的条件下),接收交易152j的任何存储节点104s将向在该节点104s处维护的区块链150的副本中的池154中添加新有效交易152。进一步地,接收交易152j的任何转发节点104f随后将有效交易152传播至p2p网络106中的一个或更多个其他节点104。由于每个转发节点104f应用相同的协议,因此假定交易152j有效,这意味着交易很快将在整个p2p网络106中传播。
50.一旦进入在一个或更多个存储节点104处维护的区块链150的副本中的池154中,矿工节点104m将开始竞相解决包括新交易152的池154的最新版本方面的工作量证明难题(其他矿工104m可继续尝试基于池154的旧视角解决难题,但首先解决难题的矿工将定义下
一个新区块151的结束位置和新池154的开始位置,最终将有人解决包括爱丽丝的交易152j的池154的一部分的难题)。一旦包括新交易152j的池154完成工作量证明,其将不可变地成为区块链150中区块151中的一个区块的一部分。每笔交易152包括指向早前交易的指针,因此交易的顺序也被不可变地记录下来。
51.不同的节点104可以首先接收给定交易的不同实例,并且因此在一个实例被挖掘到区块150中之前具有关于哪个实例“有效”的冲突视图,此时所有节点104同意所挖掘的实例是唯一的有效实例。如果节点104接受一个实例为有效实例,然后发现第二实例已记录在区块链150中,则该节点104必须接受这一点,并将丢弃(即视为无效)其最初接受的未挖掘实例。
52.基于utxo的模型
53.图2示出了示例性交易协议。这是基于utxo的协议的示例。交易152(简称“tx”)是区块链150的基本数据结构(每个区块151包括一笔或更多笔交易152)。下面将通过参考基于输出或基于“utxo”的协议进行描述。但这并不限于所有可能的实施例。
54.在基于utxo的模型中,每笔交易(“tx”)152包括数据结构,其包括一个或更多个输入202和一个或更多个输出203。每个输出203可包括未花费的交易输出(utxo),其可用作另一新交易的输入202的来源(如果utxo尚未赎回)。utxo指定数字资产金额(价值储存手段)。它还可包含其来源交易的交易id以及其他信息。交易数据结构还可包括头部201,其可包括输入字段202和输出字段203的大小指示符。头部201还可包括交易的id。在实施例中,交易id是交易数据(不含交易id本身)的哈希值,且存储在提交至矿工104m的原始交易152的头部201中。
55.比方说爱丽丝103a希望创建转移相关数字资产金额至鲍勃103b的交易152j。在图2中,爱丽丝的新交易152j标记为“tx
1”。该新交易获取在序列中先前交易152i的输出203中锁定至爱丽丝的数字资产金额,并至少将此类金额中的一部分转移至鲍勃。在图2中,先前交易152i标记为“tx
0”。tx0和tx1只是任意的标记,其不一定意味着tx0指区块链151中的第一交易且tx1指池154中的下一笔交易。tx1可指向仍具有锁定至爱丽丝的未花费输出203的任何先前(即先行)交易。
56.当爱丽丝创建其新交易tx1时,或至少在她将该新交易发送至网络106时,先前交易tx0可能已经有效并包括在区块链150中。该交易此时可能已包括在区块151中的一个区块中,或者可能仍在池154中等待,在这种情况下,该交易将很快包括在新区块151中。或者,tx0和tx1可以创建并一起发送至网络102;或者,如果节点协议允许缓冲“孤立”交易,tx0甚至可以在tx1之后发送。本文交易序列上下文中使用的“先前”和“后续”一词是指由交易中指定的交易指针定义的序列中的交易顺序(哪个交易指向哪个其他交易等等)。它们同样可以替换为“前任”和“继任”、“先行”和“后代”或“父项”和“子项”等。这不一定指其创建、发送至网络106或到达任何给定节点104的顺序。然而,指向先前交易(先行交易或“父交易”)的后续交易(后代交易或“子交易”)不会有效除非父交易有效。在父交易之前到达节点104的子交易被视为孤立交易。根据节点协议和/或矿工行为,其可被丢弃或缓冲一段时间,以等待父交易。
57.先前交易tx0的一个或更多个输出203中的一个包括特定的utxo,标记为utxo0。每个utxo包括指定utxo表示的数字资产金额的值以及锁定脚本,该锁定脚本定义后续交易的
输入202中的解锁脚本必须满足的条件,以使后续交易有效,从而成功赎回utxo。通常情况下,锁定脚本将金额锁定至特定方(该金额的交易的受益人)。即,锁定脚本定义解锁条件,该解锁条件通常包括以下条件:后续交易的输入中的解锁脚本包括先前交易被锁定到的一方的加密签名。
58.锁定脚本(亦称scriptpubkey)是节点协议识别的域特定语言中写入的一段代码。此类语言的特定示例称为“脚本(script)”(s大写)。锁定脚本指定花费交易输出203所需的信息,例如爱丽丝签名的要求。解锁脚本出现在交易的输出中。解锁脚本(亦称scriptsig)是提供满足锁定脚本准则所需信息的域特定语言中写入的一段代码。例如,其可包含鲍勃的签名。解锁脚本出现在交易的输入202中。
59.因此在示出的示例中,tx0的输出203中的utxo0包括锁定脚本[checksig pa],该锁定脚本需要爱丽丝的签名sig pa,以赎回utxo0(严格来说,是为了使试图赎回utxo0的后续交易有效)。[checksig pa]包含爱丽丝的公私密钥对中的公钥pa。tx1的输入202包括向回指向tx1的指针(例如,通过其交易id(txid0),其在实施例中是整个交易tx0的哈希值)。tx1的输入202包括在tx0中标识utxo0的索引,以在tx0的任何其他可能输出中对其进行标识。tx1的输入202进一步包括解锁脚本《sig pa》,该解锁脚本包括爱丽丝的加密签名,该签名由爱丽丝通过将其密钥对中的私钥应用于预定的部分数据(有时在密码学中称为“消息”)创建。爱丽丝需要签名以提供有效签名的数据(或“消息”)可通过锁定脚本、节点协议或其组合进行定义。
[0060]
当新交易tx1到达节点104时,该节点应用节点协议。这包括一起运行锁定脚本和解锁脚本,以检查解锁脚本是否满足锁定脚本中定义的条件(其中该条件可包括一个或更多个准则)。在实施例中,这涉及并置两个脚本:
[0061]
《sig pa》《pa》||[checksig pa]
[0062]
其中“||”表示并置,“《

》”表示将数据放在堆栈上,“[

]”表示由解锁脚本组成的函数(在该示例中指基于堆栈的语言)。同样,脚本可以使用公共堆栈一个接一个地运行,而不是并置脚本。无论采用哪种方式,当一起运行时,脚本使用爱丽丝的公钥pa(包括在tx0的输出的锁定脚本中),以认证tx1的输入中的锁定脚本是否包含爱丽丝签名预期部分的数据时的签名。预期的部分数据本身(“消息”)也需要包括在tx0中,以便执行此认证。在实施例中,签名的数据包括整个tx0(因此不需要包括一个单独的元素来明文指定签名的部分数据,因为其本身便已存在)。
[0063]
本领域技术人员将熟悉通过公私密码进行认证的细节。基本上而言,如果爱丽丝已通过使用其私钥加密签署消息,则给定爱丽丝的公钥和明文中的消息(未加密消息),诸如节点104等其他实体可认证加密版本的消息必须已经由爱丽丝签名。签署通常包括对消息进行散列,签署哈希值和将此标记到消息的明文版本作为签名,从而使公钥的任何持有者能够认证签名。因此,应当注意的是,在实施例中,在本文中对签名特定数据片段或交易部分等的任何引用可以意味着对该数据片段或交易部分的哈希值进行签名。
[0064]
如果tx1中的解锁脚本满足tx0的锁定脚本中指定的一个或更多个条件(因此,在所示示例中,如果在tx1中提供了爱丽丝的签名并进行认证),则节点104认为tx1有效。如果是挖矿节点104m,这意味着其将添加至等待工作量证明的交易154池。如果是转发节点104f,则其将交易tx1转发到网络106中的一个或更多个其他节点104,从而将在整个网络中传播。
一旦tx1有效并包括在区块链150中,这将把tx0中的utxo0定义为已花费。请注意,tx1仅在花费未花费的交易输出203时才有效。如果试图花费另一交易152已经花费的输出,则即使满足所有其他条件,tx1也将无效。因此,节点104还需要检查先前交易tx0中引用的utxo是否已经花费(已经形成另一有效交易的有效输入)。这是为何区块链150对交易152施加定义的顺序很重要的原因之一。在实践中,给定节点104可维护单独的数据库,标记已花费交易152的utxo 203,但最终定义utxo是否已花费取决于是否在区块链150中形成了另一有效交易的有效输入。
[0065]
如果给定交易152的所有输出203中指定的总金额大于其所有输入202所指向的总金额,则这是大多数交易模型中的另一失效依据。因此,此类交易将不会传播或挖掘到区块151中。
[0066]
请注意,在基于utxo的交易模型中,给定utxo需要作为一个整体使用。不能“留下”utxo中定义为已花费的一部分金额,而同时又花费另一部分。但utxo的金额可以在下一个交易的多个输出之间分割。例如,tx0的utxo0中定义的金额可以在tx1中的多个utxo之间分割。因此,如果爱丽丝不想将utxo0中定义的所有金额都给鲍勃,她可以使用剩余部分在tx1的第二输出中自己找零钱,或者支付给另一方。
[0067]
在实践中,爱丽丝通常还将需要包括获胜矿工的费用,因为现在仅靠区块创始交易的奖励币通常不足以激励挖掘。如果爱丽丝未包括矿工的费用,tx0可能会被矿工节点104m拒绝,因此,尽管技术上有效,但仍然不会传播并包括在区块链150中(如果矿工104m不愿意,矿工协议不会强制他们接受交易152)。在一些协议中,挖掘费不需要其自身的单独输出203(即不需要单独的utxo)。相反,给定交易152中输入202所指向的总金额与输出203所指定的总金额之间的任何差额都将自动提供给获胜矿工104。例如,假设指向utxo0的指针是tx1的唯一输入,而tx1只有一个输出utxo1。如果utxo0中指定的数字资产的金额大于utxo1中指定的金额,则该差额将自动提供给获胜矿工104m。替代地或附加地,这不一定排除可以在其自身交易152的其中一个utxo 203中明确指定矿工费用。
[0068]
爱丽丝和鲍勃的数字资产由区块链150中任何位置的任何交易152中的锁定至他们的未花费utxo组成。因此,通常情况下,给定方103的资产分散在整个区块链150的各种交易152的utxo中。区块链150中的任何位置均未存储定义给定方103的总余额的一个数字。客户端应用程序105的钱包功能的作用是将锁定至相应方且在其他随后交易中尚未花费的各种utxo值整理在一起。通过查询在任何存储节点104s(例如,与相应方的计算机设备102最近或最佳连接的存储节点104s)处存储的区块链150副本,可以实现这一点。
[0069]
请注意,脚本代码通常用示意图表示(即非精确语言)。例如,可写入[checksig pa]表示[checksig pa]=op_dup op_hash160《h(pa)》op_equalverify op_checksig。“op_...”是指脚本语言的特定操作码。op_checksig(又称“checksig”)是脚本操作码,其取两个输入(签名和公钥),并使用椭圆曲线数字签名算法(ecdsa)验证签名的有效性。在运行时,移除脚本中任何出现的签名(

sig’),但在由

sig’输入验证的交易中仍保留附加要求,诸如哈希难题。再如,op_return是脚本语言操作码,用于创建交易的不可花费输出,其可以将元数据储存在交易中,从而将元数据不可变地记录在区块链150中。例如,元数据可包括需存储在区块链中的文件。
[0070]
签名pa是数字签名。在实施例中,这基于使用椭圆曲线secp256k1的ecdsa。数字签
名对特定的数据段进行签名。在实施例中,对于给定交易,签名将对部分交易输入以及全部或部分交易输出进行签名。对输出的特定部分进行签名取决于sighash标志。sighash标志是包含在签名末尾的4字节代码,用于选择签名的输出(并因此在签名时固定)。
[0071]
锁定脚本有时称为“scriptpubkey”,指其包括相应交易被锁定到的当事方的公钥。解锁脚本有时称为“scriptsig”,指其提供相应的签名。但是更通俗地说,在区块链150的所有应用中,utxo赎回的条件并不一定包括对签名进行认证。更通俗地说,脚本语言可用于定义任何一个或更多个条件。因此,可以优选更为通用的术语“锁定脚本”和“解锁脚本”。
[0072]
客户端软件
[0073]
图4示出了用于实现本公开技术的实施例的客户端应用程序105的示例性实施方式。客户端应用程序105包括交易引擎404和用户界面(ui)层401。根据上文讨论的方案,交易引擎404被配置为实现客户端105的基础交易相关功能,诸如制定交易152,通过侧信道301接收和/或发送交易和/或其他数据,和/或发送交易以通过p2p网络106传播。进一步地,根据本文公开的实施例,至少鲍勃的客户端105b(以及可能的其他客户端)的交易引擎401进一步包括数据传送引擎403、程序启动器405和可选的超文件引擎402。超文件引擎402、数据传送引擎403和交易引擎404可一起构成“智能钱包”功能406(尽管超文件引擎402是该功能的可选部分)。这些不同模块的功能稍后将进行更详细地讨论。智能钱包功能406在本文也简称为“智能钱包”。
[0074]
ui层401被配置为通过相应用户的计算机设备102的用户输入/输出(i/o)方式呈现用户界面,包括通过设备102的用户输出方式向相应用户103输出信息,和通过设备102的用户输入方式接收来自相应用户103的输入。例如,用户输出方式可包括提供视觉输出的一个或显示多个屏(触摸或非触摸屏)、提供音频输出的一个或更多个扬声器、和/或提供触觉输出的一个或更多个触觉输出设备等。用户输入方式可包括例如一个或更多个触摸屏的输入传感器矩阵(可与用于输出方式的显示器相同或不同);一个或更多个基于光标的设备,诸如鼠标、轨迹板或轨迹球;一个或更多个麦克风和语音或声音识别算法,用于接收语音或声音输入;一个或更多个基于手势的输入设备,用于接收手动或身体手势形式的输入;或者一个或更多个机械按钮、开关或控制杆等。
[0075]
智能钱包406的交易引擎403可访问区块链150上交易152的有效载荷中存储的代码(例如,在基于输出的交易模型的不可花费的输出中),并且从中将代码传送至程序启动器405。代码启动器405运行此代码,并通过ui层401向用户103b呈现任何用户可见的程序效果。特别地,根据本文公开的实施例,代码启动器405被配置为从区块链150上的多个交易152重构程序文件,并运行重构的程序文件。稍后将更详细地讨论这方面。
[0076]
注:虽然本文中的各种功能可以被描述为集成到同一客户端应用程序105中,但这并不一定构成限制,相反,它们可以在两个或更多个不同应用程序组成的一套程序中实现,例如一个应用程序作为另一个应用程序的插件或经由api(应用程序编程接口)进行接口。比如,模块401、402、403、404、405中的任何一个的功能均可以在任意组合的两个或更多个独立应用程序中实现。同时,也不排除部分或全部描述的功能可以在比如操作系统层实现。在本文任何位置引用单个或给定应用程序105或诸如此类的情况下,应当理解的是这只是作为示例,并且更通俗地说,所描述的功能可以在任何形式的软件中实现。
[0077]
基于区块链的程序文件格式
[0078]
为了支持集成区块链技术作为基本的技术基础设施,应优选采用简单过程来构建和访问更高层次的应用程序。为实现这一点,需要为开发人员提供标准数据格式,使得不仅包含在交易内,而且构建软件以执行存储在区块链交易中的代码。这可能涉及专用智能钱包,该钱包可以随时与区块链互动,以用于数据请求,并且促进本地计算机、中央处理器(cpu)和计算机存储器上的软件连接。通过可将区块链数据集成至传统编程语言中,可以在区块链上开发更为广泛的应用程序,以支持更安全、防篡改的桌面和移动应用程序。
[0079]
本文公开的系统通过提供支持交易的文件格式(包含除用于锁定和解锁脚本等的脚本语言之外的其他编程语言),促进软件和区块链之间的直接互动。在现代编程语言中,诸如c、c 和java,存在称为指针的对象,充当对特定存储地址的引用。本公开提供了一种可称为区块链指针的类似对象,该指针可集成至编程语言,充当对一些交易数据或元数据的引用。
[0080]
一些实施例还可采用一种系统,用于经由其txid引用的链接超文本文件来请求和响应数据请求。
[0081]
图5示出了根据本文公开的实施例的基于区块链的程序文件格式,用于在区块链150上跨多个交易152存储程序文件。图5的左侧面板a)示出了分片形式的程序文件,其存储在区块链150上的多个交易152中。分片形式的程序文件包括头文件501和一个或更多个主体部分502i

502n,该头文件存储在区块链150上的第一交易152y中,每个主体部分存储在区块链上的相应第二交易152z中(另见图6,稍后将更详细地讨论)。在基于输出的模型中,每个头文件501和主体部分502均可存储在其相应的第一或第二交易152y,152z的不可花费的输出(例如,utxo)中。
[0082]
图3中示意性地示出了此方面的示例。在以下示例性场景中,爱丽丝103a是提供方。爱丽丝制定第一和第二交易152y,152z并且将这些交易广播到区块链网络106(直接或经由第三方),以将这些交易记录在区块链150上。鲍勃103b是消费方。鲍勃从相应的第一和第二交易152y,152z读取头文件501和部分502,以重构程序文件507。
[0083]
如图3所示,在基于输出的模型中,第一交易152y包括至少一个输入202y,该输入指向区块链150上另一些先行交易152的输出。先行交易的输出可以是锁定至爱丽丝的输出,即因此爱丽丝支付自己的数字资产金额,以将第一交易152y记录在区块链150上。通常情况下,第一交易152y还将需要包括至少一个可花费的输出203y0。这将包括锁定输出203y0至收款人的锁定脚本。锁定脚本以区块链网络106采用的交易协议所识别的相关脚本语言编制,例如script语言。该可花费的输出203y0中指定的金额可以是少量(即可忽略的)金额和/或收款人可以是爱丽丝本人,即因此爱丽丝自己付款(加上挖矿费),以将第一交易152y记录在区块链150上。或者,并不排除可以采用交易模型或协议,该交易模型或协议不一定要求在每个交易中都包含可花费的输出。无论采用哪种方式,第一交易152y还包括不可花费的输出203y1。在实施例中,这可通过在不可花费的输出203y1的锁定脚本中包含脚本语言的特殊操作码来实现。该操作码用于在区块链网络106的一个节点104上运行时,终止包含该操作码的锁定脚本的执行。这使得未以脚本语言编制的任何其他任意有效载荷能够包含在不可花费的输出203y1中,不会以其他方式影响交易152y作为区块链网络106上的交易的功能。
[0084]
根据本文公开的实施例,该机制用于将头文件501包含在第一交易152y的不可花
费的输出203y1中,并且因此将头文件501存储在区块链150上的第一交易152y中。根据区块链网络106采用的交易协议,头文件501以除锁定脚本中使用的脚本语言(例如script)以外的格式或语言编制。
[0085]
可以使用类似机制,以将每个主体部分502包含在区块链150上相应第二交易152z的不可花费的输出203z1中。每个主体部分502包括以除锁定脚本中使用的脚本语言(例如script)以外的语言编制的程序代码。
[0086]
在替代实施方式中,并不排除根据其他交易协议或模型中的不同机制,可以将头文件501和主体部分502包括为交易有效载荷。比如,在替代实施方式中,区块链网络106可采用基于账户的模型,并且每个头文件501和主体部分502可以包含在相应交易152y,152z的数据字段或智能合约中。在这种情况下,每个头文件501和主体部分502将以除节点104识别的用于执行智能合约语言以外的其他语言来编制。
[0087]
返回至图5,头文件501包括程序头部信息503的至少一部分,以及一个或更多个交易id 504列表。程序头部信息503包括程序文件的基本头部信息,一旦重构,将构成程序文件507的头部的至少一部分。这可包括例如以下任何一项、多项或全部:程序的版本号、目标计算机系统的版本号、程序或重构的程序文件的大小、描述、保留变量、日期/时间戳和/或用于检查重构程序无错误的校验和(checksum)。
[0088]
列表504中包含的交易id充当程序文件的相应主体部分502的指针,该程序文件存储在区块链150上的相应其他第二交易152z中。如图5的右侧面板b)所示,消费方鲍勃103b通过将头部信息头部503与由头文件501中包含的相应交易id 504所指向的一个或更多个主体部分502i

502n中的每一个相结合,以非分片形式重构程序文件507的实例。
[0089]
在实施例中,头文件501还可包括一个或更多个条件505的指示,以及用于评估一个或更多个条件的代码存根506。这些部分的功能稍后将进行更详细地讨论。
[0090]
图6示出了消费方103b的计算机设备102b的示例性计算机架构,本文也称为客户端设备。该架构可在本地单一用户设备上实现,或者可分布在多个设备上,这些设备可包括用户设备、服务器资源或其组合。
[0091]
客户端设备102b包括硬件608、输入/输出(i/o)设备607和软件。硬件608包括至少一个处理器609,诸如cpu。硬件608还包括随机存取存储器(ram)和硬盘存储器611(即非易失性存储器,诸如硬盘或固态驱动器(ssd))。中央处理器(cpu)609包括通过执行运算逻辑以及输入/输出操作来执行机器级指令的电子电路。ram 610利用cpu 609提供临时数据存储和机器级指令,充当软件和硬盘611之间的中介。
[0092]
用户103b可与输入/输出设备607交互,并且命令被翻译成指令/数据被中继到操作系统602中的软件。i/o设备607的多个方案已在前面参考图4进行讨论。
[0093]
软件包括操作系统602以及在操作系统602上运行的程序启动器405和智能钱包功能406。操作系统602包括管理计算机硬件和软件资源的系统软件。
[0094]
本文还可采用以下定义。
[0095]
虚拟机:仿真的计算机系统。
[0096]
系统虚拟机:提供执行整个操作系统的功能的虚拟机。虚拟机监视器利用本地执行(机器代码,由计算机的cpu直接执行)来共享和管理硬件,允许单一物理机器上存在多个隔离的环境。
[0097]
虚拟机监视器:创建和运行虚拟机的计算机软件、固件或硬件。
[0098]
动态链接器:操作系统的一部分,在执行可执行文件时(“在运行时”),通过将库的内容从永续性存储器复制到ram并且填充跳转表和重新定位指针,加载并链接可执行文件所需的共享库。特定的操作系统和可执行格式决定了动态链接器如何运作以及如何实现运作。
[0099]
库:计算机程序使用的资源集合(配置数据、文档、预写代码以及子程序、类别、数值或类型规范)。
[0100]
共享库:由可执行文件和进一步共享的对象文件共享的文件。在运行时,使用的模块将单个共享对象加载至存储器中,而非在为程序创建单一单片可执行文件时由链接器复制。
[0101]
汇编器:一种计算机程序,其通过将用于操作和寻址模式的助记符和语法组合转换为其数值等价物(机器代码)来创建对象代码。
[0102]
编译器:一种计算机程序,其将用一种编程语言编写的计算机代码转换成另一种语言(通常情况下是从高级语言到低级语言),以创建可执行程序。
[0103]
可执行文件或可执行程序:使计算机根据编码的指令执行指定任务的文件。还应当注意,最笼统地说,本文中术语“执行”或“可执行”可指运行软件的任何方式,并且不一定限于执行例如低级机器代码指令等。例如,本文中“执行”还可指编译并且运行高级语言,汇编并且运行汇编级语言,或对解释性语言进行解释。
[0104]
图6还示出了存储在区块链网络106上的区块链150的交易152,包括第一交易152y和第二交易152z。
[0105]
在操作中,消费方鲍勃103b使用至少一个i/o设备607,选择从存储在区块链150上的第一交易152y访问头文件501(应当理解的是,本文在上下文中使用的“第一”和“第二”只是任意标签)。在一些实施例中,这可通过在超文本文件601中选择超链接来实现。比如,这可以用html编制,但可以用附加类型的标记来增强,该标记允许链接至区块链150上交易152的交易id,而非传统超链接中的url。在此等实施例中,智能钱包406的超文本引擎402通过ui层401向鲍勃呈现超文本文件601,并且检测超链接的选择。作为回应,它触发钱包406的数据传送引擎403,以经由区块链网络106(通过查询存储节点104s)从区块链150上的链接交易(第一交易152y)检索头文件501。
[0106]
超文本文件601可以通过鲍勃计算机设备102b上的局部存储器或经由网络访问。或者,超文本文件601本身可作为有效载荷数据存储在区块链150上的源交易152x中,例如在基于输出的模型的不可花费的输出中。在这种情况下,在准备步骤中,数据传送引擎403经由区块链网络106从区块链上的源交易152x访问超文本文件601,并且将其传送给超文本引擎402以呈现给用户103b。
[0107]
在替代实施例中,无需使用超文本文件601链接至头文件501。相反,数据传送引擎403可通过以已知方式查询区块链150来检索头文件501。例如,第一交易152y的可花费的输出203y0(可能是少量金额)可发送给鲍勃103b,从而使得他能够使用传统钱包功能在区块链150上找到它。和/或爱丽丝103a或第三方可通过链下侧信道(未示出)将第一交易152y的地址告知鲍勃。在此等实施例中,不需要超文本引擎402作为钱包功能406的一部分。
[0108]
无论通过何种访问方式,头文件501均通过钱包406的数据传送引擎403进行检索,
并且传送给程序启动器405。程序启动器405被配置为从检索到的头文件501读取一个或更多个交易504并且将这些交易作为指针,以使钱包406的数据传送引擎403从区块链上的相应第二交易502检索相应的主体部分502(同样通过查询存储节点104s)。然后,程序启动器405合并程序头部信息503与一个或更多个检索到的主体部分502,以重构程序文件507。程序启动器405可运行重构的程序文件。此外/或者,可将重构的程序文件507存储在存储器611中或存储回区块链150上的另一交易152中,和/或可将重构的文件507传送给第三方以便其运行或存储。
[0109]
至少一个主体部分502的至少一部分包括所需应用的程序代码。在实施例中,一个或更多个主体部分502还可包括由程序代码操作的数据(即目标数据或操作数数据),和/或用于编译和/或链接程序代码的一个或更多个库。
[0110]
程序文件507的主体部分502的程序代码可以任何适当的语言编写,诸如c、c 、java script、python、basic等。该代码采用除用于锁定脚本的脚本语言(例如script)以外的语言编写。因此,该代码可以在实施例中称为非script代码。程序可具有开发人员所需的任何应用程序功能,例如游戏、办公工具、通信客户端或诊断工具等。消费方103b可以是节点104的终端用户或操作员,诸如矿工。消费者设备(客户端设备)102b可包括用户设备、服务器资源或其组合。在一些情况下,消费者设备102b还可扮演区块链网络106的节点104的角色,而非纯粹的消费者。
[0111]
在实施例中,程序启动器405可以采用虚拟机的形式。其可包括编译器603、汇编器604和/或链接器605。其可包括一个或更多个预存储库606。程序文件507的运行可包括编译高级代码、对汇编级代码进行汇编、和/或链接。在链接时,这可包括来自不同交易的部分502之间的链接、给定部分502内的部分链接和/或与预存储库606中的一个库的链接。在进一步替代实施例中,程序文件507的运行可包括对解释性语言的高级代码进行解释。在又一个替代实施例中,程序可能已经包含低级机器代码,在这种情况下,运行包括执行机器代码。
[0112]
注:也不排除头文件501本身可包含主体部分(未示出),该主体部分包括部分程序代码,可以作为其中的一个部分与交易id 504所指向的一个或更多个主体部分502一起包含在最终重构的程序文件507中。
[0113]
在实施例中,头文件501可以可选地包括部分505,该部分指定用于运行一个、多个或所有主体部分502的一个或更多个条件。这些条件可以控制在什么情况下运行主体部分502。比如,这些条件可包括确定谁可以访问一个、多个或所有主体部分的一个或更多个访问条件,以重构或运行文件。更通俗地说,条件505可包括与一个、多个或所有主体部分502相关联的任何条件;例如兼容性条件,诸如客户端设备102b使用什么操作系统传导(例如检查鲍勃未试图在mac上运行windows程序),或者是否客户端设备102b具有足够的存储器。优选地,头文件501还包括用于评估条件505的代码存根506。这不是主体部分502中的一部分,无需包含在最终重构的程序文件507中。相反,当从区块链150检索头文件501时,代码存根506由代码启动器自动运行。但是,与主体部分一样,代码存根506可采用除用于锁定脚本的脚本语言之外的其他语言编写(例如,非script语言)。
[0114]
当运行时,代码存根506实现用于评估条件505的相关功能。或者,并不排除由鲍勃设备102b上的预存储代码进行评估,或甚至由爱丽丝或第三方进行评估。还应当注意,虽然
在图5中示意性地示出为单独的元件,但是在采用代码存根506的一些实施例中,条件505可以作为存根506的代码的组成部分集成至存根506中。或者,然而,条件505确实可以在头文件501的不同部分中指定,并由代码存根506引用。
[0115]
条件505可例如包括一个或更多个访问条件,由此对一个或更多个主体部分502的访问取决于试图重构程序文件107的消费方103b的身份。在这种情况下,评估包括检查消费方103b的身份是否与访问条件505中指定的身份相同。其还可包括认证消费方103b的身份。本领域技术人员将熟悉合适的认证和身份检查技术本身。
[0116]
作为另一个替代性或附加示例,条件505可包括一个或更多个兼容性条件,是关于试图重构程序文件107的消费方103b的客户端计算机设备102b的兼容性条件(即与一个或更多个主体部分502的兼容性)。在这种情况下,评估包括检查计算机设备102b是否满足兼容性条件505中指定的一个或更多个技术规范。本领域技术人员将熟悉合适的兼容性检查技术本身。
[0117]
如果不满足头文件501中指定的条件505,则代码启动器405将i)根本无法通过区块链150访问一个、多个或所有主体部分502;或ii)至少不会将条件包含在最终重构的程序文件507中。这可能意味着没有重构程序文件507,或者创建了仅具有简化功能的程序文件507的版本(缺少消费方103和/或其计算机设备102b不满足相关联条件505的任何主体部分502)。
[0118]
在实施例中,头文件501中的列表504指向存储程序文件507的多个主体部分的多个交易id。在一些此等实施例中,可能存在与主体部分的不同部分相关联的不同相应条件505。这可以用于创建不同的访问层级。这方面的示例性应用是读写文本文件的程序。“读取”功能和“写入”功能可以是代码的两个独立部分,每个部分都有自己的访问控制。
[0119]
在一些实施例中,头文件501可采用加密形式存储在链150上,基于爱丽丝与鲍勃共享的共享密钥进行加密。这仅允许鲍勃(以及知道共享密钥的任何其他人,而非公众)访问头文件501并且因此重构程序文件507。共享密钥可以通过爱丽丝和鲍勃之间经由链下侧信道(未示出)或链上过程进行的密钥协商过程获得。或者在其他实施例中,头文件501无需加密,而是可经由区块链150向公众免费提供。
[0120]
存储在交易中的数据可以保留在utxo集合中。在实施例中,为了更新信息,可以花费包含数据的输出。以前的数据记录在区块链上,但utxo集合中只有最新的信息。因此,区块链指针可始终引用存储在utxo集合中的数据作为最新数据。
[0121]
最新的utxo记录存储在每个存储和/或挖矿节点104s,104m的utxo集合中。这反映了区块链150的最新状态,通常由所有矿工和存储区块链150的整个副本的一些节点保存。一旦记录在区块链上,现有交易便无法更改。相反,因此,在实施例中,通过稍后向链中添加新交易可实现更新,其中新交易花费现有交易的可花费的输出,该现有交易存储着正在更新的数据。因此,现有交易(正在更新的交易)将至少包含可花费的输出(如果数据包含在op_return等中,则可能包含不可花费的输出)。一旦核实,可花费的输出则包含在utxo集合中。utxo集合在部分或全部存储和/或挖矿节点104s,104m维护。为了进行更新,需要花费现有交易的可花费utxo,并且将更新的数据包含在新交易中(例如,同样,使用op_return操作码等,将其包含在新交易的新的不可花费的输出中)。一旦核实,该新交易则包含在utxo集合中。因此,最新消息将在由每个存储和/或挖矿节点104s/m维护的utxo集合中始终可用。
[0122]
现在更详细地讨论上述概念的一些示例性实施细节。
[0123]
可执行文件由汇编级代码以及代码在运行时所需的任何数据、库或脚本组成。通常情况下,这根据操作系统以标准化格式进行组织。例如,windows中的可移植可执行文件(pe)格式,以及linux中的可执行和可链接格式(elf)。尽管结构因格式而异,但它通常由以下组件组成:
[0124]
·
程序头部,该程序头部指定诸如机器和版本信息、文件大小和文件数据的指针等信息;
[0125]
·
节头表,该节头表引用文件中包含的数据;
[0126]
·
数据部分,该数据部分包括代码和其他执行要求。
[0127]
文件中指定对存储所需数据的存储器地址的引用。该文件及其每个依赖项均存储在磁盘上,并且在运行时基于文件中指定的指令在存储器中进行重构。
[0128]
本文中,公开了一种类似的可执行文件格式,以分散的方式存储在区块链上,而非将文件及其依赖项存储在本地磁盘上。该文件格式在本文中可称为区块链可执行格式(bef)。
[0129]
汇编级代码、所需库或者甚至导入数据均存储、压缩和引用在区块链150上。每个组件均存储在单独的交易152中,并且头文件501只需保留txid504以及任何头部信息503、条件505和/或存根506。如下图所示,构建、链接和执行过程均可以由集成的智能钱包/虚拟机执行。
[0130]
头文件501具有头部503,该头部包含上述列出的部分或全部信息(版本、校验和等)。当对bef文件507进行分片时,可执行文件存根506和头部503以及重新汇编和任何访问检查505所需的txid 504均存储在单一交易152y中。该交易152y也可称为文件507的压缩版本。存根506是检查整个文件507的访问条件的可执行代码。
[0131]
bef执行的过程如下所示。图7a至图7b中也示出了该方法。
[0132]
在图7a的步骤中,通过以前的区块链嵌入html文档、用户输入或本地运行代码发起初始文件请求,并发送至区块链网络106。作为回应,智能钱包406返回并且解释头文件501。
[0133]
在步骤s0中,用户103b选择包含头文件501的交易的txid。通过超文本文件中的现有超链接、本地保存的地址或本地执行的代码中的区块链指针,可以实现这一点。
[0134]
在步骤s1中,智能钱包406经由txid请求来请求bef文件,该请求涉及包含头文件501的交易152y。
[0135]
在步骤s2中,网络106用交易信息进行响应,并由智能钱包406进行解释。
[0136]
图7b的步骤示出了智能钱包如何检查头文件501中列出的兼容性和验证条件505。例如,通过运行存根506可以实现这一点。如果满足所有要求,则钱包406请求头文件501的txid列表503中寻址的部分主体502,并且本地汇编可执行文件507。可执行文件以及所需的任何本地库均传送至链接器605,然后链接器在存储器610或611中创建文件并且在cpu 609上执行。结果可通过ui设备607呈现给用户、写入区块链150或在附加脚本中使用。
[0137]
在步骤s3中,当在检索交易中看到文件格式结构标志时,钱包406解释bef文件507,并且请求bef文件中引用的任何进一步交易(如有)(适用时检查任何访问/密钥条件)。
[0138]
在步骤s4中,汇编文件507和任何本地库均传送至虚拟机405中的链接器605。
[0139]
在步骤s5中,机器代码和任何数据均在运行时从磁盘611中提取,汇编在存储器610中,并在cpu 609上执行。
[0140]
在步骤s6中,输出根据程序代码进行解释。该程序代码可包括(但不限于):i)向用户103b显示输出,ii)推送到堆栈以进行in-script运算,iii)作为输入馈送至虚拟机405中运行的另一个代码,和/或iv)经由智能钱包406创建的另一交易写入区块链150,作为新数据或用于更新现有数据。
[0141]
图5中示出了bef文件的结构。此处呈现了拟由智能钱包406解释的bef文件的预期格式。汇编结构507类似于传统的windows pe文件,但为了压缩,该文件被解构成几个不同的交易,允许独立管理数据,并在需要时限制访问。头文件501包含重构所需的所有txid指针504。图5的左侧面板a)示出了分片的可执行文件,该可执行文件分布在几个交易152y,152z中。头文件501包括stub程序506、头部详情503和对持有节头表和执行所需数据的交易的引用504。右侧结构示出了本地汇编的结构。
[0142]
存根506可用于控制可在何处执行文件507或在何种条件下执行。头文件501的其余部分还可包含代码,该代码决定了生成程序的流程和格式。这可以是简单的加载程序,或可以使用多个utxo和交易。解释的代码可分片成不同形式的软件,具体取决于用户交互或预定义的自动机用例。头文件501可具有以下形式。这示出了部分503、504和505。存根506可附加到此格式上。
[0143]
变量类型值无符号短整数版本和系统#无符号短整数文件页码(utxo链接的#)无符号短整数重定位无符号短整数头部的大小无符号短整数最小额外部分无符号短整数最大额外部分无符号短整数utxo-重定位表无符号短整数覆盖(#)无符号短整数校验和无符号短整数保留部分/扩展部分长整数排序信息 验证条件
[0144]
utxo重定位表是指向一个或更多个其他交易152z中一个或更多个部分的指针504列表。在此实施方式中,实际上识别的是引用的txid中的特定utxo,而不仅仅是txid。因此,例如将引用txidz的不可花费的utxo1。
[0145]
头部的末尾包括不同部分502的排序信息。当汇编多个部分502时,应维持与标准编译/执行相同的执行顺序。通过将汇编序列包含在头文件501中(例如,头部信息501中),可以实现这一点。
[0146]
或者,头文件501可仅包含指向单个其他txid的指针。在这种情况下,如果拟汇编多个部分501,则除最后一个部分502外,每个部分(section)本身都将包含小的头部部段(header portion),该头部部段至少包括指向有序链中的下一个txid的指针。然后,程序启动器405将跟随链中的每个指针,以收集所有部分502,用于重构整个文件507。在实施例中,
每个部分502的头部部段可包括与头文件501相同的部分或全部格式,诸如上表中所示的格式。此外,也可以使用多种方法的组合。例如,因此头文件501包含整个文件507的一些部分502的列表504,并且至少其中一个部分本身包含头部部段,该头部部段指向一个或更多个其他部分。同样,程序启动器405跟随每个指针,以收集所需的部分502,用于重构整个文件507。
[0147]
比如,上述头部格式末尾的排序信息可包括对文件的下一部分的引用,该文件可存储在单独交易中,并且一旦满足一定的验证条件,则钱包406可以检索该文件的下一部分。这可能会因为使用不当而出错,并且可标记需要签名,或后面的utxo类型不正确或者需要权限,诸如密钥或满足付款条件。
[0148]
这可以采用密钥核实或选择性解密函数的形式予以实现,诸如基于xor的解密。当从区块链上一个或更多个utxo中的一个或更多个数据源重构代码时,该方法在汇编代码后跳至oep(原始执行点)。然后,该可执行文件传送至链接器605,并在本地计算机上执行。数据作为初始磁盘映像文件(诸如iso)进行加载,并在虚拟机中或可能在浏览器中重构。
[0149]
头文件501独立构造在单一发起交易中,该交易可以公开读取,也可使用选定的密钥读取(诸如xor加密的软件链接,或按pct/ib2017/050856公开的进行编码)。由智能钱包406接收和解释的信息允许虚拟机405确定软件的版本,并确保兼容性。这样做的示例解释参见下一段。
[0150]
执行存根程序:如上所述,合并到设备、虚拟机或浏览器的智能钱包406获取信息,并经由交易中的引用标志确定其为可执行映像文件。bef文件拟执行的第一部分是stub,与pe格式类似。在pe格式中,dos stub验证文件未在dos中执行,如果是,则打印“此程序无法在dos模式下运行”,并且停止执行。在bef文件的背景下,stub可用于指定运行环境(windows、linux或指定虚拟机),并且甚至可用于启动访问认证。客户端凭证可进行解释,如果呈现的信息不足以访问虚拟机的安全区域,则stub程序可用于提示用户进行身份验证,诸如用户名和密码。也可在无法证明访问凭证时指定协议,诸如:i)向用户打印消息并终止执行,ii)通过仅汇编执行数据的指定部分来限制功能;iii)限制对输入数据的访问,和/或iv)将试图访问可执行文件的ip地址列入黑名单。
[0151]
结论
[0152]
应当理解,上述实施例仅通过示例的方式进行描述。
[0153]
更通俗地说,根据本文公开的一方面,提供了一种运行程序的方法,该方法包括由消费方的计算机设备:从在区块链网络的多个节点维护的区块链上记录的第一交易中检索头文件。头文件包括程序头部信息和引用信息,该引用信息包括存储在区块链上的一个或更多个相应第二交易的一个或更多个相应交易id,其中每个第二交易均包括程序文件的主体的相应部分,至少一个部分包括可运行程序代码。该方法进一步包括:通过区块链,基于引用信息从一个或更多个第二交易的至少一个中检索程序文件的相应部分;并且运行包括程序头部信息和至少一个检索部分的程序。
[0154]
在实施例中,所述运行程序可包括:从头部信息和至少一个检索部分重构程序文件,该程序文件包括所述程序,将重构的程序文件存储在消费方的计算机设备的存储器中,并且在消费方的计算机设备上运行重构的程序文件。
[0155]
或者,消费方可以单独执行每个部分,然后传送至下一部分,而不将所有内容汇编
为单一可执行文件。
[0156]
在实施例中,代码可包括汇编级代码,运行可包括对汇编级代码进行汇编和执行汇编的代码。或者,在实施例中,代码可包括高级语言,并且运行可包括编译程序文件的高级代码和执行编译式程序,例如使用即时(jit)编译。作为另一替代实施例,程序文件可包括原始机器代码,运行可包括执行机器代码。在又一替代实施例中,代码可包括高级语言,并且运行可包括解释高级代码。
[0157]
在实施例中,运行可进一步包括链接,例如不同交易的不同部分之间的链接,或给定交易的给定部分内的不同子部分之间的链接。
[0158]
在实施例中,所述引用信息可包括多个第二交易的多个交易id,每个第二交易均存储程序文件的相应主体部分。
[0159]
不同部分可包括程序代码、一个或更多个库和/或由程序操作的数据。
[0160]
在实施例中,所述检索可包括通过区块链从多个第二交易的两个或更多个中检索相应的部分;运行的程序可包括程序头部信息和来自两个或更多个第二交易的检索部分。
[0161]
或者,头文件中的引用信息可仅包括单一交易id,该单一交易id仅引用单一第二交易中的单一主体部分。
[0162]
在实施例中,至少一个第二交易中的至少一个主体部分可本身包括头部部段,该头部部段至少包括对第三交易的引用,该第三交易包含另一主体部分。在这种情况下,运行的程序可包括程序头部和来自第二和第三交易的主体部分。
[0163]
在实施例中,头文件可进一步包括一个或更多个条件;并且该方法可包括评估该条件,其中该程序的至少一个部分的该检索或该运行是以该评估的结果作为条件的。
[0164]
在实施例中,评估可由消费方的计算机设备执行。
[0165]
在实施例中,头文件可包括用于评估一个或更多个条件的可运行代码存根(code stub)。在这种情况下,该方法可包括在消费方的计算机设备上运行代码存根以执行所述评估。
[0166]
在实施例中,条件可包括至少一个访问条件,是关于消费方身份的条件。在这种情况下,评估包括验证消费方的身份与至少一个访问条件指定的身份相匹配,其中检索或运行程序的至少一个部分取决于验证的积极结果。
[0167]
在实施例中,条件可包括至少一个兼容性条件,是关于消费方的计算机设备的兼容性条件。在这种情况下,评估包括:检查消费方的计算机设备是否满足兼容性条件指定的一个或更多个技术准则(technical criteria),其中检索或运行程序的至少一个部分取决于检查的积极结果。
[0168]
兼容性的技术准则可以包括关于消费方计算机设备的硬件的一个或更多个标准。此外/或者,兼容性的技术准则可包括关于消费方计算机设备上所安装软件的一个或更多个准则,例如操作系统上的一个或更多个准则、和/或针对拟安装的一个或更多个姊妹应用程序的一个或更多个准则。
[0169]
在实施例中,该条件可包括与多个部分中的每一个相关联的相应条件,相应条件中的至少一些条件彼此不同。该方法可包括评估与多个部分的至少一些中的每一个相关联的条件,其中检索或运行每个此等部分取决于评估的结果。
[0170]
这有利地提供了不同层级的访问和操作,由此其中一些部分可供使用,而一些部
分则不基于模块化,具体取决于条件(例如,取决于消费方的身份)。
[0171]
在实施例中,该条件可包括针对一些或全部的该部分中的每一部分的关于消费方的身份的相应访问条件,评估包括验证消费方的身份与由每个相应部分的相应条件指定的相应身份相匹配,其中检索或运行相应部分取决于相应验证的积极结果。
[0172]
在实施例中,该条件可包括与针对一些或全部的该部分中的每一部分的关于消费方的计算机设备与相应部分兼容的相应兼容性条件,该评估包括验证消费方的计算机设备满足由每个相应部分的相应条件指定的相应一个或更多个技术准则,其中检索或运行相应部分取决于相应检查的积极结果。
[0173]
在进一步替代或附加实施例中,因为非脚本代码比区块链交易中通常使用的锁定/锁定脚本更加通用,所以该一个或更多个访问条件可包括开发人员希望的任何用户自定义条件。
[0174]
在实施例中,程序头部信息可包括以下一项或多项:程序文件的版本号、程序文件在其上运行的系统的版本号、程序文件的大小、说明、保留变量列表、日期和/或时间戳、校验和、和/或主体部分的排序信息。
[0175]
例如,在实施例中,程序头部信息至少包括版本和大小信息。
[0176]
在实施例中,区块链和区块链网络可被配置为根据基于输出的模型运行,其中每个交易包括至少一个输出和至少一个输入,每个输出包括锁定脚本,每个输入包括指针和解锁脚本,该指针指向另一交易的输出,该解锁脚本用于解锁所指向输出的锁定脚本,其中脚本用脚本语言编制。在这种情况下,头文件和所述程序代码可采用除脚本语言之外的语言编制(编写)。
[0177]
在实施例中,头文件和一个或更多个部分中的每一个均存储在区块链上相应的第一或第二交易的至少一个不可花费的输出中。
[0178]
比如,每个不可花费的输出可通过包含脚本语言的操作码而变得不可花费,该操作码在由区块链网络的节点运行时终止脚本。例如,所述操作码可以是op_return(脚本语言是script)。
[0179]
在实施例中,头文件中的所述引用信息可包括每个第二交易内的单个相应输出的标识符,并且检索可包括从所识别的输出对每个检索部分进行检索。
[0180]
在实施例中,存储在第一交易中的头文件可以加密形式存储,基于消费方与提供程序的提供方之间共享的共享密钥进行加密。在这种情况下,头文件的检索包括基于共享密钥解密头文件。
[0181]
或者,头文件可以不加密,并且因此在链上免费提供给公众。
[0182]
根据本文公开的另一方面,提供了一种包含在计算机可读存储器上的计算机程序,其被配置为当在消费方的计算机设备上运行时用以执行本文公开的任何方法步骤。
[0183]
根据另一方面,提供了消费方的设备,包括:存储器,该存储器包括一个或更多个存储器单元,和处理装置,该处理装置包括一个或更多个处理单元;其中存储器储存被设置在处理装置上运行的代码,代码被配置为在运行时执行根据本文公开的任何实施例的消费方的方法。
[0184]
根据本文公开的另一方面,提供了一种交易的群组,用于记录在区块链中,该群组在计算机可读数据介质或媒体上,该群组包括:第一交易,该第一交易包括头文件,以及一
个或更多个第二交易,每个第二交易包括程序文件的主体的相应部分,该部分中的至少一个部分包含可运行程序代码;其中头文件包括:程序头部信息、和存储在区块链上的一个或更多个第二交易的一个或更多个相应的交易id的集,使得能够通过程序头部信息和该部分中的至少一个部分构造程序文件。
[0185]
根据本文公开的另一方面,可提供一种包括第一方、第二方、可能涉及的任何第三方和/或节点网络的动作的方法。
[0186]
根据本文公开的另一方面,可提供一种包括第一方的计算机设备、第二方的计算机设备、任何第三方的计算机设备和/或节点网络的系统。
[0187]
一旦给出本文的公开内容,所公开技术的其他变体或用例对于本领域技术人员可能变得显而易见。本公开的范围不受所描述的实施例限制,而仅受随附权利要求限制。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献