Bitcoin SV 主网压力测试报告 @ 2019-04-18

4 月 18 日,在 Bitcoin SV 中文社区的倡导和支持下,我们对 BSV 主网(Mainnet)的每秒交易吞吐能力(TPS,Transaction Per Second)进行了第三次压力测试。

鉴于之前网络在持续 200 TPS、峰值 400 TPS 下毫无问题,本次测试将目标设在了 1000 TPS。测试发现,所有交易均被打包,没有丢失交易,也没有出现交易双花,但在 BSV 尚未部署平行验证代码的情况下,出现了区块重组,目前无法达到 1000 TPS。

测试工具及本文由 Monkeylord 和我共同完成。

背景

本次测试并未提前通知相关开发组和 nChain,属于突袭式压测,以便在没有准备情况下发现问题。

我们没有预期到在 1000 TPS 时出现的情况,对造成相关服务宕机带来的不便深表歉意。

第一次压测

初版压测工具调试测试。持续 20 TPS,未发现任何问题。

第二次压测

改进了压测工具,完全状态下的多实例测试。持续 200 TPS,未发现任何问题,且每次出块内存池均被清空。

随后尝试稳定到 400 TPS,但因为测试使用的 BSV 耗尽,仅持续数十秒,同样未发现任何问题。

其他

  • 服务器:32 核 64G VPS,位于新加坡
  • 压测工具单实例 Benchmark:6 ~ 10 TPS

过程详述

测试压力

  • 广播速度:1000 TPS
  • 交易总量:约 110 万

区块打包情况

《Bitcoin SV 区块重组事件始末》

相关服务情况

区块浏览器

  • Blockchair,在 TPS 达到 440 左右并持续一段时间后停止更新,随后 TPS 数据均为 0
  • WhatsOnChain,始终保持着较快的区块更新速度,对双方区块均进行了显示,但刷新缓慢
  • bsv.btc.com,未彻底宕机但响应和更新缓慢
  • bitdb,在大区块重组时服务崩溃

所有的区块浏览器均在 22:00 后陆续恢复正常。

交易所

火币在发生区块重组不久后宣布暂停 BSV 充提。

其他

Mempool 矿池反馈,其内网节点在同步内存池(交易)时亦出现较高延迟。

结果分析

区块重组与验证抖动

针对 ECDSA 签名进行的测试表明,个人电脑单核签名速度约为 300 ~ 400 TPS。节点采用的服务器在验证交易时,单核速度应当不超过此量级。

节点收到区块后会做区块合法性验证。本次测试过程中出现的大块中包含了 40 万笔交易,对节点的验证能力带来巨大挑战。若单核验证,其耗时应达数分钟,这构成了区块分叉的时间窗口。

在 578640 高度上,两个矿池分别打包了 35M 和 52M 的区块,随后各自有算力追随并发生两次区块重组。对于网络中的节点,每次重组意味着数十万交易需要被重新验证,下图是发生区块重组时内存池的情况。

Imgur

重组带来的抖动,让验证海量交易成为网络节点的主要压力,我们认为这是导致各类服务节点崩溃的主要原因。

验证交易的旧代码

目前网络中部署的 BSV 节点并未部署平行验证,大部分采用了继承自 BCH 的交易验证代码,该代码效率不高,且不能充分利用硬件设备的性能,也无法使用集群的方式验证。该验证方式源自 BTC,由于 BTC 仅需处理 1M 区块故对 BTC 不构成影响。

矿池节点验证交易能力不足,构成了本次压力测试的瓶颈。

在与矿池沟通后发现,挖矿节点之间连接良好,区块数据本身传播迅速,并无问题。

结论

在测试目标 1000 TPS 上,BSV 的主要瓶颈为交易验证速度不足。两次区块重组极大地加剧了这一问题,并导致了各类服务的短暂崩溃。

同时我们也看到,在目前的交易验证能力下,BSV 能够打出几十兆的区块,能够连续打出 100M 以上的区块,并在之前的测试中已经能够支撑持续 200 和峰值 400 的 TPS,具有十分优秀的吞吐能力和潜力。

期待 BSV 部署平行验证代码解决交易验证时的性能瓶颈,早日达到 1000 TPS 以上的网络吞吐能力。

其他

bitcoinsv.io 的消息,Bitcoin SV 客户端会在近期发布更新,优化陈旧代码,提升性能。

Imgur

Imgur
Imgur

本次测试的部分报道如下。

Imgur
Imgur
Imgur
Imgur
Imgur

补充一篇 Shadders 针对本次压测写的文章《On forks, orphans and reorgs》,很多讨论和质疑已有答案,建议仔细阅读

致谢

  • 感谢 Bitcoin SV 中文社区对测试的大力支持,提供帮助的人数众多恕我无法一一列举,包括但不限于思路分享、技术讨论和 BSV 捐赠
  • 感谢 AustEcon 维护的 bitsv 代码库
  • 感谢 bitdb 提供数据查询服务
  • 感谢 BitIndex 提供基础服务接口
  • 感谢 Monkeylord 实现的高性能交易广播接口