【NEM/Symbol技術勉強会】NEMTUSストレステストで大きく向上したSymbolの安定性

ローンチから約1ヶ月が経とうとしているSymbol。現在1500のノードと、それらに分散した8000のハーベスターによって安定した動作をしています。この優秀なブロックチェーンを生み出したのは、もちろんJaguar0625, gimre, BloddyRookieのコア開発者3氏ですが、日本の技術者も多く関わったブロックチェーンプロジェクトでもあります。

中でも、Symbolブロックチェーンの実用性能を客観的に評価したのが2回にわたるNEMTUSストレステストです。概要は本家のホームページにまとめられています(第一回第二回)が、私もMediumに英文レポートを掲載しました。かめたん氏による学生実習レポート(その1その2)を、日本語圏以外のひとたちにも知ってもらえるよう、英文でまとめたものです。今後、国や自治体、企業などが重要視するのは、カタログ性能ではなく、実用性能です。結局Symbolってどのくらい使えるの?という疑問に対して、私達の実用化プロジェクト「ShizuiNet」の観点から改めて評価しなおしてみましょう。

背景

ブロックチェーンは、分散型台帳と呼ばれる一種の情報記録システムです。今回は、Symbol/Mijin-Catapultブロックチェーン上で開発している、細胞流通・製造管理用ShizuiNetを用いて、これらのブロックチェーンを評価しました。

方法

ShizuiNetはブロックチェーンにトランザクションを送付するために、Raspberry Piを用いています。テストでは、ShizuiNetのトランザクションを一定の速度でブロックチェーンに送り込みました。個々のトランザクションに含まれるメッセージは以下のような内容で、日付と連続したバーコードデータを組み合わせたものです。これをモザイクとともに送付しました。

2021–01–28 13:34:18.18:NA0001605506:prod00002161

予め作成した12万件のトランザクションを1セットとして、Symbol 0.10.0.6, Symbol 0.10.0.7, テックビューロ社Mijin-Catapult Fushichoバージョン (Mijin-Catapult)の3つのブロックチェーンに投入しました。トランザクションの投入スピードは、Symbolに対しては1トランザクション/秒 (tps)。Mijin-Catapultに対しては0.8tpsでした。ノードからのレスポンスを、成功(SUCESS)とエラー(ERROR)に分類し、それぞれを時刻とともに集計しました。レスポンスが返ってこなかったトランザクションは孤立(Orphan)トランザクションとして処理しました。

結果

表に、今回の結果の概要をまとめました。

表. 各ブロックチェーンにトランザクションを送付した際の成功(SUCCESS)、エラー(ERROR)、孤立(Orphan)トランザクションの数と割合

まず、一番下のMijin-Catapultの結果です。他のトランザクション投入の無い状態でのブロックチェーンの性能を示しています。孤立トランザクションはなく、エラー率も1.4%と低い数値に収まりました。Symbolテストネットの無負荷時の性能も同程度でした(データ示さず)。これは、1年前の開発途中のFushichoバージョンを使ったMijin-Catapultでも、低負荷時ならばほとんど取りこぼしなく、データをブロックチェーンに書き込めたことを示しています。エラーの内訳は、すべてが処理の時間切れ(Deadline_Timeout)でした。このようなトランザクションの期限切れは、ノードとデバイス間の通信を処理しながら、一定時間ごとにブロックを承認生成するブロックチェーンでは避けられない種類のエラーであると思われます。また、このようなエラーは、トランザクションの再送により対処できます。

NEMTUSの第1回テストの際(Symbol 0.10.0.6)は、エラー率、孤立トランザクション率が大きく上昇し、ブロックチェーンに取り込まれたトランザクションは78%にとどまりました。このときの時系列ごとのエラー数を示したのが以下のグラフ(図1)です。ノードが返すエラーは大きく二種類に分類することができました。一つがキャッシュエラー(Cache_Full)、もうひとつが先にも触れた期限切れエラー(Deadline_Timeout)です。この二種類のエラーは、ブロックチェーンへの負荷と連動して特徴的な反応を示しました。

図1. 第1回NEMTUSストレステストの際に生じたSymbol v.0.10.0.6の10分あたりのエラーの種類と回数

NEMTUSストレステスト開始から、すぐに一過性の増加をしたのが緑で示すキャッシュエラーです。これは、Symbolの処理限界(6000トランザクション/ブロック, 200tps)を大幅に上回る大量のトランザクションがネットワーク上に蓄積し、各ノードが持つ未処理データの保持力を上回ったためと思われました。ShizuiNetは1tpsの一定の割合でトランザクションを投入していますので、10分あたりに換算すると600個になります。緑のグラフから、ピーク時にはそのほとんどがキャッシュエラーでノードに拒否されていることが分かります。

その後、複雑な内部トランザクションを内包したアグリゲートトランザクション(通称:Daoka-Cannon)が投入され、その直後に期限切れエラーが一過性に上昇しています。このあたりでノードの多くが同期できなくなりダウンしていました。われわれが実験に使った高性能なワークステーション(ibone73, 32-core dual Xeon processors and 64GB ECC memory)も、2日後にダウンしました。そして、この結果を受けて、コア開発者らが様々な検証をし、高負荷時におけるデータベースの挙動などに修正が加えられました。

開発者によって修正された新バージョンのSymbol v.0.10.0.7に対して、2回めのNEMTUSストレステストが実施されました。今回はDaoka-Cannonに加えて、その軽量版であるDaoka-Cannon-miniによるアグリゲートトランザクションの高密度・高頻度投入も実施されました。その結果を図2に示します。

図2. 第2回NEMTUSストレステストの際に生じたSymbol v.0.10.0.7の10分あたりのエラーの種類と回数

第1回の時と比較して、キャッシュ飽和エラーがまったく見られなくなりました。ブロックチェーンに取り込めるトランザクション量が増えたわけではないため、これはトランザクション処理効率が大きく向上したことを示しています。Symbolには、高頻度に連続して投入されるトランザクションよりも、低頻度のトランザクション(ShizuiNetのトランザクションはこちらに該当する)を優先してブロックに書き込む機能を持っており、それも有効に働いたと考えられました。前回、多くのノードに影響を与えたDaoka-cannonも、ほとんど影響を与える事なく、ストレステストの前後を通して、ブロックチェーンは非常に安定して動作しました。

考察

一般に、ブロックチェーンの性能は、カタログスペックで示される処理性能と、実際の運用を想定したストレステストで測る実用性能によって評価することができます。今回、NEMTUSによっておこなわれた、コミュニティーを広く巻き込んだストレステストは、実際の運用時に起こりうる極限状態を、ノードの多様性、トランザクションの種類の多さ、大きく変動するトランザクション密度などの複雑な環境の下で作り出すことに成功しました。特に第1回では、開発者側のストレステストのみでは充分に顕在化できなかった問題点を掘り起こしました。すぐに開発者によって改良がなおこなわれ、第2回のテストでは問題のすべてが解決し、本来Symbolが持っている性能が充分に発揮されました。ShizuiNetトランザクションは、Symbol 0.10.0.7においては、エラー率、処理に必要な時間ともに、大きく改善され、無負荷時とほぼ変わらないレベルで処理されました。

結論

Symbol 0.10.0.7は、さらに改良されたSymbol 0.10.0.8を経て、現在Symbol メインネット 1.0.0.0としてリリースされています。NEMTUSのコミュニティテストを通じて、実用環境における安定性を大きく向上させたSymbolは、エンタープライズ利用に充分に耐えるブロックチェーンになったと言えるでしょう。