35 DBMS_BLOCKCHAIN_TABLE
35.1 DBMS_BLOCKCHAIN_TABLEの概要
ブロックチェーン表は、集中管理ブロックチェーン・アプリケーション向けに設計された追加専用の表です。
Oracleブロックチェーン表では、ピアは、データベースを信頼して改ざん防止元帳をメンテナンスするデータベース・ユーザーです。元帳は、アプリケーションによって定義および管理されるブロックチェーン表として実装されます。既存のアプリケーションで、新しいインフラストラクチャやプログラミング・モデルを必要とせずに不正から保護できます。トランザクションのスループットは標準の表よりも低くなりますが、ブロックチェーン表のパフォーマンスは、分散ブロックチェーンの場合よりも優れています。
DBMS_BLOCKCHAIN_TABLE
パッケージでは、次の操作を実行できます。
- ブロックチェーン表で、ブロックチェーン表に定義されている行保存期間を超える行を削除する
- 署名アルゴリズムに入力されたバイトを取得して、ブロックチェーン表に挿入した行に署名できるようにする
- 行の暗号化ハッシュに入力されたバイトを取得して、行のハッシュを確認できるようにする
- ブロックチェーン表のチェーンに行が追加された後に、ブロックチェーン表に挿入した行に署名する
- ブロックチェーン表の一部または全部の行のハッシュおよび署名をデータベースで検証する。
35.2 DBMS_BLOCKCHAIN_TABLEのセキュリティ・モデル
DBMS_BLOCKCHAIN_TABLE
パッケージは、SYS
によって所有され、データベース・インストールの一環としてインストールされます。このパッケージ内のルーチンは、実行者権限(現行のユーザーの権限)を使用して実行されます。したがって、ブロックチェーン表を選択する権限を持つユーザーは、その表の行コンテンツを検証できる必要があります。
ブロックチェーン表に対する削除権限を持つユーザーは、ブロックチェーン表に定義されている保存期間を超える行を削除できます。
ブロックチェーン表に行を挿入したユーザーは、その行がブロックチェーン表のチェーンに追加された後に、デジタル署名を行に追加できます。
35.3 DBMS_BLOCKCHAIN_TABLEサブプログラムの要約
DBMS_BLOCKCHAIN_TABLE
パッケージでは、DELETE_EXPIRED_ROWS
、GET_BYTES_FOR_ROW_HASH
、GET_BYTES_FOR_ROW_SIGNATURE
、SIGN_ROW
およびVERIFY_ROWS
の各サブプログラムを使用して様々なファンクションを実行します。
表35-1 DBMS_BLOCKCHAIN_TABLEパッケージのサブプログラム
サブプログラム | 説明 |
---|---|
DELETE_EXPIRED_ROWSプロシージャ | タイムスタンプが指定されている場合は、before_timestamp より前に作成された保存ウィンドウ外の行を削除します。それ以外の場合は、保存ウィンドウ外のすべての行を削除します。
|
GET_BYTES_FOR_ROW_HASHプロシージャ | 識別された特定の行のバイト(列位置順の一連の{meta-data-value} {column-data-value})を、その後にチェーン内の前の行のハッシュ(データ形式)を付けてサポートされているデータ形式でrow_data で戻します。
|
GET_BYTES_FOR_ROW_SIGNATUREプロシージャ | 戻されるバイトは、行ハッシュのバイトです。メタデータは含まれません。 |
SIGN_ROWプロシージャ | このプロシージャは、以前に挿入された行の行コンテンツに署名を提供するために現在のユーザーが使用できます。ブロックチェーン表に行を挿入したユーザーは、行に署名できる唯一のユーザーです。 |
VERIFY_ROWSプロシージャ | 適用可能なすべてのチェーンのすべての行の、LOW_TIMESTAMP からHIGH_TIMESTAMP の範囲で作成された行のHASH 列値の整合性を検証します。行の署名は、オプションとして検証できます。
|
35.3.1 DELETE_EXPIRED_ROWSプロシージャ
このプロシージャは、タイムスタンプが指定されている場合は、before_timestamp
を作成した保存ウィンドウ外の行を削除します。それ以外の場合は、保存ウィンドウ外のすべての行を削除します。削除された行の数は、number_of_rows_deleted
パラメータで戻されます。
構文
DBMS_BLOCKCHAIN_TABLE.DELETE_EXPIRED_ROWS( schema_name IN VARCHAR2, table_name IN VARCHAR2, before_timestamp IN TIMESTAMP WITH TIME ZONE DEFAULT NULL, number_of_rows_deleted OUT NUMBER);
パラメータ
表35-2 DELETE_EXPIRED_ROWSプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
スキーマの名前。 |
table_name |
ブロックチェーン表の名前。 |
before_timestamp |
プロシージャによって削除される行の範囲の終了時間(ブロックチェーン表に現在関連付けられている行保存期間の対象となります)。 これはオプションのパラメータです。デフォルト値は |
number_of_rows_deleted |
削除された行の数。 |
35.3.2 GET_BYTES_FOR_ROW_HASHプロシージャ
このプロシージャは、パラメータinstance_id
、chain_id
およびsequence_id
によって識別される行のハッシュ値を取得するためにデータベースがハッシュするcolumn_data
のバイト数を戻します。これらのバイトは、表の各列のメタデータとデータ・バイトを列位置の順に連結されたもので、その後にチェーン内の前の行のハッシュ値が付いています。
構文
DBMS_BLOCKCHAIN_TABLE.GET_BYTES_FOR_ROW_HASH( schema_name IN VARCHAR2, table_name IN VARCHAR2, instance_id IN NUMBER, chain_id IN NUMBER, sequence_id IN NUMBER, data_format IN NUMBER, row_data IN OUT BLOB);
パラメータ
表35-3 GET_BYTES_FOR_ROW_HASHプロシージャのパラメータ
パラメータ | 説明 |
---|---|
schema_name |
スキーマの名前。 |
table_name |
ブロックチェーン表の名前。 |
instance_id |
行を挿入したインスタンス。 有効な値は、 |
chain_id |
行を含むチェーン。各インスタンスに32個のチェーンがあり、0から31までの番号が付けられます。 |
sequence_id |
指定したチェーンでの行の位置。 |
data_format |
指定した行のハッシュのデータ・レイアウトのバージョン。このリリースでは、1 にする必要があります。
|
row_data |
指定されたデータ形式の指定した行のバイト。これを暗号化ハッシュ関数に入力すると行のハッシュ値を確認できます。BLOB 内のバイトはいずれも上書きされます。
|
使用上のノート
すべてのパラメータは必須入力パラメータです。
列のメタデータ・バイトは、行をハッシュするために使用されるブロックチェーン・アルゴリズム・バージョンをエンコードする20バイト、列の位置、列のデータ型、列値がNULL
かどうか、実際の列値の長さ(バイト)です。
列データ・バイトは、文字以外の列の場合、ディスク上の列値を表す実際のバイトです。文字の列の場合、値は特定の文字セットに正規化されます。CHAR
列およびNCHAR
列の場合は、空白のトリミングも実行されます。
一部のメタデータ・バイトは、将来使用するために予約されています。
35.3.3 GET_BYTES_FOR_ROW_SIGNATUREプロシージャ
ルーチンは、メタデータがない行のハッシュのバイトをrow_data
で戻します。他の列は、この行にも前の行にも含まれません。
構文
DBMS_BLOCKCHAIN_TABLE.GET_BYTES_FOR_ROW_SIGNATURE( schema_name IN VARCHAR2, table_name IN VARCHAR2, instance_id IN NUMBER, chain_id IN NUMBER, sequence_id IN NUMBER, data_format IN NUMBER, row_data IN OUT BLOB);
パラメータ
表35-4 GET_BYTES_FOR_ROW_SIGNATUREプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
スキーマの名前。 |
table_name |
ブロックチェーン表の名前。 |
instance_id |
行が挿入されたインスタンス。 有効な値は、 |
chain_id |
行が挿入されたチェーン。各インスタンスに32個のチェーンがあり、0から31までの番号が付けられます。 |
sequence_id |
チェーンでの行の位置。 |
data_format |
row_data 内のデータの書式。DB20cリリースでは、この値は1 にする必要があります。
|
row_data |
署名が必要な一連のバイト。 |
使用上のノート
すべてのパラメータは必須入力パラメータです。
35.3.4 SIGN_ROWプロシージャ
このプロシージャは、以前に挿入された行の行コンテンツに署名を提供するために現在のユーザーが使用できます。ブロックチェーン表に行を挿入したトランザクションは、SIGN_ROW
プロシージャがコールされる前にコミットしておく必要があります。
構文
DBMS_BLOCKCHAIN_TABLE.SIGN_ROW( schema_name IN VARCHAR2, table_name IN VARCHAR2, instance_id IN NUMBER, chain_id IN NUMBER, sequence_id IN NUMBER, hash IN RAW DEFAULT NULL, signature IN RAW, certificate_guid IN RAW, signature_algo IN NUMBER);
パラメータ
表35-5 SIGN_ROWプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
スキーマの名前。 |
table_name |
ブロックチェーン表の名前。 |
instance_id |
行が挿入されたインスタンス。 |
chain_id |
署名対象となる行を含むチェーン。各インスタンスに32個のチェーンがあり、0から31までの番号が付けられます。 |
sequence_id |
チェーンでの行の位置。 有効な値は、 |
hash |
non-NULL の場合は、署名対象となる行のハッシュの予測値。NULL の場合は、署名対象となる行のハッシュはチェックされません。
|
signature |
行に格納されているハッシュ値に対するユーザーのデジタル署名。 |
certificate_guid |
デジタル署名の検証に使用されるデータベースに格納された証明書の一意の識別子。 |
signature_algo |
デジタル署名の作成に使用されるアルゴリズム。アルゴリズムは、DBMS_BLOCKCHAIN_TABLE パッケージに定義されている次の定数のいずれかである必要があります。
|
ノート:
ブロックチェーン表の非表示列の詳細は、ブロックチェーン表の非表示列を参照してください使用上のノート
hash
を除いて、すべてのパラメータは必須入力パラメータです。- データベースで次のことが検証されます。
- 現在のユーザーの
obj#
が、user#
の非表示の列値と一致します(ユーザーが行を所有していることを確認します) - ユーザーはブロックチェーン表
'schema_name'.'table_name'
に対する挿入権限を持っています - ハッシュ(指定されている場合)が、行のハッシュ列コンテンツと一致します
'instance_id'
、'chain_id'
および'sequence_id'
で識別される特定の行のsignature
列の値はNULL
です- 検証が成功すると、行に署名値が格納されます。
- 現在のユーザーの
35.3.5 VERIFY_ROWSプロシージャ
適用可能なすべてのチェーンのすべての行の、low_timestamp
からhigh_timestamp
の範囲で作成された行のHASH
列値とオプションでSIGNATURE
列値の整合性を検証します。チェーンの整合性が損なわれている場合は、該当する例外がスローされます。
構文
DBMS_BLOCKCHAIN_TABLE.VERIFY_ROWS( schema_name IN VARCHAR2, table_name IN VARCHAR2, low_timestamp IN TIMESTAMP WITH TIME ZONE DEFAULT NULL, high_timestamp IN TIMESTAMP WITH TIME ZONE DEFAULT NULL, instance_id IN NUMBER DEFAULT NULL, chain_id IN NUMBER DEFAULT NULL, number_of_rows_verified OUT NUMBER, verify_signature IN BOOLEAN DEFAULT TRUE);
パラメータ
表35-6 VERIFY_ROWSプロシージャのパラメータ
パラメータ | 説明 |
---|---|
schema_name |
スキーマの名前。 |
table_name |
ブロックチェーン表の名前。 |
low_timestamp |
指定する場合は、行を検証するための時間範囲の下限。 デフォルト値は |
high_timestamp |
指定する場合は、行を検証するための時間範囲の上限。 デフォルト値は |
instance_id |
指定した場合、指定したインスタンスに挿入された行に行の検証が制限されます。 |
chain_id |
指定した場合、指定したチェーンの行に行の検証が制限されます。各インスタンスに32個のチェーンがあり、0から31までの番号が付けられます。 |
number_of_rows_verified |
検証する行数。 |
verify_signature |
デフォルト値は |
使用上のノート
- チェーン内の行を検証するための時間範囲内の最初の要素に対するハッシュは、その順序番号が
1
である場合のみ検証されます。 schema_name
およびtable_name
は必須入力パラメータです- その他の入力パラメータはすべてオプションですが、次の例外があります。
chain_id
を指定した場合は、instance_id
を指定する必要がありますinstance_id
の有効な値は1、2、…などです。instance_id
とchain_id
のいずれも指定されない場合は、*all*
チェーンを意味します。instance_id
のみが指定されている場合は、そのインスタンスの*all*
チェーンを意味します。両方を指定した場合は、組合せで指定された特定のチェーンを意味します。-
low_timestamp
とhigh_timestamp
の両方を指定する場合、high_timestamp
はlow_timestamp
より後である必要があります。low_timestamp
を指定しない場合、範囲は、ブロックチェーン内の最も古い行からhigh_timestamp
までです。high_timestamp
を指定しない場合、範囲は、low_timestamp
から表に最後に挿入された行のタイムスタンプまでです。