はじめに
こんにちは、いなたつ @inatatsu_csg です。
Symbolブロックチェーン上のトランザクションをWebアプリケーションから受け取り、署名を行いWebアプリケーションへと返却するブラウザ拡張機能SSS ExtensionやモバイルウォレットKeyStoneの開発や株式会社 OpeningLineでSymbolブロックチェーンを用いたWebアプリケーションの開発や、Symbolブロックチェーンを用いたアプリケーション開発に関する書籍 実践Symbol、Symbolブロックチェーンで作る実用アプリケーションの執筆などを行っています。
よくあるメタデータキー
KeyGeneratorのgenerateUInt64Key関数を使用して文字列から意味のあるキーを生成するのがよくある方法だと思います。この方法では、キー名からキーが導出できるため、何がどこに記録されているかが明確になるといったメリットがあります。しかし、履歴のような時系列のあるデータを記録する際には骨が折れます。
// 文字列からUInt64キーを生成
const certKey = metadataGenerateKey('CERT');
メリット:
「何のデータがどこにあるか」がコード上で明確(例:'CERT'なら証明書データ)。
特定の情報をピンポイントで取得・更新するのに向いている。
デメリット:
履歴のような、時系列で増えていくデータの管理には不向き。
連番管理するメタデータキー
時系列の保持や連続性のあるデータをメタデータとして管理したい場合、メタデータキーを連番管理するという方法を取ることもできるので紹介します。
KeyGeneratorを使わずに、bigintのキーを直接指定することで連番的に管理することができます。
const key0 = BigInt(0)
const key1 = BigInt(1)
const key2 = BigInt(2)
これにより、KeyGeneratorを使った際には難しかった、データの順序の管理が容易になります。
ユースケースとしては、トレーサビリティやバージョニング、DAOのガバナンス投票等の履歴管理などデータの並び順を重視するデータを扱う場合が挙げられるかと思います。
実践的なTips
単純な連番管理では、データの種類が増えた際に管理が難しくなることがあります。
レンジ(範囲)による分割
「1000〜1999はユーザープロフィール用」「2000〜2999は活動ログ用」といったように、カテゴリごとに番号の範囲を設定する。
ビットマスクによる階層化
上位ビットを「カテゴリID」、下位ビットを「連番」として使うことで、一つのキーの中に構造を持たせることができる。
動的な次番号の導出
アカウントに紐づくメタデータを事前に取得し、その個数を確認してから次の番号を決定することで、既存データとの衝突を避けることができる。
まとめ
基本的にはKeyGeneratorを用いたキー管理が有効ですが、「データの集積」や「順序」 が重要になるエンタープライズ用途では、より良いメタデータの管理ができる場合があります。
書籍『Symbolブロックチェーンで作る実用アプリケーション』のDAOアプリ構築の項ではこういった「メタデータの管理」や「マルチシグの利用方法」の実践例について詳しく解説しています。他にも、Ethereumとの連携など様々な内容が記載されている書籍になるので、ぜひお手にとって見てください!