Verificar valores de compromiso de Pedersen
Oracle Blockchain Platform Digital Assets Edition utiliza los compromisos de Pedersen para garantizar tanto el secreto como la inmutabilidad. Las siguientes API pueden ayudar a verificar los compromisos de Pedersen con respecto a los valores de texto sin formato reales.
En Oracle Blockchain Platform, los datos se pueden mantener en la base de datos de historial enriquecida conectándose a una instancia de Oracle Database. Las cuentas y transacciones, que se almacenan como pares clave/valor en la base de datos de estado, se pueden rastrear a lo largo del tiempo en la base de datos de historial enriquecido. En modo confidencial, tanto las cuentas como las transacciones se almacenan en dos partes, privada y pública, en la tabla de historial de la base de datos de historial enriquecida.
Todos los datos, tanto públicos como privados para la organización, están disponibles en la tabla de historial de la base de datos de historial enriquecida. El nombre de la tabla utiliza el siguiente formato: <obp_instance_name>_<channel_name>_hist
. Por ejemplo, CentralBank_default_hist
.
- Datos de cuentas públicas (base de datos de estado)
-
- Se almacenan en el identificador de código de cadena: <chaincode_name>
- Accesible a todos los participantes de la red
- Propiedades generales de la cuenta, como
org_id
,token_name
,balance
/onhold_balance
(como compromisos de Pedersen) y otros metadatos no confidenciales
- Datos de Cuentas Privadas (Recopilación de Datos Privados)
-
- Se almacenan en el identificador de código de cadena: <chaincode_name>
$$_implicit_org_<Oracle_Blockchain_Platform_instance_name>
- Solo accesible para la organización propietaria de la recopilación de datos privada
- Campos confidenciales, como
balance
/onhold_balance
(valores sin formato),balanceBlindingFactor
,onHoldBalanceBlindingFactor
y límites diarios
- Se almacenan en el identificador de código de cadena: <chaincode_name>
- Datos de transacción pública (base de datos de estado)
-
- Se almacenan en el identificador de código de cadena: <chaincode_name>
- Accesible a todos los participantes de la red
- Propiedades generales de la cuenta, como ID de cuentas de remitente y receptor,
from_account_balance
/from_account_onhold_balance
/to_account_balance
/to_account_onhold_balance
/importes de transacciones (como compromisos de Pedersen) y otros metadatos no confidenciales
- Datos de Transacciones Privadas (Recopilación de Datos Privados)
-
- Se almacenan en el identificador de código de cadena: <chaincode_name>
$$_implicit_org_<Oracle_Blockchain_Platform_instance_name>
- Solo accesible para la organización propietaria de la recopilación de datos privada
- Campos confidenciales, como
from_account_balance
/from_account_onhold_balance
/to_account_balance
/to_account_onhold_balance
/cantidades de transacción (valores sin procesar), y los factores de cegamiento correspondientes
- Se almacenan en el identificador de código de cadena: <chaincode_name>
API de compromiso de Pedersen
Puede utilizar las siguientes API, que se incluyen en el archivo del controlador del código de cadena, para verificar y trabajar con compromisos de Pedersen.
-
generateCommitment
- Este método genera un compromiso de Pedersen para un valor y un factor de cegamiento especificados. Este método solo se puede llamar mediante
Token Admin
oOrg Admin
. -
addCommitment
- Este método agrega dos valores hash de compromiso Pedersen especificados. Debido a que los compromisos de Pedersen son homomórficos, apoyan la realización de operaciones matemáticas, como la suma y la resta de compromisos, al tiempo que preservan las relaciones entre los valores subyacentes. Este método solo se puede llamar mediante
Token Admin
oOrg Admin
. -
subCommitment
- Este método resta el segundo valor hash de compromiso de Pedersen especificado del primero. Debido a que los compromisos de Pedersen son homomórficos, apoyan la realización de operaciones matemáticas, como la suma y la resta de compromisos, al tiempo que preservan las relaciones entre los valores subyacentes. Este método solo se puede llamar mediante
Token Admin
oOrg Admin
.
Verificación de saldos de cuenta y retenidos
- Utilice la siguiente consulta para obtener el compromiso de Pedersen del saldo, que es datos públicos.
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;
Consulta de ejemplo: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;
Ejemplo de respuestabalance_commitment
:03977a92a07c00234270d41097a35ed2050bcdef02d3908a9a3cc733951b4171dd
- Utilice la siguiente consulta para obtener el factor de equilibrio y enmascaramiento de la recopilación de datos privada.
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;
Consulta de ejemplo: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;
En la siguiente tabla se muestra un ejemplo de respuesta:balance
blinding_factor
100
17629824947682234000
- Agregue el método
generateCommitment
, definido anteriormente, al archivo de controlador ubicado en la carpetasrc
(src/controller/<Chaincode_name>.controller.ts
).Por ejemplo:@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; }
- Transfiera los valores
balance
(comovalue
) yblinding_factor
(comoblinding_factor
) del segundo paso al métodogenerateCommitment
.Por ejemplo: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"
- Verifique que el valor
balance_commitment
del primer paso coincide con la salida del métodogenerateCommitment
.Por ejemplo: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
- Para verificar un saldo retenido, repita estos pasos para el compromiso de Pedersen
onhold_balance
y los valoresonhold_balance
yonHoldBalanceBlindingFactor
.
Verificación de cantidades de transacción
- Utilice la siguiente consulta para obtener el compromiso de Pedersen de la cantidad, que es datos públicos.
El siguiente texto muestra una consulta de ejemplo.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;
En el siguiente texto se muestra un ejemplo de respuesta.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
- Utilice la siguiente consulta para obtener la cantidad y el factor de enmascaramiento de la recopilación de datos privada.
El siguiente texto muestra una consulta de ejemplo.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;
En el siguiente texto se muestra un ejemplo de respuesta.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
- Agregue el método
generateCommitment
, definido anteriormente, al archivo de controlador ubicado en la carpetasrc
(src/controller/<Chaincode_name>.controller.ts
).Por ejemplo:@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; }
- Transfiera los valores
quantity
(comovalue
) yblinding_factor
(comoblinding_factor
) del segundo paso al métodogenerateCommitment
.Por ejemplo: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"
- Verifique que el valor
quantity_commitment
del primer paso coincide con la salida del métodogenerateCommitment
.Por ejemplo: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
Auditoría de saldos de cuenta
Después de obtener los valores actuales balance_commitment
y balance
y el factor de cegamiento para la cuenta como se ha descrito anteriormente, puede validar estos valores con respecto al historial de transacciones.
balance_commitment for account :036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23dd63
balance for account : 4600
blinding_factor for account : 6835208149283572992000
- Utilice el método
getAccountTransactionHistoryWithFiltersFromRichHistDB
para recuperar todas las transacciones de la cuenta. Cada transacción tiene un ID de transacción único y las entradas correspondientes dequantity_commitment
(en la base de datos de estado) y un factor de cantidad y enmascaramiento (en la recopilación de datos privada).Respuesta de ejemplo:[ { "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" } ]
- Siga los pasos anteriores para verificar cada cantidad de transacción y asegurarse de que los datos públicos y privados están sincronizados. Los siguientes ejemplos muestran las transacciones y los valores utilizados en los cálculos de los pasos de verificación anteriores.
- Itere a través de la lista ordenada de transacciones en el orden en que se realizaron y calcule los totales en ejecución de cada propiedad. Para cada transacción, complete los pasos siguientes.
- Si la transacción es un crédito (adición), combine la propiedad
quantity_commitment
mediante el métodoaddCommitment
. Si la transacción es un débito (resta), combine la propiedadquantity_commitment
mediante el métodosubCommitment
. - Si la transacción es un crédito, agregue la propiedad
quantity
. Si la transacción es un débito, resta la propiedadquantity
. - Si la transacción es un crédito, agregue la propiedad
blinding_factor
. Si la transacción es un débito, resta la propiedadblinding_factor
.
- Procesar compromisos
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"
- Cantidad de proceso
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
- Factor de cegamiento de procesos
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 transacción es un crédito (adición), combine la propiedad
- Después de procesar todas las transacciones, compruebe que las siguientes afirmaciones sean verdaderas.
- El valor
quantity_commitment
coincide con el valorAccount.balance_commitment
actual - El valor
quantity
coincide con el valorAccount.balance
actual - El valor
blinding_factor
coincide con el valorAccount.blinding_factor
actual
Por ejemplo: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.
- El valor