Symbol SDK v2 と v3 の署名パフォーマンス比較

タグ
Symbol
公開日
June 21, 2023

Symbol SDK v2 と v3 の署名パフォーマンス比較

v2 と v3 では丸っと書き直されており、機能も削ぎ落とされて軽量な実装となりました。 その中でちょっと注目したいところが署名処理の Wasm 化です。

ここに Rust のコードがあり、内容はおおよそ署名ロジック部分とおもわれます。

なお、筆者は Wasm にも Rust にもさほど詳しくはないので、とりあえずJavaScriptをインタプリタが解釈するところからじゃなくて、バイナリ化されたコードを実行するから高速なんだな、 程度にしか理解してませんが多分それで十分でしょう。

v2 では crypto モジュールや TweetNaCl パッケージなどを用いた、PureJS実装で実現していたようです。

これらの違いがどれほどパフォーマンスに影響を与えるのか、検証してみました。

検証用コード

上記のリンク先で、検証に使用したコードをGitHubで公開しています。

Node.js 16 以上が入っていればお手軽にお試ししてもらえる程度のコードになってます。

コードの詳細については省きますので、興味があればリポジトリを参照してください。

実行結果

この検証コードを実行して結果について考察しました。 (Readmeより抜粋)

$ npm start

> start
> node index.mjs

AB00000000000000BFA1A00A781816CEEE7591B1CC426E0659207A30783619C1E7F1AA6E092C3BFC656B56D01807DC7DC2EE6BD43E9EB07EA1F14C118E7B48EF5FD95830E80B1E0D5A2190E23EDE16ADA9C0DF52E292C10BBC2277CD4B48BC25FC1BDFC68620FFD9000000000198544140420F0000000000485314A10400000098223AF34A98119217DC2427C6DE7F577A33D8242A2F54C30B0000000000000000476F6F64206C75636B21
AB00000000000000BFA1A00A781816CEEE7591B1CC426E0659207A30783619C1E7F1AA6E092C3BFC656B56D01807DC7DC2EE6BD43E9EB07EA1F14C118E7B48EF5FD95830E80B1E0D5A2190E23EDE16ADA9C0DF52E292C10BBC2277CD4B48BC25FC1BDFC68620FFD9000000000198544140420F0000000000485314A10400000098223AF34A98119217DC2427C6DE7F577A33D8242A2F54C30B0000000000000000476F6F64206C75636B21
{
  'number of Signing': 10000,
  'timeV2(ms)': 87269.98762500286,
  'timeV3(ms)': 2027.1041249930859,
  'V3 Faster than V2': 'x43'
}

出力の意味については次の通りです。

  • 'number of Signing': 署名を行ったトランザクションの数です。
  • 'timeV2(ms)': v2を使用した作成および署名に要した時間(ミリ秒)です。
  • 'timeV3(ms)': v3を使用した作成および署名に要した時間(ミリ秒)です。
  • 'V3 Faster than V2': v3がv2よりも処理が何倍速いかを表しています。

つまり「10,000回の転送トランザクション作成とその署名を繰り返した」場合の所要時間を計測しています。

結果としては v3 のほうが約「43倍」高速 でした。

しっかりと Wasm 化の効果が現れている感じですね。

考察

この検証では、前述の通り、「10,000回の転送トランザクション作成とその署名を繰り返した」処理のパフォーマンスを計測しました。

通常であれば、署名の回数はどのトランザクションでも1回ですし、ウォレットであればこのような処理はあまり効果は薄そうですが、 たくさんのユーザーを相手にしたサービスを作る場合は、大量のトランザクションへの署名が必要になるかもしれません。 そういった場合には地味に効いてくると思われます。

何にせよ、必要な処理が高速で終わることはエコにもつながることですので、 積極的に v3 SDK を使っていきましょう!