用于在网络内高效地实现分布式数据库的方法和设备与流程

文档序号:20118472发布日期:2020-03-17 20:35阅读:205来源:国知局
用于在网络内高效地实现分布式数据库的方法和设备与流程

相关申请的交叉引用

本申请要求2017年7月11日提交的、标题为“methodsandapparatusforefficientlyimplementingadistributeddatabasewithinanetwork”的美国临时申请no.62/531,153的优先权和权益,该申请整个地通过引用并入本文。

本文中所描述的实施例总体上涉及一种数据库系统,更具体地,涉及用于跨网络中的多个装置实现数据库系统的方法和设备。



背景技术:

一些已知的分布式数据库系统试图在分布式数据库系统内对值(例如,关于事务发生的次序)实现共识。例如,在线多玩家游戏可能具有用户可以接入玩游戏的许多计算机服务器。如果两个用户同时试图在游戏中拾取特定的物品,则重要的是,分布式数据库系统内的服务器最终就这两个用户中的哪个首先拾取该物品达成协定。

这样的分布式共识可以用诸如paxos算法或其变型的方法和/或处理来进行处理。按照这样的方法和/或处理,数据库系统的一个服务器被设置为“领导者”,领导者决定事件的次序。事件(例如,多玩家游戏内的事件)被转发给领导者,领导者选择事件的排序,领导者向数据库系统的其他服务器广播该排序。

然而,这样的已知的方法使用由数据库系统的用户(例如,游戏玩家)信任的一方运营的服务器(例如,中央管理服务器)。因此,对用于不需要领导者或受信任的第三方来操作数据库系统的分布式数据库系统的方法和设备的需要存在。



技术实现要素:

在一些实施例中,一种设备包括处理器和存储器,存储器操作地耦合到处理器,并且与被配置为包括在一组计算装置内的第一计算装置处的分布式数据库的实例相关联,所述一组计算装置经由操作地耦合到所述一组计算装置的网络来实现分布式数据库。处理器被配置为选择匿名通信路径,匿名通信路径与(a)实现分布式数据库的所述一组计算装置中的第二计算装置和(b)计算装置标识符集合相关联。匿名通信路径由盲化公钥序列定义。盲化公钥序列中的每个盲化公钥与实现匿名通信路径的计算装置集合中的计算装置的假名相关联。处理器被配置为产生用盲化公钥序列中包括的第一盲化公钥加密的加密消息。第一盲化公钥与第二计算装置相关联。处理器被配置为产生包括加密消息和计算装置标识符集合中的计算装置标识符的加密数据包。计算装置标识符与第二计算装置相关联。加密数据包被用盲化公钥序列中的第二盲化公钥加密。处理器被配置为将加密数据包发送给实现匿名通信路径的计算装置集合中的第三计算装置。

附图说明

图1是例示说明根据实施例的分布式数据库系统的高级框图。

图2是例示说明根据实施例的分布式数据库系统的计算装置的框图。

图3-6例示说明根据实施例的散列图的例子。

图7是例示说明根据实施例的第一计算装置和第二计算装置之间的通信流程的流程图。

图8是根据实施例的散列图的例子。

图9是根据实施例的散列图的例子。

图10a-10b例示说明根据实施例的用于与散列图一起使用的示例共识方法。

图11a-11b例示说明根据另一实施例的用于与散列图一起使用的示例共识方法。

图12a-12b例示说明根据另一实施例的用于与散列图一起使用的示例共识方法。

具体实施方式

在一些实施例中,一种设备包括处理器和存储器,存储器操作地耦合到处理器,并且与被配置为包括在一组计算装置内的第一计算装置处的分布式数据库的实例相关联,所述一组计算装置经由操作地耦合到所述一组计算装置的网络来实现分布式数据库。处理器被配置为选择匿名通信路径,匿名通信路径与(a)实现分布式数据库的所述一组计算装置中的第二计算装置和(b)计算装置标识符集合相关联。匿名通信路径由盲化公钥序列定义。盲化公钥序列中的每个盲化公钥与实现匿名通信路径的计算装置集合中的计算装置的假名相关联。处理器被配置为产生用盲化公钥序列中包括的第一盲化公钥加密的加密消息。第一盲化公钥与第二计算装置相关联。处理器被配置为产生包括加密消息和计算装置标识符集合中的计算装置标识符的加密数据包。计算装置标识符与第二计算装置相关联。加密数据包被用盲化公钥序列中的第二盲化公钥加密。处理器被配置为将加密数据包发送给实现匿名通信路径的计算装置集合中的第三计算装置。

在一些实施例中,通过以下步骤产生第一盲化密钥:从预定义的值集合(g)选择第一随机值(r1)以使得r1是g的发生器,并且从预定义的值集合(g)选择第二随机值(r2),值集合(g)是代数群。公钥被定义为基于第一随机值(r1)和第二随机值(r2)的对(b,h)。对(b,h)被定义为(r1,r1^r2)。第三随机值(r3)选自预定义的值集合(g)。第三随机值(r3)被选为使得b^r3是g的发生器。第一盲化密钥被定义为基于公钥和第三随机值(r3)的对(b’,h’)。对(b’,h’)被定义为(b^r3,h^r3)。如本文中所使用的,“^”意指幂和/或求幂(*算子的重复应用)。因此,b^r3意指对于b的r3的幂和/或*算子对于b的r3-1次应用。

在一些实施例中,一种非暂时性处理器可读介质包括当被处理器执行时使处理器执行以下步骤的代码:在第一计算装置处从预定义的值集合(g)选择第一随机值(r1)以使得r1是g的发生器,并且从预定义的值集合(g)选择第二随机值(r2),值集合(g)是代数群。所述代码进一步包括使处理器将公钥定义为基于第一随机值(r1)和第二随机值(r2)的对(b,h)的代码。对(b,h)被定义为(r1,r1^r2)。所述代码进一步包括使处理器将公钥(b,h)提供给第二计算装置以使得第二计算装置通过以下操作来安全地将消息(m)提供给第一计算装置的代码:从预定义的值集合(g)选择第三随机值(r3);使用公钥(b,h)和第三随机值(r3)对消息(m)进行加密以将加密的密码文本定义为(x,y)=(b^r3,m*h^r3);并且将加密的密码文本(x,y)发送给第一计算装置。所述代码进一步包括使处理器从第二计算装置接收加密的密码文本(x,y)并且使用第二随机值(r2)对加密的密码文本(x,y)进行解密以识别消息(m)的代码。在一些情况下,公钥(b,h)是盲化公钥。

在一些实施例中,一种非暂时性处理器可读介质包括当被处理器执行时使处理器为实现分布式数据库的一组计算装置中的计算装置集合通过盲化公钥序列定义匿名通信路径的代码。计算装置集合定义匿名通信路径。盲化公钥序列中的每个盲化公钥与实现分布式数据库的一组计算装置中的不同的计算装置的假名相关联。所述代码进一步包括使处理器产生计算装置标识符集合的代码,计算装置标识符集合包括(1)识别所述一组计算装置中的计算装置的未加密计算装置标识符和(2)加密计算装置标识符序列。加密计算装置标识符序列中的每个加密计算装置标识符被用盲化公钥序列中的不同的盲化公钥加密。所述代码进一步包括使处理器将盲化公钥序列和计算装置标识符集合提供给所述一组计算装置中的至少一个计算装置、以使得所述至少一个计算装置可以对处理器定义用于经由匿名通信路径发送的消息的代码。所述代码进一步包括使处理器经由匿名通信路径接收用盲化公钥序列中的盲化公钥加密的消息、并且用与盲化公钥序列中的该盲化公钥相关联的私钥对该消息进行解密的代码。

在一些实施例中,一种设备包括存储器和操作地耦合到存储器的处理器,存储器与被配置为包括在多个计算装置内的第一计算装置处的分布式数据库的实例相关联,所述多个计算装置经由操作地耦合到所述多个计算装置的网络来实现分布式数据库。处理器被配置为基于确定性的伪随机函数来定义所述多个计算装置中的第一组计算装置和所述多个计算装置中的第二组计算装置。处理器被配置为从所述多个计算装置中的第二计算装置接收链接到由所述多个计算装置中的计算装置集合定义的第一事件集合的事件。计算装置集合包括第一组计算装置中的至少一个计算装置和第二组计算装置中的至少一个计算装置。处理器被配置为作为(1)使用由第一组计算装置中的计算装置定义的第一事件集合中的事件的参数的值、(2)而不使用由第二组计算装置中的计算装置定义的第一事件集合中的事件的参数的值的共识协议的结果,识别与第二事件集合相关联的次序。处理器被配置为:至少部分地基于与第二事件集合相关联的次序来识别与分布式数据库的实例中指示的事务集合相关联的次序,并且将与事务集合相关联的次序存储在分布式数据库的实例中。

在一些实施例中,一种设备包括被配置为包括在计算装置集合内的第一计算装置处的分布式数据库的实例,计算装置集合经由操作地耦合到计算装置集合的网络来实现分布式数据库。设备还包括操作地耦合到存储分布式数据库的实例的存储器的处理器。处理器被配置为在第一时间处定义链接到第一事件集合的第一事件。处理器被配置为在第一时间之后的第二时间处、从计算装置集合中的第二计算装置接收表示第二事件的信号,第二事件(1)由第二计算装置定义并且(2)链接到第二事件集合。处理器被配置为至少基于协议的结果来识别与第三事件集合相关联的次序。第三事件集合中的每个事件来自第一事件集合或第二事件集合中的至少一个。处理器被配置为将与第三事件集合相关联的次序存储在分布式数据库的实例中。

在一些情况下,第三事件集合中的每个事件与属性(例如,序列号、世代号、轮次号、接收的编号和/或时间戳等)集合相关联。协议的结果可以包括关于第三事件集合中的每个事件的属性集合中的每个属性的值。属性集合中的第一属性的值可以包括第一数值,属性集合中的第二属性的值可以包括与第一数值相关联的二进制值。关于第三事件集合中的事件的第二属性(例如,轮次增量值)的二进制值可以基于该事件和链接到该事件的第四事件集合之间的关系是否满足准则(例如,由该事件强识别的若干个事件)。第四事件集合中的每个事件是(1)第三事件集合中的事件的祖先,并且(2)与和第四事件集合中的剩余的事件共同的第一共同属性(例如,共同的轮次号、是第r轮第一个事件的指示等)相关联。第一共同属性可以指示由计算装置集合中的每个计算装置定义的事件与第一特定值(例如,是第r轮第一个事件的指示等)相关联的第一实例。

属性集合中的第三属性(例如,接收轮次号)的值可以包括基于事件和链接到该事件的第五事件集合之间的关系的第二数值。第五事件集合中的每个事件是该事件的后代,并且与和第五事件集合中的剩余的事件共同的第二共同属性(例如,是著名的)相关联。第二共同属性可以与(1)第三共同属性(例如,是第r轮第一个事件或证据(witness))和(2)基于指示集合的结果相关联,第三共同属性指示由计算装置集合中的每个计算装置定义的第二事件与不同于第一特定值的第二特定值相关联的第一实例。指示集合中的每个指示可以与第六事件集合中的事件相关联。第六事件集合中的每个事件可以与第四共同属性相关联,第四共同属性指示由计算装置集合中的每个计算装置定义的第三事件与不同于第一特定值和第二特定值的第三特定值相关联的第一实例。在一些情况下,第一特定值是第一整数(例如,第一轮次号r),第二特定值是大于第一整数的第二整数(例如,第二轮次号r+n),第三特定值是大于第二整数的第三整数(例如,第三轮次号r+n+m)。

在一些实施例中,一种设备包括存储器和处理器。存储器包括被配置为包括在计算装置集合内的第一计算装置处的分布式数据库的实例,计算装置集合经由操作地耦合到计算装置集合的网络来实现分布式数据库。处理器操作地耦合到存储分布式数据库的实例的存储器,并且被配置为接收表示链接到事件集合的事件的信号。处理器被配置为至少基于协议的结果来识别与事件集合相关联的次序。处理器被配置为将与事件集合相关联的次序存储在分布式数据库的实例中。

在一些实施例中,一种非暂时性处理器可读介质存储表示处理器将执行的指令的代码,所述代码用于接收表示链接到事件集合的事件的信号,并且基于与事件集合中的每个事件相关联的轮次和何时递增与每个事件相关联的轮次的指示来识别与事件集合相关联的次序。所述代码进一步包括使处理器将与事件集合相关联的次序存储在被配置为包括在计算装置集合内的第一计算装置处的分布式数据库的实例中的代码,计算装置集合经由操作地耦合到计算装置集合的网络来实现分布式数据库。分布式数据库的实例操作地耦合到处理器。

在一些实施例中,第一计算装置处的分布式数据库的实例可以被配置为包括在计算装置集合内,计算装置集合经由操作地耦合到计算装置集合的网络来实现分布式数据库。第一计算装置将多个事务存储在分布式数据库的实例中。数据库收敛模块可以在第一计算装置的存储器或处理器中实现。数据库收敛模块可以与分布式数据库的实例操作地耦合。数据库收敛模块可以被配置为在第一时间处定义链接到第一事件集合的第一事件。第一事件集合中的每个事件是字节序列,并且与(1)多个事务集合中的一个事务集合和(b)该事务集合所关联的次序相关联。事务集合中的每个事务来自多个事务。数据库收敛模块可以被配置为在第一时间之后的第二时间处、从计算装置集合中的第二计算装置接收第二事件,第二事件(1)由第二计算装置定义并且(2)链接到第二事件集合。数据库收敛模块可以被配置为定义链接到第一事件和第二事件的第三事件。数据库收敛模块可以被配置为至少基于第一事件集合和第二事件集合来识别与第三事件集合相关联的次序。第三事件集合中的每个事件来自第一事件集合或第二事件集合中的至少一个。数据库收敛模块可以被配置为至少基于以下各项来识别与多个事务相关联的次序:(1)与第三事件集合相关联的次序;以及(2)与多个事务集合中的每个事务集合相关联的次序。数据库收敛模块可以被配置为将存储在第一计算装置中的多个事务所关联的次序存储在分布式数据库的实例中。

在一些实施例中,第一计算装置处的分布式数据库的实例可以被配置为被包括在计算装置集合内,计算装置集合经由操作地耦合到计算装置集合的网络来实现分布式数据库。数据库收敛模块可以在第一计算装置的存储器或处理器中实现。数据库收敛模块可以被配置为在第一时间处定义链接到第一事件集合的第一事件。第一事件集合中的每个事件是字节序列。数据库收敛模块可以被配置为在第一时间之后的第二时间处、从计算装置集合中的第二计算装置接收第二事件,第二事件(1)由第二计算装置定义并且(2)链接到第二事件集合。第二事件集合中的每个事件是字节序列。数据库收敛模块可以被配置为定义链接到第一事件和第二事件的第三事件。数据库收敛模块可以被配置为至少基于第一事件集合和第二事件集合来识别与第三事件集合相关联的次序。第三事件集合中的每个事件来自第一事件集合或第二事件集合中的至少一个。数据库收敛模块可以被配置为将与第三事件集合相关联的次序存储在分布式数据库的实例中。

在一些实施例中,与第一事务相关联的数据可以在计算装置集合中的第一计算装置处接收,计算装置集合经由操作地耦合到计算装置集合的网络来实现分布式数据库。计算装置集合中的每个计算装置具有分布式数据库的单独的实例。与第一事务相关联的第一事务次序值可以在第一时间处定义。与第二事务相关联的数据可以从计算装置集合中的第二计算装置接收。事务集合可以被存储在第一计算装置处的分布式数据库的实例中。事务集合可以至少包括第一事务和第二事务。至少包括第一事务次序值和第二事务次序值的事务次序值集合可以在第一时间之后的第二时间处选择。第二事务次序值可以与第二事务相关联。数据库状态变量可以至少基于事务集合和事务次序值集合定义。

如本文中所使用的,模块可以例如是与执行特定功能相关联的任何组装件和/或操作地耦合的电气组件的集合,并且可以包括例如存储器、处理器、电气迹线、光学连接器、软件(在硬件中执行)等。

如本说明书中所使用的,单数形式“一种”、“一个”和“该”包括复数指代物,除非上下文另有清楚指示。因此,例如,术语“模块”意图意指单个模块或模块组合。例如,“网络”意图意指单个网络或网络组合。

图1是例示说明根据实施例的分布式数据库系统100的高级框图。图1例示说明跨四个计算装置(计算装置110、计算装置120、计算装置130和计算装置140)实现的分布式数据库100,但是应理解,分布式数据库100可以使用任何数量的计算装置(包括图1中未示出的计算装置)的集合。网络105可以是被实现为有线网络和/或无线网络并且被用于操作地耦合计算装置110、120、130、140的任何类型的网络(例如,局域网(lan)、广域网(wan)、虚拟网络、电信网络)。如本文中更详细地描述的,在一些实施例中,例如,计算装置是经由互联网服务提供商(isp)和互联网(例如,网络105)彼此连接的个人计算机。在一些实施例中,连接可以经由网络105定义在任何两个计算装置110、120、130、140之间。如图1所示,例如,连接可以定义在计算装置110和计算装置120、计算装置130或计算装置140中的任何一个之间。

在一些实施例中,计算装置110、120、130、140可以彼此进行通信(例如,彼此发送数据和/或接收数据)和经由中间网络和/或替代网络(图1中未示出)与网络进行通信。这样的中间网络和/或替代网络可以是与网络105相同类型和/或不同类型的网络。

每个计算装置110、120、130、140可以是被配置为通过网络105发送数据以从其他计算装置中的一个或多个发送和/或接收数据的任何类型的装置。计算装置的例子在图1中示出。计算装置110包括存储器112、处理器111和输出装置113。存储器112可以例如是随机存取存储器(ram)、存储器缓冲器、硬盘驱动器、数据库、可擦可编程只读存储器(eprom)、电可擦只读存储器(eeprom)、只读存储器(rom)等。在一些实施例中,计算装置110的存储器112包括与分布式数据库的实例(例如,分布式数据库实例114)相关联的数据。在一些实施例中,存储器112存储使处理器执行与将以下各项发送给分布式数据库的另一实例(例如,计算装置120处的分布式数据库实例124)和/或从该另一实例接收以下各项相关联的模块、处理和/或功能的指令:同步事件的记录、和/或先前的与其他计算装置的同步事件的记录、和/或同步事件的次序、和/或事件内的事务的次序、与识别同步请求和/或事务的次序相关联的参数、和/或参数(例如,量化事务的数据库字段、量化事件发生的次序的数据库字段、和/或其值可以被存储在数据库中的任何其他的合适的字段)的值。

分布式数据库实例114可以例如被配置为操纵数据,包括存储、修改和/或删除数据。在一些实施例中,分布式数据库实例114可以是数组集合、数据结构集合、关系数据库、对象数据库、后关系数据库和/或任何其他的合适类型的数据库或储存器。例如,分布式数据库实例114可以存储与任何特定的功能和/或行业相关的数据。例如,分布式数据库实例114可以存储金融事务(例如,计算装置110的用户的金融事务),包括与特定的金融工具的所有权的历史相关的值和/或值矢量。一般来说,矢量可以是参数的任何值集合,参数可以是能够取不同值的任何数据对象和/或数据库字段。因此,分布式数据库实例114可以具有若干个参数和/或字段,其中每个与值矢量相关联。值矢量用于确定该数据库实例114内的参数和/或字段的实际的值。在一些情况下,分布式数据库实例114存储同步事件的记录、先前的与其他计算装置的同步事件的记录、同步事件的次序、事件内的事务的次序、与识别同步事件和/或事务的次序相关联的参数和/或值(例如,用于使用如本文中所描述的共识方法来计算次序)、参数(例如,量化事务的数据库字段、量化事件发生的次序的数据库字段、和/或其值可以被存储在数据库中的任何其他的合适的字段)的值。

在一些情况下,分布式数据库实例114还可以存储数据库状态变量和/或当前状态。当前状态可以是与事务的结果相关联的状态、余额、条件等。类似地说,状态可以包括被事务修改的数据结构和/或变量。在其他情况下,当前状态可以被存储在存储器112的单独的数据库和/或部分中。在还有的其他的情况下,当前状态可以被存储在不同于计算装置110的计算装置的存储器处。

在一些情况下,分布式数据库实例114还可以用于实现其他数据结构,诸如(密钥,值)对集合。分布式数据库实例114记录的事务可以例如是添加、删除或修改(密钥,值)对集合中的(密钥,值)对。

在一些情况下,分布式数据库系统100或分布式数据库实例114、124、134、144中的任何一个可以被查询。例如,查询可以由密钥组成,从分布式数据库系统100或分布式数据库实例114、124、134、144返回的结果可以是与该密钥相关联的值。在一些情况下,分布式数据系统100或分布式数据库实例114、124、134、144中的任何一个还可以通过事务来进行修改。例如,修改数据库的事务可以包含授权修改事务的一方所签的数字签名。

分布式数据库系统100可以用于许多目的,诸如,举例来说,存储与分布式身份系统中的各种用户相关联的属性。例如,这样的系统可以使用用户的身份作为“密钥”,并且使用与用户相关联的属性列表作为“值”。在一些情况下,身份可以是具有该用户已知的对应私钥的密码公钥。每个属性可以例如由具有断言该属性的权限的机关进行数字签名。每个属性还可以例如用与具有读取该属性的权限的一个人或一群个人相关联的公钥加密。一些密钥或值还可以使被授权修改或删除密钥或值的各方的公钥的列表附到它们。

在另一例子中,分布式数据库实例114可以存储与大规模多玩家游戏(mmg)相关的数据,诸如游戏物品的当前状态和所有权。在一些情况下,如图1所示,分布式数据库实例114可以在计算装置110内实现。在其他情况下,分布式数据库的实例可供计算装置访问(例如,经由网络),但是不是在计算装置中实现的(图1中未示出)。

计算装置110的处理器111可以是被配置为运行和/或执行分布式数据库实例114的任何合适的处理装置。例如,如本文中更详细地描述的,处理器111可以被配置为响应于从计算装置120接收到信号来更新分布式数据库实例114,和/或使信号被发送给计算装置120。更具体地说,如本文中更详细地描述的,处理器111可以被配置为响应于接收到来自另一计算装置的与事务相关联的同步事件、与同步事件的次序相关联的记录等来执行更新分布式数据库实例114的模块、功能和/或处理。在其他实施例中,处理器111可以被配置为响应于接收到存储在分布式数据库的另一实例(例如,计算装置120处的分布式数据库实例124)中的参数的值来执行更新分布式数据库实例114的模块、功能和/或处理,和/或使存储在计算装置110处的分布式数据库实例114中的参数的值被发送给计算装置120。在一些实施例中,处理器111可以是通用处理器、现场可编程门阵列(fpga)、专用集成电路(asic)、数字信号处理器(dsp)等。

显示器113可以是任何合适的显示器,诸如,举例来说,液晶显示器(lcd)、阴极射线管显示器(crt)等。在其他实施例中,计算装置110、120、130、140中的任何一个都包括代替显示器113、123、133、143或除显示器113、123、133、143之外的另一输出装置。例如,计算装置110、120、130、140中的任何一个都可以包括音频输出装置(例如,扬声器)、触觉输出装置等。在还有的其他的实施例中,计算装置110、120、130、140中的任何一个都包括代替显示器113、123、133、143或除显示器113、123、133、143之外的输入装置。例如,计算装置110、120、130、140中的任何一个都可以包括键盘、鼠标等。

虽然在图1中被示为在单个计算装置内,但是在一些情况下,被配置为执行用于更新分布式数据库的模块、功能和/或处理的处理器可以在与其相关联的分布式数据库分离的计算装置内。在这样的情况下,例如,处理器可以经由网络操作地耦合到分布式数据库。例如,处理器可以执行识别事件和/或事务的次序(例如,作为与其他分布式数据库实例同步的结果)的共识方法,并且可以通过网络将包括事件和/或事务的次序的信号发送给相关联的分布式数据库实例。相关联的分布式数据库实例然后可以将事件的次序、事务的次序和/或基于事务的次序的状态变量存储在相关联的分布式数据库实例中。这样,与分布式数据库相关联的功能和存储可以被分布。而且,即使当数据库在与具有实现分布式数据库系统所关联的模块、功能和/或处理(例如,共识方法)的处理器的计算装置分离的计算装置中实现时,处理器也可以查询其相关联的分布式数据库实例,将数据库状态变量和/或当前状态以及本文中所描述的其他的合适操作存储在其分布式数据库实例中。在其他情况下,本文中所描述的功能和/或方法可以跨任何数量的计算装置(例如,在分布式计算环境和/或集群内)执行,并且这样的功能和/或方法的结果和/或值可以被存储在任何合适的计算装置处的存储器和/或储存器处。

计算装置120具有分别在结构上和/或功能上可以类似于处理器111、存储器112和显示器113的处理器121、存储器122和显示器123。此外,分布式数据库实例124在结构上和/或功能上可以类似于分布式数据库实例114。

计算装置130具有分别在结构上和/或功能上可以类似于处理器111、存储器112和显示器113的处理器131、存储器132和显示器133。此外,分布式数据库实例134在结构上和/或功能上可以类似于分布式数据库实例114。

计算装置140具有分别在结构上和/或功能上可以类似于处理器111、存储器112和显示器113的处理器141、存储器142和显示器143。此外,分布式数据库实例144在结构上和/或功能上可以类似于分布式数据库实例114。

尽管计算装置110、120、130、140被示为彼此类似,但是分布式数据库系统100的每个计算装置都可以不同于其他计算装置。分布式数据库系统100的每个计算装置110、120、130、140可以是例如计算实体(例如,个人计算装置,诸如台式计算机、膝上型计算机等)、移动电话、个人数字助理(pda)等中的任何一个。例如,计算装置110可以是台式计算机,计算装置120可以是智能电话,计算装置130可以是服务器。

在一些实施例中,计算装置110、120、130、140的一个或多个部分可以包括基于硬件的模块(例如,数字信号处理器(dsp)、现场可编程门阵列(fpga))和/或基于软件的模块(例如,存储在存储器中和/或在处理器处执行的计算机代码的模块)。在一些实施例中,与计算装置110、120、130、140相关联的功能中的一个或多个(例如,与处理器111、121、131、141相关联的功能)可以包括在一个或多个模块中(参见例如图2)。

分布式数据库系统100的性质(包括计算装置(例如,计算装置110、120、130、140)的性质)、计算装置的数量和网络105可以以任何数量的方式选择。在一些情况下,分布式数据库系统100的性质可以由分布式数据库系统100的管理员选择。在其他情况下,分布式数据库系统100的性质可以由分布式数据库系统100的用户共同选择。

因为使用分布式数据库系统100,所以在计算装置110、120、130和140之间没有指定领导者。具体地说,计算装置110、120、130或140都不被识别和/或选择为解决存储在计算装置110、120、130、140的分布式数据库实例111、12、131、141中的值之间的争端的领导者。相反,通过使用本文中所描述的事件同步处理、投票处理和/或方法,计算装置110、120、130、140可以共同收敛于参数的值上。

在分布式数据库系统中没有领导者提高了分布式数据库系统的安全性。具体地说,在有领导者的情况下,存在单点攻击和/或故障。如果恶意软件感染领导者和/或领导者的分布式数据库实例处的参数的值被恶意改变,则故障和/或错误的值在其他的分布式数据库实例中到处传播。然而,在无领导者系统中,不存在单点攻击和/或故障。具体地说,如果无领导者系统的分布式数据库实例中的参数包含值,则如本文中更详细地描述的,该值在该分布式数据库实例与系统中的其他的分布式数据库实例交换值之后将改变。另外,如本文中更详细地描述的,本文中所描述的无领导者分布式数据库系统提高了收敛速度,同时减少了装置之间发送的数据量。

图2例示说明根据实施例的分布式数据库系统(例如,分布式数据库系统100)的计算装置200。在一些实施例中,计算装置200可以类似于关于图1示出和描述的计算装置110、120、130、140。计算装置200包括处理器210和存储器220。处理器210和存储器220彼此操作地耦合。在一些实施例中,处理器210和存储器220可以分别类似于关于图1详细描述的处理器111和存储器112。如图2所示,处理器210包括数据库收敛模块211和通信模块210,存储器220包括分布式数据库实例221。通信模块212使得计算装置200能够与其他计算装置通信(例如,将数据发送给其他计算装置和/或从其他计算装置接收数据)。在一些实施例中,通信模块212(图1中未示出)使得计算装置110能够与计算装置120、130、140通信。通信模块210可以包括和/或启用例如网络接口控制器(nic)、无线连接、有线端口等。如此,通信模块210可以建立和/或维护计算装置200和另一装置之间的通信会话(例如,经由网络,诸如图1的网络105或互联网(未示出))。类似地说,通信模块210可以使得计算装置200能够将数据发送给另一装置和/或从另一装置接收数据。

在一些情况下,数据库收敛模块211可以与其他计算装置交换事件和/或事务,存储数据库收敛模块211接收的事件和/或事务,并且基于由事件之间的引用模式定义的部分次序来计算事件和/或事务的排序。每个事件可以是包含以下内容的记录:两个更早的事件的密码散列(将该事件链接到这两个更早的事件和它们的祖先事件,反过来也一样)、有效载荷数据(诸如将被记录的事务)、其他信息(诸如当前时间、其创建者将其断言为事件第一次被定义的时间的时间戳(例如,日期和utc时间))等。通信计算装置中的每个被称为“成员”或“散列图成员”。在一些情况下,成员定义的第一事件仅包括另一成员定义的单个事件的散列。在这样的情况下,成员还未具有在先的自散列(例如,该成员先前定义的事件的散列)。在一些情况下,分布式数据库中的第一事件不包括任何在先事件的散列(因为对于该分布式数据库没有在先事件)。

在一些实施例中,两个更早的事件的这样的密码散列可以是基于使用事件作为输入的密码散列函数定义的散列值。具体地说,在这样的实施例中,事件包括(表示该事件的信息的)特定的字节序列或字节串。事件的散列可以是从使用用于该事件的字节序列作为输入的散列函数返回的值。在其他实施例中,与事件相关联的任何其他的合适的数据(例如,标识符、序列号、表示事件的特定部分的字节等)可以用作散列函数的输入以计算该事件的散列。任何合适的散列函数都可以用于定义散列。在一些实施例中,每个成员使用相同的散列函数以使得在每个成员处对于给定事件产生相同的散列。事件然后可以被定义和/或创建该事件的成员数字签名。

在一些情况下,事件和它们的互连的集合可以形成有向非循环图(dag)。在一些情况下,dag中的每个事件引用零个或多个(例如两个)更早的事件(将该事件链接到更早的事件和它们的祖先事件,反过来也一样),并且每个引用严格指向更早的事件,以使得没有循环。在一些实施例中,dag基于密码散列,所以数据结构可以被称为散列图(在本文中也被称为“hashdag”)。散列图直接对部分次序进行编码,这意味着,如果y包含x的散列的话,或者如果y包含含有x的散列的事件的散列的话,或者对于这样的任意长度路径,事件x已知在事件y之前来到。然而,如果从x到y或者从y到x没有路径,则部分次序不定义哪个事件首先来到。因此,数据库收敛模块可以从部分次序计算总次序。这可以通过计算装置使用的任何合适的确定性函数来进行,以使得计算装置计算相同的次序。在一些实施例中,每个成员可以在每次同步之后重新计算该次序,最后这些次序可以收敛以使得共识出现。

共识算法和/或方法可以用于确定散列图中的事件的次序和/或存储在事件内的事务的次序。作为根据次序执行事务的结果,这些事务的次序继而可以定义数据库的状态。数据库的定义的状态可以被存储为数据库状态变量。在一些实施例中,分布式数据库的实例(例如,分布式数据库实例114)存储散列图、和/或事务、和/或事务的次序、和/或事件、和/或事件的次序、和/或由执行事务而导致的状态。

在一些情况下,数据库收敛模块可以使用以下函数来在散列图中从部分次序计算总次序。对于其他计算装置(被称为“成员”)中的每个,数据库收敛模块可以对散列图进行检查以发现事件(和/或这些事件的指示)被该成员接收的次序。数据库收敛模块然后可以好像该成员为每个事件分配数字“排名”一样进行计算,其中,对于成员接收的第一个事件,排名为1,对于成员接收的第二个事件,排名为2,依此类推。数据库收敛模块可以对散列图中的每个成员这样做。然后,对于每个事件,数据库收敛模块可以计算分配的排名的中位数,并且可以按照它们的中位数来对事件进行排序。排序可以以确定性的方式来打破平局,诸如按照两个平局的事件的散列的数字次序来对它们进行排序,或者通过其中每个成员的数据库收敛模块使用相同方法的某种其他的方法来对它们进行排序。该排序的结果是总次序。

图6例示说明用于确定总次序的一个例子的散列图640。散列图640例示说明两个事件(最低的条纹圆圈和最低的虚线圆圈)和每个成员接收到这些事件的指示(其他的条纹圆圈和虚线圆圈)的第一时间。顶部的每个成员的名称按照哪个事件在它们的缓慢的次序中是第一个来上色。有条纹的初始投票多于有虚线的初始投票;因此,对于每个成员的共识投票是有条纹的。换句话说,成员最后收敛到有条纹的事件在有虚线的事件之前发生的协定。

在该例子中,成员(被标记为alice、bob、carol、dave和ed的计算装置)将工作以定义是事件642、还是事件644首先发生的共识。每个有条纹的圆圈指示成员首先接收到的事件是事件644(和/或该事件644的指示)。类似地,每个有虚线的圆圈指示成员首先接收到的事件是事件642(和/或该事件642的指示)。如散列图640所示,alice、bob和carol均在事件642之前接收到事件644(和/或事件644的指示)。dave和ed两个都在事件644(和/或事件644的指示)之前接收到事件642(和/或事件642的指示)。因此,因为大量成员在事件642之前接收到事件644,所以总次序可以被每个成员确定为事件644在事件642之前发生。

在其他情况下,数据库收敛模块可以使用不同的函数来在散列图中从部分次序计算总次序。在这样的实施例中,例如,数据库收敛模块可以使用以下函数来计算总次序,其中,正整数q是成员共享的参数。

creator(x)=创建事件x的成员

anc(x)=作为x的祖先(包括x本身)的事件的集合

other(x)=刚好在x被创建之前同步的成员创建的事件

self(x)=x之前的具有同一创建者的最后一个事件

self(x,0)=self(x)

self(x,n)=self(self(x),n-1)

order(x,y)=k,其中,y是creator(x)获悉的第k个事件

fast(x,y)=y在排序的列表中的位置,其中,元素z∈anc(x)按照排序,平局用每个事件的散列打破。

在该实施例中,.fast(x,y)给出基本上紧接在x被创建和/或定义之后的、根据creator(x)的意见的、y在事件的总次序中的位置。如果q是无穷大,则以上计算出与前述实施例中相同的总次序。如果q是有限的,并且所有的成员都在线,则以上计算出与前述实施例中相同的总次序。如果q是有限的,并且少数成员在给定时间在线,则该函数使得在线成员可以在它们之间达成当新的成员缓慢地、一个接一个地开始在线时将保持不变的共识。然而,如果存在网络的分区,则每个分区的成员可以达成它们自己的共识。然后,当分区被修复时,较小的分区的成员将采用较大的分区的共识。

在还有的其他的情况下,如关于图8-12b所描述的,数据库收敛模块仍可以使用不同的函数来在散列图中从部分次序计算总次序。如图8-9所示,每个成员(alice、bob、carol、dave和ed)创建和/或定义事件(如图8所示的1401-1413;图9中所示的1501-1506)。通过使用关于图8-12b所描述的函数和子函数,如本文中更详细地描述的,可以通过按照事件的接收轮次对它们进行排序、按照它们的接收时间戳打破平局、以及按照它们的签名打破这些平局,来计算事件的总次序。在其他情况下,可以通过按照事件的接收轮次对它们进行排序、按照它们的接收世代(而不是它们的接收时间戳)打破平局、以及按照它们的签名打破这些平局,来计算事件的总次序。以下段落指定了用于计算和/或定义事件的接收轮次和接收世代以确定事件的次序的函数。结合图8-12b来例示说明并使用以下术语。

“父”:如果y包含x的散列,事件x是事件y的父。例如,在图8中,事件1412的父包括事件1406和事件1408。

“祖先”:事件x的祖先是x、其父、其父的父、依此类推。例如,在图8中,事件1412的祖先是事件1401、1402、1403、1406、1408和1412。事件的祖先可以被说成是链接到该事件,反过来也一样。

“后代”:事件x的后代是x、其子、其子的子、依此类推。例如,在图8中,事件1401的后代是该图所示的每一个事件。另举一例,事件1403的后代是事件1403、1404、1406、1407、1409、1410、1411、1412和1413。事件的后代可以被说成是链接到该事件,反过来也一样。

“n”:群体中的成员的总数。例如,在图8中,成员是被标记为alice、bob、carol、dave和ed的计算装置,n等于5。

“m”:大于n的一定百分比(例如,大于n的2/3)的最小整数。例如,在图8中,如果百分比被定义为2/3,则m等于4。在其他情况下,m可以被定义为例如n的不同百分比(例如,1/3、1/2等)、特定的预定义的数、和/或以任何其他的合适的方式定义。

“亲父”:事件x的亲父是其由同一成员创建和/或定义的父事件y。例如,在图8中,事件1405的亲父是1401。

“亲祖先”:事件x的亲祖先是x、其亲父、其亲父的亲父、依此类推。

“序列号”(或“sn”):事件的整数属性,该整数属性被定义为事件的亲父的序列号加1。例如,在图8中,事件1405的亲父是1401。因为事件1401的序列号为1,所以事件1405的序列号为2(即,1加1)。

“世代号”(或“gn”):事件的整数属性,该整数属性被定义为事件的父的世代号的最大值加1。例如,在图8中,事件1412具有两个父,事件1406和1408,这两个事件分别具有世代号4和2。因此,事件1412的时代号为5(即,4加1)。

“轮次增量”(或“ri”):事件的属性,该属性可以要么是零,要么是1。

“轮次号”(或“rn”):事件的整数属性。在一些情况下,这也被称为创建轮次或创建的轮次。在一些情况下,轮次号可以被定义为事件的父的轮次号的最大值加事件的轮次增量。例如,在图8中,事件1412具有两个父,事件1406和1408,这两个事件都具有轮次号1。事件1412还具有轮次增量1。因此,事件1412的轮次号为2(即,1加1)。在其他情况下,如果r是使得事件可以强看见(如本文中所描述的那样)由全都具有轮次号r-1的不同成员定义和/或创建的至少m个事件的最小整数,则事件可以具有轮次号r。如果没有这样的整数,则事件的轮次号可以为默认值(例如,0、1等)。在这样的情况下,可以不使用轮次增量来计算事件的轮次号。例如,在图8中,如果m被定义为大于n的1/2倍的最小整数,则m为3。于是,事件1412强看见m个事件1401、1402和1408,其中每个事件都是由不同的成员定义的,并且都具有轮次号1。事件1412不能强看见由不同成员定义的、具有轮次号2的至少m个事件。因此,事件1412的轮次号为2。在一些情况下,分布式数据库中的第一个事件包括轮次号1。在其他情况下,分布式数据库中的第一个事件可以包括轮次号0或任何其他的合适的编号。

“分叉”:如果事件x和事件y是由同一成员定义和/或创建,并且也不是另一个的亲祖先,则事件x与事件y分叉。例如,在图9中,成员dave通过创建和/或定义事件1503和1504(这两个都具有同一亲父(即,事件1501))进行分叉,以使得事件1503不是事件1504的亲祖先,事件1504不是事件1503的亲祖先。

分叉的“识别”:分叉可以被在彼此分叉的两个事件之后创建和/或定义的第三事件“识别”,如果这两个事件都是第三事件的祖先的话。例如,在图9中,成员dave通过创建事件1503和1504进行分叉,事件1503和1504都不是另一个的亲祖先。该分叉可以被后来的事件1506识别,因为事件1503和1504都是事件1506的祖先。在一些情况下,分叉的识别可以指示特定的成员(例如,dave)作弊了。

事件的“识别”:事件x“识别”或“看见”祖先事件y,如果x没有与y分叉的祖先事件z的话。例如,在图8中,事件1412识别(也被称为“看见”)事件1403,因为事件1403是事件1412的祖先,事件1412没有与事件1403分叉的祖先事件。在一些情况下,事件x可以识别事件y,如果x没有识别出事件y之前的分叉的话。在这样的情况下,即使事件x识别出事件y之后的定义事件y的成员创建和/或定义的分叉,事件x也可以看见事件y。事件x不识别分叉之后的该成员创建和/或定义的事件。而且,如果成员定义在历史上都是该成员的第一个事件的两个不同的事件,则事件x可以识别分叉,并且不识别该成员创建和/或定义的任何事件。

事件的“强识别”(在本文中也被称为“强看见”):事件x“强识别”(或“强看见”)由与x相同的成员创建和/或定义的祖先事件y,如果x识别y的话。事件x“强识别”不是由与x相同的成员创建和/或定义的祖先事件y,如果存在如下事件集合s的话,事件集合s(1)包括x和y这二者,(2)是事件x的祖先,(3)是祖先事件y的后代,(4)被x识别,(5)均可以识别y,(6)由至少m个不同的成员创建和/或定义。例如,在图8中,如果m被定义为大于n的2/3的最小整数(即,m=1+floor(2n/3),在该例子中,m将为4),则事件1412强识别祖先事件1401,因为事件集合1401、1402、1406和1412是作为事件1412的祖先和事件1401的后代的至少四个事件的集合,它们分别是由四个成员dave、carol、bob和ed创建和/或定义的,事件1412识别事件1401、1402、1406和1412中的每个,并且事件1401、1402、1406和1412中的每个识别事件1401。类似地说,事件x(例如,事件1412)可以“强看见”事件y(例如,事件1401),如果x可以看见由不同成员创建或定义的、其中每个可以看见y的至少m个事件(例如,事件1401、1402、1406和1412)的话。

“第r轮第一个”事件(在本文中也被称为“证据”):事件是“第r轮第一个”事件(或“证据”),如果事件(1)具有轮次号r,并且(2)具有轮次号小于r的亲父或者没有亲父的话。例如,在图8中,事件1412是“第2轮第一个”事件,因为它具有轮次号2,并且其亲父是事件1408,事件1408具有轮次号1(即,小于2)。

在一些情况下,当且仅当事件x“强识别”至少m个“第r轮第一个”事件时,事件x的轮次增量才被定义为1,其中,r是其父的最大轮次号。例如,在图8中,如果m被定义为大于n的1/2倍的最小整数,则m为3。于是,事件1412强识别m个事件1401、1402和1408,这些事件全都是第1轮第一个事件。1412的两个父是第1轮,1412强识别至少m个第1轮第一个,因此1412的轮次增量为1。示图中被用“ri=0”标记的事件均未能强识别至少m个第1轮第一个,因此它们的轮次增量为0。

在一些情况下,以下方法可以用于确定事件x是否强识别祖先事件y。对于每个第r轮第一个祖先事件y,维护整数数组a1,一个成员一个整数,该数组给出事件x的最低序列号,其中,该成员创建和/或定义事件x并且x可以识别y。对于每个事件z,维护整数数组a2,一个成员一个整数,该数组给出由该成员创建和/或定义的事件w的最高序列号,以使得z可以识别w。为了确定z是否可以强识别祖先事件y,对元素位置数量e进行计数,以使得a1[e]<=a2[e]。当且仅当该计数大于m时,事件z才可以强识别y。例如,在图8中,成员alice、bob、carol、dave和ed均可以识别事件1401,其中,可以这样做的最早的事件分别是它们的事件{1404,1403,1402,1401,1408}。这些事件具有序列号a1={1,1,1,1,1}。类似地,它们中的每个创建和/或定义的、被事件1412识别的最晚的事件是事件{无,1406,1402,1401,1412},其中,alice被列为“无”,因为1412不能识别alice创建和/或定义的任何事件。这些事件分别具有序列号a2={0,2,1,1,2},其中,所有的事件都具有正序列号,所以0意味着alice没有被1412识别的事件。比较列表a1与列表a2给出结果{1<=0,1<=2,1<=1,1<=1,1<=2},该结果等同于具有为真的四个值的{假,真,真,真,真}。因此,存在作为1412的祖先和1401的后代的四个事件的集合s。四个是最小m个,因此1412强识别1401。

关于实现用于用a1和a2确定事件x是否可以强识别祖先事件y的方法的又一变型如下。如果两个数组中的整数元素小于128,则可以将每个元素存储在单个字节中,将8个这样的元素打包到单个64位字中,并且设a1和a2为这样的字的数组。a1中的每个字节的最高有效位可以被设置为0,a2中的每个字节的最高有效位可以被设置为1。将这两个对应的字相减,然后用除了最高有效位之外为0的掩膜执行逐位and(与),然后右移7个位位置,以得到用c编程语言表达为((a2[i]-a1[i])&0x8080808080808080)>>7)的值。这可以被添加到被初始化为零的运行累积器s。在多次这样做之后,通过移动和添加字节,将累积器转换为计数,以得到((s&0xff)+((s>>8)&0xff)+((s>>16)&0xff)+((s>>24)&0xff)+((s>>32)&0xff)+((s>>40)&0xff)+((s>>48)&0xff)+((s>>56)&0xff))。在一些情况下,这些计算可以用诸如c、java等的编程语言来执行。在其他情况下,所述计算可以使用处理器特定的指令(诸如intel和amd提供的advancedvectorextensions(avx)指令、或图形处理单元(gpu)或通用图形处理单元(gpgpu)中的等同物)来执行。在一些架构上,所述计算可以通过使用大于64位(诸如128、256、512或更多位)的字而被更快速地执行。

“著名”事件:如果(1)第r轮事件x是“第r轮第一个”事件(或“证据”),并且(2)“赞成”的决策是经由下面描述的byzantine(拜占庭)协定协议达成的,则第r轮事件x是“著名的”。在一些实施例中,byzantine协定协议可以由分布式数据库的实例(例如,分布式数据库实例114)和/或数据库收敛模块(例如,数据库收敛模块211)执行。例如,在图8中,示出了五个第1轮第一个:1401、1402、1403、1404和1408。如果m被定义为大于n的1/2倍的最小整数(其为3),则1412是第2轮第一个。如果协议运行更长时间,则散列图将向上生长,最后其他的四个成员在该图的顶部上也将具有第2轮第一个。每个第2轮第一个都将具有关于第1轮第一个中的每个是否是“著名的”“投票”。事件1412将对1401、1402和1403是著名的投“赞成”票,因为这些是它可以识别的第1轮第一个。事件1412将对1404是著名的投“反对”票,因为1412不能识别1404。对于给定的第1轮第一个,诸如1402,其是否是“著名的”状态将通过计算每个第2轮第一个的关于它是否是著名的投票来决定。这些投票然后将传播到第3轮第一个,然后传播到第4轮第一个,依此类推,直到最后关于1402是否是著名的达成协定。对其他第一个重复相同的处理。

byzantine协定协议可以收集并且使用“第r轮第一个”事件的投票和/或决定来识别“著名的”事件。例如,如果y可以“识别”事件x,则“第r+1轮第一个”y将投“赞成”票,否则它投“反对”票。然后对每个第g轮(对于g=r+2、r+3、r+4等)计算投票,直到任何成员达成决策为止。直到已经达到决策,对每个第g轮计算投票。这些轮次中的一些可以是“多数(majority)”轮次,而一些其他的轮次可以是“硬币(coin)”轮次。在一些情况下,例如,第r+2轮是多数轮次,未来的轮次被指定为要么是多数轮次,要么是硬币轮次(例如,根据预定义的时间表)。例如,在一些情况下,未来的轮次是多数轮次、还是硬币轮次可以任意确定,约束条件是不能存在两个连续的硬币轮次。例如,可以预定义的是,将存在五个多数轮次,然后一个硬币轮次,然后五个多数轮次,然后一个硬币轮次,重复,只要达成协定即可。

在一些情况下,如果第g轮是多数轮次,则可以如下计算投票。如果存在强识别投v票(其中,v要么是“赞成”,要么是“反对”)的至少m个第g-1轮第一个的第g轮事件,则共识决策是v,并且byzantine协定协议结束。否则,每个第g轮第一个事件计算新的投票,所述新的投票是每个第g轮第一个事件可以强识别的第g-1轮第一个中的多数。在存在平局、而不是多数的情况下,投票可以被指定为“赞成”。

类似地说,如果x是第r轮证据(或第r轮第一个),则可以计算第r+1、r+2等轮中的投票,其中,每轮中的证据关于x是否是著名的进行投票。在第r+1轮中,可以看见x的每一个证据投赞成票,其他证据投反对票。在第r+2轮中,每一个证据根据它可以强看见的第r+1轮证据的投票的多数来进行投票。类似地,在第r+3轮中,每一个证据根据它可以强看见的第r+2轮证据的投票的多数来进行投票。这可以持续多轮。就平局来说,投票可以被设置为赞成。在其他情况下,平局可以被设置为反对,或者可以被随机地设置。如果任何轮次具有投反对票的至少m个证据,则选举结束,并且x不是著名的。如果任何轮次具有投赞成票的至少m个证据,则选举结束,并且x是著名的。如果赞成和反对都不具有至少m个投票,则选举继续到下一轮。

作为例子,在图8中,考虑所示人物下面的某轮第一个事件x。然后,每个第1轮第一个将具有关于x是否是著名的投票。事件1412可以强识别第1轮第一个事件1401、1402和1408。所以其投票将基于它们的投票。如果这是多数轮次,则1412将检查{1401,1402,1408}中的至少m个是否具有赞成的投票。如果它们具有,则决策是赞成,并且协定已经得以实现。如果它们中的至少m个投反对票,则决策是反对,并且协定已经得以实现。如果投票在任一方向没有至少m个,则1412被给予投票,该投票是1401、1402和1408的那些投票中的多数(并且将通过投赞成票来打破平局,如果存在平局的话)。该投票然后将被用于下一轮中,继续进行,直到达成协定为止。

在一些情况下,如果第g轮是硬币轮次,则可以如下计算投票。如果事件x可以识别投v票(其中,v要么是“赞成”,要么是“反对”)的至少m个第g-1轮第一个,则事件x将把其投票变为v。否则,如果第g轮是硬币轮次,则每个第g轮第一个事件x将其投票变为伪随机确定(在一些情况下类似于抛硬币)的结果,该结果被定义为事件x的签名的最低有效位。

类似地说,在这样的情况下,如果选举达到第r+k轮(硬币轮次)(其中,k是指定的因子(例如,诸如3、6、7、8、16、32的数或任何其他合适的数的倍数)),则选举在该轮不结束。如果选举达到该轮,则他可以继续至少一个更多的轮次。在这样的轮次中,如果事件y是第r+k轮证据,则如果它可以从第r+k-1轮强看见正在投v票的至少m个证据,则y将投v票。否则,y将根据随机值进行投票(例如,根据事件y的签名的位(例如,最低有效位、最高有效位、随机选择的位),其中,1=赞成,0=反对,或者反过来,根据事件y的时间戳,使用密码“共享硬币”协议和/或任何其他的随机确定)。该随机确定在y被创建之前是不可预测的,因此可以提高事件和共识协议的安全性。

例如,在图8中,如果第2轮是硬币轮次,并且投票是关于第1轮之前的某个事件是否是著名的,则事件1412将首先检查{1401,1402,1408}中的至少m个是投赞成票,还是它们中的至少m个投反对票。如果情况如此,则1412将以相同的方式投票。如果没有至少m个在任一方向上投票,则1412将具有随机的或伪随机的投票(例如,当ed创建和/或定义事件1412时,基于在ed对事件1412签名时ed对事件1412创建的数字签名的最低有效位)。

在一些情况下,伪随机确定的结果可以是密码共享硬币协议的结果,该结果可以例如被实现为轮次号的阈值签名的最低有效位。

如上所述,在一些实现中,散列图共识方法可以包括决定例如第r轮中的证据x的声誉。如上所述,可以从第r+1轮采集初始投票,对每个事件根据它是否是x的后代来投“赞成”票或“反对”票而进行计数。替代方法可以包括从“r+2”、而不是从“r+1”(或者从“r+3”、“r+4”等,而不是从“r+1”)采集初始投票。在该方法中,可以可选地添加附加步骤。具体地说,在这样的实现中,每当第r轮第一个事件x(或第r轮证据x)是由人口的多于三分之二(即,多于2n/3个成员)创建和/或定义的第r+1轮证据的祖先时,x就被立即宣告为著名的,并且即使在对于x的任何投票被计算之前,选举也立即结束。第二替代方法可以包括通过从r+1采集的初始投票对r进行选举,然后如果创建和/或定义第r轮中被决定是著名的证据的成员的数量低于给定阈值t,则通过从r+2采集的初始投票重新进行第二次选举。

系统可以从用于计算上述伪随机确定的结果的方法中的任何一种方法构建。在一些情况下,所述系统按照某个次序循环遍历不同的方法。在其他情况下,所述系统可以根据预定义的模式在不同方法之间选择。

“接收轮次”:如果r是使得具有轮次号r的著名的第r轮第一个事件(或著名的证据)中的至少一半是x的后代和/或可以看见x的最小整数,则事件x具有“接收轮次”r。在其他情况下,可以使用任何其他的合适的百分比。例如,在另一情况下,如果r是使得具有轮次号r的著名的第r轮第一个事件(或著名的证据)中的至少预定百分比(例如,40%、60%、80%等)是x的后代和/或可以看见x的最小整数,则事件x具有“接收轮次”r。

在一些情况下,可以如下计算事件x的“接收世代”。找到哪个成员创建和/或定义可以识别事件x的每个第r轮第一个事件。然后,确定该成员创建和/或定义的、可以识别x的最早的事件的世代号。然后,定义x的“接收世代”为该列表的中位数。

在一些情况下,事件x的“接收时间戳”t可以是包括每个成员创建和/或定义的、识别和/或看见x的第一个事件的事件中的时间戳的中位数。例如,事件1401的接收时间戳可以是用于事件1402、1403、1403和1408的时间戳的值的中位数。在一些情况下,用于事件1401的时间戳可以包括在中位数计算中。在其他情况下,用于x的接收时间戳可以是任何其他的值或如下事件中的时间戳的值的组合,所述事件是每个成员创建和/或定义的、识别或看见x的第一个事件。例如,用于x的接收时间戳可以基于时间戳的平均值、时间戳的标准差、修改的平均值(例如,通过从计算移除最早的和最晚的时间戳)等。在还有的其他的情况下,可以使用扩展的中位数。

在一些情况下,通过按照事件的接收轮次对它们进行排序、按照它们的接收时间戳打破平局、以及按照它们的签名打破平局,来计算事件的总次序和/或共识次序。在其他情况下,可以通过按照事件的接收轮次对它们进行排序、按照它们的接收世代打破平局、以及按照它们的签名打破平局,来计算事件的总次序。前面的段落规定了用于计算和/或定义事件的接收轮次、接收时间戳和/或接收世代的函数。

在其他情况下,不是使用每个事件的签名,而是可以使用与具有相同的接收轮次和/或该轮中的相同的接收世代的著名事件或著名证据的签名进行异或运算的该事件的签名。在其他情况下,可以使用任何其他的合适的事件签名组合来打破平局以定义事件的共识次序。给定轮次中的著名证据的经异或运算的签名的结果表示难以使可能的攻击者和其他实体预测和/或操纵的伪随机数。因此,在一些实现中,经异或运算的签名可以被用作不可预测的随机数的源(即,“随机信标”)。所述随机数可以被用于包括如以下所讨论的智能合约执行的几个散列图处理中。

在一些实现中,共识方法可以被配置为使得可执行脚本或程序(“智能合约”)由散列图的每个成员(例如,每个成员或计算装置的处理器)执行。智能合约可以是在计算机代码中转换的、存储和复制在散列图中的、并且由散列图的成员监督的自执行合约、区块链合约、或数字合约。智能合约可以用于例如交换钱币、不动产、股份和其他合适的操作。成员可以将执行的智能合约的结果记录在分布式数据库或分布式账簿中。在一些其他的实现中,共识算法可以被配置为使得成员的一小部分(而不是每一个成员)基于其后果是计算机的定时的函数的不确定性代码、或与另一计算机(例如,在分布式数据库成员的外部)的通信的结果来运行智能合约。因此,可以基于随机信标(例如,基于著名证据的经异或运算的签名的结果而生成)的确定性伪随机函数来选择被选择和/或有资格执行智能合约的成员集合。选定的成员每个都可以产生记录通过运行智能合约而获得的输出或结果的事务。在一些情况下,如果选定的成员中的多于三分之二获得匹配结果,则这样的结果被认为是合约的官方输出,并且分布式数据库或账簿的状态可以被修改以相应地反映智能合约上的共识。在一些其他的情况下,当没有单个输出或结果被选定的成员中的多于三分之二匹配或达成一致时,智能合约被视为失败,并且它不改变分布式数据库或账簿的状态。在其他实现中,选定的成员中的三分之二的阈值可以是任何其他合适的阈值。例如,在一些实现中,对于智能合约的每次运行,阈值可以是不同的。

在一些情况下,由于智能合约使用从硬件装置搜集的真随机数访问网络或外部计算机(诸如web服务器(“oracle”)),和/或由于给定的时间限制,所以智能合约可能是不确定性的。在一些情况下,当成员或计算机装置执行智能合约、并且这样的合约在给定数量的毫秒内尚未生成输出时,该计算装置暂停或停止智能合约,并且报告它没有输出。在一些情况下,成员的计算装置可以以不同的速度运行,使得所述处理是不确定性的。另外,在一些情况下,成员的计算装置可以被配置为以它们的全速运行编译的代码,而不运行解释器和/或对计算装置到目前已经执行的声明的数量进行计数。

在还有的其他的情况下,不是将“接收世代”定义为列表的中位数,而是可以将“接收世代”定义为列表本身。然后,当按照接收世代进行排序时,可以用它们的列表的中间元素来比较两个接收世代,用紧接着中间元素前面的元素打破平局,用紧接着中间元素后面的元素打破这些平局,并且通过在迄今为止所用的那些元素之前的元素和之后的元素之间交替来继续进行,直到平局被打破为止。

在一些情况下,中位数时间戳可以被替换为“扩展的中位数”。在这样的情况下,可以针对每个事件定义时间戳列表,而不是单个接收时间戳。用于事件x的时间戳列表可以包括每个成员创建和/或定义的、识别和/或看见x的第一个事件。例如,在图8中,用于事件1401的时间戳列表可以包括用于事件1402、1403、1403和1408的时间戳。在一些情况下,用于事件1401的时间戳也可以包括在内。当用时间戳列表打破平局(即,两个事件具有相同的接收轮次)时,可以比较每个事件的列表的中间时间戳(或两个中间时间戳中的第一个或第二个中的预定的一个,如果所述两个中间时间戳具有均匀长度的话)。如果这些时间戳是相同的,则可以比较紧接着中间时间戳后面的时间戳。如果这些时间戳是相同的,则可以比较紧接着中间时间戳前面的时间戳。如果这些时间戳也是相同的,则比较三个已经比较的时间戳后面的时间戳。这可以继续交替进行,直到平局被打破为止。类似于以上讨论,如果两个列表是相同的,则可以用两个元素的签名来打破平局。

在还有的其他的情况下,可以使用“截断的扩展的中位数”来代替“扩展的中位数”。在这样的情况下,对于每个事件,不存储整个时间戳列表。相反,只有列表的中间附近的值中的几个被存储并且被用于比较。

除了计算事件的总次序之外,接收的中位数时间戳还可能可以用于其他目的。例如,bob可能签订如下合约,该合约说,当且仅当存在包含alice签订该相同合约的事务的事件x时,他才同意受该合约约束,其中,用于x的接收时间戳是至迟在某个最后期限。在这种情况下,如以上所描述的,如果如“接收的中位数时间戳”所指示的,alice在最后期限之后签订所述合约,则bob将不受该合约约束。

在一些情况下,可以在实现共识之后定义分布式数据库的状态。例如,如果s(r)是可以被第r轮中的著名证据看见的事件的集合,则最终s(r)中的所有事件都将具有已知的接收轮次和接收时间戳。此刻,s(r)中的事件的共识次序是已知的,并且将不会改变。一旦到达此刻,成员就可以计算和/或定义事件的表示和它们的次序。例如,成员可以按s(r)中的事件的共识次序来计算这些事件的散列值。成员然后可以对散列值进行数字签名,并且将散列值包括在成员定义的下一个事件中。这可以用于向其他成员通知该成员已经确定s(r)中的事件具有将不会改变的给定次序。在成员中的至少m个(或成员的任何其他的合适的数量或百分比)已经对用于s(r)的散列值进行了签名(因此同意该散列值所表示的次序)之后,事件的该共识列表连同成员的签名列表可以形成可以用于证明共识次序是如对于s(r)中的事件声明那样的单个文件(或其他数据结构)。在其他情况下,如果事件包含更新分布式数据库系统的状态的事务(如本文中所描述的那样),则散列值可以是在按共识次序应用s(r)中的事件的事务之后分布式数据库系统的状态的散列值。

在一些实现中,散列图可以用于实现撤销服务。撤销服务可以记录或存储某些对象是否仍是有效的。在一些情况下,撤销服务可以用于存储权威机构颁发的、该权威机构后来可以撤销的证书(例如,dmv颁发的、dmv后来可以撤销的驾驶证;国家颁发的、该国家后来可以撤销的护照;关于俱乐部的成员资格信息;等等)的有效的或未过期的散列。在一些情况下,撤销服务可以使用将新记录添加到形式(h,t,l)的分布式数据库或账簿的事务类型,其中,h是与对象或实体相关联的密码散列,t是用于对象或实体的“类型”的标签,l是公钥列表,记录被用与列表l中包括的公钥相关联的私钥中的零个或多个签名。撤销服务可以使用的附加事务类型可以删除或移除给定散列h。这样的事务可以被配置为被用与将被删除或移除的散列h相关联的列表l中的一个(或多个)公钥所关联的私钥签名。撤销服务可以使用的其他特殊事务类型包括检索其散列h给定的记录的事务、检索例如自从某个时间和日期以后的具有给定值t的所有记录的事务、以及其他合适的事务。虽然以上事务是就撤销服务讨论的,但是这样的事务可以被散列图中的其他合适的服务使用。

在一些情况下,m(如上所述)可以基于分配给每个成员的权重值,而不是仅仅是全部成员的数量的一小部分、百分比和/或值。在这样的情况下,每个成员具有与其对分布式数据库系统的兴趣和/或影响相关联的份额(stake)。这样的份额可以是权重值。该成员定义的每个事件可以被说成是具有其定义成员的权重值。m于是可以是所有成员的总份额的一小部分。在上面被描述为取决于m的事件将在具有至少m的份额总和的成员集合约意时发生。因此,基于它们的份额,某些成员可以对系统和如何得到共识次序具有更大的影响。在一些情况下,事件中的事务可以改变一个或多个成员的份额、添加新的成员、和/或删除成员。如果这样的事务具有接收轮次r,则在接收轮次已经被计算之后,第r轮证据之后的事件将使用修改的份额和修改的成员列表来重新计算它们的轮次号和其他信息。关于第r轮事件是否是著名的投票将使用旧的份额和成员列表,而关于r之后的轮次的投票将使用新的份额和成员列表。2016年6月2日提交的、标题为“methodsandapparatusforadistributeddatabasewithconsensusdeterminedbasedonweightedstakes”的美国临时专利申请no.62/344,682中描述了关于使用权重值来确定共识的额外的细节,该申请整个地通过引用并入本文。

在一些情况下,某些成员可以被识别和/或指定为“懒惰成员”。在这样的情况下,懒惰成员可以定义和/或创建与正常成员或不懒惰成员类似的事件。另外,由懒惰成员定义和/或创建的事件可以包括在散列图中,并且可以计算和/或识别对于这样的事件的共识次序。然而,懒惰成员定义的事件的轮次增量为零。因此,懒惰成员定义的事件的轮次号(或创建轮次)等于事件的父的轮次号的最大值。类似地说,因为懒惰成员定义的事件的轮次增量为零,所以懒惰成员定义的事件的轮次号(或创建轮次)不能大于事件的父的轮次号的最大值。

而且,在一些情况下,懒惰成员定义的事件没有资格在选举中投票,并且懒惰成员定义的事件没有资格变为第r轮第一个事件或证据,和/或不作为正常成员或不懒惰成员定义的事件的中间事件计数以强看见另一事件。因此,施加于懒惰成员上的限制导致散列图执行的计算减少,同时仍保持共识次序的安全性和完整性。可以基于任何合适的准则将成员选为懒惰成员。例如,在一些情况下,可以基于在每个轮次执行、在一轮开始预定义的确定性的伪随机选择、基于真实水平、基于股份量、基于其他成员的投票、和/或随机选择来将成员指定为懒惰成员。在一些情况下,被指定为懒惰成员的成员对于每个轮次可以是不同的,而在一些其他的情况下,被指定为懒惰成员的成员在不同的轮次保持相同。在一些其他的情况下,事件、而不是成员可以被指定为“懒惰”事件。在这样的情况下,懒惰事件可以在每个轮次被选择,而不是选择成员。

因此,在一些情况下,第一个成员的处理器可以基于确定性的伪随机函数来定义第一组成员(例如,计算装置)和第二组成员(例如,计算装置)。第一组成员可以是不懒惰成员,第二组成员可以是懒惰成员。在一些情况下,第一组成员是第二组成员相对于分布式数据库的成员(例如,计算装置)的绝对补集。第一成员(或第一成员的处理器)可以从第二成员(例如,计算装置)接收链接到成员集合(例如,计算装置集合)定义的第一事件集合的事件。成员集合包括第一组成员中的至少一个成员和第二组成员中的至少一个成员。处理器可以使用第一事件集合中的由第一组成员中的成员定义的事件的参数(例如,轮次号、轮次增量、投票、是证据的指示、是著名证据的指示、等等)的值、而不使用第一事件集合中的由第二组成员中的成员定义的事件的参数的值,来识别作为(例如,如本文中所描述的)共识协议的结果的、第二事件集合所关联的次序。处理器可以至少部分地基于与第二事件集合相关联的次序来识别与分布式数据库的实例中指示的事务集合相关联的次序,并且可以将与该事务集合相关联的次序存储在分布式数据库的实例中。

前述的术语、定义和算法用于例示说明图8-10b中描述的实施例和构思。图10a和10b例示说明以数学的形式示出的共识方法和/或处理的第一个示例应用。图11a和11b例示说明以数学的形式示出的共识方法和/或处理的第二个示例应用,图12a和12b例示说明以数学的形式示出的共识方法和/或处理的第三个示例应用。

在图2中,数据库收敛模块211和通信模块212在图2中被示为在处理器210中实现。在其他实施例中,数据库收敛模块211和/或通信模块212可以在存储器220中实现。在还有的其他的实施例中,数据库收敛模块211和/或通信模块212可以是基于硬件的(例如,asic、fpga等)。

在一些情况下,(例如,关于图1示出和描述的)分布式数据库可以允许处理“代理事务”。在一些情况下,这样的代理事务可以由分布式数据库的代表分布式数据库的非成员的成员、分布式数据库的具有不完全权限(例如,具有读权限但是没有写权限、没有纳入共识决策中、等等)的成员等执行。例如,假设alice想要将事务tr提交给分布式数据库,但是她不是分布式数据库的正式成员(例如,alice不是成员或者具有有限的权限)。假设bob是正式成员,并且对分布式数据库具有完全权限。在这种情况下,alice可以将事务tr发送给bob,bob可以将tr提交给网络以影响分布式数据库。在一些情况下,alice可以对tr进行数字签名。在一些情况下,tr可以包括例如给bob的付款(例如,对于他的将tr提交给分布式数据库的服务的费用)。在一些情况下,alice可以通过匿名化网络(诸如tor洋葱路由网络)将tr传送给bob,以使得bob和其他观察者都将不能确定tr来自alice。

在一些情况下,(例如,关于图1所示和所描述的)分布式数据库可以用于实现加密货币。在这样的情况下,每个分布式数据库实例114、124、134、144可以定义存储加密货币的一个或多个钱包数据结构(在本文中也被称为钱包)。在一些情况下,与分布式数据库没有关联的用户(例如,不是分布式数据库的成员的计算装置)也可以创建和/或定义这样的钱包。钱包数据结构可以包括密钥对(公钥和私钥)。在一些情况下,用于钱包的密钥对可以由创立钱包的计算装置产生。例如,如果alice定义钱包(w,k),其中w是公钥(其也可以充当钱包的标识符),k是私钥,则她可以向分布式数据库的其余的实例公布w(例如,在事件中),但是保持她的身份是匿名的,以使得分布式数据库的其他实例(或它们的用户)不能识别钱包w与alice相关联。然而,在一些情况下,加密货币传送是公开的。因此,如果她的雇主将钱币传送到w中(例如,通过使用事件内的事务),稍后alice通过将钱币从w转移给商店(例如,通过使用不同事件内的不同事务)来进行购买,则雇主和商店可以串通来确定w属于alice并且是alice进行了购买。因此,为了对此进行避免可能有益的是使alice将钱币转移给新的匿名钱包,以使她的事务保持匿名。

以下例子假定如果以下事务被公布(例如,在事件中),则加密货币的c个硬币被从钱包w转移给钱包r,其中,最后的k意味着事务被用私钥k数字签名。可以使用以下记号:

transfer(c,w,r)_k

在一些情况下,为了在加密货币的传送中实现匿名性,可以定义新的事务类型和/或分布式数据库功能。例如,以下事务将把c1个硬币从钱包w1移到钱包r1,并且还将把c2个硬币从钱包w2移到钱包r2。在一些情况下,例如,钱包w1、r1、w2、r2每个都可以与分布式数据库的成员(或计算装置)相关联,或者与和分布式数据库(或与分布式数据库相关联的计算装置)没有关联的用户相关联。所述四个钱包可以与同一个成员或用户相关联,或者与不同的成员或用户相关联。在一些情况下,事务可以包括用于连接它们的任意的标识符n(例如,对话标识符和/或处理标识符)。

transfer_double(n,c1,w1,r1,c2,w2,r2,t)_k1

transfer_double(n,c1,w1,r1,c2,w2,r2,t)_k2

在一些情况下,这些事务没有影响,除非钱包w1至少包含c1个硬币,钱包w2至少包含c2个硬币。在一些情况下,这些事务没有影响,除非两个相同的拷贝被公布和分发给分布式数据库的其他实例(例如,在一个或多个事件中),一个被用k1签名(通过使用与公钥w1相关联的私钥),另一个被用k2签名(通过使用与公钥w2相关联的私钥)。在一些情况下,如上所述,每个事务还可以包括安全时间戳。该安全时间戳可以是事务所关联的事件的安全时间戳或事务的单独的安全时间戳。如果两个事务都被用彼此的t秒内的时间戳公布(例如,事务的安全时间戳在彼此的预定时间段内),则两个货币传送发生。否则,两个传送都不发生。在一些情况下,可以用到期日期和时间t来创建和/或定义事务,并且传送将不会发生,除非两个签名的事务都具有t之前的共识时间戳。

在其他情况下,不使用t,并且只有在两个事务在任一方发布取消传送的事务之前发生时才发生货币传送。例如,alice可以公布她的签名的事务(例如,她的transfer_double事务),然后公布包含对于该第一个事务的取消消息的另一个签名的事务,然后bob公布他的签名的事务。如果bob的事务晚于alice的取消消息,则传送将不会发生,但是如果bob的事务早于alice的取消消息,则传送将发生。这样,所述系统可以在没有t和时间戳的情况下,通过使用事务的共识排序来进行工作。在其他情况下,t和取消消息这二者都可以被支持。

以下例子例示说明“transfer_double”事务类型和/或分布式数据库功能可以如何被用于匿名地且安全地发起数据(诸如货币)传送。在以下例子中,alice具有她的雇主向其传送钱币的钱包w1。她想将c个硬币从w1转移给她创建的、稍后将被用于购买的匿名钱包w2。但是她想要安全的匿名性,使得查看事务的人都将不会知道w1与匿名的钱包w2相关联。即使她的雇主与商店串通来攻击匿名性,它也应是安全的。另外,例如,bob在将硬币从他的钱包w3转移给他创建的匿名钱包w4时想要相同的安全匿名性。

alice和bob可以通过执行以下协议来实现一种形式的匿名性。它可以涉及任何形式的彼此联系,诸如彼此直接发送电子邮件、通过聊天站点或者通过在线论坛站点、或者通过公开的分布式数据库或账簿中公布的事务(例如,在事件内)彼此传送消息。以下例子假定协议是经由公开的账簿执行的。假定alice和bob一开始是陌生人,但是两者都具有向公开的账簿公布事务的能力,并且可以读取其他人向公开的账簿公布的事务。alice和bob可以向公开的账簿公布以下事务(例如,在一个或多个事件内):

alice公布:anonymize1(n,c,w1)_k1

bob计算:b=encrypt(w4,w1)

bob公布:anonymize2(n,w3,b)_k3

alice计算:a=encrypt(w2,w3)

alice公布:anonymize3(n,a)_k1

bob计算:min=min(w2,w4)

bob计算:max=max(w2,w4)

bob公布:transfer_double(n,c,w1,min,c,w3,max,t)_k3

alice公布:transfer_double(n,c,w1,min,c,w3,max,t)_k1

在该例子中,alice想要将c个硬币从钱包w1转移给w2,bob想要将c个硬币从钱包w3转移给w4。alice和bob每个都通过产生每个钱包的(公钥,私钥)密钥对来产生他们自己的钱包。这里,用于钱包的公钥也被用作该钱包的名称(在其他情况下,单独的标识符可以用于识别钱包)。alice和bob想以如下这样的方式实现这些传送,即,观察者可以识别钱包w1的所有者也是w2或w4的所有者,但是不能识别是哪一个。类似地,alice和bob想以如下这样的方式实现这些传送,即,观察者可以识别钱包w3的所有者也是w2或w4的所有者,但是不能识别是哪一个。具有公钥w1的钱包具有私钥k1。类似地,钱包w2、w3和w4分别具有私钥k2、k3和k4。以上每个事务或指令被用最后列出的私钥签名。例如,初始事务或指令被用私钥k1数字签名。

第一事务(anonymize1(n,c,w1)_k1)用于公告alice想要将c个硬币从w1转移给匿名钱包。该事务包括标识符编号n,该标识符编号n可以是事务的散列、事务中包括的随机数、和/或任何其他的合适的标识符。该n(例如,对话标识符和/或处理标识符)在随后的事务中被用于回指发起了所述处理的事务,以避免在同时发生几个类似的处理和/或对话的情况下的混乱(并且能够识别处理或对话)。在一些情况下,n可以包括包含n的事务在其后被忽视的超时最后期限。该事务被用k1数字签名。

给出只可以用对应的私钥k1(由alice持有)解密的结果b,函数encrypt(w4,w1)使用公钥w1对w4(bob所有的并且定义为他的目标匿名钱包的钱包的公钥)进行加密。这确保分布式数据库的查看事务的其他实例没有一个将能够识别w4,除了w1的所有者(在该例子中为alice)之外。

事务anonymize2(n,w3,b)k3指示作为处理或对话n的一部分,bob想要将c个硬币从w3转移给b识别的匿名钱包。该事务被使用私钥k3数字签名。alice然后可以使用私钥k1来对b进行解密以将bob的目标匿名钱包识别为w4。

alice可以执行函数encrypt(w2,w3)。这用公钥w3(bob的初始初始)对w2(alice所有的并且定义为她的目标匿名钱包的钱包的公钥)进行加密。alice然后可以公布事务anonymize3(n,a)_k1。bob可以通过用私钥k3对a进行解密来将w2识别为alice的目标匿名钱包。

函数min(w2,w4)返回两个公钥w3和w4中的哪个按字典顺序(按字母顺序)是第一个。函数max(w2,w4)返回两个公钥w3和w4中的哪个按字典顺序(按字母顺序)是最后一个。因此,min可以要么是w2,要么是w4,max可以是w2或w4。min和max函数使得可以对钱包w2和w4进行排序,alice和bob都可以识别该排序,但是该排序没有揭示哪个钱包是由alice创建和/或定义的以及哪个钱包是由bob创建和/或定义的。在其他情况下,可以使用任何其他的确定性函数来对alice和bob识别如何对匿名钱包w2和w4进行排序,诸如通过密钥的散列、排名等来排序。

transfer_double事务可以由bob和alice两个公布,并且被用他们各自的私钥k1和k3签名。因为bob和alice两个都在将相同数量的硬币c转移给他们各自的匿名钱包中的每个,所以哪个源钱包w1或w3将硬币转移给哪个目的地钱包w2或w4是没有关系的。因此,在一些情况下,alice将c个硬币转移给她自己的匿名钱包,bob将c个硬币转移给他自己的匿名钱包。在其他情况下,alice将c个硬币转移给bob的匿名钱包,bob将c个硬币转移给alice的匿名钱包。这通过min和max函数确定。这还确保观察者可以识别w2和w4两者,但是将不能识别哪个钱包是由w1的所有者定义的、以及哪个钱包是由w3的所有者定义的。在事务已经被公布之后,观察者知道钱包w1和w3的所有者正在合作将c个硬币均转移给钱包w2和w4,但是观察者将不会知道哪个发送者拥有哪个接收钱包,所以钱包w2和w4的匿名性将略高于钱包w1和w3。

在一些情况下,事务可以是“代理事务”,这意味着网络中的节点代表另一方提交事务。在以上例子中,alice拥有钱包w1和w2,并且想要公布几个事务。如果carol是分布式数据库的具有完全权限的成员,则alice可以将事务发送给carol以代表alice提交给网络。在一些情况下,代理事务可以包括将小额费用从钱包w1转移给carol以支付该服务的授权。在一些情况下,alice可以通过使通信匿名化的网络(诸如,举例来说,tor洋葱路由网络)与carol进行通信。在一些情况下,alice也可以是成员,但是为了匿名性,通过carol进行工作。在一些情况下,alice不是成员。

在一些情况下,例如,alice然后可以与dave重复上述匿名性协议,bob可以与ed重复该协议。此时,分布式数据库的其他实例将能够识别alice拥有4个钱包中的一个,但是将不会知道是哪个。在10次这样的运行之后,alice拥有210个钱包中的一个钱包,210是1024。在20次运行之后,集合超过一百万。在30次运行之后,它超过十亿。在40次运行之后,它超过万亿。所述协议应花费一秒的一小部分运行。但是即使每个协议花费一整秒运行,尝试使他们的钱包匿名化的任何人都将在比一分钟短得多的时间内随机地彼此交换。观察者知道alice拥有因此而产生的钱包中的一个,但是不知道是哪个。

如果只有几个人正在试图使他们的钱包匿名化,则该系统可能是不太安全的。为了提高安全性,alice可以等待一段时间段(例如,一天、一小时、一周等),然后当附加的用户参与时,进一步使她的最后的钱包匿名化。以这种方式,她最后可以在非常长的时间段内隐藏于包括试图匿名化的其他用户的人群之中。使用所述系统的用户越多,她可以越快实现她的目标。如果存在大量使他们的钱包匿名化的用户,则即使非常少的成员充当他们的代理,该系统也可以是安全的。

如果攻击者在alice与实现分布式数据库的网络(例如,互联网)进行通信时可以识别她的ip地址,则该系统可能潜在地受损。如果攻击者识别alice从给定的ip地址运行所述协议并且知道她要么拥有w2、要么拥有w4,然后立即看见某个人从同一个地址在钱包w2上运行所述协议,则他们可以推断alice拥有钱包w2。解决方案是使ip地址匿名化。例如,匿名通信网络(例如,tor网络)可以用于实现匿名通信。然后,分布式数据库的其余的实例可以识别w2运行所述协议并且对事物进行签名,但是将不能识别w2是正在使用alice的计算机、还是正在使用bob的计算机。

在一些情况下,一旦alice已经将她的加密货币转移给真正匿名化的钱包,她然后就可以在多个事务上花费加密货币,而事务不被追溯回到她。此外,alice可以在许多个匿名化的钱包之间划分她的加密货币,然后购买多个物品,每次购买使用不同的钱包,而不揭示它们是由同一个人和/或实体购买的。

如上所述,用户可以在与用作代理的散列图成员通信的同时使它们的ip地址匿名化。在一些实现中,他们可以通过现有的匿名化网络(诸如tor网络)来实现此。在其他实现中,他们可以使用下面描述的、基于下面描述的公钥密码的一种类型的匿名化网络来实现此。

公钥密码被设计为实现以下方面,其中,“成员”是充当匿名化网络的一部分和/或散列图网络的一部分并且愿意对它充当代理的计算机:

-成员可以创建和/或定义公钥-私钥对。

-成员可以获取现有公钥(盲化的或非盲化的),并且创建和/或定义现有公钥的盲化版本,也就是说,通过例如将公钥与盲化因子(例如,随机盲化因子)组合而具有不同的盲化(不可链接性)性质的公钥版本。盲化公钥是不可链接的,因为盲化公钥的处理器不能在没有特定的盲化因子的情况下从盲化公钥识别公钥。

-成员可以获取现有公钥(盲化的或非盲化的)和用现有公钥加密的密码文本,并且产生这样的密码文本的盲化版本。

-即使公钥在加密之前被盲化零次或多次,并且即使密码文本在加密之后被盲化零次或多次,加密的消息也只可以用原始私钥来解密。

-在不知道私钥的情况下,不能确定两个公钥是否具有相同的私钥、或者两个密码文本是否被用相同的公钥加密、或者两个密码文本是否具有相同的普通文本、或者密码文本是否具有给定的普通文本。

下面讨论实现前述条件的示例密码。成员(例如,计算装置和/或处理器)可以进行执行该密码的步骤。首先,参与者和/或成员知道、存储、产生和/或可以定义数学群和/或值集合g,连同快速辨识g的发生器的足够的信息。例如,参与者可以知道预定义的值集合g(例如,每个参与者和/或成员可以独立地产生和/或推导共同的值集合g)。在一些情况下,所述预定义的值集合g可以是任何代数群(例如,数字、椭圆曲线等)。例如,在一些情况下,所述值集合可以是具有乘法模2p+1的数字集合g={1,2,3,...,2p},其中,p和2p+1两个都是质数。在这样的情况下,群运算符*可以被定义为乘法模2p+1,求幂可以被定义为重复进行乘法模2p+1。在这样的例子中,当且仅当d^2和d^p都不等于1模2p+1时,g的元素d是发生器。在g中的2p个元素之中,确切地说,它们中的phi(2p)=p-1是发生器,其是大约一半。

参与者和/或成员知道、存储和/或可以定义g,并且知道辨识发生器的足够的信息。所以对于以上例子,参与者知道p,并且知道具有乘法和求幂模2p+1的g={1,2,3,...,2p}。在一些实现中,密码被定义为:

-密钥产生:从g挑选或选择随机的r1、r2(例如,随机值r1和r2)。如果r1不是g的发生器,则重复地挑选新的随机的r1,直到发生器被找到为止。因此,r1是g的发生器。公钥可以被定义为基于第一随机值r1和第二随机值r2的对(b,h),以使得(b,h)=(r1,r1^r2)并且私钥为s=r2。

-消息加密:给定(可能盲化的)公钥(b,h)和普通文本消息f(可能具有确定性的变换或填充,但是没有不确定性的随机变换或填充),从g挑选或选择随机的r3(例如,随机值r3)。普通文本消息f然后可以通过使用公钥(b,h)和随机值r3被加密以将加密的密码文本定义为(x,y)=(b^r3,f*h^r3)。在一些情况下,可以使用盲化公钥(b’,h’)或尚未盲化的公钥(b,h)来对加密的密码文本进行加密。下面描述密钥盲化。

-密钥盲化:给定(可能盲化的)公钥(b,h),从g挑选或选择随机的r4(例如,随机值r4)。盲化公钥可以被定义为基于公钥(b,h)和随机值r4的对(b’,h’),以使得(b’,h’)=(b^r4,h^r4)。如果b^r4不是g的发生器,则重复地挑选新的随机的r4,直到b^r4是g的发生器为止。因此,b^r4是g的发生器。

-消息盲化:给定密码文本(x,y)和用于对密码文本(x,y)进行加密的(可能盲化的)公钥(b,h),可以产生盲化的加密消息(x’,y’)。例如,可以从g挑选和/或选择随机的r5(例如,随机值r5)。盲化的加密消息和/或密码文本然后可以被定义为(x’,y’)=(x*(b^r5),y*(h^r5))。在一些情况下,可以使用盲化公钥(b’,h’)或尚未盲化的公钥(b,h)来使密码文本盲化。

在一些情况下,上述密码可以用于对消息进行加密并且将消息安全地从第一计算装置(例如,第一成员)发送到第二计算装置(例如,第二成员)(例如,直接地或者通过在分布式数据库和/或分布式账簿中发布该消息)。例如,在一些情况下,第二计算装置的处理器可以从预定义的值集合g选择第一随机值r1,所述值集合g是代数群。第一随机值r1被选为g的发生器。处理器可以从所述预定义的值集合g选择第二随机值r2。处理器然后可以基于第一随机值r1和第二随机值r2来将公钥定义为对(b,h)。公钥对(b,h)可以被定义为(r1,r1^r2)。

在一些情况下,第二计算装置的处理器可以将公钥提供给第一计算装置。第一计算装置的处理器可以选择第三随机值r3,并且使用公钥(b,h)和第三随机值r3来对消息m进行加密以将加密的密码文本定义为(x,y)=(b^r3,m*h^r3)。第一计算装置的处理器然后可以将加密的密码文本发送给第二计算装置。第二计算装置的处理器可以接收加密的密码文本,并且使用基于第二随机值定义的私钥对该加密的密码文本进行解密以识别消息m。

在其他情况下,第二计算装置的处理器可以使公钥盲化以定义提供给第一计算装置的盲化公钥(而不是尚未盲化的公钥)。第一计算装置的处理器然后可以使用盲化公钥来对消息进行加密以定义加密的密码文本。在这样的情况下,第二计算装置的处理器可以通过从预定义的值集合g选择第四随机值r4来使公钥盲化,以使得b^r4是g的发生器。处理器可以基于公钥(b,h)和第四随机值r4来将盲化公钥定义为对(b’,h’),以使得(b’,h’)=(b^r4,h^r4)。

在一些情况下,第一计算装置的处理器可以在将加密的密码文本发送给第二计算装置之前使加密的密码文本(x,y)盲化。例如,第一计算装置的处理器可以从预定义的值集合g选择第五随机值r5。基于从第二计算装置接收的(非盲化的或盲化的)公钥和第五随机值r5,第一计算装置的处理器可以将盲化的加密消息定义为(x’,y’)=(x*(b^r5),y*(h^r5))。第一计算装置的处理器然后可以产生包括盲化的加密消息的加密数据包,并且将加密的密码文本作为盲化的加密消息发送给第二计算装置。

上述密码可以用于构造用于成员之间的通信的新系统,该系统仅揭示假名,而不必公开诸如ip地址的信息。例如,成员{alice,bob,carol,dave,ed}可以公布他们的ip地址与他们的公开名称。每个成员可以产生密钥对,密钥对的公钥在匿名化的在线通信中充当它们的假名。在一些情况下,ed可以允许其他成员向他发送消息,而ed不识别或共享他的ip地址。ed可以公布他的假名(例如,他的公钥),连同一个或多个路径。“路径”是消息必须通过其路由到达他的成员序列。例如,ed可以挑选序列{bob,carol,dave,ed}作为路径,这意味着第二计算装置可以将消息发送给bob,bob将把它发送给carol,carol将把它发送给dave,dave将把它发送给ed。返回的消息可以反向地遵循相同的路径。路径可以使用假名、而不是可以揭示用户的身份的其他信息来指定。照此,这样的路径可以是匿名通信路径。例如,ed可以通过执行以下步骤来创建并且公布路径{bob,carol,dave,ed}。ed可以首先使用于这四个成员的四个公钥中的每个盲化(诸如通过使用以上密码)。ed然后可以获取名称列表{carol,dave,ed}(其是同一列表减去其第一个条目,即,bob),并且使用ed为{bob,carol,dave}已经创建的盲化公钥来分别对这些名称中的每个进行加密。ed然后可以公布“路径”,该路径包括(1)四个盲化密钥(例如,盲化公钥的序列)和(2)成员(例如,计算装置)的计算装置标识符集合。这样的计算装置标识符集合包括三个加密名称(与不同成员唯一相关联的加密计算装置标识符的序列)和没有任何加密或盲化的公开名称bob(未加密的计算装置标识符)。这样的计算装置标识符可以是假名,并且与盲化公钥相关联。在一些实现中,ed可以跳过使用于第一个名称(在该例子中为bob)的密钥盲化的步骤,而仅使其余的密钥盲化。

如果alice(例如,第一计算装置)想要将消息发送给ed(例如,第二计算装置)正在使用的假名,则alice可以查找与ed的假名相关联的路径,并且选择这样的路径中的一个。例如,alice可以挑选或选择从{bob,carol,dave,ed}构造的路径。因此,alice可以通过用由ed专门为该路径创建的ed的盲化公钥对消息进行加密来定义和/或产生加密消息。alice可以获取名称(或假名)“ed”(例如,第二计算装置的计算装置标识符),并且用dave的盲化公钥来对该名称(或假名)“ed”进行加密。该加密名称可以被盲化,然后被附到给ed的加密消息以产生和/或定义加密数据包。其后,alice可以对此进行重复以按与选定的路径中规定的次序相反的次序处理消息。因此,alice可以使用dave的盲化公钥来对消息进行加密(例如,加密名称被附到加密消息)。然后,alice可以将用carol的密钥加密的、dave的名称的盲化版本附到封包。alice然后使用carol的密钥来对该整个包进行加密。然后,附加用bob的密钥加密的、carol的名称的盲化版本。bob是路径或列表的起点,因此,用于选定的路径的加密处理在这里停止。

此时,alice已经创建了大的封包。bob的名称是ed作为普通文本包括的唯一一个,所以alice知道路径从bob开始。因此,alice将整个最终的封包发送给bob。他然后用他的私钥对该封包进行解密,然后用他的私钥对名称carol进行解密,然后除去她的名称,并且将剩下的发送给carol。carol做同样的事情,将更小的封包发送给dave。dave做同样的事情,并且发送给ed。最后,ed对他接收到的内容进行解密,并且可以读取消息。

使用上述启用盲化密钥和盲化消息的密码,例如,ed可以公布其他成员将到达的路径,同时保持他的匿名性。与tor隐藏服务相反,通过前述匿名化的ip通信协议,ed不必提前联系bob来安排该路径,bob不必存储为该路径做准备的任何内容。相反,ed公布他的路径,并且当任何人使用它们中的一个时,消息到达他。

类似地,通过使用上述方法,其他成员(例如,alice)可以公布匿名通信路径,并且经由匿名通信路径从其他成员接收加密数据包。最终,alice能够经由特定于alice的并且用alice在该匿名通信路径中使用的公钥支付的私钥来对接收的消息进行解密。因此,任何数量的成员(例如,计算装置)可以定义任何数量的匿名通信路径。另外,这样的匿名通信路径可以被定义为包括任何数量的中间成员(例如,计算装置)。这可以确保消息的最后的接收者的ip地址保持不被公开。

在一些情况下,通信协议可以通过将回路编号添加到该协议来进行优化。例如,当alice给予bob初始封包时,bob可以用他挑选的唯一地识别回路的随机数来进行回复。当bob将更小的封包发送给carol时,carol使用用于该回路的随机数来回复bob。其他成员也做同样的事情。当alice在近期想要将更多消息发送给ed时,她可以用路径中的所有的公钥(从ed的开始)来对每个消息进行加密,并且将每个消息连同bob给她的回路编号一起发送给bob。bob可以例如记住该回路编号与carol相关联,所以他将用他自己的私钥来对每个消息进行解密,并且将每个消息连同carol已经给他的回路编号一起转发给carol。每个成员可以存储回路编号、连同在用于该回路的路径中谁在它们的正前面和正后面的列表。在一些情况下,该信息被存储有限的时间段。如果在一段时间段内(例如,在某个数量的秒数或分钟数内)没有消息通过给定的回路编号被发送,则该记录可以被擦除。此后,alice可以重新创建她下一次想联系ed的新的回路。

在一些情况下,当ed回复alice时,他的回复可以被用{alice,bob,carol,dave}的按该次序的公钥加密。然后ed可以使用dave第一次给予ed的相同的回路编号来将该回复发送给dave。dave对回复进行解密,然后将回复送回给carol,并且这继续以送回给alice。在这样的情况下,alice可以将她自己的盲化公钥包括在初始消息中,所以没有人可以读取从ed到alice的消息。

在一些情况下,bob、carol和dave可以被补偿或激励以向alice和ed提供以上服务。这可以用加密货币来进行,其中,alice一从ed接收回消息,她就支付bob,此时,alice可以向bob支付足以支付{bob,carol,dave}中的所有的付款。bob然后可以向carol支付足以支付{carol,dave}的付款,然后carol可以支付dave。当每个新的消息通过所述信道被发送时,可以进行类似的支付。在一些情况下,可以在全球建立单一价格,例如,基于社区中的成员或对于这样的价格的散列图投票表决。价格可以是针对路径中的每一个成员的,其中,一个价格是建立回路,通过该回路发送的每一个消息一个单独的价格。在其他情况下,可以每一个字节、而不是每一个消息计算价格。

在一些情况下,bob可以周期性地支付carol一次性付款,要么提前对于其后不久发送的消息进行支付,要么对于最近发送的消息进行支付。这样,微型支付可以周期性地发生(例如,每天一次,或者每周一次),所以,支付的记录几乎不揭示流量正在如何流过网络,从而防止基于微型支付成员的定时对成员身份的泄漏或推断。类似地,当流量小时,可以使消息本身延迟随机量,以防止窃听者使用定时分析来跟随通过网络的消息。

在一些情况下,以上通信协议给予单向匿名性。例如,alice可能不能获悉ed的ip地址,除非她已经与{bob,carol,dave}中的所有串通。在一些情况下,ed可以随机地挑选或选择bob、carol和dave,因此alice不可能猜测ed挑选的路径的元素。相反,ed可以获悉alice的ip地址,例如,通过从他自己的合作者之中选择或挑选{bob,carol,dave},他们一起然后可以串通或共享公开alice的ip的信息。在一些情况下,然而,在消息到达bob之前,alice可以将她的消息路由通过她自己的挑选的几个成员。该技术使alice在构造初始封包时执行的步骤的数量翻倍,但是它确保双向匿名性。在还有的其他的情况下,单向匿名性可以被应用于例如相反的方向上,如果alice知道bob的公开名称并且想在使她自己的身份隐藏的同时将消息发送给他,则她可以创建在去往bob的路上通过几个成员的初始封包,然后使回路在bob处结束。alice于是可以知道bob的身份(或者至少bob的ip地址),但是bob将不会知道alice是谁。

在一些情况下,如果alice创建和/或定义新的回路,则alice可以创建和/或定义她的原始消息,该消息包含用于加密消息的每层的新的对称密钥。然后,沿着回路的路径的每个节点可以存储该对称密钥,连同两个回路编号(例如,在该回路的路径中在该节点正前面和正后面的节点的回路编号)。然后,alice可以用对称密钥、而不是使用公钥来对未来的消息进行加密。在一些情况下,这可以更快,并且还确保多个加密层不会使未来的消息变得太大。使用对称密钥的加密可以以不使消息的大小随着加密大幅度增大的方式执行。可选地,当使用对称密钥时,alice可以将随机填充包括在最内部的消息中。这移除了使每个加密层随机化的需要,并且消息无需在每层增加大小。当alice通过回路发送消息时,消息在沿着路径的每个节点处被解密,因此移除一层对称加密。当最后的接收者回复时,回复可以在每层用适当的对称密钥加密,所以alice接收用所有的对称密钥加密的回复。

因此,所讨论的通信协议能够实现至少三个匿名性模式:a)单向保护发送者,b)单向保护接收者,c)双向保护发送者和接收者。在一些实现中,所述通信协议可以用于实现上述加密货币匿名化器。在一些其他的实现中,所述通信协议可以用于使散列图共识方法的协议和/或在散列图内执行的其他合适的处理匿名化。

以下是上述密码可以如何被用于实现匿名通信的另一个例子的概述。私钥是随机组元素y。对应的公钥是(a,b)=(g,g^y)。加密消息(c,d)=(g^x,m*g^{xy}),其中,x由发送者随机挑选,m是原始消息。加密消息n=(e,f)被用不同的随机的x类似地加密。形成一个“元组”,该元组包含公钥和两个加密消息,m_1和m_2。该元组是(a,b,c,d,e,f)=(g,g^y,g^x_1,m_1*g^{x_1y},g^x_1,m_2*g^{x_1y}),其中,发送者挑选随机的x_1和x_2。为了使记录盲化,挑选随机的r_1、r_2和r_3,并且将盲化记录定义为(a’,b’,c’,d’,e’,f’)=(a^r_1,b^r_1,c*a^r_2,d*a^r_2,e*a^r_3,f*a^r_3)。

网络中的节点(计算装置)alice可以公布可以用于将消息路由到该节点而不揭示该节点的地址或身份的“路径”。该路径是n个记录(r_1、r_2、…、r_n)的列表。每个记录r_i包含(a_i,b_i),其是网络中的节点的公钥,最后一个(a_n,b_n)是那个节点的公钥。所以,例如,节点(dave)创建和/或定义将消息路由通过节点alice、然后bob、然后carol、然后dave的路径。在这样的例子中,(a_1,b_1)将是用于alice的公钥,(a_4,b_4)将是用于dave的公钥(因为在该例子中,由于在路径中存在四个节点,所以n=4)。每个记录中的第一个消息m_1是路径中的下一个节点的身份。所以(c_1,d_1)是bob的名称(或身份或假名)的密码文本,该密码文本可以被节点用来发现bob的ip地址和公钥。类似地,(c_2,d_2)是carol的身份,(c_3,d_3)是dave的身份。对于最后一个(c_n,d_n)(在该例子中,为(c_4,d_4)),消息仅仅是数字1(或代数群的群运算符的单位元素,如果这是除了数字1之外的内容的话)。每个元组中的第二个密码文本(e_i,f_i)对于路径中的每一个记录都是加密的1(或单位元素)。

在dave已经创建和/或定义了他的路径之后,他通过使每个记录盲化来使路径盲化,然后公布与强匿名的名称(anonymousdave)相关联的路径。不应使任何人(或网络内的计算装置)可能知道anonymousdave实际上是dave,也不应发现anonymousdave的ip地址。然而,其他人可以使用所述路径来向dave发送消息。公布的路径也与所述路径上的第一个节点的身份相关联。所以在该例子中,公布的路径与alice相关联,所以对于其他节点清楚的是所述路径上的第一个节点将是alice的节点,并且alice的身份将不被隐藏或匿名化。

然后ed以这种方式向anonymousdave发送消息。检索和/或识别针对anonymousdave公布的路径(或路径中的一个,如果几个被公布的话)。使路径中的记录盲化。创建和/或定义随机掩膜(k_1,...k_n)的列表。将每个fi替换为k_i*f_i。对于每个k_i,计算乘法逆k’i,以使得k_i*k’_i为1(或者是群的单位元素,如果这不是1的话)。将每个d_i替换为d_i*(k’1*k’_2*…*k’_i)。ed用公钥(a_n,b_n)对他的消息进行加密以定义密码文本,然后将密码文本和修改的路径这二者发送给路径上的第一个节点alice。

alice然后做以下事情。对(e_1,f_1)进行解密以获得k_l。将每个d_i替换为d_i*k_i。对(c_1,d_1)进行解密以找到和/或识别路径上的下一个节点bob的身份。从路径移除第一个元组,所以现在记录2将被称为记录1,记录3将被称为2,依此类推。使加密消息盲化。将盲化的加密消息和该修改的路径发送给bob。如果加密消息被用标准的混合方法加密(用随机密钥对消息进行加密,该随机密钥本身被用不对称的密码加密),则通过针对相同的公钥重新对消息进行加密来使消息“盲化”。在这种情况下,公钥将被与消息一起传递,并且公钥将在每个步骤处被盲化。

bob做同样的事情,将甚至更短的修改的路径传递给carol,carol做同样的事情,并且将它传递给dave。dave然后用他的私钥对消息进行解密,并且可以读取消息。如果ed想要回复,则他可以使用这个相同的方法来为他自己创建匿名路径,并且可以将匿名路径的指示包括在他给dave的消息的内部。

在以上例子中,可以通过以以下方式使用回路编号来使匿名通信更高效。例如,ed将他的原始的修改的路径发送给alice而不包括任何消息密码文本。alice产生随机的“回路编号”,并且将它返回给ed。当她将修改的路径传递给bob时,他产生回路编号,并且将它返回给alice。alice在短暂的时间段(例如,数分钟或数小时)内将这两个编号存储为相关联的对。在该时间段期间,ed可以通过以下方式来将消息发送给dave,即,对它们进行加密,并且将它们与回路编号一起发送给alice(不发送修改的路径)。消息然后跟随路径,在每个步骤再次被盲化,直到它到达dave为止。第一个消息应包括用于ed的私钥。dave然后可以用通过该密钥加密的消息、连同他从carol接收的回路编号进行回复。消息然后沿着回路向回传递,在每个步骤处被盲化,直到ed接收到该消息为止。

在一些管辖区域中,政府可能想通过立法来确保它可以监视货币流动以防止犯罪活动,诸如洗钱和逃税,同时仍允许市民是匿名的以防止搜集情报(例如,被他们的邻居、罪犯、外国政府等搜集情报)。在一些情况下,上述匿名性方法和系统可以支持这样的立法。在这样的情况下,政府可以创建或批准某个证书颁发机构(ca)或几个ca,以创建和/或定义证明钱包与某个人相关联的加密证书。加密可以使得只有政府才可以对它进行解密(可能仅在有法院命令的情况下)。如果alice创建和/或定义钱包,则她可以可选地使这样的证书附到该钱包,这意味着她的邻居不能看见该钱包属于alice,但是政府可以对该证书进行解密,并且将alice识别为钱包所有者。政府可能坚决要求,其国家内的雇主只可以将钱币存到具有这样的证书的钱包中,并且该国家中的商店只从具有这样的证书的钱包接受支付。然后,alice可以重复地执行以上协议以创建和/或定义钱包链,并且获得用于该链中的第一个钱包和最后一个钱包的适当的证书。

虽然在上面作为每个钱包数据结构描述了具有单个公钥-私钥对,但是在其他情况下,钱包数据结构可以包括两个公钥-私钥对:一个用于签名,一个用于加密。在这样的情况下,上述方法可以被修改为使用签名密钥进行签名并且使用加密密钥进行加密。

虽然在上面被描述为使用散列图并且存储和交换事件内的事务,但是在其他情况下,可以使用任何其他的合适的分布式数据库和/或分布式账簿技术来实现上述方法以促进安全的、匿名的事务。例如,在其他情况下,可以使用诸如区块链、paxos、raft、bitcoin(比特币)、ethereum(以太坊)等的技术来实现这样的方法。在一些情况下,可以将安全时间戳添加到这些技术(例如,构建在它们之上)来实现上述方法以促进安全的、匿名的事务。在其他情况下,没有时间戳被如上所述那样使用。

虽然在上面被描述为在分布式数据库的两个不同的实例之间实施,但是在其他情况下,匿名化方法可以由分布式数据库的多于两个的实例来实施。例如,在其他情况下,“transfer_double”事务可以支持附加数量的事务。例如,transfer_triple事务可以被定义为支持三个不同的钱包数据结构之间的数据传送。

虽然在上面被描述为实施加密货币,但是在其他情况下,任何其他类型的分布式数据库内的事务可以被匿名化。例如,货物的交换的记录、个体的身份的认证、使用特定资源的授权等可以被匿名化。在这样的情况下,这可以提高分布式数据库内的事务的安全性。

图7例示说明根据实施例的两个计算装置同步事件的信号流程图。具体地说,在一些实施例中,分布式数据库实例703和803可以交换事件以获得收敛。计算装置700可以随机地、基于与计算装置700的关系、基于与计算装置700的接近度、基于与计算装置700相关联的有序列表、和/或类似方式来选择与计算装置800同步。在一些实施例中,因为计算装置800可以被属于分布式数据库系统的计算装置集合中的计算装置700选择,所以计算装置700可以连续地多次选择计算装置800,或者可以暂时不选择计算装置800。在其他实施例中,先前选择的计算装置的指示可以被存储在计算装置700处。在这样的实施例中,计算装置700可以在能够再次选择计算装置800之前等待预定数量的选择。如以上所说明的,分布式数据库实例703和803分别可以在计算装置700的存储器和计算装置800的存储器中实现。

在一些实现中,计算装置700可以具有同时运行的多个线程,每个线程与另一个成员同步。因此,除了计算装置800之外,计算装置700还可以与其他计算装置(图7中未示出)同步。在一些情况下,计算装置700可以在最初的时间或第一时间及其后为每个线程建立连接,通过周期性地发送心跳消息(例如,一秒发送心跳两次)来保持每个连接存活或开放。因此,在一些情况下,计算装置700可以防止每次计算装置为了同步与另一个成员或计算装置建立连接时、否则由传送层安全(tls)协议(例如,记录协议和握手协议)引起的同步延时或延迟。

在一些实现中,计算装置700可以管理作为连接池的与其他成员或计算装置的线程连接和/或与一组计算装置的连接(例如,传输控制协议/互联网协议连接)的建立。在这样的情况下,计算装置700被配置为不超过与其他成员或计算装置的开放连接的限制(上限阈值)。在一些情况下,可以基于计算装置700的物理资源(例如,每一连接所用的随机存取存储器或中央处理单元容量)来配置连接的限制。例如,计算装置700可以被配置为与恒定数量的v个成员或计算装置同时保持开放连接,以使得其存储器和处理资源不被消耗到最大容量和/或导致次优的性能。换句话说,计算装置700不必与散列图的每一个成员保持开放连接,而是相反,一次与v个成员或计算装置保持开放连接。因此,在一些情况下,当选择与谁同步时,计算装置700随机地选择它与其具有在它的连接池中建立的开放连接的成员或计算装置(或一组成员或计算装置)。

在一些实现中,计算装置700可以被配置为根据下限阈值和上限阈值来限制或界定连接池的大小。在这样的情况下,计算装置700可以从与计算装置700具有开放连接的计算装置随机地选择用于同步的成员或计算装置。当连接池大于上限阈值时,和/或当一组成员和/或计算装置中的计算装置的数量达到上限阈值时,在同步之后,计算装置可以关闭和/或终止这样的连接,并且从连接池和/或所述一组成员或计算装置移除该连接。同样地,当计算装置700的连接池低于下限阈值时,和/或当一组成员和/或计算装置中的计算装置的数量达到下限阈值时,计算装置执行与其他成员或计算装置建立新的连接的一个或多个线程,并且将这些新的连接添加到连接池和/或所述一组成员或计算装置。如果连接池小于上限阈值,但是大于下限阈值,则计算装置700可以保持当前的连接池和/或所述一组成员或计算装置。在一些情况下,调用线程的某个小部分可以被约束为仅与最近已经成功地建立连接的成员或计算装置建立新的连接。调用线程的其余部分可以从所有的成员的集合随机地调用其他成员,甚至是计算装置700最近尚未与其建立连接的那些成员。

在一些实现中,可以使用单个散列图来实现事务集合的共识次序。对于超大型系统,可以实现散列图分片或水平地划分。例如,在超大型多播放器在线游戏(mmo)中,虚拟世界的每个地理区域可以变为一个碎片。在这样的情况下,每个碎片可以具有它自己的散列图,该散列图管理在该碎片内发生的事务的排序。每个成员的计算装置然后可以存储几个碎片,并且存储并参与和存储的碎片中的每个相关联的散列图。

在一些情况下,碎片之间的同步可以通过使碎片内的成员就与该碎片相关联的事务的次序达成共识来实现。这些事务可以触发更新碎片的状态的消息的生成,该消息可以被第一碎片的成员签名。签名的消息可以被发送给第二碎片以关于第一碎片的状态更新第二碎片的成员。例如,第一碎片中的活动(例如,对于一个区域)可以触发给管理加密货币的第二碎片的消息的生成,该消息指示第二碎片在两个特定的钱包之间传送加密货币。在这样的情况下,所述消息可以被签署第一碎片的多于阈值数量(例如,2/3)的成员(例如,在具有第一碎片的成员的列表的地址簿中)的签名。另外,所述消息可以包括地址簿本身,并且可以被签署地址簿的更早的版本中的多于阈值数量(例如,2/3)的成员的签名。地址簿的更早的版本可以被签署来自更早的版本的签名,依此类推回到用于该散列图的原始地址簿。因此,从一个碎片到另一个碎片的传出的消息可以表示生成该传出的消息的碎片的成员之间的共识。

图3-6例示说明根据实施例的散列图的例子。存在五个成员,其中每个都用深色垂直线来表示。每个圆圈表示事件。从事件起的两根向下的线表示两个先前的事件的散列。该例子中的每一个事件都具有两根向下的线(一根深色线指向同一成员,一根浅色线指向另一成员),除了每个成员的第一个事件之外。时间向上推进。在图3-6中,分布式数据库的计算装置被指示为alice、bob、carol、dave和ed。应理解,这样的指示是指在结构上和功能上类似于关于图1示出和描述的计算装置110、120、130和140的计算装置。

示例系统1:如果计算装置700被称为alice,计算装置800被称为bob,则它们之间的同步可以如图7所示那样。alice和bob之间的同步可以如下:

-alice将存储在分布式数据库703中的事件发送给bob。

-bob创建和/或定义包含以下项的新的事件:

--bob创建和/或定义的最后一个事件的散列

--alice创建和/或定义的最后一个事件的散列

--bob对以上散列的数字签名

-bob将存储在分布式数据库803中的事件发送给alice。

-alice创建和/或定义新的事件。

-alice将该事件发送给bob。

-alice按照散列图计算事件的总次序。

-bob按照散列图计算事件的总次序。

在任何给定时间,成员都可以存储到目前为止接收到的事件,连同与创建和/或定义每个事件的计算装置和/或分布式数据库实例相关联的标识符。每个事件包含两个更早的事件(除了初始事件(其没有父散列)之外)和每个新成员的第一个事件(其具有单个父事件散列,表示邀请它们加入的现有成员的事件)的散列。可以绘制表示该事件集合的示图。它可以示出针对每个成员的垂直线、以及该线上的针对该成员创建和/或定义的每个事件的点。每当事件(较高的点)包括更早的事件(较低的点)的散列时,在两个点之间绘制对角线。事件可以被说成是链接到另一事件,如果该事件可以经由所述另一事件的散列引用所述另一事件(要么直接地,要么通过中间事件)的话。

例如,图3例示说明散列图600的例子。事件602是作为与carol同步的结果并且在与carol同步之后由bob创建和/或定义的。事件602包括事件604(由bob创建和/或定义的先前的事件)的散列和事件606(由carol创建和/或定义的先前的事件)的散列。在一些实施例中,例如,包括在事件602内的事件604的散列包括指向其直接祖先事件(事件608和610)的指针。如此,bob可以使用事件602来引用事件608和610,并且使用指向先前的事件的指针来重构散列图。在一些情况下,事件602可以被说成是链接到散列图600中的其他事件,因为事件602可以经由更早的祖先事件来引用散列图600中的每个事件。例如,事件602经由事件604链接到事件608。另举一例,事件602经由事件606和612链接到事件616。

示例系统2:来自示例系统1的系统,在该系统中,事件还包括事务的“有效载荷”或要记录的其他信息。这样的有效载荷可以用于用自从计算装置的紧前面的事件以后发生和/或定义的任何事务和/或信息来更新事件。例如,事件602可以包括自从事件604被创建和/或定义以后bob执行的任何事务。因此,当使事件602与其他计算装置同步时,bob可以共享该信息。因此,bob执行的事务可以与事件相关联,并且与使用事件的其他成员共享。

示例系统3:来自示例系统1的系统,在该系统中,事件还包括对于调试、诊断和/或其他目的有用的当前时间和/或日期。所述时间和/或日期可以是计算装置(例如,bob)创建和/或定义事件时的当地时间和/或日期。在这样的实施例中,这样的当地时间和/或日期与其余装置不是同步的。在其他实施例中,所述时间和/或日期在装置之间可以是同步的(例如,当交换事件时)。在还有的其他的实施例中,可以使用全球计时器来确定时间和/或日期。

示例系统4:来自示例系统1的系统,在该系统中,alice不将bob创建和/或定义的事件发送给bob,也不将这样的事件的祖先事件发送给bob。事件x是事件y的祖先,如果y包含x的散列或者y包含作为x的祖先的事件的散列的话。类似地说,在这样的实施例中,bob将alice还未存储的事件发送给alice,而不发送alice已经存储的事件。

例如,图4例示说明示例散列图620,该散列图例示说明事件622(黑色圆圈)的祖先事件(虚线圆圈)和后代事件(条纹圆圈)。线建立关于事件的部分次序,其中,祖先在黑色事件之前出现,后代在黑色事件之后出现。部分次序并不指示白色事件是在黑色事件的前面、还是后面,所以使用总次序来决定它们的顺序。另举一例,图5例示说明示例散列图,该散列图例示说明一个特定的事件(实线圆圈)和每个成员接收到该事件的指示(条纹圆圈)的第一时间。当carol与dave同步来创建和/或定义事件624时,dave不将事件622的祖先事件发送给carol,因为carol已经知道并且已经接收了这样的事件。相反,dave将carol还未接收和/或存储在carol的分布式数据库实例中的事件发送给carol。在一些实施例中,dave可以基于dave的散列图关于carol先前已经接收到什么事件揭示了什么来识别要发送给carol什么事件。事件622是事件626的祖先。因此,在事件626的时间,dave已经接收到事件622。图4示出dave从ed接收事件622,ed从bob接收事件622,bob从carol接收事件622。此外,在事件624的时间,事件622是dave已经接收到的、由carol创建和/或定义的最后一个事件。因此,dave可以将dave已经存储的除了事件622及其祖先之外的事件发送给carol。另外,当从dave接收到事件626时,carol可以基于存储在carol的分布式数据库实例中的事件中的指针来重构散列图。在其他实施例中,dave可以基于carol将事件622发送给dave(在图4中未示出)并且dave使用事件622(和其中的引用)进行识别以识别carol已经接收到的事件,来识别要发送给carol什么事件。

示例系统5:来自示例系统1的系统,在该系统中,两个成员按照使得事件直到接受者已经接收到和/或存储该事件的祖先之后才被发送的次序来向对方发送事件。因此,发送者从最旧到最新发送事件,以使得接受者可以在事件被接收时、通过将关于每个事件的两个散列与已经接收到的两个祖先事件进行比较来检查这两个散列。发送者可以基于发送者的散列图的当前状态(例如,由发送者定义的数据库状态变量)和散列图指示接收者已经接收到了什么,来识别要发送给接收者什么事件。参照图3,例如,当bob与carol同步以定义事件602时,carol可以识别事件619是carol已经接收到的、由bob创建和/或定义的最后一个事件。因此,carol可以确定bob知道该事件及其祖先。因此,carol可以首先将事件618和事件616(即,carol已经接收到的、bob还未接收到的最旧的事件)发送给bob。carol然后可以将事件612以及接着事件606发送给bob。这使得bob可以容易地链接事件,并且重构bob的散列图。使用carol的散列图来识别bob还未接收到什么事件可以提高同步的效率,并且可以减小网络通信量,因为bob不向carol请求事件。

在其他实施例中,最近的事件可以被首先发送。如果接收者(基于最近的事件中的两个先前的事件的散列和/或指向最近的事件中的先前的事件的指针)确定它们还未接收到所述两个先前的事件中的一个,则接收者可以请求发送者发送这样的事件。这可以发生,直到接收者已经接收到和/或存储最近的事件的祖先。参照图3,在这样的实施例中,例如,当bob从carol接收到事件606时,bob可以识别事件606中的事件612和事件614的散列。bob在创建和/或定义事件604时可以确定事件614先前已经从alice接收。因此,bob不需要向carol请求事件614。bob还可以确定事件612还未被接收到。bob然后可以向carol请求事件612。bob然后可以基于事件612内的散列来确定bob尚未接收到事件616或618,并且可以相应地向carol请求这些事件。基于事件616和618,bob然后将能够确定他已经接收到事件606的祖先。

示例系统6:来自示例系统5的系统,该系统具有额外的约束,即,当成员在将接着发送的几个事件之间具有选择时,事件被选择为使由该成员创建和/或定义的、到目前为止发送的字节的总数最小化。例如,如果alice仅有两个事件留待发送给bob,一个是100字节并且由carol创建和/或定义,一个是10字节并且由dave创建和/或定义,并且到目前为止在该同步中alice已经发送了由carol创建和/或定义的事件的200个字节和由dave创建和/或定义的事件的210个字节,则alice应首先发送dave事件,然后随后发送carol事件。因为210+10<100+200。这可以用于解决单个成员要么送出单个巨大的事件、要么发送一大批小事件的攻击。在通信量超过大多数成员的字节限制的情况下(如关于示例7所讨论的),示例系统6的方法可以确保攻击者的事件被忽略,而不是合法用户的事件被忽略。类似地说,可以通过在更大的事件之前发送较小的事件(以抵御捆绑连接的一个巨大的事件)来减少攻击。而且,如果成员不能在单个同步中发送事件中的每个(例如,因为网络限制、成员字节限制等),则该成员可以发送来自每个成员的几个事件,而不是仅发送由攻击者定义和/或创建的事件、却不发送由其他成员创建和/或定义的(几个)事件。

示例系统7:来自示例系统1的系统,该系统具有附加的第一步骤,在该步骤中,bob将指示他在该同步期间愿意接收的字节的最大数量的数发送给alice,alice用她的限制做出回复。alice然后在下一个事件将超过该限制时停止发送。bob同样这样做。在这样的实施例中,这限制了传送的字节的数量。这可能增加收敛的时间,但是将减少每次同步的网络通信量的量。

可替代地或另外地,在一些实现中,在分布式数据库中实现每一同步处理的字节的数量和/或每一同步处理被允许同步的事件的数量的限制。例如,alice可以将bob还不知道的事件发送给bob,于是当基于字节的容许数量(即,同步的数据的量)或将允许被同步的事件的容许数量,下一个事件超过和/或达到同步阈值时,与alice相关联的数据库的实例可以停止和/或终止发送数据包和/或事件。这样的情况下的事件的发送可以通过在发送事件之前发送该事件的父来执行,如果这两个事件都正被同步的话。

在一些情况下,当alice正在同步到bob并且她需要向他发送两个事件(例如,事件x和事件y),并且bob已经具有这两个事件的所有的父时,alice可以挑选首先发送哪个。在一些实现中,alice可以计算x中的所有的字节加上她在该同步期间已经发送的x的创建者创建的所有事件中的字节的总数bx。类似地,她可以对y和到目前为止发送的y的创建者创建的事件中的字节计算总数by。她然后可以挑选在y之前发送x(如果bx<by),在x之前发送y(如果by<bx),按任一次序发送它们(如果bx=by)。

在一些情况下,两个成员之间的同步可以限于每一同步接收的事件的最大数量(例如,以防止阻断服务攻击)。如果在与该同步相关的所有的事件都已经被接收到之前达到了这样的限制,则同步早早地结束。在一些其他的情况下,每个同步事件可以限于接收字节的最大数量(而不是限于接收事件的数量,或者除了限于接收事件的数量之外)。因此,诸如接收事件的最大数量和接收字节的最大数量的限制可以用于约束或调解接收者成员(例如,bob)在同步期间从另一个成员(例如,alice)接收和/或接受的事件和/或字节的数量。前述限制可以防止恶意成员创建大事件或者用巨大量的微小事件淹没网络的攻击。在当例如一个成员具有低带宽连接来处理平均量的数据流量、而不是数据流量中的激增时的情况下,这些限制还确保了优雅降级。

在一些实现中,如果对于其的共识还未被识别到的所有的已知事件是不包含事务的空事件,则成员或计算装置不发起与另一个成员或计算装置的同步。这确保了如果长时间段没有新的事务、成员将不会浪费带宽。

在一些情况下,缺乏共识可以使成员或计算装置的存储器溢出。例如,当例如群体的至少1/3离线时,对于其的共识还未被识别到的事件集合可以增长或增加超过给定阈值,因为当太少的成员在线时,可能不能得到共识。因此,成员或计算装置的存储器可能随着对于其的共识不能被达到的事件的累计数量而溢出。为了防止由于对于其可能没有实现共识的累积的事件而导致的存储器溢出,每个成员和/或计算装置可以被配置为使得一旦达到对于其还未实现共识的事件的阈值,该成员或计算装置就可以拒绝定义和/或创建任何新的事件,直到该成员或计算装置就该成员或计算装置知道的事件中的一些达成共识为止。换句话说,在一些情况下,如果不能实现共识(例如,当太少的成员在线并且不能得到共识时),则缺乏共识可能引起溢出。因此,为了防止不能被放到共识次序中的事件的溢出(例如,因为太少的成员在线),成员不定义任何附加的事件,直到它可以从离线成员中的一些接收到事件以就更旧的事件中的一些达成共识为止。

示例系统8:来自示例系统1的系统,在该系统中,在同步处理的开头添加了以下步骤:

-alice识别她已经接收到和/或存储的事件集合s,跳过由bob创建和/或定义的事件或者作为由bob创建和/或定义的事件的祖先的事件。

-alice识别创建和/或定义s中的每个事件的成员,并且将成员的id号的列表发送给bob。alice还发送她已经接收到和/或存储的、由每个成员创建和/或定义的若干个事件。

-bob用他已经接收到多少个由其他成员创建和/或定义的事件的列表做出回复。

-alice然后仅将bob还未接收到的事件发送给bob。例如,如果alice向bob指示她已经接收到100个由carol创建和/或定义的事件,并且bob回复他已经接收到95个由carol创建和/或定义的事件,则alice将仅发送由carol创建和/或定义的最近的5个事件。

示例系统9:来自示例系统1的系统,该系统具有额外的用于识别和/或处理欺骗者的机制。每个事件包含两个散列,一个来自由该成员创建和/或定义的最后一个事件(“自有散列”),一个来自由另一成员创建和/或定义的最后一个事件(“外来散列”)。如果成员用相同的自有散列创建和/或定义两个不同的事件,则该成员是“欺骗者”。如果alice通过接收由dave用相同的自有散列创建和/或定义的两个不同的事件,发现dave是欺骗者,则她存储他是欺骗者的指示符,并且在未来避免与他同步。如果她发现他是欺骗者,仍再次与他同步,并且创建和/或定义记录该事实的新的事件,则alice也变为欺骗者,获悉alice进一步与dave同步的其他成员停止与alice同步。在一些实施例中,这仅以一种方式影响同步。例如,当alice发送她已经接收到的关于每个成员的事件的数量和标识符列表时,她不发送针对欺骗者的id或计数,所以bob将不会用任何对应的数来做出回复。alice然后将她已经接收到的欺骗者的事件发送给bob,对于这些事件,她还未接收到bob已经接收到这样的事件的指示。在该同步结束之后,bob还将能够确定dave是欺骗者(如果他尚未将dave识别为欺骗者的话),bob还将拒绝与欺骗者同步。

示例系统10:示例系统9中的系统,该系统增加了alice通过将她已经识别的并且她仍在存储其事件的欺骗者的列表发送给bob来开始同步处理,并且bob用除了alice识别的欺骗者之外、他已经识别的任何欺骗者来做出回复。然后,他们继续照常进行,而当彼此同步时不给出对于欺骗者的计数。

示例系统11:示例系统1中的系统,该系统具有基于在同步期间接收到的任何新的事件内部的事务来重复地更新当前状态(例如,由所述系统的成员定义的数据库状态变量捕捉)的处理。这还可以包括第二处理,所述第二处理每当事件序列改变时,通过以下操作来重复地重新构建该状态(例如,事件的次序):返回到更早的状态的副本,并且通过按新的次序处理事件来重新计算当前状态。因此,例如,每个计算装置可以维护两个版本的状态(一个在接收到新的事件和事务时被更新,一个只有在实现共识时才被更新)。在某个时刻(例如,在一段时段之后,在给定数量的事件被定义和/或接收到之后,等等),接收到新的事件和事务时被更新的状态的版本可以被丢弃,只有在实现共识之后才被更新的状态的新的副本可以成为接收到新的事件和事务时被更新的状态的新的版本。这可以确保两个状态的同步。

在一些实施例中,当前状态是与事务的结果相关联的状态、余额、条件等。类似地说,状态可以包括被事务修改的数据结构和/或变量。例如,如果事务是银行账户之间的转账,则当前状态可以是账户的当前余额。另举一例,如果事务与多玩家游戏相关联,则当前状态可以是与游戏相关联的位置、生命数量、获得物品、游戏状态等。

示例系统12:示例系统11中的系统,该系统通过使用“快速克隆”数组列表来维护状态(例如,银行账户余额、游戏状态等)而变得更快。快速克隆数组列表是像具有一个附加特征的数组那样动作的数据结构:它支持看起来像创建和/或定义新的对象的“克隆”操作,所述新的对象是原件的副本。克隆物就像它是真实的副本一样动作,因为对于克隆物的改变不影响原件。然而,克隆操作比创建真实的副本快,因为创建克隆物实际上并不涉及将一个数组列表的整个内容拷贝和/或更新到另一个数组列表。不是具有原始列表的两个克隆物和/或副本,而是可以使用两个小的对象,每个对象具有散列表和指向原始列表的指针。当对克隆物进行写入时,散列表记住哪个元素被修改和新值。当对位置执行读取时,首先检查散列表,如果该元素被修改,则返回来自散列表的新值。否则,返回来自原始数组列表的那个元素。以这种方式,两个“克隆物”最初正好是指向原始数组列表的指针。但是因为每个被重复地修改,所以它生长为具有大的散列表,该散列表存储它本身和原始列表之间的差异。克隆物本身可以被克隆,从而使数据结构扩展为对象树,每个对象具有它自己的散列表和指向其父的指针。读取因此使得沿着树向上走,直到找到具有请求的数据的顶点或者到达根为止。如果顶点变得太大或复杂,则可以用父的真实副本来替换它,可以对副本做出散列表中的改变,并且可以丢弃散列表。另外,如果不再需要克隆物,则在垃圾收集期间,可以从树移除它,并且可以使树瓦解。

示例系统13:示例系统11中的系统,该系统通过使用“快速克隆”散列表来维护状态(例如,银行账户余额、游戏状态等)而变得更快。这与系统12是相同的,除了树的根是散列表,而不是数组列表之外。

示例系统14:示例系统11中的系统,该系统通过使用“快速克隆”关系数据库来维护状态(例如,银行账户余额、游戏状态等)而变得更快。例如,快速克隆数据库可以用于如关于示例系统11所讨论的那样维护状态的两个副本。这是充当围绕现有的关系数据库管理系统(rdbms)的包装器的对象。每个表观的“克隆物”实际上是具有id号和指向包含数据库的对象的指针的对象。当用户的代码试图对数据库执行结构查询语言(sql)查询时,首先对该查询进行修改,然后将该查询发送到真实的数据库。真实的数据库与客户端代码看见的数据库是相同的,除了每个表具有用于克隆物id的一个附加字段之外。例如,假设存在具有克隆物id1的原始数据库,然后用id2和3生成数据库的两个克隆物(例如,用于维护状态的两个版本)。每个表中的每行在克隆物id字段中将具有1、2或3。当查询来自输入克隆物2中的用户代码时,对查询进行修改以使得查询将仅从在该字段中具有2或1的行读取。类似地,对3的读取寻找具有3或1id的行。如果结构化查询语言(sql)命令进入克隆物2并且说删除一行,该行具有1,则该命令应仅从1变为3,这将该行标记为不再被克隆物2和3共享,现在仅对3是可见的。如果在操作中存在几个克隆物,则可以插入所述行的几个副本,并且可以将每个副本变为不同克隆物的id,以使得新的行对于克隆物是可见的,除了刚“删除”所述行的克隆物之外。类似地,如果行被添加到克隆物2,则该行被添加到具有2的id的表。行的修改等同于删除、再插入。如前,如果几个克隆物是收集的垃圾,则树可以被简化。该树的结构将被存储在克隆物不可访问的附加的表中,但是只在内部使用。

示例系统15:示例系统11中的系统,该系统通过使用“快速克隆”文件系统来维护状态而变得更快。这是充当围绕文件系统的包装器的对象。所述文件系统构建在现有的文件系统之上,使用快速克隆关系数据库来管理所述文件系统的不同版本。底层文件系统存储大量文件,要么存储在一个目录中,要么根据文件名细分(以使目录保持小)。目录树可以被存储在数据库中,并且不被提供给主机文件系统。当文件或目录被克隆时,“克隆物”仅仅是具有id号的对象,并且数据库被修改以反映该克隆物现在存在。如果快速克隆文件系统被克隆,则它对于用户来说看起来像整个新的硬盘驱动器已经被创建和/或定义,被用现有的硬盘驱动器的副本初始化一样。对于一个副本的改变可能对其他副本没有影响。实际上,每个文件或目录仅存在一个副本,当文件通过一个克隆物被修改时,拷贝发生。

示例系统16:示例系统15中的系统,在该系统中,在主机操作系统上针对快速克隆文件系统中的文件的每个n字节部分创建和/或定义单独的文件。n可以是某个合适的大小,诸如举例来说4096或1024。以这种方式,如果一个字节在大文件中被改变,则该大文件中只有一个组块被拷贝和修改。这还提高了将仅几个字节不同的许多文件存储在驱动器上时的效率。

示例系统17:示例系统11中的系统,在该系统中,每个成员将某个先前时间的状态的散列、连同直到该时刻发生的数个事件(这些事件指示成员辨识和/或识别现在对事件的次序存在共识)包括在他们创建和/或定义的事件中的一些或全部中。在成员已经针对给定状态收集了包含来自多数用户的这样的散列的带签名事件之后,该成员然后可以将这存储为此刻共识状态的证明,并且从存储器删除该时刻之前的事件和事务。

示例系统18:示例系统1中的系统,在该系统中,计算中位数或多数的操作被替换为加权的中位数或加权的多数,其中,成员被用他们的“份额”加权。份额是指示成员的投票有多少计数的数。份额可以是加密货币中的股份,或者仅仅是当成员第一次被邀请加入时被分配、然后在该成员邀请加入的新的成员之间划分的任意数。当足够的成员已经同意共识状态时,旧的事件可以被丢弃,以使得它们的总份额是现有的份额的多数。如果总次序是使用由成员贡献的排名的中位数计算的,则结果是其中一半的成员具有较高的排名、一半具有较低的排名的数。另一方面,如果总次序是使用加权的中位数计算的,则结果是其中总份额的大约一半与低于此的排名相关联、一半与高于此的排名相关联的数。对投票和中位数进行加权对于防止sybil攻击可能是有用的,在sybil攻击中,一个成员邀请数量庞大的“马甲”用户加入,其中每个“马甲”用户仅由邀请成员进行假名控制。如果邀请成员被迫与被邀请者划分他们的份额,则马甲对于攻击者尝试控制共识结果将是无用的。因此,份额证明在一些情况下可能是有用的。

示例系统19:示例系统1中的系统,在该系统中,代替单个分布式数据库,存在分层结构的多个数据库。例如,可能存在用户是其成员的单个数据库,然后几个更小的数据库或“组块”,其中每个具有成员的子集。当事件在组块中发生时,它们在该组块的成员之间是同步的,而在该组块外部的成员之间不是同步的。然后,不时地,在组块内已经决定共识次序之后,所得的状态(或者具有它们的达成共识的总次序的事件)可以与大型数据库的整个成员资格共享。

示例系统20:示例系统11中的系统,该系统具有如下能力,即,具有更新用于更新状态(例如,由所述系统的成员定义的数据库状态变量捕捉)的软件的事件的能力。例如,事件x和y可以包含根据读取这些事件内的事务、然后适当地更新状态的软件代码来修改状态的事务。然后,事件z可以包含所述软件的新版本现在可用的通知。如果总次序说事件按次序x、z、y发生,则可以通过用旧的软件对x中的事务进行处理、然后用新的软件对y中的事务进行处理来更新状态。但是如果达成共识的次序是x、y、z,则x和y这二者都可以用旧的软件来更新,这可能给出不同的最终状态。因此,在这样的实施例中,升级所述代码的通知可以在事件内出现,以使得社区可以对何时从旧的版本切换到新的版本实现共识。这确保成员将保持同步的状态。这还确保所述系统即使在升级期间也可以保持运行,而无需重新启动或重新开始所述处理。

在一些实现中,散列图共识方法可以由平台(例如,在计算装置和/或系统的处理器上执行的软件程序)实现。一般来说,散列图平台收集、传播事务、对事务进行排序,并且执行与共识处理相关联的其他的合适的任务。除了平台之外,在一些情况下,单独的应用通过按平台定义的共识次序执行事务来维护和修改散列图的共享状态。当这样的应用的新版本被发行时,通过提供例如新版本编号、新应用代码的散列、以及升级有效的证明(例如,应用代码上的由创建该应用的公司签名的数字签名),可以创建新版本事务。在一些实现中,新版本事务可以被配置为使得新版本一直到对新版本事务识别出共识次序才被执行。因此,在共识次序中被识别为较早的事务被用应用的旧版本处理,在共识次序中被识别为较晚的事务被用应用的新版本处理。因此,新版本事务确保了成员同时升级到应用的新版本,并且使它们的状态保持一致。

在一些实现中,对于平台的升级可以以类似于对于应用的升级的方式执行。例如,平台的新版本事务可以在就这样的新版本事务达成共识时执行。可替代地,当平台发现平台的新版本可用时,它可以向散列图的每个成员显示请求陈述该成员是否想要升级的查询。在这样的情况下,可以基于(一个或多个)成员响应来升级平台。

在一些实现中,应用和/或平台升级可以受制于用户投票表决。例如,成员的计算装置可以通过点击或提交被记录为事务(例如,在事件中)的赞成或反对投票,来向相关联的用户显示提示授权升级的弹出窗口。因此,平台和/或应用的自动更新在被群体的阈值(例如,群体的多于2/3)授权时可以被执行。

示例系统21:示例系统1中的系统,其中,散列图的成员或计算装置被配置为通过定义分布式数据库的签名的状态来从分布式数据库的实例移除不必要的事件。在一些实现中,成员或计算装置可以执行附加处理来防止存储器溢出和/或节省存储器资源。例如,成员或计算装置可以基于一套规则或准则来周期性地丢弃旧的事件。规则可以例如声明,如果事件的接收轮次减去轮次号(或创建轮次)超过给定阈值,则忽视或丢弃事件中的事务。在一些情况下,事件包含它们的父的散列和对每个父创建的轮次。因此,即使一个或多个父由于因为它们是在太多轮次之前创建的、所以已经被忽视或丢弃而缺失,给定事件在同步期间仍可以被接受。因此,签名的状态可以包括在签名的状态之前的轮次中定义和/或创建、但是在签名的状态之前不是太长以至于它们将被忽视或丢弃的事件的散列。移除或丢弃不必要的事件减小了由于在实现分布式数据库的计算装置集合(例如,散列图的成员)之间同步冗余的或无关的事件而引起的开销,并且降低了这样的计算装置集合的本地存储器的利用不足。关于移除和/或丢弃事件的额外的细节可以在2016年12月19日提交的、标题为“methodandapparatusforadistributeddatabasethatenablesdeletionofevents”的美国临时专利申请no.62/436,066中找到,该申请整个地通过引用并入本文。

上述系统预期创建和/或实现用于分布式共识、最终达成共识的高效的收敛机制。如以下所示,关于此的几个定理可以被证明。

示例定理1:如果事件x按部分次序领先于事件y,则在给定成员在给定时间对其他成员的了解中,其他成员中的每个将要么已经在y之前接收到x的指示,要么将还未接收到y的指示。

证明:如果事件x按部分次序领先于事件y,则x是y的祖先。当成员第一次接收到y的指示时,该成员要么已经更早地接收到x的指示(在这种情况下,他们在y之前获悉x),要么将是同步为该成员提供x和y这二者的情况(在这种情况下,他们在该同步期间将在y之前获悉x,因为在单次同步期间接收到的事件被认为已经按与关于示例系统5描述的祖辈关系一致的次序接收)。qed

示例定理2:对于任何给定的散列图,如果x按部分次序领先于y,则x按对该散列图计算的总次序将领先于y。

证明:如果x按部分次序领先于y,则按照定理1:

对于所有的i,rank(i,x)<rank(i,y)

其中,rank(i,x)是成员i分配给事件x的排名,如果x是成员i接收到的第一个事件,则排名为1,如果x是第二个,则排名为2,依此类推。设med(x)为rank(i,x)在所有i上的中位数,类似地适用于med(y)。

对于给定的k,选择i1和i2,以使得rank(i1,x)是第k个最小的x排名,rank(i2,y)是第k个最小的y排名。于是:

rank(i1,x)<rank(i2,y)

这是因为rank(i2,y)大于或等于y排名中的k个,其中每个y排名严格大于对应的x排名。因此,rank(i2,y)严格大于x排名中的至少k个,所以严格大于第k个最小的x排名。该论证适用于任何k。

设n为成员的数量(其是i值的数量)。于是,n必须要么是奇数,要么是偶数。如果n是奇数,则设k=(n+1)/2,第k个最小的排名将是中位数。因此,med(x)<med(y)。如果n是偶数,则当k=n/2时,第k个最小的x排名将严格小于第k个最小的y排名,而且第(k+1)个最小的x排名将严格小于第(k+1)个最小的y排名。所以所述两个x排名的平均值将小于所述两个y排名的平均值。因此,med(x)<med(y)。所以在两种情况下,x排名的中位数严格小于y排名的中位数。所以如果总次序是通过按照中位数排名对动作进行排序而定义的,则x按总次序将领先于y。qed

示例定理3:如果“传播时段”是通过与所有成员同步来使现有的事件传播的时间量,则:

在1个传播时段之后:所有的成员都已经接收到事件

在2个传播时段之后:所有的成员都同意这些事件的次序

在3个传播时段之后:所有的成员都知道已经达成协定

在4个传播时段之后:所有的成员都从所有的其他的成员获得数字签名,赞同该达成共识的次序。

证明:设s0为通过给定时间t0已经创建和/或定义的事件的集合。如果每一个成员通常最后都将无限地与每一个其他的成员同步,则以概率1,最后将存在时间t1,在时间t1,s0中的事件已经流传到每一个成员,以使得每一个成员都知道所有的事件。这是第一传播时段的结束。设s1为在时间t1存在并且在t0还不存在的事件的集合。于是,将以概率1,最后存在时间t2,在时间t2,每一个成员都已经接收到集合s1中的每一个事件,所述每一个事件是在时间t1存在的那些事件。这是第二传播时段的结束。类似地,t3是当s2中的所有事件(到t2但不在t1之前存在的那些事件)已经流传到所有的成员的时候。注意,每个传播时段最后都以概率1结束。平均起来,如果存在n个成员,则每个将持续它执行log2(n)次同步所花费的时间之久。

到时间t1,每一个成员都将已经接收到s0中的每一个事件。

到时间t2,给定成员alice将已经接收到接收s0中的每一个事件的其他成员中的每个的记录。alice因此可以对每一个成员、对s0中的每一个动作计算排名(这是该成员接收到该动作的次序),然后按照排名的中位数来对事件进行排序。对于s0中的事件,所得的总次序不改变。这是因为所得的次序是每个成员首先接收到这些事件中的每个的指示的次序的函数,该次序是不变的。可能的是,alice的计算的次序将使来自s1的一些事件穿插在s0事件之间。在这些s1事件落在s0事件的序列内的情况下,这些s1事件仍可能改变。但是s0中的事件的相对次序将不改变。

到时间t3,alice将已经得知s0和s1的并集上的总次序,该并集上中的事件的相对次序将不改变。此外,她可以在该顺序内找到来自s1的最早的事件,并且可以推断s1之前的事件的顺序将不改变,即使在s0外部插入新的事件也不改变。因此,到时间t3,alice可以确定对于第一个s1事件之前的历史中的事件的次序已经实现共识。她可以对由按该次序发生的这些事件得到的(例如,由alice定义的数据库状态变量捕捉的)状态的散列进行数字签名,并且作为她创建和/或定义的下一个事件的一部分送出签名。

到时间t4,alice将已经从其他成员接收到类似的签名。此刻,她可以仅保存该签名列表、连同它们证实的状态,并且她可以丢弃她在第一个s1事件之前已经存储的事件。qed

本文中所描述的系统描述了快速地且安全地实现共识的分布式数据库。这可以是对许多应用有用的构建块。例如,如果事务描述从一个加密货币钱包到另一个加密货币钱包的加密货币的转移,并且如果状态仅仅是每个钱包中的当前金额的声明,则该系统将构成避免现有系统中的高成本的工作证明的加密货币系统。自动规则实施使得这可以添加在目前的加密货币中不常见的特征。例如,通过实施如下规则,丢失的硬币可以被恢复,以避免通货紧缩:如果钱包在某个时段内既不发送、也不接收加密货币,则该钱包被删除,并且其价值被与它们目前包含的金额成比例地分发给其他的现有的钱包。以这种方式,即使用于钱包的私钥丢失,货币供给也将不会增长或收缩。

另一个例子是分布式游戏,所述分布式游戏像在服务器上玩的大规模多玩家在线(mmo)游戏那样动作,但是在不使用中央服务器的情况下实现该游戏。共识可以在没有任何中央服务器控制的情况下实现。

另一个例子是构建于这样的数据库之上的用于社交媒体的系统。因为事务被数字签名,并且成员接收到关于其他成员的信息,所以这提供优于目前的系统的安全性和方便性优点。例如,可以实现具有强反垃圾邮件策略的电子邮件系统,因为电子邮件不可能伪造返回地址。这样的系统还可以变为将目前通过电子邮件、推特、文本、论坛、维基和/或其他社交媒体进行的功能组合在单个分布式数据库中的统一的社交系统。

其他应用可以包括更复杂的密码功能,诸如群组数字签名,在群组数字签名中,群组作为整体合作来对合约或文档进行签名。这种形式和其他形式的多方计算可以使用这样的分布式共识系统来有用地实现。

另一个例子是公众账簿系统。任何人都可以付款来将某个信息存储在所述系统中,每年每个字节支付少量加密货币(或真实世界货币)来将信息存储在所述系统中。这些资金然后可以自动地分发给存储该数据的成员和重复地同步工作以实现共识的成员。它可以在每次他们同步时自动地将少量加密货币转移给成员。

另一个例子是抵抗通信量分析的安全消息传送系统。在该例子中,分布式数据库可以包含和/或存储成员之间的加密的消息。每个成员可以访问每一个消息,但是消息被加密以使得只有预期的接收者可以对它们进行解密。例如,alice可以通过用bob的公钥对散列图的成员中的其余成员未知的消息进行加密、然后将加密消息作为事务提交来将该消息发送给bob。这样的事务可以被如以上所讨论的那样被扩散或传播给散列图的成员中的其余成员。社区将知道成员何时发送消息,但是将不会知道消息被发送给谁。每个成员可以尝试对每一个消息进行解密,并且通过解密的消息是有效的并且具有正确的校验和的事实来辨识发送给它们的那些消息。

可替代地,这样的系统中的计算要求可以例如以以下方式降低。每对成员可以最初协商两个共享的密钥(对中的每个成员一个),他们使用这些密钥来播种两个不同的密码安全随机数发生器(csprng)(对中的每个成员一个)。如果alice已经与bob创建了这样的密钥,则每次她将消息添加到意图用于bob的数据库时,她使用她的csprng来产生新的伪随机数,并且她将该数附到加密的消息。然后bob可以快速地检查附到数据库中的每个消息的数以查看这样的数中的任何一个是否指示意图用于他的消息。因为bob知道共享的密钥,他因此知道alice将产生的数的顺序,所以他知道当为从alice寄给他的消息扫描消息时要寻找什么数。当他找到附有这样的数的消息时,他知道它们是从alice给他的消息,并且他可以对它们进行解密。只有bob可以对这样的消息进行解密,因为它们被用他的公钥加密,并且只有bob具有对应的私钥。

在一些情况下,诸如从carol到dave的无关的消息可以附有不同的数,bob可以丢弃它们,而不尝试对这些消息进行解密。而且,alice可以将附有来自她的csprng的未加密的第k随机数的第k消息发送给bob。alice和bob可以保持跟踪alice已经发送给bob多少个消息(例如,通过将消息存储在散列表中)。因此,在任何给定时间,bob可以确定从散列图的其他成员中的每个预期的下一个数。当接收到每个消息时,bob可以经由散列表确定所附的数是否与任何预期的数匹配。如果不匹配,则bob不必花费时间和资源来试图对接收的消息进行解密。

在一些情况下,alice和bob可以周期性地重新协商他们的共享的密钥,并且擦除他们的旧的密钥。这提供了前向安全性,以使得在未来,即使alice和bob的之后的密钥最后受损,第三方也将难以识别在alice和bob之间发送的消息。因此,可以在散列图或分布式数据库中启用私有消息的有效的发送和接收。

这些例子表明分布式共识数据库作为许多应用的组件是有用的。因为数据库不使用高成本的工作证明,而是可能使用更便宜的份额证明,所以数据库可以用在更小的计算机或者甚至移动装置和嵌入装置上运行的全节点运行。

虽然在上面被描述为包含两个先前的事件的散列(一个自有散列,一个外来散列)的事件,但是在其他实施例中,成员可以与两个其他的成员同步来创建和/或定义包含三个先前的事件的散列(一个自有散列,两个外来散列)的事件。在还有的其他的实施例中,来自任何数量的成员的先前事件的任何数量的事件散列可以包括在事件内。在一些实施例中,不同的事件可以包括先前事件的不同数量的散列。例如,第一个事件可以包括两个事件散列,第二个事件可以包括三个事件散列。

虽然事件在上面被描述为包括先前的事件的散列(或密码散列值),但是在其他实施例中,事件可以被创建和/或定义为包括指针、标识符、和/或对于先前的事件的任何其他合适的引用。例如,事件可以被创建和/或定义为包括与先前的事件相关联的并且用于识别先前的事件的序列号,从而链接事件。在一些实施例中,这样的序列号可以包括例如与创建和/或定义事件的成员相关联的标识符(例如,介质访问控制(mac)地址、互联网协议(ip)地址、分配的地址等)以及由该成员定义的事件的次序。例如,具有标识符10的成员,事件是由该成员创建和/或定义的第15个事件,可以将标识符1015分配给该事件。在其他实施例中,可以使用任何其他的合适的格式来为事件分配标识符。

在其他实施例中,事件可以包含全部的密码散列,但是这些散列只有部分在同步期间被发送。例如,如果alice将包含散列h的事件发送给bob,j是h的头3个字节,并且alice确定在她已经存储的事件和散列之中,h是以j开始的唯一散列,则她在同步期间可以发送j,而不是h。如果bob然后确定他具有以j开始的另一个散列,则他然后可以回复alice以请求整个h。以这种方式,散列可以在发送期间被压缩。

虽然上面示出和描述的示例系统是参照其他系统描述的,但是在其他实施例中,可以实现示例系统和它们的相关联的功能的任何组合来创建和/或定义分布式数据库。例如,可以组合示例系统1、示例系统2和示例系统3来创建和/或定义分布式数据库。另举一例,在一些实施例中,可以用示例系统1、但是不用示例系统9来实现示例系统10。又举一例,可以将示例系统7与示例系统6组合,并且用示例系统6来实现示例系统7。在还有的其他的实施例中,可以实现示例系统的任何其他的合适的组合。

虽然上面已经描述了各种实施例,但是应理解它们仅仅是作为例子、而非限制而提出的。在上述方法指示按某个次序发生的某些事件的情况下,某些事件的排序可以被修改。另外,当可能时,事件中的某些可以在并行处理中同时执行,而且也可以如上所述那样顺序地执行。

本文中所描述的一些实施例涉及一种具有非暂时性计算机可读介质(也可以被称为非暂时性处理器可读介质)的计算机存储产品,所述计算机可读介质上具有用于执行各种计算机实现操作的指令或计算机代码。所述计算机可读介质(或处理器可读介质)从它本身不包括暂时性传播信号(例如,在传输介质(诸如空间或线缆)上传载信息的传播电磁波)的意义上来讲是非暂时性的。所述介质和计算机代码(也可以被称为代码)可以是针对特定的一个目的或多个目的设计和构造的那些。非暂时性计算机可读介质的例子包括,但不限于:磁性存储介质,诸如硬盘驱动器、软盘和磁带;光学存储介质,诸如紧凑盘/数字视频盘(cd/dvd)、紧凑盘只读存储器(cd-rom)和全息器件;磁光存储介质,诸如光盘;载波信号处理模块;以及被特殊地构造为存储和执行程序代码的硬件器件,诸如专用集成电路(asic)、可编程逻辑器件(pld)、只读存储器(rom)和随机存取存储器(ram)器件。本文中所描述的其他实施例涉及一种计算机程序产品,所述计算机程序产品可以包括例如本文中所讨论的指令和/或计算机代码。

计算机代码的例子包括,但不限于,微代码或微指令、机器指令(诸如由编译器生成)、用于生成web服务的代码、以及包含计算机使用解释器执行的更高级指令的文件。例如,实施例可以使用命令式编程语言(例如,c、fortran等)、函数编程语言(haskell、erlang等)、逻辑编程语言(例如,prolog)、面向对象的编程语言(例如,java、c++等)或其他合适的编程语言和/或开发工具来实现。计算机代码的另外的例子包括,但不限于,控制信号、加密代码和压缩代码。

虽然上面已经描述了各种实施例,但是要理解它们仅仅是作为例子、而非限制而提出的,并且可以做出形式和细节上的各种改变。本文中所描述的设备和/或方法的任何部分可以按任何组合来组合,除了相互排斥的组合之外。本文中所描述的实施例可以包括所描述的不同实施例的功能、组件和/或特征的各种组合和/或子组合。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1