一种研究区块链网络行为与质量的仿真方法
摘要
区块链作为比特币的基础技术,由于其独特的安全性、可信性和可靠性,正逐渐成为互联网的又一次技术变革。然而,由于大规模部署和高昂的运行成本,研究人员很难研究大型且活跃的区块链网络(如比特币)的动态行为。本文提出了一种仿真方法,用于在规模较大的区块链网络中研究区块链协议。首先,确定了用于模拟区块链的软件工具所需的若干关键要求。其次,重点在于选择和定义关键性能指标,以量化区块链质量(QoB)。我们旨在通过使用现有的模拟工具,复制一个简化的区块链工作量证明(PoW)协议,并采用不同参数进行观察,来验证所提出的方法。我们的案例研究表明,使用仿真方法研究具有不同网络规模和协议的区块链网络是可行且实用的。
关键词
:区块链 · 工作量证明 (PoW) · 离散事件仿真 · 区块链服务质量 (QoB)
1 引言
在过去几年里,人们几乎可以在互联网上完成所有事情。然而,大多数个人之间的在线交易,无论是电子邮件、金钱、音乐还是其他任何东西,都依赖于大型中介机构,如电子邮件服务、银行和电信运营商。这类集中式系统正面临着越来越多的问题。例如,我们的隐私受到侵犯;跨境汇款成本过高且耗时数天。
2008年,中本聪发表了论文《比特币:一种点对点电子现金系统》[1],情况由此开始改变。比特币的核心技术称为区块链,它展现了未来互联网中去中心化的能力,成为大规模分布式系统的新范式。如果说TCP/IP是计算机之间的通信协议,那么区块链就是其信任机制与协作协议。区块链提供了一些独特的能力/特性,如去中心化、可靠性和不可篡改性,使人们能够在不依赖可信第三方的情况下建立信任并进行交易。迄今为止,区块链已开始在许多有趣领域展现其潜力,例如跨境支付、分布式存储、食品溯源等。
在区块链能够被广泛应用于其他领域之前,仍有一些问题需要解决。首先,当前区块链的挖矿(PoW—工作量证明)机制在计算上浪费了大量的计算能力,这些计算对工作量证明是必要的,但却毫无实际意义且成本高昂。其次,网络中的每个节点都拥有完整的账本。随着时间的推移,账本会变得越来越大。当矿工验证一笔交易时,需要追溯区块链上记录的所有历史交易,性能问题日益严重。此外,尽管区块链是一种匿名系统,但所有交易都是公开的,这可能会引发隐私问题。最后,在当前的比特币网络中,常见的安全策略是等待六个区块来确认最后一个区块中的交易,耗时约一个小时,这极大地限制了当前区块链技术的采用和应用。针对这些问题,人们提出了许多想法,但仍处于开发阶段,例如 IOTA [19], EOS。
另一方面,目前大多数区块链系统都由电子货币驱动。例如,开源的以太坊,在创建智能合约时需要消耗一些以太坊区块链上的加密货币以太币。在进行某些测试和/或更新时,不仅成本高昂,还会对主区块链产生副作用和/或中断。因此,我们需要一种方法,能够在不同范围和大小的区块链网络中以较低的成本和对现有真实区块链网络较小的影响来测试新想法。仿真是一种很好的解决方案。它不需要花费太多,并且能够发现系统中的任何微小变化。
本文中,我们提出了一种仿真方法来研究大规模区块链网络。首先,我们确定了实现工作量证明协议的仿真软件的关键要求。其次,我们收集并定义了一系列性能指标,以量化区块链质量(QoB)。然后,我们使用一个简单的模拟工具展示了所提出的方法,通过不同配置复现简化的比特币工作量证明协议。
我们的案例研究表明,使用仿真软件研究大规模区块链网络是可行且实用的。
本文其余部分组织如下。第2节概述了比特币中的工作量证明协议并定义了一些区块链服务质量的指标。在第3节中,我们确定了区块链仿真器所需的功能和能力的关键标准。第3节展示了利用SimPy构建的一个简单的区块链仿真器。第4节介绍了一些相关工作。我们在第5节总结了本文。
2 区块链概述
2.1 区块链
本质上,区块链是一种点对点分布式账本数据库,由相互连接的数据块组成。区块之间的连接指针是通过密码学哈希函数处理得到的区块头哈希,用于保护每个区块中的交易以及相连的区块。因此,若要修改任何历史交易,必须使整个区块头哈希链失效。
在比特币系统中,大约每十分钟创建一个区块。比特币系统中发生的交易被保存在区块中。一个区块包含头部和主体,如图1所示。头部包含区块的元数据,例如版本、指向前一区块的前一区块、时间戳、随机数、难度位、默克尔根等。主体主要以默克尔树的结构包含交易的详细信息。这些交易在区块链系统中形成一个公共全球账本,任何能够访问互联网的人都可以查询账本中记录的交易。每笔交易都由发送方的数字签名进行签名,以确保其不可伪造且不被重复。包含所有交易的默克尔树通过哈希过程计算出唯一的默克尔根,并记录在头部。
区块通过挖矿过程创建,该过程是一种穷举的随机数算法。在此过程中,矿工将前一个区块的哈希值和最近十分钟内发生的所有交易打包,并找出一个随机数,用于计算一个256位的哈希值。挖矿过程的目标是找到满足某些要求的随机数值,例如使哈希值的前几位包含特定数量的零。成功找到该值的矿工,获得将新区块写入区块链的权利,方法是向其他比特币节点广播新区块以进行验证(图2)。
该系统设有矿工竞争记账权的机制,即工作量证明(在下一部分中描述)。在此过程中,矿工投入的计算能力越多,获得记账权的可能性就越大。如果新区块成功添加到区块链中,矿工将获得一定奖励。此外,也有可能两个不同的矿工几乎同时找到新区块。这两个区块可能会被比特币网络的某个子集验证并接受,从而形成分叉。在这种情况下,其他矿工需要选择区块数量更多(意味着工作量更重)的那条分叉。
2.2 比特币区块链中的工作量证明协议
20世纪80年代出现的分布式系统共识算法是区块链共识的基础。不同的区块链平台使用了多种拜占庭容错协议,例如PBFT(实用拜占庭容错)、Raft、PoW(工作量证明)、PoS(权益证明)、DPoS(委托权益证明)。比特币区块链使用PoW(图3)。
PoW的主要工作是在挖矿过程中进行大量的SHA256哈希计算。达成共识的过程如下所述。
通过上述挖矿过程,来自不同用户的交易被写入区块链中,而区块链由网络中的每个节点托管。因此,我们可以获得一个分布式、高可靠且一致的全局账本。
2.3 区块链网络的参数和服务质量指标
在本节中,我们收集并定义了一些用于区块链的服务质量指标。我们可以使用这些指标来定义和模拟一个区块链网络。在我们的模拟器中,忽略了孤块和网络延迟。这将在未来的研究中加以解决。
-
TBN(总区块数量)
:在特定时间段内已挖出的区块数量。
-
ABS(平均区块大小)
:以 MB 为单位的平均区块大小。
-
BCT(区块提交时间)
:自区块创建以来将其提交到主链所需的平均时间。
-
TPB(每区块交易数)
:每个区块中的平均交易数量。
-
ATS(平均交易大小)
:以字节为单位的平均交易大小。
-
TCT(交易确认时间)
:一笔交易被接受并写入已挖掘区块所需的平均时间。
-
TPD(每日交易数)
:每日确认的交易数量。
-
内存池大小(Mempool Size)
:等待确认的交易总数。
我们使用这些指标来衡量区块链系统的质量。TBN 与仿真时间直接相关。BCT 约等于挖矿时间的 6 倍。区块大小包括头部和一些交易,且受限于 1000000B(由比特币源代码定义)。ABS 是一个显示区块是否被填满的指标。一笔交易需要使用的存储空间是简单消息的 4 倍。在 2017年8月24日更新“隔离见证”后,额外的 3 倍存储不再计入区块大小,从而扩展了每区块交易数。交易大小范围和每秒交易数是我们希望更改以衡量性能的设置,统计后转化为 ATS 和 TPD。TCT 显示一笔交易被接受所需的时间,MS 显示交易的等待列表。
从系统角度来看,我们希望区块被填满(平均区块大小尽可能大,每区块交易数尽可能多),以便能够同时传输更多信息。从客户端角度来看,交易确认时间是最关键的区块链服务质量指标,即交易确认时间越短,区块链网络的效率越高。
3 区块链仿真要求
为了实现一个区块链模拟器,我们需要考虑以下几个要求,如下所示:
-
时间模拟
:区块链的规模随着时间增长。挖矿时间、交易时间和网络延迟对系统性能有很大影响。
-
广播
:在现实中,我们使用多播来实现IP通信。在仿真中,这表现为一种理想情况。因此我们需要广播所有交易。
-
事件驱动
:当挖矿过程中发生某些事件时,矿工可以改变其状态。模拟器应为事件驱动以适应这一模式。
-
消息处理
:一旦矿工发现一个新区块,该矿工会广播其区块,同时其他节点接收该新区块(作为消息打包),并做出自己的响应。因此软件应支持消息处理。
-
并发
:区块链网络由许多节点组成,这些节点同时进行不同但类似的操作(挖矿、验证、接收或发送消息)。因此也需要并发性。
4 案例研究——使用SimPy模拟区块链
在本节中,我们将演示如何利用SimPy的能力并结合上述标准来模拟一个简单的区块链工作量证明。
SimPy 是一个用 Python 编写的裸仿真 API 实现。在 SimPy 中,基本的仿真实体是进程。这些进程可以并行执行,并且能够相互交换 Python 对象。大多数进程包含一个无限循环,在该循环中执行进程的主要操作。该模拟器基于 python 3.6.0 下的 SimPy3.0.10 编写。
计算机参数
:
操作系统:Ubuntu 14.04 64位
CPU: Intel(R) Core(TM) i7‐7700 CPU@ 3.60 GHz
内存: 16G
考虑我们在第2.2节中提到的工作量证明过程,我们的模拟器使用三个进程运行:
生成交易
。如图5所示,我们随机创建一个具有大小和创建时间的交易,然后将其放入内存池中。
生成区块
。如图6所示,我们随机选择一个节点作为区块的矿工,然后随机设置其挖矿时间。接着计算可写入该区块的交易数量,打包所有这些交易信息并进行广播。如果该分支具有最大计算能力,则在六个区块之后确认该区块,并将其添加到区块链中(由于我们未考虑孤块的情况,因此无需比较,仅作确认)。
每个矿工都是一个进程
(图7):一旦矿工接收交易或区块,就会对其进行验证。该进程将区块添加到自身链的末尾,并在六个区块之前确认该区块。
为了清晰地观察内存池,我们设置了一个第四个进程(图8)专门用于记录。



在仿真过程中,我们可以更改多个参数(表1):
| SIM_TIME | 仿真运行的时间长度 | 24 h |
| NUN_OF_节点 | 仿真中的节点数量 | 512 |
| MINGING 时间_ | 区块可能被挖出的时间排名 | [8, 10]min |
| 区块大小 | 单个区块的有限大小 | 1000000B |
| 交易大小_ | 单笔交易可能的大小排名为 [100, 2000] B |
上述参数配置了模拟器的运行方式。在真实的比特币网络中,大多数这些参数都是被规定或限制的。我们可以更改这些参数,以了解其对比特币网络的影响。在此版本的模拟器中,我们忽略了网络延迟和孤块。
通过该模拟器,我们可以获取每个节点上关于区块链的一些重要信息。由于区块链的工作方式,每个节点获得的链相似但不完全相同。一旦考虑网络延迟,不同节点上的链可能会略有差异。在我们的案例中,唯一的差异是由区块创建者引起的提交时间。节点0在默认设置下创建的一个区块链如下所示。图9中的第一个示意图显示了网络中的前几个区块,包括主区块;第二个示意图显示了最新的区块,其中包含一些尚未被提交的区块。
我们进行了一些不同设置的仿真,结果如下。
在图10中,当日交易数量和区块大小保持不变时,只有当交易大小在100B到2000B之间时,交易才会使区块满。当交易较小时,一个区块可以记录更多的交易。一旦交易数量不足,区块就无法填满。在真实系统中,挖矿一个区块成本较高,因此我们希望它包含尽可能多的信息,但不要急于求成。
在图11(a)中,显示了一天内内存池大小保持在较低水平的详细情况。交易不需要等待很长时间即可被打包进区块。同样在图11(b)和(c)中,当每秒交易数发生变化时,内存池大小可能保持在较低水平,也可能直接升高。一旦内存池大小升高,系统将变得越来越冗余。就像图13所示,交易提交时间随时间推移而上升。在真实网络中,交易数量取决于不同事件,这些事件具有高峰期和低峰值,交易大小也是如此。在后续研究中,我们将测试在有限时间内网络处理大量交易的能力,以及网络应对堆积内存池的能力。
在图12中,节点数量对区块链性能影响较小。在我们的仿真过程中,节点数量最多可达20000。实际上,节点数量的增加会为系统提供更多的计算能力,可能导致挖矿时间缩短。一旦挖矿时间超出范围,系统将提高计算难度,最终使挖矿时间保持在限定范围内。在我们的仿真中,挖矿时间是随机化的并处于一定范围内。因此,节点数量的增加仅对内存造成一些压力。
在图10和图11(a)中,我们更改了相同的设置。但在图11(a)中表现良好,该图显示的是客户端的视图;而在图10中表现较差,该图显示的是矿工的视图。结果有所不同。
我们的仿真可以展示不同参数如何改变整个网络的行为。在未来的工作中,我们将进一步研究这些参数如何影响网络行为,以及如何找到一种最佳设置,使其在客户端和矿工端视图中均表现出良好的性能。

)

:内存池大小(变更交易大小)(b):内存池大小(每秒变更交易数)(c):内存池大小(每秒变更交易数量))

)
根据这些结果,我们可以得出以下观察结论:
- 我们的指标在区块链服务质量方面是有效的,能够清晰地了解区块链的性能。
- 一旦我们跳过挖矿部分并将挖矿时间设定在一个范围内,到目前为止,节点数量的增加不会影响我们的仿真。但在未来的研究中,这可能会导致节点产生孤块的可能性更高。
- 交易大小和每秒交易数的变化会体现在内存池大小上。随着内存池大小的增加,由于交易提交时间变长,用户体验将变得更差。
- 真实网络中的交易量存在高峰期和低峰值,因此我们需要适当规模的内存池大小来保持区块被充分填充并维持系统高效运行。既不能过大,也不能持续增长,而应保持在有限的范围内。
5 相关工作
Rajitha 等人 [2] 采用了架构性能建模方法,并使用 Weber 等人 [4] 提供的同一事件管理示例,来测量由区块链相关因素(如确认区块数量的配置和区块间隔时间)引起的延迟。他们的管理系统显示,对系统级中位响应时间的预测相对误差大多低于10%。该方法可用于基于区块链的系统的设计。他们的模型主要将 API 视为组件,因此忽略了区块链挖矿网络、节点通信或共识算法。他们将本地节点的资源与性能特征建模为一个组件。在我们的研究中,共识是关键点之一,无论是在网络视角还是用户视角下,都可能对性能产生重大影响。但他们的建模理念与基于组件的开发高度一致,并支持已构建模型和组件的复用。
Gobel 等人 [5] 基于 DESMO-J 模拟框架 [7] 开发了两个区块链仿真器。他们研究了在“自私挖矿”策略下通信延迟对比特币区块链的影响。首先,他们使用一个简化的马尔可夫模型,该模型跟踪包含少量不诚实(自私)矿工的不同状态,以证明区块隐藏策略(如自私挖矿)的使用,例如自私挖矿,其可能会导致孤块的增加。然后,他们使用空间泊松过程模型来研究Eyal和Sirer参数c的取值,以找出诚实矿工所挖区块的前一个区块也由诚实矿工挖出的比例。最后,他们利用离散事件仿真来研究比特币矿工网络的行为,其中包括在矿工之间存在通信延迟的网络中进行自私挖矿的行为。他们的研究发现,如果存在恶意矿工,无论是诚实矿工还是恶意矿工的性能都会变差,系统还可以通过监控孤块的产生来发现自私挖矿的行为。我们尚未提及自私矿工,可以在后续研究中加以考虑。
格雷瓦伊斯等人 [6] 提供了一个由NS2编写的完整比特币模拟器。他们引入了一种新颖的定量框架,用于分析工作量证明区块链的各种共识和网络参数对安全性和性能的影响。在该框架下,他们通过调整网络传播、不同区块大小、区块生成间隔、信息传播机制以及日食攻击影响等基本设置,找到了一些对抗或限制双重支付和自私挖矿的方法。在他们的框架下,能够在区块链网络中找到性能与安全性之间的平衡。与我们的模拟器相比,他们的模拟器功能较为完整,但在节点数量方面存在问题。所有简单节点的位置及其网络延迟都需要单独定义,并且还模拟了挖矿过程,消耗大量性能。当节点数量增加时,模拟器响应表现不佳。
戈斯瓦米 [8] 讨论了导致区块链 largely 不可扩展的因素。他们提供了一个用 Java 编写的模拟器。该研究深入探讨了区块链的可扩展性问题,并利用实时数据对多个区块链参数进行了比较分析。通过区块链仿真,深入研究了导致区块链 largely 不可扩展的因素。然后通过测量模拟器与实时场景之间的差异,探讨了可用于解决此限制的各种机制。他们的模拟器在单个客户端上模拟工作量证明工作,且不包含节点通信,虽然有效,但在与真实网络结合时遇到困难。
6 结论
本文中,我们收集并定义了一系列关键性能指标,以量化区块链质量(QoB)。我们还使用一个简单的模拟工具,在不同参数和观察条件下对简化的区块链工作量证明(PoW)协议进行仿真。结果展示了基本设置与区块链质量之间的关系。结果表明,使用仿真方法研究具有不同网络规模和协议的区块链网络是可行且实用的。我们下一步的工作是将可能导致孤块的网络延迟纳入考虑,并尝试其他共识机制,如委托权益证明(DPoS)、PBFT(Fabric)和Tangle(IOTA)。
