Verpflichtungswerte für Pedersen prüfen
Die Oracle Blockchain Platform Digital Assets Edition nutzt Pedersen-Verpflichtungen, um sowohl Geheimhaltung als auch Unveränderlichkeit sicherzustellen. Mit den folgenden APIs können Sie die Pedersen-Verpflichtungen anhand der tatsächlichen Rohtextwerte prüfen.
In Oracle Blockchain Platform können Daten in der umfangreichen Historiendatenbank persistiert werden, indem eine Verbindung zu einer Oracle Database hergestellt wird. Konten und Transaktionen, die als Schlüssel/Wert-Paare in der Statusdatenbank gespeichert werden, können im Laufe der Zeit in der umfangreichen Historiendatenbank verfolgt werden. Im vertraulichen Modus werden sowohl Konten als auch Transaktionen in zwei Teilen (privat und öffentlich) in der Historientabelle in der umfangreichen Historiendatenbank gespeichert.
Alle öffentlichen und privaten Daten für die Organisation sind in der Historientabelle der umfangreichen Historiendatenbank verfügbar. Der Tabellenname verwendet das folgende Format: <obp_instance_name>_<channel_name>_hist
. Beispiel: CentralBank_default_hist
.
- Public Account-Daten (Statusdatenbank)
-
- Unter der Chaincode-ID gespeichert: <chaincode_name>
- Zugänglich für alle Netzwerkteilnehmer
- Allgemeine Kontoeigenschaften wie
org_id
,token_name
,balance
/onhold_balance
(als Pedersen-Verpflichtungen) und andere nicht vertrauliche Metadaten
- Private Kontodaten (Private Datenerfassung)
-
- Unter der Chaincode-ID gespeichert: <chaincode_name>
$$_implicit_org_<Oracle_Blockchain_Platform_instance_name>
- Nur für die Organisation zugänglich, die Eigentümer der privaten Datenerfassung ist
- Sensible Felder wie
balance
/onhold_balance
(Raw-Werte),balanceBlindingFactor
,onHoldBalanceBlindingFactor
und Tageslimits
- Unter der Chaincode-ID gespeichert: <chaincode_name>
- Öffentliche Transaktionsdaten (Statusdatenbank)
-
- Unter der Chaincode-ID gespeichert: <chaincode_name>
- Zugänglich für alle Netzwerkteilnehmer
- Allgemeine Kontoeigenschaften wie Absender- und Empfängerkonto-IDs,
from_account_balance
/from_account_onhold_balance
/to_account_balance
/to_account_onhold_balance
/Transaktionsbeträge (als Pedersen-Verpflichtungen) und andere nicht vertrauliche Metadaten
- Private Transaktionsdaten (Private Datenerfassung)
-
- Unter der Chaincode-ID gespeichert: <chaincode_name>
$$_implicit_org_<Oracle_Blockchain_Platform_instance_name>
- Nur für die Organisation zugänglich, die Eigentümer der privaten Datenerfassung ist
- Sensible Felder wie
from_account_balance
/from_account_onhold_balance
/to_account_balance
/to_account_onhold_balance
/Transaktionsbeträge (Rohwerte) und die entsprechenden Blinding-Faktoren
- Unter der Chaincode-ID gespeichert: <chaincode_name>
Pedersen Commitment-APIs
Sie können die folgenden APIs verwenden, die in der Controller-Datei des Chaincodes enthalten sind, um Pedersen-Verpflichtungen zu überprüfen und mit diesen zu arbeiten.
-
generateCommitment
- Diese Methode generiert eine Pedersen-Verpflichtung für einen bestimmten Wert und einen Blinding-Faktor. Diese Methode kann nur mit einer
Token Admin
oderOrg Admin
aufgerufen werden. -
addCommitment
- Mit dieser Methode werden zwei angegebene Hashwerte für Pedersen-Verpflichtungen hinzugefügt. Da Pedersen-Verpflichtungen homomorph sind, unterstützen sie die Durchführung mathematischer Operationen wie Addition und Subtraktion von Verpflichtungen unter Beibehaltung der Beziehungen zwischen den zugrunde liegenden Werten. Diese Methode kann nur mit einer
Token Admin
oderOrg Admin
aufgerufen werden. -
subCommitment
- Diese Methode subtrahiert den zweiten angegebenen Pedersen Commitment-Hashwert von dem ersten. Da Pedersen-Verpflichtungen homomorph sind, unterstützen sie die Durchführung mathematischer Operationen wie Addition und Subtraktion von Verpflichtungen unter Beibehaltung der Beziehungen zwischen den zugrunde liegenden Werten. Diese Methode kann nur mit einer
Token Admin
oderOrg Admin
aufgerufen werden.
Konten und gesperrte Salden prüfen
- Verwenden Sie die folgende Abfrage, um die Pedersen-Verpflichtung für den Saldo abzurufen, bei dem es sich um öffentliche Daten handelt.
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;
Beispielabfrage: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;
Beispielantwortbalance_commitment
:03977a92a07c00234270d41097a35ed2050bcdef02d3908a9a3cc733951b4171dd
- Verwenden Sie die folgende Abfrage, um den Balance- und Blinding-Faktor aus der privaten Datenerfassung abzurufen.
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;
Beispielabfrage: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;
Die folgende Tabelle enthält ein Beispiel für eine Antwort:balance
blinding_factor
100
17629824947682234000
- Fügen Sie die zuvor definierte Methode
generateCommitment
zur Controllerdatei im Ordnersrc
(src/controller/<Chaincode_name>.controller.ts
) hinzu.Beispiel:@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; }
- Übergeben Sie die Werte
balance
(alsvalue
) undblinding_factor
(alsblinding_factor
) vom zweiten Schritt an die MethodegenerateCommitment
.Beispiel: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"
- Stellen Sie sicher, dass der Wert
balance_commitment
aus dem ersten Schritt mit der Ausgabe der MethodegenerateCommitment
übereinstimmt.Beispiel: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
- Um ein Zurückstellungssaldo zu prüfen, wiederholen Sie diese Schritte für die Pedersen-Verpflichtung
onhold_balance
und die Werteonhold_balance
undonHoldBalanceBlindingFactor
.
Transaktionsmengen prüfen
- Verwenden Sie die folgende Abfrage, um die Pedersen-Verpflichtung für die Menge abzurufen, bei der es sich um öffentliche Daten handelt.
Der folgende Text zeigt eine Beispielabfrage.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;
Der folgende Text zeigt eine Beispielantwort.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
- Mit der folgenden Abfrage können Sie die Menge und den Blinding-Faktor aus der privaten Datenerfassung abrufen.
Der folgende Text zeigt eine Beispielabfrage.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;
Der folgende Text zeigt eine Beispielantwort.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
- Fügen Sie die zuvor definierte Methode
generateCommitment
zur Controllerdatei im Ordnersrc
(src/controller/<Chaincode_name>.controller.ts
) hinzu.Beispiel:@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; }
- Übergeben Sie die Werte
quantity
(alsvalue
) undblinding_factor
(alsblinding_factor
) vom zweiten Schritt an die MethodegenerateCommitment
.Beispiel: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"
- Stellen Sie sicher, dass der Wert
quantity_commitment
aus dem ersten Schritt mit der Ausgabe der MethodegenerateCommitment
übereinstimmt.Beispiel: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
Kontensalden prüfen
Nachdem Sie die aktuellen tatsächlichen Werte für balance_commitment
und balance
und den Blinding-Faktor für das Konto wie zuvor beschrieben erhalten haben, können Sie diese Werte anhand der Transaktionshistorie validieren.
balance_commitment for account :036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23dd63
balance for account : 4600
blinding_factor for account : 6835208149283572992000
- Verwenden Sie die Methode
getAccountTransactionHistoryWithFiltersFromRichHistDB
, um alle Transaktionen für das Konto abzurufen. Jede Transaktion hat eine eindeutige Transaktions-ID und die entsprechenden Einträge vonquantity_commitment
(in der Statusdatenbank) sowie Menge und Blinding-Faktor (in der privaten Datenerfassung).Die Beispielantwort:[ { "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" } ]
- Führen Sie die vorherigen Schritte aus, um jede Transaktionsmenge zu prüfen und sicherzustellen, dass die öffentlichen und privaten Daten synchronisiert werden. Die folgenden Beispiele zeigen Transaktionen und die Werte, die in den Berechnungen aus den vorherigen Prüfungsschritten verwendet wurden.
- Wiederholen Sie die geordnete Liste der Transaktionen in der Reihenfolge, in der sie stattgefunden haben, und berechnen Sie die laufenden Summen für jede Eigenschaft. Gehen Sie für jede Transaktion folgendermaßen vor.
- Wenn die Transaktion eine Gutschrift (Hinzufügen) ist, kombinieren Sie die Eigenschaft
quantity_commitment
mit der MethodeaddCommitment
. Wenn die Transaktion eine Lastschrift (Subtraktion) ist, kombinieren Sie die Eigenschaftquantity_commitment
mit der MethodesubCommitment
. - Wenn die Transaktion eine Gutschrift ist, fügen Sie die Eigenschaft
quantity
hinzu. Wenn die Transaktion eine Belastung ist, subtrahieren Sie die Eigenschaftquantity
. - Wenn die Transaktion eine Gutschrift ist, fügen Sie die Eigenschaft
blinding_factor
hinzu. Wenn die Transaktion eine Belastung ist, subtrahieren Sie die Eigenschaftblinding_factor
.
- Verpflichtungen verarbeiten
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"
- Verarbeitungsmenge
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
- Prozessblindfaktor
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
- Wenn die Transaktion eine Gutschrift (Hinzufügen) ist, kombinieren Sie die Eigenschaft
- Prüfen Sie nach der Verarbeitung aller Transaktionen, ob die folgenden Anweisungen wahr sind.
- Der Wert
quantity_commitment
stimmt mit dem aktuellen WertAccount.balance_commitment
überein - Der Wert
quantity
stimmt mit dem aktuellen WertAccount.balance
überein - Der Wert
blinding_factor
stimmt mit dem aktuellen WertAccount.blinding_factor
überein
Beispiel: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.
- Der Wert