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
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

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 ou Org Admin.
@Validator(yup.string(), yup.string())
 public async generateCommitment(value: string, blinding_factor: string) {
   await this.Ctx.Auth.checkAuthorization("ACCOUNT.processSendersAndReceivers", "TOKEN");
   const result = await this.Ctx.PedersonCommitments.generateCommitment(value, blinding_factor);
   return result;
 }
Paramètres :
  • value: string – Valeur numérique pour laquelle l'engagement Pedersen doit être généré.
  • blinding_factor: string – Le nombre aléatoire utilisé pour générer l'engagement Pedersen.
Renvoie :
  • Une valeur de hachage, qui est l'engagement de Pedersen pour la valeur spécifiée et le facteur d'aveuglement.
Exemple de valeur renvoyée :
"0212f6b676da244eee000a9106060cf3a3a4bb5a9b61be23dd467e557156c40be8"
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 ou Org Admin.
@Validator(yup.string(), yup.string())
 public async addCommitment(value1: string, value2: string) {
  await this.Ctx.Auth.checkAuthorization("ACCOUNT.processSendersAndReceivers", "TOKEN");
  const result = await this.Ctx.PedersonCommitments.add(value1, value2);
  return result;
 }
Paramètres :
  • value1: string – La première valeur ajoutée de l'engagement Pedersen.
  • value2: string – La deuxième valeur ajoutée de l'engagement Pedersen.
Renvoie :
  • Une valeur de hachage, qui correspond à l'engagement de Pedersen pour la somme des deux valeurs d'engagement de Pedersen spécifiées.
Exemple de valeur renvoyée :
"03a9c138b76e7d56f799108a46f665f53a42f55008b31e0fec071019aa5c37344a"
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 ou Org Admin.
@Validator(yup.string(), yup.string())
 public async subCommitment(value1: string, value2: string) {
  await this.Ctx.Auth.checkAuthorization("ACCOUNT.processSendersAndReceivers", "TOKEN");
  const result = await this.Ctx.PedersonCommitments.sub(value1, value2);
  return result;
 }
Paramètres :
  • value1: string – La première valeur de hachage d'engagement de Pedersen dans la soustraction (la minutie).
  • value2: string – La deuxième valeur de hachage d'engagement de Pedersen à soustraire de la première (le sous-trahend).
Renvoie :
  • Une valeur de hachage, qui est l'engagement de Pedersen pour la différence des deux valeurs d'engagement de Pedersen spécifiées.
Exemple de valeur renvoyée :
"0212f6b676da244eee000a9106060cf3a3a4bb5a9b61be23dd467e557156c40be8"

Vérifier les soldes des comptes et les soldes bloqués

  1. 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;
  2. 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;
  3. Ajoutez la méthode generateCommitment, définie précédemment, au fichier de contrôleur situé dans le dossier src (src/controller/<Chaincode_name>.controller.ts).
  4. Transmettez les valeurs balance (en tant que value) et blinding_factor (en tant que blinding_factor) de la deuxième étape à la méthode generateCommitment.
  5. Vérifiez que la valeur balance_commitment de la première étape correspond à la sortie de la méthode generateCommitment.
  6. Pour vérifier un solde de retenue, répétez ces étapes pour l'engagement onhold_balance Pedersen et les valeurs onhold_balance et onHoldBalanceBlindingFactor.

Vérifier les quantités de mouvement

  1. Utilisez la requête suivante pour obtenir l'engagement Pedersen de la quantité, qui est des données publiques.
    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 requête.
    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;
    Le texte suivant présente un exemple de réponse.
    quantity_commitment
    036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23dd63
  2. Utilisez la requête suivante pour obtenir la quantité et le facteur d'aveuglement de la collecte de données privée.
    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 requête.
    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;
    Le texte suivant présente un exemple de réponse.
    quantity blinding_factor
    100 17721346708393996000
  3. Ajoutez la méthode generateCommitment, définie précédemment, au fichier de contrôleur situé dans le dossier src (src/controller/<Chaincode_name>.controller.ts).
  4. Transmettez les valeurs quantity (en tant que value) et blinding_factor (en tant que blinding_factor) de la deuxième étape à la méthode generateCommitment.
  5. Vérifiez que la valeur quantity_commitment de la première étape correspond à la sortie de la méthode generateCommitment.

Auditer les soldes des comptes

Une fois que vous avez obtenu les valeurs balance_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.
  1. 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 de quantity_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).
  2. 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.
    Transaction 1
    otransaction~d209ff46dc46f4adb42f0002377507fe995b32bc618ac919eba49141cf1b8008
    Valeurs des étapes de vérification :
    quantity_commitment from step 1: 036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23dd63
    quantity from step 2: 100
    blinding_factor from step 2: 17721346708393996000
     
    Now call the method generateCommitment("100", "17721346708393996000")
    Response: "036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23dd63"
     
    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 
    Transaction 2
    otransaction~862aa9d9e877d3ea209b87299ab5b12c13ed5ce43d1cf1b934043c1dd02f58f6
    Valeurs des étapes de vérification :
    quantity_commitment from step 1: dd63036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23
    quantity from step 2: 50000
    blinding_factor from step 2: 6789721346708393996000
     
    Now call the method generateCommitment("50000", "6789721346708393996000")
    Response: "dd63036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23"
     
    quantity_commitment from step 1: dd63036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23
    Response From step 4: "dd63036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23"
     
    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
    Transaction 3
    otransaction~5112f576c94c2d23c342479bfa37e34612414b3258a64b43cf51b920f4ff5868
    Valeurs des étapes de vérification :
    quantity_commitment from step 1: d28b5a08889921d71b658b592a4261bc76b17cf553c67de2943d769741f8f23dd63
    quantity from step 2: 5000
    blinding_factor from step 2: 39317721346708996000
     
    Now call the method generateCommitment("5000", "39317721346708996000")
    Response: "d28b5a08889921d71b658b592a4261bc76b17cf553c67de2943d769741f8f23dd63"
     
    quantity_commitment from step 1: d28b5a08889921d71b658b592a4261bc76b17cf553c67de2943d769741f8f23dd63
    Response From step 4: "d28b5a08889921d71b658b592a4261bc76b17cf553c67de2943d769741f8f23dd63"
     
    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
  3. 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 :
    1. Si la transaction est un crédit (ajout), combinez la propriété quantity_commitment à l'aide de la méthode addCommitment. Si la transaction est un débit (soustraction), combinez la propriété quantity_commitment à l'aide de la méthode subCommitment.
    2. Si la transaction est un crédit, ajoutez la propriété quantity. Si la transaction est un débit, soustrayez la propriété quantity.
    3. 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.
    Les exemples suivants illustrent le traitement des engagements, de la quantité et du facteur d'aveuglement.
    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
  4. Après avoir traité toutes les transactions, vérifiez que les affirmations suivantes sont vraies.
    • La valeur quantity_commitment correspond à la valeur Account.balance_commitment en cours.
    • La valeur quantity correspond à la valeur Account.balance en cours.
    • La valeur blinding_factor correspond à la valeur Account.blinding_factor en cours.