# テーブル

# テーブルの機能

多くのデータベースソフトウェアのように、miyabiはワールドステートでのデータ管理にテーブルを利用します。miyabiは、全トランザクションの記録として全てのブロックを維持しながら、テーブル別にワールドステートを保管しています。各テーブルには、識別用の独自のテーブル名があります。テーブルの基礎構造は鍵と値のペアで、そこでの鍵は値を検索するための固有のものです。

各テーブルは、テーブル記述子を管理します。基本的なテーブル記述子が含むのはテーブル名、そしてステート・プルーフを生成し履歴を追跡する機能のための2つのブールオプションです。

バージョン2のmiyabiでは、テーブルはそれらが保管されている値に従って定義されています:バイナリテーブル、アセットテーブルはバイナリとデジタルのバリューを保管するために使われています。パーミッションドテーブルは、アクセス制御モデルの実装を要する特別なインターフェースです。エンティティテーブル、パーミッションドバイナリ、そしてパーミッションドアセットテーブルはこのインターフェースを実装しています。

# テーブル関連の権限

権限 テーブル 解説
Create Table 全テーブル テーブルを作成するための許可
Delete Table 全テーブル テーブルを削除するための許可
Asset Admin アセットテーブル 無効アドレスからどのアドレスにもアセットを生成するための許可
NFT Admin NFTテーブル どのアドレスにもNFTトークンを生成するための許可
Trusted アセットテーブル/NFTテーブル どのアドレスからもアセットを減らすための許可
Insert パーミッションドテーブル テーブルへ値を挿入するための許可
Update パーミッションドテーブル テーブルで値を更新するための許可
ACL パーミッションドテーブル テーブルのその他の許可を変更するための許可

# Binary Table(バイナリテーブル)

# 基本情報

バイナリテーブルは全てのテーブルの基礎です。バイナリテーブルでは、鍵と値の両方がバイナリ配列として保存されています。

フィールド 解説
Key 任意のbyte配列
Value 任意のbyte配列

バイナリテーブルを作るには、次のパラメータが必要です:

パラメータ タイプ 解説
Table Admin private Key テーブル作成トランザクションに許可を与えるための署名に利用
Table Name string テーブル固有の名称
Track bool 変更するテーブルの履歴を保持
Proofs bool ステートプルーフによって照合できる、エントリのプルーフ生成を許可

# Permissioned Binary Table(パーミッションドバイナリテーブル)

# 基本情報

パーミッションドバイナリテーブルは、バイナリテーブルへアクセス制御モデルを追加します。パーミッションドバイナリテーブルに保存されるデータはバイナリテーブルのものと同じで、作成には次のパラメータが必要です。

パラメータ タイプ 解説
Table Admin private Key テーブル作成トランザクションに許可を与えるための署名に利用
Table Name string テーブル固有の名称
Track bool 変更するテーブルの履歴を保持
Proofs bool ステートプルーフによって照合できる、エントリのプルーフ生成を許可
Table Owner public Key 挿入/更新/ACLの権限を持つアドレス
Read restricted bool 更新権限をもたないユーザーがテーブルを読み出し出来るか

# Permissioned Row Binary Table(パーミッションド行バイナリテーブル)

# 基本情報

パーミッションド行バイナリテーブルは、Value がパーミッションド列にラップされている特定のパーミッションドバイナリテーブルです。

フィールド 解説
Key 任意のbyte配列
Value パーミッションド列にラップされる任意のbyte配列

パーミッションド列とは、データの値をラップでき、値に対してオーナーとして公開鍵を指定できるラッパーのことです。パーミッションド列の値では、Value を更新するためにはその列のオーナーの署名か管理者の権限が必要になります。

# アセットテーブル

# 基本情報

アセットテーブルとは、デジタル通貨のようなアセット(資産)を記録するために設計されたテーブルです。アセットテーブルでは、鍵はアセットオーナーの公開鍵、値はアセット額となります。

フィールド 解説
Key アセットオーナーの公開鍵
Value アセットオーナーが所有するアセット額

アセットテーブルを作成するために必要なのは、次のパラメータです。

パラメータ タイプ 解説
Table Admin private Key テーブル作成トランザクションに許可を与えるための署名に利用
Table Name string テーブル固有の名称
Table Owner public Key アセット管理の権限を持つ
Rules validation Rule 理によって検証されるテーブルに対する制限
Trusted Address public Key 他アドレスから値を回収できる信頼されたアドレスで、検証ルールによって禁止にすることができる
Track bool 変更するテーブルの履歴を保持
Proofs bool ステートプルーフによって照合できる、エントリのプルーフ生成を許可

# 検証ルール

検証ルールとは、テーブルに定められた方針のことです。アセットテーブルにトランザクションがアクセスしようとする度、理はテーブルへのオペレーションが検証ルールに違反していないか確認します。この検証の制限に該当すると、そのトランザクションによる対象テーブルへの全ての変更は中断されます。

ルール 解説
合計値ゼロ(デフォルト) テーブル内の値全ての合計はゼロにならなければいけません。例:バランスシート
マイナス値なし(デフォルト) マイナス値があってはいけません。例:銀行口座預金
信頼された管理者を阻止(デフォルト) 任意アドレスからテーブルオーナーがアセットを移動するのを防ぎます
信頼された引き出しを阻止 信頼されたアドレスが任意のアドレスから自らのアドレスへアセットを移動するのを防ぎます

全てのテーブルの初期値は同じでゼロです。そのため「マイナス値なし」のルールを考慮して、テーブルオーナーのみが使用でき、任意アセットを他アドレスへ移動できる特別なアドレスとして void アドレスが使われます。 void アドレスは無限のアセットを算出できるため、ビットコインのマイニングシステムより機動的です。従って、テーブルオーナーのみがアセットを生成するためにこのアドレスを利用できます。

アセットテーブルでの基本的なオペレーションは、1つのアドレスから別のアドレスへアセットを移動することです。通常、1つのアドレスからのアセット移動にはそのアドレスの署名を要します。テーブルオーナーは、「信頼された管理書を阻止」が適用されていなければ、void アドレスから任意アドレスへ任意のアセットを移動することができます。信頼されたアドレスは、void アドレス以外の任意のアドレスからアセットを引き出すことができます。さらに、スマートコントラクトはそのインスタンスIDを使用してアセットテーブルを作成し、そのスマートコントラクトのみがこのテーブルへのエントリを変更できるようにできます。

「合計値ゼロ」ルールについては、理は都度のテーブル確認を行いません。このルールはを意味するため、理が確認するのは実装がより簡単なです。この状況では、全てのアドレスの絶対値はどのケースのvoid アドレスの絶対値とも同じになるべきです。

#

アセットテーブルを使用する簡単な例(図11)がこちらです:

  1. アセットテーブルを作成
  2. void アドレスからアセットを生成
  3. 別のアドレスへアセットを移動

「マイナス値なし」のルールが適用される場合、void アドレス以外の全てのアドレスはマイナス値を持つことができません。従って、テーブルオーナーはvoid アドレスからアセットを移動することでアセットを生成します。これにはアセット管理者の許可が必要になります。アセットの移動には、元のアドレスの署名が提供されているか、信頼されたアドレスがそのトランザクションに署名していなければいけません。「信頼された管理者を阻止」が適用されていない場合は、管理者署名でも任意アドレスからアセットを引き出すことが可能です。

example_of_asset_table
図11. アセットテーブル使用例

# パーミッションドアセットテーブル

# 基本情報

パーミッションドアセットテーブルは、アセットテーブルにアクセス制御モデルを追加します。テーブルオーナーは最初に全ての許可を得ることになります。パーミッションドアセットテーブルに保存されるデータはバイナリテーブルと同じで、作成には次のパラメータを要します。

パラメータ タイプ 解説
Table Admin private Key テーブル作成トランザクションに許可を与えるための署名に利用
Table Name string テーブル固有の名称
Table Owner public Key 挿入/更新/ACLの許可とアセットオーナーを持つアドレス
ルール validation Rule 理によって調べられることになるテーブルに対する制限
Trusted Address public Key 他アドレスから値を回収できる信頼されたアドレスで、検証ルールによって禁止にすることができる
Proofs bool ステートプルーフによって照合できる、エントリのプルーフ生成を許可
Track bool 変更するテーブルの履歴を保持
Read restricted bool 更新権限をもたないユーザーがテーブルを読み出し出来るか

パーミッションドアセットテーブルでは、それが制限付きで読み出される場合、アセットオーナーと更新権限をもつ管理者アドレスのみがその値を読むことができます。アセットの移動には、更新された管理者とアセットオーナー/信頼されたアドレス両方の署名が必要です。

# エンティティテーブル

# 基本情報

エンティティテーブルは、異なるエントリ間の関係を最適化し保存するための特定のパーミッションド行バイナリテーブルです。保存ルールとテーブル作成用コマンドは、パーミッションドバイナリテーブルのものと同じです。

エンティティテーブルは、ワールドステートにおける異なるエンティティ間のリンク作成をサポートします。このリンクは、次のような複雑な管理のためにデータを細かく分けるのに使うことができます:

  1. 任意に小さな許可を付与

パーミッションド行バイナリテーブルのように、各レコードにはオーナーがいます。エンティティテーブルは異なるレコードを管理するためのリンクを許可するため、ユーザーは1つのバイナリ値をいくつかのレコードへ分け、それらに異なるオーナーを付与できます。

  1. 特定列の履歴を保存

    ユーザーは1つのレコードの履歴を保存してそれらをリンクするのにレコードを使うこともできます。これは、ユーザーがより柔軟な履歴管理を行うことを可能にします。

  2. 列の一部分のみの更新を最適化

    データ更新の頻度に従い、1人のユーザーは異なるテーブルへデータを分割し、更新プロセスを管理するために異なる鍵を使用することができます。データの整合性はリンクによって保証されます。1つのリンクには2つの構成要素があります。

項目 解説
テーブル名と親レコードの鍵
タグ このコードをマークしたテキスト
1つのリンクが作られる時、そのリンクを保管するためmiyabiは2つの列を自動的に追加します。1つの列は子レコードの親レコードを保存し、もう1つの列は親レコードの子を保存します。自動的に作成されるこれらの列は、パーミッションドの列となります。子レコードのオーナーが、これらの列のオーナーとなります。

# エンティティテーブルのための権限

パーミッションドテーブルは、パーミッションド行テーブルとパーミッションドテーブルの両方からアクセス制御モデルを継承します。適用となるのは次のルールです:
オペレーション 必要な署名
レコードの更新 レコードのオーナーまたは更新管理者
レコードを挿入 挿入管理者
読み出し なし(制限なし)/更新管理者(制限付き読み出し)

# エンティティテーブルの例

図12はエンティティテーブルの構造の例を表しています。

example_of_entity_table
図12. エンティティテーブルの構造例

# NFT Table

# 基本情報

non-fungible token = 代替不可トークン(NFT)とは、特有のものを表す特殊なアセットです。miyabiでは、NFTをサポートするためにNFTモジュールを実装しています。基本的な構造は、トークンIDとそのオーナーのアドレスを保存するバイナリテーブルです。

フィールド 解説
Key NFTのトークンID
Value オーナーのアドレス

NFTテーブルを作成するには、次のパラメータが必要です。

パラメータ タイプ 解説
Table Admin private Key テーブル作成トランザクションに許可を与えるための署名に利用
Table Name string テーブル固有の名称
Table Owner public Key このテーブルに対してNFT管理者許可を保有するテーブルオーナー
Trusted Address public Key 他アドレスから値を回収できる信頼されたアドレスで、検証ルールによって禁止にすることができる
Track bool 変更するテーブルの履歴を保持
Proofs bool ステートプルーフによって照合できる、エントリのプルーフ生成を許可

NFTテーブルはERC-721をサポートし、アセットテーブルのように信頼されるアドレスとしてアドレス一式を提供します。NFT管理者のみがNFTを生成でき、トークンオーナー/信頼されるアドレスのみがトークンを移動できます。

現在、アドレスの残高は所有しているトークンの数です。 NFTテーブルは、テーブル内の各アドレスのバランスをキャッシュすることにより、1つのアドレスのバランスをチェックするための内部テーブル最適化を実装しています。