本文提供了混沌工程原理的工作知识,讨论了其在软件开发中的使用,并探讨了如何将其使用扩展到区块链开发。
本文的教程部分演示了如何使用ChaosETH框架来利用混沌工程来测试以太坊客户端。这种策略有助于在智能合约被网络成员广泛采用之前,发现合约中的缺陷(有时被称为 "暗债")。
什么是混沌工程?
混沌工程是在分布式系统上进行实验的做法,以使其对生产环境中可能出现的动荡情况具有弹性和更高的容错能力。这个概念很容易追溯到Netflix,在那里由Casey Rosenthal领导的团队被安排负责测试软件的可用性和系统的弹性。
混沌工程有五个高级原则来指导混沌工程师。遵循这些原则可以确保你正确地实践混沌工程:
- 设定一个描述目标系统稳态行为的假说
- 考虑真实世界的情况和事件
- 在生产环境中执行实验以建立对该环境的信心
- 由于分布式系统很复杂,所以要使实验自动连续运行
- 最小化爆炸半径,以防止实验影响客户。
正如你所看到的,这些原则与传统的测试技术非常不同。
为什么混沌工程在区块链开发中是有用的?
区块链技术是分布式账本技术的一个子集,用于构建分布式去中心化的应用程序。这种分布式状态是通过创建一个点对点的节点网络来实现的,这些节点实际上就是计算机。随着一个系统被更广泛地采用并连接到更多的计算机,其复杂性也会增加。
Cardano Quick News在Twitter上说:"如果你的电子邮件服务有一个bug,人们只会抱怨,没什么大不了的。但如果一个区块链有一个bug,人们可能会失去金钱。现在这很严重。安全和稳定是区块链最重要的东西。
如果你的电子邮件服务有一个错误,人们只会抱怨,没什么大不了的。但如果一个区块链有一个错误,人们可能会失去金钱。
由于过载的操作系统、内存管理的错误或网络分区,区块链上的故障和弱点可能通过客户端发生。只有在为其提供重要资源的操作系统上,才能部署以太坊客户端。
鉴于混沌工程很适合分布式系统,它可以在确保区块链上每个参与客户端的弹性方面发挥作用,例如以太坊网络。
以下是在设计实验将混沌工程原理注入区块链时需要注意的几点:
- 混沌工程实验应关注共识机制、网络、存储层、参与节点的识别和授权、智能合约、链上互动和治理等方面
- 实验可以在开发网和测试网进行,但之后必须在生产中进行。
- 在生产中进行实验时,尽量减少爆炸半径是很重要的,因为这些应用会涉及到钱。
- 对类似架构和已知漏洞的了解是在客户端应用上造成混乱的权宜之计
为什么是以太坊客户端?
这篇文章特别涉及将混沌工程纳入以太坊客户端应用程序。然而,需要注意的是,在Web3中注入混沌的概念适用于所有区块链的所有去中心化应用。
以太坊已经成为主要的去中心化平台的运营骨干,并且拥有:
- 比其他区块链有更高的采用率
- 非常活跃的开发者社区
- 一个容易获得的生产环境
- 与其他区块链相比,更加简单
为一个完整的以太坊客户端实施混沌测试
在实时Ethereum客户端上进行混沌测试的正确规划应包括以下内容:
- 全面了解将被测试的以太坊客户端的架构
- 规划要采用的系统模型
- 根据采用的以太坊客户端处理以下情况。
- 基于客户端不恰当的回退设置的调用
- 不正确设置的超时
- 弹性不足或已废弃的依赖关系
- 单一的故障点
- 级联故障
教程:使用Go-Ethereum客户端的混沌工程实验
在本教程中,我们将演示如何使用ChaosETH,一个衡量以太坊客户端在生产中的弹性的新框架,在Go-Ethereum(Geth)客户端上执行混乱工程实验。
ChaosETH
ChaosETH是由瑞典KTH皇家理工学院的张龙和同事创建的。ChaosETH被设计用来评估以太坊客户端的弹性,从而使以太坊区块链更加可靠。通过操作,ChaosETH。
- 监视以太坊客户端以确定其稳态行为
- 主动在客户端注入系统调用错误
- 监视错误注入的结果行为
- 将产生的行为与稳态行为进行比较
- 直接从生产中产生一个弹性报告
让我们开始吧!
第1步:创建开发环境
选择一个云服务提供商,在那里你将托管一个虚拟机,或者安装和配置Docker。创建一个运行Ubuntu操作系统的虚拟机实例,打开端口号30303。这是Ethereum客户端监听的默认端口。
第2步:构建并运行目标Ethereum客户端
接下来,抓取最新的稳定版本的以太坊客户端。让我们使用Geth客户端。
按照文档提供的安装步骤来构建客户端。混沌工程需要一些可观察性的功能,因此你需要在Geth文档支持的指标中添加选项来激活监控功能。
有许多方法来安装Geth客户端,这取决于你的操作系统或工具。在这篇文章中,我们将使用Docker,并在shell上运行该命令:
docker pull ethereum/client-go
# and running it with:\\
docker run -it -p 30303:30303 ethereum/client-go
第3步:创建一个Docker容器以实现可观察性
我们将在Geth客户端旁边使用InfluxDB,以启用监控功能。使用下面的命令:
docker run -p 8086:8086 -d --name influxdb -v influxdb:/var/lib/influxdb influxdb:1:8
现在,通过执行以下命令来配置InfluxDB容器:
docker exec -it influxdb bash
在容器内运行这个命令:
influx
接下来,在InfluxDB的外壳中执行这些命令:
CREATE DATABASE chaoseth
CREATE RETENTION POLICY "rp_chaoseth" ON "chaoseth" DURATION 999d REPLICATION 1 DEFAULT
CREATE USER geth WITH PASSWORD xxx WITH ALL PRIVILEGES
现在容器已经准备好了。你可以继续运行Geth客户端以及可观察性度量和其他选项。Geth提供了500多个不同的度量,我们可以从中选择。
客户端必须由根用户运行,即使是在以前的实验后重新启动时也是如此。因此,sudo ,对于系统调用监控和错误注入器是必要的。
考虑到实例的额外磁盘空间,数据目录必须作为一个选项在命令中指定。如果不这样做,它将被持久化到实例的操作系统驱动器中。
客户端的对等体需要一致的配置,所以我们将指定对等体的目标数量;我们将使用50 ,因为这是Geth客户端的默认最大对等体数量。
可观察性指标被包括在应用层面的监控中。
最后,你可以让Geth客户端在后台运行以释放终端,你可以把输出重定向到你喜欢的任何地方。
由此产生的命令将看起来像这样:
sudo nohup ./geth --datadir=/data/eth-data \\
--maxpeers 50 \\
--metrics --metrics.expensive \\
--metrics.influxdb --metrics.influxdb.database DB_NAME --metrics.influxdb.username geth --metrics.influxdb.password DB_PASS \\
>> geth.log 2>&1 &
第4步:同步客户端并观察指标
整个同步过程大约需要三天时间,可以在ethernodes.org/ 上监控状态。
有一个client_monitor.py 脚本,在部署后,观察同步完成后客户端的稳定状态的行为指标。下面的命令将把客户端监控器附加到进程中,同时把指标数据作为Prometheus中的一个端点在8000端口进行反馈。
nohup sudo ./client_monitor.py -p CLIENT_PID -m -i 15 --data-dir=CLIENT_DATA_DIR >/dev/null 2>&1 &
要从Prometheus刮取指标数据,在你的config 文件中包括以下脚本:
scrape_configs:
- job_name: 'client_monitoring'
static_configs:
- targets: ['172.17.0.1:8000']
另外,你可以通过创建一个Grafana仪表盘来可视化数据,像这样:./visualization/Grafana - Syscall Monitoring.json 文件。
原始实验中的稳态分析显示了在两个不同的监测时段捕获的数据指标。

总结
混沌工程和区块链技术都比较新,但它们的重要性已经被广泛采用所证明和验证。
在这篇文章中,我们提供了混沌工程原理的概述,介绍了ChaosEth框架,并展示了如何利用ChaosETH框架对GETH客户端进行复原力测试。
在以太坊客户端上实施混沌工程对于识别DApp或智能合约生命周期中可能发生的潜在故障至关重要。