主页 > imtoken官网电话 > PerTether:通过故障注入对以太坊私有链进行性能测试

PerTether:通过故障注入对以太坊私有链进行性能测试

imtoken官网电话 2023-01-17 08:54:39

以太坊联盟和以太坊的关系_以太坊POW会不会重启_以太坊挖矿会越来越难吗

南京大学智能软件工程实验室

伊势实验室

概括

介绍基于故障注入的以太坊私有链性能测试工具PerTether。 PerTether 可以帮助以太坊开发者和用户测试以太坊的性能,并通过故障注入发现潜在的漏洞。 我们提出了两个影响以太坊性能的因素和四个可能影响稳定性的故障。 因此,我们在PerTether中实现了区块链部署、性能测试和故障注入。 测试任务完成后,将以图表形式提供测试结果。 实验结果表明:(1)PerTether 可以测量两个区块链指定的性能指标(即吞吐量和延迟); (2) 实验结果可以证明这两个因素和故障注入对性能的影响。

关键词

以太坊私链、性能测试、故障注入

介绍

区块链作为第一个可行的去中心化技术,近年来备受关注。 它为实施智能合约提供了必要的可信环境。 通过支持图灵完备的智能合约编程语言,以太坊已成为一个完善的区块链平台。 性能瓶颈是以太坊公链的一大难题,很难突破。 但是,用户可以使用以太坊客户端方便地构建自己的私有区块链和去中心化应用程序。 与其他区块链平台一样,以太坊依赖于一个关键但耗时的共识过程来确保交易数据的一致性,这在中心化的信用机构中往往没有被考虑到。 区块共识需要大量的计算和通信资源。 因此,在实际应用中,应慎重考虑并系统测试私有以太坊的性能。 然而,区块链作为一个不可更改的、可信的分布式系统,总是部署在不安全、不稳定的环境中,这可能会导致不可预测的故障。 因此,区块链的稳定性也是一个值得注意的地方。

Dinh 研究了传统私有区块链性能测试的方法。 他们专注于区块链特性(例如在去信任环境中的共识和智能合约执行)对区块链特定性能指标(例如吞吐量和延迟)的影响。 我们仔细研究了他们的工作,并深入了解了以太坊私有链。 具体来说,通过分析以太坊的共识协议和 Gas 机制,我们认识到可以影响以太坊性能的两个因素(即难度和 Gas 限制)。

然而,仅仅性能测试是不够的。 性能测试始终在不受外界干扰的测试环境中进行。 分布式系统总是面临不可预测的故障,这可能导致性能下降甚至整个系统崩溃。 区块链作为一个分布式系统,更容易遇到故障,不仅因为复杂的共识协议,还因为不稳定的部署环境。 因此,如果以太坊开发者或用户想要获得更接近真实场景的测试结果,就必须在性能测试中模拟可能出现的故障。 因此,我们提出了四种区块链可能发生的故障类型,并实现了PerTether,一个测试以太坊私有链性能和稳定性的工具。 针对以太坊区块链,PerTether根据配置实现自动部署、故障注入和测试任务执行。 测试报告包括以秒为单位的吞吐量和延迟。 此外,故障注入的影响将显示在报告中。

性能因素

在本节中,我们分析了可能影响性能的以太坊功能。 我们关注以太坊的 PoW 共识协议和 Gas 机制,并提出两个性能因素,难度和 Gas 限制。 在以太坊中,智能合约被编译成 EVM 字节码,每个字节码的执行都会消耗典型但固定数量的 Gas。 交易完成后,EVM 将计算本次交易的总 gas 消耗量。 每笔交易都设定了特定的汽油价格。 交易手续费将从交易发送方的账户余额中扣除,最终支付给矿工。 耗气量通常不被视为性能指标。 但Gas机制与区块大小有关,会间接影响交易延迟。 以太坊执行 PoW 共识协议。 以太坊矿工执行一种称为 Ethash 的算法来达成共识,这需要大量的计算能力和内存来挖掘新区块。 之后,所有对等方都应验证新开采的区块。 PoW 协议需要大量时间和资源才能达成共识。 因此,以太坊的交易处理能力有限,造成性能瓶颈。

以太坊POW会不会重启_以太坊挖矿会越来越难吗_以太坊联盟和以太坊的关系

影响因素

通过分析以太坊的上述特点,我们提出了两个性能因素。 这些因素只能在以太坊私有链的部署中配置。

困难。 难度越高,附加块所需的计算能力和间隔时间就越多。 事实证明,块生成间隔会影响性能。 较长的间隔意味着发送交易请求后需要更多的确认时间,从而导致延迟增加。

气体限制。 Gas limit 表示每个区块可以容纳的最大 Gas 量,它会影响区块大小。 每个区块打包的所有交易消耗的gas总和不能超过gas limit。 这限制了每个块中可以包含的交易数量。 由于添加区块需要一段时间,这个因素会影响以太坊私有链的性能。

表现

关于区块链,以下两个指标(吞吐量和延迟)通常用于性能测量。

吞吐量。 每秒返回的成功事务数。 吞吐量可以直观地反映区块链的交易处理能力。

延迟。 从交易开始到确认的时间间隔。 平均延迟反映了以太坊的交易处理能力。

以太坊的故障

在本节中,我们考虑私有以太坊区块链中可能出现的故障。 因此,我们分析传统分布式系统上的故障。 研究人员发现,分布式系统不可能一直保持稳定。 各种故障会影响稳定性和性能。 2016 年,Netflix 的工程师提出了一个名为“混沌工程”的概念,专门用于模拟分布式系统中的实际故障。 虽然区块链可以看作是一个分布式系统,但还是有很多区别。 例如,区块链中没有主从结构,所有对等节点处于同一级别; 每个节点拥有整个区块链数据,而不是其中的一部分。 区块链中没有负载均衡算法的实现。 所有交易都在所有对等节点上执行。 结合区块链与分布式系统的共性和差异,我们基于分布式系统中已知的故障来分析区块链的故障。 根据区块链的四个抽象层,我们从应用层、共识层、智能合约层和网络层四个角度总结故障。

应用

以太坊联盟和以太坊的关系_以太坊POW会不会重启_以太坊挖矿会越来越难吗

在这一层,我们从宏观的角度考虑以太坊私有链。 在以太坊区块链中,Dapp 是基于智能合约的 Web 应用程序。 当用户执行一些交易操作时,Dapp 会将交易发送给智能合约。 因此,如果多个用户同时访问 Dapp,区块链将满足高交易负载。 2017 年以太坊POW会不会重启,一款名为 CryptoKitties 的 Dapp 几乎让公共以太坊区块链瘫痪,近 20,000 笔交易因高请求率而被阻止。 因此,我们总结了一种故障,称为流量尖峰。 当出现流量高峰时,请求率会突然快速上升。

共识

在传统的分布式系统中,总是有一个中心化的节点控制着其他节点。 但是,区块链中的节点不是遵循单个主节点,而是遵循共识协议。 因此,不存在单点故障。 然而,这意味着每个节点在以太坊私有链中扮演着更重要的角色。 与传统分布式系统中的节点不同,区块链中的每个节点都包含整个区块链数据并执行所有交易。 另外,以太坊的共识协议是PoW。 该协议需要大量的计算能力,这在私有区块链中是有限的。 如果矿工节点发生故障,区块生成能力可能会降低。 因此,我们在共识层提出节点故障。

智能合约

以太坊支持智能合约,允许用户在区块链上部署和执行他们的代码。 尽管有针对智能合约的有效测试套件,但它们的质量仍然不受控制。 未经优化的智能合约包含大量不必要或不安全的字节码,这些字节码会影响性能并消耗更多气体。 由于区块链中的所有节点都会执行代码,因此影响会被放大。 Dinh 指出,智能合约可能会影响区块链的性能。 因此,没有充分优化的智能合约可以被认为是故障。

互联网

与区块链不同,传统的分布式系统总是部署在稳定的环境中,比如局域网。 安全性和不变性是区块链的两个关键特征。 在大多数情况下,区块链技术用于不稳定的环境,区块链必须面对网络故障。 有时,节点部署在不同的物理区域,这增加了网络故障的可能性。 高延迟和丢包会影响节点之间的通信。 由于去中心化,节点之间的通信比传统的分布式系统更多,这放大了网络故障的影响。 因此,我们提出网络层的高延迟和丢包。

工具介绍 用户场景

PerTether 是一款基于故障注入的以太坊私有链性能测试工具。 传统的性能测试工具通过向系统发送大量请求来模拟真实世界的交易量。 不同于传统的线路测试工具,PerTether引入了故障注入的概念。 区块链系统往往不会部署在稳定可信的环境中,因为区块链技术出现的契机在于它可以在不安全的环境中正常运行。 而且这种环境往往更容易出现故障。

通过引入故障注入,用户可以通过故障注入在测试环境中模拟真实场景中的故障。 这种方法可以帮助以太坊开发人员进行充分的测试,以在发布前检测潜在的性能故障。 此外,以太坊私有链的用户也可以通过故障注入测试提前发现可能出现的问题场景,从而避免在真实部署的区块链上出现类似问题。

科技创新

以太坊联盟和以太坊的关系_以太坊挖矿会越来越难吗_以太坊POW会不会重启

PerTether采用Docker技术,通过简单的配置自动完成区块链的启动和初始化。 并根据测试需求部署所需的智能合约。同时,为了模拟真实场景,该工具会启动多线程异步调用接口,保证区块链中每个节点的请求数量相似,从而模拟真实场景下以太坊私有链多个节点的并发请求率

区块链故障种类繁多、复杂,在去中心化的区块链上实现故障注入难度更大。 区块链是一个拥有大量节点的分布式系统,故障类型不同于传统的分布式系统。 我们根据区块链的特点,对故障类型进行了重新分类,并定义了相应的故障。 同时,为了更好的体现区块链故障对系统的影响,我们还划分了故障级别。 不同类型的故障级别对区块链的性能和稳定性有不同的影响。 经过反复实验,我们为每个故障定义了3个类。

由于区块链出块的随机性,交易的吞吐量和延迟随时间变化很大,给故障注入和故障恢复前后的对比分析带来困难。 通过对数据结构进行多次处理,我们得到了更加清晰的图,能够更好的反映故障的影响。

在现实场景中的区块链系统中,可能同时出现多种故障,也可能一种故障引发其他故障。 单一的故障注入不能很好地覆盖真实环境中的复杂情况。 因此,我们意识到了多次故障注入的可能性。 探索以太坊私有链性能的配置。

PerTether 是第一个将故障注入与区块链相结合的工具。 它对区块链中可能的故障类型的覆盖范围有限。 未来可能会提出新的故障类型,或者接入新的区块链系统。 在这方面,我们已经实现了扩展新故障和支持其他区块链系统的良好可扩展性。

工具实现

由于对异步操作的良好支持,PerTether 主要使用 JavaScript 实现。 图 1 说明了 PerTether 的测试过程。 首先,PerTether 使用测试配置构建测试区块链,包括创世块、docker 配置等。然后以太坊POW会不会重启,PerTether 部署智能合约。 同时,故障控制器初始化故障。 对于每个以太坊客户端,PerTether 都会分叉一个线程并向客户端发送请求。 当预设时间到来时,PerTether 将注入故障。 最后,PerTether 收集测试结果并生成性能报告。 最终结果以秒为单位包含测试区块链的性能指标。 根据测试任务的进展,PerTether的结构可以分为以下三层。

以太坊联盟和以太坊的关系_以太坊POW会不会重启_以太坊挖矿会越来越难吗

图 1 PerTether 架构

配置层

配置层启用以太坊测试区块链的自动部署。 我们选择 Geth 作为测试客户端。 据 Hyperledger Caliper 介绍,该工具使用 docker 构建测试区块链进行性能测试。 此外,在 PerTether 中,所有以太坊客户端都是通过 docker 启动的。 首先,PerTether根据配置(包括Difficulty、Gas limit)生成创世块JSON文件。 测试账户也应该在 JSON 文件中初始化,其中每个账户的余额初始化为 1000 Ether。 之后,PerTether 启动客户端节点,将它们附加到引导节点以确保节点可以相互联系。 接下来,进行区块挖掘。 docker客户端启动后,矿工节点开始挖矿。 PerTether用户可以修改docker-compose配置,设置矿工节点和非矿工节点的数量。 最后,PerTether 将智能合约部署到区块链上。 我们选择 HelloWorld 智能合约作为我们的常规工作负载。 HelloWorld 是一个简单的智能合约,具有单一的字段存储功能。 虽然 HelloWorld 无法模拟以太坊私有链上的真实工作负载,但由于其资源利用率低,它可以更好地反映故障的影响。 测试任务完成后,PerTether 将停止区块链。

以太坊联盟和以太坊的关系_以太坊POW会不会重启_以太坊挖矿会越来越难吗

事务层

事务层主要由两个组件组成,工作负载生成和事务控制器。

工作负载生成。 PerTether 依靠已部署的智能合约来生成工作负载。 工作负载包括交易发起账户、目标智能合约和函数调用参数。 函数调用的参数是随机生成的。 此外,用户可以通过覆盖脚本来定义参数。 之后,我们将带有工作负载的交易请求发送到智能合约。

事务控制器。 事务控制器用于控制事务请求率。 用户可以设置请求速率和持续时间。 PerTether 启动一组线程,每个线程向某个客户端节点发送请求,并使用以太坊 JSON-RPC API 获取交易信息。 交易确认后,调用回调函数记录交易详情。 如果事务返回失败或超时,我们将其记录为未完成。 测试完成后,将收集每笔交易的起止时间和确认状态。 最后,PerTether 将以秒为单位计算吞吐量和延迟。

故障注入层

故障注入层主要由一个故障控制器和四个故障实现组成。

控制器故障。 当性能测试任务启动时,故障控制器会分析故障配置并对故障进行初始化。 配置包括故障类型、开始时间和持续时间。 因此,PerTether 启动一个计时器,并在开始时间触发故障注入事件。 持续时间过后,故障控制器将取消注入的故障并恢复区块链。

故障注入实现。 PerTether 完全实现了四个失败。 对于每次失败,我们都实施注入方法和恢复方法。 此外,我们定义故障级别(共识故障没有级别,因为它只有两种状态)来模拟故障严重性。

应用。 为了模拟流量高峰,PerTether 向线程发送消息以提高请求率。 随着故障级别的增加,故障率将增加0.25、0.50、1.00。

共识。 为了模拟节点故障,我们使用 NodeJS docker API 来控制以太坊客户端容器。 当注入和取消失败时,PerTether 停止并运行指定的容器。 没有针对此失败的类。

智能合约。 我们实施了智能合约来模拟不完美的合约。 当用户向这个智能合约发送交易时,它会循环读取和写入,这会花费大量的执行时间和精力。 我们在合约中定义了三种方法。 这些方法具有与故障级别相对应的递增循环计数。

以太坊挖矿会越来越难吗_以太坊POW会不会重启_以太坊联盟和以太坊的关系

互联网。 为了实现高延迟和丢包,我们引入了一个名为 pumba 的第三方工具。 这个工具是专门为docker中的网络故障注入而设计的。 在 PerTether 中,我们通过执行 pumba 命令来实现网络故障。 三个级别分别对应30%、60%、90%丢包率或1000ms、4000ms、9000ms延迟。

实验评价

我们对实验的性能测试是在具有 8 个 CPU 内核和 32GB 内存的服务器上运行的。 在每个实验中,我们使用 Docker 镜像 ethereum/client-go:alltools-v1.8.26 启动 4 个 Geth 节点(其中 2 个是矿工)。 首先,设定了一系列的难度和gas limits。 我们将请求速率从 4tx/s 提高到 256tx/s。 然后我们以 32tx/s 的固定请求速率在区块链上进行了四次故障注入实验。 为了获得可靠的结果,每个配置都执行了 5 次以上。 具有相同配置的结果具有相似的趋势。

以太坊挖矿会越来越难吗_以太坊联盟和以太坊的关系_以太坊POW会不会重启

图2 不同Difficulty和Gas limit的吞吐量和延迟

图 2 显示了选择以下难度(即 0 和 1048575)和气体限制(即 2356194 和 4712388)时的吞吐量和延迟。 在请求率上升的过程中,区块链首先达到峰值吞吐量,然后一路下降到零。 与此同时,延迟继续上升。 更高的难度和更低的 Gas 限制将导致更低的峰值吞吐量和更高的延迟。 结果表明,Difficulty 和 Gas limit 确实可以影响区块链的性能。

以太坊联盟和以太坊的关系_以太坊挖矿会越来越难吗_以太坊POW会不会重启

以太坊联盟和以太坊的关系_以太坊POW会不会重启_以太坊挖矿会越来越难吗

以太坊POW会不会重启_以太坊联盟和以太坊的关系_以太坊挖矿会越来越难吗

图3 应用、共识、智能合约和网络故障的实验结果

图 3 显示了执行故障注入时的吞吐量和延迟。 由于块生成的随机性,生成的数据具有相对较大的振幅抖动。 结果表明,这四种故障确实影响了以太坊私有链的性能和稳定性。 同时,性能会随着故障级别的上升而下降。 此外,我们还可以发现几个值得注意的点。 在应用程序和智能合约故障中,随着故障级别的上升,吞吐量降为零,并且在故障取消后几乎没有恢复。 如果发生网络故障,吞吐量会在故障排除后立即增加。 在共识失败的情况下,延迟会增加但吞吐量不会减少。 出现这种现象的原因是当一个矿工节点出现故障时,另一个矿工将没有竞争。 矿工开采的所有区块都将被接受到区块链中。 但是计算能力的降低仍然会导致延迟增加。

谢谢你

本文由南京大学软件学院2018级硕士王新宇翻译。

感谢国家自然科学基金(61932012、61802171、61772014)的支持!