35 DBMS_BLOCKCHAIN_TABLE

ブロックチェーン表は、集中管理ブロックチェーン・アプリケーション向けに設計された追加専用の表です。DBMS_BLOCKCHAIN_TABLEパッケージを使用すると、次のことができます。ブロックチェーン表に定義された行保存を超えるブロックチェーン表の行を削除します。行の暗号化ハッシュに入力されるバイトを取得して行のハッシュを検証できるようにします。行がブロックチェーン表に追加された後にブロックチェーン表に挿入した行に署名します。ブロックチェーン表の一部またはすべての行のハッシュをデータベースで検証します。ブロックチェーン表では、PEMエンコーディングではなく、DERエンコーディングのみがX.509証明書に対してサポートされます。

この章のトピックは、次のとおりです:

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_ROWSGET_BYTES_FOR_ROW_HASHGET_BYTES_FOR_ROW_SIGNATUREGET_SIGNED_BLOCKCHAIN_DIGEST_FOR_SELECTED_ROWSSIGN_ROWVERIFY_ROWSおよびVERIFY_TABLE_BLOCKCHAINの各サブプログラムを使用して様々なファンクションを実行します。

表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プロシージャ 戻されるバイトは、行ハッシュのバイトです。メタデータは含まれません。
GET_SIGNED_BLOCKCHAIN_DIGESTファンクション このファンクションは、スキーマ・ユーザーの証明書を使用して、指定されたブロックチェーン表に署名付きダイジェストを生成して戻します。signed_bytessigned_row_indexesおよびschema_certificate_guidも戻されます。
SIGN_ROWプロシージャ このプロシージャは、以前に挿入された行の行コンテンツに署名を提供するために現在のユーザーが使用できます。ブロックチェーン表に行を挿入したユーザーは、行に署名できる唯一のユーザーです。
VERIFY_ROWSプロシージャ 適用可能なすべてのチェーンのすべての行の、LOW_TIMESTAMPからHIGH_TIMESTAMPの範囲で作成された行のHASH列値の整合性を検証します。行の署名は、オプションとして検証できます。
VERIFY_TABLE_BLOCKCHAINプロシージャ このプロシージャは、作成時間がsigned_bytes_previousからの行作成時間の最小値とsigned_bytes_latestからの行作成時間の最大値の間にあるすべての行を検証し、正常に検証された行の数を戻します。

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プロシージャのパラメータ

パラメータ 説明

schema_name

スキーマの名前。
table_name ブロックチェーン表の名前。
before_timestamp

プロシージャによって削除される行の範囲の終了時間(ブロックチェーン表に現在関連付けられている行保存期間の対象となります)。

これはオプションのパラメータです。デフォルト値はNULLです。

number_of_rows_deleted 削除された行の数。

35.3.2 GET_BYTES_FOR_ROW_HASHプロシージャ

このプロシージャは、パラメータinstance_idchain_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

行を挿入したインスタンス。

有効な値は、12などです。

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プロシージャのパラメータ

パラメータ 説明

schema_name

スキーマの名前。
table_name ブロックチェーン表の名前。
instance_id

行が挿入されたインスタンス。

有効な値は、12などです。

chain_id

行が挿入されたチェーン。各インスタンスに32個のチェーンがあり、0から31までの番号が付けられます。

sequence_id チェーンでの行の位置。
data_format row_data内のデータの書式。DB20cリリースでは、この値は1にする必要があります。
row_data 署名が必要な一連のバイト。

使用上のノート

すべてのパラメータは必須入力パラメータです。

35.3.4 GET_SIGNED_BLOCKCHAIN_DIGESTファンクション

このファンクションは、データベース・ウォレットに格納されている表の所有者の秘密キーを使用して、指定されたブロックチェーン表に署名付きダイジェストを生成して戻します。signed_bytessigned_row_indexesおよびschema_certificate_guidも戻されます。

構文

DBMS_BLOCKCHAIN_TABLE.GET_SIGNED_BLOCKCHAIN_DIGEST(
   schema_name 		   IN      VARCHAR2,
   table_name 	           IN      VARCHAR2, 
   signed_bytes               IN OUT  BLOB,
   signed_rows_indexes        OUT     ORABCTAB_ROW_ARRAY_T,
   schema_certificate_guid    OUT     RAW,
   signature_algo             IN      NUMBER default SIGN_ALGO_DEFAULT)
  RETURN RAW;

パラメータ

表35-5 GET_SIGNED_BLOCKCHAIN_DIGESTファンクションのパラメータ

パラメータ 説明

schema_name

スキーマの名前。
table_name ブロックチェーン表の名前。
signed_bytes ヘッダーの後に行情報の配列が続くBLOB値。コール元は、このパラメータに空のBLOBを渡す必要があります。
signed_rows_indexes このパラメータでは、デジタル署名されたブロックチェーン内の行を指定します。
schema_certificate_guid データベースに格納されているブロックチェーン表所有者の証明書の一意の識別子で、デジタル署名を検証するために使用できます。
signature_algo アルゴリズムで使用する必要があるデジタル署名。パラメータは、SIGN_ALGO_RSA_SHA2_256SIGN_ALGO_RSA_SHA2_384SIGN_ALGO_RSA_SHA2_512のいずれかのパッケージ定数である必要があります。

使用上のノート

  • データベースでは、ブロックチェーン表の所有者のPKI秘密キーを使用してsigned_bytesの署名が計算されます。
  • ブロックチェーン表の所有者の証明書は、DBMS_USER_CERTS.ADD_CERTIFICATE()を使用してデータベースに追加する必要があります。
  • ブロックチェーン表の所有者のPKI秘密キーと証明書は、非コンテナ・データベース用の<WALLET_ROOT>/bctable/ディレクトリの下にあるウォレットに存在する必要があります。
  • ブロックチェーン表の所有者のPKI秘密キーと証明書は、コンテナ・データベース用の<WALLET_ROOT>/pdb_guid/bctable/ディレクトリの下にあるウォレットに存在する必要があります。
  • GET_SIGNED_BLOCKCHAIN_DIGESTファンクションで作成されたブロックチェーン表ダイジェストには、プラガブル・データベース固有の表情報が含まれます。このようなダイジェストは、そのダイジェストが作成されたプラガブル・データベースでのみ、およびそのダイジェストの作成に使用された表についてのみ使用できます。DBMS_BLOCKCHAIN_TABLE.VERIFY_TABLE_BLOCKCHAINの場合、これらの要件は、両方のブロックチェーン表ダイジェストが、同じブロックチェーン表について、現在のプラガブル・データベース内に生成されている必要があることを意味します。

ノート:

bctableサブディレクトリは、ウォレットを使用するデータベース・コンポーネントの名前です。ブロックチェーン表の名前ではありません。

35.3.5 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-6 SIGN_ROWプロシージャのパラメータ

パラメータ 説明

schema_name

スキーマの名前。
table_name ブロックチェーン表の名前。
instance_id 行が挿入されたインスタンス。
chain_id

署名対象となる行を含むチェーン。各インスタンスに32個のチェーンがあり、0から31までの番号が付けられます。

sequence_id

チェーンでの行の位置。

有効な値は、12などです。

hash non-NULLの場合は、署名対象となる行のハッシュの予測値。NULLの場合は、署名対象となる行のハッシュはチェックされません。
signature 行に格納されているハッシュ値に対するユーザーのデジタル署名。
certificate_guid デジタル署名の検証に使用されるデータベースに格納された証明書の一意の識別子。
signature_algo デジタル署名の作成に使用されるアルゴリズム。アルゴリズムは、DBMS_BLOCKCHAIN_TABLEパッケージに定義されている次の定数のいずれかである必要があります。
  • SIGN_ALGO_RSA_SHA2_256
  • SIGN_ALGO_RSA_SHA2_384
  • SIGN_ALGO_RSA_SHA2_512

ノート:

ブロックチェーン表の非表示列の詳細は、ブロックチェーン表の非表示列を参照してください

使用上のノート

  • hashを除いて、すべてのパラメータは必須入力パラメータです。
  • データベースで次のことが検証されます。
    • 現在のユーザーのobj#が、user#の非表示の列値と一致します(ユーザーが行を所有していることを確認します)
    • ユーザーはブロックチェーン表'schema_name'.'table_name'に対する挿入権限を持っています
    • ハッシュ(指定されている場合)が、行のハッシュ列コンテンツと一致します
    • 'instance_id''chain_id'および'sequence_id'で識別される特定の行のsignature列の値はNULLです
    • 検証が成功すると、行に署名値が格納されます。

35.3.6 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-7 VERIFY_ROWSプロシージャのパラメータ

パラメータ 説明
schema_name スキーマの名前。
table_name ブロックチェーン表の名前。
low_timestamp

指定する場合は、行を検証するための時間範囲の下限。

デフォルト値はNULLです。

high_timestamp

指定する場合は、行を検証するための時間範囲の上限。

デフォルト値はNULLです。

instance_id 指定した場合、指定したインスタンスに挿入された行に行の検証が制限されます。
chain_id 指定した場合、指定したチェーンの行に行の検証が制限されます。各インスタンスに32個のチェーンがあり、0から31までの番号が付けられます。
number_of_rows_verified 検証する行数。
verify_signature

verify_signatureTRUEの場合は、各行のハッシュと行の署名の両方が検証されます。verify_signatureFALSEの場合は、各行のハッシュのみが検証されます。

デフォルト値はTRUEです。

使用上のノート

  • チェーン内の行を検証するための時間範囲内の最初の要素に対するハッシュは、その順序番号が1である場合のみ検証されます。
  • schema_nameおよびtable_nameは必須入力パラメータです
  • その他の入力パラメータはすべてオプションですが、次の例外があります。
    • chain_idを指定した場合は、instance_idを指定する必要があります
    • instance_idの有効な値は1、2、…などです。
    • instance_idchain_idのいずれも指定されない場合は、*all*チェーンを意味します。instance_idのみが指定されている場合は、そのインスタンスの*all*チェーンを意味します。両方を指定した場合は、組合せで指定された特定のチェーンを意味します。
    • low_timestamphigh_timestampの両方を指定する場合、high_timestamplow_timestampより後である必要があります。

      low_timestampを指定しない場合、範囲は、ブロックチェーン内の最も古い行からhigh_timestampまでです。

      high_timestampを指定しない場合、範囲は、low_timestampから表に最後に挿入された行のタイムスタンプまでです。

35.3.7 VERIFY_TABLE_BLOCKCHAINプロシージャ

このプロシージャは、作成時間がsigned_bytes_previousからの行作成時間の最小値とsigned_bytes_latestからの行作成時間の最大値の間にあるすべての行を検証し、正常に検証された行の数を戻します。

構文

DBMS_BLOCKCHAIN_TABLE.VERIFY_TABLE_BLOCKCHAIN(
   signed_bytes_latest        IN    BLOB,
   signed_bytes_previous      IN    BLOB,
   number_of_rows_verified    OUT   NUMBER);

パラメータ

表35-8 VERIFY_TABLE_BLOCKCHAINプロシージャのパラメータ

パラメータ 説明

signed_bytes_latest

get_signed_blockchain_digestへのコールによって作成されたBLOB。
signed_bytes_previous signed_bytes_latest BLOBが作成される前にget_signed_blockchain_digestへのコールによって作成されたBLOB。
number_of_rows_verified 検証済のブロックチェーン表内の行数。

使用上のノート

signed_bytes_latestおよびsigned_bytes_previousのBLOBは、同じブロックチェーン表に関連付けられている必要があります。