Vérifier les valeurs d'engagement Pedersen
Oracle Blockchain Platform Digital Assets Edition utilise les engagements de Pedersen pour assurer à la fois le secret et l'immutabilité. Les API suivantes peuvent vous aider à vérifier les engagements de Pedersen par rapport aux valeurs de texte brut réelles.
Dans Oracle Blockchain Platform, les données peuvent être conservées dans la base de données riche en histoire en se connectant à Oracle Database. Les comptes et les transactions, qui sont stockés en tant que paires clé/valeur dans la base de données d'état, peuvent être suivis au fil du temps dans la base de données d'historique riche. En mode confidentiel, les comptes et les transactions sont stockés en deux parties, privée et publique, dans la table d'historique de la base de données riche en historique.
Toutes les données, publiques et privées pour l'organisation, sont disponibles dans la table d'historique de la base de données d'historique enrichie. Le nom de la table utilise le format suivant : <obp_instance_name>_<channel_name>_hist
. Par exemple, CentralBank_default_hist
.
- Données de compte public (base de données d'état)
-
- Stocké sous l'ID code de chaîne : <chaincode_name>
- Accessible à tous les participants du réseau
- Propriétés générales du compte telles que
org_id
,token_name
,balance
/onhold_balance
(en tant qu'engagements Pedersen) et autres métadonnées non confidentielles
- Données de compte privé (collecte de données privées)
-
- Stocké sous l'ID de code de chaîne : <chaincode_name>
$$_implicit_org_<Oracle_Blockchain_Platform_instance_name>
- Accessible uniquement à l'organisation responsable de la collecte de données privée
- Champs sensibles tels que
balance
/onhold_balance
(valeurs brutes),balanceBlindingFactor
,onHoldBalanceBlindingFactor
et limites quotidiennes
- Stocké sous l'ID de code de chaîne : <chaincode_name>
- Données de transaction publiques (base de données d'état)
-
- Stocké sous l'ID code de chaîne : <chaincode_name>
- Accessible à tous les participants du réseau
- Propriétés générales du compte, telles que les ID compte de l'expéditeur et du destinataire,
from_account_balance
/from_account_onhold_balance
/to_account_balance
/to_account_onhold_balance
/les montants de transaction (en tant qu'engagements Pedersen) et d'autres métadonnées non confidentielles
- Données de transaction privées (collecte de données privées)
-
- Stocké sous l'ID de code de chaîne : <chaincode_name>
$$_implicit_org_<Oracle_Blockchain_Platform_instance_name>
- Accessible uniquement à l'organisation responsable de la collecte de données privée
- Champs sensibles tels que
from_account_balance
/from_account_onhold_balance
/to_account_balance
/to_account_onhold_balance
/montants de transaction (valeurs brutes) et les facteurs d'aveuglement correspondants
- Stocké sous l'ID de code de chaîne : <chaincode_name>
API d'engagement Pedersen
Vous pouvez utiliser les API suivantes, qui sont incluses dans le fichier de contrôleur du code de chaîne, pour vérifier et travailler avec les engagements Pedersen.
-
generateCommitment
- Cette méthode génère un engagement Pedersen pour une valeur et un facteur d'aveuglement spécifiés. Cette méthode ne peut être appelée que par
Token Admin
ouOrg Admin
. -
addCommitment
- Cette méthode ajoute deux valeurs de hachage d'engagement Pedersen spécifiées. Parce que les engagements Pedersen sont homomorphes, ils soutiennent la réalisation d'opérations mathématiques telles que l'addition et la soustraction d'engagements tout en préservant les relations entre les valeurs sous-jacentes. Cette méthode ne peut être appelée que par
Token Admin
ouOrg Admin
. -
subCommitment
- Cette méthode soustrait la deuxième valeur de hachage d'engagement Pedersen spécifiée de la première. Parce que les engagements Pedersen sont homomorphes, ils soutiennent la réalisation d'opérations mathématiques telles que l'addition et la soustraction d'engagements tout en préservant les relations entre les valeurs sous-jacentes. Cette méthode ne peut être appelée que par
Token Admin
ouOrg Admin
.
Vérification des soldes de comptes et des soldes bloqués
- Utilisez la requête suivante pour obtenir l'engagement Pedersen du solde, qui est des données publiques.
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;
Exemple d'interrogation :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;
Exemple de réponsebalance_commitment
:03977a92a07c00234270d41097a35ed2050bcdef02d3908a9a3cc733951b4171dd
- Utilisez l'interrogation suivante pour obtenir le solde et le facteur d'aveuglement de la collecte de données privée.
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;
Exemple d'interrogation :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;
Le tableau suivant présente un exemple de réponse :balance
blinding_factor
100
17629824947682234000
- Ajoutez la méthode
generateCommitment
, définie précédemment, au fichier de contrôleur situé dans le dossiersrc
(src/controller/<Chaincode_name>.controller.ts
).Exemple :@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; }
- Transmettez les valeurs
balance
(en tant quevalue
) etblinding_factor
(en tant queblinding_factor
) de la deuxième étape à la méthodegenerateCommitment
.Exemple :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"
- Vérifiez que la valeur
balance_commitment
de la première étape correspond à la sortie de la méthodegenerateCommitment
.Exemple :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 Pederson commitment is correct against the raw balance and blindingFactor
- Pour vérifier un solde bloqué, répétez ces étapes pour l'engagement
onhold_balance
Pedersen et les valeursonhold_balance
etonHoldBalanceBlindingFactor
.
Vérification des quantités de transactions
- Utilisez la requête suivante pour obtenir l'engagement Pedersen de la quantité, qui est des données publiques.
Le texte suivant présente un exemple d'interrogation.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;
Le texte suivant présente un exemple de réponse.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_commitment
036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23dd63
- Utilisez l'interrogation suivante pour obtenir la quantité et le facteur d'aveuglement de la collecte de données privée.
Le texte suivant présente un exemple d'interrogation.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;
Le texte suivant présente un exemple de réponse.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;
quantity
blinding_factor
100
17721346708393996000
- Ajoutez la méthode
generateCommitment
, définie précédemment, au fichier de contrôleur situé dans le dossiersrc
(src/controller/<Chaincode_name>.controller.ts
).Exemple :@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; }
- Transmettez les valeurs
quantity
(en tant quevalue
) etblinding_factor
(en tant queblinding_factor
) de la deuxième étape à la méthodegenerateCommitment
.Exemple :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"
- Vérifiez que la valeur
quantity_commitment
de la première étape correspond à la sortie de la méthodegenerateCommitment
.Exemple :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 Pederson commitment is correct against the raw quantity and blindingFactor
Vérification des soldes de comptes
Après avoir obtenu les valeurs balance_commitment
et balance
réelles courantes et le facteur de masquage pour le compte, comme décrit précédemment, vous pouvez valider ces valeurs par rapport à l'historique des transactions.
balance_commitment for account :036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23dd63
balance for account : 4600
blinding_factor for account : 6835208149283572992000
- Utilisez la méthode
getAccountTransactionHistoryWithFiltersFromRichHistDB
pour extraire toutes les transactions pour le compte. Chaque transaction a un ID transaction unique et des entrées correspondantes dequantity_commitment
(dans la base de données d'état) et de quantité et de facteur de masquage (dans la collecte de données privée).Exemple de réponse :[ { "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" } ]
- Suivez les étapes précédentes pour vérifier chaque quantité de transaction et vous assurer que les données publiques et privées sont synchronisées. Les exemples suivants montrent les transactions et les valeurs utilisées dans les calculs des étapes de vérification précédentes.
- Effectuez une itération dans la liste ordonnée des transactions dans l'ordre dans lequel elles ont eu lieu et calculez les totaux d'exécution pour chaque propriété. Pour chaque transaction, effectuez les étapes suivantes.
- Si la transaction est un crédit (ajout), combinez la propriété
quantity_commitment
à l'aide de la méthodeaddCommitment
. Si la transaction est un débit (soustraction), combinez la propriétéquantity_commitment
à l'aide de la méthodesubCommitment
. - Si la transaction est un crédit, ajoutez la propriété
quantity
. Si la transaction est un débit, soustrayez la propriétéquantity
. - Si la transaction est un crédit, ajoutez la propriété
blinding_factor
. Si la transaction est un débit, soustrayez la propriétéblinding_factor
.
- Traiter les engagements
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"
- Quantité de traitement
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
- Facteur d'aveuglement de processus
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
- Si la transaction est un crédit (ajout), combinez la propriété
- Après avoir traité toutes les transactions, vérifiez que les instructions suivantes sont vraies.
- La valeur
quantity_commitment
correspond à la valeurAccount.balance_commitment
courante - La valeur
quantity
correspond à la valeurAccount.balance
courante - La valeur
blinding_factor
correspond à la valeurAccount.blinding_factor
courante
Exemple :Starting balance_commitment: 036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23dd63 balance_commitment from step 3 :036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23dd63 Starting balance_commitment = balance_commitment from step 3 LHS = RHS The balance pederson 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.
- La valeur