機密支払の概要

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

ゼロ知識証明

ゼロ知識証明(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のトランザクション値が格納される場所を示します。

パブリック元帳(州データベース) プライベート・データ・コレクション
  • assetType
  • transaction_id
  • token_id
  • from_account_id
  • from_account_balance (encrypted)
  • from_account_onhold_balance (encrypted)
  • from_account_onhold_burn_balance (encrypted)
  • to_account_id
  • to_account_balance (encrypted)
  • to_account_onhold_balance: (encrypted)
  • to_account_onhold_burn_balance (encrypted)
  • 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のトランザクション値が格納される場所を示します。

パブリック元帳(州データベース) プライベート・データ・コレクション
  • 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コミットメントが、ミント(発行)されたトークンの量を表すPedersonコミットメントによって増加します。それに応じて、プライベート・データ・コレクションに格納されている残高の実際の値が増加します。
  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の実行時)。残高は送信者オブジェクトに配置されます。貸方金額は、受取人に割り当てられた受取人オブジェクトに配置されます。借方操作が完了すると、送信者オブジェクトは使用されなくなり、削除できます。同様に、残高が受信者オブジェクトから受信者のアカウントに移動すると、受信者オブジェクトを削除できます。

パブリック元帳(州データベース) プライベート・データ・コレクション
  • 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

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

パブリック元帳(州データベース) プライベート・データ・コレクション
  • assetType
  • sender_id
  • operation_id
  • account_id
  • transaction_id
  • quantity (暗号化)
  • version
  • assetType
  • sender_id
  • blindingFactor

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

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

燃焼トークン

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