驗證踏板履約承諾值
Oracle Blockchain Platform Digital Assets Edition 使用 Pedersen 承諾確保機密性與不可變性。下列 API 可協助驗證 Pedersen 承諾與實際的原始文字值。
在 Oracle Blockchain Platform 中,您可以連線至 Oracle Database,將資料保存在豐富的歷史記錄資料庫中。在豐富歷史記錄資料庫中,帳戶和交易 (在狀態資料庫中儲存為索引鍵 / 值組) 可以隨時間追蹤。在機密模式中,帳戶和交易都會儲存在 RTF 歷史記錄資料庫的歷史記錄表格中,包括私人和公用兩部分。
豐富歷史記錄資料庫的歷史記錄表格中提供組織的所有資料 (包括公用資料和專用資料)。表格名稱使用下列格式:<obp_instance_name>_<channel_name>_hist
。例如,CentralBank_default_hist
。
- 公用帳戶資料 (狀態資料庫)
-
- 儲存在鏈碼 ID 下:<chaincode_name>
- 所有網路參與者均可存取
- 一般帳戶特性,例如
org_id
、token_name
、balance
/onhold_balance
(作為 Pedersen 承諾) 以及其他非機密中繼資料
- 私人帳戶資料 (私人資料收集)
-
- 儲存在鏈碼 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
- 此方法會新增兩個指定的 Pedersen 承諾雜湊值。由於 Pedersen 承諾是同形的,因此支援執行數學運算,例如增加和減去承諾,同時保留基礎值之間的關係。只有
Token Admin
或Org Admin
才能呼叫此方法。 -
subCommitment
- 此方法會從第一個值減去第二個指定的 Pedersen 承諾雜湊值。由於 Pedersen 承諾是同形的,因此支援執行數學運算,例如增加和減去承諾,同時保留基礎值之間的關係。只有
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, 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;
- 將先前定義的
generateCommitment
方法新增至位於src
資料夾 (src/controller/<Chaincode_name>.controller.ts
) 中的控制器檔案。 - 將
balance
(作為value
) 和blinding_factor
(作為blinding_factor
) 值從第二個步驟傳送至generateCommitment
方法。 - 確定第一個步驟的
balance_commitment
值與generateCommitment
方法的輸出相符。 - 若要驗證保留餘額,請針對
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
) 中的控制器檔案。 - 將
quantity
(作為value
) 和blinding_factor
(作為blinding_factor
) 值從第二個步驟傳送至generateCommitment
方法。 - 確定第一個步驟的
quantity_commitment
值與generateCommitment
方法的輸出相符。
稽核科目餘額
在取得帳戶目前的實際balance_commitment
和 balance
值和盲點係數之後 (如先前所述),您可以針對交易歷史記錄驗證這些值。
- 使用
getAccountTransactionHistoryWithFiltersFromRichHistDB
方法擷取帳戶的所有交易。每個交易都有唯一的交易 ID 和對應的quantity_commitment
項目 (在狀態資料庫中),以及數量和連結因子 (在專用資料收集中)。 - 請依照先前的步驟驗證每筆交易數量,並確定公用與私人資料已同步化。下列範例顯示交易以及先前驗證步驟計算中所使用的值。
- 依交易發生的順序重複執行交易清單,並計算每個館別的累積總計。針對每筆交易,請完成下列步驟。
- 如果交易是貸項 (附加),請使用
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 = 4900 Final_balance = 4900
- 處理作業盲因子
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
值