本文讲述的是一个区块链仿真工具,对区块链做研究、实验、建模会有所帮助。
BlockSim是一种框架和软件工具,用于为区块链系统构建和模拟离散事件动态系统模型。
BlockSim旨在支持对各种区块链和区块链部署以及各种分析问题的分析。 BlockSim的核心是基本模型,该模型包含跨三个抽象层(网络,共识和激励层)组织的各种区块链系统通用的主要模型构造。基本模型可用于各种区块链系统,并可轻松扩展以包括系统或部署细节。 BlockSim软件工具提供了一个模拟器,该模拟器可在Python中实现基本模型。本文介绍了基本模型,模拟器实现以及BlockSim在比特币,以太坊和其他共识算法中的应用。通过与实际系统和文献中其他研究的性能结果进行比较,来验证BlockSim仿真结果。我们通过BlockSim模拟研究结束本文。
一、介绍
BlockSim的设计目标:
1.通用性:能够将BlockSim用于大量的区块链系统,配置和设计问题。
2.可扩展性:BlockSim应该易于设计人员或分析师操纵,以研究区块链系统的不同类型和方面。
3.简便性:在使BlockSim易于使用时,应同时满足上述两个目标,无论是用于仿真研究还是对其进行扩展。
BlockSim的核心是基本模型,它包含三个抽象层的模型构造:网络层,共识层和激励层。网络层捕获区块链的节点和底层的点对点协议,以在节点之间交换数据。共识层捕获为达成关于区块链分类账当前状态的协议所采用的算法和规则。激励层捕获区块链采用的经济激励机制,以在参与节点之间发布和分配奖励。
此外基本模型还包含许多区块链通用的功能块,比如节点、交易、区块、共识、激励等等模块。
二、背景
描述了很多非许可链的内容与区块链的基本内容,这里不再阐述,有兴趣的可自行百度。
BlockSim模型分为三层:激励层、共识层和网络层:
模型层次.png
网络层:
区块链系统中的网络层包含网络中的节点,它们的地理位置和相对位置以及它们之间的连通性。它定义了要传播的信息以及传播这种信息的机制。
网络层中的主要组成部分是节点。节点可以是想要创建和提交要执行并包含在分类帐中的交易的普通用户,也可以是称为矿工的特殊节点,该节点通过添加新块来维护和扩展分类帐。节点具有唯一的标识符并维护其余额,区块链分类账的本地副本以及(如果该节点是矿工)单个交易池。事务池保留从网络中其他节点接收到的未决事务。
节点之间相互传达以下信息。如果节点生成新交易,则将其加密签名并传播给其对等节点,以确认并记录在区块链分类账中。如果节点是矿工,则每次生成一个块时,它都会通知其对等节点,以便他们可以对其进行验证并将其附加到分类账的副本中。
共识层:
区块链系统中的共识层定义了用于在网络节点之间达成有关区块链状态的协议的算法和规则。这样的规则指定了哪个节点适合生成下一个区块并将其附加到区块链分类账,生成区块的频率以及如何解决当节点具有多个不同账本副本时可能发生的潜在冲突。
现有区块链已经存在多种共识算法,例如工作量证明(PoW)和权益证明(PoS)。在PoW中,节点(即矿工)通过附加新的区块来投资其计算能力来维护分类帐,而在PoS中,节点则投资其股权或资金。无论节点需要投入什么,这种算法的直觉都是引入维护分类帐的成本。引入的成本应该足以阻止节点恶意行为。同时,仅当节点遵循规则并诚实地维护分类账时,他们的努力才能获得回报(请参阅激励层)。
由于在网络中的节点之间传播块而导致的延迟(请参阅网络层),其他节点可能会在听到最近宣布的另一个竞争性块之前生成下一个块。这会导致冲突(称为分叉),当节点具有多个不同的分类帐视图时,就会发生冲突。区块链系统中共识层的任务是解决此类冲突。不同的共识算法使用不同的规则来选择应接受哪个区块链(叉)作为全局链。例如,比特币和以太坊使用的PoW算法通过采用最长的链来解决冲突。其他提议,例如GHOST ,选择了工作量最大的分叉。
激励层:
激励层利用区块链的加密货币建立激励结构,在维护区块链分类账的参与矿工之间分配奖励。激励模型对于维护任何未经许可的区块链系统至关重要。激励措施应公平地补偿矿工的工作,并激励他们诚实行事。激励措施还保护区块链系统免受各种攻击(例如,以太坊中的DDoS攻击)和节点的恶意行为(例如,自私的挖掘策略)。
在大多数区块链系统中,奖励与生成区块和完成交易相关联,分别称为区块奖励和交易费用。根据链的不同,奖励的内容之间会有细微的差异,当矿工收到奖励时(例如,通过将新的区块添加到分类账中),其余额将相应增加。在所有已知的区块链中,区块奖励均设置为固定金额,而交易费用则根据可变的金额以及交易提交者愿意支付的奖金来计算为可变数量的加密货币。
三、基本模型
设计原则
通用、可扩展、简单。
旨在在区块链系统领域的上述三个目标之间找到最佳平衡。
基本模型标识了BlockSim意图在所有区块链上通用的关键构建块(例如,块,交易,节点和激励机制),请参见下图。基本模型规定了BlockSim支持的模型类的通用性,尤其是建立新模型有多容易。基本模型将转换为软件模块,因此也将确定BlockSim是否可以轻松扩展,例如,为区块链中发生的某些过程提供更详细的模型。
BlockSim模型实体
网络层
区块链分类账和交易池实体都是Node实体的一部分(见上图)。也就是说,每个节点都维护并不断更新这些实体。我们将节点建模为具有不同属性(例如唯一ID,余额,本地分类帐和交易池)的对象。交易池和本地分类帐被建模为数组列表,可以在新的时候对其进行扩展接收到交易和块。这些属性在区块链的不同实现中共有。
信息实体的传播取决于广播协议实体Broadcast Protocol,可以通过考虑网络配置,节点的地理分布以及节点之间的连接性来详细建模,也可以仅考虑以下因素在抽象级别进行模拟在节点之间传播信息的时间延迟。抽象广播协议的原因是通过隐藏不必要的细节来使我们的模拟器尽可能简单。这将减轻模拟器用户配置许多与网络配置有关的参数的麻烦,例如广播协议,节点的地理分布以及每个节点的连接数。将传播延迟作为唯一可配置的参数将提高模拟器的效率和可用性。(可以使用简化配置模拟,也可自定义详细调参)
共识层
该层包括四个实体,即交易,区块,交易池和区块链分类账(总账)。
区块链分类帐实体依赖于Block实体,而Block实体依赖于Transaction实体。也就是说,区块链分类帐是由区块构成的,而区块由交易构成。事务池取决于事务实体,因为创建的每个事务都被馈送到事务池中。 Node实体维护这四个实体。
在共识层内,实体将执行若干活动或动作。创建区块和交易就是此类活动的一个示例。这些活动的流程如下图所示。这些活动连续运行,例如,事务和块始终保持到达网络。
实体活动流程
交易
以两种不同的方式对交易进行建模,即完整交易和轻交易。完整的技术有助于跟踪系统中的每个事务(例如,何时创建事务并将其包含在有效块中)。这种技术可以像在任何区块链系统中一样对交易进行建模,并且如果有人对研究区块链系统中单个交易的等待时间感兴趣,该技术将非常有用。但是,由于必须跟踪每个事务,因此这种类型的建模会在仿真过程中消耗大量的计算资源和时间。
另一方面,轻技术轻交易不会跟踪每个事务。在研究区块链系统的吞吐量而不关心系统内交易的确认时间时,这很有用。
在这两种技术中,将交易建模为具有多个属性或字段的对象,例如交易ID,大小,费用,时间戳,内容以及交易的提交者和接收者。这些属性几乎在所有区块链上都很常见,并且某些系统具有更多其他属性(例如,以太坊还具有与气体相关的属性,例如Gas Limit)
如上图可见,交易transaction分为三个步骤:
创建交易:这涉及由参与节点生成交易。可以控制和配置每单位时间要创建的事务数。
传播交易:这需要交易的创建者将其传播到其他参与节点。这是为了通知其他节点有关新创建的事务的信息。
追加交易:这要求交易的接收者将其追加到他们的交易池中。
完整交易建模会将上述三个活动进行详细的建模、调配。
轻型建模技术则仅对单个事务池进行建模,以在网络中的所有节点之间共享。该技术的目的是通过省略传播过程以及节点连续更新其池的需求(请参见第3.3节),提供一种替代的简化方法来对事务进行建模。因此,此技术在仿真过程中更加高效,快捷。但是,由于未跟踪事务,因此无法使用此技术得出有关事务延迟的结论。尽管如此,获取有关区块链系统吞吐量的指标还是有用的。
两种技术都可以实现,然后用户可以根据自己的需求选择采用哪种方法。例如,如果仅对吞吐量感兴趣,则无需选择完整的技术,因为它会使模拟器运行很长时间。
区块
将块建模为具有多个属性的对象,即深度,块ID,先前的块ID,时间戳,大小,矿工ID和事务。块ID是该块的唯一标识符。区块深度表示节点的区块链中区块的索引。矿工ID是指创建块的节点。每个块都可以接受交易列表作为其内容。这些属性在整个区块链中很常见。
将共识层中的块建模为“块生成”和“块接收”,请参见上图。块生成指定何时生成块以及哪个节点适合附加下一个块。它涵盖了矿工创建区块并将其附加到区块链分类账所需的所有常见操作。这些动作包括执行区块的交易,将区块构建并附加到本地区块链,以及将区块传播到网络中的其他节点。区块接收指定了网络节点在收到新区块时如何更新其区块链分类帐。它涵盖了节点在接收到新生成的块时所采取的常见活动。接收到有效块后,接收方节点将执行三个操作,这些操作将在必要时更新本地区块链,将区块附加到本地区块链并更新交易池。
节点收到新块后,将检查其有效性。如果正确构造了该块并且正确执行了所有嵌入式事务,则认为该块有效。除了区块有效期外,该区块还必须指向分类帐中的最后一个区块(该区块的深度应大于最后一个区块的深度)。我们仅对块深度进行建模,因此,我们对块的有效性进行了抽象。如果接收到的块的深度不高于最后一块的深度,则该块将被丢弃。否则,该节点将执行以下操作。
交易池和区块链分类帐
它们代表了区块链系统的状态。交易池在新交易或区块到达时进行更新,而区块链分类帐仅在区块到达后才更新。节点负责更新池和分类帐,因为区块链网络中的每个节点都维护它们的本地副本。
注:对于分叉的处理规则也可在工具中定义,如比特币中的最长链原则。
激励层
负责通过定义奖励元素(例如,区块和交易)以及在参与的矿工之间分配奖励来设计基础奖励模型。该层具有奖励实体,该奖励实体取决于Block实体。即,仅在将新的块附加到分类账时才将奖励给予矿工。这些奖励的计算和分配被视为行动。本工具对大多数区块链系统(例如比特币)使用的基本激励模型进行建模。本工具的模型提供了生成有效区块的奖励(区块奖励)和区块中包括的所有交易的奖励(交易费)。区块奖励被建模为可由最终用户配置和更改的固定数量的加密货币。交易费用的计算方法是其大小与其奖励的乘积,其中奖励是交易提交者愿意为每大小单位支付的金额。交易的大小和奖励也可以配置为固定或可变(随机)值。但是,可以扩展当前模型以包括不同的奖励或更改交易费用的计算方式。在将有效区块附加到分类账之后,我们通过增加每个矿工的余额来模拟奖励分配。
四、BlockSim实现
使用Python3.6.4实现,地址:
https://github.com/maher243/BlockSim.
共分为配置模块、激励层模块、共识层模块、网络层模块、仿真模块。
仿真模块
包含四个类,分别是事件,调度程序,统计信息和主类:Main, Event ,Scheduler, Statistics.
Event
事件首先是事件调度的设计。BlockSim设计了两种抽象级别的事件调度,一种是将区块视为事件单元,称为块级事件,另一种是将事务(交易)视为事件单元,称为事务级事件。对于块级事件,它具有四个属性:type, nodeID, time , block。type指示如何处理事件,尤其是当前事件是创建新块还是接收现有块。 nodeID和time属性指定处理事件的节点以及事件发生的时间。block属性包含要处理的块的必要信息。
Scheduler
Scheduler类负责安排将来的事件并将其记录在Queue中。队列是一个数组列表,用于维护所有将来的事件,并且在仿真期间通过插入新事件或删除现有事件来对其进行连续更新。例如,在块级别,一旦通过块创建事件创建了一个块,调度程序类便会调度块接收事件,以供其他节点接收该块。此外,它通过选择一个矿工来计划新的区块创建事件,并在最后一个区块的顶部生成一个新区块。
Main和Statistics
类的功能与预期的一样。主要运行模拟器。它准备设置,然后触发Scheduler类以安排一些初始事件。该设置包括交易的创建以及第一个(生成)块的创建,第一个(生成)块是一个空块(创世块),将被附加到网络中所有节点的本地区块链上。然后,它将继续处理所有事件并逐一执行它们,直到队列为空或达到预先指定的仿真时间为止。统计信息将保留结果并计算模拟最终输出的统计信息,包括区块统计信息(分类账中包含的区块数量和废弃区块的百分比),吞吐量和采矿利润。
基本模块(网络层、共识层、激励层)
基本模型网络层、共识层、激励层均有对应的py类文件,可在其中进行具体的扩展:
具体的设计实现请参考代码与论文。
配置模块
该模块用作主用户界面,用户可以在其中从可用模型中进行选择,以及配置与参与节点,区块,交易,共识,激励和仿真设置相关的各种参数。下表总结了在运行模拟器之前要配置的输入参数。例如,我们可以配置节点数,块间隔时间,每秒要创建的事务量以及其他参数。此外,模拟器允许在不感兴趣的情况下禁用交易。这可以通过仅将参数hasTrans设置为“ False”来完成,而无需修改模拟器的代码。此外,它允许选择合适的技术(完整或轻量)来对交易进行建模。
配置参数列表
例如,可通过新的共识协议来扩展模拟器,这将反映在此模块中,以允许模拟器的用户选择所需的协议。
五、BlockSim示例学习
BlockSim被设计用于任何类型的区块链,并且为了证明这一点,本文将应用BlockSim的基本模型来模拟比特币和以太坊。此外还将讨论如何扩展基本模型的BlockSim实现以支持任何感兴趣的共识算法。
比特币和以太坊的实现主要是对4中提及的各个模块进行扩展,达到比特币与以太坊的要求。具体的扩展做法参见论文。重点是不同共识协议应用于仿真工具中。
不同共识协议的应用
到目前为止,主要将PoW视为共识协议,但还有许多其他协议,包括权益证明(PoS),权限证明或基于消息的共识算法,例如实用拜占庭容错及其许多变体。这些协议与PoW之间的显着区别在于,在PoW中,矿工不是由共识协议直接选择的,而是矿工不断投资其计算能力来创建后续块。为了支持PoS之类的方法,我们通过更改选择矿工以生成下一个区块的方式来修改共识类。其他共识要素(例如交易,区块和分叉解决方案)和模块(模拟,网络和激励措施)保持不变。通常,只要可以按照按块的粒度安排的事件如实地模拟输出指标,就可以自然地扩展BlockSim。共识算法消耗的时间将由一个延迟来表示。但是,如果要分析特定消息序列对PBFT风格共识协议的性能的影响,那么BlockSim就是一个不太明显的候选对象。为了进行有效的(即快速的)仿真,人们将通过在消息级别运行的模拟工具来研究这样的共识协议,而不会将不同级别的抽象和时间粒度混合在一起。(PoX类协议很好扩展,直接改出块节点选择规则即可,其他要素不变。而PBFT类型的共识若要分析特定消息序列的性能影响,可能就不能选择BlockSim)
六、BlockSim实验验证与实验结果
主要是通过实验说明BlockSim仿真与真实的区块链系统(比特币与以太坊)和PoW共识之间的各个指标基本一致。验证了BlockSim的有效性。
七、讨论
主要对一中提及的设计三个设计目标进行对照和说明:通用性、扩展性、简单性。
通用性
通用性是指使用BlockSim处理各种分析问题和各种区块链的能力。实现通用性的关键技术是BlockSim基本模型,该模型的设计方式是可以回答许多区块链系统和分析问题。基本模型涵盖了区块链的所有常见构造块,例如节点,交易,块,区块链分类账,分叉解决方案和激励模型。我们已经展示了区块链在分析比特币和以太坊中的应用,可以说BlockSim非常适合所有无许可的区块链系统(意思是对于许可链仿真不太适用)。此外,BlockSim通过支持不同的属性和度量(例如性能(吞吐量和延迟)),功能度量(例如陈旧率)和系统属性(例如挖掘分散和挖掘激励)来实现通用性。但是,为了进一步支持该标准,我们旨在在更高版本的BlockSim中为网络层建模和实现不同的共识协议(例如,权益证明)以及不同的通用广播协议。
可扩展性
可扩展性是指BlockSim工具以自然方式扩展各种系统和分析问题的能力。这归结为软件的设计,即通过易于操作和扩展的模块来研究不同的特性或感兴趣的问题。只需修改相关模块,而不是从头开始构建所有内容,就可以实现这一目标。例如,我们展示了如何扩展实现BlockSim基本模型的类以支持比特币和以太坊。
简单性
BlockSim达到了这一标准,因为它已在不同的模块中实现,并且提供了用户界面(配置模块),允许最终用户为模拟器设置输入参数。这使BlockSim易于使用和理解。此外,当前版本的BlockSim隐藏并抽象了许多细节。例如,它仅通过为信息传播引入可配置的时间延迟来建模该层,从而抽象化了网络层的所有细节。此外,它隐藏有关块和事务验证过程的详细信息。这样,BlockSim变得简单,易于使用和理解。尽管隐藏和抽象细节会导致模型不完整,但是可以根据需要扩展BlockSim以合并这些细节。
八、总结
本文提出了BlockSim,一个用于区块链系统的离散事件仿真框架,可捕获区块链系统的网络层,共识层和激励层。仿真工具是用Python实现的,可用于一般用途。本文介绍设计并针对通用性,可扩展性和简单性的设计目标进行评估。通过将BlockSim的结果与比特币和以太坊等现实区块链中的设计属性和测量研究进行比较,验证了结果。本文还展示了BlockSim在研究各种区块链配置的过时率,吞吐量和挖掘分散性方面的用途。未来的工作应通过实施区块链系统的其他变体来进一步证明BlockSim的可扩展性,例如基于权益证明的系统以及带有通道扩展的区块链。此外,可以在当前版本的BlockSim的基础上进行扩展,并使用其他可重用的类对其进行扩展,这些类表示其他重要的系统方面和机制,尤其是采矿池和通道。
网友评论