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

区块链高速缓存系统的制作方法

2022-02-25 22:34:11 来源:中国专利 TAG:

区块链高速缓存系统
相关申请的交叉引用
1.本技术要求于2019年5月14日提交的美国临时专利申请第62/847,591号的优先权,该申请通过引用整体并入本文。


背景技术:

2.区块链是使用密码学链接的数据块的列表。每个区块可能包含列表中前一个区块的哈希值、时间戳和交易数据。为了更改特定块中的数据,可能需要更改区块链中的所有后续块,这可能需要此后续块的共识。出于这个原因,区块链可能是安全存储数据的理想媒介。但是,区块链可能未针对查询进行优化。虽然区块链软件可能包含内置查询机制,例如javascript objection notation-rpc(“json-rpc”),但此类机制可能是原始的,并且仅提供有限的方式来查询区块链。例如,可能无法聚合或过滤区块链交易。此外,虽然这种原始查询机制可能允许人们检索由区块链自己的数据结构支持的立即可用的数据集,但可能无法查询从区块链计算或派生的数据集作为第二层状态机。可用查询机制提供的吞吐量水平也可能较低,有时可能会导致区块链软件崩溃,这可能会导致区块链节点离线重新索引。取决于主机和崩溃的严重程度,重新索引可能需要数小时、数天或数周。在此期间,区块链不能用于生产。


技术实现要素:

3.本公开提供用于从区块链获得数据的系统、方法和计算机程序产品。此处描述的系统可能具有区块链查询服务和单独的高速缓存引擎(cache engine)。高速缓存引擎可以通过抓取区块链并以索引格式将这些数据写入存储,从而直接从区块链获得数据。此后,高速缓存引擎可以复制数据或将数据广播到其他高速缓存引擎。高速缓存引擎还可以将数据提供给区块链查询服务。
4.分别实现区块链查询服务和高速缓存引擎可以带来许多优势。将这两个组件分开可以最小化对区块链的直接查询数量,这可以降低网络带宽要求和区块链崩溃的可能性。将这两个组件分开还可以减少区块链查询的延迟。现有的区块链查询服务可能需要直接抓取整个区块链以更新其状态并响应来自应用的请求,即使实际上只需要区块链数据的小子集来满足这些请求。此过程可能会引入不必要的延迟。相比之下,这里描述的高速缓存引擎可以以有利于查询的索引格式存储区块链数据。通过索引区块链数据,高速缓存引擎可以使区块链数据更快速、更容易地提供给许多不同类型的区块链查询服务。
5.一方面,本公开提供了一种获得区块链数据的方法。该方法可以包括提供区块链系统,该区块链系统包括(i)包括高速缓存存储和区块链爬取器(blockchain crawler)的高速缓存引擎和(ii)通信地耦合到高速缓存引擎的区块链查询服务。区块链查询服务可以包括状态存储和高速缓存爬取器。该方法还可以包括使用区块链爬取器从区块链获得区块链数据并将区块链数据的子集写入高速缓存存储或基于区块链数据的子集更新高速缓存存储的状态。区块链数据的子集可以满足由高速缓存引擎生成的查询。该方法还可以包括
使用高速缓存爬取器从高速缓存存储中获得高速缓存数据并至少基于高速缓存数据更新状态存储的状态。
6.在一些实施方式中,区块链数据的子集包括所有区块链数据。在一些实施方式中,区块链查询服务包括服务器,并且该方法还包括使用服务器将状态存储的状态传送到一个或多个应用。在一些实施方式中,区块链查询服务未直接从区块链获得数据。在一些实施方式中,(c)包括通过向高速缓存引擎发送查询请求或订阅请求来从高速缓存存储获得高速缓存数据。在一些实施方式中,查询至少部分地基于来自区块链查询服务的查询请求或订阅请求。在一些实施方式中,查询至少部分地基于高速缓存存储的当前状态。在一些实施方式中,查询指定要获得的区块链中的多个区块。在一些实施方式中,该方法还包括在将区块链数据的子集写入高速缓存存储时使用高速缓存引擎来发送高速缓存更新事件。在一些实施方式中,查询是一次性查询。在一些实施方式中,查询是订阅。在一些实施方式中,订阅包括在满足时使区块链爬取器从区块链获得数据的条件。在一些实施方式中,条件包括时间或频率。在一些实施方式中,条件包括区块链上的事件。在一些实施方式中,(b)包括以索引格式将区块链数据的子集写入高速缓存存储。在一些实施方式中,索引格式是文件系统、数据库或内存存储。在一些实施方式中,区块链爬取器包括状态转换引擎,其中状态转换引擎将区块链数据的子集写入高速缓存存储。在一些实施方式中,(b)包括使用状态转换引擎来对区块链数据进行规范化、编码、解码、序列化、反序列化、变换或过滤以生成区块链数据的子集。在一些实施方式中,高速缓存存储被配置为最多存储区块链的全部内容的子集。在一些实施方式中,该方法还包括从高速缓存存储中删减与在指定时间范围之外发生的交易相对应的区块链数据。在一些实施方式中,区块链查询服务是多个区块链查询服务中的一个,并且其中多个区块链查询服务中的每一个通信耦合到高速缓存。在一些实施方式中,多个区块链查询服务未直接从区块链获得数据。在一些实施方式中,该方法还包括提供多个附加高速缓存引擎,其中该多个附加高速缓存引擎不包括区块链爬取器;并且使用高速缓存引擎的区块链爬取器将区块链数据的子集写入多个附加高速缓存引擎。在一些实施方式中,多个附加高速缓存引擎中的每一个通信耦合到至少一个附加区块链查询服务。在一些实施方式中,该方法还包括提供附加高速缓存引擎,其中区块链查询服务通信耦合到附加高速缓存引擎。在一些实施方式中,附加高速缓存引擎包括附加高速缓存存储,并且其中高速缓存存储和附加高速缓存存储空间存储相同的数据。在一些实施方式中,附加高速缓存引擎包括附加高速缓存存储,并且其中高速缓存存储和附加高速缓存存储空间存储不同的数据。在一些实施方式中,该方法还包括提供高速缓存注册表,其中高速缓存注册表通信耦合到高速缓存引擎;在高速缓存注册表中存储关于高速缓存引擎的元数据,其中关于高速缓存引擎的元数据可以由包括区块链查询服务的多个区块链查询服务访问。在一些实施方式中,元数据包括高速缓存引擎的唯一标识符。在一些实施方式中,元数据定义由高速缓存引擎提供的服务类型。
7.本公开的另一方面提供了一种包括机器可执行代码的非暂时性计算机可读介质,所述机器可执行代码在由一个或多个计算机处理器执行时实现上述或本文其他地方的任何方法。
8.本公开的另一方面提供了一种系统,该系统包括一个或多个计算机处理器和与其耦合的计算机存储器。计算机存储器包括机器可执行代码,其在由一个或多个计算机处理
器执行时实现上述或本文其他地方的任何方法。
9.根据以下详细描述,本公开的其他方面和优点对本领域技术人员来说将变得显而易见,其中仅示出和描述了本公开的说明性实施方式。应当理解,本公开可以有其他不同的实施方式,并且在不脱离本公开的情况下,可以在各种明显的方面对其若干细节进行修改。因此,附图和描述本质上被认为是说明性的,而不是限制性的。援引加入
10.本说明书中提及的所有出版物、专利和专利申请均以引用方式并入本文,其程度就如同每个单独的出版物、专利或专利申请被具体地和单独地指示为以引用方式并入一样。如果通过引用并入的出版物和专利或专利申请与包含在说明书中的公开内容相矛盾,则该说明书旨在取代和/或优先于任何此类矛盾材料。
附图说明
11.本发明的新颖特征在所附权利要求中具体阐述。通过参考以下阐述说明性实施方式的详细描述,其中利用了本发明的原理,以及附图(也称为“示图”和“图”),将获得对本发明的特征和优点的更好理解,其中:
12.图1示意性地示出了区块链查询服务;
13.图2示意性地示出了区块链高速缓存系统;
14.图3示意性地示出了多路复用以服务多个区块链查询服务的区块链高速缓存系统;
15.图4示出了多路复用以服务多个其他区块链高速缓存系统的区块链高速缓存系统;
16.图5示意性地示出了多路复用以服务多个高速缓存引擎的区块链爬取器;
17.图6示意性地示出了连接到多个高速缓存引擎的区块链查询服务;
18.图7示意性地示出了高速缓存注册系统;
19.图8是爬取区块链的过程的流程图;
20.图9是监听区块链的过程的流程图;
21.图10是与客户端对接的过程的流程图;
22.图11是爬取高速缓存引擎的过程的流程图;
23.图12是监听高速缓存引擎的过程的流程图;
24.图13示意性地示出了图2的区块链高速缓存系统的替代实施方式;以及
25.图14示意性地示出了被编程或以其他方式配置成实施本文提供的方法的计算机系统。
具体实施方式
26.虽然这里已经示出和描述了本发明的各种实施方式,但是对于本领域技术人员来说显而易见的是,这些实施方式仅作为示例提供。在不脱离本发明的情况下,本领域技术人员可以想到多种变化、改变和替换。应当理解,可以采用对这里描述的本发明的实施方式的各种替代。
27.当术语“至少”、“大于”或“大于或等于”在一系列两个或更多个数值中的第一个数
值之前时,术语“至少”、“大于”或“大于或等于”适用于该系列数值中的每个数值。例如,大于或等于1、2或3相当于大于或等于1、大于或等于2、或大于或等于3。
28.当术语“不大于”、“小于”或“小于或等于”在一系列两个或更多个数值中的第一个数值之前时,术语“不大于”、“小于”或“小于或等于”适用于该系列数值中的每个数值。例如,小于或等于3、2或1相当于小于或等于3、小于或等于2、或小于或等于1。
29.图1示出了区块链查询服务102。区块链查询服务102可以具有区块链爬取器104和查询引擎106。区块链爬取器104可以具有区块链客户端108和状态转换引擎110。区块链爬取器104可以经由区块链客户端108与区块链100通信以便爬取区块链100中的数据并填充查询引擎106的状态存储112。爬取可以由区块链客户端108执行。为了爬取区块链100,区块链客户端108可以向与区块链100相关联的应用编程接口(“api”)发出请求(例如,javascript objection notation-rpc(“json-rpc”)请求),直接访问区块链100的文件系统等。该过程可以被称为“爬取”,作为对网络搜索引擎中广泛使用的网络爬取器以从因特网收集和提取数据的引用。区块链爬取器可能类似于网络爬取器,但区块链爬取器可以按时间顺序(例如,按时间顺序从区块1、2、3和4中获取数据)而不是通过网络爬取器通常采用的各种方法来爬取区块链的数据结构。正如网络爬取器试图分析和索引因特网数据的每个有意义的方面一样,区块链爬取器104可以收集从区块链100可用的每条数据。
30.所有这些条数据都可以以各种方式编入索引。此外,区块链数据甚至可以用于构建完全不同类型的虚拟数据库或存储系统。例如,代替存储原始区块链数据,区块链查询服务102可以实施某些规则,这些规则规定应该如何解释和存储新的区块链交易。并且遵循这个规则集,通过使用区块链数据作为输入来操作成熟的状态机是可能的。这种方法可以实现可变数据库的创建。例如,区块链查询服务102可以实现可以处理包括诸如“ 1”、“ 2”、
“‑
1”和“ 3”的命令的交易的状态机。作为此类命令的结果,状态机可以保持状态“5”。这是区块链的有趣用法,因为虽然区块链本身是不可变的存储,但是区块链查询服务102可以利用不可变数据集来为可变存储提供动力,正如刚刚解释的那样。一旦数据通过爬取变得可用,区块链查询服务就可以实现到这个新存储的查询接口,以便外部客户端和应用116可以使用来自查询服务的数据。
31.在区块链客户端108从区块链100获取数据之后,它可以将数据传递给状态转换引擎110,状态转换引擎110可以根据预编程逻辑处理数据。除了使用从区块链客户端108获取的数据之外,状态转换引擎110可以利用状态存储112的当前内容来决定如何更新状态存储112。
32.从区块链100到状态存储112的工作流可以按需执行,或者基于监听来自区块链100的实时事件。例如,区块链客户端108可以监听由区块链100发出的所有系统事件(例如,消息)并触发上述区块链爬取过程。一旦状态存储器112被填充并且可用,服务器引擎114可以连接到状态存储112以向外部应用116提供查询服务。当应用116需要查询区块链,而不是直接查询区块链100时,它可以查询区块链服务102。为此,应用116可以连接到服务器引擎114并发送请求。服务器引擎114可以解释请求、执行状态存储器112的查询、并返回响应。
33.图1的区块链查询服务102可能有一定的限制。由于这种类型的区块链查询服务可能会直接从区块链中抓取数据以维护其状态,因此此类查询服务与特定区块链之间的接口
可能会形成瓶颈,尤其是当此类查询服务同时连接到一个区块链节点实例并从其同步时。解决此问题的一种方法是添加区块链节点软件的其他实例,以便分散每个区块链节点的请求负载。然而,这可能是低效的。
34.首先,为了创建区块链节点软件的附加实例,区块链查询服务可能需要存储区块链的整个状态历史,从区块1开始。这可能需要大量的存储器,并且存储在存储器中的数据的仅很小的子集可能是感兴趣的。其次,区块链节点软件可能需要始终通过网络与区块链查询服务同步,由于网络带宽限制,这可能无法扩展。例如,同步1gb区块链节点的1000个实例需要1tb的网络带宽。
35.类似于图1的区块链查询服务102的区块链查询服务可能有额外的限制。例如,他们可能只有有限的方式从区块链中检索数据,例如通过内置的json-rpc api爬取区块链,直接读取本地区块链文件,或通过直接向连接的区块链点发出点对点数据请求。本地读取区块链文件的限制在于,这种方法只能在本地单机上使用。区块链查询服务可能无法使用此方法从远程区块链实例检索数据。对于使用json-rpc的内置查询方法,存在一些协议,例如http2,其在规模上的性能更高,因为它们执行多路复用(例如,在单个传输介质中组合信号)和http2服务器推送。还存在点对点复制方法,例如ipfs、bittorrent和dat,其可以将复制卸载到网络中的所有播种机。但区块链软件一般不使用此类协议,因为使用此类协议可能会危及区块链的安全性。
36.现有区块链查询服务的另一个限制是特定区块链查询服务可以以有助于该区块链查询服务执行的特定功能而非其他功能或验证的格式存储数据。例如,如果区块链查询服务102是提供计数器服务的状态机,该计数器服务为每个新交易增加其计数器,则区块链查询服务102可以仅将计数器存储在其状态存储112中,而不是保持跟踪所有区块链上发生的事件并在每次应用116进行查询时重建计数器。这对于查询区块链查询服务的第三方应用可能是有效的,但验证数据集的真实性可能并不容易。验证当前状态的真实性可能需要重新爬取区块链100,重建计数器,并将其与状态存储112的当前状态进行比较。
37.在某些情况下,区块链查询服务的功能可能涉及金钱,在这种情况下,验证和真实性尤为重要。例如,区块链查询服务可以实现代币系统。代币可以是基于各种区块链交易模式运行的状态机,并进行状态转换以指示代币转移或其他重要动作。状态机可以以区块链查询服务102的形式存在于区块链之外。因此,区块链网络的矿工可能无法验证代币转移。相反,验证可以是虚拟的,并且可以通过爬取区块链来构建。因为真实性不是由区块链矿工直接强制执行,而是由运行区块链查询服务102的协议强制执行,代币系统的客户可能希望确保代币系统(作为区块链查询服务102实现)的当前状态是准确的并且实际上对应于区块链的状态。
38.因此,区块链的重新爬取可能会变得更加频繁,并且区块链上的负载均衡问题可能会变得更加严重。例如,执法部门可能会要求每个此类区块链查询服务重新抓取区块链以验证真实性。或者,区块链查询服务可能希望不断执行重新爬取以检测和最小化错误。在这种情况下,从状态机诞生之初为每个区块重新爬取区块链可能会给区块链软件100带来过多的负担。
39.现有区块链查询服务的另一个限制是每个区块链查询服务可能集中在它所连接的区块链实例周围。这样的区块链实例可能是故障的中心点。并且由于所有区块链查询服
务必须直接连接到源区块链实例,这些区块链查询服务可能会失去与其源区块链的连接并在某些边缘情况(例如网络分区)期间停止更新,即使区块链本身已启动并运行。区块链数据缺乏低成本的链下复制方法使得区块链查询服务的整个架构和生态系统不可靠且不可扩展。
40.现有区块链查询服务的另一个限制是用于存储数据的系统和用于提供数据的系统不一定需要相同的质量。例如,现有的云存档解决方案(例如amazon glacier)可能与文件传输服务(例如amazon s3)具有不同的设计。amazon glacier系统可能是为存档而设计的,而s3可能是为最终用户使用而设计的。因此,s3可以针对高性能数据加载进行优化,而glacier可以针对低存储成本进行优化。通过将这两个特征捆绑到单个系统中,就像现有的区块链查询服务一样,可能很难针对这两个目的优化系统。上述区块链查询服务的当前技术水平是一种固定架构,其中存档和服务特征捆绑为单个系统。这可能难以优化。
41.上述限制并未使区块链查询服务无法用于早期区块链,因为最初不鼓励将区块链用作数据分类账,因为它们的吞吐量较低。例如,比特币(btc)只能在单个区块中存储1兆字节(“mb”)到4mb的交易数据。但是,较新的区块链网络可能会针对扩展和用作数据分类账进行优化,这可能会加剧上述限制。因此,可能需要模块化的区块链高速缓存和复制系统,以便最小化对区块链的直接查询,并显着降低存储和复制区块链衍生数据的成本。
42.图2示意性地示出了根据一个实施方式的区块链高速缓存系统。区块链高速缓存系统可以具有区块链查询服务102和高速缓存引擎200。高速缓存引擎200可以具有区块链爬取器202和高速缓存服务204。区块链查询服务可以使用高速缓存爬取器216代替图1的区块链爬取器104。高速缓存爬取器216可以与高速缓存引擎200对接,而不是直接爬取区块链100。高速缓存爬取器216可以通过高速缓存客户端218与高速缓存引擎200对接以从高速缓存引擎200获取数据。
43.高速缓存引擎200可以利用区块链爬取器202从区块链100爬取数据并将其填充到高速缓存服务204中。区块链爬取器202可以包括区块链客户端206和状态转换引擎208。高速缓存引擎200的区块链爬取器202可以与图1的区块链查询服务102的区块链爬取器104类似并执行类似的功能。区块链爬取器202可以直接连接到区块链100并从其中提取数据。爬取动作可以使用内置的区块链api(例如json-rpc)来执行,但也可以附加地或替代地通过直接访问本地区块链文件系统或任何其他现有方式来执行。
44.区块链爬取器202可以将提取的数据发送到状态转换引擎208,状态转换引擎208可以基于预编程逻辑使用该数据来更新高速缓存存储210。预编程逻辑可以包括实现数据规范化、编码、解码、序列化、反序列化、变换、过滤等的逻辑。高速缓存存储210可以被实现为文件系统、数据库(例如,关系数据库、文档数据库、图形数据库、键值数据库等)、内存存储等。例如,如果高速缓存存储210被实现为文件系统,则更新它可能涉及创建、更新、移动或删除文件。如果高速缓存存储210被实现为数据库,则状态转换引擎208可以执行数据库插入、更新或删除。如果高速缓存存储210被实现为内存存储,则状态转换引擎208可以在程序中创建、更新或删除各种内存变量。状态转换引擎208也可以利用高速缓存存储210的现有内容来决定如何更新高速缓存存储210的状态。高速缓存存储210中的数据可以以各种方式被索引以使其可快速且容易地被区块链查询服务102访问。
45.高速缓存存储210可以存储区块链100的子集。该子集可以包括在指定时间范围内
发生的区块链交易,例如,过去1小时、过去5小时、过去10小时、过去24小时、过去48小时等。状态转换引擎208可以从高速缓存存储210中修剪指定时间范围之外的交易以为新交易腾出空间。这可以确保高速缓存存储210的查询返回确定性结果。替代地或附加地,该子集可以包括满足特定条件或标准的区块链交易。
46.一旦高速缓存存储210被填充并且可用,它就可以通过高速缓存服务204提供给外部客户端。高速缓存服务204可以包括高速缓存存储210,其状态管理由状态转换引擎208维护。高速缓存服务204还可以包括服务器引擎214,其可以将高速缓存服务204暴露给外部客户端。高速缓存客户端218可以通过服务器引擎214连接到高速缓存服务204并发送请求,描述它正在寻找什么的数据。服务器引擎214然后可以将相关数据从高速缓存存储210传送到高速缓存客户端218。高速缓存客户端218然后可以将数据发送到状态转换引擎220,状态转换引擎220可以以编程方式更新区块链查询服务的状态存储112。数据传输的模式可以是拉式,也可以是推式。例如,高速缓存客户端218可以不断地向服务器引擎214发送请求(即,拉),或者它可以发送初始的一次性请求,之后服务器引擎214可以向高速缓存客户端218推送满足初始请求的数据。区块链查询服务102现在可以通过高速缓存爬取器216从高速缓存引擎200获得其数据,而不是通过区块链爬取器104(图1)直接从区块链100获得数据。区块链查询服务102可以被设计为使得高速缓存爬取器216和区块链爬取器104可以互换地来回切换。如上所述,在集中位置索引和存储区块链数据可能被认为是非常规的,因为区块链传统上具有分散的树结构。
47.图2的组件可以在一个或多个位置中的一个或多个计算设备上实现。计算设备可以是服务器、台式或膝上型计算机、电子平板计算机、移动设备等。计算设备可以位于一个或多个位置中。计算设备可以具有通用处理器、图形处理单元(gpu)、专用集成电路(asic)、现场可编程门阵列(fpga)等。计算设备还可具有存储器,例如动态或静态随机存取存储器、只读存储器、闪存、硬盘驱动器等。存储器可以被配置为存储指令,这些指令在执行时使计算设备实现子系统的功能。计算设备还可以具有网络通信设备。网络通信设备可以使计算设备能够通过网络彼此通信以及与任意数量的用户设备通信。网络可以是有线或无线网络。例如,网络可以是光纤网络、以太网网络、卫星网络、蜂窝网络、网络、网络等。在其他实施方式中,计算设备可以是可通过因特网访问的若干分布式计算设备。这样的计算设备可以被认为是云计算设备。
48.高速缓存引擎200和高速缓存爬取器216可以具有两种操作模式:“爬取模式”和“监听模式”。高速缓存引擎200可以在操作的任何时刻处于爬取模式(图8)或监听模式(图9)。高速缓存爬取器216也可以在操作的任何时刻处于爬取模式(图11)或监听模式(图12)。
49.当高速缓存引擎200处于爬取模式(图8)时,它可以遍历一组查询,以便从区块链中爬取数据并将数据存储在高速缓存存储210中。当高速缓存引擎200处于监听模式时(图9),它可以启动事件循环,监听来自区块链的任何事件,并且仅在检测到相关事件时才执行到高速缓存存储210的状态转换,而不是主动地通过区块链进行迭代。
50.图8是用于将区块链100从区块x爬取到区块y的示例过程的流程图。该过程可以在爬取模式期间由图2的高速缓存引擎200执行。区块链客户端206可以构建query_set,其可以指定区块链爬取器202应该“爬取从x到y的所有区块”(800)。区块链客户端206可以以几种不同的方式构建query_set。例如,区块链客户端206可以创建范围从x到y的整数阵列(例
如,[x,x 1,x 2,...,y])。query_set可以用诸如mongodb、jq或bitquery的查询语言来实现。query_set可以由高速缓存引擎200静态指定。另外或替代地,query_set可以以编程方式动态生成。query_set还可以基于来自连接到高速缓存引擎200的第三方外部客户端的请求,例如来自区块链查询服务102的查询。例如,区块链服务102可以查询高速缓存引擎200并找到它需要的数据在高速缓存存储210中不可用,或者这样的数据不够最新。在这种情况下,query_set可能会指定不可用或不够最新的数据。query_set可能不限于区块高度,还可以指定其他因素,包括区块链的各个方面,例如交易推送数据模式或各种区块链元数据。一个例子可能是区块链交易id的阵列。
[0051]
一旦构建了query_set,区块链客户端206就可以将query_set的index设置为0(802)并使用查询指令query_set[index]开始从区块链100读取(804)。当成功获取用于查询的区块链数据时,区块链客户端206可以将数据发送到状态转换引擎208。状态转换引擎208可以使用其预编程逻辑处理传入数据并相应地更新高速缓存存储210(806)。
[0052]
高速缓存引擎200然后可以发出高速缓存更新事件(808),以防其他组件(例如,另一个高速缓存客户端218d(图4)正在监听进一步复制)。在发出高速缓存事件更新后,区块链客户端206可以将index增加到index 1(810)并通过检查index是否大于或等于query_set的长度来确保query_set没有被完全迭代(812)。如果index不大于或等于query_set的长度,则区块链客户端206可以使用指令queery_set[index 1]查询区块链100(804)。另一方面,如果index大于或等于query_set的长度,则抓取完成。此后,高速缓存引擎200可以停止或进入监听模式(图9)。
[0053]
高速缓存爬取器216的高速缓存客户端218可以以类似的方式爬取高速缓存存储210。这将在图11中更详细地描述。
[0054]
图9是用于监听区块链100的示例过程的流程图。该过程可以由区块链客户端206执行,其可以持久地连接并监听区块链100。区块链客户端206可以从区块链100监听推送到它的相关事件。这与爬取模式(图8)形成对比,其中区块链客户端206通过循环迭代来主动查询区块链100并且一旦迭代完成就停止。
[0055]
区块链客户端206可以构建subscription_query_set(900)。subscription_query_set可以是高速缓存客户端218已经请求区块链客户端206订阅的一组条件。例如,这组条件可以包括匹配某些数据模式(例如,某个字节序列)的交易或属于某个区块链块的交易。该组条件可以是由高速缓存服务204的服务器引擎214内置或可编程的静态条件组。另外或替代地,可以基于预编程逻辑动态生成subscription_query_set。
[0056]
区块链客户端206可以监听来自区块链100的事件(902)。与通过增加索引(810)直到完成遍历整个query_set(812)来连续爬取区块链的爬取模式不同,监听模式仅在发生某些事件时触发爬取动作(904)。当新的区块链事件发生时,高速缓存引擎200的区块链客户端206可以检测到该事件并使用在操作900(906)中构建的subscription_query_set来查询区块链100。如果在区块链100上存在满足由subscription_query_set定义的该组条件的更新,则区块链客户端206可以将数据发送到状态转换引擎208,状态转换引擎208可以处理数据并相应地更新高速缓存存储210(908)。然后,高速缓存引擎200可以发出高速缓存更新事件(910)。高速缓存引擎200的区块链客户端206然后可以继续监听新的区块链事件(902)。subscription_query_set可以是监听每个事件的条件,在这种情况下,可能不需要额外的
查询步骤(906),并且系统可以简单地将事件数据直接传递给状态转换引擎(908)。订阅的使用可以减少区块链查询服务102响应来自应用116的请求所花费的时间,因为响应数据可以很容易地在高速缓存存储210中可用,高速缓存存储210可以很容易地查询,而不是在区块链100中。
[0057]
图10是由高速缓存服务器引擎214执行的用于与客户端对接的示例过程的流程图。一旦高速缓存存储210被填充,它就可以通过服务器引擎214暴露给外部客户端。高速缓存服务器引擎214可以是http网络服务器,或者它可以在类似的协议中实现,例如dat、ipfs、grpc等。
[0058]
服务器引擎214可以监听来自高速缓存客户端218的传入连接(1000)。当检测到来自高速缓存客户端218的传入连接请求时(1002),服务器引擎214可以确定该连接需要的是单个查询请求还是需要持久连接的订阅请求(1004)。如果该请求是订阅请求,则服务器引擎214可以解析该请求以将相关连接元数据存储在其自己的数据库中(1006)。元数据可以包括来自图9的subscription_query_set,以及可用于跟踪和服务高速缓存客户端218的连接实例的各种信息片段。一旦在高速缓存服务204和高速缓存客户端218之间建立连接,高速缓存服务204就可以开始监听高速缓存状态更新事件(1008)。当存在新的高速缓存状态更新事件时(例如,来自图9的操作910),高速缓存服务204可以处理该事件(1010)并通知高速缓存客户端218的相关连接实例(1012)。然后高速缓存服务204可以继续监听附加高速缓存更新事件(1008)。
[0059]
另一方面,如果传入的连接请求1002是一次性查询请求,则服务器引擎214可以用传入的请求查询高速缓存存储210(1014)并将相应的响应返回给高速缓存客户端218(1016)。高速缓存服务204的服务器引擎214然后可以继续监听新连接(1000)。
[0060]
区块链查询服务102可以通过高速缓存爬取器216连接到高速缓存引擎200。高速缓存爬取器216可以连接到高速缓存引擎200并且通过发出请求来检索它想要的数据。该请求可能会要求高速缓存的全部内容,或者可能会要求高速缓存的过滤和处理版本。就像高速缓存引擎200一样,高速缓存爬取器216具有两种模式:爬取模式和监听模式。
[0061]
图11是用于爬取高速缓存存储210的示例过程的流程图。该过程可以在爬取模式期间由高速缓存爬取器216执行。在爬取模式下,高速缓存爬取器216可以构建query_set,该query_set可以定义高速缓存爬取器216想要从高速缓存引擎200获得的数据类型(1100)。高速缓存爬取器216可以迭代query_set并向连接的高速缓存引擎200发出请求。例如,高速缓存爬取器216可能想要获取从区块x到y的所有区块。在这种情况下,query_set可以是x和y之间的整数阵列:[x,x 1,x 2,...y]。
[0062]
为了迭代query_set,高速缓存爬取器216可以将index设置为0(1102)。对于index的每次迭代,高速缓存爬取器216可以通过使用查询指令query_set[index]向高速缓存引擎220发出请求(1004)。但是,此过程不限于多个请求。该过程可能涉及发送导致多个响应的单个批处理请求,甚至是流式请求和响应,这可以通过各种协议(例如http2)来实现。一旦高速缓存引擎200向高速缓存客户端218返回相关响应,高速缓存客户端218就可以处理数据并将数据发送到状态转换引擎220。状态转换引擎220然后可以使用来自高速缓存客户端218的传入数据和状态存储112的内容以执行其自己的预编程逻辑,并最终更新区块链查询服务102的状态存储112(1106)。
[0063]
一旦状态转换完成,高速缓存爬取器216可以将index增加到index 1(1108)并通过检查index是否大于或等于query_set的长度来确保整个query_set已经完全迭代通过(1110)。如果index不大于或等于query_set的长度,则高速缓存爬取器216可以使用查询指令query_set[index 1]来查询高速缓存引擎。另一方面,如果index大于query_set的长度,则高速缓存爬取器可能会停止或进入监听模式。
[0064]
图12是用于监听高速缓存引擎200的示例过程的流程图。该过程可以在监听模式期间由高速缓存爬取器216执行。在监听模式中,高速缓存爬取器216不遍历query_set。相反,高速缓存爬取器216可以最初创建subscription_query_set,其定义了它想要从高速缓存引擎200获得什么类型的数据。高速缓存爬取器216可以将subscription_query_set发送到高速缓存引擎200,监听高速缓存引擎200以获得任何新的高速缓存更新事件,并在高速缓存更新事件到达时对其进行处理。
[0065]
高速缓存爬取器216可以构建subscription_query_set(1200)。subscription_query_set可以是手动创建的静态过滤器、查询语言或可编程函数。subscription_query_set的一个示例是单个项目“all”,这可能意味着“监听所有高速缓存更新事件”。subscription_query_set的另一个示例是定义仅过滤相关高速缓存更新事件的条件过滤器。高速缓存爬取器可能会使用诸如bitquery的查询语言来构建过滤器。附加地或替代地,过滤器可以是用任何编程语言(例如javascript、c、python、java等)编写的映射/过滤器函数。附加地或替代地,subscription_query_set可以同时包括多个这些查询类型,以便订阅多个条件。
[0066]
在构建subscription_query_set之后,高速缓存爬取器216可以向高速缓存引擎发送请求(1202)。从那时起,高速缓存爬取器216可以监听由高速缓存引擎200发出的所有高速缓存更新事件(1204)。这种监听可以使用广泛使用的协议和开放标准(例如websockets或server sent events)从头开始实现,也可以使用许多允许自动同步的现有技术和协议来实现,例如apachekafka、zeromq、rabbitmq、redis,mongodb复制等。当新事件发生时,高速缓存引擎200可以发出高速缓存更新事件,如图10的步骤1012中所述。高速缓存爬取器216可以检测到这一点(1206),并且高速缓存客户端218可以向高速缓存引擎200发出附加爬取请求以获取更新的内容,然后将响应传递给状态转换引擎220,状态转换引擎220然后可以使用传入的数据和状态存储112的内容以编程方式在状态存储112上进行状态转换(1208)。在该状态转换之后,循环返回到步骤1204并且事件循环继续,其中高速缓存爬取器216继续监听连接的高速缓存引擎事件(1204)。在另一个实施方式中,从高速缓存引擎200发出的高速缓存更新事件可以包含所需数据的完整有效载荷并且高速缓存爬取器216可以将该数据直接传递到状态转换引擎220,绕过对附加爬取步骤的需要。
[0067]
图11的query_set和图12的subscription_query_set可以基于来自应用116的请求来构建。在一些情况下,期望的数据可能在高速缓存存储210中不可用。在这种情况下,区块链爬取器202可以从区块链100获得这样的数据并通过状态转换引擎208将其写入到高速缓存存储210。
[0068]
在一些实施方式(图3)中,一个高速缓存引擎200可以服务多个区块链查询服务102a和102b。区块链查询服务102a和102b然后可以分别向应用116a和116b提供数据。在该配置中,应用116a可以连接到区块链查询服务102a以获得数据。区块链查询服务102a可以
包含高速缓存爬取器216a。高速缓存爬取器216a可以包含高速缓存客户端218a和状态转换引擎220a。高速缓存客户端218a可以连接到高速缓存引擎200以请求数据。同样,应用116b可以连接到区块链查询服务102b。区块链查询服务102b可以包含高速缓存爬取器216b。高速缓存爬取器216b可以包含状态转换引擎220b和高速缓存客户端218b。高速缓存客户端218b可以连接到高速缓存引擎200以请求数据。这样,区块链查询服务102a和102b都可以连接到单个共享高速缓存引擎200而不是直接连接到区块链100。图3仅描绘了两个区块链查询服务,许多这样的服务可以同时连接到高速缓存引擎200。图3的配置可能会减少与区块链的连接数量,这可能会减少网络带宽要求和区块链崩溃的可能性。
[0069]
在一些实施方式(图4)中,一个高速缓存引擎可以实现复制服务。高速缓存引擎200c可以充当种子高速缓存引擎,即直接连接到区块链100的高速缓存引擎。一旦高速缓存引擎200c被填充,它就可以向其他高速缓存引擎提供其服务。在这种情况下,高速缓存引擎200d和200e可以具有高速缓存爬取器216d和216e,它们分别通过高速缓存客户端218d和218e连接到种子高速缓存引擎200c。高速缓存客户端218d和218e可以向高速缓存引擎200c发送请求以复制高速缓存引擎200c的高速缓存存储的全部内容。或者,高速缓存客户端218d和218e可以仅请求高速缓存引擎200c的高速缓存存储的内容的子集。然后,高速缓存客户端218d和218e可以分别将数据发送到状态转换引擎220d和220e。高速缓存引擎200d和200e可以暴露自己用于连接,并且区块链查询服务102d和102e可以连接到高速缓存引擎以获得它们的数据。图4的配置可以提高应用程序访问区块链数据的速度,因为这样的应用可以与多个区块链查询服务和多个高速缓存引擎并行对接。
[0070]
在一些实施方式(图5)中,区块链爬取器202可以分别向高速缓存引擎200f、200g和200h中的高速缓存服务204f、204g和204h发送数据,而区块链爬取器202爬取区块链。高速缓存引擎200f和200h可能缺少自己的区块链爬取器。相反,高速缓存引擎202g的区块链爬取器202可以向所有高速缓存引擎200f、200g和200h广播它从区块链获得的数据。这可以提供与图4的配置类似的优点。
[0071]
在一些实施方式(图6)中,区块链查询服务102可以从多个高速缓存引擎200i、200j和200k获得数据。区块链查询服务102可以以任何组合连接到高速缓存引擎200i、200j和200k。例如,区块链查询服务102可以连接到高速缓存引擎200i、200j和200k。或者在正常情况下它可以连接到高速缓存引擎200i,但是当高速缓存引擎200i变得不可用时连接到高速缓存引擎200j或200k。或者它可以连接并读取所有高速缓存引擎200i、200和200k以同时从它们获得数据。区块链查询服务102可以交叉验证这样的数据。高速缓存引擎200i、200j和200k可以存储和服务相同的数据,或者它们可以存储和服务不同的数据(例如,区块链的不同部分)。虽然图6仅描绘了三个高速缓存引擎,但是区块链查询服务102可以连接到许多高速缓存引擎。
[0072]
图3至图6中描述的实施方式可以以任意组合集成在一起。例如,多个高速缓存引擎可以连接到单个区块链,如图5所示。然后,多个高速缓存引擎中的每一个都可以连接到多个区块链查询服务,如图3所示,或多个其他高速缓存引擎,如图4所示。此外,任何图3-图6中的区块链服务和高速缓存引擎的数量可能更小或更大。例如,图6的实施方式中的高速缓存引擎的数量可以是大约1、2、3、5、10、20、50、100、1000或更多。
[0073]
图2至图6中的区块不一定对应于单个物理机器(例如,计算机)。例如,在图2中,区
块链查询服务组件102和高速缓存引擎200可以在相同的机器上实现,也可以在不同的机器上实现。服务器引擎114可以与状态存储112在相同的机器上,也可以不在相同的机器上。状态转换引擎220和高速缓存客户端218可以在相同的机器上,也可以不在相同的机器上。服务器引擎214和高速缓存存储210可以在相同的机器上,也可以不在相同的机器上。并且状态转换引擎208和区块链客户端206可以在相同的机器上,也可以不在相同的机器上。此外,区块链100本身可能与其他组件在相同的机器上,也可以不在相同的机器上。所有这些组件都可以实现为微服务,并分布在多个主机上,这些主机使用本文中描述的任何方法通过网络相互通信。
[0074]
在一些实施方式中,高速缓存引擎可以向高速缓存注册表通告其自身以允许来自各种高速缓存客户端的发现。在图7中,高速缓存引擎200的高速缓存服务204可以通过使用唯一可识别信息以及它提供的高速缓存服务类型的元数据发出请求来向高速缓存注册表700a和700b通告其自身。然后高速缓存客户端218可以通过查找高速缓存注册表700a和700b来发现高速缓存引擎200,并且一旦发现就连接到高速缓存引擎。高速缓存注册表700a和700b可以采用不同的形式。例如,它们可能存储在带有数据库的中央服务器上。或者,高速缓存注册表可以是分布式哈希表。在另一个实施方式中,图7可以以相反的方式实现,其中高速缓存客户端218向高速缓存注册表通告其自身并且高速缓存服务204发现高速缓存客户端218,之后高速缓存服务204可以连接到高速缓存客户端。这可以使高速缓存客户端发现以前未知的高速缓存服务,反之亦然。
[0075]
在一些实施方式中,高速缓存服务204可以维护附加数据库以管理来自高速缓存客户端218的传入连接。高速缓存客户端218可以做出包含特定元数据的特定请求,并且高速缓存服务204可以存储每个客户端的元数据。这可能包括为每个请求向每个客户端传送定制响应,或用于在高速缓存爬取器监听模式(图12)期间传送定制事件,或管理会话以记住高速缓存客户端所需的信息。
[0076]
在一些实施方式中,高速缓存系统可以不基于请求-响应模式而是基于持久同步来运行。例如,在图2中,高速缓存客户端218可以不主动从高速缓存服务204请求数据,而是作为高速缓存存储210的复制实例存在。这可以通过许多存储系统和协议(例如mongodb、couchdb、apachekafka、dat和ipfs)支持的各种数据复制方法来实现。高速缓存存储210可以实现这样的复制方法之一并且用作主实例,并且高速缓存客户端218的各种实现可以嵌入复制高速缓存存储210的跟随者复制实例。然后,随着高速缓存客户端218同步到新的状态,它可以将新的更新发送到状态转换引擎220,然后状态转换引擎220处理和更新状态存储112。或者,状态存储112本身可以实现为高速缓存存储210的跟随者复制实例,在这种情况下状态存储112可以跳过高速缓存客户端218和状态转换引擎220而直接更新存储。
[0077]
在一些实施方式中,高速缓存爬取器216可以请求全部区块数据的完整集合,该数据不仅可以包括区块中的所有原始事务,还可以包括区块的默克尔根,高速缓存客户端218可以用于验证其余数据的真实性,而无需信任高速缓存引擎提供者。
[0078]
在一些实施方式中,事件可以被模拟为频繁轮询。例如,高速缓存客户端可能会不断轮询高速缓存引擎以获得更新,而不是监听来自高速缓存引擎的事件。
[0079]
在一些实施方式(图13)中,区块链100可以由链下区块链交易存储1300代替。链下交易存储1300可以是存储在区块链之外的已签名或未签名区块链交易的存储系统。链下区
块链交易存储1300可以是由区块链的用户维护的存储系统,或者它可以是由代表最终用户将交易写入区块链的实体(例如,收费)维护的存储系统。最终用户可以使用链下交易存储来临时存储交易,然后再将它们广播到区块链对等网络,或直接发送给区块链矿工。区块链矿工也可以使用链下交易存储以在广播之前直接接受用户的交易。区块链矿工可以使用链下交易存储来直接接受用户提交的交易,以便将来在他们挖掘区块时将它们包含在区块中。它可以用于许多其他目的。链下区块链交易存储1300可以连接到链下区块链交易存储api服务1302。链下区块链交易存储api客户端1304可以向api服务1302发送区块链交易。api服务1302然后可以将其存储到链下区块链交易存储1300。在这种情况下,高速缓存引擎200可以爬取和监听这个链下区块链交易存储1300而不是区块链100,但是架构的其余部分可以是相同的。链下区块链交易存储1300可以被优化用于存储,但不是读取或过滤。例如,链下交易存储1300可以被实现为使用诸如apache kafka的系统的仅附加日志结构,或者它可以被简单实现为到文件系统中的原始转储。链下区块链交易存储1300可以确保存储的交易可以在以后检索,但可能不会被设计为提供灵活且强大的索引和查询接口。因此,高速缓存引擎200可以提供与爬取区块链100相同类型的值。计算机系统
[0080]
本公开提供了被编程以实现本公开的方法的计算机系统。图14示出了计算机系统1401,其被编程或以其他方式配置为实现图2的区块链查询服务102或高速缓存引擎200,或执行图8-图12的过程。
[0081]
计算机系统1401包括中央处理单元(cpu,在此也称为“处理器”和“计算机处理器”)1405,其可以是单核或多核处理器,也可以是用于并行处理的多个处理器。计算机系统1401还包括存储器或存储器位置1410(例如,随机存取存储器、只读存储器、闪存)、电子存储单元1415(例如,硬盘)、用于与一个或多个其他系统通信的通信接口1420(例如,网络适配器)和外围设备1425,例如高速缓存、其他存储器、数据存储和/或电子显示适配器。存储器1410、存储单元1415、接口1420和外围设备1425通过诸如母板的通信总线(实线)与cpu1405通信。存储单元1415可以是用于存储数据的数据存储单元(或数据仓库)。计算机系统1401可以在通信接口1420的帮助下可操作地耦合到计算机网络(“网络”)1430。网络1430可以是因特网、互联网和/或外部网、或正在与因特网通信的内联网和/或外联网。在一些情况下,网络1430是电信和/或数据网络。网络1430可以包括一个或多个计算机服务器,其可以实现分布式计算,例如云计算。在某些情况下,在计算机系统1401的帮助下,网络1430可以实现对等网络,其可以使耦合到计算机系统1401的设备能够充当客户端或服务器。
[0082]
cpu1405可以执行一系列机器可读指令,这些指令可以体现在程序或软件中。指令可以存储在存储器位置中,例如存储器1410。指令可以被引导到cpu1405,cpu1405可以随后对cpu1405进行编程或以其他方式配置以实现本公开的方法。cpu1405执行的操作的示例可以包括获取、解码、执行和写回。
[0083]
cpu1405可以是电路的一部分,例如集成电路。系统1401的一个或多个其他组件可以包括在电路中。在某些情况下,该电路是专用集成电路(asic)。
[0084]
存储单元1415可以存储文件,例如驱动程序、库和保存的程序。存储单元1415可以存储用户数据,例如用户偏好和用户程序。在一些情况下,计算机系统1401可以包括位于计算机系统1401外部,例如位于通过内联网或因特网与计算机系统1401通信的远程服务器上
的一个或多个附加数据存储单元。
[0085]
计算机系统1401可以通过网络1430与一个或多个远程计算机系统通信。例如,计算机系统1401可以与用户的远程计算机系统(例如,在其上实现应用116的计算机)通信。远程计算机系统的示例包括个人计算机(例如,便携式pc)、平板或平板计算机(例如ipad、galaxytab)、电话、智能电话(例如iphone、支持android的设备、)或个人数字助理。用户可以通过网络1430访问计算机系统1401。
[0086]
如本文所述的方法可以通过存储在计算机系统1401的电子存储位置(例如,存储器1410或电子存储单元1415)上的机器(例如,计算机处理器)可执行代码来实现。机器可执行或机器可读代码可以以软件的形式提供。在使用过程中,该代码可由处理器1405执行。在某些情况下,该代码可从存储单元1415中检索并存储在存储器1410中以供处理器1405随时访问。在某些情况下,电子存储单元1415可以排除,并且机器可执行指令被存储在存储器1410上。
[0087]
代码可以被预编译和配置为与具有处理器的机器一起使用,该处理器适于执行代码或者可以在运行时被编译。代码可以以编程语言提供,可以选择该语言以使代码能够以预编译或编译时的方式执行。
[0088]
在此提供的系统和方法的方面,例如计算机系统1401,可以体现在编程中。该技术的各个方面可以被认为是“产品”或“制品”,其通常以机器(或处理器)可执行代码和/或相关数据的形式承载或包含在一种机器可读介质中。机器可执行代码可以存储在电子存储单元上,例如存储器(例如,只读存储器、随机存取存储器、闪存)或硬盘。“存储”类型的介质可以包括计算机、处理器等或其相关模块的任何或所有有形存储器,例如各种半导体存储器、磁带驱动器、磁盘驱动器等,其可以随时提供非暂时性存储以进行软件编程。软件的全部或部分有时可以通过因特网或各种其他电信网络进行通信。例如,这样的通信可以使软件能够从一台计算机或处理器加载到另一台计算机或处理器中,例如从管理服务器或主机计算机加载到应用服务器的计算机平台中。因此,可以承载软件元件的另一种类型的媒体包括光波、电波和电磁波,例如跨本地设备之间的物理接口、通过有线和光学陆线网络以及通过各种空中链路使用。承载这种波的物理元件,例如有线或无线链路、光链路等,也可以被认为是承载软件的介质。如本文所用,除非限于非暂时性、有形“存储”介质,诸如计算机或机器“可读介质”的术语是指参与向处理器提供指令以供执行的任何介质。
[0089]
因此,诸如计算机可执行代码的机器可读介质可以采用多种形式,包括但不限于有形存储介质、载波介质或物理传输介质。非易失性存储介质包括例如光盘或磁盘,例如任何计算机等中的任何存储设备,诸如可用于实现图中所示的数据库等。易失性存储介质包括动态存储器,例如此类计算机平台的主存储器。有形传输介质包括同轴电缆;铜线和光纤,包括构成计算机系统内总线的电线。载波传输介质可以采用电信号或电磁信号,或声波或光波的形式,例如在射频(rf)和红外(ir)数据通信期间产生的那些。因此,常见形式的计算机可读介质包括例如:软盘、软盘、硬盘、磁带、任何其他磁介质、cd-rom、dvd或dvd-rom、任何其他光学介质、打孔卡纸磁带、任何其他带有孔洞图案的物理存储介质、ram、rom、prom和eprom、flash-eprom、任何其他存储芯片或盒式磁带、传输数据或指令的载波、传输此类载波的电缆或链接,或计算机可以从中读取编程代码和/或数据的任何其他介质。许多这些
形式的计算机可读介质可能涉及将一个或多个指令的一个或多个序列传送到处理器以供执行。
[0090]
计算机系统1401可以包括电子显示器1435或与电子显示器1435通信,该电子显示器1435包括用于提供例如此处描述的任何api或应用(例如,应用116)的用户界面(ui)1440。ui的示例包括但不限于图形用户界面(gui)和基于web的用户界面。
[0091]
本公开的方法和系统可以通过一种或多种算法来实现。算法可以在中央处理单元1405执行后通过软件的方式实现。该算法可以例如是实现如图8中的区块链爬取模式的算法或图9中的区块链监听模式。
[0092]
虽然这里已经示出和描述了本发明的优选实施方式,但是对于本领域技术人员来说,这些实施方式仅作为示例提供是显而易见的。本发明不旨在受说明书中提供的特定示例的限制。虽然已经参考前述说明书描述了本发明,但是这里的实施方式的描述和图示并不意味着被解释为限制性的。在不脱离本发明的情况下,本领域技术人员现在将想到许多变化、改变和替换。此外,应当理解,本发明的所有方面不限于这里阐述的具体描述、配置或相对比例,这些具体描述、配置或相对比例取决于各种条件和变量。应当理解,在实践本发明时可以采用对这里描述的本发明的实施方式的各种替代。因此预期本发明还应涵盖任何此类替代、修改、变化或等效物。以下权利要求旨在限定本发明的范围,并且由此涵盖在这些权利要求及其等同物范围内的方法和结构。
再多了解一些

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

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

相关文献