Vérifier les valeurs d'engagement Pedersen
Oracle Blockchain Platform Digital Assets Edition utilise les engagements de Pedersen pour garantir à la fois le secret et l'immuabilité. Les API suivantes peuvent 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 d'historique enrichie en se connectant à une instance 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 d'historique enrichie.
Toutes les données, publiques et privées, 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 de code 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 de 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 chaîne : <chaincode_name>
$$_implicit_org_<Oracle_Blockchain_Platform_instance_name>
- Accessible uniquement à l'organisation propriétaire 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 chaîne : <chaincode_name>
- Données de transaction publique (base de données d'état)
-
- Stocké sous l'ID de code chaîne : <chaincode_name>
- Accessible à tous les participants du réseau
- Propriétés de compte générales telles que les identifiants de compte de l'expéditeur et du destinataire, les montants de transaction
from_account_balance
/from_account_onhold_balance
/to_account_balance
/to_account_onhold_balance
/ (en tant qu'engagements de 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 chaîne : <chaincode_name>
$$_implicit_org_<Oracle_Blockchain_Platform_instance_name>
- Accessible uniquement à l'organisation propriétaire 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 facteurs d'aveuglement correspondants
- Stocké sous l'ID de code 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 chaîne, pour vérifier et travailler avec les engagements de 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 de Pedersen sont homomorphes, ils soutiennent l'exécution d'opérations mathématiques telles que l'addition et la soustraction des 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 spécifiée de Pedersen de la première. Parce que les engagements de Pedersen sont homomorphes, ils soutiennent l'exécution d'opérations mathématiques telles que l'addition et la soustraction des 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érifier les soldes des comptes et les soldes bloqués
- Utilisez la requête suivante pour obtenir l'engagement Pedersen de l'équilibre, 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;
- Utilisez la requête 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;
- 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
). - Transmettez les valeurs
balance
(en tant quevalue
) etblinding_factor
(en tant queblinding_factor
) de la deuxième étape à la méthodegenerateCommitment
. - Vérifiez que la valeur
balance_commitment
de la première étape correspond à la sortie de la méthodegenerateCommitment
. - Pour vérifier un solde de retenue, répétez ces étapes pour l'engagement
onhold_balance
Pedersen et les valeursonhold_balance
etonHoldBalanceBlindingFactor
.
Vérifier les quantités de mouvement
- 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 de requête.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 la requête 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 de requête.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
). - Transmettez les valeurs
quantity
(en tant quevalue
) etblinding_factor
(en tant queblinding_factor
) de la deuxième étape à la méthodegenerateCommitment
. - Vérifiez que la valeur
quantity_commitment
de la première étape correspond à la sortie de la méthodegenerateCommitment
.
Auditer les soldes des comptes
Une fois que vous avez obtenu les valeursbalance_commitment
et balance
réelles actuelles et le facteur d'aveuglement du compte comme décrit précédemment, vous pouvez valider ces valeurs par rapport à l'historique des transactions.
- Utilisez la méthode
getAccountTransactionHistoryWithFiltersFromRichHistDB
pour extraire toutes les transactions du compte. Chaque transaction a un ID de transaction unique et les entrées correspondantes dequantity_commitment
(dans la base de données d'état), ainsi que la quantité et le facteur d'aveuglement (dans la collecte de données privée). - 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.
- Parcourez la liste ordonnée des transactions dans l'ordre dans lequel elles ont eu lieu et calculez les totaux cumulés pour chaque propriété. Pour chaque transaction, procédez comme suit :
- 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
.
- Engagements de processus
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é traitée
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 = 4900 Final_balance = 4900
- 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 affirmations suivantes sont vraies.
- La valeur
quantity_commitment
correspond à la valeurAccount.balance_commitment
en cours. - La valeur
quantity
correspond à la valeurAccount.balance
en cours. - La valeur
blinding_factor
correspond à la valeurAccount.blinding_factor
en cours.
- La valeur