페더슨 약정 값 확인
Oracle Blockchain Platform Digital Assets Edition은 Pedersen의 약정을 사용하여 비밀과 불변성을 보장합니다. 다음 API는 실제 원시 텍스트 값에 대한 페더슨 약정을 확인하는 데 도움이 될 수 있습니다.
Oracle Blockchain Platform에서는 Oracle Database에 연결하여 풍부한 기록 데이터베이스에 데이터를 유지할 수 있습니다. 상태 데이터베이스에 키/값 쌍으로 저장되는 계정 및 트랜잭션은 풍부한 기록 데이터베이스에서 시간이 지남에 따라 추적할 수 있습니다. 기밀 모드에서 계정과 트랜잭션은 모두 풍부한 기록 데이터베이스의 기록 테이블에 비공개 및 공용의 두 부분으로 저장됩니다.
조직에 대한 공용 및 전용의 모든 데이터는 풍부한 기록 데이터베이스의 기록 테이블에서 사용할 수 있습니다. 테이블 이름은 <obp_instance_name>_<channel_name>_hist
형식을 사용합니다. 예: CentralBank_default_hist
.
- 공용 계정 데이터(상태 데이터베이스)
-
- 체인코드 ID 아래에 저장됨: <chaincode_name>
- 모든 네트워크 참가자에게 액세스 가능
org_id
,token_name
,balance
/onhold_balance
(페더슨 약정) 및 기타 비기밀 메타데이터와 같은 일반 계정 속성
- 개인 계정 데이터(개인 데이터 수집)
-
- 체인코드 ID 아래에 저장됨: <chaincode_name>
$$_implicit_org_<Oracle_Blockchain_Platform_instance_name>
- 개인 데이터 수집을 소유한 조직에만 액세스할 수 있습니다.
balance
/onhold_balance
(원시 값),balanceBlindingFactor
,onHoldBalanceBlindingFactor
및 일 단위 제한과 같은 민감한 필드
- 체인코드 ID 아래에 저장됨: <chaincode_name>
- 공용 트랜잭션 데이터(상태 데이터베이스)
-
- 체인코드 ID 아래에 저장됨: <chaincode_name>
- 모든 네트워크 참가자에게 액세스 가능
- 발신자 및 수신자 계정 ID,
from_account_balance
/from_account_onhold_balance
/to_account_balance
/to_account_onhold_balance
/트랜잭션 금액(페더슨 약정) 및 기타 비기밀 메타데이터와 같은 일반 계정 속성
- 개인 거래 데이터(개인 데이터 수집)
-
- 체인코드 ID 아래에 저장됨: <chaincode_name>
$$_implicit_org_<Oracle_Blockchain_Platform_instance_name>
- 개인 데이터 수집을 소유한 조직에만 액세스할 수 있습니다.
from_account_balance
/from_account_onhold_balance
/to_account_balance
/to_account_onhold_balance
/트랜잭션 금액(원시 값) 및 해당 블라인딩 요소와 같은 민감한 필드
- 체인코드 ID 아래에 저장됨: <chaincode_name>
페더슨 약정 API
체인 코드의 컨트롤러 파일에 포함된 다음 API를 사용하여 Pedersen 약정을 확인하고 작업할 수 있습니다.
-
generateCommitment
- 이 방법은 지정된 값 및 블라인딩 계수에 대한 페더슨 약정을 생성합니다. 이 메소드는
Token Admin
또는Org Admin
에 의해서만 호출될 수 있습니다. -
addCommitment
- 이 방법은 두 개의 지정된 페더슨 약정 해시 값을 추가합니다. 페더슨의 약속은 동형적이기 때문에, 그들은 기본 값 사이의 관계를 유지하면서 약정에 대한 추가 및 빼기와 같은 수학적 작업을 수행하는 것을 지원합니다. 이 메소드는
Token Admin
또는Org Admin
에 의해서만 호출될 수 있습니다. -
subCommitment
- 이 방법은 첫 번째에서 지정된 두 번째 페더슨 약정 해시 값을 뺍니다. 페더슨의 약속은 동형적이기 때문에, 그들은 기본 값 사이의 관계를 유지하면서 약정에 대한 추가 및 빼기와 같은 수학적 작업을 수행하는 것을 지원합니다. 이 메소드는
Token Admin
또는Org Admin
에 의해서만 호출될 수 있습니다.
계정 및 보류 중인 잔액 확인
- 다음 질의를 사용하여 공용 데이터인 잔액의 Pedersen 약정을 가져옵니다.
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;
예제 질의: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;
응답 예balance_commitment
:03977a92a07c00234270d41097a35ed2050bcdef02d3908a9a3cc733951b4171dd
- 다음 질의를 사용하여 개인 데이터 수집에서 잔액 및 블라인딩 계수를 가져옵니다.
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;
예제 질의: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;
다음 표에서는 응답 예를 보여줍니다.balance
blinding_factor
100
17629824947682234000
- 이전에 정의한
generateCommitment
메소드를src
폴더(src/controller/<Chaincode_name>.controller.ts
)에 있는 컨트롤러 파일에 추가합니다.예:@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; }
- 두번째 단계에서
balance
(value
) 및blinding_factor
(blinding_factor
) 값을generateCommitment
메소드로 전달합니다.예: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"
- 첫번째 단계의
balance_commitment
값이generateCommitment
메소드의 출력과 일치하는지 확인합니다.예: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
- 보류 중인 잔액을 확인하려면
onhold_balance
페더슨 약정 및onhold_balance
및onHoldBalanceBlindingFactor
값에 대해 다음 단계를 반복합니다.
트랜잭션 수량 확인
- 다음 질의를 사용하여 공용 데이터인 수량에 대한 Pedersen 약정을 가져옵니다.
다음 텍스트는 예제 쿼리를 보여줍니다.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;
다음 텍스트는 응답 예를 보여줍니다.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
- 다음 질의를 사용하여 개인 데이터 수집에서 수량 및 블라인딩 계수를 가져옵니다.
다음 텍스트는 예제 쿼리를 보여줍니다.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;
다음 텍스트는 응답 예를 보여줍니다.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
- 이전에 정의한
generateCommitment
메소드를src
폴더(src/controller/<Chaincode_name>.controller.ts
)에 있는 컨트롤러 파일에 추가합니다.예:@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; }
- 두번째 단계에서
quantity
(value
) 및blinding_factor
(blinding_factor
) 값을generateCommitment
메소드로 전달합니다.예: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"
- 첫번째 단계의
quantity_commitment
값이generateCommitment
메소드의 출력과 일치하는지 확인합니다.예: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
계정 잔액 감사
앞서 설명한 대로 현재 실제 balance_commitment
및 balance
값과 계정에 대한 블라인딩 계수를 가져온 후 트랜잭션 내역에 대해 해당 값을 검증할 수 있습니다.
balance_commitment for account :036a1d71b658b592a4261bc76d28b5a08b17cf553c67de2943d769741f8f23dd63
balance for account : 4600
blinding_factor for account : 6835208149283572992000
getAccountTransactionHistoryWithFiltersFromRichHistDB
메소드를 사용하여 계정에 대한 모든 트랜잭션을 검색합니다. 각 트랜잭션에는 고유한 트랜잭션 ID와quantity_commitment
(상태 데이터베이스)의 해당 항목과 수량 및 블라인딩 계수(개인 데이터 수집)가 있습니다.예제 응답:[ { "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" } ]
- 이전 단계에 따라 각 트랜잭션 수량을 확인하고 공용 및 개인 데이터가 동기화되었는지 확인합니다. 다음 예에서는 이전 확인 단계의 계산에 사용된 트랜잭션 및 값을 보여줍니다.
- 순서대로 정렬된 트랜잭션 목록을 반복하여 각 속성에 대한 실행 합계를 계산합니다. 각 트랜잭션에 대해 다음 단계를 완료합니다.
- 트랜잭션이 실적(추가)인 경우
addCommitment
메소드를 사용하여quantity_commitment
속성을 결합합니다. 트랜잭션이 차변(빼기)인 경우subCommitment
메소드를 사용하여quantity_commitment
속성을 결합합니다. - 트랜잭션이 대변인 경우
quantity
속성을 추가합니다. 트랜잭션이 차변인 경우quantity
속성을 뺍니다. - 트랜잭션이 대변인 경우
blinding_factor
속성을 추가합니다. 트랜잭션이 차변인 경우blinding_factor
속성을 뺍니다.
- 약정 처리
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"
- 프로세스 수량
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
- 프로세스 블라인딩 계수
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
- 트랜잭션이 실적(추가)인 경우
- 모든 트랜잭션을 처리한 후 다음 설명이 참인지 확인하십시오.
quantity_commitment
값이 현재Account.balance_commitment
값과 일치합니다.quantity
값이 현재Account.balance
값과 일치합니다.blinding_factor
값이 현재Account.blinding_factor
값과 일치합니다.
예: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.