機密トランザクションの概要

Oracle Blockchain Platform Digital Assets Editionは、Pedersenのコミットメントを使用してデータを安全に保ちます。

共有台帳に記録されたブロックチェーン・トランザクションは、すべての取引を透明にし、すべての参加者が検証できるようにすることで、信頼を築くことができます。しかし、この透明性は、ビジネス取引のプライバシーと機密性を維持しなければならない企業や金融機関による採用を妨げる重要なプライバシーの問題を生み出します。共有元帳へのアクセス権を持つオブザーバは、トランザクション金額および関連する勘定科目の残高を表示でき、個人、会社および金融機関の財務プライバシ・リスクが発生します。

Oracle Blockchain Platform Digital Assets Editionは機密トランザクションをサポートしており、Pedersenのコミットメントやその他の高度な暗号化を使用して機密情報を隠します。トランザクション金額や残高などの情報は、ネットワークの整合性を損なうことなく、または参加者がトランザクションの妥当性を検証する能力を損なうことなく非表示にされます。機密トランザクション機能は、プライバシーを確保すると同時に、ゼロナレッジ・プルーフ(ZKP)を使用して、情報開示なしで有効性を証明することもできます。

ゼロ知識証明

ZKPは、正直なプロヴァーが、追加情報を公開することなく、検証者に対して声明の真実を実証する暗号プロトコルです。不誠実なことわざは、偽りの言葉が真実であることを検証者に納得させることができない。ZKPは、請求の有効性を超えて機密データが明らかにされないことを保証します。ZKPは、値自体を明らかにすることなく、範囲内または特定の計算の結果であることを確認するなど、シークレット値の特定のプロパティを証明できるようにします。

Pedersenコミットメント

ゼロ知識証明は、コミットメント・スキームに依存します。コミットメント・スキームでは、誰かが特定の値にコミットしながら、他の値から隠すことができます。Oracle Blockchain Platform Digital Assets Editionでは、Pedersenコミットメントを使用します。Pedersenコミットメントでは、盲検要因と呼ばれるランダムな値と楕円曲線暗号を使用して、秘密性と不変性を確保します。Pedersenコミットメントは同型です。つまり、基礎となる値間の関係を維持しながら、コミットメントに対する加算や減算などの数学的操作の実行をサポートします。Pedersenコミットメントは、プライベート・トランザクション・プロトコル、セキュアなマルチパーティ計算および匿名資格証明システムで使用されます。

機密トランザクションの使用

機密トランザクション機能を有効にするには、トランザクション・リクエストでConfidential-Transactionヘッダーを使用します。

リクエストでConfidential-Transactionヘッダー・セットをtrueに送信すると、Oracle Blockchain PlatformのRESTプロキシによって一意の乱数(Pedersenコミットメントに必要なブラインド・ファクタ)が生成され、一時マップに渡されます。これは、入力を処理し、機密情報を状態データベースではなくプライベート・データ・コレクションに格納するためにチェーンコードによって使用されます。

トランザクション情報

トランザクション履歴を追跡できるように、すべてのトークン操作(アカウントの作成、ミント、転送、書込みなど)によってトランザクション・レコードが生成されます。トランザクション・データは、公開元帳(状態データベース)とプライベート・データ収集の2つの場所に格納されます。機密トランザクションでは、機密データは、トランザクションに関与する組織のプライベート・データ・コレクションにのみクリア・テキストで格納されます。次の表に、指定されたトランザクションIDのトランザクション値が格納される場所を示します。

Public Ledger (州データベース) プライベート・データ・コレクション
  • assetType
  • transaction_id
  • token_id
  • from_account_id
  • from_account_balance (暗号化)
  • from_account_onhold_balance (暗号化)
  • from_account_onhold_burn_balance (暗号化)
  • to_account_id
  • to_account_balance (暗号化)
  • to_account_onhold_balance (暗号化)
  • to_account_onhold_burn_balance (暗号化)
  • transaction_type
  • amount (暗号化)
  • timestamp
  • number_of_sub_transactions
  • holding_id
  • sub_transaction
  • sub_transaction_type
  • category
  • description
  • global_transaction_id
  • assetType
  • transaction_id
  • from_account_balance
  • from_account_onhold_balance
  • from_account_onhold_burn_balance
  • to_account_balance
  • to_account_onhold_balance
  • to_account_onhold_burn_balance
  • amount
  • blindingFactor
  • version

トークン・アカウント情報

同様に、トークン・アカウントに関する情報は、公開元帳およびプライベート・データ収集に格納されます。次の表に、指定されたトークン・アカウントIDのトランザクション値が格納される場所を示します。

Public Ledger (州データベース) プライベート・データ・コレクション
  • assetType
  • account_id
  • org_id
  • token_type
  • token_id
  • token_name
  • balance (暗号化)
  • onhold_balance (暗号化)
  • onhold_burn_balance (暗号化)
  • application_groups
  • bapAccountVersion
  • assetType
  • account_id
  • user_id
  • balance
  • onhold_balance
  • onhold_burn_balance
  • balanceBlindingFactor
  • onHoldBalanceBlindingFactor
  • onHoldBurnBalanceBlindingFactor
  • max_daily_amount
  • daily_amount
  • max_daily_transactions
  • daily_transactions
  • current_date
次のデータは、公開元帳に格納されます。
  • account_idキー。システム内のすべてのユーザーに対して一意です。通常は、orgId (MSP ID)およびuserId (ユーザー名または電子メール)のSHA-256ハッシュを他の接頭辞または接尾辞と組み合せたものです。
  • 公開元帳には、すべてのユーザーの勘定科目キーがすべて格納されます。ユーザーは、トークンごとに1つずつ、複数の代替トークン・アカウントを持つことができます。
  • トークンの詳細は、token_typetoken_idおよびtoken_nameフィールドに格納されます。
  • balanceおよびonhold_balanceフィールドには、プライベート・データ・コレクションに格納される残高の実際のテキスト値を表すPedersenコミットメント・ハッシュが保持されます。
次のデータは、プライベート・データ収集に格納されます。
  • 前述のaccount_idキー。
  • balanceおよびonhold_balanceフィールドには、これらの残高の実際のテキスト値が保持されます。
  • balance_blinding_factorおよびon_hold_balance_blinding_factorフィールドには、公開元帳に格納されているbalanceおよびonhold_balanceコミットメントの作成に使用されるランダム・キーが格納されます。
  • 日次トランザクションの詳細は、max_daily_amountdaily_amountmax_daily_transactionsdaily_transactionsおよびcurrent_dateフィールドに格納されます。

機密トランザクションによる一般的な操作

機密トランザクションの使用中にトークンをミント、転送、保留または書き込みする際のワークフローには、データの整合性を確保するための追加のステップが含まれます。

ミント・トークン

トークンをミントするには、minterロールを持つユーザーがissueTokens APIをコールします。
  1. 機密トランザクションの場合、issueTokensメソッドではtoken_id値が入力として取得され、一時マップで渡されるトークン数量とともにRESTプロキシから送信されるブラインド・ファクタも必要です。
  2. 検証後、Pedersenコミットメントは、ブラインドファクタとミントへのトークンの量から生成されます。
  3. 全体の数量は、公開元帳とプライベート・データ収集の両方で更新されます。公開元帳では、既存の残高を表すPedersenコミットメントは、ミント(発行)されたトークンの数量を表すPedersenコミットメントによって増加します。それに応じて、プライベート・データ収集に格納された残高の実際の値が増加します。
  4. ブラインド・ファクタも更新されるため、プライベート・データ収集の残高およびブラインド・ファクタをいつでも使用して、公開元帳に格納されている対応するコミットメントを検証できます。

組織内でのトークンの転送

組織内でトークンを転送するために、送信者はtransferTokens APIを呼び出します。
  1. 機密トランザクションの場合、transferTokensメソッドでは、入力としてtoken_idおよびオプション・パラメータを使用し、受信者のuserIdおよびorgId値とともにRESTプロキシから送信されるブラインド・ファクタと、一時マップで渡されるトークン数量も必要になります。
  2. 検証後、Pedersenコミットメントは、点滅係数および転送するトークンの数量から生成されます。
  3. 送信者のアカウント内のトークンの量が減少し、公開元帳とプライベート・データ収集の両方で、受信者のアカウントの数量が増加します。公開元帳では、送信者の既存の残高を表すPedersenコミットメントは、転送されるトークンの数量を表すPedersenコミットメントによって減少します。受け取り側の場合、残高は同じ方法で増加します。送信者の残高と受信者の残高の実際の値は、プライベート・データ収集で更新されます。
  4. ブラインド・ファクタも更新されるため、プライベート・データ収集の残高およびブラインド・ファクタをいつでも使用して、公開元帳に格納されている対応するコミットメントを検証できます。

組織間でのトークンの転送

組織間でトークンを転送するために、送信者はholdTokens APIをコールして転送量を抽出し、保留にします。
  1. 機密トランザクションの場合、holdTokensメソッドでは、token_idoperation_idおよびexpiration_time値が入力として取得され、notary_user_idnotary_org_idto_user_idおよびto_org_id値とともにRESTプロキシから送信されるブラインド・ファクタと、一時マップで渡されるトークン数量も必要です。
  2. 検証後、Pedersenコミットメントは、点滅係数および保持するトークンの数量から生成されます。
  3. ホールド・オブジェクトとセンダー・オブジェクトが作成されます。
  4. 残高コミットメント、実績残高およびトランザクション・オブジェクトは、両方の組織の公開元帳およびプライベート・データ収集に保存されます。これにより、すべての残高が適宜更新されます。

保有トークン

前述のように、保留操作は組織間でトークンを転送するために使用されます。保留操作では、保留、送信者および受信者オブジェクトを使用します。これは、公開元帳とプライベート・データ・コレクションの両方にデータを格納するトランザクションおよびトークン・アカウント・オブジェクトと同様です。保留操作は、同じ組織内の転送にも使用できます。この場合、送信者と受信者のオブジェクトは作成されず、Pedersenコミットメントを使用した通常のトークン・タクソノミ・フレームワーク操作として転送が発生します。次の表に、指定された保留トランザクションIDのトランザクション値が格納される場所を示します。

機密モードでは、組織間の転送には2つのプライベート・データ収集が含まれます。アカウント・キー/値ペアを変更するかわりに、借方の場合、保留操作中に送信者オブジェクトが作成され、貸方の場合、受信者オブジェクトが作成されます(executeHoldReceiver APIの実行時)。バランスは送信者オブジェクトに配置されます。クレジット金額は受取人オブジェクトに配置され、受取人に割り当てられます。デビット操作が完了すると、送信者オブジェクトは使用されなくなり、削除できます。同様に、残高が受け側オブジェクトから受取人のアカウントに移動した後、受け側オブジェクトを削除できます。

Public Ledger (州データベース) プライベート・データ・コレクション
  • operation_id
  • token_name
  • operation_type
  • status
  • assetType
  • holding_id
  • from_account_id
  • from_org_id
  • to_account_id
  • notary_account_id
  • token_id
  • quantity (暗号化)
  • time_to_expiration
  • sender_id
  • category
  • description
  • quantity
  • blinding_factor
  • assetType
  • holding_id

次の表に、組織間異動および保留について作成される送信者オブジェクトの情報を示します。

Public Ledger (州データベース) プライベート・データ・コレクション
  • assetType
  • sender_id
  • operation_id
  • account_id
  • transaction_id
  • quantity (暗号化)
  • version
  • assetType
  • sender_id
  • blindingFactor

次の表に、組織間異動および保留について作成される受領者オブジェクトの情報を示します。

Public Ledger (州データベース) プライベート・データ・コレクション
  • assetType
  • receiver_id
  • operation_id
  • account_id
  • transaction_id
  • quantity (暗号化)
  • version
  • assetType
  • receiver_id
  • blindingFactor
  1. 機密トランザクションの場合、holdTokensメソッドでは、入力としてtoken_idおよびオプション・パラメータを使用し、受信者のuserIdおよびorgId値とともにRESTプロキシから送信されるブラインド・ファクタと、一時マップで渡されるトークン数量も必要になります。
  2. 公証人による保留操作は、承認または否認する必要があります。
    • 公証人が保留操作を承認すると、数量は送信者および保留オブジェクトから借方記入され、トランザクション・オブジェクトが作成されます。受け側オブジェクトも作成され、数量は受け側オブジェクトにクレジットされます。
    • 公証人が保留を拒否すると、保留数量が送信者のアカウントに貸方記入され、トランザクション・オブジェクトが作成されます。
  3. 残高コミットメント、実績残高およびトランザクション・オブジェクトは、公開元帳およびプライベート・データ収集に保存され、それに応じてすべての残高が更新されます。

書き込みトークン

トークンを作成するために、Burnerロールを持つユーザーがburnTokens APIをコールします。
  1. 機密トランザクションの場合、burnTokensメソッドではtoken_id値が入力として取得され、一時マップで渡されるトークン数量とともにRESTプロキシから送信されるブラインド・ファクタも必要です。
  2. 検証後、Pedersenコミットメントは、点滅係数および燃焼するトークンの量から生成されます。
  3. 全体の数量は、公開元帳とプライベート・データ収集の両方で更新されます。公開元帳では、既存の残高を表すPedersenコミットメントは、書き込まれたトークンの数量を表すPedersenコミットメントによって減少します。プライベート・データ収集に格納されている残高の実際の値は、それに応じて減少します。
  4. ブラインド・ファクタも更新されるため、プライベート・データ収集の残高およびブラインド・ファクタをいつでも使用して、公開元帳に格納されている対応するコミットメントを検証できます。