Pedersenコミットメント値の検証
Oracle Blockchain Platform Digital Assets Editionでは、Pedersenのコミットメントを使用して、秘密性と不変性を確保しています。次のAPIは、実際のRAWテキスト値に対するPedersenコミットメントの検証に役立ちます。
Oracle Blockchain Platformでは、Oracle Databaseに接続することで、データをリッチ履歴データベースに永続化できます。状態データベースにキー/値のペアとして格納される勘定科目およびトランザクションは、リッチ履歴データベースで時間の経過とともに追跡できます。機密モードでは、アカウントとトランザクションの両方がプライベートとパブリックという2つの部分にリッチ履歴データベースの履歴表に格納されます。
組織のパブリック・データとプライベート・データの両方が、リッチ履歴データベースの履歴表で使用可能です。表名は次の形式を使用します: <obp_instance_name>_<channel_name>_hist。たとえば、CentralBank_default_histです。
- パブリック・アカウント・データ(状態データベース)
-
- チェーンコードID: <chaincode_name>に格納されます。
- すべてのネットワーク参加者がアクセス可能
org_id、token_name、balance/onhold_balance(Pedersenコミットメントとして)、その他の非機密メタデータなどの一般的なアカウント・プロパティ
- プライベートアカウントデータ(プライベートデータ収集)
-
- チェーンコードID: <chaincode_name>
$$_implicit_org_<Oracle_Blockchain_Platform_instance_name>に格納 - プライベート・データ収集を所有する組織にのみアクセス可能
balance/onhold_balance(RAW値)、balanceBlindingFactor、onHoldBalanceBlindingFactor、日次制限などの機密フィールド
- チェーンコードID: <chaincode_name>
- パブリック・トランザクション・データ(状態データベース)
-
- チェーンコードID: <chaincode_name>に格納されます。
- すべてのネットワーク参加者がアクセス可能
- 送信者と受信者のアカウントID、
from_account_balance/from_account_onhold_balance/to_account_balance/to_account_onhold_balance/トランザクション量(Pedersenコミットメントとして)、その他の非機密メタデータなどの一般的なアカウント・プロパティ
- プライベート トランザクション データ収集(プライベート データ収集)
-
- チェーンコードID: <chaincode_name>
$$_implicit_org_<Oracle_Blockchain_Platform_instance_name>に格納 - プライベート・データ収集を所有する組織にのみアクセス可能
from_account_balance/from_account_onhold_balance/to_account_balance/to_account_onhold_balance/トランザクション量(RAW値)などの機密フィールド、および対応するブラインド・ファクタ
- チェーンコードID: <chaincode_name>
Pedersen Commitment API
チェーンコードのコントローラ・ファイルに含まれている次のAPIを使用して、Pedersenコミットメントを確認および操作できます。
-
generateCommitment - このメソッドにより、指定された値およびブラインド・ファクタのPedersenコミットメントが生成されます。このメソッドは、
Token AdminまたはOrg Adminのみがコールできます。 -
addCommitment - このメソッドは、指定された2つのPedersenコミットメント・ハッシュ値を追加します。Pedersenコミットメントは同型であるため、基礎となる値間の関係を維持しながら、コミットメントに対する加算や減算などの数学的操作の実行をサポートします。このメソッドは、
Token AdminまたはOrg Adminのみがコールできます。 -
subCommitment - このメソッドは、2番目に指定されたPedersenコミットメント・ハッシュ値を1つ目から減算します。Pedersenコミットメントは同型であるため、基礎となる値間の関係を維持しながら、コミットメントに対する加算や減算などの数学的操作の実行をサポートします。このメソッドは、
Token AdminまたはOrg Adminのみがコールできます。
口座残高と保留残高の確認
- 次の問合せを使用して、残高のPedersenコミットメント(パブリック・データ)を取得します。
SELECT JSON_VALUE(h."VALUEJSON", '$.balance') AS balance_commitment FROM "<OBP_instance_name>_<channel>_hist" h WHERE h."CHAINCODEID" = '<chaincode_name>' AND h."KEY" = '<account_id>' ORDER BY h."BLOCKNO" DESC, h."TXNNO" DESC FETCH FIRST 1 ROW ONLY;問合せの例:SELECT JSON_VALUE(h."VALUEJSON", '$.balance') AS balance_commitment FROM "CentralBank_default_hist" h WHERE h."CHAINCODEID" = 'testChaincode' AND h."KEY" = 'oaccount~07e1c67205520da256f6edfbe9d1cb763cf13d29a3ec870137251a1344feab84' ORDER BY h."BLOCKNO" DESC, h."TXNNO" DESC FETCH FIRST 1 ROW ONLY;レスポンスbalance_commitmentの例:03977a92a07c00234270d41097a35ed2050bcdef02d3908a9a3cc733951b4171dd - 次の問合せを使用して、プライベート・データ・コレクションから残高およびブラインド・ファクタを取得します。
SELECT JSON_VALUE(h."VALUEJSON", '$.balance') AS balance, JSON_VALUE(h."VALUEJSON", '$.balanceBlindingFactor') AS blinding_factor FROM "<OBP_instance_name>_<channel>_hist" h WHERE h."CHAINCODEID" = '<chaincode_name>$$_implicit_org_<OBP_instance_name>' AND h."KEY" = '<account_id>' ORDER BY h."BLOCKNO" DESC, h."TXNNO" DESC FETCH FIRST 1 ROW ONLY;問合せの例:SELECT JSON_VALUE(h."VALUEJSON", '$.balance') AS balance, JSON_VALUE(h."VALUEJSON", '$.balanceBlindingFactor') AS blinding_factor FROM "CentralBank_default_hist" h WHERE h."CHAINCODEID" = 'testChaincode$$_implicit_org_CentralBank' AND h."KEY" = 'oaccount~07e1c67205520da256f6edfbe9d1cb763cf13d29a3ec870137251a1344feab84' ORDER BY h."BLOCKNO" DESC, h."TXNNO" DESC FETCH FIRST 1 ROW ONLY;次の表に、レスポンスの例を示します。balanceblinding_factor10017629824947682234000 - 前に定義した
generateCommitmentメソッドを、srcフォルダ(src/controller/<Chaincode_name>.controller.ts)にあるコントローラ・ファイルに追加します。次に例を示します:@Validator(yup.string(), yup.string()) public async generateCommitment(value: string, bf: string) { await this. Ctx.Auth.checkAuthorization("ACCOUNT.processSendersAndReceivers", "TOKEN"); const result = await this.Ctx.PedersonCommitments.generateCommitment(value, bf); return result; } balance(valueとして)およびblinding_factor(blinding_factorとして)の値を2番目のステップからgenerateCommitmentメソッドに渡します。次に例を示します:balance_commitment from step 1 :03977a92a07c00234270d41097a35ed2050bcdef02d3908a9a3cc733951b4171dd balance from step 2 : 100 blinding_factor from step 2 : 17629824947682234000 Invoke the method generateCommitment("100", "875628364246182") Response: "0212f6b676da244eee000a9106060cf3a3a4bb5a9b61be23dd467e557156c40be8"- 最初のステップの
balance_commitment値がgenerateCommitmentメソッドの出力と一致することを確認します。次に例を示します:balance_commitment from step 1 :03977a92a07c00234270d41097a35ed2050bcdef02d3908a9a3cc733951b4171dd Response From Step 4: "03977a92a07c00234270d41097a35ed2050bcdef02d3908a9a3cc733951b4171dd" balance_commitment from step 1 must equal the generateCommitment response from step 4 LHS = RHS This verifies that the Pedersen commitment is correct against the raw balance and blindingFactor - 保留残高を確認するには、
onhold_balancePedersenコミットメントおよびonhold_balanceおよびonHoldBalanceBlindingFactor値について、これらのステップを繰り返します。
取引数量の検証
- 次の問合せを使用して、数量(パブリック・データ)のPedersenコミットメントを取得します。
次のテキストは、問合せの例を示しています。SELECT JSON_VALUE(h."VALUEJSON", '$.amount') AS quantity_commitment FROM "<OBP_instance_name>_<channel>_hist" h WHERE h."CHAINCODEID" = '<chaincode_name>' AND h."KEY" = '<transaction_id>' ORDER BY h."BLOCKNO" DESC, h."TXNNO" DESC FETCH FIRST 1 ROW ONLY;
次のテキストは、レスポンスの例を示しています。SELECT JSON_VALUE(h."VALUEJSON", '$.amount') AS quantity_commitment FROM "AdamsCentralBank_adams_hist" h WHERE h."CHAINCODEID" = 'confDev' AND h."KEY" = 'otransaction~d5e08934fd520554162d694476bae8521803e4bf7272e8709fe34dd3eeecbfe4' ORDER BY h."BLOCKNO" DESC, h."TXNNO" DESC FETCH FIRST 1 ROW ONLY;quantity_commitment036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23dd63 - 次の問合せを使用して、プライベート・データ収集から数量およびブラインド・ファクタを取得します。
次のテキストは、問合せの例を示しています。SELECT JSON_VALUE(h."VALUEJSON", '$.amount') AS quantity, JSON_VALUE(h."VALUEJSON", '$.blindingFactor') AS blinding_factor FROM "<OBP_instance_name>_<channel>_hist" h WHERE h."CHAINCODEID" = '<chaincode_name>$$_implicit_org_<OBP_instance_name>' AND h."KEY" = '<transaction_id>' ORDER BY h."BLOCKNO" DESC, h."TXNNO" DESC FETCH FIRST 1 ROW ONLY;
次のテキストは、レスポンスの例を示しています。SELECT JSON_VALUE(h."VALUEJSON", '$.amount') AS quantity, JSON_VALUE(h."VALUEJSON", '$.blindingFactor') AS blinding_factor FROM "CentralBank_default_hist" h WHERE h."CHAINCODEID" = 'testChaincode$$_implicit_org_CentralBank' AND h."KEY" = 'otransaction~d5e08934fd520554162d694476bae8521803e4bf7272e8709fe34dd3eeecbfe4' ORDER BY h."BLOCKNO" DESC, h."TXNNO" DESC FETCH FIRST 1 ROW ONLY;quantityblinding_factor10017721346708393996000 - 前に定義した
generateCommitmentメソッドを、srcフォルダ(src/controller/<Chaincode_name>.controller.ts)にあるコントローラ・ファイルに追加します。次に例を示します:@Validator(yup.string(), yup.string()) public async generateCommitment(value: string, bf: string) { await this. Ctx.Auth.checkAuthorization("ACCOUNT.processSendersAndReceivers", "TOKEN"); const result = await this.Ctx.PedersonCommitments.generateCommitment(value, bf); return result; } quantity(valueとして)およびblinding_factor(blinding_factorとして)の値を2番目のステップからgenerateCommitmentメソッドに渡します。次に例を示します:quantity_commitment from step 1 :036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23dd63 quantity from step 2 : 100 blinding_factor from step 2 : 17721346708393996000 Invoke the method generateCommitment("100", "17721346708393996000") Response: "036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23dd63"- 最初のステップの
quantity_commitment値がgenerateCommitmentメソッドの出力と一致することを確認します。次に例を示します:quantity_commitment from step 1: 036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23dd63 Response From Step 4: "036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23dd63" balance_commitment from step 1 = response from step 4 LHS = RHS This verifies that the Pedersen commitment is correct against the raw quantity and blindingFactor
勘定科目残高の監査
前述のとおり、現在の実際のbalance_commitmentおよびbalance値およびアカウントのブラインド・ファクタを取得した後、これらの値をトランザクション履歴に対して検証できます。
開始する値の例:
balance_commitment for account :036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23dd63
balance for account : 4600
blinding_factor for account : 6835208149283572992000getAccountTransactionHistoryWithFiltersFromRichHistDBメソッドを使用して、アカウントのすべてのトランザクションを取得します。各トランザクションには、一意のトランザクションIDと、それに対応するquantity_commitmentエントリ(状態データベース内)、および数量とブラインド・ファクタ(プライベート・データ・コレクション内)があります。レスポンスの例:[ { "transaction_id": "otransaction~5112f576c94c2d23c342479bfa37e34612414b3258a64b43cf51b920f4ff5868", "transacted_amount": 5000, "timestamp": "2025-08-12T21:05:02.000Z", "token_id": "USD", "transacted_account": "oaccount~cea6080858337b1575d6a76ed0bd07a0eacd8871e3f2f7f793729a0e4b0e8e98", "transacted_org_id": "CentralBank", "transacted_user_id": "cb_retirer_demo", "transacted_custom_account_id": "10109999006543", "to_account": "oaccount~cea6080858337b1575d6a76ed0bd07a0eacd8871e3f2f7f793729a0e4b0e8e98", "to_org_id": "CentralBank", "to_user_id": "cb_retirer_demo", "to_custom_account_id": "10109999006543", "from_account": "oaccount~68d67712f500e9dac8c314c19744003a993250271d960e9b0d25267bb18dfe9a", "from_org_id": "CentralBank", "from_user_id": "cb_issuer_demo", "from_custom_account_id": "10109999001234", "transaction_type": "DEBIT", "category": "burn", "balance": 45000, "onhold_balance": 0 }, { "transaction_id": "otransaction~862aa9d9e877d3ea209b87299ab5b12c13ed5ce43d1cf1b934043c1dd02f58f6", "transacted_amount": 50000, "timestamp": "2025-08-12T21:04:22.000Z", "token_id": "USD", "transacted_account": "oaccount~da6e14466a0ba9b48ebc18fa672addb92dffc371bf953c3229a95b2ff2d9cd41", "transacted_org_id": "CentralBank", "transacted_user_id": "cb__creator_demo", "transacted_custom_account_id": "10105678004567", "to_account": "oaccount~68d67712f500e9dac8c314c19744003a993250271d960e9b0d25267bb18dfe9a", "to_org_id": "CentralBank", "to_user_id": "cb_issuer_demo", "to_custom_account_id": "10109999001234", "from_account": "oaccount~da6e14466a0ba9b48ebc18fa672addb92dffc371bf953c3229a95b2ff2d9cd41", "from_org_id": "CentralBank", "from_user_id": "cb__creator_demo", "from_custom_account_id": "10105678004567", "transaction_type": "CREDIT", "category": "transfer", "balance": 50000, "onhold_balance": 0 }, { "transaction_id": "otransaction~d209ff46dc46f4adb42f0002377507fe995b32bc618ac919eba49141cf1b8008", "transacted_amount": 100, "timestamp": "2025-08-01T10:59:48.000Z", "token_id": "token", "category": "category value", "description": "description value", "holding_id": "ohold~cbdc~token~mint1", "to_account_id": "oaccount~da6e14466a0ba9b48ebc18fa672addb92dffc371bf953c3229a95b2ff2d9cd41", "to_org_id": "CentralBank", "to_user_id": "cb", "to_custom_account_id": "10109999001234", "transacted_account": "oaccount~3a1b1c307883c0f74473fedfa62894d510b68959c4a21c7abb9d0224151aa573", "transaction_type": "APPROVE_MINT", "balance": 100, "onhold_balance": 0, "transacted_org_id": "CentralBank", "transacted_user_id": "cb__creator_demo", "transacted_custom_account_id": "1234567jh" } ]- 前のステップに従って、各トランザクション数量を確認し、公開データと非公開データが同期されていることを確認します。次の例は、前の検証ステップからの計算で使用されるトランザクションと値を示しています。
- トランザクションが発生した順序で順序付けられたリストを繰り返し、各プロパティの累積合計を計算します。各トランザクションについて、次のステップを実行します。
- トランザクションがクレジット(追加)の場合は、
addCommitmentメソッドを使用してquantity_commitmentプロパティを結合します。トランザクションが借方(減算)の場合は、subCommitmentメソッドを使用してquantity_commitmentプロパティを結合します。 - トランザクションがクレジットの場合は、
quantityプロパティを追加します。トランザクションが借方の場合は、quantityプロパティを減算します。 - トランザクションがクレジットの場合は、
blinding_factorプロパティを追加します。トランザクションが借方の場合は、blinding_factorプロパティを減算します。
- プロセス・コミットメント
Starting balance_commitment: "2a4261d28b5a08889921d71b658b59bc76b17cf553c67de2943d769741f8f23dd63" For Transaction 1 using method addCommitment( "2a4261d28b5a08889921d71b658b59bc76b17cf553c67de2943d769741f8f23dd63", "036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23dd63" ) = "a1d71b658036b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23dd63" current balance_commitment: "a1d71b658036b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23dd63" Transaction 2 using method addCommitment( "a1d71b658036b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23dd63", "dd63036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23" ) = "b285a4261dd63036a1d71b658b592bc76da08b17cf553c67de2943d769741f8f23" current balance_commitment: "b285a4261dd63036a1d71b658b592bc76da08b17cf553c67de2943d769741f8f23" Transaction 3 using method subCommitment( "b285a4261dd63036a1d71b658b592bc76da08b17cf553c67de2943d769741f8f23", "d28b5a08889921d71b658b592a4261bc76b17cf553c67de2943d769741f8f23dd63" ) = "036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23dd63" Final commitment: "036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23dd63"- 処理数量
starting balance: 0 For Transaction 1 current_balance = 0 + 100 = 100 current_balance = 100 For Transaction 2 new current_balance = 100 + 5000 = 5100 current_balance = 5100 For Transaction 3 new current_balance = 5100 - 500 = 4600 Final_balance = 4600- プロセス・ブラインド・ファクタ
starting blindingFactor: 67083177213493996000 For Transaction 1 current_blindingFactor = 67083177213493996000 + 17721346708393996000 = 84804523921887992000 current_balance = 84804523921887992000 For Transaction 2 new current_blindingFactor = 84804523921887992000 + 6789721346708393996000 = 6874525870630281988000 current_balance = 6874525870630281988000 For Transaction 3 new current_blindingFactor = 6874525870630281988000 - 39317721346708996000 = 6835208149283572992000 Final_balance = 6835208149283572992000
- トランザクションがクレジット(追加)の場合は、
- すべてのトランザクションを処理した後、次の文がtrueであることを確認します。
quantity_commitment値は、現在のAccount.balance_commitment値と一致します。quantity値は、現在のAccount.balance値と一致します。blinding_factor値は、現在のAccount.blinding_factor値と一致します。
次に例を示します:Starting balance_commitment: 036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23dd63 balance_commitment from step 3 :036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23dd63 Starting balance_commitment = balance_commitment from step 3 LHS = RHS The balance Pedersen commitment is verified. starting balance : 4600 balance from step 3 : 4600 starting balance = balance for step 3 LHS = RHS The balance verified. starting blinding_factor : 6835208149283572992000 blinding_factor from step 3 : 6835208149283572992000 starting blinding_factor = blinding_factor for step 3 LHS = RHS The blinding_factor is verified.