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 を使っていきましょう!